From e872f156be613dc5765a0d621c97201ec49f7734 Mon Sep 17 00:00:00 2001 From: Denis Date: Fri, 27 Jul 2018 21:27:38 +0200 Subject: [PATCH 001/128] BAEL-1997 state design pattern in Java --- .../com/baeldung/state/ExplicitStateDemo.java | 21 ++++++++++++++ .../com/baeldung/state/InternalStateDemo.java | 15 ++++++++++ .../baeldung/state/context/TradeContext.java | 29 +++++++++++++++++++ .../state/states/DayTradeBehavior.java | 11 +++++++ .../states/FallbackDayTradeBehavior.java | 16 ++++++++++ .../state/states/PositionTradeBehavior.java | 11 +++++++ .../state/states/SwingTradeBehavior.java | 11 +++++++ .../baeldung/state/states/TradeBehavior.java | 7 +++++ 8 files changed, 121 insertions(+) create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/state/ExplicitStateDemo.java create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/state/InternalStateDemo.java create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/state/context/TradeContext.java create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/state/states/DayTradeBehavior.java create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/state/states/FallbackDayTradeBehavior.java create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/state/states/PositionTradeBehavior.java create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/state/states/SwingTradeBehavior.java create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/state/states/TradeBehavior.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/ExplicitStateDemo.java b/patterns/design-patterns/src/main/java/com/baeldung/state/ExplicitStateDemo.java new file mode 100644 index 0000000000..de7b54d70e --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/state/ExplicitStateDemo.java @@ -0,0 +1,21 @@ +package com.baeldung.state; + +import com.baeldung.state.context.TradeContext; +import com.baeldung.state.states.DayTradeBehavior; +import com.baeldung.state.states.PositionTradeBehavior; +import com.baeldung.state.states.SwingTradeBehavior; + +public class ExplicitStateDemo { + + public static void main(String[] args) { + + TradeContext tradeContext = new TradeContext(new SwingTradeBehavior()); + tradeContext.trade(); + + tradeContext.setBehavior(new PositionTradeBehavior()); + tradeContext.trade(); + + tradeContext.setBehavior(new DayTradeBehavior()); + tradeContext.trade(); + } +} diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/InternalStateDemo.java b/patterns/design-patterns/src/main/java/com/baeldung/state/InternalStateDemo.java new file mode 100644 index 0000000000..3148940f17 --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/state/InternalStateDemo.java @@ -0,0 +1,15 @@ +package com.baeldung.state; + +import com.baeldung.state.context.TradeContext; +import com.baeldung.state.states.FallbackDayTradeBehavior; + +public class InternalStateDemo { + + public static void main(String[] args) { + + TradeContext tradeContext = new TradeContext(new FallbackDayTradeBehavior()); + tradeContext.trade(); + tradeContext.trade(); + tradeContext.trade(); + } +} diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/context/TradeContext.java b/patterns/design-patterns/src/main/java/com/baeldung/state/context/TradeContext.java new file mode 100644 index 0000000000..0f12d050db --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/state/context/TradeContext.java @@ -0,0 +1,29 @@ +package com.baeldung.state.context; + +import com.baeldung.state.states.TradeBehavior; + +public class TradeContext { + + private TradeBehavior behavior; + + public TradeContext(TradeBehavior behavior) { + this.behavior = behavior; + } + + public TradeBehavior getBehavior() { + return behavior; + } + + public void setBehavior(TradeBehavior behavior) { + this.behavior = behavior; + } + + public void trade() { + behavior.trade(this); + } + + @Override + public String toString() { + return "TradeContext{" + "behavior=" + behavior + '}'; + } +} diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/states/DayTradeBehavior.java b/patterns/design-patterns/src/main/java/com/baeldung/state/states/DayTradeBehavior.java new file mode 100644 index 0000000000..540530e50b --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/state/states/DayTradeBehavior.java @@ -0,0 +1,11 @@ +package com.baeldung.state.states; + +import com.baeldung.state.context.TradeContext; + +public class DayTradeBehavior implements TradeBehavior { + + @Override + public void trade(TradeContext ctx) { + System.out.println("Trading method: Day Trade"); + } +} diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/states/FallbackDayTradeBehavior.java b/patterns/design-patterns/src/main/java/com/baeldung/state/states/FallbackDayTradeBehavior.java new file mode 100644 index 0000000000..cf6e3ea695 --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/state/states/FallbackDayTradeBehavior.java @@ -0,0 +1,16 @@ +package com.baeldung.state.states; + +import com.baeldung.state.context.TradeContext; + +public class FallbackDayTradeBehavior implements TradeBehavior { + + @Override + public void trade(TradeContext ctx) { + System.out.println("Trading method: Day Trade"); + + if (Math.random() > 0.4) { + ctx.setBehavior(new SwingTradeBehavior()); + System.out.println("Day trading would not go well, falling back to Swing Trade"); + } + } +} diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/states/PositionTradeBehavior.java b/patterns/design-patterns/src/main/java/com/baeldung/state/states/PositionTradeBehavior.java new file mode 100644 index 0000000000..0b1facb143 --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/state/states/PositionTradeBehavior.java @@ -0,0 +1,11 @@ +package com.baeldung.state.states; + +import com.baeldung.state.context.TradeContext; + +public class PositionTradeBehavior implements TradeBehavior { + + @Override + public void trade(TradeContext ctx) { + System.out.println("Trading method: Position Trade"); + } +} diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/states/SwingTradeBehavior.java b/patterns/design-patterns/src/main/java/com/baeldung/state/states/SwingTradeBehavior.java new file mode 100644 index 0000000000..bbe8091bed --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/state/states/SwingTradeBehavior.java @@ -0,0 +1,11 @@ +package com.baeldung.state.states; + +import com.baeldung.state.context.TradeContext; + +public class SwingTradeBehavior implements TradeBehavior { + + @Override + public void trade(TradeContext ctx) { + System.out.println("Trading method: Swing Trade"); + } +} diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/states/TradeBehavior.java b/patterns/design-patterns/src/main/java/com/baeldung/state/states/TradeBehavior.java new file mode 100644 index 0000000000..ef5554ab50 --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/state/states/TradeBehavior.java @@ -0,0 +1,7 @@ +package com.baeldung.state.states; + +import com.baeldung.state.context.TradeContext; + +public interface TradeBehavior { + void trade(TradeContext ctx); +} From 93bfc63f153d622c61cb186cd71fd07b896586ce Mon Sep 17 00:00:00 2001 From: k0l0ssus Date: Sun, 29 Jul 2018 22:56:16 -0400 Subject: [PATCH 002/128] Create readme.md --- jersey-client-rx/readme.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 jersey-client-rx/readme.md diff --git a/jersey-client-rx/readme.md b/jersey-client-rx/readme.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/jersey-client-rx/readme.md @@ -0,0 +1 @@ + From c195c5dc508d733f0c4e2a3921ad69d1e0d1eb06 Mon Sep 17 00:00:00 2001 From: k0l0ssus Date: Sun, 29 Jul 2018 22:56:58 -0400 Subject: [PATCH 003/128] Add files via upload --- jersey-client-rx/pom.xml | 30 +++ .../samples/jerseyrx/ClientOrchestration.java | 203 ++++++++++++++++++ 2 files changed, 233 insertions(+) create mode 100644 jersey-client-rx/pom.xml create mode 100644 jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java diff --git a/jersey-client-rx/pom.xml b/jersey-client-rx/pom.xml new file mode 100644 index 0000000000..3857c16730 --- /dev/null +++ b/jersey-client-rx/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + com.baeldung.samples + jersey-client-rx + 1.0 + jar + + + org.glassfish.jersey.core + jersey-client + 2.27 + + + org.glassfish.jersey.ext.rx + jersey-rx-client-rxjava + 2.27 + + + org.glassfish.jersey.ext.rx + jersey-rx-client-rxjava2 + 2.27 + + + + UTF-8 + 1.8 + 1.8 + + \ No newline at end of file diff --git a/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java b/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java new file mode 100644 index 0000000000..4adf5e50b8 --- /dev/null +++ b/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java @@ -0,0 +1,203 @@ +package com.baeldung.samples.jerseyrx; + +import io.reactivex.Flowable; +import io.reactivex.disposables.Disposable; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionStage; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.logging.Level; +import org.glassfish.jersey.client.rx.rxjava.RxObservableInvokerProvider; +import org.glassfish.jersey.client.rx.rxjava.RxObservableInvoker; +import java.util.logging.Logger; +import java.util.stream.Collectors; +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.InvocationCallback; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.GenericType; +import org.glassfish.jersey.client.rx.rxjava2.RxFlowableInvoker; +import org.glassfish.jersey.client.rx.rxjava2.RxFlowableInvokerProvider; +import rx.Observable; + +/** + * + * @author baeldung + */ +public class ClientOrchestration { + + Client client = ClientBuilder.newClient(); + WebTarget userIdService = client.target("http:localhost:8080/serviceA/id?limit=10"); + WebTarget nameService = client.target("http:localhost:8080/serviceA/{empId}/name"); + WebTarget hashService = client.target("http:localhost:8080/serviceA/{comboIDandName}/address"); + + Logger logger = Logger.getLogger("ClientOrchestrator"); + + public static void main(String[] args) { + ClientOrchestration orchestrator = new ClientOrchestration(); + + orchestrator.callBackOrchestrate(); + orchestrator.rxOrchestrate(); + orchestrator.observableJavaOrchestrate(); + orchestrator.flowableJavaOrchestrate(); + + } + + public void callBackOrchestrate() { + logger.info("Orchestrating with the pyramid of doom"); + userIdService.request() + .async() + .get(new InvocationCallback>() { + @Override + public void completed(List empIds) { + CountDownLatch completionTracker = new CountDownLatch(empIds.size()); //used to keep track of the progress of the subsequent calls + empIds.forEach((id) -> { + //for each employee ID, get the name + nameService.resolveTemplate("empId", id).request() + .async() + .get(new InvocationCallback() { + @Override + public void completed(String response) { + completionTracker.countDown(); + hashService.request().async().get(new InvocationCallback() { + @Override + public void completed(String response) { + logger.log(Level.INFO, "The hash output {0}", response); + } + + @Override + public void failed(Throwable throwable) { + completionTracker.countDown(); + logger.log(Level.WARNING, "An error has occurred in the hashing request step {0}", throwable.getMessage()); + } + }); + } + @Override + public void failed(Throwable throwable) { + completionTracker.countDown(); + logger.log(Level.WARNING, "An error has occurred in the username request step {0}", throwable.getMessage()); + } + }); + }); + + try { + if (!completionTracker.await(10, TimeUnit.SECONDS)) { //wait for inner requests to complete in 10 seconds + logger.warning("Some requests didn't complete within the timeout"); + } + } catch (InterruptedException ex) { + Logger.getLogger(ClientOrchestration.class.getName()).log(Level.SEVERE, null, ex); + } + + } + + @Override + public void failed(Throwable throwable) { + //implement callback + } + }); + } + + public void rxOrchestrate() { + logger.info("Orchestrating with a CompletionStage"); + CompletionStage> userIdStage = userIdService.request() + .rx() + .get(new GenericType>() { + }) + .exceptionally((Throwable throwable) -> { + logger.warning("An error has occurred"); + return null; + }); + + CompletionStage>> completedNameStage = userIdStage.thenApplyAsync(list -> list.stream().map((Long id) -> { + CompletionStage nameStage = nameService.resolveTemplate("empId", id).request().rx().get(String.class); + }).collect(Collectors.toList())); + + userIdStage.thenAcceptAsync(listOfIds -> { + listOfIds.stream().map((Long id) -> { + CompletableFuture completable = nameService.resolveTemplate("empId", id) + .request() + .rx() + .get(String.class) + .toCompletableFuture(); + + completable.thenAccept((String userName) -> { + hashService.resolveTemplate("comboIDandName", userName + id) + .request() + .rx() + .get(String.class) + .toCompletableFuture() + .thenAcceptAsync(hashValue -> logger.log(Level.INFO, "The hash output {0}", hashValue)) + .exceptionally((Throwable throwable) -> { + logger.log(Level.WARNING, "Hash computation failed for {0}", id); + return null; + }); + + }); + + }); + }); + + } + + public void observableJavaOrchestrate() { + + logger.info("Orchestrating with Observables"); + + client.register(RxObservableInvokerProvider.class); + + Observable> userIdObservable = userIdService.request() + .rx(RxObservableInvoker.class) + .get(new GenericType>() { + }); + + userIdObservable.subscribe((List listOfIds) -> { + Observable.from(listOfIds).map(id + -> nameService.resolveTemplate("empId", id) + .request() + .rx(RxObservableInvoker.class) + .get(String.class) + .asObservable() //gotten the name for the given empId + .doOnError(throwable -> logger.log(Level.WARNING, "An error has occurred in the username request step {0}", throwable.getMessage())) + .subscribe(userName -> hashService.resolveTemplate("comboIDandName", userName + id) + .request() + .rx(RxObservableInvoker.class) + .get(String.class) + .asObservable() //gotten the hash value for empId+username + .doOnError(throwable -> logger.log(Level.WARNING, "An error has occurred in the hashing request step {0}", throwable.getMessage())) + .subscribe(hashValue -> logger.log(Level.INFO, "The hash output {0}", hashValue)))); + }); + + } + + public void flowableJavaOrchestrate() { + + logger.info("Orchestrating with Flowable"); + + client.register(RxFlowableInvokerProvider.class); + + Flowable> userIdObservable = userIdService.request() + .rx(RxFlowableInvoker.class) + .get(new GenericType>() { + }); + + Disposable subscribe = userIdObservable.subscribe((List listOfIds) -> { + Observable.from(listOfIds).map(id + -> nameService.resolveTemplate("empId", id) + .request() + .rx(RxObservableInvoker.class) + .get(String.class) + .asObservable() //gotten the name for the given empId + .doOnError(throwable -> logger.log(Level.WARNING, "An error has occurred in the username request step {0}", throwable.getMessage())) + .subscribe(userName -> hashService.resolveTemplate("comboIDandName", userName + id) + .request() + .rx(RxObservableInvoker.class) + .get(String.class) + .asObservable() //gotten the hash value for empId+username + .doOnError(throwable -> logger.warning("An error has occurred in the hashing request step " + throwable.getMessage())) + .subscribe(hashValue -> logger.log(Level.INFO, "The hash output {0}", hashValue)))); + }); + + } + +} From 075ba76de1d6688a1cf8374551ded910d1fba2c1 Mon Sep 17 00:00:00 2001 From: k0l0ssus Date: Sun, 29 Jul 2018 23:36:33 -0400 Subject: [PATCH 004/128] Add files via upload --- jersey-client-rx/pom.xml | 5 ++++ .../samples/jerseyrx/ClientOrchestration.java | 27 +++++++------------ 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/jersey-client-rx/pom.xml b/jersey-client-rx/pom.xml index 3857c16730..cc5f28c938 100644 --- a/jersey-client-rx/pom.xml +++ b/jersey-client-rx/pom.xml @@ -6,6 +6,11 @@ 1.0 jar + + org.glassfish.jersey.inject + jersey-hk2 + 2.27 + org.glassfish.jersey.core jersey-client diff --git a/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java b/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java index 4adf5e50b8..d3e6986b39 100644 --- a/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java +++ b/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java @@ -28,9 +28,9 @@ import rx.Observable; public class ClientOrchestration { Client client = ClientBuilder.newClient(); - WebTarget userIdService = client.target("http:localhost:8080/serviceA/id?limit=10"); - WebTarget nameService = client.target("http:localhost:8080/serviceA/{empId}/name"); - WebTarget hashService = client.target("http:localhost:8080/serviceA/{comboIDandName}/address"); + WebTarget userIdService = client.target("http://localhost:8080/serviceA/id?limit=10"); + WebTarget nameService = client.target("http://localhost:8080/serviceA/{empId}/name"); + WebTarget hashService = client.target("http://localhost:8080/serviceA/{comboIDandName}/address"); Logger logger = Logger.getLogger("ClientOrchestrator"); @@ -73,6 +73,7 @@ public class ClientOrchestration { } }); } + @Override public void failed(Throwable throwable) { completionTracker.countDown(); @@ -80,7 +81,7 @@ public class ClientOrchestration { } }); }); - + try { if (!completionTracker.await(10, TimeUnit.SECONDS)) { //wait for inner requests to complete in 10 seconds logger.warning("Some requests didn't complete within the timeout"); @@ -88,7 +89,7 @@ public class ClientOrchestration { } catch (InterruptedException ex) { Logger.getLogger(ClientOrchestration.class.getName()).log(Level.SEVERE, null, ex); } - + } @Override @@ -109,12 +110,8 @@ public class ClientOrchestration { return null; }); - CompletionStage>> completedNameStage = userIdStage.thenApplyAsync(list -> list.stream().map((Long id) -> { - CompletionStage nameStage = nameService.resolveTemplate("empId", id).request().rx().get(String.class); - }).collect(Collectors.toList())); - userIdStage.thenAcceptAsync(listOfIds -> { - listOfIds.stream().map((Long id) -> { + listOfIds.stream().forEach((Long id) -> { CompletableFuture completable = nameService.resolveTemplate("empId", id) .request() .rx() @@ -143,10 +140,7 @@ public class ClientOrchestration { public void observableJavaOrchestrate() { logger.info("Orchestrating with Observables"); - - client.register(RxObservableInvokerProvider.class); - - Observable> userIdObservable = userIdService.request() + Observable> userIdObservable = userIdService.register(RxObservableInvokerProvider.class).request() .rx(RxObservableInvoker.class) .get(new GenericType>() { }); @@ -173,10 +167,7 @@ public class ClientOrchestration { public void flowableJavaOrchestrate() { logger.info("Orchestrating with Flowable"); - - client.register(RxFlowableInvokerProvider.class); - - Flowable> userIdObservable = userIdService.request() + Flowable> userIdObservable = userIdService.register(RxFlowableInvokerProvider.class).request() .rx(RxFlowableInvoker.class) .get(new GenericType>() { }); From 03b611d494ef912add25e68a59d8f4dfd2f26028 Mon Sep 17 00:00:00 2001 From: k0l0ssus Date: Sun, 29 Jul 2018 23:38:53 -0400 Subject: [PATCH 005/128] Add files via upload --- .../java/com/baeldung/samples/jerseyrx/ClientOrchestration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java b/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java index d3e6986b39..2b5c6bf965 100644 --- a/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java +++ b/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java @@ -30,7 +30,7 @@ public class ClientOrchestration { Client client = ClientBuilder.newClient(); WebTarget userIdService = client.target("http://localhost:8080/serviceA/id?limit=10"); WebTarget nameService = client.target("http://localhost:8080/serviceA/{empId}/name"); - WebTarget hashService = client.target("http://localhost:8080/serviceA/{comboIDandName}/address"); + WebTarget hashService = client.target("http://localhost:8080/serviceA/{comboIDandName}/hash"); Logger logger = Logger.getLogger("ClientOrchestrator"); From 11c97cff08c49c727654b285d3985a1b6c8f2c7c Mon Sep 17 00:00:00 2001 From: k0l0ssus Date: Sun, 29 Jul 2018 23:42:17 -0400 Subject: [PATCH 006/128] Update readme.md --- jersey-client-rx/readme.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/jersey-client-rx/readme.md b/jersey-client-rx/readme.md index 8b13789179..d1bc4e950b 100644 --- a/jersey-client-rx/readme.md +++ b/jersey-client-rx/readme.md @@ -1 +1,3 @@ +# Fluent, Reactive Jersey Client Orchestration # +### Sample code demonstrating the options for asynchronous, reactive RESTful service consumption with JAX-RS ### From e7091ab38266a4b3650478a1959afda228feace4 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Tue, 31 Jul 2018 07:44:14 +0200 Subject: [PATCH 007/128] Update ResponseBodyEmitterController.java --- .../java/com/baeldung/web/ResponseBodyEmitterController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-5-mvc/src/main/java/com/baeldung/web/ResponseBodyEmitterController.java b/spring-5-mvc/src/main/java/com/baeldung/web/ResponseBodyEmitterController.java index ff1fb87393..c5f63486fe 100644 --- a/spring-5-mvc/src/main/java/com/baeldung/web/ResponseBodyEmitterController.java +++ b/spring-5-mvc/src/main/java/com/baeldung/web/ResponseBodyEmitterController.java @@ -13,7 +13,7 @@ import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter @Controller public class ResponseBodyEmitterController { - private ExecutorService nonBlockingService = Executors.newSingleThreadExecutor(); + private ExecutorService nonBlockingService = Executors.newCachedThreadPool(); @GetMapping(Constants.API_RBE) public ResponseEntity handleRbe() { From af4ddaeb34ab56215c5437fddba22e0c5eb27ef9 Mon Sep 17 00:00:00 2001 From: k0l0ssus Date: Mon, 6 Aug 2018 21:20:02 -0400 Subject: [PATCH 008/128] Add files via upload --- jersey-client-rx/pom.xml | 21 +++++ .../samples/jerseyrx/ClientOrchestration.java | 94 +++++++++++-------- .../samples/jerseyrx/EmployeeDTO.java | 21 +++++ .../jerseyrx/ClientOrchestrationTest.java | 67 +++++++++++++ 4 files changed, 162 insertions(+), 41 deletions(-) create mode 100644 jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/EmployeeDTO.java create mode 100644 jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx/ClientOrchestrationTest.java diff --git a/jersey-client-rx/pom.xml b/jersey-client-rx/pom.xml index cc5f28c938..fb7494fab1 100644 --- a/jersey-client-rx/pom.xml +++ b/jersey-client-rx/pom.xml @@ -26,6 +26,27 @@ jersey-rx-client-rxjava2 2.27 + + com.github.tomakehurst + wiremock + 1.58 + test + + + org.junit.vintage + junit-vintage-engine + 5.2.0 + + + org.glassfish.jersey.media + jersey-media-json-jackson + 2.22 + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-json-provider + 2.4.1 + UTF-8 diff --git a/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java b/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java index 2b5c6bf965..5c145ca5d9 100644 --- a/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java +++ b/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java @@ -11,12 +11,12 @@ import java.util.logging.Level; import org.glassfish.jersey.client.rx.rxjava.RxObservableInvokerProvider; import org.glassfish.jersey.client.rx.rxjava.RxObservableInvoker; import java.util.logging.Logger; -import java.util.stream.Collectors; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.InvocationCallback; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.GenericType; +import javax.ws.rs.core.MediaType; import org.glassfish.jersey.client.rx.rxjava2.RxFlowableInvoker; import org.glassfish.jersey.client.rx.rxjava2.RxFlowableInvokerProvider; import rx.Observable; @@ -28,7 +28,7 @@ import rx.Observable; public class ClientOrchestration { Client client = ClientBuilder.newClient(); - WebTarget userIdService = client.target("http://localhost:8080/serviceA/id?limit=10"); + WebTarget userIdService = client.target("http://localhost:8080/serviceA/id"); WebTarget nameService = client.target("http://localhost:8080/serviceA/{empId}/name"); WebTarget hashService = client.target("http://localhost:8080/serviceA/{comboIDandName}/hash"); @@ -46,30 +46,33 @@ public class ClientOrchestration { public void callBackOrchestrate() { logger.info("Orchestrating with the pyramid of doom"); - userIdService.request() + userIdService.request().accept(MediaType.APPLICATION_JSON) .async() - .get(new InvocationCallback>() { + .get(new InvocationCallback() { @Override - public void completed(List empIds) { + public void completed(EmployeeDTO empIdList) { + logger.info("[InvocationCallback] Got all the IDs " + empIdList.getEmpIds()); + List empIds = empIdList.getEmpIds(); CountDownLatch completionTracker = new CountDownLatch(empIds.size()); //used to keep track of the progress of the subsequent calls empIds.forEach((id) -> { //for each employee ID, get the name nameService.resolveTemplate("empId", id).request() .async() .get(new InvocationCallback() { + @Override public void completed(String response) { completionTracker.countDown(); - hashService.request().async().get(new InvocationCallback() { + hashService.resolveTemplate("comboIDandName", response + id).request().async().get(new InvocationCallback() { @Override public void completed(String response) { - logger.log(Level.INFO, "The hash output {0}", response); + logger.log(Level.INFO, "[InvocationCallback] The hash output {0}", response); } @Override public void failed(Throwable throwable) { completionTracker.countDown(); - logger.log(Level.WARNING, "An error has occurred in the hashing request step {0}", throwable.getMessage()); + logger.log(Level.WARNING, "[InvocationCallback] An error has occurred in the hashing request step {0}", throwable.getMessage()); } }); } @@ -77,14 +80,14 @@ public class ClientOrchestration { @Override public void failed(Throwable throwable) { completionTracker.countDown(); - logger.log(Level.WARNING, "An error has occurred in the username request step {0}", throwable.getMessage()); + logger.log(Level.WARNING, "[InvocationCallback] An error has occurred in the username request step {0}", throwable.getMessage()); } }); }); try { if (!completionTracker.await(10, TimeUnit.SECONDS)) { //wait for inner requests to complete in 10 seconds - logger.warning("Some requests didn't complete within the timeout"); + logger.warning("[InvocationCallback] Some requests didn't complete within the timeout"); } } catch (InterruptedException ex) { Logger.getLogger(ClientOrchestration.class.getName()).log(Level.SEVERE, null, ex); @@ -94,24 +97,25 @@ public class ClientOrchestration { @Override public void failed(Throwable throwable) { - //implement callback + logger.warning("Couldn't get the list of IDs"); } }); } public void rxOrchestrate() { logger.info("Orchestrating with a CompletionStage"); - CompletionStage> userIdStage = userIdService.request() + CompletionStage userIdStage = userIdService.request().accept(MediaType.APPLICATION_JSON) .rx() - .get(new GenericType>() { + .get(new GenericType() { }) .exceptionally((Throwable throwable) -> { - logger.warning("An error has occurred"); + logger.warning("[CompletionStage] An error has occurred"); return null; }); - userIdStage.thenAcceptAsync(listOfIds -> { - listOfIds.stream().forEach((Long id) -> { + userIdStage.thenAcceptAsync(empIdDto -> { + logger.info("[CompletionStage] Got all the IDs " + empIdDto.getEmpIds()); + empIdDto.getEmpIds().stream().forEach((Long id) -> { CompletableFuture completable = nameService.resolveTemplate("empId", id) .request() .rx() @@ -124,9 +128,9 @@ public class ClientOrchestration { .rx() .get(String.class) .toCompletableFuture() - .thenAcceptAsync(hashValue -> logger.log(Level.INFO, "The hash output {0}", hashValue)) + .thenAcceptAsync(hashValue -> logger.log(Level.INFO, "[CompletionFuture] The hash output {0}", hashValue)) .exceptionally((Throwable throwable) -> { - logger.log(Level.WARNING, "Hash computation failed for {0}", id); + logger.log(Level.WARNING, "[CompletionStage] Hash computation failed for {0}", id); return null; }); @@ -140,53 +144,61 @@ public class ClientOrchestration { public void observableJavaOrchestrate() { logger.info("Orchestrating with Observables"); - Observable> userIdObservable = userIdService.register(RxObservableInvokerProvider.class).request() + Observable userIdObservable = userIdService.register(RxObservableInvokerProvider.class).request() + .accept(MediaType.APPLICATION_JSON) .rx(RxObservableInvoker.class) - .get(new GenericType>() { + .get(new GenericType() { }); - userIdObservable.subscribe((List listOfIds) -> { - Observable.from(listOfIds).map(id - -> nameService.resolveTemplate("empId", id) + userIdObservable.subscribe((EmployeeDTO empIdList) -> { + logger.info("[Observable] Got all the IDs " + empIdList.getEmpIds()); + Observable.from(empIdList.getEmpIds()).subscribe(id + -> nameService.register(RxObservableInvokerProvider.class) + .resolveTemplate("empId", id) .request() .rx(RxObservableInvoker.class) .get(String.class) .asObservable() //gotten the name for the given empId - .doOnError(throwable -> logger.log(Level.WARNING, "An error has occurred in the username request step {0}", throwable.getMessage())) - .subscribe(userName -> hashService.resolveTemplate("comboIDandName", userName + id) + .doOnError(throwable -> logger.log(Level.WARNING, " [Observable] An error has occurred in the username request step {0}", throwable.getMessage())) + .subscribe(userName -> hashService + .register(RxObservableInvokerProvider.class) + .resolveTemplate("comboIDandName", userName + id) .request() .rx(RxObservableInvoker.class) .get(String.class) .asObservable() //gotten the hash value for empId+username - .doOnError(throwable -> logger.log(Level.WARNING, "An error has occurred in the hashing request step {0}", throwable.getMessage())) - .subscribe(hashValue -> logger.log(Level.INFO, "The hash output {0}", hashValue)))); + .doOnError(throwable -> logger.log(Level.WARNING, " [Observable]An error has occurred in the hashing request step {0}", throwable.getMessage())) + .subscribe(hashValue -> logger.log(Level.INFO, "[Observable] The hash output {0}", hashValue)))); }); } + public void flowableJavaOrchestrate() { logger.info("Orchestrating with Flowable"); - Flowable> userIdObservable = userIdService.register(RxFlowableInvokerProvider.class).request() + Flowable userIdObservable = userIdService.register(RxFlowableInvokerProvider.class) + .request() .rx(RxFlowableInvoker.class) - .get(new GenericType>() { + .get(new GenericType() { }); - Disposable subscribe = userIdObservable.subscribe((List listOfIds) -> { + Disposable subscribe = userIdObservable.subscribe((EmployeeDTO dto) -> { + List listOfIds = dto.getEmpIds(); Observable.from(listOfIds).map(id - -> nameService.resolveTemplate("empId", id) + -> nameService.register(RxFlowableInvokerProvider.class) + .resolveTemplate("empId", id) .request() - .rx(RxObservableInvoker.class) - .get(String.class) - .asObservable() //gotten the name for the given empId - .doOnError(throwable -> logger.log(Level.WARNING, "An error has occurred in the username request step {0}", throwable.getMessage())) - .subscribe(userName -> hashService.resolveTemplate("comboIDandName", userName + id) + .rx(RxFlowableInvoker.class) + .get(String.class) //gotten the name for the given empId + .doOnError(throwable -> logger.log(Level.WARNING, "[Flowable] An error has occurred in the username request step {0}", throwable.getMessage())) + .subscribe(userName -> hashService.register(RxFlowableInvokerProvider.class) + .resolveTemplate("comboIDandName", userName + id) .request() - .rx(RxObservableInvoker.class) - .get(String.class) - .asObservable() //gotten the hash value for empId+username - .doOnError(throwable -> logger.warning("An error has occurred in the hashing request step " + throwable.getMessage())) - .subscribe(hashValue -> logger.log(Level.INFO, "The hash output {0}", hashValue)))); + .rx(RxFlowableInvoker.class) + .get(String.class) //gotten the hash value for empId+username + .doOnError(throwable -> logger.warning(" [Flowable] An error has occurred in the hashing request step " + throwable.getMessage())) + .subscribe(hashValue -> logger.log(Level.INFO, "[Flowable] The hash output {0}", hashValue)))); }); } diff --git a/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/EmployeeDTO.java b/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/EmployeeDTO.java new file mode 100644 index 0000000000..ab3cfb54a2 --- /dev/null +++ b/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/EmployeeDTO.java @@ -0,0 +1,21 @@ +package com.baeldung.samples.jerseyrx; + +import java.util.List; + +/** + * + * @author SIGINT-X + */ +public class EmployeeDTO { + + private List empIds; + + public List getEmpIds() { + return empIds; + } + + public void setEmpIds(List empIds) { + this.empIds = empIds; + } + +} diff --git a/jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx/ClientOrchestrationTest.java b/jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx/ClientOrchestrationTest.java new file mode 100644 index 0000000000..4286e192c0 --- /dev/null +++ b/jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx/ClientOrchestrationTest.java @@ -0,0 +1,67 @@ +package com.baeldung.samples.jerseyrx; + +import com.github.tomakehurst.wiremock.WireMockServer; +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.configureFor; +import static com.github.tomakehurst.wiremock.client.WireMock.equalTo; +import static com.github.tomakehurst.wiremock.client.WireMock.get; +import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * + * @author baeldung + */ +public class ClientOrchestrationTest { + + ClientOrchestration orchestrator = new ClientOrchestration(); + + String jsonIdList = "{\"empIds\":[1,2,3,4,5,6]}"; + + String[] nameList = new String[]{"n/a", "Thor", "Hulk", "BlackWidow", "BlackPanther", "TheTick", "Hawkeye"}; + + String[] hashResultList = new String[]{"roht1", "kluh2", "WodiwKcalb3", "RehtnapKclab4", "kciteht5", "eyekwah6"}; + + WireMockServer wireMockServer = new WireMockServer(); + + @Before + public void setup() { + wireMockServer.start(); + configureFor("localhost", 8080); + stubFor(get(urlEqualTo("/serviceA/id")).willReturn(aResponse().withBody(jsonIdList).withHeader("Content-Type", "application/json"))); + + stubFor(get(urlEqualTo("/serviceA/1/name")).willReturn(aResponse().withBody(nameList[1]))); + stubFor(get(urlEqualTo("/serviceA/2/name")).willReturn(aResponse().withBody(nameList[2]))); + stubFor(get(urlEqualTo("/serviceA/3/name")).willReturn(aResponse().withBody(nameList[3]))); + stubFor(get(urlEqualTo("/serviceA/4/name")).willReturn(aResponse().withBody(nameList[4]))); + stubFor(get(urlEqualTo("/serviceA/5/name")).willReturn(aResponse().withBody(nameList[5]))); + stubFor(get(urlEqualTo("/serviceA/6/name")).willReturn(aResponse().withBody(nameList[6]))); + + stubFor(get(urlEqualTo("/serviceA/Thor1/hash")).willReturn(aResponse().withBody(hashResultList[0]))); + stubFor(get(urlEqualTo("/serviceA/Hulk2/hash")).willReturn(aResponse().withBody(hashResultList[1]))); + stubFor(get(urlEqualTo("/serviceA/BlackWidow3/hash")).willReturn(aResponse().withBody(hashResultList[2]))); + stubFor(get(urlEqualTo("/serviceA/BlackPanther4/hash")).willReturn(aResponse().withBody(hashResultList[3]))); + stubFor(get(urlEqualTo("/serviceA/TheTick5/hash")).willReturn(aResponse().withBody(hashResultList[4]))); + stubFor(get(urlEqualTo("/serviceA/Hawkeye6/hash")).willReturn(aResponse().withBody(hashResultList[5]))); + + } + + @Test + public void hits() { + + orchestrator.callBackOrchestrate(); + orchestrator.rxOrchestrate(); + orchestrator.observableJavaOrchestrate(); + orchestrator.flowableJavaOrchestrate(); + + } + + @After + public void tearDown() { + + } + +} From ac9ef8d6d0bad031f9ccebf0c765bcddd204d84a Mon Sep 17 00:00:00 2001 From: k0l0ssus Date: Tue, 7 Aug 2018 00:16:23 -0400 Subject: [PATCH 009/128] Add files via upload --- .../samples/jerseyrx/ClientOrchestration.java | 33 +++++++++++++++---- .../jerseyrx/ClientOrchestrationTest.java | 32 +++++++++--------- 2 files changed, 43 insertions(+), 22 deletions(-) diff --git a/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java b/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java index 5c145ca5d9..6e184876cb 100644 --- a/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java +++ b/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java @@ -2,6 +2,7 @@ package com.baeldung.samples.jerseyrx; import io.reactivex.Flowable; import io.reactivex.disposables.Disposable; +import java.util.LinkedList; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; @@ -31,6 +32,7 @@ public class ClientOrchestration { WebTarget userIdService = client.target("http://localhost:8080/serviceA/id"); WebTarget nameService = client.target("http://localhost:8080/serviceA/{empId}/name"); WebTarget hashService = client.target("http://localhost:8080/serviceA/{comboIDandName}/hash"); + LinkedList failures = new LinkedList<>(); Logger logger = Logger.getLogger("ClientOrchestrator"); @@ -72,6 +74,7 @@ public class ClientOrchestration { @Override public void failed(Throwable throwable) { completionTracker.countDown(); + failures.add(throwable); logger.log(Level.WARNING, "[InvocationCallback] An error has occurred in the hashing request step {0}", throwable.getMessage()); } }); @@ -80,6 +83,7 @@ public class ClientOrchestration { @Override public void failed(Throwable throwable) { completionTracker.countDown(); + failures.add(throwable); logger.log(Level.WARNING, "[InvocationCallback] An error has occurred in the username request step {0}", throwable.getMessage()); } }); @@ -90,6 +94,7 @@ public class ClientOrchestration { logger.warning("[InvocationCallback] Some requests didn't complete within the timeout"); } } catch (InterruptedException ex) { + failures.add(ex); Logger.getLogger(ClientOrchestration.class.getName()).log(Level.SEVERE, null, ex); } @@ -97,6 +102,7 @@ public class ClientOrchestration { @Override public void failed(Throwable throwable) { + failures.add(throwable); logger.warning("Couldn't get the list of IDs"); } }); @@ -108,7 +114,8 @@ public class ClientOrchestration { .rx() .get(new GenericType() { }) - .exceptionally((Throwable throwable) -> { + .exceptionally((throwable) -> { + failures.add(throwable); logger.warning("[CompletionStage] An error has occurred"); return null; }); @@ -129,7 +136,8 @@ public class ClientOrchestration { .get(String.class) .toCompletableFuture() .thenAcceptAsync(hashValue -> logger.log(Level.INFO, "[CompletionFuture] The hash output {0}", hashValue)) - .exceptionally((Throwable throwable) -> { + .exceptionally((throwable) -> { + failures.add(throwable); logger.log(Level.WARNING, "[CompletionStage] Hash computation failed for {0}", id); return null; }); @@ -159,7 +167,10 @@ public class ClientOrchestration { .rx(RxObservableInvoker.class) .get(String.class) .asObservable() //gotten the name for the given empId - .doOnError(throwable -> logger.log(Level.WARNING, " [Observable] An error has occurred in the username request step {0}", throwable.getMessage())) + .doOnError((throwable) -> { + failures.add(throwable); + logger.log(Level.WARNING, " [Observable] An error has occurred in the username request step {0}", throwable.getMessage()); + }) .subscribe(userName -> hashService .register(RxObservableInvokerProvider.class) .resolveTemplate("comboIDandName", userName + id) @@ -167,13 +178,15 @@ public class ClientOrchestration { .rx(RxObservableInvoker.class) .get(String.class) .asObservable() //gotten the hash value for empId+username - .doOnError(throwable -> logger.log(Level.WARNING, " [Observable]An error has occurred in the hashing request step {0}", throwable.getMessage())) + .doOnError((throwable) -> { + failures.add(throwable); + logger.log(Level.WARNING, " [Observable]An error has occurred in the hashing request step {0}", throwable.getMessage()); + }) .subscribe(hashValue -> logger.log(Level.INFO, "[Observable] The hash output {0}", hashValue)))); }); } - public void flowableJavaOrchestrate() { logger.info("Orchestrating with Flowable"); @@ -191,13 +204,19 @@ public class ClientOrchestration { .request() .rx(RxFlowableInvoker.class) .get(String.class) //gotten the name for the given empId - .doOnError(throwable -> logger.log(Level.WARNING, "[Flowable] An error has occurred in the username request step {0}", throwable.getMessage())) + .doOnError((throwable) -> { + failures.add(throwable); + logger.log(Level.WARNING, "[Flowable] An error has occurred in the username request step {0}", throwable.getMessage()); + }) .subscribe(userName -> hashService.register(RxFlowableInvokerProvider.class) .resolveTemplate("comboIDandName", userName + id) .request() .rx(RxFlowableInvoker.class) .get(String.class) //gotten the hash value for empId+username - .doOnError(throwable -> logger.warning(" [Flowable] An error has occurred in the hashing request step " + throwable.getMessage())) + .doOnError((throwable) -> { + failures.add(throwable); + logger.warning(" [Flowable] An error has occurred in the hashing request step " + throwable.getMessage()); + }) .subscribe(hashValue -> logger.log(Level.INFO, "[Flowable] The hash output {0}", hashValue)))); }); diff --git a/jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx/ClientOrchestrationTest.java b/jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx/ClientOrchestrationTest.java index 4286e192c0..2158f29a61 100644 --- a/jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx/ClientOrchestrationTest.java +++ b/jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx/ClientOrchestrationTest.java @@ -7,6 +7,7 @@ import static com.github.tomakehurst.wiremock.client.WireMock.equalTo; import static com.github.tomakehurst.wiremock.client.WireMock.get; import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import junit.framework.Assert; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -16,52 +17,53 @@ import org.junit.Test; * @author baeldung */ public class ClientOrchestrationTest { - + ClientOrchestration orchestrator = new ClientOrchestration(); - + String jsonIdList = "{\"empIds\":[1,2,3,4,5,6]}"; - + String[] nameList = new String[]{"n/a", "Thor", "Hulk", "BlackWidow", "BlackPanther", "TheTick", "Hawkeye"}; - + String[] hashResultList = new String[]{"roht1", "kluh2", "WodiwKcalb3", "RehtnapKclab4", "kciteht5", "eyekwah6"}; - + WireMockServer wireMockServer = new WireMockServer(); - + @Before public void setup() { wireMockServer.start(); configureFor("localhost", 8080); stubFor(get(urlEqualTo("/serviceA/id")).willReturn(aResponse().withBody(jsonIdList).withHeader("Content-Type", "application/json"))); - + stubFor(get(urlEqualTo("/serviceA/1/name")).willReturn(aResponse().withBody(nameList[1]))); stubFor(get(urlEqualTo("/serviceA/2/name")).willReturn(aResponse().withBody(nameList[2]))); stubFor(get(urlEqualTo("/serviceA/3/name")).willReturn(aResponse().withBody(nameList[3]))); stubFor(get(urlEqualTo("/serviceA/4/name")).willReturn(aResponse().withBody(nameList[4]))); stubFor(get(urlEqualTo("/serviceA/5/name")).willReturn(aResponse().withBody(nameList[5]))); stubFor(get(urlEqualTo("/serviceA/6/name")).willReturn(aResponse().withBody(nameList[6]))); - + stubFor(get(urlEqualTo("/serviceA/Thor1/hash")).willReturn(aResponse().withBody(hashResultList[0]))); stubFor(get(urlEqualTo("/serviceA/Hulk2/hash")).willReturn(aResponse().withBody(hashResultList[1]))); stubFor(get(urlEqualTo("/serviceA/BlackWidow3/hash")).willReturn(aResponse().withBody(hashResultList[2]))); stubFor(get(urlEqualTo("/serviceA/BlackPanther4/hash")).willReturn(aResponse().withBody(hashResultList[3]))); stubFor(get(urlEqualTo("/serviceA/TheTick5/hash")).willReturn(aResponse().withBody(hashResultList[4]))); stubFor(get(urlEqualTo("/serviceA/Hawkeye6/hash")).willReturn(aResponse().withBody(hashResultList[5]))); - + } - + @Test public void hits() { - + orchestrator.callBackOrchestrate(); orchestrator.rxOrchestrate(); orchestrator.observableJavaOrchestrate(); orchestrator.flowableJavaOrchestrate(); - + + Assert.assertTrue(orchestrator.failures.isEmpty()); } - + @After public void tearDown() { - + } - + } From 2b53d299854bbe70c518e84041b456966cd7400d Mon Sep 17 00:00:00 2001 From: k0l0ssus Date: Tue, 7 Aug 2018 00:17:36 -0400 Subject: [PATCH 010/128] Update EmployeeDTO.java --- .../main/java/com/baeldung/samples/jerseyrx/EmployeeDTO.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/EmployeeDTO.java b/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/EmployeeDTO.java index ab3cfb54a2..a161448bb7 100644 --- a/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/EmployeeDTO.java +++ b/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/EmployeeDTO.java @@ -4,7 +4,7 @@ import java.util.List; /** * - * @author SIGINT-X + * @author baeldung */ public class EmployeeDTO { From 26a28dd663a1dd8ca1a692c8973d3f4427ab3d36 Mon Sep 17 00:00:00 2001 From: Denis Date: Tue, 7 Aug 2018 21:28:06 +0200 Subject: [PATCH 011/128] BAEL-1997 different example code --- .../com/baeldung/state/DeliveredState.java | 19 +++++++++++ .../com/baeldung/state/ExplicitStateDemo.java | 21 ------------ .../com/baeldung/state/InternalStateDemo.java | 15 --------- .../java/com/baeldung/state/OrderedState.java | 19 +++++++++++ .../main/java/com/baeldung/state/Package.java | 22 +++++++++++++ .../java/com/baeldung/state/PackageState.java | 8 +++++ .../com/baeldung/state/ReceivedState.java | 23 +++++++++++++ .../baeldung/state/context/TradeContext.java | 29 ---------------- .../state/states/DayTradeBehavior.java | 11 ------- .../states/FallbackDayTradeBehavior.java | 16 --------- .../state/states/PositionTradeBehavior.java | 11 ------- .../state/states/SwingTradeBehavior.java | 11 ------- .../baeldung/state/states/TradeBehavior.java | 7 ---- .../baeldung/state/StatePatternUnitTest.java | 33 +++++++++++++++++++ 14 files changed, 124 insertions(+), 121 deletions(-) create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/state/DeliveredState.java delete mode 100644 patterns/design-patterns/src/main/java/com/baeldung/state/ExplicitStateDemo.java delete mode 100644 patterns/design-patterns/src/main/java/com/baeldung/state/InternalStateDemo.java create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/state/OrderedState.java create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/state/Package.java create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/state/PackageState.java create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/state/ReceivedState.java delete mode 100644 patterns/design-patterns/src/main/java/com/baeldung/state/context/TradeContext.java delete mode 100644 patterns/design-patterns/src/main/java/com/baeldung/state/states/DayTradeBehavior.java delete mode 100644 patterns/design-patterns/src/main/java/com/baeldung/state/states/FallbackDayTradeBehavior.java delete mode 100644 patterns/design-patterns/src/main/java/com/baeldung/state/states/PositionTradeBehavior.java delete mode 100644 patterns/design-patterns/src/main/java/com/baeldung/state/states/SwingTradeBehavior.java delete mode 100644 patterns/design-patterns/src/main/java/com/baeldung/state/states/TradeBehavior.java create mode 100644 patterns/design-patterns/src/test/java/com/baeldung/state/StatePatternUnitTest.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/DeliveredState.java b/patterns/design-patterns/src/main/java/com/baeldung/state/DeliveredState.java new file mode 100644 index 0000000000..adb0fd3f5a --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/state/DeliveredState.java @@ -0,0 +1,19 @@ +package com.baeldung.state; + +public class DeliveredState implements PackageState { + + @Override + public void next(Package pkg) { + pkg.setState(new ReceivedState()); + } + + @Override + public void prev(Package pkg) { + pkg.setState(new OrderedState()); + } + + @Override + public String toString() { + return "DeliveredState{}"; + } +} \ No newline at end of file diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/ExplicitStateDemo.java b/patterns/design-patterns/src/main/java/com/baeldung/state/ExplicitStateDemo.java deleted file mode 100644 index de7b54d70e..0000000000 --- a/patterns/design-patterns/src/main/java/com/baeldung/state/ExplicitStateDemo.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.state; - -import com.baeldung.state.context.TradeContext; -import com.baeldung.state.states.DayTradeBehavior; -import com.baeldung.state.states.PositionTradeBehavior; -import com.baeldung.state.states.SwingTradeBehavior; - -public class ExplicitStateDemo { - - public static void main(String[] args) { - - TradeContext tradeContext = new TradeContext(new SwingTradeBehavior()); - tradeContext.trade(); - - tradeContext.setBehavior(new PositionTradeBehavior()); - tradeContext.trade(); - - tradeContext.setBehavior(new DayTradeBehavior()); - tradeContext.trade(); - } -} diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/InternalStateDemo.java b/patterns/design-patterns/src/main/java/com/baeldung/state/InternalStateDemo.java deleted file mode 100644 index 3148940f17..0000000000 --- a/patterns/design-patterns/src/main/java/com/baeldung/state/InternalStateDemo.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.baeldung.state; - -import com.baeldung.state.context.TradeContext; -import com.baeldung.state.states.FallbackDayTradeBehavior; - -public class InternalStateDemo { - - public static void main(String[] args) { - - TradeContext tradeContext = new TradeContext(new FallbackDayTradeBehavior()); - tradeContext.trade(); - tradeContext.trade(); - tradeContext.trade(); - } -} diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/OrderedState.java b/patterns/design-patterns/src/main/java/com/baeldung/state/OrderedState.java new file mode 100644 index 0000000000..56a267f160 --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/state/OrderedState.java @@ -0,0 +1,19 @@ +package com.baeldung.state; + +public class OrderedState implements PackageState { + + @Override + public void next(Package pkg) { + pkg.setState(new DeliveredState()); + } + + @Override + public void prev(Package pkg) { + System.out.println("The package is in it's root state."); + } + + @Override + public String toString() { + return "OrderedState{}"; + } +} \ No newline at end of file diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/Package.java b/patterns/design-patterns/src/main/java/com/baeldung/state/Package.java new file mode 100644 index 0000000000..ff04d543b8 --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/state/Package.java @@ -0,0 +1,22 @@ +package com.baeldung.state; + +public class Package { + + private PackageState state = new OrderedState(); + + public PackageState getState() { + return state; + } + + public void setState(PackageState state) { + this.state = state; + } + + public void previousState() { + state.prev(this); + } + + public void nextState() { + state.next(this); + } +} diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/PackageState.java b/patterns/design-patterns/src/main/java/com/baeldung/state/PackageState.java new file mode 100644 index 0000000000..d7f7a5c110 --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/state/PackageState.java @@ -0,0 +1,8 @@ +package com.baeldung.state; + +public interface PackageState { + + void next(Package pkg); + + void prev(Package pkg); +} \ No newline at end of file diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/ReceivedState.java b/patterns/design-patterns/src/main/java/com/baeldung/state/ReceivedState.java new file mode 100644 index 0000000000..be76937159 --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/state/ReceivedState.java @@ -0,0 +1,23 @@ +package com.baeldung.state; + +public class ReceivedState implements PackageState { + + @Override + public void next(Package pkg) { + if (pkg.getState() instanceof ReceivedState) { + System.out.println("This package is already received by a client."); + return; + } + pkg.setState(this); + } + + @Override + public void prev(Package pkg) { + pkg.setState(new DeliveredState()); + } + + @Override + public String toString() { + return "ReceivedState{}"; + } +} \ No newline at end of file diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/context/TradeContext.java b/patterns/design-patterns/src/main/java/com/baeldung/state/context/TradeContext.java deleted file mode 100644 index 0f12d050db..0000000000 --- a/patterns/design-patterns/src/main/java/com/baeldung/state/context/TradeContext.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.baeldung.state.context; - -import com.baeldung.state.states.TradeBehavior; - -public class TradeContext { - - private TradeBehavior behavior; - - public TradeContext(TradeBehavior behavior) { - this.behavior = behavior; - } - - public TradeBehavior getBehavior() { - return behavior; - } - - public void setBehavior(TradeBehavior behavior) { - this.behavior = behavior; - } - - public void trade() { - behavior.trade(this); - } - - @Override - public String toString() { - return "TradeContext{" + "behavior=" + behavior + '}'; - } -} diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/states/DayTradeBehavior.java b/patterns/design-patterns/src/main/java/com/baeldung/state/states/DayTradeBehavior.java deleted file mode 100644 index 540530e50b..0000000000 --- a/patterns/design-patterns/src/main/java/com/baeldung/state/states/DayTradeBehavior.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung.state.states; - -import com.baeldung.state.context.TradeContext; - -public class DayTradeBehavior implements TradeBehavior { - - @Override - public void trade(TradeContext ctx) { - System.out.println("Trading method: Day Trade"); - } -} diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/states/FallbackDayTradeBehavior.java b/patterns/design-patterns/src/main/java/com/baeldung/state/states/FallbackDayTradeBehavior.java deleted file mode 100644 index cf6e3ea695..0000000000 --- a/patterns/design-patterns/src/main/java/com/baeldung/state/states/FallbackDayTradeBehavior.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.baeldung.state.states; - -import com.baeldung.state.context.TradeContext; - -public class FallbackDayTradeBehavior implements TradeBehavior { - - @Override - public void trade(TradeContext ctx) { - System.out.println("Trading method: Day Trade"); - - if (Math.random() > 0.4) { - ctx.setBehavior(new SwingTradeBehavior()); - System.out.println("Day trading would not go well, falling back to Swing Trade"); - } - } -} diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/states/PositionTradeBehavior.java b/patterns/design-patterns/src/main/java/com/baeldung/state/states/PositionTradeBehavior.java deleted file mode 100644 index 0b1facb143..0000000000 --- a/patterns/design-patterns/src/main/java/com/baeldung/state/states/PositionTradeBehavior.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung.state.states; - -import com.baeldung.state.context.TradeContext; - -public class PositionTradeBehavior implements TradeBehavior { - - @Override - public void trade(TradeContext ctx) { - System.out.println("Trading method: Position Trade"); - } -} diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/states/SwingTradeBehavior.java b/patterns/design-patterns/src/main/java/com/baeldung/state/states/SwingTradeBehavior.java deleted file mode 100644 index bbe8091bed..0000000000 --- a/patterns/design-patterns/src/main/java/com/baeldung/state/states/SwingTradeBehavior.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung.state.states; - -import com.baeldung.state.context.TradeContext; - -public class SwingTradeBehavior implements TradeBehavior { - - @Override - public void trade(TradeContext ctx) { - System.out.println("Trading method: Swing Trade"); - } -} diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/states/TradeBehavior.java b/patterns/design-patterns/src/main/java/com/baeldung/state/states/TradeBehavior.java deleted file mode 100644 index ef5554ab50..0000000000 --- a/patterns/design-patterns/src/main/java/com/baeldung/state/states/TradeBehavior.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.baeldung.state.states; - -import com.baeldung.state.context.TradeContext; - -public interface TradeBehavior { - void trade(TradeContext ctx); -} diff --git a/patterns/design-patterns/src/test/java/com/baeldung/state/StatePatternUnitTest.java b/patterns/design-patterns/src/test/java/com/baeldung/state/StatePatternUnitTest.java new file mode 100644 index 0000000000..731974f92b --- /dev/null +++ b/patterns/design-patterns/src/test/java/com/baeldung/state/StatePatternUnitTest.java @@ -0,0 +1,33 @@ +package com.baeldung.state; + +import com.baeldung.state.Package; + +import static org.junit.Assert.assertThat; +import static org.hamcrest.CoreMatchers.instanceOf; + +import org.junit.Test; + +public class StatePatternUnitTest { + + @Test + public void givenNewPackage_whenPackageReceived_thenStateReceived() { + Package pkg = new Package(); + + assertThat(pkg.getState(), instanceOf(OrderedState.class)); + pkg.nextState(); + + assertThat(pkg.getState(), instanceOf(DeliveredState.class)); + pkg.nextState(); + + assertThat(pkg.getState(), instanceOf(ReceivedState.class)); + } + + @Test + public void givenDeliveredPackage_whenPrevState_thenStateOrdered() { + Package pkg = new Package(); + pkg.setState(new DeliveredState()); + pkg.previousState(); + + assertThat(pkg.getState(), instanceOf(OrderedState.class)); + } +} From 7c422c70ad16e7783ff5a919d6a330f9a45307ce Mon Sep 17 00:00:00 2001 From: Denis Date: Thu, 9 Aug 2018 21:06:30 +0200 Subject: [PATCH 012/128] BAEL-1997 add additional method to the states --- .../com/baeldung/state/DeliveredState.java | 6 ++++++ .../java/com/baeldung/state/OrderedState.java | 5 +++++ .../main/java/com/baeldung/state/Package.java | 4 ++++ .../java/com/baeldung/state/PackageState.java | 2 ++ .../com/baeldung/state/ReceivedState.java | 5 +++++ .../java/com/baeldung/state/StateDemo.java | 19 +++++++++++++++++++ 6 files changed, 41 insertions(+) create mode 100644 patterns/design-patterns/src/main/java/com/baeldung/state/StateDemo.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/DeliveredState.java b/patterns/design-patterns/src/main/java/com/baeldung/state/DeliveredState.java index adb0fd3f5a..9f5e4d8fc4 100644 --- a/patterns/design-patterns/src/main/java/com/baeldung/state/DeliveredState.java +++ b/patterns/design-patterns/src/main/java/com/baeldung/state/DeliveredState.java @@ -12,8 +12,14 @@ public class DeliveredState implements PackageState { pkg.setState(new OrderedState()); } + @Override + public void printStatus() { + System.out.println("Package delivered to post office, not received yet."); + } + @Override public String toString() { return "DeliveredState{}"; } + } \ No newline at end of file diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/OrderedState.java b/patterns/design-patterns/src/main/java/com/baeldung/state/OrderedState.java index 56a267f160..0642c4c73c 100644 --- a/patterns/design-patterns/src/main/java/com/baeldung/state/OrderedState.java +++ b/patterns/design-patterns/src/main/java/com/baeldung/state/OrderedState.java @@ -12,6 +12,11 @@ public class OrderedState implements PackageState { System.out.println("The package is in it's root state."); } + @Override + public void printStatus() { + System.out.println("Package ordered, not delivered to the office yet."); + } + @Override public String toString() { return "OrderedState{}"; diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/Package.java b/patterns/design-patterns/src/main/java/com/baeldung/state/Package.java index ff04d543b8..f3dfbb3fa7 100644 --- a/patterns/design-patterns/src/main/java/com/baeldung/state/Package.java +++ b/patterns/design-patterns/src/main/java/com/baeldung/state/Package.java @@ -19,4 +19,8 @@ public class Package { public void nextState() { state.next(this); } + + public void printStatus() { + state.printStatus(); + } } diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/PackageState.java b/patterns/design-patterns/src/main/java/com/baeldung/state/PackageState.java index d7f7a5c110..d6656c78ac 100644 --- a/patterns/design-patterns/src/main/java/com/baeldung/state/PackageState.java +++ b/patterns/design-patterns/src/main/java/com/baeldung/state/PackageState.java @@ -5,4 +5,6 @@ public interface PackageState { void next(Package pkg); void prev(Package pkg); + + void printStatus(); } \ No newline at end of file diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/ReceivedState.java b/patterns/design-patterns/src/main/java/com/baeldung/state/ReceivedState.java index be76937159..de25672e67 100644 --- a/patterns/design-patterns/src/main/java/com/baeldung/state/ReceivedState.java +++ b/patterns/design-patterns/src/main/java/com/baeldung/state/ReceivedState.java @@ -16,6 +16,11 @@ public class ReceivedState implements PackageState { pkg.setState(new DeliveredState()); } + @Override + public void printStatus() { + System.out.println("Package was received by client."); + } + @Override public String toString() { return "ReceivedState{}"; diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/StateDemo.java b/patterns/design-patterns/src/main/java/com/baeldung/state/StateDemo.java new file mode 100644 index 0000000000..1a63ea3ddf --- /dev/null +++ b/patterns/design-patterns/src/main/java/com/baeldung/state/StateDemo.java @@ -0,0 +1,19 @@ +package com.baeldung.state; + +public class StateDemo { + + public static void main(String[] args) { + + Package pkg = new Package(); + pkg.printStatus(); + + pkg.nextState(); + pkg.printStatus(); + + pkg.nextState(); + pkg.printStatus(); + + pkg.nextState(); + pkg.printStatus(); + } +} From 2b229332b966a006d0f2edb3b7d165a0510a08ff Mon Sep 17 00:00:00 2001 From: k0l0ssus Date: Fri, 10 Aug 2018 08:24:46 -0400 Subject: [PATCH 013/128] Add files via upload --- jersey-client-rx/pom.xml | 2 +- .../samples/jerseyrx/ClientOrchestration.java | 82 +++++++++---------- .../samples/jerseyrx/EmployeeDTO.java | 33 ++++++++ .../jerseyrx/ClientOrchestrationTest.java | 63 ++++++++------ 4 files changed, 107 insertions(+), 73 deletions(-) diff --git a/jersey-client-rx/pom.xml b/jersey-client-rx/pom.xml index fb7494fab1..4e35be31b4 100644 --- a/jersey-client-rx/pom.xml +++ b/jersey-client-rx/pom.xml @@ -40,7 +40,7 @@ org.glassfish.jersey.media jersey-media-json-jackson - 2.22 + 2.25 com.fasterxml.jackson.jaxrs diff --git a/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java b/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java index 6e184876cb..f2687c8c8d 100644 --- a/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java +++ b/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java @@ -1,7 +1,6 @@ package com.baeldung.samples.jerseyrx; import io.reactivex.Flowable; -import io.reactivex.disposables.Disposable; import java.util.LinkedList; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -27,28 +26,22 @@ import rx.Observable; * @author baeldung */ public class ClientOrchestration { - + Client client = ClientBuilder.newClient(); + WebTarget userIdService = client.target("http://localhost:8080/serviceA/id"); WebTarget nameService = client.target("http://localhost:8080/serviceA/{empId}/name"); WebTarget hashService = client.target("http://localhost:8080/serviceA/{comboIDandName}/hash"); + + LinkedList failures = new LinkedList<>(); - + Logger logger = Logger.getLogger("ClientOrchestrator"); - - public static void main(String[] args) { - ClientOrchestration orchestrator = new ClientOrchestration(); - - orchestrator.callBackOrchestrate(); - orchestrator.rxOrchestrate(); - orchestrator.observableJavaOrchestrate(); - orchestrator.flowableJavaOrchestrate(); - - } - + public void callBackOrchestrate() { logger.info("Orchestrating with the pyramid of doom"); - userIdService.request().accept(MediaType.APPLICATION_JSON) + userIdService.request() + .accept(MediaType.APPLICATION_JSON) .async() .get(new InvocationCallback() { @Override @@ -61,7 +54,7 @@ public class ClientOrchestration { nameService.resolveTemplate("empId", id).request() .async() .get(new InvocationCallback() { - + @Override public void completed(String response) { completionTracker.countDown(); @@ -70,7 +63,7 @@ public class ClientOrchestration { public void completed(String response) { logger.log(Level.INFO, "[InvocationCallback] The hash output {0}", response); } - + @Override public void failed(Throwable throwable) { completionTracker.countDown(); @@ -79,7 +72,7 @@ public class ClientOrchestration { } }); } - + @Override public void failed(Throwable throwable) { completionTracker.countDown(); @@ -88,7 +81,7 @@ public class ClientOrchestration { } }); }); - + try { if (!completionTracker.await(10, TimeUnit.SECONDS)) { //wait for inner requests to complete in 10 seconds logger.warning("[InvocationCallback] Some requests didn't complete within the timeout"); @@ -97,9 +90,9 @@ public class ClientOrchestration { failures.add(ex); Logger.getLogger(ClientOrchestration.class.getName()).log(Level.SEVERE, null, ex); } - + } - + @Override public void failed(Throwable throwable) { failures.add(throwable); @@ -107,7 +100,7 @@ public class ClientOrchestration { } }); } - + public void rxOrchestrate() { logger.info("Orchestrating with a CompletionStage"); CompletionStage userIdStage = userIdService.request().accept(MediaType.APPLICATION_JSON) @@ -119,7 +112,7 @@ public class ClientOrchestration { logger.warning("[CompletionStage] An error has occurred"); return null; }); - + userIdStage.thenAcceptAsync(empIdDto -> { logger.info("[CompletionStage] Got all the IDs " + empIdDto.getEmpIds()); empIdDto.getEmpIds().stream().forEach((Long id) -> { @@ -128,7 +121,7 @@ public class ClientOrchestration { .rx() .get(String.class) .toCompletableFuture(); - + completable.thenAccept((String userName) -> { hashService.resolveTemplate("comboIDandName", userName + id) .request() @@ -141,24 +134,24 @@ public class ClientOrchestration { logger.log(Level.WARNING, "[CompletionStage] Hash computation failed for {0}", id); return null; }); - + }); - + }); }); - + } - + public void observableJavaOrchestrate() { - + logger.info("Orchestrating with Observables"); - Observable userIdObservable = userIdService.register(RxObservableInvokerProvider.class).request() + Observable observableUserIdService = userIdService.register(RxObservableInvokerProvider.class).request() .accept(MediaType.APPLICATION_JSON) .rx(RxObservableInvoker.class) .get(new GenericType() { - }); - - userIdObservable.subscribe((EmployeeDTO empIdList) -> { + }).asObservable(); + + observableUserIdService.subscribe((EmployeeDTO empIdList) -> { logger.info("[Observable] Got all the IDs " + empIdList.getEmpIds()); Observable.from(empIdList.getEmpIds()).subscribe(id -> nameService.register(RxObservableInvokerProvider.class) @@ -171,8 +164,7 @@ public class ClientOrchestration { failures.add(throwable); logger.log(Level.WARNING, " [Observable] An error has occurred in the username request step {0}", throwable.getMessage()); }) - .subscribe(userName -> hashService - .register(RxObservableInvokerProvider.class) + .subscribe(userName -> hashService.register(RxObservableInvokerProvider.class) .resolveTemplate("comboIDandName", userName + id) .request() .rx(RxObservableInvoker.class) @@ -184,21 +176,21 @@ public class ClientOrchestration { }) .subscribe(hashValue -> logger.log(Level.INFO, "[Observable] The hash output {0}", hashValue)))); }); - + } - + public void flowableJavaOrchestrate() { - - logger.info("Orchestrating with Flowable"); - Flowable userIdObservable = userIdService.register(RxFlowableInvokerProvider.class) + + Flowable userIdFlowable = userIdService.register(RxFlowableInvokerProvider.class) .request() .rx(RxFlowableInvoker.class) .get(new GenericType() { }); - - Disposable subscribe = userIdObservable.subscribe((EmployeeDTO dto) -> { + + userIdFlowable.subscribe((EmployeeDTO dto) -> { + logger.info("Orchestrating with Flowable"); List listOfIds = dto.getEmpIds(); - Observable.from(listOfIds).map(id + Flowable.just(listOfIds).subscribe(id -> nameService.register(RxFlowableInvokerProvider.class) .resolveTemplate("empId", id) .request() @@ -219,7 +211,7 @@ public class ClientOrchestration { }) .subscribe(hashValue -> logger.log(Level.INFO, "[Flowable] The hash output {0}", hashValue)))); }); - + } - + } diff --git a/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/EmployeeDTO.java b/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/EmployeeDTO.java index a161448bb7..3a818f979e 100644 --- a/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/EmployeeDTO.java +++ b/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/EmployeeDTO.java @@ -1,6 +1,7 @@ package com.baeldung.samples.jerseyrx; import java.util.List; +import java.util.Objects; /** * @@ -18,4 +19,36 @@ public class EmployeeDTO { this.empIds = empIds; } + @Override + public int hashCode() { + int hash = 5; + hash = 59 * hash + Objects.hashCode(this.empIds); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final EmployeeDTO other = (EmployeeDTO) obj; + if (!Objects.equals(this.empIds, other.empIds)) { + return false; + } + return true; + } + + @Override + public String toString() { + return "EmployeeDTO{" + "empIds=" + empIds + '}'; + } + + + } diff --git a/jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx/ClientOrchestrationTest.java b/jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx/ClientOrchestrationTest.java index 2158f29a61..6df0e1c110 100644 --- a/jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx/ClientOrchestrationTest.java +++ b/jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx/ClientOrchestrationTest.java @@ -1,15 +1,18 @@ package com.baeldung.samples.jerseyrx; -import com.github.tomakehurst.wiremock.WireMockServer; import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; -import static com.github.tomakehurst.wiremock.client.WireMock.configureFor; -import static com.github.tomakehurst.wiremock.client.WireMock.equalTo; import static com.github.tomakehurst.wiremock.client.WireMock.get; import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; -import junit.framework.Assert; -import org.junit.After; +import com.github.tomakehurst.wiremock.junit.WireMockRule; +import java.util.LinkedList; +import java.util.logging.Logger; +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.WebTarget; +import static junit.framework.Assert.assertTrue; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; /** @@ -17,53 +20,59 @@ import org.junit.Test; * @author baeldung */ public class ClientOrchestrationTest { - + + Client client = ClientBuilder.newClient(); + + WebTarget userIdService = client.target("http://localhost:8080/serviceA/id"); + WebTarget nameService = client.target("http://localhost:8080/serviceA/{empId}/name"); + WebTarget hashService = client.target("http://localhost:8080/serviceA/{comboIDandName}/hash"); + + LinkedList failures = new LinkedList<>(); + + Logger logger = Logger.getLogger("ClientOrchestrator"); + ClientOrchestration orchestrator = new ClientOrchestration(); - + String jsonIdList = "{\"empIds\":[1,2,3,4,5,6]}"; - + String[] nameList = new String[]{"n/a", "Thor", "Hulk", "BlackWidow", "BlackPanther", "TheTick", "Hawkeye"}; - + String[] hashResultList = new String[]{"roht1", "kluh2", "WodiwKcalb3", "RehtnapKclab4", "kciteht5", "eyekwah6"}; - - WireMockServer wireMockServer = new WireMockServer(); - + + @Rule + public WireMockRule wireMockServer = new WireMockRule(); + @Before public void setup() { - wireMockServer.start(); - configureFor("localhost", 8080); + stubFor(get(urlEqualTo("/serviceA/id")).willReturn(aResponse().withBody(jsonIdList).withHeader("Content-Type", "application/json"))); - + stubFor(get(urlEqualTo("/serviceA/1/name")).willReturn(aResponse().withBody(nameList[1]))); stubFor(get(urlEqualTo("/serviceA/2/name")).willReturn(aResponse().withBody(nameList[2]))); stubFor(get(urlEqualTo("/serviceA/3/name")).willReturn(aResponse().withBody(nameList[3]))); stubFor(get(urlEqualTo("/serviceA/4/name")).willReturn(aResponse().withBody(nameList[4]))); stubFor(get(urlEqualTo("/serviceA/5/name")).willReturn(aResponse().withBody(nameList[5]))); stubFor(get(urlEqualTo("/serviceA/6/name")).willReturn(aResponse().withBody(nameList[6]))); - + stubFor(get(urlEqualTo("/serviceA/Thor1/hash")).willReturn(aResponse().withBody(hashResultList[0]))); stubFor(get(urlEqualTo("/serviceA/Hulk2/hash")).willReturn(aResponse().withBody(hashResultList[1]))); stubFor(get(urlEqualTo("/serviceA/BlackWidow3/hash")).willReturn(aResponse().withBody(hashResultList[2]))); stubFor(get(urlEqualTo("/serviceA/BlackPanther4/hash")).willReturn(aResponse().withBody(hashResultList[3]))); stubFor(get(urlEqualTo("/serviceA/TheTick5/hash")).willReturn(aResponse().withBody(hashResultList[4]))); stubFor(get(urlEqualTo("/serviceA/Hawkeye6/hash")).willReturn(aResponse().withBody(hashResultList[5]))); - + } - + @Test public void hits() { - + orchestrator.callBackOrchestrate(); orchestrator.rxOrchestrate(); orchestrator.observableJavaOrchestrate(); orchestrator.flowableJavaOrchestrate(); - - Assert.assertTrue(orchestrator.failures.isEmpty()); + + assertTrue(orchestrator.failures.isEmpty()); } - - @After - public void tearDown() { - - } - + + } From 1a1ea1560dfcae9b472a2e046ce5de1cc72c6186 Mon Sep 17 00:00:00 2001 From: Denis Date: Fri, 10 Aug 2018 23:28:16 +0200 Subject: [PATCH 014/128] BAEL-1997 clean up in ReceivedState --- .../src/main/java/com/baeldung/state/ReceivedState.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/ReceivedState.java b/patterns/design-patterns/src/main/java/com/baeldung/state/ReceivedState.java index de25672e67..84136fa48e 100644 --- a/patterns/design-patterns/src/main/java/com/baeldung/state/ReceivedState.java +++ b/patterns/design-patterns/src/main/java/com/baeldung/state/ReceivedState.java @@ -4,11 +4,7 @@ public class ReceivedState implements PackageState { @Override public void next(Package pkg) { - if (pkg.getState() instanceof ReceivedState) { - System.out.println("This package is already received by a client."); - return; - } - pkg.setState(this); + System.out.println("This package is already received by a client."); } @Override From e828a0de9a14836fe19addd486253f842159e58a Mon Sep 17 00:00:00 2001 From: DomWos Date: Mon, 13 Aug 2018 00:08:55 +0200 Subject: [PATCH 015/128] BAEL-1994: Flink and Kafka Data Pipeline --- apache-flink/pom.xml | 37 +++++++++ .../java/com/baeldung/FlinkDataPipeline.java | 81 +++++++++++++++++++ .../com/baeldung/flink/BackupAggregator.java | 34 ++++++++ .../java/com/baeldung/flink/Consumers.java | 32 ++++++++ .../flink/InputMessageTimestampAssigner.java | 23 ++++++ .../java/com/baeldung/flink/Producers.java | 17 ++++ .../com/baeldung/flink/WordsCapitalizer.java | 11 +++ .../main/java/com/baeldung/model/Backup.java | 23 ++++++ .../java/com/baeldung/model/InputMessage.java | 44 ++++++++++ .../schema/BackupSerializationSchema.java | 29 +++++++ .../InputMessageDeserializationSchema.java | 33 ++++++++ 11 files changed, 364 insertions(+) create mode 100644 apache-flink/pom.xml create mode 100644 apache-flink/src/main/java/com/baeldung/FlinkDataPipeline.java create mode 100644 apache-flink/src/main/java/com/baeldung/flink/BackupAggregator.java create mode 100644 apache-flink/src/main/java/com/baeldung/flink/Consumers.java create mode 100644 apache-flink/src/main/java/com/baeldung/flink/InputMessageTimestampAssigner.java create mode 100644 apache-flink/src/main/java/com/baeldung/flink/Producers.java create mode 100644 apache-flink/src/main/java/com/baeldung/flink/WordsCapitalizer.java create mode 100644 apache-flink/src/main/java/com/baeldung/model/Backup.java create mode 100644 apache-flink/src/main/java/com/baeldung/model/InputMessage.java create mode 100644 apache-flink/src/main/java/com/baeldung/schema/BackupSerializationSchema.java create mode 100644 apache-flink/src/main/java/com/baeldung/schema/InputMessageDeserializationSchema.java diff --git a/apache-flink/pom.xml b/apache-flink/pom.xml new file mode 100644 index 0000000000..c93ea3ef77 --- /dev/null +++ b/apache-flink/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + + groupId + apache-flink + 1.0-SNAPSHOT + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + org.apache.flink + flink-core + 1.5.0 + + + org.apache.flink + flink-connector-kafka-0.11_2.11 + 1.5.0 + + + org.apache.flink + flink-streaming-java_2.11 + 1.5.0 + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + 2.9.6 + + + \ No newline at end of file diff --git a/apache-flink/src/main/java/com/baeldung/FlinkDataPipeline.java b/apache-flink/src/main/java/com/baeldung/FlinkDataPipeline.java new file mode 100644 index 0000000000..d4e4cec60b --- /dev/null +++ b/apache-flink/src/main/java/com/baeldung/FlinkDataPipeline.java @@ -0,0 +1,81 @@ +package com.baeldung; + +import com.baeldung.flink.BackupAggregator; +import com.baeldung.flink.InputMessageTimestampAssigner; +import com.baeldung.flink.WordsCapitalizer; +import com.baeldung.model.Backup; +import com.baeldung.model.InputMessage; +import org.apache.flink.streaming.api.TimeCharacteristic; +import org.apache.flink.streaming.api.datastream.DataStream; +import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; +import org.apache.flink.streaming.api.windowing.time.Time; +import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer011; +import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer011; + +import static com.baeldung.flink.Consumers.*; +import static com.baeldung.flink.Producers.*; + +public class FlinkDataPipeline { + + public static void capitalize() throws Exception { + String inputTopic = "flink_input"; + String outputTopic = "flink_output"; + String consumerGroup = "baeldung"; + String address = "localhost:9092"; + + StreamExecutionEnvironment environment = + StreamExecutionEnvironment.getExecutionEnvironment(); + + FlinkKafkaConsumer011 flinkKafkaConsumer = + createStringConsumerForTopic(inputTopic, address, consumerGroup); + flinkKafkaConsumer.setStartFromEarliest(); + + DataStream stringInputStream = + environment.addSource(flinkKafkaConsumer); + + FlinkKafkaProducer011 flinkKafkaProducer = + createStringProducer(outputTopic, address); + + stringInputStream + .map(new WordsCapitalizer()) + .addSink(flinkKafkaProducer); + + environment.execute(); + } + +public static void createBackup () throws Exception { + String inputTopic = "flink_input"; + String outputTopic = "flink_output"; + String consumerGroup = "baeldung"; + String kafkaAddress = "192.168.99.100:9092"; + + StreamExecutionEnvironment environment = + StreamExecutionEnvironment.getExecutionEnvironment(); + + environment.setStreamTimeCharacteristic(TimeCharacteristic.EventTime); + + FlinkKafkaConsumer011 flinkKafkaConsumer = + createInputMessageConsumer(inputTopic, kafkaAddress, consumerGroup); + flinkKafkaConsumer.setStartFromEarliest(); + + flinkKafkaConsumer + .assignTimestampsAndWatermarks(new InputMessageTimestampAssigner()); + FlinkKafkaProducer011 flinkKafkaProducer = + createBackupProducer(outputTopic, kafkaAddress); + + DataStream inputMessagesStream = + environment.addSource(flinkKafkaConsumer); + + inputMessagesStream + .timeWindowAll(Time.hours(24)) + .aggregate(new BackupAggregator()) + .addSink(flinkKafkaProducer); + + environment.execute(); +} + + public static void main(String[] args) throws Exception { + createBackup(); + } + +} diff --git a/apache-flink/src/main/java/com/baeldung/flink/BackupAggregator.java b/apache-flink/src/main/java/com/baeldung/flink/BackupAggregator.java new file mode 100644 index 0000000000..2bfbb1e270 --- /dev/null +++ b/apache-flink/src/main/java/com/baeldung/flink/BackupAggregator.java @@ -0,0 +1,34 @@ +package com.baeldung.flink; + +import com.baeldung.model.Backup; +import com.baeldung.model.InputMessage; +import org.apache.flink.api.common.functions.AggregateFunction; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + + public class BackupAggregator implements AggregateFunction, Backup> { + @Override + public List createAccumulator() { + return new ArrayList<>(); + } + + @Override + public List add(InputMessage inputMessage, List inputMessages) { + inputMessages.add(inputMessage); + return inputMessages; + } + + @Override + public Backup getResult(List inputMessages) { + Backup backup = new Backup(inputMessages, LocalDateTime.now()); + return backup; + } + + @Override + public List merge(List inputMessages, List acc1) { + inputMessages.addAll(acc1); + return inputMessages; + } + } diff --git a/apache-flink/src/main/java/com/baeldung/flink/Consumers.java b/apache-flink/src/main/java/com/baeldung/flink/Consumers.java new file mode 100644 index 0000000000..e9aa78b677 --- /dev/null +++ b/apache-flink/src/main/java/com/baeldung/flink/Consumers.java @@ -0,0 +1,32 @@ +package com.baeldung.flink; + +import com.baeldung.schema.InputMessageDeserializationSchema; +import com.baeldung.model.InputMessage; +import org.apache.flink.api.common.serialization.SimpleStringSchema; +import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer011; + +import java.util.Properties; + +public class Consumers { + +public static FlinkKafkaConsumer011 createStringConsumerForTopic( + String topic, String kafkaAddress, String kafkaGroup ) { + Properties props = new Properties(); + props.setProperty("bootstrap.servers", kafkaAddress); + props.setProperty("group.id",kafkaGroup); + FlinkKafkaConsumer011 consumer = + new FlinkKafkaConsumer011<>(topic, new SimpleStringSchema(),props); + + return consumer; +} + + public static FlinkKafkaConsumer011 createInputMessageConsumer(String topic, String kafkaAddress, String kafkaGroup ) { + Properties properties = new Properties(); + properties.setProperty("bootstrap.servers", kafkaAddress); + properties.setProperty("group.id",kafkaGroup); + FlinkKafkaConsumer011 consumer = new FlinkKafkaConsumer011( + topic, new InputMessageDeserializationSchema(),properties); + + return consumer; + } +} diff --git a/apache-flink/src/main/java/com/baeldung/flink/InputMessageTimestampAssigner.java b/apache-flink/src/main/java/com/baeldung/flink/InputMessageTimestampAssigner.java new file mode 100644 index 0000000000..5d58cb36cc --- /dev/null +++ b/apache-flink/src/main/java/com/baeldung/flink/InputMessageTimestampAssigner.java @@ -0,0 +1,23 @@ +package com.baeldung.flink; + +import com.baeldung.model.InputMessage; +import org.apache.flink.streaming.api.functions.AssignerWithPunctuatedWatermarks; +import org.apache.flink.streaming.api.watermark.Watermark; + +import javax.annotation.Nullable; +import java.time.ZoneId; + +public class InputMessageTimestampAssigner implements AssignerWithPunctuatedWatermarks { + + @Override + public long extractTimestamp(InputMessage element, long previousElementTimestamp) { + ZoneId zoneId = ZoneId.systemDefault(); + return element.getSentAt().atZone(zoneId).toEpochSecond() * 1000; + } + + @Nullable + @Override + public Watermark checkAndGetNextWatermark(InputMessage lastElement, long extractedTimestamp) { + return new Watermark(extractedTimestamp - 15); + } +} diff --git a/apache-flink/src/main/java/com/baeldung/flink/Producers.java b/apache-flink/src/main/java/com/baeldung/flink/Producers.java new file mode 100644 index 0000000000..094b6ff211 --- /dev/null +++ b/apache-flink/src/main/java/com/baeldung/flink/Producers.java @@ -0,0 +1,17 @@ +package com.baeldung.flink; + +import com.baeldung.schema.BackupSerializationSchema; +import com.baeldung.model.Backup; +import org.apache.flink.api.common.serialization.SimpleStringSchema; +import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer011; + +public class Producers { + + public static FlinkKafkaProducer011 createStringProducer(String topic, String kafkaAddress) { + return new FlinkKafkaProducer011<>(kafkaAddress, topic, new SimpleStringSchema()); + } + + public static FlinkKafkaProducer011 createBackupProducer(String topic, String kafkaAddress) { + return new FlinkKafkaProducer011<>(kafkaAddress, topic, new BackupSerializationSchema()); + } +} diff --git a/apache-flink/src/main/java/com/baeldung/flink/WordsCapitalizer.java b/apache-flink/src/main/java/com/baeldung/flink/WordsCapitalizer.java new file mode 100644 index 0000000000..49fffc292e --- /dev/null +++ b/apache-flink/src/main/java/com/baeldung/flink/WordsCapitalizer.java @@ -0,0 +1,11 @@ +package com.baeldung.flink; + +import org.apache.flink.api.common.functions.MapFunction; + +public class WordsCapitalizer implements MapFunction { + + @Override + public String map(String s) { + return s.toUpperCase(); + } +} diff --git a/apache-flink/src/main/java/com/baeldung/model/Backup.java b/apache-flink/src/main/java/com/baeldung/model/Backup.java new file mode 100644 index 0000000000..3a57d65d78 --- /dev/null +++ b/apache-flink/src/main/java/com/baeldung/model/Backup.java @@ -0,0 +1,23 @@ +package com.baeldung.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.UUID; + +public class Backup { + + @JsonProperty("inputMessages") + List inputMessages; + @JsonProperty("backupTimestamp") + LocalDateTime backupTimestamp; + @JsonProperty("uuid") + UUID uuid; + + public Backup(List inputMessages, LocalDateTime backupTimestamp) { + this.inputMessages = inputMessages; + this.backupTimestamp = backupTimestamp; + this.uuid = UUID.randomUUID(); + } +} diff --git a/apache-flink/src/main/java/com/baeldung/model/InputMessage.java b/apache-flink/src/main/java/com/baeldung/model/InputMessage.java new file mode 100644 index 0000000000..57a85de81a --- /dev/null +++ b/apache-flink/src/main/java/com/baeldung/model/InputMessage.java @@ -0,0 +1,44 @@ +package com.baeldung.model; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import java.time.LocalDateTime; + +@JsonSerialize +public class InputMessage { + String sender; + String recipient; + LocalDateTime sentAt; + String message; + + public String getSender() { + return sender; + } + + public void setSender(String sender) { + this.sender = sender; + } + + public String getRecipient() { + return recipient; + } + + public void setRecipient(String recipient) { + this.recipient = recipient; + } + + public LocalDateTime getSentAt() { + return sentAt; + } + + public void setSentAt(LocalDateTime sentAt) { + this.sentAt = sentAt; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/apache-flink/src/main/java/com/baeldung/schema/BackupSerializationSchema.java b/apache-flink/src/main/java/com/baeldung/schema/BackupSerializationSchema.java new file mode 100644 index 0000000000..fa525a5ee8 --- /dev/null +++ b/apache-flink/src/main/java/com/baeldung/schema/BackupSerializationSchema.java @@ -0,0 +1,29 @@ +package com.baeldung.schema; + +import com.baeldung.model.Backup; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.apache.flink.api.common.serialization.SerializationSchema; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class BackupSerializationSchema + implements SerializationSchema { + + ObjectMapper objectMapper; + Logger logger = LoggerFactory.getLogger(BackupSerializationSchema.class); + + @Override + public byte[] serialize(Backup backupMessage) { + if(objectMapper == null) { + objectMapper = new ObjectMapper().registerModule(new JavaTimeModule()); + } + try { + String json = objectMapper.writeValueAsString(backupMessage); + return json.getBytes(); + } catch (com.fasterxml.jackson.core.JsonProcessingException e) { + logger.error("Failed to parse JSON", e); + } + return new byte[0]; + } +} diff --git a/apache-flink/src/main/java/com/baeldung/schema/InputMessageDeserializationSchema.java b/apache-flink/src/main/java/com/baeldung/schema/InputMessageDeserializationSchema.java new file mode 100644 index 0000000000..99b6baa6f4 --- /dev/null +++ b/apache-flink/src/main/java/com/baeldung/schema/InputMessageDeserializationSchema.java @@ -0,0 +1,33 @@ +package com.baeldung.schema; + +import com.baeldung.model.InputMessage; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.apache.flink.api.common.serialization.DeserializationSchema; +import org.apache.flink.api.common.typeinfo.TypeInformation; + +import java.io.IOException; + +public class InputMessageDeserializationSchema implements + DeserializationSchema { + + ObjectMapper objectMapper; + + @Override + public InputMessage deserialize(byte[] bytes) throws IOException { + if(objectMapper == null) { + objectMapper = new ObjectMapper().registerModule(new JavaTimeModule()); + } + return objectMapper.readValue(bytes, InputMessage.class); + } + + @Override + public boolean isEndOfStream(InputMessage inputMessage) { + return false; + } + + @Override + public TypeInformation getProducedType() { + return TypeInformation.of(InputMessage.class); + } +} From 623e29cecb279a0a8300a447fbe9f42d610fb5c4 Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Wed, 15 Aug 2018 23:10:18 +0200 Subject: [PATCH 016/128] fixed async timing and 404 bug, refactored code --- jersey-client-rx/pom.xml | 11 + .../samples/jerseyrx/ClientOrchestration.java | 217 ---------------- .../samples/jerseyrx/EmployeeDTO.java | 54 ---- .../ClientOrchestrationIntegrationTest.java | 244 ++++++++++++++++++ .../jerseyrx/ClientOrchestrationTest.java | 78 ------ pom.xml | 1 + 6 files changed, 256 insertions(+), 349 deletions(-) delete mode 100644 jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java delete mode 100644 jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/EmployeeDTO.java create mode 100644 jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx/ClientOrchestrationIntegrationTest.java delete mode 100644 jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx/ClientOrchestrationTest.java diff --git a/jersey-client-rx/pom.xml b/jersey-client-rx/pom.xml index 4e35be31b4..24894869a5 100644 --- a/jersey-client-rx/pom.xml +++ b/jersey-client-rx/pom.xml @@ -47,6 +47,17 @@ jackson-jaxrs-json-provider 2.4.1 + + org.slf4j + slf4j-jdk14 + 1.7.25 + + + org.assertj + assertj-core + 3.10.0 + test + UTF-8 diff --git a/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java b/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java deleted file mode 100644 index f2687c8c8d..0000000000 --- a/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/ClientOrchestration.java +++ /dev/null @@ -1,217 +0,0 @@ -package com.baeldung.samples.jerseyrx; - -import io.reactivex.Flowable; -import java.util.LinkedList; -import java.util.List; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.CompletionStage; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import java.util.logging.Level; -import org.glassfish.jersey.client.rx.rxjava.RxObservableInvokerProvider; -import org.glassfish.jersey.client.rx.rxjava.RxObservableInvoker; -import java.util.logging.Logger; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.InvocationCallback; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.GenericType; -import javax.ws.rs.core.MediaType; -import org.glassfish.jersey.client.rx.rxjava2.RxFlowableInvoker; -import org.glassfish.jersey.client.rx.rxjava2.RxFlowableInvokerProvider; -import rx.Observable; - -/** - * - * @author baeldung - */ -public class ClientOrchestration { - - Client client = ClientBuilder.newClient(); - - WebTarget userIdService = client.target("http://localhost:8080/serviceA/id"); - WebTarget nameService = client.target("http://localhost:8080/serviceA/{empId}/name"); - WebTarget hashService = client.target("http://localhost:8080/serviceA/{comboIDandName}/hash"); - - - LinkedList failures = new LinkedList<>(); - - Logger logger = Logger.getLogger("ClientOrchestrator"); - - public void callBackOrchestrate() { - logger.info("Orchestrating with the pyramid of doom"); - userIdService.request() - .accept(MediaType.APPLICATION_JSON) - .async() - .get(new InvocationCallback() { - @Override - public void completed(EmployeeDTO empIdList) { - logger.info("[InvocationCallback] Got all the IDs " + empIdList.getEmpIds()); - List empIds = empIdList.getEmpIds(); - CountDownLatch completionTracker = new CountDownLatch(empIds.size()); //used to keep track of the progress of the subsequent calls - empIds.forEach((id) -> { - //for each employee ID, get the name - nameService.resolveTemplate("empId", id).request() - .async() - .get(new InvocationCallback() { - - @Override - public void completed(String response) { - completionTracker.countDown(); - hashService.resolveTemplate("comboIDandName", response + id).request().async().get(new InvocationCallback() { - @Override - public void completed(String response) { - logger.log(Level.INFO, "[InvocationCallback] The hash output {0}", response); - } - - @Override - public void failed(Throwable throwable) { - completionTracker.countDown(); - failures.add(throwable); - logger.log(Level.WARNING, "[InvocationCallback] An error has occurred in the hashing request step {0}", throwable.getMessage()); - } - }); - } - - @Override - public void failed(Throwable throwable) { - completionTracker.countDown(); - failures.add(throwable); - logger.log(Level.WARNING, "[InvocationCallback] An error has occurred in the username request step {0}", throwable.getMessage()); - } - }); - }); - - try { - if (!completionTracker.await(10, TimeUnit.SECONDS)) { //wait for inner requests to complete in 10 seconds - logger.warning("[InvocationCallback] Some requests didn't complete within the timeout"); - } - } catch (InterruptedException ex) { - failures.add(ex); - Logger.getLogger(ClientOrchestration.class.getName()).log(Level.SEVERE, null, ex); - } - - } - - @Override - public void failed(Throwable throwable) { - failures.add(throwable); - logger.warning("Couldn't get the list of IDs"); - } - }); - } - - public void rxOrchestrate() { - logger.info("Orchestrating with a CompletionStage"); - CompletionStage userIdStage = userIdService.request().accept(MediaType.APPLICATION_JSON) - .rx() - .get(new GenericType() { - }) - .exceptionally((throwable) -> { - failures.add(throwable); - logger.warning("[CompletionStage] An error has occurred"); - return null; - }); - - userIdStage.thenAcceptAsync(empIdDto -> { - logger.info("[CompletionStage] Got all the IDs " + empIdDto.getEmpIds()); - empIdDto.getEmpIds().stream().forEach((Long id) -> { - CompletableFuture completable = nameService.resolveTemplate("empId", id) - .request() - .rx() - .get(String.class) - .toCompletableFuture(); - - completable.thenAccept((String userName) -> { - hashService.resolveTemplate("comboIDandName", userName + id) - .request() - .rx() - .get(String.class) - .toCompletableFuture() - .thenAcceptAsync(hashValue -> logger.log(Level.INFO, "[CompletionFuture] The hash output {0}", hashValue)) - .exceptionally((throwable) -> { - failures.add(throwable); - logger.log(Level.WARNING, "[CompletionStage] Hash computation failed for {0}", id); - return null; - }); - - }); - - }); - }); - - } - - public void observableJavaOrchestrate() { - - logger.info("Orchestrating with Observables"); - Observable observableUserIdService = userIdService.register(RxObservableInvokerProvider.class).request() - .accept(MediaType.APPLICATION_JSON) - .rx(RxObservableInvoker.class) - .get(new GenericType() { - }).asObservable(); - - observableUserIdService.subscribe((EmployeeDTO empIdList) -> { - logger.info("[Observable] Got all the IDs " + empIdList.getEmpIds()); - Observable.from(empIdList.getEmpIds()).subscribe(id - -> nameService.register(RxObservableInvokerProvider.class) - .resolveTemplate("empId", id) - .request() - .rx(RxObservableInvoker.class) - .get(String.class) - .asObservable() //gotten the name for the given empId - .doOnError((throwable) -> { - failures.add(throwable); - logger.log(Level.WARNING, " [Observable] An error has occurred in the username request step {0}", throwable.getMessage()); - }) - .subscribe(userName -> hashService.register(RxObservableInvokerProvider.class) - .resolveTemplate("comboIDandName", userName + id) - .request() - .rx(RxObservableInvoker.class) - .get(String.class) - .asObservable() //gotten the hash value for empId+username - .doOnError((throwable) -> { - failures.add(throwable); - logger.log(Level.WARNING, " [Observable]An error has occurred in the hashing request step {0}", throwable.getMessage()); - }) - .subscribe(hashValue -> logger.log(Level.INFO, "[Observable] The hash output {0}", hashValue)))); - }); - - } - - public void flowableJavaOrchestrate() { - - Flowable userIdFlowable = userIdService.register(RxFlowableInvokerProvider.class) - .request() - .rx(RxFlowableInvoker.class) - .get(new GenericType() { - }); - - userIdFlowable.subscribe((EmployeeDTO dto) -> { - logger.info("Orchestrating with Flowable"); - List listOfIds = dto.getEmpIds(); - Flowable.just(listOfIds).subscribe(id - -> nameService.register(RxFlowableInvokerProvider.class) - .resolveTemplate("empId", id) - .request() - .rx(RxFlowableInvoker.class) - .get(String.class) //gotten the name for the given empId - .doOnError((throwable) -> { - failures.add(throwable); - logger.log(Level.WARNING, "[Flowable] An error has occurred in the username request step {0}", throwable.getMessage()); - }) - .subscribe(userName -> hashService.register(RxFlowableInvokerProvider.class) - .resolveTemplate("comboIDandName", userName + id) - .request() - .rx(RxFlowableInvoker.class) - .get(String.class) //gotten the hash value for empId+username - .doOnError((throwable) -> { - failures.add(throwable); - logger.warning(" [Flowable] An error has occurred in the hashing request step " + throwable.getMessage()); - }) - .subscribe(hashValue -> logger.log(Level.INFO, "[Flowable] The hash output {0}", hashValue)))); - }); - - } - -} diff --git a/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/EmployeeDTO.java b/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/EmployeeDTO.java deleted file mode 100644 index 3a818f979e..0000000000 --- a/jersey-client-rx/src/main/java/com/baeldung/samples/jerseyrx/EmployeeDTO.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.baeldung.samples.jerseyrx; - -import java.util.List; -import java.util.Objects; - -/** - * - * @author baeldung - */ -public class EmployeeDTO { - - private List empIds; - - public List getEmpIds() { - return empIds; - } - - public void setEmpIds(List empIds) { - this.empIds = empIds; - } - - @Override - public int hashCode() { - int hash = 5; - hash = 59 * hash + Objects.hashCode(this.empIds); - return hash; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final EmployeeDTO other = (EmployeeDTO) obj; - if (!Objects.equals(this.empIds, other.empIds)) { - return false; - } - return true; - } - - @Override - public String toString() { - return "EmployeeDTO{" + "empIds=" + empIds + '}'; - } - - - -} diff --git a/jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx/ClientOrchestrationIntegrationTest.java b/jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx/ClientOrchestrationIntegrationTest.java new file mode 100644 index 0000000000..10cdab7c7a --- /dev/null +++ b/jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx/ClientOrchestrationIntegrationTest.java @@ -0,0 +1,244 @@ +package com.baeldung.samples.jerseyrx; + +import static com.github.tomakehurst.wiremock.client.WireMock.*; +import static org.assertj.core.api.Assertions.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionStage; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.InvocationCallback; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.GenericType; +import javax.ws.rs.core.MediaType; + +import org.glassfish.jersey.client.rx.rxjava.RxObservableInvoker; +import org.glassfish.jersey.client.rx.rxjava.RxObservableInvokerProvider; +import org.glassfish.jersey.client.rx.rxjava2.RxFlowableInvoker; +import org.glassfish.jersey.client.rx.rxjava2.RxFlowableInvokerProvider; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.tomakehurst.wiremock.junit.WireMockRule; + +import io.reactivex.Flowable; +import rx.Observable; + +/** + * + * @author baeldung + */ +public class ClientOrchestrationIntegrationTest { + + private Client client = ClientBuilder.newClient(); + + private WebTarget userIdService = client.target("http://localhost:8080/id-service/ids"); + private WebTarget nameService = client.target("http://localhost:8080/name-service/users/{userId}/name"); + private WebTarget hashService = client.target("http://localhost:8080/hash-service/{rawValue}"); + + private Logger logger = LoggerFactory.getLogger(ClientOrchestrationIntegrationTest.class); + + private String expectedUserIds = "[1,2,3,4,5,6]"; + + private List expectedNames = Arrays.asList("n/a", "Thor", "Hulk", "BlackWidow", "BlackPanther", "TheTick", "Hawkeye"); + + private List expectedHashValues = Arrays.asList("roht1", "kluh2", "WodiwKcalb3", "RehtnapKclab4", "kciteht5", "eyekwah6"); + + @Rule + public WireMockRule wireMockServer = new WireMockRule(); + + @Before + public void setup() { + + stubFor(get(urlEqualTo("/id-service/ids")).willReturn(aResponse().withBody(expectedUserIds).withHeader("Content-Type", "application/json"))); + + stubFor(get(urlEqualTo("/name-service/users/1/name")).willReturn(aResponse().withBody(expectedNames.get(1)))); + stubFor(get(urlEqualTo("/name-service/users/2/name")).willReturn(aResponse().withBody(expectedNames.get(2)))); + stubFor(get(urlEqualTo("/name-service/users/3/name")).willReturn(aResponse().withBody(expectedNames.get(3)))); + stubFor(get(urlEqualTo("/name-service/users/4/name")).willReturn(aResponse().withBody(expectedNames.get(4)))); + stubFor(get(urlEqualTo("/name-service/users/5/name")).willReturn(aResponse().withBody(expectedNames.get(5)))); + stubFor(get(urlEqualTo("/name-service/users/6/name")).willReturn(aResponse().withBody(expectedNames.get(6)))); + + stubFor(get(urlEqualTo("/hash-service/Thor1")).willReturn(aResponse().withBody(expectedHashValues.get(0)))); + stubFor(get(urlEqualTo("/hash-service/Hulk2")).willReturn(aResponse().withBody(expectedHashValues.get(1)))); + stubFor(get(urlEqualTo("/hash-service/BlackWidow3")).willReturn(aResponse().withBody(expectedHashValues.get(2)))); + stubFor(get(urlEqualTo("/hash-service/BlackPanther4")).willReturn(aResponse().withBody(expectedHashValues.get(3)))); + stubFor(get(urlEqualTo("/hash-service/TheTick5")).willReturn(aResponse().withBody(expectedHashValues.get(4)))); + stubFor(get(urlEqualTo("/hash-service/Hawkeye6")).willReturn(aResponse().withBody(expectedHashValues.get(5)))); + + } + + @Test + public void callBackOrchestrate() throws InterruptedException { + List receivedHashValues = new ArrayList<>(); + + userIdService.request().accept(MediaType.APPLICATION_JSON).async().get(new InvocationCallback>() { + @Override + public void completed(List employeeIds) { + logger.info("[CallbackExample] id-service result: {}", employeeIds); + CountDownLatch completionTracker = new CountDownLatch(employeeIds.size()); // used to keep track of the progress of the subsequent calls + employeeIds.forEach((id) -> { + // for each employee ID, get the name + nameService.resolveTemplate("userId", id).request().async().get(new InvocationCallback() { + + @Override + public void completed(String response) { + logger.info("[CallbackExample] name-service result: {}", response); + + completionTracker.countDown(); + hashService.resolveTemplate("rawValue", response + id).request().async().get(new InvocationCallback() { + @Override + public void completed(String response) { + logger.info("[CallbackExample] hash-service result: {}", response); + receivedHashValues.add(response); + } + + @Override + public void failed(Throwable throwable) { + completionTracker.countDown(); + logger.warn("[CallbackExample] An error has occurred in the hashing request step!", throwable); + } + }); + } + + @Override + public void failed(Throwable throwable) { + completionTracker.countDown(); + logger.warn("[CallbackExample] An error has occurred in the username request step!", throwable); + } + }); + }); + + try { + // wait for inner requests to complete in 10 seconds + if (!completionTracker.await(10, TimeUnit.SECONDS)) { + logger.warn("[CallbackExample] Some requests didn't complete within the timeout"); + } + } catch (InterruptedException e) { + logger.error("Interrupted!", e); + } + + } + + @Override + public void failed(Throwable throwable) { + logger.warn("[CallbackExample] An error has occurred in the userId request step!", throwable); + } + }); + + // wait for async calls to complete + Thread.sleep(1000); + + assertThat(receivedHashValues).containsAll(expectedHashValues); + } + + @Test + public void rxOrchestrate() throws InterruptedException { + List receivedHashValues = new ArrayList<>(); + + CompletionStage> userIdStage = userIdService.request().accept(MediaType.APPLICATION_JSON).rx().get(new GenericType>() { + }).exceptionally((throwable) -> { + logger.warn("[CompletionStageExample] An error has occurred"); + return null; + }); + + userIdStage.thenAcceptAsync(employeeIds -> { + logger.info("[CompletionStageExample] id-service result: {}", employeeIds); + employeeIds.forEach((Long id) -> { + CompletableFuture completable = nameService.resolveTemplate("userId", id).request().rx().get(String.class).toCompletableFuture(); + + completable.thenAccept((String userName) -> { + logger.info("[CompletionStageExample] name-service result: {}", userName); + hashService.resolveTemplate("rawValue", userName + id).request().rx().get(String.class).toCompletableFuture().thenAcceptAsync(hashValue -> { + logger.info("[CompletionStageExample] hash-service result: {}", hashValue); + receivedHashValues.add(hashValue); + }).exceptionally((throwable) -> { + logger.warn("[CompletionStageExample] Hash computation failed for {}", id); + return null; + }); + + }); + + }); + }); + + // wait for async calls to complete + Thread.sleep(1000); + + assertThat(receivedHashValues).containsAll(expectedHashValues); + } + + @Test + public void observableJavaOrchestrate() throws InterruptedException { + List receivedHashValues = new ArrayList<>(); + + Observable> observableUserIdService = userIdService.register(RxObservableInvokerProvider.class).request().accept(MediaType.APPLICATION_JSON).rx(RxObservableInvoker.class).get(new GenericType>() { + }).asObservable(); + + observableUserIdService.subscribe((List employeeIds) -> { + logger.info("[ObservableExample] id-service result: {}", employeeIds); + Observable.from(employeeIds).subscribe(id -> nameService.register(RxObservableInvokerProvider.class).resolveTemplate("userId", id).request().rx(RxObservableInvoker.class).get(String.class).asObservable() // gotten the name for the given + // userId + .doOnError((throwable) -> { + logger.warn("[ObservableExample] An error has occurred in the username request step {}", throwable.getMessage()); + }).subscribe(userName -> { + logger.info("[ObservableExample] name-service result: {}", userName); + hashService.register(RxObservableInvokerProvider.class).resolveTemplate("rawValue", userName + id).request().rx(RxObservableInvoker.class).get(String.class).asObservable() // gotten the hash value for + // userId+username + .doOnError((throwable) -> { + logger.warn("[ObservableExample] An error has occurred in the hashing request step {}", throwable.getMessage()); + }).subscribe(hashValue -> { + logger.info("[ObservableExample] hash-service result: {}", hashValue); + receivedHashValues.add(hashValue); + }); + })); + }); + + // wait for async calls to complete + Thread.sleep(1000); + + assertThat(receivedHashValues).containsAll(expectedHashValues); + } + + @Test + public void flowableJavaOrchestrate() throws InterruptedException { + List receivedHashValues = new ArrayList<>(); + + Flowable> userIdFlowable = userIdService.register(RxFlowableInvokerProvider.class).request().rx(RxFlowableInvoker.class).get(new GenericType>() { + }); + + userIdFlowable.subscribe((List employeeIds) -> { + logger.info("[FlowableExample] id-service result: {}", employeeIds); + Flowable.fromIterable(employeeIds).subscribe(id -> { + nameService.register(RxFlowableInvokerProvider.class).resolveTemplate("userId", id).request().rx(RxFlowableInvoker.class).get(String.class) // gotten the name for the given userId + .doOnError((throwable) -> { + logger.warn("[FlowableExample] An error has occurred in the username request step {}", throwable.getMessage()); + }).subscribe(userName -> { + logger.info("[FlowableExample] name-service result: {}", userName); + hashService.register(RxFlowableInvokerProvider.class).resolveTemplate("rawValue", userName + id).request().rx(RxFlowableInvoker.class).get(String.class) // gotten the hash value for userId+username + .doOnError((throwable) -> { + logger.warn(" [FlowableExample] An error has occurred in the hashing request step!", throwable); + }).subscribe(hashValue -> { + logger.info("[FlowableExample] hash-service result: {}", hashValue); + receivedHashValues.add(hashValue); + }); + }); + }); + }); + + // wait for async calls to complete + Thread.sleep(1000); + + assertThat(receivedHashValues).containsAll(expectedHashValues); + } + +} diff --git a/jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx/ClientOrchestrationTest.java b/jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx/ClientOrchestrationTest.java deleted file mode 100644 index 6df0e1c110..0000000000 --- a/jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx/ClientOrchestrationTest.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.baeldung.samples.jerseyrx; - -import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; -import static com.github.tomakehurst.wiremock.client.WireMock.get; -import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; -import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; -import com.github.tomakehurst.wiremock.junit.WireMockRule; -import java.util.LinkedList; -import java.util.logging.Logger; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.WebTarget; -import static junit.framework.Assert.assertTrue; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; - -/** - * - * @author baeldung - */ -public class ClientOrchestrationTest { - - Client client = ClientBuilder.newClient(); - - WebTarget userIdService = client.target("http://localhost:8080/serviceA/id"); - WebTarget nameService = client.target("http://localhost:8080/serviceA/{empId}/name"); - WebTarget hashService = client.target("http://localhost:8080/serviceA/{comboIDandName}/hash"); - - LinkedList failures = new LinkedList<>(); - - Logger logger = Logger.getLogger("ClientOrchestrator"); - - ClientOrchestration orchestrator = new ClientOrchestration(); - - String jsonIdList = "{\"empIds\":[1,2,3,4,5,6]}"; - - String[] nameList = new String[]{"n/a", "Thor", "Hulk", "BlackWidow", "BlackPanther", "TheTick", "Hawkeye"}; - - String[] hashResultList = new String[]{"roht1", "kluh2", "WodiwKcalb3", "RehtnapKclab4", "kciteht5", "eyekwah6"}; - - @Rule - public WireMockRule wireMockServer = new WireMockRule(); - - @Before - public void setup() { - - stubFor(get(urlEqualTo("/serviceA/id")).willReturn(aResponse().withBody(jsonIdList).withHeader("Content-Type", "application/json"))); - - stubFor(get(urlEqualTo("/serviceA/1/name")).willReturn(aResponse().withBody(nameList[1]))); - stubFor(get(urlEqualTo("/serviceA/2/name")).willReturn(aResponse().withBody(nameList[2]))); - stubFor(get(urlEqualTo("/serviceA/3/name")).willReturn(aResponse().withBody(nameList[3]))); - stubFor(get(urlEqualTo("/serviceA/4/name")).willReturn(aResponse().withBody(nameList[4]))); - stubFor(get(urlEqualTo("/serviceA/5/name")).willReturn(aResponse().withBody(nameList[5]))); - stubFor(get(urlEqualTo("/serviceA/6/name")).willReturn(aResponse().withBody(nameList[6]))); - - stubFor(get(urlEqualTo("/serviceA/Thor1/hash")).willReturn(aResponse().withBody(hashResultList[0]))); - stubFor(get(urlEqualTo("/serviceA/Hulk2/hash")).willReturn(aResponse().withBody(hashResultList[1]))); - stubFor(get(urlEqualTo("/serviceA/BlackWidow3/hash")).willReturn(aResponse().withBody(hashResultList[2]))); - stubFor(get(urlEqualTo("/serviceA/BlackPanther4/hash")).willReturn(aResponse().withBody(hashResultList[3]))); - stubFor(get(urlEqualTo("/serviceA/TheTick5/hash")).willReturn(aResponse().withBody(hashResultList[4]))); - stubFor(get(urlEqualTo("/serviceA/Hawkeye6/hash")).willReturn(aResponse().withBody(hashResultList[5]))); - - } - - @Test - public void hits() { - - orchestrator.callBackOrchestrate(); - orchestrator.rxOrchestrate(); - orchestrator.observableJavaOrchestrate(); - orchestrator.flowableJavaOrchestrate(); - - assertTrue(orchestrator.failures.isEmpty()); - } - - -} diff --git a/pom.xml b/pom.xml index 4a25459fcb..87278ee3d0 100644 --- a/pom.xml +++ b/pom.xml @@ -188,6 +188,7 @@ spring-integration spring-jenkins-pipeline spring-jersey + jersey-client-rx jmeter spring-jms spring-jooq From fac564c4d5b3727a4da9cc1966cea3c34104debe Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Wed, 15 Aug 2018 23:23:18 +0200 Subject: [PATCH 017/128] added jersey-client-rx to parent POM --- pom.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pom.xml b/pom.xml index db3bef7fda..0bed4ead26 100644 --- a/pom.xml +++ b/pom.xml @@ -576,6 +576,7 @@ spring-security-thymeleaf persistence-modules/java-jdbi jersey + jersey-client-rx java-spi performance-tests twilio @@ -1106,6 +1107,7 @@ spring-security-thymeleaf persistence-modules/java-jdbi jersey + jersey-client-rx java-spi performance-tests twilio From e6abd9d474023f339d02f72f55bb4f536da564aa Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Thu, 16 Aug 2018 08:27:17 +0200 Subject: [PATCH 018/128] added CountDownLatch to all examples --- .../ClientOrchestrationIntegrationTest.java | 88 ++++++++++++------- 1 file changed, 58 insertions(+), 30 deletions(-) diff --git a/jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx/ClientOrchestrationIntegrationTest.java b/jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx/ClientOrchestrationIntegrationTest.java index 10cdab7c7a..88a8d67a7d 100644 --- a/jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx/ClientOrchestrationIntegrationTest.java +++ b/jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx/ClientOrchestrationIntegrationTest.java @@ -81,11 +81,12 @@ public class ClientOrchestrationIntegrationTest { public void callBackOrchestrate() throws InterruptedException { List receivedHashValues = new ArrayList<>(); + final CountDownLatch completionTracker = new CountDownLatch(expectedHashValues.size()); // used to keep track of the progress of the subsequent calls + userIdService.request().accept(MediaType.APPLICATION_JSON).async().get(new InvocationCallback>() { @Override public void completed(List employeeIds) { logger.info("[CallbackExample] id-service result: {}", employeeIds); - CountDownLatch completionTracker = new CountDownLatch(employeeIds.size()); // used to keep track of the progress of the subsequent calls employeeIds.forEach((id) -> { // for each employee ID, get the name nameService.resolveTemplate("userId", id).request().async().get(new InvocationCallback() { @@ -94,17 +95,16 @@ public class ClientOrchestrationIntegrationTest { public void completed(String response) { logger.info("[CallbackExample] name-service result: {}", response); - completionTracker.countDown(); hashService.resolveTemplate("rawValue", response + id).request().async().get(new InvocationCallback() { @Override public void completed(String response) { logger.info("[CallbackExample] hash-service result: {}", response); receivedHashValues.add(response); + completionTracker.countDown(); } @Override public void failed(Throwable throwable) { - completionTracker.countDown(); logger.warn("[CallbackExample] An error has occurred in the hashing request step!", throwable); } }); @@ -112,21 +112,11 @@ public class ClientOrchestrationIntegrationTest { @Override public void failed(Throwable throwable) { - completionTracker.countDown(); logger.warn("[CallbackExample] An error has occurred in the username request step!", throwable); } }); }); - try { - // wait for inner requests to complete in 10 seconds - if (!completionTracker.await(10, TimeUnit.SECONDS)) { - logger.warn("[CallbackExample] Some requests didn't complete within the timeout"); - } - } catch (InterruptedException e) { - logger.error("Interrupted!", e); - } - } @Override @@ -136,7 +126,14 @@ public class ClientOrchestrationIntegrationTest { }); // wait for async calls to complete - Thread.sleep(1000); + try { + // wait for inner requests to complete in 10 seconds + if (!completionTracker.await(10, TimeUnit.SECONDS)) { + logger.warn("[CallbackExample] Some requests didn't complete within the timeout"); + } + } catch (InterruptedException e) { + logger.error("Interrupted!", e); + } assertThat(receivedHashValues).containsAll(expectedHashValues); } @@ -145,6 +142,8 @@ public class ClientOrchestrationIntegrationTest { public void rxOrchestrate() throws InterruptedException { List receivedHashValues = new ArrayList<>(); + final CountDownLatch completionTracker = new CountDownLatch(expectedHashValues.size()); // used to keep track of the progress of the subsequent calls + CompletionStage> userIdStage = userIdService.request().accept(MediaType.APPLICATION_JSON).rx().get(new GenericType>() { }).exceptionally((throwable) -> { logger.warn("[CompletionStageExample] An error has occurred"); @@ -161,8 +160,10 @@ public class ClientOrchestrationIntegrationTest { hashService.resolveTemplate("rawValue", userName + id).request().rx().get(String.class).toCompletableFuture().thenAcceptAsync(hashValue -> { logger.info("[CompletionStageExample] hash-service result: {}", hashValue); receivedHashValues.add(hashValue); + completionTracker.countDown(); }).exceptionally((throwable) -> { logger.warn("[CompletionStageExample] Hash computation failed for {}", id); + completionTracker.countDown(); return null; }); @@ -172,7 +173,14 @@ public class ClientOrchestrationIntegrationTest { }); // wait for async calls to complete - Thread.sleep(1000); + try { + // wait for inner requests to complete in 10 seconds + if (!completionTracker.await(10, TimeUnit.SECONDS)) { + logger.warn("[CallbackExample] Some requests didn't complete within the timeout"); + } + } catch (InterruptedException e) { + logger.error("Interrupted!", e); + } assertThat(receivedHashValues).containsAll(expectedHashValues); } @@ -181,13 +189,15 @@ public class ClientOrchestrationIntegrationTest { public void observableJavaOrchestrate() throws InterruptedException { List receivedHashValues = new ArrayList<>(); + final CountDownLatch completionTracker = new CountDownLatch(expectedHashValues.size()); // used to keep track of the progress of the subsequent calls + Observable> observableUserIdService = userIdService.register(RxObservableInvokerProvider.class).request().accept(MediaType.APPLICATION_JSON).rx(RxObservableInvoker.class).get(new GenericType>() { }).asObservable(); observableUserIdService.subscribe((List employeeIds) -> { logger.info("[ObservableExample] id-service result: {}", employeeIds); Observable.from(employeeIds).subscribe(id -> nameService.register(RxObservableInvokerProvider.class).resolveTemplate("userId", id).request().rx(RxObservableInvoker.class).get(String.class).asObservable() // gotten the name for the given - // userId + // userId .doOnError((throwable) -> { logger.warn("[ObservableExample] An error has occurred in the username request step {}", throwable.getMessage()); }).subscribe(userName -> { @@ -197,14 +207,22 @@ public class ClientOrchestrationIntegrationTest { .doOnError((throwable) -> { logger.warn("[ObservableExample] An error has occurred in the hashing request step {}", throwable.getMessage()); }).subscribe(hashValue -> { - logger.info("[ObservableExample] hash-service result: {}", hashValue); - receivedHashValues.add(hashValue); - }); + logger.info("[ObservableExample] hash-service result: {}", hashValue); + receivedHashValues.add(hashValue); + completionTracker.countDown(); + }); })); }); // wait for async calls to complete - Thread.sleep(1000); + try { + // wait for inner requests to complete in 10 seconds + if (!completionTracker.await(10, TimeUnit.SECONDS)) { + logger.warn("[CallbackExample] Some requests didn't complete within the timeout"); + } + } catch (InterruptedException e) { + logger.error("Interrupted!", e); + } assertThat(receivedHashValues).containsAll(expectedHashValues); } @@ -213,6 +231,8 @@ public class ClientOrchestrationIntegrationTest { public void flowableJavaOrchestrate() throws InterruptedException { List receivedHashValues = new ArrayList<>(); + final CountDownLatch completionTracker = new CountDownLatch(expectedHashValues.size()); // used to keep track of the progress of the subsequent calls + Flowable> userIdFlowable = userIdService.register(RxFlowableInvokerProvider.class).request().rx(RxFlowableInvoker.class).get(new GenericType>() { }); @@ -223,20 +243,28 @@ public class ClientOrchestrationIntegrationTest { .doOnError((throwable) -> { logger.warn("[FlowableExample] An error has occurred in the username request step {}", throwable.getMessage()); }).subscribe(userName -> { - logger.info("[FlowableExample] name-service result: {}", userName); - hashService.register(RxFlowableInvokerProvider.class).resolveTemplate("rawValue", userName + id).request().rx(RxFlowableInvoker.class).get(String.class) // gotten the hash value for userId+username - .doOnError((throwable) -> { - logger.warn(" [FlowableExample] An error has occurred in the hashing request step!", throwable); - }).subscribe(hashValue -> { - logger.info("[FlowableExample] hash-service result: {}", hashValue); - receivedHashValues.add(hashValue); - }); - }); + logger.info("[FlowableExample] name-service result: {}", userName); + hashService.register(RxFlowableInvokerProvider.class).resolveTemplate("rawValue", userName + id).request().rx(RxFlowableInvoker.class).get(String.class) // gotten the hash value for userId+username + .doOnError((throwable) -> { + logger.warn(" [FlowableExample] An error has occurred in the hashing request step!", throwable); + }).subscribe(hashValue -> { + logger.info("[FlowableExample] hash-service result: {}", hashValue); + receivedHashValues.add(hashValue); + completionTracker.countDown(); + }); + }); }); }); // wait for async calls to complete - Thread.sleep(1000); + try { + // wait for inner requests to complete in 10 seconds + if (!completionTracker.await(10, TimeUnit.SECONDS)) { + logger.warn("[CallbackExample] Some requests didn't complete within the timeout"); + } + } catch (InterruptedException e) { + logger.error("Interrupted!", e); + } assertThat(receivedHashValues).containsAll(expectedHashValues); } From 610d0ce869f81391aa3032c66e49203fe8abb1a0 Mon Sep 17 00:00:00 2001 From: DomWos Date: Sat, 18 Aug 2018 20:20:29 +0200 Subject: [PATCH 019/128] BAEL-1994: Moved the code to libraries module --- apache-flink/pom.xml | 37 ------------------- libraries/pom.xml | 18 ++++++++- .../baeldung/flink}/FlinkDataPipeline.java | 0 .../baeldung/flink/connector}/Consumers.java | 0 .../baeldung/flink/connector}/Producers.java | 0 .../com/baeldung/flink}/model/Backup.java | 0 .../baeldung/flink}/model/InputMessage.java | 0 .../flink/operator}/BackupAggregator.java | 0 .../InputMessageTimestampAssigner.java | 0 .../flink/operator}/WordsCapitalizer.java | 0 .../schema/BackupSerializationSchema.java | 0 .../InputMessageDeserializationSchema.java | 0 12 files changed, 17 insertions(+), 38 deletions(-) delete mode 100644 apache-flink/pom.xml rename {apache-flink/src/main/java/com/baeldung => libraries/src/main/java/com/baeldung/flink}/FlinkDataPipeline.java (100%) rename {apache-flink/src/main/java/com/baeldung/flink => libraries/src/main/java/com/baeldung/flink/connector}/Consumers.java (100%) rename {apache-flink/src/main/java/com/baeldung/flink => libraries/src/main/java/com/baeldung/flink/connector}/Producers.java (100%) rename {apache-flink/src/main/java/com/baeldung => libraries/src/main/java/com/baeldung/flink}/model/Backup.java (100%) rename {apache-flink/src/main/java/com/baeldung => libraries/src/main/java/com/baeldung/flink}/model/InputMessage.java (100%) rename {apache-flink/src/main/java/com/baeldung/flink => libraries/src/main/java/com/baeldung/flink/operator}/BackupAggregator.java (100%) rename {apache-flink/src/main/java/com/baeldung/flink => libraries/src/main/java/com/baeldung/flink/operator}/InputMessageTimestampAssigner.java (100%) rename {apache-flink/src/main/java/com/baeldung/flink => libraries/src/main/java/com/baeldung/flink/operator}/WordsCapitalizer.java (100%) rename {apache-flink/src/main/java/com/baeldung => libraries/src/main/java/com/baeldung/flink}/schema/BackupSerializationSchema.java (100%) rename {apache-flink/src/main/java/com/baeldung => libraries/src/main/java/com/baeldung/flink}/schema/InputMessageDeserializationSchema.java (100%) diff --git a/apache-flink/pom.xml b/apache-flink/pom.xml deleted file mode 100644 index c93ea3ef77..0000000000 --- a/apache-flink/pom.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - 4.0.0 - - groupId - apache-flink - 1.0-SNAPSHOT - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - org.apache.flink - flink-core - 1.5.0 - - - org.apache.flink - flink-connector-kafka-0.11_2.11 - 1.5.0 - - - org.apache.flink - flink-streaming-java_2.11 - 1.5.0 - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - 2.9.6 - - - \ No newline at end of file diff --git a/libraries/pom.xml b/libraries/pom.xml index b19a005d94..047b56dd01 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -169,6 +169,17 @@ commons-dbutils ${commons.dbutils.version} + + org.apache.flink + flink-connector-kafka-0.11_2.11 + ${flink.version} + + + org.apache.flink + flink-streaming-java_2.11 + ${flink.version} + + org.apache.flink flink-core @@ -243,6 +254,11 @@ jackson-databind ${jackson.version} + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + ${jackson.version} + org.datanucleus @@ -947,7 +963,7 @@ 4.5.3 2.5 - 1.2.0 + 1.5.0 2.8.5 2.92 1.9.26 diff --git a/apache-flink/src/main/java/com/baeldung/FlinkDataPipeline.java b/libraries/src/main/java/com/baeldung/flink/FlinkDataPipeline.java similarity index 100% rename from apache-flink/src/main/java/com/baeldung/FlinkDataPipeline.java rename to libraries/src/main/java/com/baeldung/flink/FlinkDataPipeline.java diff --git a/apache-flink/src/main/java/com/baeldung/flink/Consumers.java b/libraries/src/main/java/com/baeldung/flink/connector/Consumers.java similarity index 100% rename from apache-flink/src/main/java/com/baeldung/flink/Consumers.java rename to libraries/src/main/java/com/baeldung/flink/connector/Consumers.java diff --git a/apache-flink/src/main/java/com/baeldung/flink/Producers.java b/libraries/src/main/java/com/baeldung/flink/connector/Producers.java similarity index 100% rename from apache-flink/src/main/java/com/baeldung/flink/Producers.java rename to libraries/src/main/java/com/baeldung/flink/connector/Producers.java diff --git a/apache-flink/src/main/java/com/baeldung/model/Backup.java b/libraries/src/main/java/com/baeldung/flink/model/Backup.java similarity index 100% rename from apache-flink/src/main/java/com/baeldung/model/Backup.java rename to libraries/src/main/java/com/baeldung/flink/model/Backup.java diff --git a/apache-flink/src/main/java/com/baeldung/model/InputMessage.java b/libraries/src/main/java/com/baeldung/flink/model/InputMessage.java similarity index 100% rename from apache-flink/src/main/java/com/baeldung/model/InputMessage.java rename to libraries/src/main/java/com/baeldung/flink/model/InputMessage.java diff --git a/apache-flink/src/main/java/com/baeldung/flink/BackupAggregator.java b/libraries/src/main/java/com/baeldung/flink/operator/BackupAggregator.java similarity index 100% rename from apache-flink/src/main/java/com/baeldung/flink/BackupAggregator.java rename to libraries/src/main/java/com/baeldung/flink/operator/BackupAggregator.java diff --git a/apache-flink/src/main/java/com/baeldung/flink/InputMessageTimestampAssigner.java b/libraries/src/main/java/com/baeldung/flink/operator/InputMessageTimestampAssigner.java similarity index 100% rename from apache-flink/src/main/java/com/baeldung/flink/InputMessageTimestampAssigner.java rename to libraries/src/main/java/com/baeldung/flink/operator/InputMessageTimestampAssigner.java diff --git a/apache-flink/src/main/java/com/baeldung/flink/WordsCapitalizer.java b/libraries/src/main/java/com/baeldung/flink/operator/WordsCapitalizer.java similarity index 100% rename from apache-flink/src/main/java/com/baeldung/flink/WordsCapitalizer.java rename to libraries/src/main/java/com/baeldung/flink/operator/WordsCapitalizer.java diff --git a/apache-flink/src/main/java/com/baeldung/schema/BackupSerializationSchema.java b/libraries/src/main/java/com/baeldung/flink/schema/BackupSerializationSchema.java similarity index 100% rename from apache-flink/src/main/java/com/baeldung/schema/BackupSerializationSchema.java rename to libraries/src/main/java/com/baeldung/flink/schema/BackupSerializationSchema.java diff --git a/apache-flink/src/main/java/com/baeldung/schema/InputMessageDeserializationSchema.java b/libraries/src/main/java/com/baeldung/flink/schema/InputMessageDeserializationSchema.java similarity index 100% rename from apache-flink/src/main/java/com/baeldung/schema/InputMessageDeserializationSchema.java rename to libraries/src/main/java/com/baeldung/flink/schema/InputMessageDeserializationSchema.java From 05d7d5413144bae3eb577ac3ecc3dae03fed88db Mon Sep 17 00:00:00 2001 From: Krzysztof Majewski Date: Mon, 20 Aug 2018 21:24:50 +0200 Subject: [PATCH 020/128] BAEL-2056 --- .../hibernate/joincolumn/Address.Java | 19 ++++++++++++++ .../baeldung/hibernate/joincolumn/Email.java | 22 ++++++++++++++++ .../hibernate/joincolumn/Employee.java | 21 ++++++++++++++++ .../baeldung/hibernate/joincolumn/Office.java | 25 +++++++++++++++++++ 4 files changed, 87 insertions(+) create mode 100644 hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Address.Java create mode 100644 hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Email.java create mode 100644 hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Employee.java create mode 100644 hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Office.java diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Address.Java b/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Address.Java new file mode 100644 index 0000000000..c8c0ae6eb8 --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Address.Java @@ -0,0 +1,19 @@ +package com.baeldung.hibernate.joincolumn; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +class Address { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @Column(name = "ZIP") + private String zipCode; + +} \ No newline at end of file diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Email.java b/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Email.java new file mode 100644 index 0000000000..6519c2011f --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Email.java @@ -0,0 +1,22 @@ +package com.baeldung.hibernate.joincolumn; + +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; + +@Entity +class Email { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "employee_id") + private Employee employee; + +} \ No newline at end of file diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Employee.java b/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Employee.java new file mode 100644 index 0000000000..5d63c3be11 --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Employee.java @@ -0,0 +1,21 @@ +package com.baeldung.hibernate.joincolumn; + +import java.util.List; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; + +@Entity +class Employee { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @OneToMany(fetch = FetchType.LAZY, mappedBy = "employee") + private List emails; + +} \ No newline at end of file diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Office.java b/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Office.java new file mode 100644 index 0000000000..5ca62af99c --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Office.java @@ -0,0 +1,25 @@ +package com.baeldung.hibernate.joincolumn; + +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.JoinColumns; +import javax.persistence.ManyToOne; + +@Entity +class Office { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumns({ + @JoinColumn(name="ADDR_ID", referencedColumnName="ID"), + @JoinColumn(name="ADDR_ZIP", referencedColumnName="ZIP") + }) + private Address address; +} \ No newline at end of file From 3d09c6056adc525d9c2146ed02406f099ec43669 Mon Sep 17 00:00:00 2001 From: Krzysztof Majewski Date: Mon, 20 Aug 2018 21:46:55 +0200 Subject: [PATCH 021/128] BAEL-2097 fix --- .../main/java/com/baeldung/hibernate/joincolumn/Address.Java | 2 +- .../src/main/java/com/baeldung/hibernate/joincolumn/Email.java | 2 +- .../main/java/com/baeldung/hibernate/joincolumn/Employee.java | 2 +- .../src/main/java/com/baeldung/hibernate/joincolumn/Office.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Address.Java b/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Address.Java index c8c0ae6eb8..531a5dea9e 100644 --- a/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Address.Java +++ b/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Address.Java @@ -7,7 +7,7 @@ import javax.persistence.GenerationType; import javax.persistence.Id; @Entity -class Address { +public class Address { @Id @GeneratedValue(strategy = GenerationType.AUTO) diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Email.java b/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Email.java index 6519c2011f..0c5c1e9f7e 100644 --- a/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Email.java +++ b/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Email.java @@ -9,7 +9,7 @@ import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; @Entity -class Email { +public class Email { @Id @GeneratedValue(strategy = GenerationType.AUTO) diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Employee.java b/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Employee.java index 5d63c3be11..03becac9f6 100644 --- a/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Employee.java +++ b/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Employee.java @@ -9,7 +9,7 @@ import javax.persistence.Id; import javax.persistence.OneToMany; @Entity -class Employee { +public class Employee { @Id @GeneratedValue(strategy = GenerationType.AUTO) diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Office.java b/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Office.java index 5ca62af99c..1eb79cb3e6 100644 --- a/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Office.java +++ b/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Office.java @@ -10,7 +10,7 @@ import javax.persistence.JoinColumns; import javax.persistence.ManyToOne; @Entity -class Office { +public class Office { @Id @GeneratedValue(strategy = GenerationType.AUTO) From b27d20a46a6b3b8329f89ff4ac8235f1e059dc75 Mon Sep 17 00:00:00 2001 From: Krzysztof Majewski Date: Mon, 20 Aug 2018 21:50:24 +0200 Subject: [PATCH 022/128] Delete Address.Java Remove file with wrong extension --- .../hibernate/joincolumn/Address.Java | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Address.Java diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Address.Java b/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Address.Java deleted file mode 100644 index 531a5dea9e..0000000000 --- a/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Address.Java +++ /dev/null @@ -1,19 +0,0 @@ -package com.baeldung.hibernate.joincolumn; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; - -@Entity -public class Address { - - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private Long id; - - @Column(name = "ZIP") - private String zipCode; - -} \ No newline at end of file From 82ad3bde94635966d804575bc0d984c7f4fd39d1 Mon Sep 17 00:00:00 2001 From: Krzysztof Majewski Date: Mon, 20 Aug 2018 21:51:20 +0200 Subject: [PATCH 023/128] BAEL-2097 add Address entity --- .../hibernate/joincolumn/Address.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Address.java diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Address.java b/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Address.java new file mode 100644 index 0000000000..531a5dea9e --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Address.java @@ -0,0 +1,19 @@ +package com.baeldung.hibernate.joincolumn; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Address { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @Column(name = "ZIP") + private String zipCode; + +} \ No newline at end of file From e9c2ec9637e2528043dd0681bf33f1a9ee772e3e Mon Sep 17 00:00:00 2001 From: kartiksingla Date: Tue, 21 Aug 2018 10:19:42 +0530 Subject: [PATCH 024/128] [BAEL-1302] - Overview and need of DelegatingFilterProxy in spring --- .../java/com/baeldung/Spring5Application.java | 31 +++++++++++++++++ .../baeldung/spring/filter/CustomFilter.java | 34 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 spring-5-mvc/src/main/java/com/baeldung/spring/filter/CustomFilter.java 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 41b5c1eed1..8251467122 100644 --- a/spring-5-mvc/src/main/java/com/baeldung/Spring5Application.java +++ b/spring-5-mvc/src/main/java/com/baeldung/Spring5Application.java @@ -1,7 +1,11 @@ package com.baeldung; +import javax.servlet.Filter; + import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.filter.DelegatingFilterProxy; +import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; @SpringBootApplication public class Spring5Application { @@ -10,4 +14,31 @@ public class Spring5Application { SpringApplication.run(Spring5Application.class, args); } + public static class ApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { + + @Override + protected Class[] getRootConfigClasses() { + return null; + } + + @Override + protected Class[] getServletConfigClasses() { + // TODO Auto-generated method stub + return null; + } + + @Override + protected String[] getServletMappings() { + // TODO Auto-generated method stub + return null; + } + + @Override + protected javax.servlet.Filter[] getServletFilters() { + DelegatingFilterProxy delegateFilterProxy = new DelegatingFilterProxy(); + delegateFilterProxy.setTargetBeanName("loggingFilter"); + return new Filter[] { delegateFilterProxy }; + } + } + } diff --git a/spring-5-mvc/src/main/java/com/baeldung/spring/filter/CustomFilter.java b/spring-5-mvc/src/main/java/com/baeldung/spring/filter/CustomFilter.java new file mode 100644 index 0000000000..94c2bb8250 --- /dev/null +++ b/spring-5-mvc/src/main/java/com/baeldung/spring/filter/CustomFilter.java @@ -0,0 +1,34 @@ +package com.baeldung.spring.filter; + +import java.io.IOException; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Component; + +@Component("loggingFilter") +public class CustomFilter implements Filter { + + @Override + public void init(FilterConfig config) throws ServletException { + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, + FilterChain chain) throws IOException, ServletException { + HttpServletRequest req = (HttpServletRequest) request; + System.out.println("Request Info : " + req); + chain.doFilter(request, response); + } + + @Override + public void destroy() { + // cleanup code, if necessary + } +} From 26721073f9d80d7f6b352e794679d091c526583a Mon Sep 17 00:00:00 2001 From: kartiksingla Date: Tue, 21 Aug 2018 10:21:35 +0530 Subject: [PATCH 025/128] [BAEL-1302] - Overview and need of DelegatingFilterProxy in spring --- spring-5-mvc/src/main/webapp/WEB-INF/web.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/spring-5-mvc/src/main/webapp/WEB-INF/web.xml b/spring-5-mvc/src/main/webapp/WEB-INF/web.xml index bfcf43dad2..43c7143e5b 100644 --- a/spring-5-mvc/src/main/webapp/WEB-INF/web.xml +++ b/spring-5-mvc/src/main/webapp/WEB-INF/web.xml @@ -16,6 +16,14 @@ functional / + + loggingFilter + org.springframework.web.filter.DelegatingFilterProxy + + + loggingFilter + /* + \ No newline at end of file From 878ee1b2d5e62bafeace6f86506a949f818def28 Mon Sep 17 00:00:00 2001 From: kartiksingla Date: Fri, 24 Aug 2018 11:36:57 +0530 Subject: [PATCH 026/128] System.out replaced with Logger statements [BAEL-1302] --- .../main/java/com/baeldung/spring/filter/CustomFilter.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/spring-5-mvc/src/main/java/com/baeldung/spring/filter/CustomFilter.java b/spring-5-mvc/src/main/java/com/baeldung/spring/filter/CustomFilter.java index 94c2bb8250..4aa33cd749 100644 --- a/spring-5-mvc/src/main/java/com/baeldung/spring/filter/CustomFilter.java +++ b/spring-5-mvc/src/main/java/com/baeldung/spring/filter/CustomFilter.java @@ -10,10 +10,14 @@ import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Component("loggingFilter") public class CustomFilter implements Filter { + + private static Logger LOGGER = LoggerFactory.getLogger(CustomFilter.class); @Override public void init(FilterConfig config) throws ServletException { @@ -23,7 +27,7 @@ public class CustomFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; - System.out.println("Request Info : " + req); + LOGGER.info("Request Info : " + req); chain.doFilter(request, response); } From 1921b585a62ad3fcfe989610c64f091161cd4ef3 Mon Sep 17 00:00:00 2001 From: DomWos Date: Fri, 24 Aug 2018 11:14:40 +0200 Subject: [PATCH 027/128] BAEL-1994: Updates and small changes --- libraries/pom.xml | 2 +- .../com/baeldung/flink/FlinkDataPipeline.java | 17 +-- .../baeldung/flink/connector/Consumers.java | 6 +- .../baeldung/flink/connector/Producers.java | 8 +- .../java/com/baeldung/flink/model/Backup.java | 6 +- .../baeldung/flink/model/InputMessage.java | 30 ++++- .../flink/operator/BackupAggregator.java | 6 +- .../InputMessageTimestampAssigner.java | 4 +- .../flink/operator/WordsCapitalizer.java | 2 +- .../schema/BackupSerializationSchema.java | 4 +- .../InputMessageDeserializationSchema.java | 4 +- .../flink/BackupCreatorIntegrationTest.java | 103 ++++++++++++++++++ .../flink/WordCapitalizerIntegrationTest.java | 34 ++++++ 13 files changed, 198 insertions(+), 28 deletions(-) create mode 100644 libraries/src/test/java/com/baeldung/flink/BackupCreatorIntegrationTest.java create mode 100644 libraries/src/test/java/com/baeldung/flink/WordCapitalizerIntegrationTest.java diff --git a/libraries/pom.xml b/libraries/pom.xml index 047b56dd01..d129844543 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -204,7 +204,7 @@ org.apache.flink - flink-test-utils_2.10 + flink-test-utils_2.11 ${flink.version} test diff --git a/libraries/src/main/java/com/baeldung/flink/FlinkDataPipeline.java b/libraries/src/main/java/com/baeldung/flink/FlinkDataPipeline.java index d4e4cec60b..423637bf53 100644 --- a/libraries/src/main/java/com/baeldung/flink/FlinkDataPipeline.java +++ b/libraries/src/main/java/com/baeldung/flink/FlinkDataPipeline.java @@ -1,10 +1,11 @@ -package com.baeldung; +package com.baeldung.flink; -import com.baeldung.flink.BackupAggregator; -import com.baeldung.flink.InputMessageTimestampAssigner; -import com.baeldung.flink.WordsCapitalizer; -import com.baeldung.model.Backup; -import com.baeldung.model.InputMessage; + +import com.baeldung.flink.model.Backup; +import com.baeldung.flink.model.InputMessage; +import com.baeldung.flink.operator.BackupAggregator; +import com.baeldung.flink.operator.InputMessageTimestampAssigner; +import com.baeldung.flink.operator.WordsCapitalizer; import org.apache.flink.streaming.api.TimeCharacteristic; import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; @@ -12,8 +13,8 @@ import org.apache.flink.streaming.api.windowing.time.Time; import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer011; import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer011; -import static com.baeldung.flink.Consumers.*; -import static com.baeldung.flink.Producers.*; +import static com.baeldung.flink.connector.Consumers.*; +import static com.baeldung.flink.connector.Producers.*; public class FlinkDataPipeline { diff --git a/libraries/src/main/java/com/baeldung/flink/connector/Consumers.java b/libraries/src/main/java/com/baeldung/flink/connector/Consumers.java index e9aa78b677..514085f9c4 100644 --- a/libraries/src/main/java/com/baeldung/flink/connector/Consumers.java +++ b/libraries/src/main/java/com/baeldung/flink/connector/Consumers.java @@ -1,7 +1,7 @@ -package com.baeldung.flink; +package com.baeldung.flink.connector; -import com.baeldung.schema.InputMessageDeserializationSchema; -import com.baeldung.model.InputMessage; +import com.baeldung.flink.model.InputMessage; +import com.baeldung.flink.schema.InputMessageDeserializationSchema; import org.apache.flink.api.common.serialization.SimpleStringSchema; import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer011; diff --git a/libraries/src/main/java/com/baeldung/flink/connector/Producers.java b/libraries/src/main/java/com/baeldung/flink/connector/Producers.java index 094b6ff211..8e6f3f8f37 100644 --- a/libraries/src/main/java/com/baeldung/flink/connector/Producers.java +++ b/libraries/src/main/java/com/baeldung/flink/connector/Producers.java @@ -1,7 +1,7 @@ -package com.baeldung.flink; +package com.baeldung.flink.connector; -import com.baeldung.schema.BackupSerializationSchema; -import com.baeldung.model.Backup; +import com.baeldung.flink.model.Backup; +import com.baeldung.flink.schema.BackupSerializationSchema; import org.apache.flink.api.common.serialization.SimpleStringSchema; import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer011; @@ -12,6 +12,6 @@ public class Producers { } public static FlinkKafkaProducer011 createBackupProducer(String topic, String kafkaAddress) { - return new FlinkKafkaProducer011<>(kafkaAddress, topic, new BackupSerializationSchema()); + return new FlinkKafkaProducer011(kafkaAddress, topic, new BackupSerializationSchema()); } } diff --git a/libraries/src/main/java/com/baeldung/flink/model/Backup.java b/libraries/src/main/java/com/baeldung/flink/model/Backup.java index 3a57d65d78..268ceec7f3 100644 --- a/libraries/src/main/java/com/baeldung/flink/model/Backup.java +++ b/libraries/src/main/java/com/baeldung/flink/model/Backup.java @@ -1,4 +1,4 @@ -package com.baeldung.model; +package com.baeldung.flink.model; import com.fasterxml.jackson.annotation.JsonProperty; @@ -20,4 +20,8 @@ public class Backup { this.backupTimestamp = backupTimestamp; this.uuid = UUID.randomUUID(); } + + public List getInputMessages() { + return inputMessages; + } } diff --git a/libraries/src/main/java/com/baeldung/flink/model/InputMessage.java b/libraries/src/main/java/com/baeldung/flink/model/InputMessage.java index 57a85de81a..183fa69c11 100644 --- a/libraries/src/main/java/com/baeldung/flink/model/InputMessage.java +++ b/libraries/src/main/java/com/baeldung/flink/model/InputMessage.java @@ -1,6 +1,8 @@ -package com.baeldung.model; +package com.baeldung.flink.model; import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.google.common.base.Objects; + import java.time.LocalDateTime; @JsonSerialize @@ -10,6 +12,9 @@ public class InputMessage { LocalDateTime sentAt; String message; + public InputMessage() { + } + public String getSender() { return sender; } @@ -41,4 +46,27 @@ public class InputMessage { public void setMessage(String message) { this.message = message; } + + public InputMessage(String sender, String recipient, LocalDateTime sentAt, String message) { + this.sender = sender; + this.recipient = recipient; + this.sentAt = sentAt; + this.message = message; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + InputMessage message1 = (InputMessage) o; + return Objects.equal(sender, message1.sender) && + Objects.equal(recipient, message1.recipient) && + Objects.equal(sentAt, message1.sentAt) && + Objects.equal(message, message1.message); + } + + @Override + public int hashCode() { + return Objects.hashCode(sender, recipient, sentAt, message); + } } diff --git a/libraries/src/main/java/com/baeldung/flink/operator/BackupAggregator.java b/libraries/src/main/java/com/baeldung/flink/operator/BackupAggregator.java index 2bfbb1e270..c39b8413d1 100644 --- a/libraries/src/main/java/com/baeldung/flink/operator/BackupAggregator.java +++ b/libraries/src/main/java/com/baeldung/flink/operator/BackupAggregator.java @@ -1,7 +1,7 @@ -package com.baeldung.flink; +package com.baeldung.flink.operator; -import com.baeldung.model.Backup; -import com.baeldung.model.InputMessage; +import com.baeldung.flink.model.Backup; +import com.baeldung.flink.model.InputMessage; import org.apache.flink.api.common.functions.AggregateFunction; import java.time.LocalDateTime; diff --git a/libraries/src/main/java/com/baeldung/flink/operator/InputMessageTimestampAssigner.java b/libraries/src/main/java/com/baeldung/flink/operator/InputMessageTimestampAssigner.java index 5d58cb36cc..05828d9588 100644 --- a/libraries/src/main/java/com/baeldung/flink/operator/InputMessageTimestampAssigner.java +++ b/libraries/src/main/java/com/baeldung/flink/operator/InputMessageTimestampAssigner.java @@ -1,6 +1,6 @@ -package com.baeldung.flink; +package com.baeldung.flink.operator; -import com.baeldung.model.InputMessage; +import com.baeldung.flink.model.InputMessage; import org.apache.flink.streaming.api.functions.AssignerWithPunctuatedWatermarks; import org.apache.flink.streaming.api.watermark.Watermark; diff --git a/libraries/src/main/java/com/baeldung/flink/operator/WordsCapitalizer.java b/libraries/src/main/java/com/baeldung/flink/operator/WordsCapitalizer.java index 49fffc292e..f9103d225c 100644 --- a/libraries/src/main/java/com/baeldung/flink/operator/WordsCapitalizer.java +++ b/libraries/src/main/java/com/baeldung/flink/operator/WordsCapitalizer.java @@ -1,4 +1,4 @@ -package com.baeldung.flink; +package com.baeldung.flink.operator; import org.apache.flink.api.common.functions.MapFunction; diff --git a/libraries/src/main/java/com/baeldung/flink/schema/BackupSerializationSchema.java b/libraries/src/main/java/com/baeldung/flink/schema/BackupSerializationSchema.java index fa525a5ee8..4db9556d8d 100644 --- a/libraries/src/main/java/com/baeldung/flink/schema/BackupSerializationSchema.java +++ b/libraries/src/main/java/com/baeldung/flink/schema/BackupSerializationSchema.java @@ -1,6 +1,6 @@ -package com.baeldung.schema; +package com.baeldung.flink.schema; -import com.baeldung.model.Backup; +import com.baeldung.flink.model.Backup; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.apache.flink.api.common.serialization.SerializationSchema; diff --git a/libraries/src/main/java/com/baeldung/flink/schema/InputMessageDeserializationSchema.java b/libraries/src/main/java/com/baeldung/flink/schema/InputMessageDeserializationSchema.java index 99b6baa6f4..3c81b67ec1 100644 --- a/libraries/src/main/java/com/baeldung/flink/schema/InputMessageDeserializationSchema.java +++ b/libraries/src/main/java/com/baeldung/flink/schema/InputMessageDeserializationSchema.java @@ -1,6 +1,6 @@ -package com.baeldung.schema; +package com.baeldung.flink.schema; -import com.baeldung.model.InputMessage; +import com.baeldung.flink.model.InputMessage; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.apache.flink.api.common.serialization.DeserializationSchema; diff --git a/libraries/src/test/java/com/baeldung/flink/BackupCreatorIntegrationTest.java b/libraries/src/test/java/com/baeldung/flink/BackupCreatorIntegrationTest.java new file mode 100644 index 0000000000..ab7d119c16 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/flink/BackupCreatorIntegrationTest.java @@ -0,0 +1,103 @@ +package com.baeldung.flink; + +import com.baeldung.flink.model.Backup; +import com.baeldung.flink.model.InputMessage; +import com.baeldung.flink.operator.BackupAggregator; +import com.baeldung.flink.operator.InputMessageTimestampAssigner; +import com.baeldung.flink.schema.BackupSerializationSchema; +import com.baeldung.flink.schema.InputMessageDeserializationSchema; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.apache.commons.collections.ListUtils; +import org.apache.flink.api.common.serialization.DeserializationSchema; +import org.apache.flink.api.common.serialization.SerializationSchema; +import org.apache.flink.streaming.api.TimeCharacteristic; +import org.apache.flink.streaming.api.datastream.DataStreamSource; +import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; +import org.apache.flink.streaming.api.functions.sink.SinkFunction; +import org.apache.flink.streaming.api.windowing.time.Time; +import org.awaitility.Awaitility; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.junit.Assert.assertEquals; + +public class BackupCreatorIntegrationTest { + public static ObjectMapper mapper; + + @Before + public void setup() { + mapper = new ObjectMapper().registerModule(new JavaTimeModule()); + } + + @Test + public void givenProperJson_whenDeserializeIsInvoked_thenProperObjectIsReturned() throws IOException { + InputMessage message = new InputMessage("Me", "User", LocalDateTime.now(), "Test Message"); + byte[] messageSerialized = mapper.writeValueAsBytes(message); + DeserializationSchema deserializationSchema = new InputMessageDeserializationSchema(); + InputMessage messageDeserialized = deserializationSchema.deserialize(messageSerialized); + + assertEquals(message, messageDeserialized); + } + + @Test + public void givenMultipleInputMessagesFromDifferentDays_whenBackupCreatorIsUser_thenMessagesAreGroupedProperly() throws Exception { + LocalDateTime currentTime = LocalDateTime.now(); + InputMessage message = new InputMessage("Me", "User", currentTime, "First TestMessage"); + InputMessage secondMessage = new InputMessage("Me", "User", currentTime.plusHours(1), "First TestMessage"); + InputMessage thirdMessage = new InputMessage("Me", "User", currentTime.plusHours(2), "First TestMessage"); + InputMessage fourthMessage = new InputMessage("Me", "User", currentTime.plusHours(3), "First TestMessage"); + InputMessage fifthMessage = new InputMessage("Me", "User", currentTime.plusHours(25), "First TestMessage"); + InputMessage sixthMessage = new InputMessage("Me", "User", currentTime.plusHours(26), "First TestMessage"); + + List firstBackupMessages = Arrays.asList(message, secondMessage, thirdMessage, fourthMessage); + List secondBackupMessages = Arrays.asList(fifthMessage, sixthMessage); + List inputMessages = ListUtils.union(firstBackupMessages, secondBackupMessages); + + StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); + env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime); + env.setParallelism(1); + DataStreamSource testDataSet = env.fromCollection(inputMessages); + CollectingSink sink = new CollectingSink(); + testDataSet.assignTimestampsAndWatermarks(new InputMessageTimestampAssigner()) + .timeWindowAll(Time.hours(24)) + .aggregate(new BackupAggregator()) + .addSink(sink); + + env.execute(); + + Awaitility.await().until(() -> sink.backups.size() == 2); + assertEquals(2, sink.backups.size()); + assertEquals(firstBackupMessages, sink.backups.get(0).getInputMessages()); + assertEquals(secondBackupMessages, sink.backups.get(1).getInputMessages()); + + } + + @Test + public void givenProperBackupObject_whenSerializeIsInvoked_thenObjectIsProperlySerialized() throws IOException { + InputMessage message = new InputMessage("Me", "User", LocalDateTime.now(), "Test Message"); + List messages = Arrays.asList(message); + Backup backup = new Backup(messages, LocalDateTime.now()); + byte[] backupSerialized = mapper.writeValueAsBytes(backup); + SerializationSchema serializationSchema = new BackupSerializationSchema(); + byte[] backupProcessed = serializationSchema.serialize(backup); + + assertEquals(backupSerialized, backupProcessed); + } + + private static class CollectingSink implements SinkFunction { + + public static List backups = new ArrayList<>(); + + @Override + public synchronized void invoke(Backup value, Context context) throws Exception { + backups.add(value); + } + } +} diff --git a/libraries/src/test/java/com/baeldung/flink/WordCapitalizerIntegrationTest.java b/libraries/src/test/java/com/baeldung/flink/WordCapitalizerIntegrationTest.java new file mode 100644 index 0000000000..8a98dae4b5 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/flink/WordCapitalizerIntegrationTest.java @@ -0,0 +1,34 @@ +package com.baeldung.flink; + +import com.baeldung.flink.operator.WordsCapitalizer; +import org.apache.flink.api.java.DataSet; +import org.apache.flink.api.java.ExecutionEnvironment; +import org.junit.Assert; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class WordCapitalizerIntegrationTest { + + @Test + public void givenDataSet_whenExecuteWordCapitalizer_thenReturnCapitalizedWords() throws Exception { + ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); + List data = Arrays.asList("dog", "cat", "wolf", "pig"); + + DataSet testDataSet = env.fromCollection(data); + + + List dataProcessed = testDataSet + .map(new WordsCapitalizer()) + .collect(); + + List testDataCapitalized = data.stream() + .map(String::toUpperCase) + .collect(Collectors.toList()); + + Assert.assertEquals(testDataCapitalized, dataProcessed); + } + +} From cc4b50a0d8aa37b74ada0a7dfdc03d00dc36a1f3 Mon Sep 17 00:00:00 2001 From: Krzysztof Majewski Date: Sat, 25 Aug 2018 14:26:23 +0200 Subject: [PATCH 028/128] BAEL-2097 add integration test --- .../hibernate/joincolumn/Address.java | 15 +++++ .../baeldung/hibernate/joincolumn/Email.java | 25 ++++++++ .../hibernate/joincolumn/Employee.java | 15 +++++ .../baeldung/hibernate/joincolumn/Office.java | 16 ++++++ .../joincolumn/JoinColumnIntegrationTest | 57 +++++++++++++++++++ 5 files changed, 128 insertions(+) create mode 100644 hibernate5/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Address.java b/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Address.java index 531a5dea9e..8b0a51858d 100644 --- a/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Address.java +++ b/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Address.java @@ -16,4 +16,19 @@ public class Address { @Column(name = "ZIP") private String zipCode; + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getZipCode() { + return zipCode; + } + + public void setZipCode(String zipCode) { + this.zipCode = zipCode; + } } \ No newline at end of file diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Email.java b/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Email.java index 0c5c1e9f7e..a91fb3b4c9 100644 --- a/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Email.java +++ b/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Email.java @@ -15,8 +15,33 @@ public class Email { @GeneratedValue(strategy = GenerationType.AUTO) private Long id; + private String address; + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "employee_id") private Employee employee; + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public Employee getEmployee() { + return employee; + } + + public void setEmployee(Employee employee) { + this.employee = employee; + } } \ No newline at end of file diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Employee.java b/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Employee.java index 03becac9f6..3fbdb3820e 100644 --- a/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Employee.java +++ b/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Employee.java @@ -18,4 +18,19 @@ public class Employee { @OneToMany(fetch = FetchType.LAZY, mappedBy = "employee") private List emails; + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public List getEmails() { + return emails; + } + + public void setEmails(List emails) { + this.emails = emails; + } } \ No newline at end of file diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Office.java b/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Office.java index 1eb79cb3e6..e5b9dc06bc 100644 --- a/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Office.java +++ b/hibernate5/src/main/java/com/baeldung/hibernate/joincolumn/Office.java @@ -22,4 +22,20 @@ public class Office { @JoinColumn(name="ADDR_ZIP", referencedColumnName="ZIP") }) private Address address; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Address getAddress() { + return address; + } + + public void setAddress(Address address) { + this.address = address; + } } \ No newline at end of file diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest b/hibernate5/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest new file mode 100644 index 0000000000..8246a2b01e --- /dev/null +++ b/hibernate5/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest @@ -0,0 +1,57 @@ +package com.baeldung.hibernate.joincolumn; + +import com.baeldung.hibernate.HibernateUtil; +import java.io.IOException; +import org.hibernate.Session; +import org.hibernate.Transaction; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + + +public class JoinColumnIntegrationTest { + + private Session session; + private Transaction transaction; + + @Before + public void setUp() throws IOException { + session = HibernateUtil.getSessionFactory("hibernate-spatial.properties") + .openSession(); + transaction = session.beginTransaction(); + } + + @After + public void tearDown() { + transaction.rollback(); + session.close(); + } + + @Test + public void givenOfficeEntity_setAddress_shouldPersist() { + Office office = new Office(); + + Address address = new Address(); + address.setZipCode("11-111"); + office.setAddress(address); + + session.save(office); + session.flush(); + session.clear(); + } + + @Test + public void givenEmployeeEntity_setEmails_shouldPersist() { + Employee employee = new Employee(); + + Email email = new Email(); + email.setAddress("example@email.com"); + email.setEmployee(employee); + + session.save(employee); + session.flush(); + session.clear(); + } + +} \ No newline at end of file From 813bc3249fd4013756d7c7b10af3cc88707fb8dd Mon Sep 17 00:00:00 2001 From: chandra Date: Sun, 26 Aug 2018 22:07:55 -0400 Subject: [PATCH 029/128] BAEL-1829 - Overview of Apache Crunch --- libraries-data/README.md | 1 + libraries-data/pom.xml | 67 +++++++++++++- .../src/main/assembly/hadoop-job.xml | 28 ++++++ .../com/baeldung/crunch/StopWordFilter.java | 25 ++++++ .../com/baeldung/crunch/ToUpperCaseFn.java | 11 +++ .../crunch/ToUpperCaseWithCounterFn.java | 20 +++++ .../java/com/baeldung/crunch/Tokenizer.java | 23 +++++ .../java/com/baeldung/crunch/WordCount.java | 62 +++++++++++++ .../baeldung/crunch/MemPipelineUnitTest.java | 89 +++++++++++++++++++ .../crunch/StopWordFilterUnitTest.java | 41 +++++++++ .../crunch/ToUpperCaseFnUnitTest.java | 21 +++++ .../ToUpperCaseWithCounterFnUnitTest.java | 31 +++++++ .../baeldung/crunch/TokenizerUnitTest.java | 27 ++++++ .../src/test/resources/crunch/input.txt | 21 +++++ 14 files changed, 466 insertions(+), 1 deletion(-) create mode 100644 libraries-data/src/main/assembly/hadoop-job.xml create mode 100644 libraries-data/src/main/java/com/baeldung/crunch/StopWordFilter.java create mode 100644 libraries-data/src/main/java/com/baeldung/crunch/ToUpperCaseFn.java create mode 100644 libraries-data/src/main/java/com/baeldung/crunch/ToUpperCaseWithCounterFn.java create mode 100644 libraries-data/src/main/java/com/baeldung/crunch/Tokenizer.java create mode 100644 libraries-data/src/main/java/com/baeldung/crunch/WordCount.java create mode 100644 libraries-data/src/test/java/com/baeldung/crunch/MemPipelineUnitTest.java create mode 100644 libraries-data/src/test/java/com/baeldung/crunch/StopWordFilterUnitTest.java create mode 100644 libraries-data/src/test/java/com/baeldung/crunch/ToUpperCaseFnUnitTest.java create mode 100644 libraries-data/src/test/java/com/baeldung/crunch/ToUpperCaseWithCounterFnUnitTest.java create mode 100644 libraries-data/src/test/java/com/baeldung/crunch/TokenizerUnitTest.java create mode 100644 libraries-data/src/test/resources/crunch/input.txt diff --git a/libraries-data/README.md b/libraries-data/README.md index fbe49e9f74..15dacdfed8 100644 --- a/libraries-data/README.md +++ b/libraries-data/README.md @@ -10,3 +10,4 @@ - [A Guide to Apache Ignite](http://www.baeldung.com/apache-ignite) - [Apache Ignite with Spring Data](http://www.baeldung.com/apache-ignite-spring-data) - [Guide to JMapper](https://github.com/eugenp/tutorials/tree/master/libraries-data) +- [A Guide to Apache Crunch](https://github.com/eugenp/tutorials/tree/master/libraries-data) diff --git a/libraries-data/pom.xml b/libraries-data/pom.xml index e5e8fd5551..707b646874 100644 --- a/libraries-data/pom.xml +++ b/libraries-data/pom.xml @@ -147,6 +147,44 @@ jmapper-core ${jmapper.version} + + + + org.apache.crunch + crunch-core + ${org.apache.crunch.crunch-core.version} + + + org.apache.hadoop + hadoop-client + ${org.apache.hadoop.hadoop-client} + provided + + + + commons-cli + commons-cli + 1.2 + provided + + + commons-io + commons-io + 2.1 + provided + + + commons-httpclient + commons-httpclient + 3.0.1 + provided + + + commons-codec + commons-codec + + + @@ -252,6 +290,31 @@ + + org.apache.maven.plugins + maven-assembly-plugin + 2.3 + + + src/main/assembly/hadoop-job.xml + + + + com.baeldung.crunch.WordCount + + + + + + make-assembly + package + + single + + + + + @@ -282,7 +345,9 @@ 5.0.2 5.0.0-release 5.0.4 - 1.6.0.1 + 1.6.0.1 + 0.15.0 + 2.2.0 diff --git a/libraries-data/src/main/assembly/hadoop-job.xml b/libraries-data/src/main/assembly/hadoop-job.xml new file mode 100644 index 0000000000..1917e1e5a3 --- /dev/null +++ b/libraries-data/src/main/assembly/hadoop-job.xml @@ -0,0 +1,28 @@ + + + + + job + + jar + + false + + + false + runtime + lib + + ${groupId}:${artifactId} + + + + true + + ${groupId}:${artifactId} + + + + diff --git a/libraries-data/src/main/java/com/baeldung/crunch/StopWordFilter.java b/libraries-data/src/main/java/com/baeldung/crunch/StopWordFilter.java new file mode 100644 index 0000000000..bdd606e179 --- /dev/null +++ b/libraries-data/src/main/java/com/baeldung/crunch/StopWordFilter.java @@ -0,0 +1,25 @@ +package com.baeldung.crunch; + +import java.util.Set; + +import org.apache.crunch.FilterFn; + +import com.google.common.collect.ImmutableSet; + +/** + * A filter that removes known stop words. + */ +public class StopWordFilter extends FilterFn { + + // English stop words, borrowed from Lucene. + private static final Set STOP_WORDS = ImmutableSet + .copyOf(new String[] { "a", "and", "are", "as", "at", "be", "but", "by", + "for", "if", "in", "into", "is", "it", "no", "not", "of", "on", + "or", "s", "such", "t", "that", "the", "their", "then", "there", + "these", "they", "this", "to", "was", "will", "with" }); + + @Override + public boolean accept(String word) { + return !STOP_WORDS.contains(word); + } +} diff --git a/libraries-data/src/main/java/com/baeldung/crunch/ToUpperCaseFn.java b/libraries-data/src/main/java/com/baeldung/crunch/ToUpperCaseFn.java new file mode 100644 index 0000000000..a277883ad3 --- /dev/null +++ b/libraries-data/src/main/java/com/baeldung/crunch/ToUpperCaseFn.java @@ -0,0 +1,11 @@ +package com.baeldung.crunch; + +import org.apache.crunch.MapFn; + +public class ToUpperCaseFn extends MapFn { + + @Override + public String map(String input) { + return input != null ? input.toUpperCase() : input; + } +} diff --git a/libraries-data/src/main/java/com/baeldung/crunch/ToUpperCaseWithCounterFn.java b/libraries-data/src/main/java/com/baeldung/crunch/ToUpperCaseWithCounterFn.java new file mode 100644 index 0000000000..f753f98866 --- /dev/null +++ b/libraries-data/src/main/java/com/baeldung/crunch/ToUpperCaseWithCounterFn.java @@ -0,0 +1,20 @@ +package com.baeldung.crunch; + +import org.apache.crunch.MapFn; + +@SuppressWarnings("serial") +public class ToUpperCaseWithCounterFn extends MapFn { + + @Override + public String map(String input) { + if (input == null) { + return input; + } else { + String output = input.toUpperCase(); + if (!input.equals(output)) { + increment("UpperCase", "modified"); + } + return output; + } + } +} diff --git a/libraries-data/src/main/java/com/baeldung/crunch/Tokenizer.java b/libraries-data/src/main/java/com/baeldung/crunch/Tokenizer.java new file mode 100644 index 0000000000..9523634be1 --- /dev/null +++ b/libraries-data/src/main/java/com/baeldung/crunch/Tokenizer.java @@ -0,0 +1,23 @@ +package com.baeldung.crunch; + +import org.apache.crunch.DoFn; +import org.apache.crunch.Emitter; + +import com.google.common.base.Splitter; + +/** + * Splits a line of text, filtering known stop words. + */ +public class Tokenizer extends DoFn { + private static final Splitter SPLITTER = Splitter + .onPattern("\\s+") + .omitEmptyStrings(); + + @Override + public void process(String line, + Emitter emitter) { + for (String word : SPLITTER.split(line)) { + emitter.emit(word); + } + } +} diff --git a/libraries-data/src/main/java/com/baeldung/crunch/WordCount.java b/libraries-data/src/main/java/com/baeldung/crunch/WordCount.java new file mode 100644 index 0000000000..c49abec68a --- /dev/null +++ b/libraries-data/src/main/java/com/baeldung/crunch/WordCount.java @@ -0,0 +1,62 @@ +package com.baeldung.crunch; + +import org.apache.crunch.PCollection; +import org.apache.crunch.PTable; +import org.apache.crunch.Pipeline; +import org.apache.crunch.PipelineResult; +import org.apache.crunch.impl.mr.MRPipeline; +import org.apache.crunch.types.writable.Writables; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.conf.Configured; +import org.apache.hadoop.util.GenericOptionsParser; +import org.apache.hadoop.util.Tool; +import org.apache.hadoop.util.ToolRunner; + +/** + * A word count example for Apache Crunch, based on Crunch's example projects. + */ +public class WordCount extends Configured implements Tool { + + public static void main(String[] args) throws Exception { + ToolRunner.run(new Configuration(), new WordCount(), args); + } + + public int run(String[] args) throws Exception { + + if (args.length != 2) { + System.err.println("Usage: hadoop jar crunch-1.0.0-SNAPSHOT-job.jar" + " [generic options] input output"); + System.err.println(); + GenericOptionsParser.printGenericCommandUsage(System.err); + return 1; + } + + String inputPath = args[0]; + String outputPath = args[1]; + + // Create an object to coordinate pipeline creation and execution. + Pipeline pipeline = new MRPipeline(WordCount.class, getConf()); + + // Reference a given text file as a collection of Strings. + PCollection lines = pipeline.readTextFile(inputPath); + + // Define a function that splits each line in a PCollection of Strings into + // a PCollection made up of the individual words in the file. + // The second argument sets the serialization format. + PCollection words = lines.parallelDo(new Tokenizer(), Writables.strings()); + + // Take the collection of words and remove known stop words. + PCollection noStopWords = words.filter(new StopWordFilter()); + + // The count method applies a series of Crunch primitives and returns + // a map of the unique words in the input PCollection to their counts. + PTable counts = noStopWords.count(); + + // Instruct the pipeline to write the resulting counts to a text file. + pipeline.writeTextFile(counts, outputPath); + + // Execute the pipeline as a MapReduce. + PipelineResult result = pipeline.done(); + + return result.succeeded() ? 0 : 1; + } +} diff --git a/libraries-data/src/test/java/com/baeldung/crunch/MemPipelineUnitTest.java b/libraries-data/src/test/java/com/baeldung/crunch/MemPipelineUnitTest.java new file mode 100644 index 0000000000..3ee2bb6836 --- /dev/null +++ b/libraries-data/src/test/java/com/baeldung/crunch/MemPipelineUnitTest.java @@ -0,0 +1,89 @@ +package com.baeldung.crunch; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertIterableEquals; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Calendar; + +import org.apache.crunch.PCollection; +import org.apache.crunch.Pipeline; +import org.apache.crunch.Source; +import org.apache.crunch.Target; +import org.apache.crunch.impl.mem.MemPipeline; +import org.apache.crunch.io.From; +import org.apache.crunch.io.To; +import org.junit.Ignore; +import org.junit.Test; + +public class MemPipelineUnitTest { + + private static final String INPUT_FILE_PATH = "src/test/resources/crunch/input.txt"; + + @Test + public void givenPipeLineAndSource_whenSourceRead_thenExpectedNumberOfRecordsRead() { + Pipeline pipeline = MemPipeline.getInstance(); + Source source = From.textFile(INPUT_FILE_PATH); + + PCollection lines = pipeline.read(source); + + assertEquals(21, lines.asCollection() + .getValue() + .size()); + } + + @Test + public void givenPipeLine_whenTextFileRead_thenExpectedNumberOfRecordsRead() { + Pipeline pipeline = MemPipeline.getInstance(); + + PCollection lines = pipeline.readTextFile(INPUT_FILE_PATH); + + assertEquals(21, lines.asCollection() + .getValue() + .size()); + } + + private String createOutputPath() throws IOException { + Path path = Files.createTempDirectory("test"); + final String outputFilePath = path.toString() + File.separatorChar + + "output.text"; + return outputFilePath; + } + + @Test + @Ignore("Requires Hadoop binaries") + public void givenCollection_whenWriteCalled_fileWrittenSuccessfully() + throws IOException { + PCollection inputStrings = MemPipeline.collectionOf("Hello", + "Apache", "Crunch", Calendar.getInstance() + .toString()); + final String outputFilePath = createOutputPath(); + Target target = To.textFile(outputFilePath); + + inputStrings.write(target); + + Pipeline pipeline = MemPipeline.getInstance(); + PCollection lines = pipeline.readTextFile(outputFilePath); + assertIterableEquals(inputStrings.materialize(), lines.materialize()); + } + + @Test + @Ignore("Requires Hadoop binaries") + public void givenPipeLine_whenWriteTextFileCalled_fileWrittenSuccessfully() + throws IOException { + Pipeline pipeline = MemPipeline.getInstance(); + PCollection inputStrings = MemPipeline.collectionOf("Hello", + "Apache", "Crunch", Calendar.getInstance() + .toString()); + final String outputFilePath = createOutputPath(); + + pipeline.writeTextFile(inputStrings, outputFilePath); + + PCollection lines = pipeline.readTextFile(outputFilePath); + assertIterableEquals(inputStrings.materialize(), lines.materialize()); + } + +} diff --git a/libraries-data/src/test/java/com/baeldung/crunch/StopWordFilterUnitTest.java b/libraries-data/src/test/java/com/baeldung/crunch/StopWordFilterUnitTest.java new file mode 100644 index 0000000000..fffefc2bfb --- /dev/null +++ b/libraries-data/src/test/java/com/baeldung/crunch/StopWordFilterUnitTest.java @@ -0,0 +1,41 @@ +package com.baeldung.crunch; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.apache.crunch.FilterFn; +import org.apache.crunch.PCollection; +import org.apache.crunch.impl.mem.MemPipeline; +import org.junit.Test; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; + +public class StopWordFilterUnitTest { + + @Test + public void givenFilter_whenStopWordPassed_thenFalseReturned() { + FilterFn filter = new StopWordFilter(); + + assertFalse(filter.accept("the")); + } + + @Test + public void givenFilter_whenNonStopWordPassed_thenTrueReturned() { + FilterFn filter = new StopWordFilter(); + + assertTrue(filter.accept("Hello")); + } + + @Test + public void givenWordCollection_whenFiltered_thenStopWordsRemoved() { + PCollection words = MemPipeline.collectionOf("This", "is", "a", + "test", "sentence"); + + PCollection noStopWords = words.filter(new StopWordFilter()); + + assertEquals(ImmutableList.of("This", "test", "sentence"), + Lists.newArrayList(noStopWords.materialize())); + } +} diff --git a/libraries-data/src/test/java/com/baeldung/crunch/ToUpperCaseFnUnitTest.java b/libraries-data/src/test/java/com/baeldung/crunch/ToUpperCaseFnUnitTest.java new file mode 100644 index 0000000000..09fb9fba85 --- /dev/null +++ b/libraries-data/src/test/java/com/baeldung/crunch/ToUpperCaseFnUnitTest.java @@ -0,0 +1,21 @@ +package com.baeldung.crunch; + +import static org.junit.Assert.assertEquals; + +import org.apache.crunch.impl.mem.emit.InMemoryEmitter; +import org.junit.Test; + +import com.google.common.collect.ImmutableList; + +public class ToUpperCaseFnUnitTest { + + @Test + public void givenString_whenToUpperCaseFnCalled_UpperCaseStringReturned() { + InMemoryEmitter emitter = new InMemoryEmitter(); + + new ToUpperCaseFn().process("input", emitter); + + assertEquals(ImmutableList.of("INPUT"), emitter.getOutput()); + } + +} diff --git a/libraries-data/src/test/java/com/baeldung/crunch/ToUpperCaseWithCounterFnUnitTest.java b/libraries-data/src/test/java/com/baeldung/crunch/ToUpperCaseWithCounterFnUnitTest.java new file mode 100644 index 0000000000..76294d273d --- /dev/null +++ b/libraries-data/src/test/java/com/baeldung/crunch/ToUpperCaseWithCounterFnUnitTest.java @@ -0,0 +1,31 @@ +package com.baeldung.crunch; + +import static org.junit.Assert.assertEquals; + +import org.apache.crunch.PCollection; +import org.apache.crunch.impl.mem.MemPipeline; +import org.apache.crunch.types.writable.Writables; +import org.junit.Before; +import org.junit.Test; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; + +public class ToUpperCaseWithCounterFnUnitTest { + + @Before + public void setUp() throws Exception { + MemPipeline.clearCounters(); + } + + @Test + public void whenFunctionCalled_counterIncementendForChangedValues() { + PCollection inputStrings = MemPipeline.collectionOf("This", "is", "a", "TEST", "string"); + PCollection upperCaseStrings = inputStrings.parallelDo(new ToUpperCaseWithCounterFn(), Writables.strings()); + + assertEquals(ImmutableList.of("THIS", "IS", "A", "TEST", "STRING"), Lists.newArrayList(upperCaseStrings.materialize())); + assertEquals(4L, MemPipeline.getCounters() + .findCounter("UpperCase", "modified") + .getValue()); + } +} diff --git a/libraries-data/src/test/java/com/baeldung/crunch/TokenizerUnitTest.java b/libraries-data/src/test/java/com/baeldung/crunch/TokenizerUnitTest.java new file mode 100644 index 0000000000..1e85826d17 --- /dev/null +++ b/libraries-data/src/test/java/com/baeldung/crunch/TokenizerUnitTest.java @@ -0,0 +1,27 @@ +package com.baeldung.crunch; + +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; + +import org.apache.crunch.Emitter; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class TokenizerUnitTest { + @Mock + private Emitter emitter; + + @Test + public void givenTokenizer_whenLineProcessed_thenOnlyExpectedWordsEmitted() { + Tokenizer splitter = new Tokenizer(); + + splitter.process(" hello world ", emitter); + + verify(emitter).emit("hello"); + verify(emitter).emit("world"); + verifyNoMoreInteractions(emitter); + } +} diff --git a/libraries-data/src/test/resources/crunch/input.txt b/libraries-data/src/test/resources/crunch/input.txt new file mode 100644 index 0000000000..cb78ea5351 --- /dev/null +++ b/libraries-data/src/test/resources/crunch/input.txt @@ -0,0 +1,21 @@ +An an valley indeed so no wonder future nature vanity. Debating all she mistaken indulged believed provided declared. He many kept on draw lain song as same. Whether at dearest certain spirits is entered in to. Rich fine bred real use too many good. She compliment unaffected expression favourable any. Unknown chiefly showing to conduct no. Hung as love evil able to post at as. + + + +Is he staying arrival address earnest. To preference considered it themselves inquietude collecting estimating. View park for why gay knew face. Next than near to four so hand. Times so do he downs me would. Witty abode party her found quiet law. They door four bed fail now have. + +Tolerably earnestly middleton extremely distrusts she boy now not. Add and offered prepare how cordial two promise. Greatly who affixed suppose but enquire compact prepare all put. Added forth chief trees but rooms think may. Wicket do manner others seemed enable rather in. Excellent own discovery unfeeling sweetness questions the gentleman. Chapter shyness matters mr parlors if mention thought. + +Extended kindness trifling remember he confined outlived if. Assistance sentiments yet unpleasing say. Open they an busy they my such high. An active dinner wishes at unable hardly no talked on. Immediate him her resolving his favourite. Wished denote abroad at branch at. + +Village did removed enjoyed explain nor ham saw calling talking. Securing as informed declared or margaret. Joy horrible moreover man feelings own shy. Request norland neither mistake for yet. Between the for morning assured country believe. On even feet time have an no at. Relation so in confined smallest children unpacked delicate. Why sir end believe uncivil respect. Always get adieus nature day course for common. My little garret repair to desire he esteem. + +You vexed shy mirth now noise. Talked him people valley add use her depend letter. Allowance too applauded now way something recommend. Mrs age men and trees jokes fancy. Gay pretended engrossed eagerness continued ten. Admitting day him contained unfeeling attention mrs out. + +Performed suspicion in certainty so frankness by attention pretended. Newspaper or in tolerably education enjoyment. Extremity excellent certainty discourse sincerity no he so resembled. Joy house worse arise total boy but. Elderly up chicken do at feeling is. Like seen drew no make fond at on rent. Behaviour extremely her explained situation yet september gentleman are who. Is thought or pointed hearing he. + +If wandered relation no surprise of screened doubtful. Overcame no insisted ye of trifling husbands. Might am order hours on found. Or dissimilar companions friendship impossible at diminution. Did yourself carriage learning she man its replying. Sister piqued living her you enable mrs off spirit really. Parish oppose repair is me misery. Quick may saw style after money mrs. + +Effects present letters inquiry no an removed or friends. Desire behind latter me though in. Supposing shameless am he engrossed up additions. My possible peculiar together to. Desire so better am cannot he up before points. Remember mistaken opinions it pleasure of debating. Court front maids forty if aware their at. Chicken use are pressed removed. + +To sorry world an at do spoil along. Incommode he depending do frankness remainder to. Edward day almost active him friend thirty piqued. People as period twenty my extent as. Set was better abroad ham plenty secure had horses. Admiration has sir decisively excellence say everything inhabiting acceptance. Sooner settle add put you sudden him. From 500b733518a48d807ce25a5030e6c0adb3fcd9b8 Mon Sep 17 00:00:00 2001 From: Chandra Prakash Date: Sun, 26 Aug 2018 22:38:57 -0400 Subject: [PATCH 030/128] Update pom.xml --- libraries-data/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries-data/pom.xml b/libraries-data/pom.xml index 707b646874..2b83328295 100644 --- a/libraries-data/pom.xml +++ b/libraries-data/pom.xml @@ -347,7 +347,7 @@ 5.0.4 1.6.0.1 0.15.0 - 2.2.0 + 2.2.0 From 2041d4f10aedcd5897893c345f9ab10d272b2346 Mon Sep 17 00:00:00 2001 From: Chandra Prakash Date: Sun, 26 Aug 2018 22:51:41 -0400 Subject: [PATCH 031/128] Update README.md --- libraries-data/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries-data/README.md b/libraries-data/README.md index 15dacdfed8..74697f7c13 100644 --- a/libraries-data/README.md +++ b/libraries-data/README.md @@ -9,5 +9,5 @@ - [Introduction to JCache](http://www.baeldung.com/jcache) - [A Guide to Apache Ignite](http://www.baeldung.com/apache-ignite) - [Apache Ignite with Spring Data](http://www.baeldung.com/apache-ignite-spring-data) -- [Guide to JMapper](https://github.com/eugenp/tutorials/tree/master/libraries-data) -- [A Guide to Apache Crunch](https://github.com/eugenp/tutorials/tree/master/libraries-data) +- [Guide to JMapper](https://www.baeldung.com/jmapper) +- [A Guide to Apache Crunch]https://www.baeldung.com/crunch) From 198610a90adfbf706aa322f69c203c0a599a561f Mon Sep 17 00:00:00 2001 From: Chandra Prakash Date: Sun, 26 Aug 2018 22:52:39 -0400 Subject: [PATCH 032/128] Update README.md --- libraries-data/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries-data/README.md b/libraries-data/README.md index 74697f7c13..32d34f63be 100644 --- a/libraries-data/README.md +++ b/libraries-data/README.md @@ -10,4 +10,4 @@ - [A Guide to Apache Ignite](http://www.baeldung.com/apache-ignite) - [Apache Ignite with Spring Data](http://www.baeldung.com/apache-ignite-spring-data) - [Guide to JMapper](https://www.baeldung.com/jmapper) -- [A Guide to Apache Crunch]https://www.baeldung.com/crunch) +- [A Guide to Apache Crunch](https://www.baeldung.com/crunch) From 86b279ee2090c2c16ce473fe585309460931e486 Mon Sep 17 00:00:00 2001 From: Krzysztof Majewski Date: Mon, 27 Aug 2018 08:43:12 +0200 Subject: [PATCH 033/128] add .java extension --- .../{JoinColumnIntegrationTest => JoinColumnIntegrationTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename hibernate5/src/test/java/com/baeldung/hibernate/joincolumn/{JoinColumnIntegrationTest => JoinColumnIntegrationTest.java} (100%) diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest b/hibernate5/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest.java similarity index 100% rename from hibernate5/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest rename to hibernate5/src/test/java/com/baeldung/hibernate/joincolumn/JoinColumnIntegrationTest.java From 3ff20c353e475f04fa681c94c4ede26a701c9d5d Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Mon, 27 Aug 2018 14:07:09 +0530 Subject: [PATCH 034/128] BAEL-8497 Update "File to InputStream" article - Added new tests for data input stream and sequence input stream in JavaXToInputStreamUnitTest - Added new test resource anothersample.txt --- .../java/io/JavaXToInputStreamUnitTest.java | 24 +++++++++++++++++++ .../src/test/resources/anothersample.txt | 1 + 2 files changed, 25 insertions(+) create mode 100644 core-java-io/src/test/resources/anothersample.txt diff --git a/core-java-io/src/test/java/org/baeldung/java/io/JavaXToInputStreamUnitTest.java b/core-java-io/src/test/java/org/baeldung/java/io/JavaXToInputStreamUnitTest.java index 08a4c673cd..6604d75ed1 100644 --- a/core-java-io/src/test/java/org/baeldung/java/io/JavaXToInputStreamUnitTest.java +++ b/core-java-io/src/test/java/org/baeldung/java/io/JavaXToInputStreamUnitTest.java @@ -1,10 +1,12 @@ package org.baeldung.java.io; import java.io.ByteArrayInputStream; +import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.io.SequenceInputStream; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; @@ -74,6 +76,28 @@ public class JavaXToInputStreamUnitTest { IOUtils.closeQuietly(targetStream); } + @Test + public final void givenUsingPlainJava_whenConvertingFileToDataInputStream_thenCorrect() throws IOException { + final File initialFile = new File("src/test/resources/sample.txt"); + final InputStream targetStream = new DataInputStream(new FileInputStream(initialFile)); + + IOUtils.closeQuietly(targetStream); + } + + @Test + public final void givenUsingPlainJava_whenConvertingFileToSequenceInputStream_thenCorrect() throws IOException { + final File initialFile = new File("src/test/resources/sample.txt"); + final File anotherFile = new File("src/test/resources/anothersample.txt"); + final InputStream targetStream = new FileInputStream(initialFile); + final InputStream anotherTargetStream = new FileInputStream(anotherFile); + + InputStream sequenceTargetStream = new SequenceInputStream(targetStream, anotherTargetStream); + + IOUtils.closeQuietly(targetStream); + IOUtils.closeQuietly(anotherTargetStream); + IOUtils.closeQuietly(sequenceTargetStream); + } + @Test public final void givenUsingGuava_whenConvertingFileToInputStream_thenCorrect() throws IOException { final File initialFile = new File("src/test/resources/sample.txt"); diff --git a/core-java-io/src/test/resources/anothersample.txt b/core-java-io/src/test/resources/anothersample.txt new file mode 100644 index 0000000000..f06f18ce02 --- /dev/null +++ b/core-java-io/src/test/resources/anothersample.txt @@ -0,0 +1 @@ +...Continues \ No newline at end of file From ae287cb55f04bf988133292571cf3cd318736888 Mon Sep 17 00:00:00 2001 From: Siben Nayak Date: Mon, 27 Aug 2018 17:37:35 +0530 Subject: [PATCH 035/128] [BAEL-2032] Operate on an item in a Stream then remove it (#5086) * [BAEL-2032] Operate on an item in a Stream then remove it * [BAEL-2032] Refactored unit test * [BAEL-2032] Added a new test for filter and used logger * Stored the predicate in a separate variable --- .../baeldung/collection/StreamOperateAndRemoveUnitTest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core-java-collections/src/test/java/com/baeldung/collection/StreamOperateAndRemoveUnitTest.java b/core-java-collections/src/test/java/com/baeldung/collection/StreamOperateAndRemoveUnitTest.java index 202fe00017..9f002c89a2 100644 --- a/core-java-collections/src/test/java/com/baeldung/collection/StreamOperateAndRemoveUnitTest.java +++ b/core-java-collections/src/test/java/com/baeldung/collection/StreamOperateAndRemoveUnitTest.java @@ -2,6 +2,7 @@ package com.baeldung.collection; import java.util.ArrayList; import java.util.List; +import java.util.function.Predicate; import java.util.stream.Collectors; import org.junit.Assert; @@ -35,8 +36,9 @@ public class StreamOperateAndRemoveUnitTest { @Test public void givenAListOf10Items_whenOperateAndRemoveQualifiedItemsUsingRemoveIf_thenListContains5Items() { - itemList.stream().filter(item -> item.isQualified()).forEach(item -> item.operate()); - itemList.removeIf(item -> item.isQualified()); + final Predicate isQualified = item -> item.isQualified(); + itemList.stream().filter(isQualified).forEach(item -> item.operate()); + itemList.removeIf(isQualified); Assert.assertEquals(5, itemList.size()); } From c209eecd5e0fdbcdecdd92f589478c5c787f40b6 Mon Sep 17 00:00:00 2001 From: josephine-barboza Date: Tue, 28 Aug 2018 01:49:59 +0530 Subject: [PATCH 036/128] BAEL-1666 Working with custom attributes in Thymeleaf (#5089) * BAEL-1666 Working with custom attributes in Thymeleaf * Delete listCourses.html --- .../CourseRegistrationController.java | 30 +++++++++++ .../com/baeldung/thymeleaf/model/Course.java | 52 +++++++++++++++++++ .../WEB-INF/views/courseRegistration.html | 42 +++++++++++++++ .../src/main/webapp/WEB-INF/views/home.html | 3 ++ 4 files changed, 127 insertions(+) create mode 100644 spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/CourseRegistrationController.java create mode 100644 spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/model/Course.java create mode 100644 spring-thymeleaf/src/main/webapp/WEB-INF/views/courseRegistration.html diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/CourseRegistrationController.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/CourseRegistrationController.java new file mode 100644 index 0000000000..2d2b5906e1 --- /dev/null +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/CourseRegistrationController.java @@ -0,0 +1,30 @@ +package com.baeldung.thymeleaf.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import com.baeldung.thymeleaf.model.Course; + +/** + * Handles requests for the student model. + * + */ +@Controller +public class CourseRegistrationController { + + @RequestMapping(value = "/registerCourse", method = RequestMethod.POST) + public String register(@ModelAttribute Course course, Model model) { + model.addAttribute("successMessage", "You have successfully registered for course: " + course.getName() + "."); + return "courseRegistration.html"; + } + + @RequestMapping(value = "/registerCourse", method = RequestMethod.GET) + public String register(Model model) { + model.addAttribute("course", new Course()); + return "courseRegistration.html"; + } + +} diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/model/Course.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/model/Course.java new file mode 100644 index 0000000000..df2e9cd097 --- /dev/null +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/model/Course.java @@ -0,0 +1,52 @@ +package com.baeldung.thymeleaf.model; + +import java.util.Date; + +public class Course { + + private String name; + private String description; + private Date startDate; + private Date endDate; + private String teacher; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Date getStartDate() { + return startDate; + } + + public void setStartDate(Date startDate) { + this.startDate = startDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getTeacher() { + return teacher; + } + + public void setTeacher(String teacher) { + this.teacher = teacher; + } +} diff --git a/spring-thymeleaf/src/main/webapp/WEB-INF/views/courseRegistration.html b/spring-thymeleaf/src/main/webapp/WEB-INF/views/courseRegistration.html new file mode 100644 index 0000000000..cfce92d055 --- /dev/null +++ b/spring-thymeleaf/src/main/webapp/WEB-INF/views/courseRegistration.html @@ -0,0 +1,42 @@ + + + +Register for course + + + + +

Register Here

+
+ + + + + + + + + +
+
+ + diff --git a/spring-thymeleaf/src/main/webapp/WEB-INF/views/home.html b/spring-thymeleaf/src/main/webapp/WEB-INF/views/home.html index b458f7270c..25ff6a19bb 100644 --- a/spring-thymeleaf/src/main/webapp/WEB-INF/views/home.html +++ b/spring-thymeleaf/src/main/webapp/WEB-INF/views/home.html @@ -24,6 +24,9 @@ + + + From 8ac53f70c4ba2ef139e1acfcbcbf647950a2df25 Mon Sep 17 00:00:00 2001 From: Kacper Date: Mon, 27 Aug 2018 22:21:33 +0200 Subject: [PATCH 037/128] Optional or else throw (#5088) * Throw and throws in Java * BAEL-2122 | throw exception in optional * BAEL-2122 | optional orelsethrow * fix test --- .../PersonRepositoryUnitTest.java | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/throwsexception/PersonRepositoryUnitTest.java b/core-java/src/test/java/com/baeldung/throwsexception/PersonRepositoryUnitTest.java index 0d1859fb1a..3749ce10d0 100644 --- a/core-java/src/test/java/com/baeldung/throwsexception/PersonRepositoryUnitTest.java +++ b/core-java/src/test/java/com/baeldung/throwsexception/PersonRepositoryUnitTest.java @@ -13,21 +13,31 @@ public class PersonRepositoryUnitTest { PersonRepository personRepository = new PersonRepository(); @Test - public void whenIdIsNull_thenExceptionIsThrown() throws Exception { - assertThrows(Exception.class, + public void whenIdIsNull_thenExceptionIsThrown() { + assertThrows(IllegalArgumentException.class, () -> Optional .ofNullable(personRepository.findNameById(null)) - .orElseThrow(Exception::new)); + .orElseThrow(IllegalArgumentException::new)); } @Test - public void whenIdIsNonNull_thenNoExceptionIsThrown() throws Exception { + public void whenIdIsNonNull_thenNoExceptionIsThrown() { assertAll( () -> Optional .ofNullable(personRepository.findNameById("id")) - .orElseThrow(Exception::new)); + .orElseThrow(RuntimeException::new)); + } + + @Test + public void whenIdNonNull_thenReturnsNameUpperCase() { + String name = Optional + .ofNullable(personRepository.findNameById("id")) + .map(String::toUpperCase) + .orElseThrow(RuntimeException::new); + + assertEquals("NAME", name); } @Test From 64ba6515822e448058626d46daf978c16bf45a34 Mon Sep 17 00:00:00 2001 From: Alessio Stalla Date: Mon, 27 Aug 2018 22:32:15 +0200 Subject: [PATCH 038/128] #BAEL-693 tests and code examples. (#5091) --- core-kotlin/pom.xml | 176 +++++---- .../baeldung/kotlin/exposed/ExposedTest.kt | 333 ++++++++++++++++++ 2 files changed, 431 insertions(+), 78 deletions(-) create mode 100644 core-kotlin/src/test/kotlin/com/baeldung/kotlin/exposed/ExposedTest.kt diff --git a/core-kotlin/pom.xml b/core-kotlin/pom.xml index 1c5818b6aa..6fdc7c7c1a 100644 --- a/core-kotlin/pom.xml +++ b/core-kotlin/pom.xml @@ -1,85 +1,105 @@ - 4.0.0 - core-kotlin - jar + 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 + jar - - com.baeldung - parent-kotlin - 1.0.0-SNAPSHOT - ../parent-kotlin - + + com.baeldung + parent-kotlin + 1.0.0-SNAPSHOT + ../parent-kotlin + - - - org.jetbrains.spek - spek-api - 1.1.5 - test - - - org.jetbrains.spek - spek-subject-extension - 1.1.5 - test - - - org.jetbrains.spek - spek-junit-platform-engine - 1.1.5 - test - - - org.apache.commons - commons-math3 - ${commons-math3.version} - - - org.junit.platform - junit-platform-runner - ${junit.platform.version} - test - - - khttp - khttp - ${khttp.version} - - - com.nhaarman - mockito-kotlin - ${mockito-kotlin.version} - test - - - com.github.salomonbrys.kodein - kodein - ${kodein.version} - - - org.assertj - assertj-core - ${assertj.version} - test - - - com.beust - klaxon - ${klaxon.version} - - + + + exposed + exposed + https://dl.bintray.com/kotlin/exposed + + - - 1.5.0 - 4.1.0 - 3.0.4 - 0.1.0 - 3.6.1 - 1.1.1 - 5.2.0 - 3.10.0 - + + + org.jetbrains.spek + spek-api + 1.1.5 + test + + + org.jetbrains.spek + spek-subject-extension + 1.1.5 + test + + + org.jetbrains.spek + spek-junit-platform-engine + 1.1.5 + test + + + org.apache.commons + commons-math3 + ${commons-math3.version} + + + org.junit.platform + junit-platform-runner + ${junit.platform.version} + test + + + khttp + khttp + ${khttp.version} + + + com.nhaarman + mockito-kotlin + ${mockito-kotlin.version} + test + + + com.github.salomonbrys.kodein + kodein + ${kodein.version} + + + org.assertj + assertj-core + ${assertj.version} + test + + + com.beust + klaxon + ${klaxon.version} + + + org.jetbrains.exposed + exposed + ${exposed.version} + + + com.h2database + h2 + ${h2database.version} + + + + + 1.5.0 + 4.1.0 + 3.0.4 + 0.1.0 + 3.6.1 + 1.1.1 + 5.2.0 + 3.10.0 + 1.4.197 + 0.10.4 + \ No newline at end of file diff --git a/core-kotlin/src/test/kotlin/com/baeldung/kotlin/exposed/ExposedTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/exposed/ExposedTest.kt new file mode 100644 index 0000000000..29fa18ef7a --- /dev/null +++ b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/exposed/ExposedTest.kt @@ -0,0 +1,333 @@ +package com.baeldung.kotlin.exposed + +import org.jetbrains.exposed.dao.* +import org.jetbrains.exposed.sql.* +import org.jetbrains.exposed.sql.transactions.TransactionManager +import org.jetbrains.exposed.sql.transactions.transaction +import org.junit.Test +import java.sql.DriverManager +import kotlin.test.* + +class ExposedTest { + + @Test + fun whenH2Database_thenConnectionSuccessful() { + val database = Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver") + transaction { + assertEquals(1.4.toBigDecimal(), database.version) + assertEquals("h2", database.vendor) + } + } + + @Test + fun whenH2DatabaseWithCredentials_thenConnectionSuccessful() { + Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver", user = "myself", password = "secret") + } + + @Test + fun whenH2DatabaseWithManualConnection_thenConnectionSuccessful() { + var connected = false + Database.connect({ connected = true; DriverManager.getConnection("jdbc:h2:mem:test;MODE=MySQL") }) + assertEquals(false, connected) + transaction { + addLogger(StdOutSqlLogger) + assertEquals(false, connected) + SchemaUtils.create(Cities) + assertEquals(true, connected) + } + } + + @Test + fun whenManualCommit_thenOk() { + Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver") + transaction { + assertTrue(this is Transaction) + commit() + commit() + commit() + } + } + + @Test + fun whenInsert_thenGeneratedKeys() { + Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver") + transaction { + SchemaUtils.create(StarWarsFilms) + val id = StarWarsFilms.insertAndGetId { + it[name] = "The Last Jedi" + it[sequelId] = 8 + it[director] = "Rian Johnson" + } + assertEquals(1, id.value) + val insert = StarWarsFilms.insert { + it[name] = "The Force Awakens" + it[sequelId] = 7 + it[director] = "J.J. Abrams" + } + assertEquals(2, insert[StarWarsFilms.id]?.value) + val selectAll = StarWarsFilms.selectAll() + selectAll.forEach { + assertTrue { it[StarWarsFilms.sequelId] >= 7 } + } + StarWarsFilms.slice(StarWarsFilms.name, StarWarsFilms.director).selectAll() + .forEach { + assertTrue { it[StarWarsFilms.name].startsWith("The") } + } + val select = StarWarsFilms.select { (StarWarsFilms.director like "J.J.%") and (StarWarsFilms.sequelId eq 7) } + assertEquals(1, select.count()) + StarWarsFilms.update ({ StarWarsFilms.sequelId eq 8 }) { + it[name] = "Episode VIII – The Last Jedi" + with(SqlExpressionBuilder) { + it.update(StarWarsFilms.sequelId, StarWarsFilms.sequelId + 1) + } + } + } + } + + @Test + fun whenForeignKey_thenAutoJoin() { + Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver") + transaction { + addLogger(StdOutSqlLogger) + SchemaUtils.create(StarWarsFilms, Players) + StarWarsFilms.insert { + it[name] = "The Last Jedi" + it[sequelId] = 8 + it[director] = "Rian Johnson" + } + StarWarsFilms.insert { + it[name] = "The Force Awakens" + it[sequelId] = 7 + it[director] = "J.J. Abrams" + } + Players.insert { + it[name] = "Mark Hamill" + it[sequelId] = 7 + } + Players.insert { + it[name] = "Mark Hamill" + it[sequelId] = 8 + } + val simpleInnerJoin = (StarWarsFilms innerJoin Players).selectAll() + assertEquals(2, simpleInnerJoin.count()) + simpleInnerJoin.forEach { + assertNotNull(it[StarWarsFilms.name]) + assertEquals(it[StarWarsFilms.sequelId], it[Players.sequelId]) + assertEquals("Mark Hamill", it[Players.name]) + } + val innerJoinWithCondition = (StarWarsFilms innerJoin Players) + .select { StarWarsFilms.sequelId eq Players.sequelId } + assertEquals(2, innerJoinWithCondition.count()) + innerJoinWithCondition.forEach { + assertNotNull(it[StarWarsFilms.name]) + assertEquals(it[StarWarsFilms.sequelId], it[Players.sequelId]) + assertEquals("Mark Hamill", it[Players.name]) + } + val complexInnerJoin = Join(StarWarsFilms, Players, joinType = JoinType.INNER, onColumn = StarWarsFilms.sequelId, otherColumn = Players.sequelId, additionalConstraint = { + StarWarsFilms.sequelId eq 8 + }).selectAll() + assertEquals(1, complexInnerJoin.count()) + complexInnerJoin.forEach { + assertNotNull(it[StarWarsFilms.name]) + assertEquals(it[StarWarsFilms.sequelId], it[Players.sequelId]) + assertEquals("Mark Hamill", it[Players.name]) + } + + } + } + + @Test + fun whenJoinWithAlias_thenFun() { + Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver") + transaction { + addLogger(StdOutSqlLogger) + SchemaUtils.create(StarWarsFilms, Players) + StarWarsFilms.insert { + it[name] = "The Last Jedi" + it[sequelId] = 8 + it[director] = "Rian Johnson" + } + StarWarsFilms.insert { + it[name] = "The Force Awakens" + it[sequelId] = 7 + it[director] = "J.J. Abrams" + } + val sequel = StarWarsFilms.alias("sequel") + Join(StarWarsFilms, sequel, + additionalConstraint = { sequel[StarWarsFilms.sequelId] eq StarWarsFilms.sequelId + 1 }) + .selectAll().forEach { + assertEquals(it[sequel[StarWarsFilms.sequelId]], it[StarWarsFilms.sequelId] + 1) + } + } + } + + @Test + fun whenEntity_thenDAO() { + val database = Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver") + val connection = database.connector.invoke() //Keep a connection open so the DB is not destroyed after the first transaction + val inserted = transaction { + addLogger(StdOutSqlLogger) + SchemaUtils.create(StarWarsFilms, Players) + val theLastJedi = StarWarsFilm.new { + name = "The Last Jedi" + sequelId = 8 + director = "Rian Johnson" + } + assertFalse(TransactionManager.current().entityCache.inserts.isEmpty()) + assertEquals(1, theLastJedi.id.value) //Reading this causes a flush + assertTrue(TransactionManager.current().entityCache.inserts.isEmpty()) + theLastJedi + } + transaction { + val theLastJedi = StarWarsFilm.findById(1) + assertNotNull(theLastJedi) + assertEquals(inserted.id, theLastJedi?.id) + } + connection.close() + } + + @Test + fun whenManyToOne_thenNavigation() { + val database = Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver") + val connection = database.connector.invoke() + transaction { + addLogger(StdOutSqlLogger) + SchemaUtils.create(StarWarsFilms, Players, Users, UserRatings) + val theLastJedi = StarWarsFilm.new { + name = "The Last Jedi" + sequelId = 8 + director = "Rian Johnson" + } + val someUser = User.new { + name = "Some User" + } + val rating = UserRating.new { + value = 9 + user = someUser + film = theLastJedi + } + assertEquals(theLastJedi, rating.film) + assertEquals(someUser, rating.user) + assertEquals(rating, theLastJedi.ratings.first()) + } + transaction { + val theLastJedi = StarWarsFilm.find { StarWarsFilms.sequelId eq 8 }.first() + val ratings = UserRating.find { UserRatings.film eq theLastJedi.id } + assertEquals(1, ratings.count()) + val rating = ratings.first() + assertEquals("Some User", rating.user.name) + assertEquals(rating, theLastJedi.ratings.first()) + UserRating.new { + value = 8 + user = rating.user + film = theLastJedi + } + assertEquals(2, theLastJedi.ratings.count()) + } + connection.close() + } + + @Test + fun whenManyToMany_thenAssociation() { + val database = Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver") + val connection = database.connector.invoke() + val film = transaction { + SchemaUtils.create(StarWarsFilms) + StarWarsFilm.new { + name = "The Last Jedi" + sequelId = 8 + director = "Rian Johnson" + } + } + + val actor = transaction { + SchemaUtils.create(Actors) + Actor.new { + firstname = "Daisy" + lastname = "Ridley" + } + } + + transaction { + SchemaUtils.create(StarWarsFilmActors) + film.actors = SizedCollection(listOf(actor)) + } + connection.close() + } + +} + +object Cities: IntIdTable() { + val name = varchar("name", 50) +} + +object StarWarsFilms_Simple : Table() { + val id = integer("id").autoIncrement().primaryKey() + val sequelId = integer("sequel_id").uniqueIndex() + val name = varchar("name", 50) + val director = varchar("director", 50) +} + +object StarWarsFilms : IntIdTable() { + val sequelId = integer("sequel_id").uniqueIndex() + val name = varchar("name", 50) + val director = varchar("director", 50) +} + +object Players : Table() { + //val sequelId = integer("sequel_id").uniqueIndex().references(StarWarsFilms.sequelId) + val sequelId = reference("sequel_id", StarWarsFilms.sequelId).uniqueIndex() + //val filmId = reference("film_id", StarWarsFilms).nullable() + val name = varchar("name", 50) +} + +class StarWarsFilm(id: EntityID) : Entity(id) { + companion object : EntityClass(StarWarsFilms) + + var sequelId by StarWarsFilms.sequelId + var name by StarWarsFilms.name + var director by StarWarsFilms.director + var actors by Actor via StarWarsFilmActors + val ratings by UserRating referrersOn UserRatings.film +} + +object Users: IntIdTable() { + val name = varchar("name", 50) +} + +object UserRatings: IntIdTable() { + val value = long("value") + val film = reference("film", StarWarsFilms) + val user = reference("user", Users) +} + +class User(id: EntityID): IntEntity(id) { + companion object : IntEntityClass(Users) + + var name by Users.name +} + +class UserRating(id: EntityID): IntEntity(id) { + companion object : IntEntityClass(UserRatings) + + var value by UserRatings.value + var film by StarWarsFilm referencedOn UserRatings.film + var user by User referencedOn UserRatings.user +} + +object Actors: IntIdTable() { + val firstname = varchar("firstname", 50) + val lastname = varchar("lastname", 50) +} + +class Actor(id: EntityID): IntEntity(id) { + companion object : IntEntityClass(Actors) + + var firstname by Actors.firstname + var lastname by Actors.lastname +} + +object StarWarsFilmActors : Table() { + val starWarsFilm = reference("starWarsFilm", StarWarsFilms).primaryKey(0) + val actor = reference("actor", Actors).primaryKey(1) +} \ No newline at end of file From 1256735a42c43768fec7dc4f6508c379d5491c70 Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Tue, 28 Aug 2018 00:28:44 +0100 Subject: [PATCH 039/128] BAEL-2033: Added stream-ordering files (#5080) * Added stream-ordering files * Removed old files --- .../streamordering/BenchmarkUnitTest.java | 6 ++-- .../StreamsOrderingUnitTest.java | 7 ++-- testing-modules/streams-ordering/pom.xml | 34 ------------------- 3 files changed, 7 insertions(+), 40 deletions(-) rename testing-modules/streams-ordering/src/test/java/benchmarking/TestBenchmark.java => core-java-8/src/test/java/com/baeldung/streamordering/BenchmarkUnitTest.java (97%) rename testing-modules/streams-ordering/src/test/java/StreamsOrderingTest.java => core-java-8/src/test/java/com/baeldung/streamordering/StreamsOrderingUnitTest.java (96%) delete mode 100644 testing-modules/streams-ordering/pom.xml diff --git a/testing-modules/streams-ordering/src/test/java/benchmarking/TestBenchmark.java b/core-java-8/src/test/java/com/baeldung/streamordering/BenchmarkUnitTest.java similarity index 97% rename from testing-modules/streams-ordering/src/test/java/benchmarking/TestBenchmark.java rename to core-java-8/src/test/java/com/baeldung/streamordering/BenchmarkUnitTest.java index a3e99e6465..9ae0a16514 100644 --- a/testing-modules/streams-ordering/src/test/java/benchmarking/TestBenchmark.java +++ b/core-java-8/src/test/java/com/baeldung/streamordering/BenchmarkUnitTest.java @@ -1,4 +1,4 @@ -package benchmarking; +package com.baeldung.streamordering; import org.junit.Test; import org.openjdk.jmh.annotations.*; @@ -15,7 +15,7 @@ import java.util.concurrent.TimeUnit; import java.util.stream.IntStream; -public class TestBenchmark +public class BenchmarkUnitTest { @Test @@ -94,4 +94,4 @@ public class TestBenchmark for (int i = 0; i < 1000; i++) bh.consume (list.get (i)); } -} \ No newline at end of file +} diff --git a/testing-modules/streams-ordering/src/test/java/StreamsOrderingTest.java b/core-java-8/src/test/java/com/baeldung/streamordering/StreamsOrderingUnitTest.java similarity index 96% rename from testing-modules/streams-ordering/src/test/java/StreamsOrderingTest.java rename to core-java-8/src/test/java/com/baeldung/streamordering/StreamsOrderingUnitTest.java index b657911780..43a233d353 100644 --- a/testing-modules/streams-ordering/src/test/java/StreamsOrderingTest.java +++ b/core-java-8/src/test/java/com/baeldung/streamordering/StreamsOrderingUnitTest.java @@ -1,3 +1,5 @@ +package com.baeldung.streamordering; + import org.junit.Before; import org.junit.Test; @@ -10,10 +12,9 @@ import java.util.stream.IntStream; import static org.junit.Assert.assertEquals; +public class StreamsOrderingUnitTest { -public class StreamsOrderingTest { - - Logger logger = Logger.getLogger( StreamsOrderingTest.class.getName()); + Logger logger = Logger.getLogger( StreamsOrderingUnitTest.class.getName()); @Before public void setUp() throws Exception { diff --git a/testing-modules/streams-ordering/pom.xml b/testing-modules/streams-ordering/pom.xml deleted file mode 100644 index 99d08e19be..0000000000 --- a/testing-modules/streams-ordering/pom.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - 4.0.0 - - com.baeldung - StreamsOrdering - 1.0-SNAPSHOT - - - - junit - junit - 4.12 - test - - - - - org.openjdk.jmh - jmh-core - 1.21 - - - - org.openjdk.jmh - jmh-generator-annprocess - 1.21 - provided - - - - \ No newline at end of file From 1d0eadf585bcab134a89266b20d5b5dc679d47ea Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Tue, 28 Aug 2018 13:35:27 +0530 Subject: [PATCH 040/128] BAEL-8504 Fix surefire configs of spring-5 projects part 2 -Removed redundant surefire configs --- jhipster/jhipster-monolithic/pom.xml | 17 +- parent-boot-1/pom.xml | 155 ++--- parent-boot-2/pom.xml | 6 +- spring-4/pom.xml | 6 +- spring-activiti/pom.xml | 29 - spring-cloud/spring-cloud-aws/pom.xml | 21 - .../spring-cloud-connectors-heroku/pom.xml | 28 +- spring-mvc-forms-thymeleaf/pom.xml | 30 - spring-mvc-velocity/pom.xml | 20 - spring-rest-simple/pom.xml | 634 +++++++++--------- spring-rest/pom.xml | 590 ++++++++-------- 11 files changed, 645 insertions(+), 891 deletions(-) diff --git a/jhipster/jhipster-monolithic/pom.xml b/jhipster/jhipster-monolithic/pom.xml index 3c08f9a842..7dd12eb11d 100644 --- a/jhipster/jhipster-monolithic/pom.xml +++ b/jhipster/jhipster-monolithic/pom.xml @@ -1,9 +1,7 @@ 4.0.0 - com.baeldung jhipster-monolithic - 0.0.1-SNAPSHOT war JHipster Monolithic Application @@ -89,8 +87,7 @@ io.dropwizard.metrics metrics-annotation - ${dropwizard-metrics.version} - + io.dropwizard.metrics metrics-core @@ -98,18 +95,15 @@ io.dropwizard.metrics metrics-json - ${dropwizard-metrics.version} - + io.dropwizard.metrics metrics-jvm - ${dropwizard-metrics.version} - + io.dropwizard.metrics metrics-servlet - ${dropwizard-metrics.version} - + io.dropwizard.metrics metrics-servlets @@ -536,7 +530,7 @@ org.liquibase liquibase-maven-plugin - ${liquibase.version} + ${liquibase-maven-plugin.version} javax.validation @@ -920,6 +914,7 @@ 1.1.3 3.6 2.0.0 + 3.6.2 4.8 jdt_apt 1.1.0.Final diff --git a/parent-boot-1/pom.xml b/parent-boot-1/pom.xml index e4902de0e6..c52327a42e 100644 --- a/parent-boot-1/pom.xml +++ b/parent-boot-1/pom.xml @@ -1,117 +1,54 @@ - 4.0.0 - com.baeldung - parent-boot-1 - 0.0.1-SNAPSHOT - pom - Parent for all Spring Boot 1.x modules + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + parent-boot-1 + 0.0.1-SNAPSHOT + pom + Parent for all Spring Boot 1.x modules - - org.springframework.boot - spring-boot-starter-parent - 1.5.13.RELEASE - - + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + - - - io.rest-assured - rest-assured - ${rest-assured.version} - - - org.springframework.boot - spring-boot-starter-test - test - - + + + + org.springframework.boot + spring-boot-dependencies + 1.5.15.RELEASE + pom + import + + + + + + io.rest-assured + rest-assured + ${rest-assured.version} + + + org.springframework.boot + spring-boot-starter-test + test + + - - - - org.springframework.boot - spring-boot-maven-plugin - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - 3 - true - - **/*IntegrationTest.java - **/*IntTest.java - **/*LongRunningUnitTest.java - **/*ManualTest.java - **/*LiveTest.java - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - ${maven.compiler.source} - ${maven.compiler.target} - - - - + + + + org.springframework.boot + spring-boot-maven-plugin + 1.5.15.RELEASE + + + - - - integration - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - **/*ManualTest.java - **/*LiveTest.java - **/AutoconfigurationTest.java - **/*UnitTest.java - - - **/*IntegrationTest.java - **/*IntTest.java - */EthControllerTestOne.java - **/*EntryPointsTest.java - - - - - - - json - - - - - - - - - UTF-8 - UTF-8 - 1.8 - 3.0.6 - - 2.20.1 - 3.7.0 - 1.8 - 1.8 - + + 3.1.0 + \ No newline at end of file diff --git a/parent-boot-2/pom.xml b/parent-boot-2/pom.xml index 2fc46e4c28..86a77a90db 100644 --- a/parent-boot-2/pom.xml +++ b/parent-boot-2/pom.xml @@ -1,7 +1,6 @@ 4.0.0 - com.baeldung parent-boot-2 0.0.1-SNAPSHOT pom @@ -18,7 +17,7 @@ org.springframework.boot spring-boot-dependencies - 2.0.1.RELEASE + 2.0.4.RELEASE pom import @@ -41,10 +40,11 @@ org.springframework.boot spring-boot-maven-plugin - 2.0.1.RELEASE + 2.0.4.RELEASE + thin-jar diff --git a/spring-4/pom.xml b/spring-4/pom.xml index 62da44882f..cf10f64aa2 100644 --- a/spring-4/pom.xml +++ b/spring-4/pom.xml @@ -3,7 +3,6 @@ 4.0.0 spring-4 spring-4 - 0.0.1-SNAPSHOT jar spring-4 @@ -32,14 +31,12 @@ com.h2database h2 - ${h2database.version} test com.zaxxer HikariCP - ${hikaricp.version} - + org.springframework.boot spring-boot-starter-test @@ -53,7 +50,6 @@ org.projectlombok lombok - ${lombok.version} provided diff --git a/spring-activiti/pom.xml b/spring-activiti/pom.xml index 1b9e831a29..0a19f483c1 100644 --- a/spring-activiti/pom.xml +++ b/spring-activiti/pom.xml @@ -2,9 +2,7 @@ 4.0.0 - com.example spring-activiti - 0.0.1-SNAPSHOT jar spring-activiti Demo project for Spring Boot @@ -44,33 +42,6 @@ - - - - org.springframework.boot - spring-boot-maven-plugin - - - 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 - - - - - - - com.example.activitiwithspring.ActivitiWithSpringApplication UTF-8 diff --git a/spring-cloud/spring-cloud-aws/pom.xml b/spring-cloud/spring-cloud-aws/pom.xml index 773bf27fc2..6933845173 100644 --- a/spring-cloud/spring-cloud-aws/pom.xml +++ b/spring-cloud/spring-cloud-aws/pom.xml @@ -4,7 +4,6 @@ 4.0.0 com.baeldung.spring.cloud spring-cloud-aws - 0.0.1-SNAPSHOT jar Spring Cloud AWS Spring Cloud AWS Examples @@ -44,7 +43,6 @@ org.postgresql postgresql - @@ -59,27 +57,8 @@ - - - - maven-surefire-plugin - - - **/*IntegrationTest.java - **/*IntTest.java - - - - - - - com.baeldung.spring.cloud.aws.SpringCloudAwsApplication - UTF-8 - UTF-8 - 1.8 Dalston.SR4 - diff --git a/spring-cloud/spring-cloud-connectors-heroku/pom.xml b/spring-cloud/spring-cloud-connectors-heroku/pom.xml index f25c190d56..f00c9eb1fc 100644 --- a/spring-cloud/spring-cloud-connectors-heroku/pom.xml +++ b/spring-cloud/spring-cloud-connectors-heroku/pom.xml @@ -33,8 +33,7 @@ org.postgresql postgresql - ${postgresql.version} - + com.h2database h2 @@ -54,33 +53,8 @@ - - - - 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 - - true - - - - - Brixton.SR7 - 2.21.0 9.4-1201-jdbc4 - \ No newline at end of file diff --git a/spring-mvc-forms-thymeleaf/pom.xml b/spring-mvc-forms-thymeleaf/pom.xml index 07c49766ee..504ad1dcb2 100644 --- a/spring-mvc-forms-thymeleaf/pom.xml +++ b/spring-mvc-forms-thymeleaf/pom.xml @@ -3,9 +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 - com.baeldung spring-mvc-forms-thymeleaf - 0.0.1-SNAPSHOT jar spring-mvc-forms-thymeleaf spring forms examples using thymeleaf @@ -40,36 +38,8 @@ - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.apache.maven.plugins - maven-surefire-plugin - - 3 - true - methods - true - - **/*IntegrationTest.java - **/*IntTest.java - **/*LiveTest.java - - - - - - - UTF-8 - UTF-8 3.0.9.RELEASE com.baeldung.sessionattrs.SessionAttrsApplication - diff --git a/spring-mvc-velocity/pom.xml b/spring-mvc-velocity/pom.xml index 64cf0a73a5..dc5adcf3cf 100644 --- a/spring-mvc-velocity/pom.xml +++ b/spring-mvc-velocity/pom.xml @@ -1,7 +1,6 @@ 4.0.0 - com.baeldung 0.1-SNAPSHOT spring-mvc-velocity @@ -94,7 +93,6 @@ - org.apache.maven.plugins maven-war-plugin @@ -103,25 +101,7 @@ false - - - org.apache.maven.plugins - maven-surefire-plugin - - 3 - true - - **/*IntegrationTest.java - **/*IntTest.java - - - - - - - - diff --git a/spring-rest-simple/pom.xml b/spring-rest-simple/pom.xml index f5ce46ade4..004c925a8f 100644 --- a/spring-rest-simple/pom.xml +++ b/spring-rest-simple/pom.xml @@ -1,349 +1,339 @@ - 4.0.0 - com.baeldung - spring-rest-simple - 0.1-SNAPSHOT - spring-rest-simple - war + 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-simple + 0.1-SNAPSHOT + spring-rest-simple + war - - parent-boot-1 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-1 - + + parent-boot-1 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-1 + - + - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-devtools - - - org.springframework.boot - spring-boot-starter-test - test - + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-devtools + + + org.springframework.boot + spring-boot-starter-test + test + - - - org.springframework - spring-web - - - commons-logging - commons-logging - - - - - org.springframework - spring-webmvc - - - org.springframework - spring-oxm - - - commons-fileupload - commons-fileupload - ${commons-fileupload.version} - - + + + org.springframework + spring-web + + + commons-logging + commons-logging + + + + + org.springframework + spring-webmvc + + + org.springframework + spring-oxm + + + commons-fileupload + commons-fileupload + ${commons-fileupload.version} + + - - javax.servlet - javax.servlet-api - provided - - - javax.servlet - jstl - runtime - + + javax.servlet + javax.servlet-api + provided + + + javax.servlet + jstl + runtime + - + - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.dataformat - jackson-dataformat-xml - - - com.thoughtworks.xstream - xstream - ${xstream.version} - + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + + + com.thoughtworks.xstream + xstream + ${xstream.version} + - + - - com.google.guava - guava - ${guava.version} - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - + + com.google.guava + guava + ${guava.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + - + - - org.slf4j - slf4j-api - - - ch.qos.logback - logback-classic - - - - org.slf4j - jcl-over-slf4j - - + + org.slf4j + slf4j-api + + + ch.qos.logback + logback-classic + + + + org.slf4j + jcl-over-slf4j + + - + - - com.squareup.okhttp3 - okhttp - ${com.squareup.okhttp3.version} - + + com.squareup.okhttp3 + okhttp + ${com.squareup.okhttp3.version} + - + - - junit - junit - test - - - org.hamcrest - hamcrest-core - test - - - org.hamcrest - hamcrest-library - test - - - org.mockito - mockito-core - test - - - org.springframework - spring-test - - - com.jayway.restassured - rest-assured - ${jayway-rest-assured.version} - - - com.google.protobuf - protobuf-java - ${protobuf-java.version} - - - com.googlecode.protobuf-java-format - protobuf-java-format - ${protobuf-java-format.version} - - - com.esotericsoftware - kryo - ${kryo.version} - - - com.jayway.jsonpath - json-path - - + + junit + junit + test + + + org.hamcrest + hamcrest-core + test + + + org.hamcrest + hamcrest-library + test + + + org.mockito + mockito-core + test + + + org.springframework + spring-test + + + com.jayway.restassured + rest-assured + ${jayway-rest-assured.version} + + + com.google.protobuf + protobuf-java + ${protobuf-java.version} + + + com.googlecode.protobuf-java-format + protobuf-java-format + ${protobuf-java-format.version} + + + com.esotericsoftware + kryo + ${kryo.version} + + + com.jayway.jsonpath + json-path + + - - spring-rest - - - src/main/resources - true - - - + + spring-rest + + + src/main/resources + true + + + + + org.codehaus.cargo + cargo-maven2-plugin + ${cargo-maven2-plugin.version} + + + + tomcat8x + embedded + + + + + + + 8082 + + + + + + - - org.apache.maven.plugins - maven-compiler-plugin - 3.7.0 - - 1.8 - 1.8 - - - - org.apache.maven.plugins - maven-war-plugin - - - org.apache.maven.plugins - maven-surefire-plugin - - 3 - true - - **/*IntegrationTest.java - **/*IntTest.java - **/*LongRunningUnitTest.java - **/*ManualTest.java - **/JdbcTest.java - **/*LiveTest.java - - - - - org.codehaus.cargo - cargo-maven2-plugin - ${cargo-maven2-plugin.version} - - - - tomcat8x - embedded - - - - - - - 8082 - - - - - - + + + integration + + + + org.codehaus.cargo + cargo-maven2-plugin + + + start-server + pre-integration-test + + start + + + + stop-server + post-integration-test + + stop + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + none + + + **/*IntegrationTest.java + **/*IntTest.java + + + + + + + + + + + live + + + + org.codehaus.cargo + cargo-maven2-plugin + + + start-server + pre-integration-test + + start + + + + stop-server + post-integration-test + + stop + + + + - - - integration - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - none - - - **/*IntegrationTest.java - **/*IntTest.java - - - - - + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + none + + + **/*LiveTest.java + + + cargo + + + + + - - - - - live - - - - org.codehaus.cargo - cargo-maven2-plugin - - - start-server - pre-integration-test - - start - - - - stop-server - post-integration-test - - stop - - - - + + + + - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - none - - - **/*LiveTest.java - - - cargo - - - - - + + 1.3.3 + 4.0.0 + 1.4 + 3.1.0 + 3.5 + 1.4.9 - - - - + + 20.0 + 2.9.0 - - 1.3.3 - 4.0.0 - 1.4 - 3.1.0 - 3.5 - 1.4.9 + + 1.6.0 + 3.0.4 - - 20.0 - 2.9.0 + + 3.4.1 - - 1.6.0 - 3.0.4 - - - 3.4.1 - - 2.2.0 - + 2.2.0 + diff --git a/spring-rest/pom.xml b/spring-rest/pom.xml index 403ed4cfde..bd17811801 100644 --- a/spring-rest/pom.xml +++ b/spring-rest/pom.xml @@ -1,343 +1,305 @@ - 4.0.0 - com.baeldung - spring-rest - 0.1-SNAPSHOT - spring-rest - war + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + spring-rest + 0.1-SNAPSHOT + spring-rest + war - - parent-boot-2 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-2 - + + parent-boot-2 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-2 + - + - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-devtools - - - org.springframework.boot - spring-boot-starter-test - + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-devtools + + + org.springframework.boot + spring-boot-starter-test + - - - org.springframework - spring-web - - - commons-logging - commons-logging - - - - - org.springframework - spring-webmvc - - - org.springframework - spring-oxm - - - commons-fileupload - commons-fileupload - ${commons-fileupload.version} - + + + org.springframework + spring-web + + + commons-logging + commons-logging + + + + + org.springframework + spring-webmvc + + + org.springframework + spring-oxm + + + commons-fileupload + commons-fileupload + ${commons-fileupload.version} + - - - javax.servlet - javax.servlet-api - provided - + + + javax.servlet + javax.servlet-api + provided + - - javax.servlet - jstl - runtime - + + javax.servlet + jstl + runtime + - - - com.fasterxml.jackson.core - jackson-databind - + + + com.fasterxml.jackson.core + jackson-databind + - - com.fasterxml.jackson.dataformat - jackson-dataformat-xml - + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + - - com.thoughtworks.xstream - xstream - ${xstream.version} - + + com.thoughtworks.xstream + xstream + ${xstream.version} + - - - com.google.guava - guava - ${guava.version} - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - + + + com.google.guava + guava + ${guava.version} + + + org.apache.commons + commons-lang3 + - - - com.squareup.okhttp3 - okhttp - ${com.squareup.okhttp3.version} - + + + com.squareup.okhttp3 + okhttp + ${com.squareup.okhttp3.version} + - - - org.hamcrest - hamcrest-core - test - - - org.hamcrest - hamcrest-library - test - - - org.mockito - mockito-core - test - - - org.springframework - spring-test - + + + org.hamcrest + hamcrest-core + test + + + org.hamcrest + hamcrest-library + test + + + org.mockito + mockito-core + test + + + org.springframework + spring-test + - - - com.google.protobuf - protobuf-java - ${protobuf-java.version} - - - com.googlecode.protobuf-java-format - protobuf-java-format - ${protobuf-java-format.version} - - - com.esotericsoftware - kryo - ${kryo.version} - - - com.jayway.jsonpath - json-path - + + + com.google.protobuf + protobuf-java + ${protobuf-java.version} + + + com.googlecode.protobuf-java-format + protobuf-java-format + ${protobuf-java-format.version} + + + com.esotericsoftware + kryo + ${kryo.version} + + + com.jayway.jsonpath + json-path + - - - commons-io - commons-io - 2.4 - - - au.com.dius - pact-jvm-provider-junit_2.11 - ${pact.version} - - - io.rest-assured - rest-assured - ${rest-assured.version} - + + + commons-io + commons-io + 2.4 + + + au.com.dius + pact-jvm-provider-junit_2.11 + ${pact.version} + + + io.rest-assured + rest-assured + - + - - spring-rest - - - src/main/resources - true - - + + spring-rest + + + src/main/resources + true + + - - - org.springframework.boot - spring-boot-maven-plugin - - true - - - - org.apache.maven.plugins - maven-war-plugin - - - org.codehaus.cargo - cargo-maven2-plugin - ${cargo-maven2-plugin.version} - - - tomcat8x - embedded - - - - - - - 8082 - - - - - - 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 - **/*IntTest.java - **/*LongRunningUnitTest.java - **/*ManualTest.java - **/*LiveTest.java - - - - + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + org.apache.maven.plugins + maven-war-plugin + + + org.apache.maven.plugins + maven-checkstyle-plugin + ${checkstyle-maven-plugin.version} + + checkstyle.xml + + + + + check + + + + + + - + + + live + + + + org.codehaus.cargo + cargo-maven2-plugin + + + start-server + pre-integration-test + + start + + + + stop-server + post-integration-test + + stop + + + + - - - live - - - - org.codehaus.cargo - cargo-maven2-plugin - - - start-server - pre-integration-test - - start - - - - stop-server - post-integration-test - - stop - - - - + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + none + + + **/*LiveTest.java + + + cargo + + + + + - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - none - - - **/*LiveTest.java - - - cargo - - - - - + + + - - - + - + + + + org.apache.maven.plugins + maven-checkstyle-plugin + ${checkstyle-maven-plugin.version} + + checkstyle.xml + + + + - - - - org.apache.maven.plugins - maven-checkstyle-plugin - ${checkstyle-maven-plugin.version} - - checkstyle.xml - - - - + + 1.3.2 + 4.0.0 + 1.4 + 3.1.0 + 3.5 + 1.4.9 - - 1.3.2 - 4.0.0 - 1.4 - 3.1.0 - 3.5 - 1.4.9 + + 20.0 - - 20.0 + + 1.6.0 + 3.0.4 + 3.0.0 + false + + 3.4.1 - - 1.6.0 - 3.0.4 - 3.0.0 - false - - 3.4.1 - - 2.2.0 - 3.5.11 - 3.1.0 - + 2.2.0 + 3.5.11 + 3.1.0 + From 991335da4227e4eaca4409ac4e77e0277d837f68 Mon Sep 17 00:00:00 2001 From: the-java-guy <39062630+the-java-guy@users.noreply.github.com> Date: Tue, 28 Aug 2018 18:53:01 +0530 Subject: [PATCH 041/128] BAEL-1782 (#5067) * Bean Object, server side and client side example for event streaming example * BAEL-1628 Access a File from the Classpath in a Spring Application * inputstream retrieval added * Removed files related to evaluation article * + Aligning code to the article. Removed Utility methods and classes * Precommit fix * PMD fixes * Code Review changes Refactored : whenResourceUtils_thenReadSuccessful * BAEL-1934 * +indentation correction in pom.xml * synced with master * Precommit : rebase * 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 d635b3b05f1d8984e43aa11fd708f183b5a39ce6 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Tue, 28 Aug 2018 20:28:13 +0530 Subject: [PATCH 042/128] BAEL-8504 Fix surefire configs of spring-5 projects part 2 - Disabled surefire configs, will be controlled by parent pom.xml --- jhipster/jhipster-monolithic/pom.xml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/jhipster/jhipster-monolithic/pom.xml b/jhipster/jhipster-monolithic/pom.xml index 7dd12eb11d..24956745e4 100644 --- a/jhipster/jhipster-monolithic/pom.xml +++ b/jhipster/jhipster-monolithic/pom.xml @@ -487,17 +487,6 @@ - - org.apache.maven.plugins - maven-surefire-plugin - - - alphabetical - - **/*IntTest.java - - - org.jacoco jacoco-maven-plugin From b2644c5cfcf112f548fa3766207aa168a152bc7d Mon Sep 17 00:00:00 2001 From: Denis Date: Tue, 28 Aug 2018 17:28:41 +0200 Subject: [PATCH 043/128] BAEL-2144 sort string alphabetically --- .../string/anagram/AnagramValidator.java | 29 +++++++++++++++++ .../string/AnagramValidatorUnitTest.java | 26 ++++++++++++++++ .../sorting/string/SortStringUnitTest.java | 31 +++++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/sorting/string/anagram/AnagramValidator.java create mode 100644 core-java/src/test/java/org/baeldung/java/sorting/string/AnagramValidatorUnitTest.java create mode 100644 core-java/src/test/java/org/baeldung/java/sorting/string/SortStringUnitTest.java diff --git a/core-java/src/main/java/com/baeldung/sorting/string/anagram/AnagramValidator.java b/core-java/src/main/java/com/baeldung/sorting/string/anagram/AnagramValidator.java new file mode 100644 index 0000000000..a12571b2e2 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/sorting/string/anagram/AnagramValidator.java @@ -0,0 +1,29 @@ +package com.baeldung.sorting.string.anagram; + +import java.util.Arrays; + +public class AnagramValidator { + + public static boolean isValid(String text, String anagram) { + text = prepare(text); + anagram = prepare(anagram); + + String sortedText = sort(text); + String sortedAnagram = sort(anagram); + + return sortedText.equals(sortedAnagram); + } + + private static String sort(String text) { + char[] chars = prepare(text).toCharArray(); + + Arrays.sort(chars); + return new String(chars); + } + + private static String prepare(String text) { + return text.toLowerCase() + .trim() + .replaceAll("\\s+", ""); + } +} \ No newline at end of file diff --git a/core-java/src/test/java/org/baeldung/java/sorting/string/AnagramValidatorUnitTest.java b/core-java/src/test/java/org/baeldung/java/sorting/string/AnagramValidatorUnitTest.java new file mode 100644 index 0000000000..7759e929ae --- /dev/null +++ b/core-java/src/test/java/org/baeldung/java/sorting/string/AnagramValidatorUnitTest.java @@ -0,0 +1,26 @@ +package org.baeldung.java.sorting.string; + + +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; + +import org.junit.jupiter.api.Test; + +import com.baeldung.sorting.string.anagram.AnagramValidator; + +class AnagramValidatorUnitTest { + + @Test + void givenValidAnagrams_whenSorted_thenEqual() { + boolean isValidAnagram = AnagramValidator.isValid("Avida Dollars", "Salvador Dali"); + + assertTrue(isValidAnagram); + } + + @Test + void givenNotValidAnagrams_whenSorted_thenNotEqual() { + boolean isValidAnagram = AnagramValidator.isValid("abc", "def"); + + assertFalse(isValidAnagram); + } +} diff --git a/core-java/src/test/java/org/baeldung/java/sorting/string/SortStringUnitTest.java b/core-java/src/test/java/org/baeldung/java/sorting/string/SortStringUnitTest.java new file mode 100644 index 0000000000..73fd29f0d3 --- /dev/null +++ b/core-java/src/test/java/org/baeldung/java/sorting/string/SortStringUnitTest.java @@ -0,0 +1,31 @@ +package org.baeldung.java.sorting.string; + +import java.util.Arrays; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class SortStringUnitTest { + + @Test + void givenString_whenSort_thenSorted() { + String abcd = "bdca"; + char[] chars = abcd.toCharArray(); + + Arrays.sort(chars); + String sorted = new String(chars); + + assertThat(sorted).isEqualTo("abcd"); + } + + @Test + void givenString_whenSortJava8_thenSorted() { + String sorted = "bdca".chars() + .sorted() + .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) + .toString(); + + assertThat(sorted).isEqualTo("abcd"); + } +} From 8a65afeb5d39a95e0b31f90cb4530a36c305f7d3 Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Tue, 28 Aug 2018 16:57:52 +0100 Subject: [PATCH 044/128] BAEL:2033 - Stream-ordering files moved to the Java-Streams module (#5097) * Added stream-ordering files * Removed old files * Rename core-java-8/src/test/java/com/baeldung/streamordering/BenchmarkUnitTest.java to java-streams/src/test/java/com/baeldung/streamordering/BenchmarkUnitTest.java * Rename core-java-8/src/test/java/com/baeldung/streamordering/StreamsOrderingUnitTest.java to java-streams/src/test/com/baeldung/streamordering/StreamsOrderingUnitTest.java * Rename java-streams/src/test/com/baeldung/streamordering/StreamsOrderingUnitTest.java to java-streams/src/test/java/com/baeldung/streamordering/StreamsOrderingUnitTest.java * Updated Pom with JMH dependencies --- java-streams/pom.xml | 13 ++ .../streamordering/BenchmarkUnitTest.java | 97 ++++++++++++ .../StreamsOrderingUnitTest.java | 149 ++++++++++++++++++ 3 files changed, 259 insertions(+) create mode 100644 java-streams/src/test/java/com/baeldung/streamordering/BenchmarkUnitTest.java create mode 100644 java-streams/src/test/java/com/baeldung/streamordering/StreamsOrderingUnitTest.java diff --git a/java-streams/pom.xml b/java-streams/pom.xml index 351c33ecc0..75914f0247 100644 --- a/java-streams/pom.xml +++ b/java-streams/pom.xml @@ -15,6 +15,18 @@ + + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + provided + org.apache.commons commons-lang3 @@ -107,6 +119,7 @@ + 1.21 3.5 1.16.12 0.9.0 diff --git a/java-streams/src/test/java/com/baeldung/streamordering/BenchmarkUnitTest.java b/java-streams/src/test/java/com/baeldung/streamordering/BenchmarkUnitTest.java new file mode 100644 index 0000000000..9ae0a16514 --- /dev/null +++ b/java-streams/src/test/java/com/baeldung/streamordering/BenchmarkUnitTest.java @@ -0,0 +1,97 @@ +package com.baeldung.streamordering; + +import org.junit.Test; +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.infra.Blackhole; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; +import org.openjdk.jmh.runner.options.TimeValue; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.concurrent.TimeUnit; +import java.util.stream.IntStream; + + +public class BenchmarkUnitTest +{ + + @Test + public void + launchBenchmark() throws Exception { + + Options opt = new OptionsBuilder() + // Specify which benchmarks to run. + // You can be more specific if you'd like to run only one benchmark per test. + .include(this.getClass().getName() + ".*") + // Set the following options as needed + .mode (Mode.AverageTime) + .timeUnit(TimeUnit.MICROSECONDS) + .warmupTime(TimeValue.seconds(1)) + .warmupIterations(2) + .measurementTime(TimeValue.seconds(1)) + .measurementIterations(2) + .threads(2) + .forks(1) + .shouldFailOnError(true) + .shouldDoGC(true) + //.jvmArgs("-XX:+UnlockDiagnosticVMOptions", "-XX:+PrintInlining") + //.addProfiler(WinPerfAsmProfiler.class) + .build(); + + new Runner(opt).run(); + + + } + + @Benchmark + public void givenOrderedStreamInput_whenStreamFiltered_showOpsPerMS(){ + IntStream.range(1, 100_000_000).parallel().filter(i -> i % 10 == 0).toArray(); + } + + @Benchmark + public void givenUnorderedStreamInput_whenStreamFiltered_showOpsPerMS(){ + IntStream.range(1,100_000_000).unordered().parallel().filter(i -> i % 10 == 0).toArray(); + } + + @Benchmark + public void givenUnorderedStreamInput_whenStreamDistinct_showOpsPerMS(){ + IntStream.range(1, 1_000_000).unordered().parallel().distinct().toArray(); + } + + @Benchmark + public void givenOrderedStreamInput_whenStreamDistinct_showOpsPerMS() { + //section 5.1. + IntStream.range(1, 1_000_000).parallel().distinct().toArray(); + } + + + // The JMH samples are the best documentation for how to use it + // http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/ + @State(Scope.Thread) + public static class BenchmarkState + { + List list; + + @Setup(Level.Trial) public void + initialize() { + + Random rand = new Random(); + + list = new ArrayList<>(); + for (int i = 0; i < 1000; i++) + list.add (rand.nextInt()); + } + } + + @Benchmark public void + benchmark1 (BenchmarkState state, Blackhole bh) { + + List list = state.list; + + for (int i = 0; i < 1000; i++) + bh.consume (list.get (i)); + } +} diff --git a/java-streams/src/test/java/com/baeldung/streamordering/StreamsOrderingUnitTest.java b/java-streams/src/test/java/com/baeldung/streamordering/StreamsOrderingUnitTest.java new file mode 100644 index 0000000000..43a233d353 --- /dev/null +++ b/java-streams/src/test/java/com/baeldung/streamordering/StreamsOrderingUnitTest.java @@ -0,0 +1,149 @@ +package com.baeldung.streamordering; + +import org.junit.Before; +import org.junit.Test; + +import java.util.*; +import java.util.function.Function; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import static org.junit.Assert.assertEquals; + +public class StreamsOrderingUnitTest { + + Logger logger = Logger.getLogger( StreamsOrderingUnitTest.class.getName()); + + @Before + public void setUp() throws Exception { + logger.setLevel(Level.ALL); + } + + @Test + public void givenTwoCollections_whenStreamed_thenCheckOutputDifferent(){ + + List list = Arrays.asList("B", "A", "C", "D", "F"); + Set set = new TreeSet<>(Arrays.asList("B", "A", "C", "D", "F")); + + Object[] listOutput = list.stream().toArray(); + Object[] setOutput = set.stream().toArray(); + + assertEquals("[B, A, C, D, F]", Arrays.toString(listOutput)); + assertEquals("[A, B, C, D, F]", Arrays.toString(setOutput)); + + } + + @Test + public void givenTwoCollections_whenStreamedInParallel_thenCheckOutputDifferent(){ + + List list = Arrays.asList("B", "A", "C", "D", "F"); + Set set = new TreeSet<>(Arrays.asList("B", "A", "C", "D", "F")); + + Object[] listOutput = list.stream().parallel().toArray(); + Object[] setOutput = set.stream().parallel().toArray(); + + assertEquals("[B, A, C, D, F]", Arrays.toString(listOutput)); + assertEquals("[A, B, C, D, F]", Arrays.toString(setOutput)); + + } + + + + @Test + public void givenOrderedInput_whenUnorderedAndOrderedCompared_thenCheckUnorderedOutputChanges(){ + Set set = new TreeSet<>( + Arrays.asList(-9, -5, -4, -2, 1, 2, 4, 5, 7, 9, 12, 13, 16, 29, 23, 34, 57, 68, 90, 102, 230)); + + Object[] orderedArray = set.stream() + .parallel() + .limit(5) + .toArray(); + Object[] unorderedArray = set.stream() + .unordered() + .parallel() + .limit(5) + .toArray(); + + logger.info(Arrays.toString(orderedArray)); + logger.info(Arrays.toString(unorderedArray)); + } + + + @Test + public void givenUnsortedStreamInput_whenStreamSorted_thenCheckOrderChanged(){ + + List list = Arrays.asList(-3,10,-4,1,3); + + Object[] listOutput = list.stream().toArray(); + Object[] listOutputSorted = list.stream().sorted().toArray(); + + assertEquals("[-3, 10, -4, 1, 3]", Arrays.toString(listOutput)); + assertEquals("[-4, -3, 1, 3, 10]", Arrays.toString(listOutputSorted)); + + } + + @Test + public void givenUnsortedStreamInput_whenStreamDistinct_thenShowTimeTaken(){ + long start, end; + start = System.currentTimeMillis(); + IntStream.range(1,1_000_000).unordered().parallel().distinct().toArray(); + end = System.currentTimeMillis(); + System.out.println(String.format("Time taken when unordered: %d ms", (end - start))); + } + + + @Test + public void givenSameCollection_whenStreamTerminated_thenCheckEachVsEachOrdered(){ + + List list = Arrays.asList("B", "A", "C", "D", "F"); + + list.stream().parallel().forEach(e -> logger.log(Level.INFO, e)); + list.stream().parallel().forEachOrdered(e -> logger.log(Level.INFO, e)); + + } + + @Test + public void givenSameCollection_whenStreamCollected_thenCheckOutput(){ + + List list = Arrays.asList("B", "A", "C", "D", "F"); + + List collectionList = list.stream().parallel().collect(Collectors.toList()); + Set collectionSet = list.stream().parallel().collect(Collectors.toCollection(TreeSet::new)); + + assertEquals("[B, A, C, D, F]", collectionList.toString()); + assertEquals("[A, B, C, D, F]", collectionSet.toString()); + + } + + + @Test + public void givenListIterationOrder_whenStreamCollectedToMap_thenCeckOrderChanged() { + List list = Arrays.asList("A", "BB", "CCC"); + + Map hashMap = list.stream().collect(Collectors.toMap(Function.identity(), String::length)); + + Object[] keySet = hashMap.keySet().toArray(); + + assertEquals("[BB, A, CCC]", Arrays.toString(keySet)); + + } + + @Test + public void givenListIteration_whenStreamCollectedtoHashMap_thenCheckOrderMaintained() { + List list = Arrays.asList("A", "BB", "CCC", "CCC"); + + Map linkedHashMap = list.stream().collect(Collectors.toMap( + Function.identity(), + String::length, + (u, v) -> u, + LinkedHashMap::new + )); + + Object[] keySet = linkedHashMap.keySet().toArray(); + + assertEquals("[A, BB, CCC]", Arrays.toString(keySet)); + } + +} From db3e47c4988395877900be121d8710f81d541b69 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Tue, 28 Aug 2018 23:47:20 +0530 Subject: [PATCH 045/128] BAEL-8504 Fix surefire configs of spring-5 projects part 2 - Disable invocation of testsuite in default profile --- spring-rest-full/pom.xml | 613 ++++++++++++++++++++------------------- 1 file changed, 315 insertions(+), 298 deletions(-) diff --git a/spring-rest-full/pom.xml b/spring-rest-full/pom.xml index 4d328361ca..baa1ebf51a 100644 --- a/spring-rest-full/pom.xml +++ b/spring-rest-full/pom.xml @@ -1,327 +1,344 @@ - 4.0.0 - com.baeldung - spring-rest-full - 0.1-SNAPSHOT - spring-rest-full - war + 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-full + 0.1-SNAPSHOT + spring-rest-full + war - - parent-boot-1 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-1 - + + parent-boot-1 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-1 + - + - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-actuator - - - org.aspectj - aspectjweaver - - - org.apache.tomcat.embed - tomcat-embed-jasper - provided - + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-actuator + + + org.aspectj + aspectjweaver + + + org.apache.tomcat.embed + tomcat-embed-jasper + provided + - + - - org.springframework - spring-core - - - commons-logging - commons-logging - - - - - org.springframework - spring-context - - - org.springframework - spring-jdbc - - - org.springframework - spring-beans - - - org.springframework - spring-aop - - - org.springframework - spring-tx - - - org.springframework - spring-expression - - - org.springframework - spring-web - - - org.springframework - spring-webmvc - - - org.springframework.data - spring-data-commons - + + org.springframework + spring-core + + + commons-logging + commons-logging + + + + + org.springframework + spring-context + + + org.springframework + spring-jdbc + + + org.springframework + spring-beans + + + org.springframework + spring-aop + + + org.springframework + spring-tx + + + org.springframework + spring-expression + + + org.springframework + spring-web + + + org.springframework + spring-webmvc + + + org.springframework.data + spring-data-commons + - + - - org.springframework.boot - spring-boot-starter-tomcat - + + org.springframework.boot + spring-boot-starter-tomcat + - + - - org.apache.httpcomponents - httpclient - - - commons-logging - commons-logging - - - - - org.apache.httpcomponents - httpcore - + + org.apache.httpcomponents + httpclient + + + commons-logging + commons-logging + + + + + org.apache.httpcomponents + httpcore + - + - - org.springframework - spring-orm - - - org.springframework.data - spring-data-jpa - - - org.hibernate - hibernate-entitymanager - - - xml-apis - xml-apis - - - org.javassist - javassist - - - mysql - mysql-connector-java - runtime - - - com.h2database - h2 - + + org.springframework + spring-orm + + + org.springframework.data + spring-data-jpa + + + org.hibernate + hibernate-entitymanager + + + xml-apis + xml-apis + + + org.javassist + javassist + + + mysql + mysql-connector-java + runtime + + + com.h2database + h2 + - + - - javax.servlet - javax.servlet-api - provided - - - javax.servlet - jstl - runtime - + + javax.servlet + javax.servlet-api + provided + + + javax.servlet + jstl + runtime + - - - com.fasterxml.jackson.core - jackson-databind - - - com.thoughtworks.xstream - xstream - ${xstream.version} - + + + com.fasterxml.jackson.core + jackson-databind + + + com.thoughtworks.xstream + xstream + ${xstream.version} + - + - - com.google.guava - guava - ${guava.version} - + + com.google.guava + guava + ${guava.version} + - + - - org.springframework - spring-test - test - + + org.springframework + spring-test + test + - - - - - - - org.hamcrest - hamcrest-library - test - + + + + + + + org.hamcrest + hamcrest-library + test + - - org.mockito - mockito-core - test - + + org.mockito + mockito-core + test + - + - - spring-rest-full - - - src/main/resources - true - - - - - org.apache.maven.plugins - maven-war-plugin - - - org.codehaus.cargo - cargo-maven2-plugin - ${cargo-maven2-plugin.version} - - true - - jetty8x - embedded - - - - - - - 8082 - - - - - - - com.mysema.maven - apt-maven-plugin - ${apt-maven-plugin.version} - - - - process - - - target/generated-sources/java - com.querydsl.apt.jpa.JPAAnnotationProcessor - - - - - - + + spring-rest-full + + + src/main/resources + true + + + + + org.apache.maven.plugins + maven-war-plugin + + + + org.apache.maven.plugins + maven-surefire-plugin + + 3 + true + + **/*IntegrationTest.java + **/*IntTest.java + **/*LongRunningUnitTest.java + **/*ManualTest.java + **/*LiveTest.java + **/*TestSuite.java + + + + + org.codehaus.cargo + cargo-maven2-plugin + ${cargo-maven2-plugin.version} + + true + + jetty8x + embedded + + + + + + + 8082 + + + + + + + com.mysema.maven + apt-maven-plugin + ${apt-maven-plugin.version} + + + + process + + + target/generated-sources/java + com.querydsl.apt.jpa.JPAAnnotationProcessor + + + + + + - - - live - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - **/*IntegrationTest.java - **/*IntTest.java - - - **/*LiveTest.java - - - - - - - json - - - - - org.codehaus.cargo - cargo-maven2-plugin - - false - - - - start-server - pre-integration-test - - start - - - - stop-server - post-integration-test - - stop - - - - - - - - + + + live + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*IntegrationTest.java + **/*IntTest.java + + + **/*LiveTest.java + + + + + + + json + + + + + org.codehaus.cargo + cargo-maven2-plugin + + false + + + + start-server + pre-integration-test + + start + + + + stop-server + post-integration-test + + stop + + + + + + + + - - - 1.4.9 + + + 1.4.9 - - 19.0 - 3.5 + + 19.0 + 3.5 - - 1.6.1 - 1.1.3 - + + 1.6.1 + 1.1.3 + \ No newline at end of file From 3443953123b45e55a2d0c1f1a1eb2cc8fcee7def Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 29 Aug 2018 00:14:21 +0530 Subject: [PATCH 046/128] BAEL-8504 Fix surefire configs of spring-5 projects part 2 - Fixed hierarchy for spring-ejb modules --- spring-ejb/pom.xml | 7 ++++--- spring-ejb/spring-ejb-client/pom.xml | 9 +++------ 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/spring-ejb/pom.xml b/spring-ejb/pom.xml index c034405cc6..e0db9ff104 100755 --- a/spring-ejb/pom.xml +++ b/spring-ejb/pom.xml @@ -9,10 +9,11 @@ ejb Spring EJB Tutorial - + com.baeldung - parent-modules - 1.0.0-SNAPSHOT + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 diff --git a/spring-ejb/spring-ejb-client/pom.xml b/spring-ejb/spring-ejb-client/pom.xml index c935e1f14a..8e96ed1b1b 100644 --- a/spring-ejb/spring-ejb-client/pom.xml +++ b/spring-ejb/spring-ejb-client/pom.xml @@ -10,10 +10,9 @@ Spring EJB Client - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../../parent-boot-2 + com.baeldung.spring.ejb + ejb-for-spring + 1.0.1 @@ -25,14 +24,12 @@ org.wildfly wildfly-ejb-client-bom - ${wildfly-ejb.version} pom com.baeldung.spring.ejb ejb-remote-for-spring - ${ejb-remote-for-spring.version} ejb From 1c455d1c1cbd6b19e67efd06992a1a246a4334a0 Mon Sep 17 00:00:00 2001 From: Eugen Date: Wed, 29 Aug 2018 00:44:58 +0300 Subject: [PATCH 047/128] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d018783465..d20968b455 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ The "REST with Spring" Classes ============================== -After 5 months of work, here's the Master Class of REST With Spring:
+Here's the Master Class of REST With Spring (price changes permanently next Friday):
**[>> THE REST WITH SPRING MASTER CLASS](http://www.baeldung.com/rest-with-spring-course?utm_source=github&utm_medium=social&utm_content=tutorials&utm_campaign=rws#master-class)** And here's the Master Class of Learn Spring Security:
From dd5daf56cc687d52c7d2333c48baad137d379881 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 29 Aug 2018 10:33:18 +0530 Subject: [PATCH 048/128] BAEL-8504 Fix surefire configs - Reverted changes for spring-ejb* projects --- spring-ejb/pom.xml | 7 +++---- spring-ejb/spring-ejb-client/pom.xml | 9 ++++++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/spring-ejb/pom.xml b/spring-ejb/pom.xml index e0db9ff104..c034405cc6 100755 --- a/spring-ejb/pom.xml +++ b/spring-ejb/pom.xml @@ -9,11 +9,10 @@ ejb Spring EJB Tutorial - + com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../../parent-boot-2 + parent-modules + 1.0.0-SNAPSHOT diff --git a/spring-ejb/spring-ejb-client/pom.xml b/spring-ejb/spring-ejb-client/pom.xml index 8e96ed1b1b..c935e1f14a 100644 --- a/spring-ejb/spring-ejb-client/pom.xml +++ b/spring-ejb/spring-ejb-client/pom.xml @@ -10,9 +10,10 @@ Spring EJB Client - com.baeldung.spring.ejb - ejb-for-spring - 1.0.1 + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 @@ -24,12 +25,14 @@ org.wildfly wildfly-ejb-client-bom + ${wildfly-ejb.version} pom com.baeldung.spring.ejb ejb-remote-for-spring + ${ejb-remote-for-spring.version} ejb From 163585858bc18df77435aecc02782d7c373e41bd Mon Sep 17 00:00:00 2001 From: fanatixan Date: Wed, 29 Aug 2018 07:39:01 +0200 Subject: [PATCH 049/128] Use Criteria Queries in a Spring Data Application (#5014) * Use Criteria Queries in a Spring Data Application * formatting fix * making the workflow more readable --- .../criteria/dao/BookRepositoryImpl.java | 46 +++++++++++++++++++ .../persistence/criteria/model/Book.java | 36 +++++++++++++++ .../criteria/repository/BookRepository.java | 9 ++++ .../repository/BookRepositoryCustom.java | 11 +++++ .../criteria/repository/BookService.java | 25 ++++++++++ .../repository/BookSpecifications.java | 16 +++++++ 6 files changed, 143 insertions(+) create mode 100644 persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/criteria/dao/BookRepositoryImpl.java create mode 100644 persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/criteria/model/Book.java create mode 100644 persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/criteria/repository/BookRepository.java create mode 100644 persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/criteria/repository/BookRepositoryCustom.java create mode 100644 persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/criteria/repository/BookService.java create mode 100644 persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/criteria/repository/BookSpecifications.java diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/criteria/dao/BookRepositoryImpl.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/criteria/dao/BookRepositoryImpl.java new file mode 100644 index 0000000000..f782d69e1e --- /dev/null +++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/criteria/dao/BookRepositoryImpl.java @@ -0,0 +1,46 @@ +package org.baeldung.persistence.criteria.dao; + +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; + +import org.baeldung.persistence.criteria.model.Book; +import org.baeldung.persistence.criteria.repository.BookRepositoryCustom; +import org.springframework.stereotype.Repository; + +@Repository +public class BookRepositoryImpl implements BookRepositoryCustom { + + private EntityManager em; + + public BookRepositoryImpl(EntityManager em) { + this.em = em; + } + + @Override + public List findBooksByAuthorNameAndTitle(String authorName, String title) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Book.class); + + Root book = cq.from(Book.class); + List predicates = new ArrayList<>(); + + if (authorName != null) { + predicates.add(cb.equal(book.get("author"), authorName)); + } + if (title != null) { + predicates.add(cb.like(book.get("title"), "%" + title + "%")); + } + cq.where(predicates.toArray(new Predicate[0])); + + TypedQuery query = em.createQuery(cq); + return query.getResultList(); + } + +} diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/criteria/model/Book.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/criteria/model/Book.java new file mode 100644 index 0000000000..beb6c0190c --- /dev/null +++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/criteria/model/Book.java @@ -0,0 +1,36 @@ +package org.baeldung.persistence.criteria.model; + +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class Book { + + @Id + private Long id; + + private String title; + + private String author; + + public Long getId() { + return id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + +} diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/criteria/repository/BookRepository.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/criteria/repository/BookRepository.java new file mode 100644 index 0000000000..af30ae461e --- /dev/null +++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/criteria/repository/BookRepository.java @@ -0,0 +1,9 @@ +package org.baeldung.persistence.criteria.repository; + +import org.baeldung.persistence.criteria.model.Book; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +public interface BookRepository extends JpaRepository, BookRepositoryCustom, JpaSpecificationExecutor { + +} diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/criteria/repository/BookRepositoryCustom.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/criteria/repository/BookRepositoryCustom.java new file mode 100644 index 0000000000..35330cfa3c --- /dev/null +++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/criteria/repository/BookRepositoryCustom.java @@ -0,0 +1,11 @@ +package org.baeldung.persistence.criteria.repository; + +import java.util.List; + +import org.baeldung.persistence.criteria.model.Book; + +public interface BookRepositoryCustom { + + List findBooksByAuthorNameAndTitle(String authorName, String title); + +} diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/criteria/repository/BookService.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/criteria/repository/BookService.java new file mode 100644 index 0000000000..7b1aff857e --- /dev/null +++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/criteria/repository/BookService.java @@ -0,0 +1,25 @@ +package org.baeldung.persistence.criteria.repository; + +import static org.baeldung.persistence.criteria.repository.BookSpecifications.hasAuthor; +import static org.baeldung.persistence.criteria.repository.BookSpecifications.titleContains; +import static org.springframework.data.jpa.domain.Specifications.where; + +import java.util.List; + +import org.baeldung.persistence.criteria.model.Book; +import org.springframework.stereotype.Service; + +@Service +public class BookService { + + private BookRepository bookRepository; + + public BookService(BookRepository bookRepository) { + this.bookRepository = bookRepository; + } + + public List query(String author, String title) { + return bookRepository.findAll(where(hasAuthor(author)).and(titleContains(title))); + } + +} diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/criteria/repository/BookSpecifications.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/criteria/repository/BookSpecifications.java new file mode 100644 index 0000000000..392b750977 --- /dev/null +++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/criteria/repository/BookSpecifications.java @@ -0,0 +1,16 @@ +package org.baeldung.persistence.criteria.repository; + +import org.baeldung.persistence.criteria.model.Book; +import org.springframework.data.jpa.domain.Specification; + +public class BookSpecifications { + + public static Specification hasAuthor(String author) { + return (book, cq, cb) -> cb.equal(book.get("author"), author); + } + + public static Specification titleContains(String title) { + return (book, cq, cb) -> cb.like(book.get("title"), "%" + title + "%"); + } + +} From 723681fecbcbb19ed9f0d331ba16a18dff3606db Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 29 Aug 2018 14:03:16 +0530 Subject: [PATCH 050/128] BAEL-8773 Fixing spring-ejb-client module - Fixed hierarchy of spring-ejb modules --- pom.xml | 3 +++ spring-ejb/pom.xml | 1 - .../baeldung/springejbclient/SpringEjbClientApplication.java | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ad2f607141..938315f5dc 100644 --- a/pom.xml +++ b/pom.xml @@ -474,6 +474,7 @@ spring-core spring-cucumber spring-ejb + spring-ejb/spring-ejb-client spring-aop persistence-modules/spring-data-cassandra spring-data-couchbase-2 @@ -741,6 +742,7 @@ spring-core spring-cucumber spring-ejb + spring-ejb/spring-ejb-client spring-aop persistence-modules/spring-data-cassandra spring-data-couchbase-2 @@ -1018,6 +1020,7 @@ spring-core spring-cucumber spring-ejb + spring-ejb/spring-ejb-client spring-aop persistence-modules/spring-data-dynamodb diff --git a/spring-ejb/pom.xml b/spring-ejb/pom.xml index c034405cc6..d976bf4bfe 100755 --- a/spring-ejb/pom.xml +++ b/spring-ejb/pom.xml @@ -72,7 +72,6 @@ ejb-remote-for-spring - spring-ejb-client ejb-beans diff --git a/spring-ejb/spring-ejb-client/src/main/java/com/baeldung/springejbclient/SpringEjbClientApplication.java b/spring-ejb/spring-ejb-client/src/main/java/com/baeldung/springejbclient/SpringEjbClientApplication.java index d3542a2158..0a1e389113 100644 --- a/spring-ejb/spring-ejb-client/src/main/java/com/baeldung/springejbclient/SpringEjbClientApplication.java +++ b/spring-ejb/spring-ejb-client/src/main/java/com/baeldung/springejbclient/SpringEjbClientApplication.java @@ -47,4 +47,5 @@ public class SpringEjbClientApplication { public static void main(String[] args) { SpringApplication.run(SpringEjbClientApplication.class, args); } + } From 68aaf0b6dabf8341fe3ee2b17d8ef355a65ce7bd Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 29 Aug 2018 14:03:16 +0530 Subject: [PATCH 051/128] BAEL-8773 Fixing spring-ejb-client module - Fixed hierarchy of spring-ejb modules --- pom.xml | 3 +++ spring-ejb/pom.xml | 1 - .../baeldung/springejbclient/SpringEjbClientApplication.java | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ad2f607141..938315f5dc 100644 --- a/pom.xml +++ b/pom.xml @@ -474,6 +474,7 @@ spring-core spring-cucumber spring-ejb + spring-ejb/spring-ejb-client spring-aop persistence-modules/spring-data-cassandra spring-data-couchbase-2 @@ -741,6 +742,7 @@ spring-core spring-cucumber spring-ejb + spring-ejb/spring-ejb-client spring-aop persistence-modules/spring-data-cassandra spring-data-couchbase-2 @@ -1018,6 +1020,7 @@ spring-core spring-cucumber spring-ejb + spring-ejb/spring-ejb-client spring-aop persistence-modules/spring-data-dynamodb diff --git a/spring-ejb/pom.xml b/spring-ejb/pom.xml index c034405cc6..d976bf4bfe 100755 --- a/spring-ejb/pom.xml +++ b/spring-ejb/pom.xml @@ -72,7 +72,6 @@ ejb-remote-for-spring - spring-ejb-client ejb-beans diff --git a/spring-ejb/spring-ejb-client/src/main/java/com/baeldung/springejbclient/SpringEjbClientApplication.java b/spring-ejb/spring-ejb-client/src/main/java/com/baeldung/springejbclient/SpringEjbClientApplication.java index d3542a2158..0a1e389113 100644 --- a/spring-ejb/spring-ejb-client/src/main/java/com/baeldung/springejbclient/SpringEjbClientApplication.java +++ b/spring-ejb/spring-ejb-client/src/main/java/com/baeldung/springejbclient/SpringEjbClientApplication.java @@ -47,4 +47,5 @@ public class SpringEjbClientApplication { public static void main(String[] args) { SpringApplication.run(SpringEjbClientApplication.class, args); } + } From c4cb6eec7338b33d43740fc69f8941f27e3d9f0d Mon Sep 17 00:00:00 2001 From: Kacper Date: Wed, 29 Aug 2018 15:51:41 +0200 Subject: [PATCH 052/128] Move optional to java-8-core (#5105) --- .../com/baeldung/optional/PersonRepository.java | 9 +++++++++ .../optional}/PersonRepositoryUnitTest.java | 14 ++------------ .../baeldung/throwsexception/PersonRepository.java | 6 ------ 3 files changed, 11 insertions(+), 18 deletions(-) create mode 100644 core-java-8/src/main/java/com/baeldung/optional/PersonRepository.java rename {core-java/src/test/java/com/baeldung/throwsexception => core-java-8/src/test/java/com/baeldung/optional}/PersonRepositoryUnitTest.java (75%) diff --git a/core-java-8/src/main/java/com/baeldung/optional/PersonRepository.java b/core-java-8/src/main/java/com/baeldung/optional/PersonRepository.java new file mode 100644 index 0000000000..46018faf80 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/optional/PersonRepository.java @@ -0,0 +1,9 @@ +package com.baeldung.optional; + +public class PersonRepository { + + public String findNameById(String id) { + return id == null ? null : "Name"; + } + +} diff --git a/core-java/src/test/java/com/baeldung/throwsexception/PersonRepositoryUnitTest.java b/core-java-8/src/test/java/com/baeldung/optional/PersonRepositoryUnitTest.java similarity index 75% rename from core-java/src/test/java/com/baeldung/throwsexception/PersonRepositoryUnitTest.java rename to core-java-8/src/test/java/com/baeldung/optional/PersonRepositoryUnitTest.java index 3749ce10d0..4efa625ccd 100644 --- a/core-java/src/test/java/com/baeldung/throwsexception/PersonRepositoryUnitTest.java +++ b/core-java-8/src/test/java/com/baeldung/optional/PersonRepositoryUnitTest.java @@ -1,11 +1,11 @@ -package com.baeldung.throwsexception; +package com.baeldung.optional; import org.junit.Test; import java.util.Optional; -import static org.junit.Assert.assertEquals; import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; public class PersonRepositoryUnitTest { @@ -40,14 +40,4 @@ public class PersonRepositoryUnitTest { assertEquals("NAME", name); } - @Test - public void whenIdIsNonNull_thenShouldReturnNameUpperCase() throws Exception { - String name = Optional - .ofNullable(personRepository.findNameById("id")) - .map(String::toUpperCase) - .orElseThrow(Exception::new); - - assertEquals("NAME", name); - } - } \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/throwsexception/PersonRepository.java b/core-java/src/main/java/com/baeldung/throwsexception/PersonRepository.java index a3e69b7f6f..7d8345c3c1 100644 --- a/core-java/src/main/java/com/baeldung/throwsexception/PersonRepository.java +++ b/core-java/src/main/java/com/baeldung/throwsexception/PersonRepository.java @@ -1,16 +1,10 @@ package com.baeldung.throwsexception; -import javax.annotation.Nullable; import java.sql.SQLException; import java.util.List; public class PersonRepository { - @Nullable - public String findNameById(String id) { - return id == null ? null : "Name"; - } - public List findAll() throws SQLException { throw new SQLException(); } From 5b3a9c55ee7ce5e67bf707aa93b1fbf59234008e Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 29 Aug 2018 22:46:14 +0530 Subject: [PATCH 053/128] BAEL-8508 Let's upgrade these Jackson articles - Upgraded dependencies in jackson module --- jackson/pom.xml | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/jackson/pom.xml b/jackson/pom.xml index 3fcbca1ebd..9592e11961 100644 --- a/jackson/pom.xml +++ b/jackson/pom.xml @@ -1,7 +1,6 @@ 4.0.0 - com.baeldung jackson 0.1-SNAPSHOT jackson @@ -119,17 +118,16 @@ - 2.9.4 + 2.9.6 - 19.0 - 3.5 - 2.9.6 - 2.8.0 - 4.1 + 3.8 + 2.10 + 2.8.5 + 4.2 - 3.0.1 - 3.6.1 + 3.1.1 + 3.11.0 From 4bc6dcad27a2f4b56c6c6913fb38f0c7778d7d3f Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 30 Aug 2018 00:15:26 +0530 Subject: [PATCH 054/128] BAEL-8507 Merge spring-data-spring-security into another appropriate module - Removed project spring-data-spring-security and moved its content in spring-security-mvc-boot --- spring-data-spring-security/README.md | 14 ---- spring-data-spring-security/pom.xml | 64 ------------------- .../src/main/resources/application.properties | 0 .../src/main/resources/logback.xml | 13 ---- spring-security-mvc-boot/README.MD | 1 + spring-security-mvc-boot/pom.xml | 4 ++ .../src/main/java/com/baeldung/AppConfig.java | 0 .../com/baeldung/SpringSecurityConfig.java | 0 .../data/repositories/TweetRepository.java | 0 .../data/repositories/UserRepository.java | 0 .../java/com/baeldung/models/AppUser.java | 0 .../main/java/com/baeldung/models/Tweet.java | 0 .../baeldung/security/AppUserPrincipal.java | 0 .../AuthenticationSuccessHandlerImpl.java | 0 .../security/CustomUserDetailsService.java | 0 .../com/baeldung/util/DummyContentUtil.java | 0 .../main/resources/persistence-h2.properties | 0 .../SpringDataWithSecurityUnitTest.java | 6 +- 18 files changed, 8 insertions(+), 94 deletions(-) delete mode 100644 spring-data-spring-security/README.md delete mode 100644 spring-data-spring-security/pom.xml delete mode 100644 spring-data-spring-security/src/main/resources/application.properties delete mode 100644 spring-data-spring-security/src/main/resources/logback.xml rename {spring-data-spring-security => spring-security-mvc-boot}/src/main/java/com/baeldung/AppConfig.java (100%) rename {spring-data-spring-security => spring-security-mvc-boot}/src/main/java/com/baeldung/SpringSecurityConfig.java (100%) rename {spring-data-spring-security => spring-security-mvc-boot}/src/main/java/com/baeldung/data/repositories/TweetRepository.java (100%) rename {spring-data-spring-security => spring-security-mvc-boot}/src/main/java/com/baeldung/data/repositories/UserRepository.java (100%) rename {spring-data-spring-security => spring-security-mvc-boot}/src/main/java/com/baeldung/models/AppUser.java (100%) rename {spring-data-spring-security => spring-security-mvc-boot}/src/main/java/com/baeldung/models/Tweet.java (100%) rename {spring-data-spring-security => spring-security-mvc-boot}/src/main/java/com/baeldung/security/AppUserPrincipal.java (100%) rename {spring-data-spring-security => spring-security-mvc-boot}/src/main/java/com/baeldung/security/AuthenticationSuccessHandlerImpl.java (100%) rename {spring-data-spring-security => spring-security-mvc-boot}/src/main/java/com/baeldung/security/CustomUserDetailsService.java (100%) rename {spring-data-spring-security => spring-security-mvc-boot}/src/main/java/com/baeldung/util/DummyContentUtil.java (100%) rename {spring-data-spring-security => spring-security-mvc-boot}/src/main/resources/persistence-h2.properties (100%) rename spring-data-spring-security/src/test/java/com/baeldung/relationships/SpringDataWithSecurityTest.java => spring-security-mvc-boot/src/test/java/com/baeldung/relationships/SpringDataWithSecurityUnitTest.java (95%) diff --git a/spring-data-spring-security/README.md b/spring-data-spring-security/README.md deleted file mode 100644 index da65527a8a..0000000000 --- a/spring-data-spring-security/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# About this project -This project contains examples from the [Spring Data with Spring Security](http://www.baeldung.com/spring-data-with-spring-security) article from Baeldung. - -# Running the project -The application uses [Spring Boot](http://projects.spring.io/spring-boot/), so it is easy to run. You can start it any of a few ways: -* Run the `main` method from `SpringDataRestApplication` -* Use the Maven Spring Boot plugin: `mvn spring-boot:run` -* Package the application as a JAR and run it using `java -jar spring-data-spring-security.jar` - -# Viewing the running application -To view the running application, visit [http://localhost:8080](http://localhost:8080) in your browser - -###Relevant Articles: -- [Spring Data with Spring Security](http://www.baeldung.com/spring-data-security) diff --git a/spring-data-spring-security/pom.xml b/spring-data-spring-security/pom.xml deleted file mode 100644 index 09e056ef01..0000000000 --- a/spring-data-spring-security/pom.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - 4.0.0 - com.baeldung - spring-data-spring-security - 1.0 - jar - intro-spring-data-spring-security - Spring Data with Spring Security - - - 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-starter-data-jpa - - - org.springframework.security - spring-security-data - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.security - spring-security-test - test - - - org.apache.tomcat.embed - tomcat-embed-jasper - - - - com.h2database - h2 - - - javax.servlet - jstl - - - - - ${project.artifactId} - - - diff --git a/spring-data-spring-security/src/main/resources/application.properties b/spring-data-spring-security/src/main/resources/application.properties deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/spring-data-spring-security/src/main/resources/logback.xml b/spring-data-spring-security/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/spring-data-spring-security/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-security-mvc-boot/README.MD b/spring-security-mvc-boot/README.MD index 32976b0896..0bae800b1e 100644 --- a/spring-security-mvc-boot/README.MD +++ b/spring-security-mvc-boot/README.MD @@ -9,3 +9,4 @@ The "REST With Spring" Classes: http://github.learnspringsecurity.com - [Multiple Entry Points in Spring Security](http://www.baeldung.com/spring-security-multiple-entry-points) - [Multiple Authentication Providers in Spring Security](http://www.baeldung.com/spring-security-multiple-auth-providers) - [Granted Authority Versus Role in Spring Security](http://www.baeldung.com/spring-security-granted-authority-vs-role) +- [Spring Data with Spring Security] (https://www.baeldung.com/spring-data-security) diff --git a/spring-security-mvc-boot/pom.xml b/spring-security-mvc-boot/pom.xml index a894c5713a..4090beab99 100644 --- a/spring-security-mvc-boot/pom.xml +++ b/spring-security-mvc-boot/pom.xml @@ -42,6 +42,10 @@ org.springframework.boot spring-boot-starter-data-jpa
+ + org.springframework.security + spring-security-data + com.h2database h2 diff --git a/spring-data-spring-security/src/main/java/com/baeldung/AppConfig.java b/spring-security-mvc-boot/src/main/java/com/baeldung/AppConfig.java similarity index 100% rename from spring-data-spring-security/src/main/java/com/baeldung/AppConfig.java rename to spring-security-mvc-boot/src/main/java/com/baeldung/AppConfig.java diff --git a/spring-data-spring-security/src/main/java/com/baeldung/SpringSecurityConfig.java b/spring-security-mvc-boot/src/main/java/com/baeldung/SpringSecurityConfig.java similarity index 100% rename from spring-data-spring-security/src/main/java/com/baeldung/SpringSecurityConfig.java rename to spring-security-mvc-boot/src/main/java/com/baeldung/SpringSecurityConfig.java diff --git a/spring-data-spring-security/src/main/java/com/baeldung/data/repositories/TweetRepository.java b/spring-security-mvc-boot/src/main/java/com/baeldung/data/repositories/TweetRepository.java similarity index 100% rename from spring-data-spring-security/src/main/java/com/baeldung/data/repositories/TweetRepository.java rename to spring-security-mvc-boot/src/main/java/com/baeldung/data/repositories/TweetRepository.java diff --git a/spring-data-spring-security/src/main/java/com/baeldung/data/repositories/UserRepository.java b/spring-security-mvc-boot/src/main/java/com/baeldung/data/repositories/UserRepository.java similarity index 100% rename from spring-data-spring-security/src/main/java/com/baeldung/data/repositories/UserRepository.java rename to spring-security-mvc-boot/src/main/java/com/baeldung/data/repositories/UserRepository.java diff --git a/spring-data-spring-security/src/main/java/com/baeldung/models/AppUser.java b/spring-security-mvc-boot/src/main/java/com/baeldung/models/AppUser.java similarity index 100% rename from spring-data-spring-security/src/main/java/com/baeldung/models/AppUser.java rename to spring-security-mvc-boot/src/main/java/com/baeldung/models/AppUser.java diff --git a/spring-data-spring-security/src/main/java/com/baeldung/models/Tweet.java b/spring-security-mvc-boot/src/main/java/com/baeldung/models/Tweet.java similarity index 100% rename from spring-data-spring-security/src/main/java/com/baeldung/models/Tweet.java rename to spring-security-mvc-boot/src/main/java/com/baeldung/models/Tweet.java diff --git a/spring-data-spring-security/src/main/java/com/baeldung/security/AppUserPrincipal.java b/spring-security-mvc-boot/src/main/java/com/baeldung/security/AppUserPrincipal.java similarity index 100% rename from spring-data-spring-security/src/main/java/com/baeldung/security/AppUserPrincipal.java rename to spring-security-mvc-boot/src/main/java/com/baeldung/security/AppUserPrincipal.java diff --git a/spring-data-spring-security/src/main/java/com/baeldung/security/AuthenticationSuccessHandlerImpl.java b/spring-security-mvc-boot/src/main/java/com/baeldung/security/AuthenticationSuccessHandlerImpl.java similarity index 100% rename from spring-data-spring-security/src/main/java/com/baeldung/security/AuthenticationSuccessHandlerImpl.java rename to spring-security-mvc-boot/src/main/java/com/baeldung/security/AuthenticationSuccessHandlerImpl.java diff --git a/spring-data-spring-security/src/main/java/com/baeldung/security/CustomUserDetailsService.java b/spring-security-mvc-boot/src/main/java/com/baeldung/security/CustomUserDetailsService.java similarity index 100% rename from spring-data-spring-security/src/main/java/com/baeldung/security/CustomUserDetailsService.java rename to spring-security-mvc-boot/src/main/java/com/baeldung/security/CustomUserDetailsService.java diff --git a/spring-data-spring-security/src/main/java/com/baeldung/util/DummyContentUtil.java b/spring-security-mvc-boot/src/main/java/com/baeldung/util/DummyContentUtil.java similarity index 100% rename from spring-data-spring-security/src/main/java/com/baeldung/util/DummyContentUtil.java rename to spring-security-mvc-boot/src/main/java/com/baeldung/util/DummyContentUtil.java diff --git a/spring-data-spring-security/src/main/resources/persistence-h2.properties b/spring-security-mvc-boot/src/main/resources/persistence-h2.properties similarity index 100% rename from spring-data-spring-security/src/main/resources/persistence-h2.properties rename to spring-security-mvc-boot/src/main/resources/persistence-h2.properties diff --git a/spring-data-spring-security/src/test/java/com/baeldung/relationships/SpringDataWithSecurityTest.java b/spring-security-mvc-boot/src/test/java/com/baeldung/relationships/SpringDataWithSecurityUnitTest.java similarity index 95% rename from spring-data-spring-security/src/test/java/com/baeldung/relationships/SpringDataWithSecurityTest.java rename to spring-security-mvc-boot/src/test/java/com/baeldung/relationships/SpringDataWithSecurityUnitTest.java index dbbfe7e85e..8207363a70 100644 --- a/spring-data-spring-security/src/test/java/com/baeldung/relationships/SpringDataWithSecurityTest.java +++ b/spring-security-mvc-boot/src/test/java/com/baeldung/relationships/SpringDataWithSecurityUnitTest.java @@ -36,7 +36,7 @@ import com.baeldung.util.DummyContentUtil; @WebAppConfiguration @ContextConfiguration @DirtiesContext -public class SpringDataWithSecurityTest { +public class SpringDataWithSecurityUnitTest { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); @Autowired private ServletContext servletContext; @@ -50,8 +50,8 @@ public class SpringDataWithSecurityTest { ctx.refresh(); userRepository = ctx.getBean(UserRepository.class); tweetRepository = ctx.getBean(TweetRepository.class); - List appUsers = (List) userRepository.save(DummyContentUtil.generateDummyUsers()); - tweetRepository.save(DummyContentUtil.generateDummyTweets(appUsers)); + List appUsers = (List) userRepository.saveAll(DummyContentUtil.generateDummyUsers()); + tweetRepository.saveAll(DummyContentUtil.generateDummyTweets(appUsers)); } @AfterClass From 0782ae03c0f13911a6627f4fabebad2107955d3b Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Wed, 29 Aug 2018 22:01:34 +0200 Subject: [PATCH 055/128] moved spring-jersey-rx into spring-jersey --- jersey-client-rx/pom.xml | 67 ------------------- jersey-client-rx/readme.md | 3 - spring-jersey/pom.xml | 45 ++++++++++++- .../ClientOrchestrationIntegrationTest.java | 2 +- 4 files changed, 45 insertions(+), 72 deletions(-) delete mode 100644 jersey-client-rx/pom.xml delete mode 100644 jersey-client-rx/readme.md rename {jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx => spring-jersey/src/test/java/com/baeldung/clientrx}/ClientOrchestrationIntegrationTest.java (99%) diff --git a/jersey-client-rx/pom.xml b/jersey-client-rx/pom.xml deleted file mode 100644 index 24894869a5..0000000000 --- a/jersey-client-rx/pom.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - 4.0.0 - com.baeldung.samples - jersey-client-rx - 1.0 - jar - - - org.glassfish.jersey.inject - jersey-hk2 - 2.27 - - - org.glassfish.jersey.core - jersey-client - 2.27 - - - org.glassfish.jersey.ext.rx - jersey-rx-client-rxjava - 2.27 - - - org.glassfish.jersey.ext.rx - jersey-rx-client-rxjava2 - 2.27 - - - com.github.tomakehurst - wiremock - 1.58 - test - - - org.junit.vintage - junit-vintage-engine - 5.2.0 - - - org.glassfish.jersey.media - jersey-media-json-jackson - 2.25 - - - com.fasterxml.jackson.jaxrs - jackson-jaxrs-json-provider - 2.4.1 - - - org.slf4j - slf4j-jdk14 - 1.7.25 - - - org.assertj - assertj-core - 3.10.0 - test - - - - UTF-8 - 1.8 - 1.8 - - \ No newline at end of file diff --git a/jersey-client-rx/readme.md b/jersey-client-rx/readme.md deleted file mode 100644 index d1bc4e950b..0000000000 --- a/jersey-client-rx/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -# Fluent, Reactive Jersey Client Orchestration # - -### Sample code demonstrating the options for asynchronous, reactive RESTful service consumption with JAX-RS ### diff --git a/spring-jersey/pom.xml b/spring-jersey/pom.xml index 22adf265b1..40dc91a88d 100644 --- a/spring-jersey/pom.xml +++ b/spring-jersey/pom.xml @@ -76,6 +76,49 @@ test + + org.glassfish.jersey.inject + jersey-hk2 + ${jersey.version} + + + org.glassfish.jersey.ext.rx + jersey-rx-client-rxjava + ${jersey.version} + + + org.glassfish.jersey.ext.rx + jersey-rx-client-rxjava2 + ${jersey.version} + + + com.github.tomakehurst + wiremock + 1.58 + test + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-json-provider + 2.6.0 + + + com.fasterxml.jackson.core + jackson-databind + 2.6.0 + + + org.slf4j + slf4j-jdk14 + 1.7.25 + + + org.assertj + assertj-core + 3.10.0 + test + +
@@ -170,7 +213,7 @@ - 2.26 + 2.27 3.2.0 1.6.1 4.4.9 diff --git a/jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx/ClientOrchestrationIntegrationTest.java b/spring-jersey/src/test/java/com/baeldung/clientrx/ClientOrchestrationIntegrationTest.java similarity index 99% rename from jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx/ClientOrchestrationIntegrationTest.java rename to spring-jersey/src/test/java/com/baeldung/clientrx/ClientOrchestrationIntegrationTest.java index 88a8d67a7d..990279a481 100644 --- a/jersey-client-rx/src/test/java/com/baeldung/samples/jerseyrx/ClientOrchestrationIntegrationTest.java +++ b/spring-jersey/src/test/java/com/baeldung/clientrx/ClientOrchestrationIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.samples.jerseyrx; +package com.baeldung.clientrx; import static com.github.tomakehurst.wiremock.client.WireMock.*; import static org.assertj.core.api.Assertions.*; From 7b639b69cd8e04f0958774fe762b27b3347450b9 Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Wed, 29 Aug 2018 22:05:08 +0200 Subject: [PATCH 056/128] removed spring-jersey-rx from pom.xml --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index ad2f607141..a4537c6d55 100644 --- a/pom.xml +++ b/pom.xml @@ -584,7 +584,6 @@ spring-security-thymeleaf persistence-modules/java-jdbi jersey - jersey-client-rx java-spi performance-tests twilio From 2a12e9abd42822c1b7a3ddf321b975fe68907f35 Mon Sep 17 00:00:00 2001 From: myluckagain Date: Thu, 30 Aug 2018 03:56:21 +0500 Subject: [PATCH 057/128] BAEL-2151 (#5087) BAEL-2151 --- .../LinesIntersectionService.java | 21 ++++++++++ .../LinesIntersectionServiceUnitTest.java | 40 +++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/linesintersection/LinesIntersectionService.java create mode 100644 core-java/src/test/java/com/baeldung/linesintersection/LinesIntersectionServiceUnitTest.java diff --git a/core-java/src/main/java/com/baeldung/linesintersection/LinesIntersectionService.java b/core-java/src/main/java/com/baeldung/linesintersection/LinesIntersectionService.java new file mode 100644 index 0000000000..e4fed5a22e --- /dev/null +++ b/core-java/src/main/java/com/baeldung/linesintersection/LinesIntersectionService.java @@ -0,0 +1,21 @@ +package com.baeldung.linesintersection; + +import java.awt.Point; +import java.util.Optional; + +public class LinesIntersectionService { + + public Optional calculateIntersectionPoint(float m1, float b1, float m2, float b2) { + + if (m1 == m2) { + return Optional.empty(); + } + + float x = (b2 - b1) / (m1 - m2); + float y = m1 * x + b1; + + Point point = new Point(Math.round(x), Math.round(y)); + + return Optional.of(point); + } +} diff --git a/core-java/src/test/java/com/baeldung/linesintersection/LinesIntersectionServiceUnitTest.java b/core-java/src/test/java/com/baeldung/linesintersection/LinesIntersectionServiceUnitTest.java new file mode 100644 index 0000000000..90c93fe050 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/linesintersection/LinesIntersectionServiceUnitTest.java @@ -0,0 +1,40 @@ +package com.baeldung.linesintersection; + +import java.awt.Point; +import java.util.Optional; + +import org.junit.Test; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertEquals; + +public class LinesIntersectionServiceUnitTest { + private LinesIntersectionService service = new LinesIntersectionService(); + + @Test + public void givenNotParallelLines_whenCalculatePoint_thenPresent() { + + float m1 = 0; + float b1 = 0; + float m2 = 1; + float b2 = -1; + + Optional point = service.calculateIntersectionPoint(m1, b1, m2, b2); + + assertTrue(point.isPresent()); + assertEquals(point.get().x, 1); + assertEquals(point.get().y, 0); + } + + @Test + public void givenParallelLines_whenCalculatePoint_thenEmpty() { + float m1 = 1; + float b1 = 0; + float m2 = 1; + float b2 = -1; + + Optional point = service.calculateIntersectionPoint(m1, b1, m2, b2); + + assertFalse(point.isPresent()); + } +} From 5deb5311f85878624eb623a16927beccd14accbe Mon Sep 17 00:00:00 2001 From: Corneil du Plessis Date: Thu, 30 Aug 2018 01:00:11 +0200 Subject: [PATCH 058/128] BAEL-2105: Change for deployment to Cloud Foundry (#5060) --- .../cloudfoundry/manifest.yml | 10 +++ spring-boot-bootstrap/pom.xml | 80 ++++++++++++++++++- .../cloud/config/CloudDataSourceConfig.java | 19 +++++ .../resources/application-local.properties | 20 +++++ .../resources/application-mysql.properties | 1 + .../src/main/resources/application.properties | 18 ++--- 6 files changed, 133 insertions(+), 15 deletions(-) create mode 100755 spring-boot-bootstrap/cloudfoundry/manifest.yml create mode 100755 spring-boot-bootstrap/src/main/java/org/baeldung/cloud/config/CloudDataSourceConfig.java create mode 100644 spring-boot-bootstrap/src/main/resources/application-local.properties create mode 100644 spring-boot-bootstrap/src/main/resources/application-mysql.properties diff --git a/spring-boot-bootstrap/cloudfoundry/manifest.yml b/spring-boot-bootstrap/cloudfoundry/manifest.yml new file mode 100755 index 0000000000..80fce8ff4b --- /dev/null +++ b/spring-boot-bootstrap/cloudfoundry/manifest.yml @@ -0,0 +1,10 @@ +--- +applications: +- name: spring-boot-bootstrap + memory: 768M + random-route: true + path: ../target/spring-boot-bootstrap-cf.jar + env: + SPRING_PROFILES_ACTIVE: cloud,mysql + services: + - spring-bootstrap-db diff --git a/spring-boot-bootstrap/pom.xml b/spring-boot-bootstrap/pom.xml index 5868694e5b..c1ce4df6e2 100644 --- a/spring-boot-bootstrap/pom.xml +++ b/spring-boot-bootstrap/pom.xml @@ -1,6 +1,6 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 org.baeldung spring-boot-bootstrap @@ -14,6 +14,17 @@ 0.0.1-SNAPSHOT ../parent-boot-2 + + + + org.springframework.cloud + spring-cloud-dependencies + Finchley.SR1 + pom + import + + + @@ -28,10 +39,22 @@ org.springframework.boot spring-boot-starter-data-jpa + + org.springframework.cloud + spring-cloud-starter + + + org.springframework.boot + spring-boot-starter-cloud-connectors + com.h2database h2 + + mysql + mysql-connector-java + org.springframework.boot spring-boot-starter-security @@ -55,6 +78,47 @@ + + cloudfoundry + + + org.springframework.cloud + spring-cloud-starter + + + org.springframework.boot + spring-boot-starter-cloud-connectors + + + + + + src/main/resources + + **/logback.xml + + + + + + org.springframework.boot + spring-boot-maven-plugin + + ${project.name}-cf + + + + org.apache.maven.plugins + maven-compiler-plugin + + + **/cloud/config/*.java + + + + + + autoconfiguration @@ -112,7 +176,19 @@ - + + + + org.apache.maven.plugins + maven-compiler-plugin + + + **/cloud/*.java + + + + + 4.0.0 diff --git a/spring-boot-bootstrap/src/main/java/org/baeldung/cloud/config/CloudDataSourceConfig.java b/spring-boot-bootstrap/src/main/java/org/baeldung/cloud/config/CloudDataSourceConfig.java new file mode 100755 index 0000000000..b9f9598ca3 --- /dev/null +++ b/spring-boot-bootstrap/src/main/java/org/baeldung/cloud/config/CloudDataSourceConfig.java @@ -0,0 +1,19 @@ +package org.baeldung.cloud.config; + +import org.springframework.cloud.config.java.AbstractCloudConfig; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +import javax.sql.DataSource; + +@Configuration +@Profile("cloud") +public class CloudDataSourceConfig extends AbstractCloudConfig { + + @Bean + public DataSource dataSource() { + return connectionFactory().dataSource(); + } + +} diff --git a/spring-boot-bootstrap/src/main/resources/application-local.properties b/spring-boot-bootstrap/src/main/resources/application-local.properties new file mode 100644 index 0000000000..8c1c677988 --- /dev/null +++ b/spring-boot-bootstrap/src/main/resources/application-local.properties @@ -0,0 +1,20 @@ +server.port = 8081 + +spring.application.name = Bootstrap Spring Boot + +spring.thymeleaf.cache = false +spring.thymeleaf.enabled=true +spring.thymeleaf.prefix=classpath:/templates/ +spring.thymeleaf.suffix=.html + +spring.security.user.name=john +spring.security.user.password=123 + +spring.datasource.driver-class-name=org.h2.Driver +spring.datasource.url=jdbc:h2:mem:bootapp;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE +spring.datasource.username=sa +spring.datasource.password= +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect + +server.error.path=/error +server.error.whitelabel.enabled=false \ No newline at end of file diff --git a/spring-boot-bootstrap/src/main/resources/application-mysql.properties b/spring-boot-bootstrap/src/main/resources/application-mysql.properties new file mode 100644 index 0000000000..a1823b5d7f --- /dev/null +++ b/spring-boot-bootstrap/src/main/resources/application-mysql.properties @@ -0,0 +1 @@ +spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect \ No newline at end of file diff --git a/spring-boot-bootstrap/src/main/resources/application.properties b/spring-boot-bootstrap/src/main/resources/application.properties index e50268d32c..eee89ca460 100644 --- a/spring-boot-bootstrap/src/main/resources/application.properties +++ b/spring-boot-bootstrap/src/main/resources/application.properties @@ -1,19 +1,11 @@ -server.port = 8081 - -spring.application.name = Bootstrap Spring Boot - +server.port=${port:8080} +spring.application.name = Bootstrap Spring Cloud spring.thymeleaf.cache = false spring.thymeleaf.enabled=true spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.suffix=.html -spring.security.user.name=john -spring.security.user.password=123 - -spring.datasource.driver-class-name=org.h2.Driver -spring.datasource.url=jdbc:h2:mem:bootapp;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE -spring.datasource.username=sa -spring.datasource.password= - server.error.path=/error -server.error.whitelabel.enabled=false \ No newline at end of file +server.error.whitelabel.enabled=false + +spring.jpa.generate-ddl=true \ No newline at end of file From 3e30c2a6c4bcd9c427809db58e3c50a7c29b9cd3 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 30 Aug 2018 12:52:00 +0530 Subject: [PATCH 059/128] Update README.MD --- spring-security-mvc-boot/README.MD | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spring-security-mvc-boot/README.MD b/spring-security-mvc-boot/README.MD index 0bae800b1e..eec61f087f 100644 --- a/spring-security-mvc-boot/README.MD +++ b/spring-security-mvc-boot/README.MD @@ -1,7 +1,7 @@ -###The Course +### The Course The "REST With Spring" Classes: http://github.learnspringsecurity.com -###Relevant Articles: +### Relevant Articles: - [A Custom Security Expression with Spring Security](http://www.baeldung.com/spring-security-create-new-custom-security-expression) - [Custom AccessDecisionVoters in Spring Security](http://www.baeldung.com/spring-security-custom-voter) - [Spring Security: Authentication with a Database-backed UserDetailsService](http://www.baeldung.com/spring-security-authentication-with-a-database) @@ -9,4 +9,4 @@ The "REST With Spring" Classes: http://github.learnspringsecurity.com - [Multiple Entry Points in Spring Security](http://www.baeldung.com/spring-security-multiple-entry-points) - [Multiple Authentication Providers in Spring Security](http://www.baeldung.com/spring-security-multiple-auth-providers) - [Granted Authority Versus Role in Spring Security](http://www.baeldung.com/spring-security-granted-authority-vs-role) -- [Spring Data with Spring Security] (https://www.baeldung.com/spring-data-security) +- [Spring Data with Spring Security](https://www.baeldung.com/spring-data-security) From 201d616c6bcf02ef788bbaf39c24d8be0fb2d75e Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Thu, 30 Aug 2018 20:36:27 +0300 Subject: [PATCH 060/128] minor cleanup --- ...msUsingJava8OptionalContainerUnitTest.java | 15 +++++------- .../util/CurrentDateTimeUnitTest.java | 3 --- java-streams/pom.xml | 23 +++++++++---------- .../stream/PrimitiveStreamsUnitTest.java | 18 +++++---------- 4 files changed, 23 insertions(+), 36 deletions(-) diff --git a/core-java-8/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest.java b/core-java-8/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest.java index 4df3482633..df6c72d346 100644 --- a/core-java-8/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest.java +++ b/core-java-8/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest.java @@ -5,25 +5,22 @@ */ package com.baeldung.nullsafecollectionstreams; +import static org.junit.Assert.assertEquals; + import java.util.Arrays; import java.util.Collection; import java.util.Iterator; import java.util.stream.Stream; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; + import org.junit.Test; -import static org.junit.Assert.*; /** * * @author Kwaje Anthony */ public class NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest { - - private final NullSafeCollectionStreamsUsingJava8OptionalContainer instance = - new NullSafeCollectionStreamsUsingJava8OptionalContainer(); + + private final NullSafeCollectionStreamsUsingJava8OptionalContainer instance = new NullSafeCollectionStreamsUsingJava8OptionalContainer(); @Test public void whenCollectionIsNull_thenExpectAnEmptyStream() { @@ -49,5 +46,5 @@ public class NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest { assertEquals(iter1.next(), iter2.next()); assert !iter1.hasNext() && !iter2.hasNext(); } - + } diff --git a/core-java-8/src/test/java/com/baeldung/util/CurrentDateTimeUnitTest.java b/core-java-8/src/test/java/com/baeldung/util/CurrentDateTimeUnitTest.java index 1689a5054d..ec20b7794b 100644 --- a/core-java-8/src/test/java/com/baeldung/util/CurrentDateTimeUnitTest.java +++ b/core-java-8/src/test/java/com/baeldung/util/CurrentDateTimeUnitTest.java @@ -1,7 +1,6 @@ package com.baeldung.util; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; import java.time.Clock; import java.time.Instant; @@ -10,8 +9,6 @@ import java.time.LocalTime; import java.time.ZoneId; import java.time.temporal.ChronoField; -import org.joda.time.DateTime; -import org.joda.time.DateTimeUtils; import org.junit.Test; public class CurrentDateTimeUnitTest { diff --git a/java-streams/pom.xml b/java-streams/pom.xml index 75914f0247..4f8651a756 100644 --- a/java-streams/pom.xml +++ b/java-streams/pom.xml @@ -1,7 +1,6 @@ 4.0.0 - com.baeldung java-streams 0.1.0-SNAPSHOT jar @@ -15,17 +14,17 @@ - - - org.openjdk.jmh - jmh-core - ${jmh.version} - - - org.openjdk.jmh - jmh-generator-annprocess - ${jmh.version} - provided + + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + provided org.apache.commons diff --git a/java-streams/src/test/java/com/baeldung/stream/PrimitiveStreamsUnitTest.java b/java-streams/src/test/java/com/baeldung/stream/PrimitiveStreamsUnitTest.java index 2c88dc5ec7..67954f0bba 100644 --- a/java-streams/src/test/java/com/baeldung/stream/PrimitiveStreamsUnitTest.java +++ b/java-streams/src/test/java/com/baeldung/stream/PrimitiveStreamsUnitTest.java @@ -1,15 +1,14 @@ package com.baeldung.stream; -import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; -import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import org.junit.Test; public class PrimitiveStreamsUnitTest { @@ -17,7 +16,7 @@ public class PrimitiveStreamsUnitTest { @Test public void givenAnArrayOfIntegersWhenMinIsCalledThenCorrectMinIsReturned() { - int[] integers = new int[] {20, 98, 12, 7, 35}; + int[] integers = new int[] { 20, 98, 12, 7, 35 }; int min = streams.min(integers); // returns 7 assertEquals(7, min); @@ -66,19 +65,14 @@ public class PrimitiveStreamsUnitTest { @Test public void givenAnArrayWhenSumIsCalledThenTheCorrectSumIsReturned() { - int sum = Stream.of(33,45) - .mapToInt(i -> i) - .sum(); + int sum = Stream.of(33, 45).mapToInt(i -> i).sum(); assertEquals(78, sum); } @Test public void givenAnIntStreamThenGetTheEvenIntegers() { - List evenInts = IntStream.rangeClosed(1, 10) - .filter(i -> i % 2 == 0) - .boxed() - .collect(Collectors.toList()); + List evenInts = IntStream.rangeClosed(1, 10).filter(i -> i % 2 == 0).boxed().collect(Collectors.toList()); List expected = IntStream.of(2, 4, 6, 8, 10).boxed().collect(Collectors.toList()); From db704cbe4da6ad65dbf784612b94ade3e7212e89 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 30 Aug 2018 23:33:42 +0530 Subject: [PATCH 061/128] BAEL-8506 Test in CDI project failing - Fixed assertion of local time logic --- .../ImageProcessorUnitTest.java | 101 +++++++++++------- 1 file changed, 61 insertions(+), 40 deletions(-) diff --git a/cdi/src/test/java/com/baeldung/test/dependencyinjection/ImageProcessorUnitTest.java b/cdi/src/test/java/com/baeldung/test/dependencyinjection/ImageProcessorUnitTest.java index 8b5fa409c9..930e913109 100644 --- a/cdi/src/test/java/com/baeldung/test/dependencyinjection/ImageProcessorUnitTest.java +++ b/cdi/src/test/java/com/baeldung/test/dependencyinjection/ImageProcessorUnitTest.java @@ -1,70 +1,91 @@ package com.baeldung.test.dependencyinjection; -import com.baeldung.dependencyinjection.imagefileeditors.GifFileEditor; -import com.baeldung.dependencyinjection.imagefileeditors.JpgFileEditor; -import com.baeldung.dependencyinjection.imagefileeditors.PngFileEditor; -import com.baeldung.dependencyinjection.imageprocessors.ImageFileProcessor; -import com.baeldung.dependencyinjection.loggers.TimeLogger; -import java.text.SimpleDateFormat; -import java.util.Calendar; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.within; + +import java.text.ParseException; +import java.time.LocalTime; +import java.time.temporal.ChronoUnit; + import org.jboss.weld.environment.se.Weld; import org.jboss.weld.environment.se.WeldContainer; import org.junit.BeforeClass; import org.junit.Test; +import com.baeldung.dependencyinjection.imagefileeditors.PngFileEditor; +import com.baeldung.dependencyinjection.imageprocessors.ImageFileProcessor; +import com.baeldung.dependencyinjection.loggers.TimeLogger; + public class ImageProcessorUnitTest { - + private static ImageFileProcessor imageFileProcessor; - private static SimpleDateFormat dateFormat; - private static Calendar calendar; - - + @BeforeClass public static void setImageProcessorInstance() { Weld weld = new Weld(); WeldContainer container = weld.initialize(); - imageFileProcessor = container.select(ImageFileProcessor.class).get(); + imageFileProcessor = container.select(ImageFileProcessor.class) + .get(); container.shutdown(); } - - @BeforeClass - public static void setSimpleDateFormatInstance() { - dateFormat = new SimpleDateFormat("HH:mm"); - } - - @BeforeClass - public static void setCalendarInstance() { - calendar = Calendar.getInstance(); - } - + @Test public void givenImageProcessorInstance_whenInjectedPngFileEditorandTimeLoggerInstances_thenTwoAssertions() { assertThat(imageFileProcessor.getImageFileditor()).isInstanceOf(PngFileEditor.class); assertThat(imageFileProcessor.getTimeLogger()).isInstanceOf(TimeLogger.class); } - + @Test - public void givenImageProcessorInstance_whenCalledopenFile_thenOneAssertion() { - String currentTime = dateFormat.format(calendar.getTime()); - assertThat(imageFileProcessor.openFile("file1.png")).isEqualTo("Opening PNG file file1.png at: " + currentTime); + public void givenImageProcessorInstance_whenCalledopenFile_thenOneAssertion() throws ParseException { + LocalTime currentTime = LocalTime.now(); + + String openFileLog = imageFileProcessor.openFile("file1.png"); + assertThat(openFileLog).contains("Opening PNG file file1.png at: "); + + LocalTime loggedTime = getLoggedTime(openFileLog); + assertThat(loggedTime).isCloseTo(currentTime, within(2, ChronoUnit.MINUTES)); } - + @Test - public void givenImageProcessorInstance_whenCallededitFile_thenOneAssertion() { - String currentTime = dateFormat.format(calendar.getTime()); - assertThat(imageFileProcessor.editFile("file1.png")).isEqualTo("Editing PNG file file1.png at: " + currentTime); + public void givenImageProcessorInstance_whenCallededitFile_thenOneAssertion() throws ParseException { + LocalTime currentTime = LocalTime.now(); + + String editFileLog = imageFileProcessor.editFile("file1.png"); + assertThat(editFileLog).contains("Editing PNG file file1.png at: "); + + LocalTime loggedTime = getLoggedTime(editFileLog); + assertThat(loggedTime).isCloseTo(currentTime, within(2, ChronoUnit.MINUTES)); } - + @Test - public void givenImageProcessorInstance_whenCalledwriteFile_thenOneAssertion() { - String currentTime = dateFormat.format(calendar.getTime()); - assertThat(imageFileProcessor.writeFile("file1.png")).isEqualTo("Writing PNG file file1.png at: " + currentTime); + public void givenImageProcessorInstance_whenCalledwriteFile_thenOneAssertion() throws ParseException { + LocalTime currentTime = LocalTime.now(); + + String writeFileLog = imageFileProcessor.writeFile("file1.png"); + assertThat(writeFileLog).contains("Writing PNG file file1.png at: "); + + LocalTime loggedTime = getLoggedTime(writeFileLog); + assertThat(loggedTime).isCloseTo(currentTime, within(2, ChronoUnit.MINUTES)); } - + @Test - public void givenImageProcessorInstance_whenCalledsaveFile_thenOneAssertion() { - String currentTime = dateFormat.format(calendar.getTime()); - assertThat(imageFileProcessor.saveFile("file1.png")).isEqualTo("Saving PNG file file1.png at: " + currentTime); + public void givenImageProcessorInstance_whenCalledsaveFile_thenOneAssertion() throws ParseException { + LocalTime currentTime = LocalTime.now(); + + String saveFileLog = imageFileProcessor.saveFile("file1.png"); + assertThat(saveFileLog).contains("Saving PNG file file1.png at: "); + + LocalTime loggedTime = getLoggedTime(saveFileLog); + assertThat(loggedTime).isCloseTo(currentTime, within(2, ChronoUnit.MINUTES)); + } + + private LocalTime getLoggedTime(String log) throws ParseException { + String logTimeString = log.split("at: ")[1]; + + int hour = Integer.valueOf(logTimeString.split(":")[0]); + int minutes = Integer.valueOf(logTimeString.split(":")[1]); + + LocalTime loggedTime = LocalTime.of(hour, minutes); + return loggedTime; } } \ No newline at end of file From aa2822c5fc3360afef6fa4f237c9b69d4c3d372e Mon Sep 17 00:00:00 2001 From: Amitabh Mandal Date: Thu, 30 Aug 2018 23:38:21 +0530 Subject: [PATCH 062/128] BAEL-1991 - Understanding Process (#4863) * Understanding Process * Refactored names * Refactored junit names based on document guidance * Added alive * renamed junits as behavior Driven requirements * Added alive method junit * added waitFor method time interval junit * getOutputStream * changed exception * dummy commit * Dummy Commit with blank lines * Fixed assert and commented @Test * fixed asserts * Replaced System.out.println with logging * replaced system.out.println with logging * Dummy commit to ensure clean build * Renamed Junit * Fixed extra spaces and typo * Uncommented @Test for 3 methods --- .../baeldung/java9/process/ChildProcess.java | 15 +++ .../java9/process/OutputStreamExample.java | 16 +++ .../process/ProcessCompilationError.java | 7 + .../java9/process/ProcessUnderstanding.java | 110 ++++++++++++++++ .../process/ProcessUnderstandingTest.java | 121 ++++++++++++++++++ 5 files changed, 269 insertions(+) create mode 100644 core-java-9/src/main/java/com/baeldung/java9/process/ChildProcess.java create mode 100644 core-java-9/src/main/java/com/baeldung/java9/process/OutputStreamExample.java create mode 100644 core-java-9/src/main/java/com/baeldung/java9/process/ProcessCompilationError.java create mode 100644 core-java-9/src/main/java/com/baeldung/java9/process/ProcessUnderstanding.java create mode 100644 core-java-9/src/test/java/com/baeldung/java9/process/ProcessUnderstandingTest.java diff --git a/core-java-9/src/main/java/com/baeldung/java9/process/ChildProcess.java b/core-java-9/src/main/java/com/baeldung/java9/process/ChildProcess.java new file mode 100644 index 0000000000..46c2e688ce --- /dev/null +++ b/core-java-9/src/main/java/com/baeldung/java9/process/ChildProcess.java @@ -0,0 +1,15 @@ +package com.baeldung.java9.process; + +import java.util.Scanner; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class ChildProcess { + + public static void main(String[] args) { + @SuppressWarnings("resource") + Scanner input = new Scanner(System.in); + Logger log = Logger.getLogger(ChildProcess.class.getName()); + log.log(Level.INFO, input.nextLine()); + } +} diff --git a/core-java-9/src/main/java/com/baeldung/java9/process/OutputStreamExample.java b/core-java-9/src/main/java/com/baeldung/java9/process/OutputStreamExample.java new file mode 100644 index 0000000000..443847916a --- /dev/null +++ b/core-java-9/src/main/java/com/baeldung/java9/process/OutputStreamExample.java @@ -0,0 +1,16 @@ +package com.baeldung.java9.process; + +import java.util.logging.Level; +import java.util.logging.Logger; + +public class OutputStreamExample { + + public static void main(String[] args) { + Logger log = Logger.getLogger(OutputStreamExample.class.getName()); + log.log(Level.INFO, Integer.toString(sum(1,2))); + } + + public static int sum(int a, int b) { + return a + b; + } +} diff --git a/core-java-9/src/main/java/com/baeldung/java9/process/ProcessCompilationError.java b/core-java-9/src/main/java/com/baeldung/java9/process/ProcessCompilationError.java new file mode 100644 index 0000000000..8b6ae0b441 --- /dev/null +++ b/core-java-9/src/main/java/com/baeldung/java9/process/ProcessCompilationError.java @@ -0,0 +1,7 @@ +package com.baeldung.java9.process; + +public class ProcessCompilationError { + //This method has been written to generate error to display + //how process errorStream() can consume error + public static void(); +} diff --git a/core-java-9/src/main/java/com/baeldung/java9/process/ProcessUnderstanding.java b/core-java-9/src/main/java/com/baeldung/java9/process/ProcessUnderstanding.java new file mode 100644 index 0000000000..74101ba3da --- /dev/null +++ b/core-java-9/src/main/java/com/baeldung/java9/process/ProcessUnderstanding.java @@ -0,0 +1,110 @@ +package com.baeldung.java9.process; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.util.Optional; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class ProcessUnderstanding { + + public static int compileAndRunJavaProgram() throws IOException { + Process process = Runtime.getRuntime() + .exec("javac -cp src src\\main\\java\\com\\baeldung\\java9\\process\\OutputStreamExample.java"); + process = Runtime.getRuntime() + .exec("java -cp src/main/java com.baeldung.java9.process.OutputStreamExample"); + BufferedReader output = new BufferedReader(new InputStreamReader(process.getInputStream())); + int value = Integer.parseInt(output.readLine()); + return value; + } + + public static String getErrorStreamExample() throws IOException { + Process process = Runtime.getRuntime() + .exec("javac -cp src src\\main\\java\\com\\baeldung\\java9\\process\\ProcessCompilationError.java"); + BufferedReader error = new BufferedReader(new InputStreamReader(process.getErrorStream())); + String errorString = error.readLine(); + return errorString; + } + + public static void creatingNewProcess() throws IOException { + ProcessBuilder builder = new ProcessBuilder("notepad.exe"); + Process process = builder.start(); + } + + public static int filterProcessWithStreamsInSpecificRangeReturnCount() { + return (int) ProcessHandle.allProcesses() + .filter(ph -> (ph.pid() > 10000 && ph.pid() < 50000)) + .count(); + } + + public static void destroyingProcessCreatedBySameProcess() throws IOException, InterruptedException { + ProcessBuilder builder = new ProcessBuilder("notepad.exe"); + Process process = builder.start(); + Thread.sleep(10000); + process.destroy(); + } + + public static void destroyingProcessCreatedByDifferentProcess() { + // find out the process id of current running task by checking + // task manager in windows and enter the integer value + Optional optionalProcessHandle = ProcessHandle.of(5232); + ProcessHandle processHandle = optionalProcessHandle.get(); + processHandle.destroy(); + } + + public static int waitForExample() throws IOException, InterruptedException { + ProcessBuilder builder = new ProcessBuilder("notepad.exe"); + Process process = builder.start(); + return process.waitFor(); + } + + public static int exitValueExample() throws IOException { + ProcessBuilder builder = new ProcessBuilder("notepad.exe"); + Process process = builder.start(); + process.destroy(); + return process.exitValue(); + } + + public static void destroyExample() throws IOException, InterruptedException { + ProcessBuilder builder = new ProcessBuilder("notepad.exe"); + Process process = builder.start(); + Thread.sleep(10000); + process.destroy(); + } + + public static void destroyForciblyExample() throws IOException, InterruptedException { + ProcessBuilder builder = new ProcessBuilder("notepad.exe"); + Process process = builder.start(); + Thread.sleep(10000); + process.destroy(); + if (process.isAlive()) { + process.destroyForcibly(); + } + } + + public static void outputStreamDemo() throws IOException, InterruptedException { + Logger log = Logger.getLogger(ProcessUnderstanding.class.getName()); + Process pr = Runtime.getRuntime() + .exec("javac -cp src src\\main\\java\\com\\baeldung\\java9\\process\\ChildProcess.java"); + final Process process = Runtime.getRuntime() + .exec("java -cp src/main/java com.baeldung.java9.process.ChildProcess"); + try (Writer w = new OutputStreamWriter(process.getOutputStream(), "UTF-8")) { + w.write("send to child\n"); + } + new Thread(() -> { + try { + int c; + while ((c = process.getInputStream() + .read()) != -1) + System.out.write((byte) c); + } catch (Exception e) { + e.printStackTrace(); + } + }).start(); + // send to child + log.log(Level.INFO, "rc=" + process.waitFor()); + } +} diff --git a/core-java-9/src/test/java/com/baeldung/java9/process/ProcessUnderstandingTest.java b/core-java-9/src/test/java/com/baeldung/java9/process/ProcessUnderstandingTest.java new file mode 100644 index 0000000000..2f61846c1c --- /dev/null +++ b/core-java-9/src/test/java/com/baeldung/java9/process/ProcessUnderstandingTest.java @@ -0,0 +1,121 @@ +package com.baeldung.java9.process; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.*; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.lang.String; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import java.lang.Integer; + +import org.junit.jupiter.api.Test; + +class ProcessUnderstandingTest { + + @Test + public void givenSourceProgram_whenExecutedFromAnotherProgram_thenSourceProgramOutput3() throws IOException { + Process process = Runtime.getRuntime() + .exec("javac -cp src src\\main\\java\\com\\baeldung\\java9\\process\\OutputStreamExample.java"); + process = Runtime.getRuntime() + .exec("java -cp src/main/java com.baeldung.java9.process.OutputStreamExample"); + BufferedReader output = new BufferedReader(new InputStreamReader(process.getInputStream())); + int value = Integer.parseInt(output.readLine()); + assertEquals(3, value); + } + + @Test + public void givenSourceProgram_whenReadingInputStream_thenFirstLineEquals3() throws IOException { + Process process = Runtime.getRuntime() + .exec("javac -cp src src\\main\\java\\com\\baeldung\\java9\\process\\OutputStreamExample.java"); + process = Runtime.getRuntime() + .exec("java -cp src/main/java com.baeldung.java9.process.OutputStreamExample"); + BufferedReader output = new BufferedReader(new InputStreamReader(process.getInputStream())); + int value = Integer.parseInt(output.readLine()); + assertEquals(3, value); + } + + @Test + public void givenSubProcess_whenEncounteringError_thenErrorStreamNotNull() throws IOException { + Process process = Runtime.getRuntime() + .exec("javac -cp src src\\main\\java\\com\\baeldung\\java9\\process\\ProcessCompilationError.java"); + BufferedReader error = new BufferedReader(new InputStreamReader(process.getErrorStream())); + String errorString = error.readLine(); + assertNotNull(errorString); + } + + //@Test - windows specific + public void givenSubProcess_thenStartSuccessIsAlive() throws IOException { + ProcessBuilder builder = new ProcessBuilder("notepad.exe"); + assertTrue(builder.start().isAlive()); + } + + //@Test - windows specific + public void givenSubProcess_whenDestroying_thenProcessNotAlive() throws IOException, InterruptedException { + ProcessBuilder builder = new ProcessBuilder("notepad.exe"); + Process process = builder.start(); + Thread.sleep(10000); + process.destroy(); + assertFalse(process.isAlive()); + } + + //@Test - windows specific + public void givenSubProcess_whenAlive_thenDestroyForcibly() throws IOException, InterruptedException { + ProcessBuilder builder = new ProcessBuilder("notepad.exe"); + Process process = builder.start(); + Thread.sleep(10000); + process.destroy(); + if (process.isAlive()) { + process.destroyForcibly(); + } + assertFalse(process.isAlive()); + } + + //@Test - windows specific + public void givenSubProcess_checkAlive() throws IOException, InterruptedException { + ProcessBuilder builder = new ProcessBuilder("notepad.exe"); + Process process = builder.start(); + Thread.sleep(10000); + process.destroy(); + assertFalse(process.isAlive()); + } + + @Test + public void givenProcessNotCreated_fromWithinJavaApplicationDestroying_thenProcessNotAlive() { + Optional optionalProcessHandle = ProcessHandle.of(5232); + ProcessHandle processHandle = optionalProcessHandle.get(); + processHandle.destroy(); + assertFalse(processHandle.isAlive()); + } + + //@Test - windows specific + public void givenSubProcess_whenCurrentThreadWaitsIndefinitelyuntilSubProcessEnds_thenProcessWaitForReturnsGrt0() throws IOException, InterruptedException { + ProcessBuilder builder = new ProcessBuilder("notepad.exe"); + Process process = builder.start(); + assertThat(process.waitFor() >= 0); + } + + //@Test - windows specific + public void givenSubProcess_whenCurrentThreadWaitsAndSubProcessNotTerminated_thenProcessWaitForReturnsFalse() throws IOException, InterruptedException { + ProcessBuilder builder = new ProcessBuilder("notepad.exe"); + Process process = builder.start(); + assertFalse(process.waitFor(1, TimeUnit.SECONDS)); + } + + //@Test - windows specific + public void givenSubProcess_whenCurrentThreadWillNotWaitIndefinitelyforSubProcessToEnd_thenProcessExitValueReturnsGrt0() throws IOException { + ProcessBuilder builder = new ProcessBuilder("notepad.exe"); + Process process = builder.start(); + assertThat(process.exitValue() >= 0); + } + + @Test + public void givenRunningProcesses_whenFilterOnProcessIdRange_thenGetSelectedProcessPid() { + assertThat(((int) ProcessHandle.allProcesses() + .filter(ph -> (ph.pid() > 10000 && ph.pid() < 50000)) + .count()) > 0); + } +} From be05fabb4e1d2f7bbe4f3dc4c3428b1a44b0bb36 Mon Sep 17 00:00:00 2001 From: Hai Nguyen Date: Fri, 31 Aug 2018 02:19:13 +0800 Subject: [PATCH 063/128] Spring Security Taglibs (#4947) * BAEL-1846: Java Image to Base64 String * Move from using main method to Junit test * Update to use environment variables for testing * reformat and add test file * spring boot jsp security taglibs * add more test * add more test * refactor spring config * refactor spring config * Update README.md * fi alignment * fix requested comments * additional tests and content * additional tests and content * update examples * Delete Readme file * edit form example * adding example for spring boot security tag libs * Remove old tag libs module --- spring-boot-security/pom.xml | 17 ++++++ .../springsecuritytaglibs/HomeController.java | 14 +++++ .../SpringBootSecurityTagLibsApplication.java | 9 +++ .../SpringBootSecurityTagLibsConfig.java | 31 ++++++++++ .../resources/application-taglibs.properties | 3 + .../src/main/resources/application.properties | 2 +- .../src/main/webapp/WEB-INF/views/home.jsp | 38 ++++++++++++ .../HomeControllerUnitTest.java | 60 +++++++++++++++++++ 8 files changed, 173 insertions(+), 1 deletion(-) create mode 100644 spring-boot-security/src/main/java/com/baeldung/springsecuritytaglibs/HomeController.java create mode 100644 spring-boot-security/src/main/java/com/baeldung/springsecuritytaglibs/SpringBootSecurityTagLibsApplication.java create mode 100644 spring-boot-security/src/main/java/com/baeldung/springsecuritytaglibs/config/SpringBootSecurityTagLibsConfig.java create mode 100644 spring-boot-security/src/main/resources/application-taglibs.properties create mode 100644 spring-boot-security/src/main/webapp/WEB-INF/views/home.jsp create mode 100644 spring-boot-security/src/test/java/com/baeldung/springsecuritytaglibs/HomeControllerUnitTest.java diff --git a/spring-boot-security/pom.xml b/spring-boot-security/pom.xml index 5283a69c2d..18d292c8a1 100644 --- a/spring-boot-security/pom.xml +++ b/spring-boot-security/pom.xml @@ -44,6 +44,23 @@ org.springframework.boot spring-boot-starter-web + + + + org.springframework.security + spring-security-taglibs + + + + + org.apache.tomcat.embed + tomcat-embed-jasper + provided + + + javax.servlet + jstl + org.springframework.boot diff --git a/spring-boot-security/src/main/java/com/baeldung/springsecuritytaglibs/HomeController.java b/spring-boot-security/src/main/java/com/baeldung/springsecuritytaglibs/HomeController.java new file mode 100644 index 0000000000..eca093a76f --- /dev/null +++ b/spring-boot-security/src/main/java/com/baeldung/springsecuritytaglibs/HomeController.java @@ -0,0 +1,14 @@ +package com.baeldung.springsecuritytaglibs; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +@RequestMapping("/") +public class HomeController { + + @RequestMapping + public String home() { + return "home"; + } +} diff --git a/spring-boot-security/src/main/java/com/baeldung/springsecuritytaglibs/SpringBootSecurityTagLibsApplication.java b/spring-boot-security/src/main/java/com/baeldung/springsecuritytaglibs/SpringBootSecurityTagLibsApplication.java new file mode 100644 index 0000000000..397ea47f96 --- /dev/null +++ b/spring-boot-security/src/main/java/com/baeldung/springsecuritytaglibs/SpringBootSecurityTagLibsApplication.java @@ -0,0 +1,9 @@ +package com.baeldung.springsecuritytaglibs; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.PropertySource; + +@SpringBootApplication +@PropertySource("classpath:application-taglibs.properties") +public class SpringBootSecurityTagLibsApplication { +} diff --git a/spring-boot-security/src/main/java/com/baeldung/springsecuritytaglibs/config/SpringBootSecurityTagLibsConfig.java b/spring-boot-security/src/main/java/com/baeldung/springsecuritytaglibs/config/SpringBootSecurityTagLibsConfig.java new file mode 100644 index 0000000000..665dd0bce9 --- /dev/null +++ b/spring-boot-security/src/main/java/com/baeldung/springsecuritytaglibs/config/SpringBootSecurityTagLibsConfig.java @@ -0,0 +1,31 @@ +package com.baeldung.springsecuritytaglibs.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +@Configuration +@EnableWebSecurity +public class SpringBootSecurityTagLibsConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.inMemoryAuthentication() + .withUser("testUser") + .password("password") + .roles("ADMIN"); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + // @formatter:off + http.csrf() + .and() + .authorizeRequests() + .antMatchers("/userManagement").hasRole("ADMIN") + .anyRequest().permitAll().and().httpBasic(); + // @formatter:on + } +} \ No newline at end of file diff --git a/spring-boot-security/src/main/resources/application-taglibs.properties b/spring-boot-security/src/main/resources/application-taglibs.properties new file mode 100644 index 0000000000..218868405f --- /dev/null +++ b/spring-boot-security/src/main/resources/application-taglibs.properties @@ -0,0 +1,3 @@ +#jsp config +spring.mvc.view.prefix: /WEB-INF/views/ +spring.mvc.view.suffix: .jsp diff --git a/spring-boot-security/src/main/resources/application.properties b/spring-boot-security/src/main/resources/application.properties index c2b8d70dc6..e776132359 100644 --- a/spring-boot-security/src/main/resources/application.properties +++ b/spring-boot-security/src/main/resources/application.properties @@ -1,4 +1,4 @@ #spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration #security.user.password=password #security.oauth2.client.client-id=client -#security.oauth2.client.client-secret=secret +#security.oauth2.client.client-secret=secret \ No newline at end of file diff --git a/spring-boot-security/src/main/webapp/WEB-INF/views/home.jsp b/spring-boot-security/src/main/webapp/WEB-INF/views/home.jsp new file mode 100644 index 0000000000..80ecd61cb5 --- /dev/null +++ b/spring-boot-security/src/main/webapp/WEB-INF/views/home.jsp @@ -0,0 +1,38 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ taglib prefix="sec" + uri="http://www.springframework.org/security/tags"%> + + + + + +Home Page + + + + Login + + + + Logout + + + +

+ Welcome back, +

+ + Manage Users + +
+ + Text Field:
+ + + +
Manage Users + + + + \ No newline at end of file diff --git a/spring-boot-security/src/test/java/com/baeldung/springsecuritytaglibs/HomeControllerUnitTest.java b/spring-boot-security/src/test/java/com/baeldung/springsecuritytaglibs/HomeControllerUnitTest.java new file mode 100644 index 0000000000..0585c06a59 --- /dev/null +++ b/spring-boot-security/src/test/java/com/baeldung/springsecuritytaglibs/HomeControllerUnitTest.java @@ -0,0 +1,60 @@ +package com.baeldung.springsecuritytaglibs; + +import static org.junit.Assert.assertFalse; +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.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, classes = SpringBootSecurityTagLibsApplication.class) +public class HomeControllerUnitTest { + + @Autowired + private TestRestTemplate restTemplate; + + @Test + public void whenUserIsAuthenticatedThenAuthenticatedSectionsShowOnSite() throws Exception { + String body = this.restTemplate.withBasicAuth("testUser", "password") + .getForEntity("/", String.class) + .getBody(); + + // test + assertFalse(body.contains("Login")); + + // test + assertTrue(body.contains("Logout")); + + // test + assertTrue(body.contains("Manage Users")); + + // test + assertTrue(body.contains("testUser")); + + // test + assertTrue(body.contains("")); + + // test + assertTrue(body.contains(" + assertTrue(body.contains("")); + } + + @Test + public void whenUserIsNotAuthenticatedThenOnlyAnonymousSectionsShowOnSite() throws Exception { + String body = this.restTemplate.getForEntity("/", String.class) + .getBody(); + + // test + assertTrue(body.contains("Login")); + + // test + assertFalse(body.contains("Logout")); + } +} From 61de6251ec763ab3aadbb64e2e061f2ce3849410 Mon Sep 17 00:00:00 2001 From: Denis Date: Thu, 30 Aug 2018 21:58:38 +0200 Subject: [PATCH 064/128] BAEL-2144 move code to different module --- .../string/sorting/AnagramValidator.java | 29 +++++++++++++++++++ .../sorting}/AnagramValidatorUnitTest.java | 4 +-- .../string/sorting}/SortStringUnitTest.java | 2 +- 3 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 java-strings/src/main/java/com/baeldung/string/sorting/AnagramValidator.java rename {core-java/src/test/java/org/baeldung/java/sorting/string => java-strings/src/test/java/com/baeldung/string/sorting}/AnagramValidatorUnitTest.java (85%) rename {core-java/src/test/java/org/baeldung/java/sorting/string => java-strings/src/test/java/com/baeldung/string/sorting}/SortStringUnitTest.java (94%) diff --git a/java-strings/src/main/java/com/baeldung/string/sorting/AnagramValidator.java b/java-strings/src/main/java/com/baeldung/string/sorting/AnagramValidator.java new file mode 100644 index 0000000000..c4f684383d --- /dev/null +++ b/java-strings/src/main/java/com/baeldung/string/sorting/AnagramValidator.java @@ -0,0 +1,29 @@ +package com.baeldung.string.sorting; + +import java.util.Arrays; + +public class AnagramValidator { + + public static boolean isValid(String text, String anagram) { + text = prepare(text); + anagram = prepare(anagram); + + String sortedText = sort(text); + String sortedAnagram = sort(anagram); + + return sortedText.equals(sortedAnagram); + } + + private static String sort(String text) { + char[] chars = prepare(text).toCharArray(); + + Arrays.sort(chars); + return new String(chars); + } + + private static String prepare(String text) { + return text.toLowerCase() + .trim() + .replaceAll("\\s+", ""); + } +} \ No newline at end of file diff --git a/core-java/src/test/java/org/baeldung/java/sorting/string/AnagramValidatorUnitTest.java b/java-strings/src/test/java/com/baeldung/string/sorting/AnagramValidatorUnitTest.java similarity index 85% rename from core-java/src/test/java/org/baeldung/java/sorting/string/AnagramValidatorUnitTest.java rename to java-strings/src/test/java/com/baeldung/string/sorting/AnagramValidatorUnitTest.java index 7759e929ae..07d31c7187 100644 --- a/core-java/src/test/java/org/baeldung/java/sorting/string/AnagramValidatorUnitTest.java +++ b/java-strings/src/test/java/com/baeldung/string/sorting/AnagramValidatorUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.java.sorting.string; +package com.baeldung.string.sorting; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -6,7 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import org.junit.jupiter.api.Test; -import com.baeldung.sorting.string.anagram.AnagramValidator; +import com.baeldung.string.sorting.AnagramValidator; class AnagramValidatorUnitTest { diff --git a/core-java/src/test/java/org/baeldung/java/sorting/string/SortStringUnitTest.java b/java-strings/src/test/java/com/baeldung/string/sorting/SortStringUnitTest.java similarity index 94% rename from core-java/src/test/java/org/baeldung/java/sorting/string/SortStringUnitTest.java rename to java-strings/src/test/java/com/baeldung/string/sorting/SortStringUnitTest.java index 73fd29f0d3..90d1dad554 100644 --- a/core-java/src/test/java/org/baeldung/java/sorting/string/SortStringUnitTest.java +++ b/java-strings/src/test/java/com/baeldung/string/sorting/SortStringUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.java.sorting.string; +package com.baeldung.string.sorting; import java.util.Arrays; From db0caea58884a3c573d08a1e4290e73743c3b4b5 Mon Sep 17 00:00:00 2001 From: Denis Date: Thu, 30 Aug 2018 22:08:34 +0200 Subject: [PATCH 065/128] BAEL-2144 remove duplicated anagram validator from old location --- .../string/anagram/AnagramValidator.java | 29 ------------------- 1 file changed, 29 deletions(-) delete mode 100644 core-java/src/main/java/com/baeldung/sorting/string/anagram/AnagramValidator.java diff --git a/core-java/src/main/java/com/baeldung/sorting/string/anagram/AnagramValidator.java b/core-java/src/main/java/com/baeldung/sorting/string/anagram/AnagramValidator.java deleted file mode 100644 index a12571b2e2..0000000000 --- a/core-java/src/main/java/com/baeldung/sorting/string/anagram/AnagramValidator.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.baeldung.sorting.string.anagram; - -import java.util.Arrays; - -public class AnagramValidator { - - public static boolean isValid(String text, String anagram) { - text = prepare(text); - anagram = prepare(anagram); - - String sortedText = sort(text); - String sortedAnagram = sort(anagram); - - return sortedText.equals(sortedAnagram); - } - - private static String sort(String text) { - char[] chars = prepare(text).toCharArray(); - - Arrays.sort(chars); - return new String(chars); - } - - private static String prepare(String text) { - return text.toLowerCase() - .trim() - .replaceAll("\\s+", ""); - } -} \ No newline at end of file From 382459037568fea792202b36d1179b1e9ec922f5 Mon Sep 17 00:00:00 2001 From: myluckagain Date: Fri, 31 Aug 2018 02:42:16 +0500 Subject: [PATCH 066/128] float to double (#5118) --- .../LinesIntersectionService.java | 10 +++++----- .../LinesIntersectionServiceUnitTest.java | 20 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/linesintersection/LinesIntersectionService.java b/core-java/src/main/java/com/baeldung/linesintersection/LinesIntersectionService.java index e4fed5a22e..a2cce53c8f 100644 --- a/core-java/src/main/java/com/baeldung/linesintersection/LinesIntersectionService.java +++ b/core-java/src/main/java/com/baeldung/linesintersection/LinesIntersectionService.java @@ -5,17 +5,17 @@ import java.util.Optional; public class LinesIntersectionService { - public Optional calculateIntersectionPoint(float m1, float b1, float m2, float b2) { + public Optional calculateIntersectionPoint(double m1, double b1, double m2, double b2) { if (m1 == m2) { return Optional.empty(); } - - float x = (b2 - b1) / (m1 - m2); - float y = m1 * x + b1; - Point point = new Point(Math.round(x), Math.round(y)); + double x = (b2 - b1) / (m1 - m2); + double y = m1 * x + b1; + Point point = new Point(); + point.setLocation(x, y); return Optional.of(point); } } diff --git a/core-java/src/test/java/com/baeldung/linesintersection/LinesIntersectionServiceUnitTest.java b/core-java/src/test/java/com/baeldung/linesintersection/LinesIntersectionServiceUnitTest.java index 90c93fe050..47f1fd45a1 100644 --- a/core-java/src/test/java/com/baeldung/linesintersection/LinesIntersectionServiceUnitTest.java +++ b/core-java/src/test/java/com/baeldung/linesintersection/LinesIntersectionServiceUnitTest.java @@ -14,24 +14,24 @@ public class LinesIntersectionServiceUnitTest { @Test public void givenNotParallelLines_whenCalculatePoint_thenPresent() { - float m1 = 0; - float b1 = 0; - float m2 = 1; - float b2 = -1; + double m1 = 0; + double b1 = 0; + double m2 = 1; + double b2 = -1; Optional point = service.calculateIntersectionPoint(m1, b1, m2, b2); assertTrue(point.isPresent()); - assertEquals(point.get().x, 1); - assertEquals(point.get().y, 0); + assertEquals(point.get().getX(), 1, 0.001); + assertEquals(point.get().getX(), 1, 0.001); } @Test public void givenParallelLines_whenCalculatePoint_thenEmpty() { - float m1 = 1; - float b1 = 0; - float m2 = 1; - float b2 = -1; + double m1 = 1; + double b1 = 0; + double m2 = 1; + double b2 = -1; Optional point = service.calculateIntersectionPoint(m1, b1, m2, b2); From d7edc9a7c2812cf5ef7aeac6c0ad452185b29fe0 Mon Sep 17 00:00:00 2001 From: Alejandro Gervasio Date: Thu, 30 Aug 2018 22:31:26 -0300 Subject: [PATCH 067/128] BAEL-2102 - Configure a Tomcat Connection Pool in Spring Boot (#5095) * Initial Commit * Initial Commit * Initial Commit * Update CommandLineCrudRunner.java * Update pom.xml * Update Customer.java * Update application.properties * Update pom.xml * Update SpringBootConsoleApplication.java * Update SpringBootConsoleApplication.java * Update SpringBootConsoleApplication.java * Update CommandLineCrudRunner.java * Update pom.xml --- spring-boot-persistence/pom.xml | 128 ++++++++++-------- .../SpringBootConsoleApplication.java | 22 +++ .../application/entities/Customer.java | 53 ++++++++ .../repositories/CustomerRepository.java | 12 ++ .../runners/CommandLineCrudRunner.java | 37 +++++ .../src/main/resources/application.properties | 18 ++- ...otTomcatConnectionPoolIntegrationTest.java | 22 +++ 7 files changed, 235 insertions(+), 57 deletions(-) create mode 100644 spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/SpringBootConsoleApplication.java create mode 100644 spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/entities/Customer.java create mode 100644 spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/repositories/CustomerRepository.java create mode 100644 spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/runners/CommandLineCrudRunner.java create mode 100644 spring-boot-persistence/src/test/java/com/baeldung/tomcatconnectionpool/test/application/SpringBootTomcatConnectionPoolIntegrationTest.java diff --git a/spring-boot-persistence/pom.xml b/spring-boot-persistence/pom.xml index a16d953581..08989edfa9 100644 --- a/spring-boot-persistence/pom.xml +++ b/spring-boot-persistence/pom.xml @@ -1,57 +1,75 @@ - - 4.0.0 + + + 4.0.0 + + com.baeldung + spring-boot-persistence + 0.1.0 + + + parent-boot-2 com.baeldung - spring-boot-persistence 0.0.1-SNAPSHOT - jar - spring-boot-persistence - This is a simple Spring Data Repositories test - - - parent-boot-2 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-2 - - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - com.h2database - h2 - - - org.springframework.boot - spring-boot-starter - - - - - spring-boot-persistence - - - src/main/resources - true - - - - - org.apache.maven.plugins - maven-war-plugin - - - pl.project13.maven - git-commit-id-plugin - ${git-commit-id-plugin.version} - - - - - - 2.2.4 - - \ No newline at end of file + ../parent-boot-2 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.zaxxer + HikariCP + + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.apache.tomcat + tomcat-jdbc + ${tomcat-jdbc.version} + + + mysql + mysql-connector-java + ${mysql-connector-java.version} + + + com.h2database + h2 + ${h2database.version} + runtime + + + + + UTF-8 + 1.8 + 8.0.12 + 9.0.10 + 1.4.197 + + + + spring-boot-persistence + + + src/main/resources + true + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/SpringBootConsoleApplication.java b/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/SpringBootConsoleApplication.java new file mode 100644 index 0000000000..ff37442cd4 --- /dev/null +++ b/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/SpringBootConsoleApplication.java @@ -0,0 +1,22 @@ +package com.baeldung.tomcatconnectionpool.application; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@SpringBootApplication +@EnableAutoConfiguration +@ComponentScan(basePackages={"com.baeldung.tomcatconnectionpool.application"}) +@EnableJpaRepositories(basePackages="com.baeldung.tomcatconnectionpool.application.repositories") +@EnableTransactionManagement +@EntityScan(basePackages="com.baeldung.tomcatconnectionpool.application.entities") +public class SpringBootConsoleApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringBootConsoleApplication.class); + } +} diff --git a/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/entities/Customer.java b/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/entities/Customer.java new file mode 100644 index 0000000000..4003d5aca9 --- /dev/null +++ b/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/entities/Customer.java @@ -0,0 +1,53 @@ +package com.baeldung.tomcatconnectionpool.application.entities; + +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 = "customers") +public class Customer { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + @Column(name = "first_name") + private String firstName; + @Column(name = "last_name") + private String lastName; + + public Customer() {} + + public Customer(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } + + public long getId() { + return id; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + @Override + public String toString() { + return "Customer{" + "id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + '}'; + } +} diff --git a/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/repositories/CustomerRepository.java b/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/repositories/CustomerRepository.java new file mode 100644 index 0000000000..770906439c --- /dev/null +++ b/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/repositories/CustomerRepository.java @@ -0,0 +1,12 @@ +package com.baeldung.tomcatconnectionpool.application.repositories; + +import com.baeldung.tomcatconnectionpool.application.entities.Customer; +import java.util.List; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface CustomerRepository extends CrudRepository { + + List findByLastName(String lastName); +} diff --git a/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/runners/CommandLineCrudRunner.java b/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/runners/CommandLineCrudRunner.java new file mode 100644 index 0000000000..9666bac5a5 --- /dev/null +++ b/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/runners/CommandLineCrudRunner.java @@ -0,0 +1,37 @@ +package com.baeldung.tomcatconnectionpool.application.runners; + +import com.baeldung.tomcatconnectionpool.application.entities.Customer; +import com.baeldung.tomcatconnectionpool.application.repositories.CustomerRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +@Component +public class CommandLineCrudRunner implements CommandLineRunner { + + private static final Logger logger = LoggerFactory.getLogger(CommandLineCrudRunner.class); + + @Autowired + private CustomerRepository customerRepository; + + @Override + public void run(String... args) throws Exception { + customerRepository.save(new Customer("John", "Doe")); + customerRepository.save(new Customer("Jennifer", "Wilson")); + + logger.info("Customers found with findAll():"); + customerRepository.findAll().forEach(c -> logger.info(c.toString())); + + logger.info("Customer found with findById(1L):"); + Customer customer = customerRepository.findById(1L) + .orElseGet(() -> new Customer("Non-existing customer", "")); + logger.info(customer.toString()); + + logger.info("Customer found with findByLastName('Wilson'):"); + customerRepository.findByLastName("Wilson").forEach(c -> { + logger.info(c.toString()); + }); + } +} diff --git a/spring-boot-persistence/src/main/resources/application.properties b/spring-boot-persistence/src/main/resources/application.properties index d0fb785fe8..303ce33c25 100644 --- a/spring-boot-persistence/src/main/resources/application.properties +++ b/spring-boot-persistence/src/main/resources/application.properties @@ -1,2 +1,16 @@ -spring.jpa.show-sql=true -spring.jpa.hibernate.ddl-auto=none \ No newline at end of file +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 diff --git a/spring-boot-persistence/src/test/java/com/baeldung/tomcatconnectionpool/test/application/SpringBootTomcatConnectionPoolIntegrationTest.java b/spring-boot-persistence/src/test/java/com/baeldung/tomcatconnectionpool/test/application/SpringBootTomcatConnectionPoolIntegrationTest.java new file mode 100644 index 0000000000..c68e137fb0 --- /dev/null +++ b/spring-boot-persistence/src/test/java/com/baeldung/tomcatconnectionpool/test/application/SpringBootTomcatConnectionPoolIntegrationTest.java @@ -0,0 +1,22 @@ +package com.baeldung.tomcatconnectionpool.test.application; + +import javax.sql.DataSource; +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.*; +import org.springframework.boot.test.context.SpringBootTest; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class SpringBootTomcatConnectionPoolIntegrationTest { + + @Autowired + private DataSource dataSource; + + @Test + public void givenTomcatConnectionPoolInstance_whenCheckedPoolClassName_thenCorrect() { + assertThat(dataSource.getClass().getName()).isEqualTo("org.apache.tomcat.jdbc.pool.DataSource"); + } +} From cd55d47e8a82ff9d3360931cf54b62fdabb12c3d Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Fri, 31 Aug 2018 20:22:40 +0530 Subject: [PATCH 068/128] BAEL-8824 Align module names, folder names and artifact id - Fixed artifact ids of projects to align with folder names --- JGit/pom.xml | 3 ++- apache-avro/pom.xml | 3 ++- couchbase/pom.xml | 4 ++-- ejb/wildfly/pom.xml | 3 ++- ejb/wildfly/wildfly-mdb/pom.xml | 5 +++-- feign/pom.xml | 3 ++- google-web-toolkit/pom.xml | 5 +++-- grpc/pom.xml | 6 +++--- guest/remote-debugging/pom.xml | 3 ++- jhipster/jhipster-microservice/car-app/pom.xml | 4 ++-- jhipster/jhipster-microservice/dealer-app/pom.xml | 4 ++-- jhipster/jhipster-microservice/gateway-app/pom.xml | 4 ++-- jjwt/pom.xml | 4 ++-- micronaut/pom.xml | 4 +++- osgi/pom.xml | 3 ++- persistence-modules/spring-data-dynamodb/pom.xml | 4 ++-- resteasy/pom.xml | 3 ++- spring-amqp/pom.xml | 4 ++-- spring-boot-jasypt/pom.xml | 5 ++--- spring-cloud/spring-cloud-ribbon-client/pom.xml | 2 +- spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml | 3 ++- spring-ejb/ejb-beans/pom.xml | 4 ++-- spring-ejb/pom.xml | 4 ++-- spring-freemarker/pom.xml | 2 +- spring-reactive-kotlin/pom.xml | 5 ++--- spring-remoting/remoting-http/pom.xml | 2 +- spring-rest-embedded-tomcat/pom.xml | 2 +- spring-roo/pom.xml | 4 ++-- .../spring-security-x509-basic-auth/pom.xml | 4 ++-- .../spring-security-x509-client-auth/pom.xml | 4 ++-- spring-spel/pom.xml | 3 ++- spring-vertx/pom.xml | 4 ++-- struts-2/pom.xml | 4 ++-- vaadin/pom.xml | 4 ++-- 34 files changed, 68 insertions(+), 57 deletions(-) diff --git a/JGit/pom.xml b/JGit/pom.xml index d1ebd364da..176d55d321 100644 --- a/JGit/pom.xml +++ b/JGit/pom.xml @@ -3,10 +3,11 @@ 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 - JGitSnippets + JGit 1.0-SNAPSHOT jar http://maven.apache.org + JGit com.baeldung diff --git a/apache-avro/pom.xml b/apache-avro/pom.xml index 39da518269..3e3234ff96 100644 --- a/apache-avro/pom.xml +++ b/apache-avro/pom.xml @@ -4,8 +4,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung - apache-avro-tutorial + apache-avro 0.0.1-SNAPSHOT + Apache Avro UTF-8 diff --git a/couchbase/pom.xml b/couchbase/pom.xml index f6397fe309..4f0f8787ca 100644 --- a/couchbase/pom.xml +++ b/couchbase/pom.xml @@ -3,11 +3,11 @@ 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 - couchbase-sdk + couchbase 0.1-SNAPSHOT jar couchbase - Couchbase SDK Tutorials + Couchbase Tutorials com.baeldung diff --git a/ejb/wildfly/pom.xml b/ejb/wildfly/pom.xml index 7159096f3c..53d10a90ed 100644 --- a/ejb/wildfly/pom.xml +++ b/ejb/wildfly/pom.xml @@ -2,9 +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 com.baeldung.ejb diff --git a/ejb/wildfly/wildfly-mdb/pom.xml b/ejb/wildfly/wildfly-mdb/pom.xml index 0b2ec7d5a3..186ddc50c0 100644 --- a/ejb/wildfly/wildfly-mdb/pom.xml +++ b/ejb/wildfly/wildfly-mdb/pom.xml @@ -1,8 +1,9 @@ 4.0.0 - widlfly-mdb - + wildfly-mdb + wildfly-mdb + com.baeldung.wildfly wildfly-example diff --git a/feign/pom.xml b/feign/pom.xml index 29c2a784bc..ea645383c1 100644 --- a/feign/pom.xml +++ b/feign/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 com.baeldung.feign - feign-client + feign + feign com.baeldung diff --git a/google-web-toolkit/pom.xml b/google-web-toolkit/pom.xml index b2f7cab355..db9ce2eac0 100644 --- a/google-web-toolkit/pom.xml +++ b/google-web-toolkit/pom.xml @@ -6,10 +6,11 @@ 4.0.0 com.baeldung - google_web_toolkit + google-web-toolkit war 1.0-SNAPSHOT - + google-web-toolkit + com.baeldung parent-modules diff --git a/grpc/pom.xml b/grpc/pom.xml index 218e2df008..949f26d376 100644 --- a/grpc/pom.xml +++ b/grpc/pom.xml @@ -1,11 +1,11 @@ 4.0.0 - grpc - grpc-demo + grpc 0.0.1-SNAPSHOT jar - + grpc + com.baeldung parent-modules diff --git a/guest/remote-debugging/pom.xml b/guest/remote-debugging/pom.xml index 67fed3f1a1..974421de97 100644 --- a/guest/remote-debugging/pom.xml +++ b/guest/remote-debugging/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.stackify - java-remote-debugging + remote-debugging 0.0.1-SNAPSHOT war + remote-debugging org.springframework.boot diff --git a/jhipster/jhipster-microservice/car-app/pom.xml b/jhipster/jhipster-microservice/car-app/pom.xml index 77fddf9c72..c52def554f 100644 --- a/jhipster/jhipster-microservice/car-app/pom.xml +++ b/jhipster/jhipster-microservice/car-app/pom.xml @@ -10,10 +10,10 @@ ../../../parent-boot-1 com.car.app - carapp + car-app 0.0.1-SNAPSHOT war - Carapp + car-app ${maven.version} diff --git a/jhipster/jhipster-microservice/dealer-app/pom.xml b/jhipster/jhipster-microservice/dealer-app/pom.xml index 5f6485a203..a9366e9bd3 100644 --- a/jhipster/jhipster-microservice/dealer-app/pom.xml +++ b/jhipster/jhipster-microservice/dealer-app/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"> 4.0.0 com.dealer.app - dealerapp + dealer-app 0.0.1-SNAPSHOT war - Dealerapp + dealer-app parent-boot-1 diff --git a/jhipster/jhipster-microservice/gateway-app/pom.xml b/jhipster/jhipster-microservice/gateway-app/pom.xml index 85b3688efa..0ae74e11bb 100644 --- a/jhipster/jhipster-microservice/gateway-app/pom.xml +++ b/jhipster/jhipster-microservice/gateway-app/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"> 4.0.0 com.gateway - gateway + gateway-app 0.0.1-SNAPSHOT war - Gateway + gateway-app parent-boot-1 diff --git a/jjwt/pom.xml b/jjwt/pom.xml index 189e957e42..6bf9f4426a 100644 --- a/jjwt/pom.xml +++ b/jjwt/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 io.jsonwebtoken - jjwtfun + jjwt 0.0.1-SNAPSHOT jar - jjwtfun + jjwt Exercising the JJWT diff --git a/micronaut/pom.xml b/micronaut/pom.xml index 56d051e506..7b722306b6 100644 --- a/micronaut/pom.xml +++ b/micronaut/pom.xml @@ -1,8 +1,10 @@ 4.0.0 com.baeldung.micronaut - hello-world + micronaut 0.1 + micronaut + com.baeldung.micronaut.helloworld.server.ServerApplication 1.0.0.M2 diff --git a/osgi/pom.xml b/osgi/pom.xml index 7c59fbaff4..9ebcb09091 100644 --- a/osgi/pom.xml +++ b/osgi/pom.xml @@ -2,9 +2,10 @@ 4.0.0 - osgi-intro + osgi pom 1.0-SNAPSHOT + osgi com.baeldung diff --git a/persistence-modules/spring-data-dynamodb/pom.xml b/persistence-modules/spring-data-dynamodb/pom.xml index e5bd78d208..f3d794d001 100644 --- a/persistence-modules/spring-data-dynamodb/pom.xml +++ b/persistence-modules/spring-data-dynamodb/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 - spring-boot-dynamodb + spring-data-dynamodb 0.0.1-SNAPSHOT jar - spring-boot-dynamodb + spring-data-dynamodb This is simple boot application for Spring boot dynamodb test diff --git a/resteasy/pom.xml b/resteasy/pom.xml index 867c1f4c1b..31a6ed485a 100644 --- a/resteasy/pom.xml +++ b/resteasy/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 - resteasy-tutorial + resteasy 1.0 war + resteasy com.baeldung diff --git a/spring-amqp/pom.xml b/spring-amqp/pom.xml index 065fce7d35..e08a4243b3 100755 --- a/spring-amqp/pom.xml +++ b/spring-amqp/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 - springamqp + spring-amqp 0.1-SNAPSHOT jar - springamqp + spring-amqp Introduction to Spring-AMQP diff --git a/spring-boot-jasypt/pom.xml b/spring-boot-jasypt/pom.xml index 8b7a475824..212f524da6 100644 --- a/spring-boot-jasypt/pom.xml +++ b/spring-boot-jasypt/pom.xml @@ -4,11 +4,10 @@ 4.0.0 com.example.jasypt - JasyptDemo + spring-boot-jasypt 0.0.1-SNAPSHOT jar - - JasyptDemo + spring-boot-jasypt Demo project for Spring Boot diff --git a/spring-cloud/spring-cloud-ribbon-client/pom.xml b/spring-cloud/spring-cloud-ribbon-client/pom.xml index fd69dbe043..12125f4cf3 100644 --- a/spring-cloud/spring-cloud-ribbon-client/pom.xml +++ b/spring-cloud/spring-cloud-ribbon-client/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 com.baeldung - spring-cloud-ribbon + spring-cloud-ribbon-client 0.0.1-SNAPSHOT jar spring-cloud-ribbon-client diff --git a/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml b/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml index afe609288d..f97d78099f 100644 --- a/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml +++ b/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml @@ -2,8 +2,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 org.baeldung.cloud - springcloudtask + springcloudtaskbatch 0.0.1-SNAPSHOT + springcloudtaskbatch parent-boot-1 diff --git a/spring-ejb/ejb-beans/pom.xml b/spring-ejb/ejb-beans/pom.xml index 7a569ae4fb..6ab48741f3 100644 --- a/spring-ejb/ejb-beans/pom.xml +++ b/spring-ejb/ejb-beans/pom.xml @@ -2,9 +2,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.singletonsession - singleton-ejb-bean + ejb-beans 1.0.0-SNAPSHOT - EJB Singleton Session Bean + EJB Beans com.baeldung.spring.ejb diff --git a/spring-ejb/pom.xml b/spring-ejb/pom.xml index c034405cc6..454d9782e4 100755 --- a/spring-ejb/pom.xml +++ b/spring-ejb/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.ejb - ejb-for-spring + spring-ejb 1.0.1 pom - ejb + spring-ejb Spring EJB Tutorial diff --git a/spring-freemarker/pom.xml b/spring-freemarker/pom.xml index 9c694256f3..96607f7f10 100644 --- a/spring-freemarker/pom.xml +++ b/spring-freemarker/pom.xml @@ -2,7 +2,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 com.freemarker.example - spring4-freemarker-example + spring-freemarker war 1.0-SNAPSHOT Spring Freemarker Example diff --git a/spring-reactive-kotlin/pom.xml b/spring-reactive-kotlin/pom.xml index 409457995a..bff39984e0 100644 --- a/spring-reactive-kotlin/pom.xml +++ b/spring-reactive-kotlin/pom.xml @@ -2,10 +2,9 @@ 4.0.0 - springreactivekotlin + spring-reactive-kotlin jar - - springreactivekotlin + Spring Reactive Kotlin Demo project for Spring Boot diff --git a/spring-remoting/remoting-http/pom.xml b/spring-remoting/remoting-http/pom.xml index 439f6782ba..95b5ad3e14 100644 --- a/spring-remoting/remoting-http/pom.xml +++ b/spring-remoting/remoting-http/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.baeldung - spring-remoting + remoting-http 1.0-SNAPSHOT spring-remoting-http diff --git a/spring-rest-embedded-tomcat/pom.xml b/spring-rest-embedded-tomcat/pom.xml index 1a1adce6db..9f6eb0d703 100644 --- a/spring-rest-embedded-tomcat/pom.xml +++ b/spring-rest-embedded-tomcat/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 org.baeldung.embedded - SpringRestTomcat + spring-rest-embedded-tomcat 0.0.1-SNAPSHOT spring-rest-embedded-tomcat war diff --git a/spring-roo/pom.xml b/spring-roo/pom.xml index e689ab11aa..c205c98dc0 100644 --- a/spring-roo/pom.xml +++ b/spring-roo/pom.xml @@ -4,9 +4,9 @@ 4.0.0 com.baeldung - roo + spring-roo 1.0.0.BUILD-SNAPSHOT - roo + Spring Roo jar 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 9ae1ec65b2..67f2b4fbcd 100644 --- a/spring-security-x509/spring-security-x509-basic-auth/pom.xml +++ b/spring-security-x509/spring-security-x509-basic-auth/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 - basic-secured-server + spring-security-x509-basic-auth 0.0.1-SNAPSHOT jar - basic-secured-server + Spring Security x.509 Basic Authentication 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 4ade2aacd6..5cb4001a94 100644 --- a/spring-security-x509/spring-security-x509-client-auth/pom.xml +++ b/spring-security-x509/spring-security-x509-client-auth/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 - client-auth-server + spring-security-x509-client-auth 0.0.1-SNAPSHOT jar - client-auth-server + Spring Security x.509 Client Authentication Spring x.509 Client Authentication Demo diff --git a/spring-spel/pom.xml b/spring-spel/pom.xml index da8be2ca8d..4af318fde2 100644 --- a/spring-spel/pom.xml +++ b/spring-spel/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 - spel + spring-spel 1.0-SNAPSHOT + Spring SpEL com.baeldung diff --git a/spring-vertx/pom.xml b/spring-vertx/pom.xml index 4ba90b841e..69a043ed01 100644 --- a/spring-vertx/pom.xml +++ b/spring-vertx/pom.xml @@ -4,10 +4,10 @@ 4.0.0 com.baeldung - vertx-spring + spring-vertx 0.0.1-SNAPSHOT jar - spring-vertx + Spring Vertx A demo project with vertx spring integration diff --git a/struts-2/pom.xml b/struts-2/pom.xml index 26998fa544..fee68c8303 100644 --- a/struts-2/pom.xml +++ b/struts-2/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 - struts + struts-2 0.0.1-SNAPSHOT pom - struts + Struts 2 com.baeldung diff --git a/vaadin/pom.xml b/vaadin/pom.xml index 07f0ccbd1c..ce2cd592d7 100644 --- a/vaadin/pom.xml +++ b/vaadin/pom.xml @@ -4,10 +4,10 @@ 4.0.0 org.test - vaadin-app + vaadin war 1.0-SNAPSHOT - vaadin-app + Vaadin 3 From 5e3a0c7ad370fdb729ca84682b04d2fef0f59450 Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Sat, 1 Sep 2018 01:28:27 +0100 Subject: [PATCH 069/128] BAEL-2033 - Removing duplicates and @Test (#5125) * removed BenchmarkUnitTest from cove-java-8 * Removed StreamsOrderingUnitTest from core-java-8 * Removed test annotation from the unit test This test will not need to be run manually. --- .../streamordering/BenchmarkUnitTest.java | 97 ------------ .../StreamsOrderingUnitTest.java | 149 ------------------ .../streamordering/BenchmarkUnitTest.java | 1 - 3 files changed, 247 deletions(-) delete mode 100644 core-java-8/src/test/java/com/baeldung/streamordering/BenchmarkUnitTest.java delete mode 100644 core-java-8/src/test/java/com/baeldung/streamordering/StreamsOrderingUnitTest.java diff --git a/core-java-8/src/test/java/com/baeldung/streamordering/BenchmarkUnitTest.java b/core-java-8/src/test/java/com/baeldung/streamordering/BenchmarkUnitTest.java deleted file mode 100644 index 9ae0a16514..0000000000 --- a/core-java-8/src/test/java/com/baeldung/streamordering/BenchmarkUnitTest.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.baeldung.streamordering; - -import org.junit.Test; -import org.openjdk.jmh.annotations.*; -import org.openjdk.jmh.infra.Blackhole; -import org.openjdk.jmh.runner.Runner; -import org.openjdk.jmh.runner.options.Options; -import org.openjdk.jmh.runner.options.OptionsBuilder; -import org.openjdk.jmh.runner.options.TimeValue; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; -import java.util.concurrent.TimeUnit; -import java.util.stream.IntStream; - - -public class BenchmarkUnitTest -{ - - @Test - public void - launchBenchmark() throws Exception { - - Options opt = new OptionsBuilder() - // Specify which benchmarks to run. - // You can be more specific if you'd like to run only one benchmark per test. - .include(this.getClass().getName() + ".*") - // Set the following options as needed - .mode (Mode.AverageTime) - .timeUnit(TimeUnit.MICROSECONDS) - .warmupTime(TimeValue.seconds(1)) - .warmupIterations(2) - .measurementTime(TimeValue.seconds(1)) - .measurementIterations(2) - .threads(2) - .forks(1) - .shouldFailOnError(true) - .shouldDoGC(true) - //.jvmArgs("-XX:+UnlockDiagnosticVMOptions", "-XX:+PrintInlining") - //.addProfiler(WinPerfAsmProfiler.class) - .build(); - - new Runner(opt).run(); - - - } - - @Benchmark - public void givenOrderedStreamInput_whenStreamFiltered_showOpsPerMS(){ - IntStream.range(1, 100_000_000).parallel().filter(i -> i % 10 == 0).toArray(); - } - - @Benchmark - public void givenUnorderedStreamInput_whenStreamFiltered_showOpsPerMS(){ - IntStream.range(1,100_000_000).unordered().parallel().filter(i -> i % 10 == 0).toArray(); - } - - @Benchmark - public void givenUnorderedStreamInput_whenStreamDistinct_showOpsPerMS(){ - IntStream.range(1, 1_000_000).unordered().parallel().distinct().toArray(); - } - - @Benchmark - public void givenOrderedStreamInput_whenStreamDistinct_showOpsPerMS() { - //section 5.1. - IntStream.range(1, 1_000_000).parallel().distinct().toArray(); - } - - - // The JMH samples are the best documentation for how to use it - // http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/ - @State(Scope.Thread) - public static class BenchmarkState - { - List list; - - @Setup(Level.Trial) public void - initialize() { - - Random rand = new Random(); - - list = new ArrayList<>(); - for (int i = 0; i < 1000; i++) - list.add (rand.nextInt()); - } - } - - @Benchmark public void - benchmark1 (BenchmarkState state, Blackhole bh) { - - List list = state.list; - - for (int i = 0; i < 1000; i++) - bh.consume (list.get (i)); - } -} diff --git a/core-java-8/src/test/java/com/baeldung/streamordering/StreamsOrderingUnitTest.java b/core-java-8/src/test/java/com/baeldung/streamordering/StreamsOrderingUnitTest.java deleted file mode 100644 index 43a233d353..0000000000 --- a/core-java-8/src/test/java/com/baeldung/streamordering/StreamsOrderingUnitTest.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.baeldung.streamordering; - -import org.junit.Before; -import org.junit.Test; - -import java.util.*; -import java.util.function.Function; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import static org.junit.Assert.assertEquals; - -public class StreamsOrderingUnitTest { - - Logger logger = Logger.getLogger( StreamsOrderingUnitTest.class.getName()); - - @Before - public void setUp() throws Exception { - logger.setLevel(Level.ALL); - } - - @Test - public void givenTwoCollections_whenStreamed_thenCheckOutputDifferent(){ - - List list = Arrays.asList("B", "A", "C", "D", "F"); - Set set = new TreeSet<>(Arrays.asList("B", "A", "C", "D", "F")); - - Object[] listOutput = list.stream().toArray(); - Object[] setOutput = set.stream().toArray(); - - assertEquals("[B, A, C, D, F]", Arrays.toString(listOutput)); - assertEquals("[A, B, C, D, F]", Arrays.toString(setOutput)); - - } - - @Test - public void givenTwoCollections_whenStreamedInParallel_thenCheckOutputDifferent(){ - - List list = Arrays.asList("B", "A", "C", "D", "F"); - Set set = new TreeSet<>(Arrays.asList("B", "A", "C", "D", "F")); - - Object[] listOutput = list.stream().parallel().toArray(); - Object[] setOutput = set.stream().parallel().toArray(); - - assertEquals("[B, A, C, D, F]", Arrays.toString(listOutput)); - assertEquals("[A, B, C, D, F]", Arrays.toString(setOutput)); - - } - - - - @Test - public void givenOrderedInput_whenUnorderedAndOrderedCompared_thenCheckUnorderedOutputChanges(){ - Set set = new TreeSet<>( - Arrays.asList(-9, -5, -4, -2, 1, 2, 4, 5, 7, 9, 12, 13, 16, 29, 23, 34, 57, 68, 90, 102, 230)); - - Object[] orderedArray = set.stream() - .parallel() - .limit(5) - .toArray(); - Object[] unorderedArray = set.stream() - .unordered() - .parallel() - .limit(5) - .toArray(); - - logger.info(Arrays.toString(orderedArray)); - logger.info(Arrays.toString(unorderedArray)); - } - - - @Test - public void givenUnsortedStreamInput_whenStreamSorted_thenCheckOrderChanged(){ - - List list = Arrays.asList(-3,10,-4,1,3); - - Object[] listOutput = list.stream().toArray(); - Object[] listOutputSorted = list.stream().sorted().toArray(); - - assertEquals("[-3, 10, -4, 1, 3]", Arrays.toString(listOutput)); - assertEquals("[-4, -3, 1, 3, 10]", Arrays.toString(listOutputSorted)); - - } - - @Test - public void givenUnsortedStreamInput_whenStreamDistinct_thenShowTimeTaken(){ - long start, end; - start = System.currentTimeMillis(); - IntStream.range(1,1_000_000).unordered().parallel().distinct().toArray(); - end = System.currentTimeMillis(); - System.out.println(String.format("Time taken when unordered: %d ms", (end - start))); - } - - - @Test - public void givenSameCollection_whenStreamTerminated_thenCheckEachVsEachOrdered(){ - - List list = Arrays.asList("B", "A", "C", "D", "F"); - - list.stream().parallel().forEach(e -> logger.log(Level.INFO, e)); - list.stream().parallel().forEachOrdered(e -> logger.log(Level.INFO, e)); - - } - - @Test - public void givenSameCollection_whenStreamCollected_thenCheckOutput(){ - - List list = Arrays.asList("B", "A", "C", "D", "F"); - - List collectionList = list.stream().parallel().collect(Collectors.toList()); - Set collectionSet = list.stream().parallel().collect(Collectors.toCollection(TreeSet::new)); - - assertEquals("[B, A, C, D, F]", collectionList.toString()); - assertEquals("[A, B, C, D, F]", collectionSet.toString()); - - } - - - @Test - public void givenListIterationOrder_whenStreamCollectedToMap_thenCeckOrderChanged() { - List list = Arrays.asList("A", "BB", "CCC"); - - Map hashMap = list.stream().collect(Collectors.toMap(Function.identity(), String::length)); - - Object[] keySet = hashMap.keySet().toArray(); - - assertEquals("[BB, A, CCC]", Arrays.toString(keySet)); - - } - - @Test - public void givenListIteration_whenStreamCollectedtoHashMap_thenCheckOrderMaintained() { - List list = Arrays.asList("A", "BB", "CCC", "CCC"); - - Map linkedHashMap = list.stream().collect(Collectors.toMap( - Function.identity(), - String::length, - (u, v) -> u, - LinkedHashMap::new - )); - - Object[] keySet = linkedHashMap.keySet().toArray(); - - assertEquals("[A, BB, CCC]", Arrays.toString(keySet)); - } - -} diff --git a/java-streams/src/test/java/com/baeldung/streamordering/BenchmarkUnitTest.java b/java-streams/src/test/java/com/baeldung/streamordering/BenchmarkUnitTest.java index 9ae0a16514..ba1cb1f726 100644 --- a/java-streams/src/test/java/com/baeldung/streamordering/BenchmarkUnitTest.java +++ b/java-streams/src/test/java/com/baeldung/streamordering/BenchmarkUnitTest.java @@ -18,7 +18,6 @@ import java.util.stream.IntStream; public class BenchmarkUnitTest { - @Test public void launchBenchmark() throws Exception { From 8cbca2f805359dfa26e6bbfda413ee9a0deb3c70 Mon Sep 17 00:00:00 2001 From: Abhinayak Swar Date: Sat, 1 Sep 2018 12:35:42 +0545 Subject: [PATCH 070/128] Code check-in for http://jira.baeldung.com/browse/BAEL-2012 (Set a Response body in JAX-RS) (#5009) * abh.swar@gmail.com: Code check-in for article on Spring WebFlux 1. EmailWebClient is the client that subscribes to the data from WebFlux server 2. EmailGenerator generates one email per second randomly 3. EmailHandler and EmailRouter deal with handling of request of the subscriber 4. Email is the POJO for data transmitted by the server * Code check-on for (http://jira.baeldung.com/browse/BAEL-1897) How to increment a Date by one day - Added code and test to increment date by one day using java 8 and joda-time - Added joda-time 2.10 dependency in pom.xml * Revert "abh.swar@gmail.com: Code check-in for article on Spring WebFlux 1. EmailWebClient is the client that subscribes to the data from WebFlux server 2. EmailGenerator generates one email per second randomly 3. EmailHandler and EmailRouter deal with handling of request of the subscriber 4. Email is the POJO for data transmitted by the server" This reverts commit 6254ad9 * Code check-on for (http://jira.baeldung.com/browse/BAEL-1897) How to increment a Date by one day - Added code and test to increment date by one day using java.util.Calendar and ApacheCommons and unit tests for it - Used properties for ${joda.version} - Formatted the code using IntelliJ formatter - Renamed DateIncrementerTest to DateIncrementerUnitTest - Changed test method names to follow _given_when_then convention * Code check-on for (http://jira.baeldung.com/browse/BAEL-1897) How to increment a Date by one day - Removed unnecessary comment * Code check-on for (http://jira.baeldung.com/browse/BAEL-1897) How to increment a Date by one day - Corrected the order of parameters of assertEquals() method * Code check-in for http://jira.baeldung.com/browse/BAEL-2012 (Set a Response body in JAX-RS) - Added a Responder resource that has all the REST endpoints - Added a POJO Person which will be used for JSON serialization * Create test * Delete test --- .../com/baeldung/jersey/server/Responder.java | 102 ++++++++++++++++++ .../baeldung/jersey/server/model/Person.java | 32 ++++++ 2 files changed, 134 insertions(+) create mode 100644 jersey/src/main/java/com/baeldung/jersey/server/Responder.java create mode 100644 jersey/src/main/java/com/baeldung/jersey/server/model/Person.java diff --git a/jersey/src/main/java/com/baeldung/jersey/server/Responder.java b/jersey/src/main/java/com/baeldung/jersey/server/Responder.java new file mode 100644 index 0000000000..cb0c976fe3 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/server/Responder.java @@ -0,0 +1,102 @@ +package com.baeldung.jersey.server; + +import com.baeldung.jersey.server.model.Person; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +@Path("/response") +public class Responder { + + @GET + @Path("/ok") + public Response getOkResponse() { + + String message = "This is a text response"; + + return Response + .status(Response.Status.OK) + .entity(message) + .build(); + } + + @GET + @Path("/not_ok") + public Response getNOkTextResponse() { + + String message = "There was an internal server error"; + + return Response + .status(Response.Status.INTERNAL_SERVER_ERROR) + .entity(message) + .build(); + } + + @GET + @Path("/text_plain") + public Response getTextResponseTypeDefined() { + + String message = "This is a plain text response"; + + return Response + .status(Response.Status.OK) + .entity(message) + .type(MediaType.TEXT_PLAIN) + .build(); + } + + @GET + @Path("/text_plain_annotation") + @Produces({ MediaType.TEXT_PLAIN }) + public Response getTextResponseTypeAnnotated() { + + String message = "This is a plain text response via annotation"; + + return Response + .status(Response.Status.OK) + .entity(message) + .build(); + } + + @GET + @Path("/pojo") + public Response getPojoResponse() { + + Person person = new Person("Abh", "Nepal"); + + return Response + .status(Response.Status.OK) + .entity(person) + .build(); + } + + @GET + @Path("/json") + public Response getJsonResponse() { + + String message = "{\"hello\": \"This is a JSON response\"}"; + + return Response + .status(Response.Status.OK) + .entity(message) + .type(MediaType.APPLICATION_JSON) + .build(); + } + + @GET + @Path("/xml") + @Produces(MediaType.TEXT_XML) + public String sayXMLHello() { + return "" + " This is a xml response "; + } + + @GET + @Path("/html") + @Produces(MediaType.TEXT_HTML) + public String sayHtmlHello() { + return " " + "" + " This is a html title " + "

" + " This is a html response body " + "

" + " "; + } +} \ No newline at end of file diff --git a/jersey/src/main/java/com/baeldung/jersey/server/model/Person.java b/jersey/src/main/java/com/baeldung/jersey/server/model/Person.java new file mode 100644 index 0000000000..98c86bbc3d --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/server/model/Person.java @@ -0,0 +1,32 @@ +package com.baeldung.jersey.server.model; + +public class Person { + String name; + String address; + + public Person(String name, String address) { + this.name = name; + this.address = address; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + @Override + public String toString() { + return "Person [name: " + getName() + " address: " + getAddress() + "]"; + } +} \ No newline at end of file From de84251d4818a124c280816b8fc9ad0d5ad89b17 Mon Sep 17 00:00:00 2001 From: myluckagain Date: Sat, 1 Sep 2018 12:54:59 +0500 Subject: [PATCH 071/128] fix y-coord (#5124) BAEL-2151 fix y-coord --- .../linesintersection/LinesIntersectionServiceUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java/src/test/java/com/baeldung/linesintersection/LinesIntersectionServiceUnitTest.java b/core-java/src/test/java/com/baeldung/linesintersection/LinesIntersectionServiceUnitTest.java index 47f1fd45a1..640115a8a0 100644 --- a/core-java/src/test/java/com/baeldung/linesintersection/LinesIntersectionServiceUnitTest.java +++ b/core-java/src/test/java/com/baeldung/linesintersection/LinesIntersectionServiceUnitTest.java @@ -23,7 +23,7 @@ public class LinesIntersectionServiceUnitTest { assertTrue(point.isPresent()); assertEquals(point.get().getX(), 1, 0.001); - assertEquals(point.get().getX(), 1, 0.001); + assertEquals(point.get().getY(), 0, 0.001); } @Test From fc69e1257b35085f081763db5d16338ffcf3a74b Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sat, 1 Sep 2018 14:51:03 +0530 Subject: [PATCH 072/128] [BAEL-8499] - Moved server related codes / articles to libraries-server module --- libraries-server/README.md | 7 ++ libraries-server/pom.xml | 71 +++++++++++++++++- .../java/com/baeldung/jetty/AsyncServlet.java | 0 .../com/baeldung/jetty/BlockingServlet.java | 0 .../java/com/baeldung/jetty/JettyServer.java | 0 .../baeldung/jetty/JettyServerFactory.java | 0 .../baeldung/jetty/LoggingRequestHandler.java | 0 .../netty/CalculatorOperationHandler.java | 0 .../com/baeldung/netty/ChannelHandlerA.java | 0 .../com/baeldung/netty/ChannelHandlerB.java | 0 .../com/baeldung/netty/ClientHandler.java | 0 .../baeldung/netty/HttpMessageHandler.java | 0 .../java/com/baeldung/netty/NettyClient.java | 0 .../java/com/baeldung/netty/NettyServer.java | 0 .../java/com/baeldung/netty/NettyServerB.java | 0 .../java/com/baeldung/netty/Operation.java | 0 .../com/baeldung/netty/ProcessingHandler.java | 0 .../java/com/baeldung/netty/RequestData.java | 0 .../baeldung/netty/RequestDataEncoder.java | 0 .../com/baeldung/netty/RequestDecoder.java | 0 .../java/com/baeldung/netty/ResponseData.java | 0 .../baeldung/netty/ResponseDataDecoder.java | 0 .../baeldung/netty/ResponseDataEncoder.java | 0 .../netty/SimpleProcessingHandler.java | 0 .../java/com/baeldung/tomcat/MyFilter.java | 0 .../java/com/baeldung/tomcat/MyServlet.java | 0 .../baeldung/tomcat/ProgrammaticTomcat.java | 0 .../baeldung/jetty/JettyIntegrationTest.java | 0 .../jetty/JettyServerFactoryUnitTest.java | 0 .../netty/EmbeddedChannelUnitTest.java | 0 .../ProgrammaticTomcatIntegrationTest.java | 0 .../resources/jetty-embedded-demo-app.war | Bin libraries/README.md | 5 -- libraries/pom.xml | 31 +------- 34 files changed, 77 insertions(+), 37 deletions(-) create mode 100644 libraries-server/README.md rename {libraries => libraries-server}/src/main/java/com/baeldung/jetty/AsyncServlet.java (100%) rename {libraries => libraries-server}/src/main/java/com/baeldung/jetty/BlockingServlet.java (100%) rename {libraries => libraries-server}/src/main/java/com/baeldung/jetty/JettyServer.java (100%) rename {libraries => libraries-server}/src/main/java/com/baeldung/jetty/JettyServerFactory.java (100%) rename {libraries => libraries-server}/src/main/java/com/baeldung/jetty/LoggingRequestHandler.java (100%) rename {libraries => libraries-server}/src/main/java/com/baeldung/netty/CalculatorOperationHandler.java (100%) rename {libraries => libraries-server}/src/main/java/com/baeldung/netty/ChannelHandlerA.java (100%) rename {libraries => libraries-server}/src/main/java/com/baeldung/netty/ChannelHandlerB.java (100%) rename {libraries => libraries-server}/src/main/java/com/baeldung/netty/ClientHandler.java (100%) rename {libraries => libraries-server}/src/main/java/com/baeldung/netty/HttpMessageHandler.java (100%) rename {libraries => libraries-server}/src/main/java/com/baeldung/netty/NettyClient.java (100%) rename {libraries => libraries-server}/src/main/java/com/baeldung/netty/NettyServer.java (100%) rename {libraries => libraries-server}/src/main/java/com/baeldung/netty/NettyServerB.java (100%) rename {libraries => libraries-server}/src/main/java/com/baeldung/netty/Operation.java (100%) rename {libraries => libraries-server}/src/main/java/com/baeldung/netty/ProcessingHandler.java (100%) rename {libraries => libraries-server}/src/main/java/com/baeldung/netty/RequestData.java (100%) rename {libraries => libraries-server}/src/main/java/com/baeldung/netty/RequestDataEncoder.java (100%) rename {libraries => libraries-server}/src/main/java/com/baeldung/netty/RequestDecoder.java (100%) rename {libraries => libraries-server}/src/main/java/com/baeldung/netty/ResponseData.java (100%) rename {libraries => libraries-server}/src/main/java/com/baeldung/netty/ResponseDataDecoder.java (100%) rename {libraries => libraries-server}/src/main/java/com/baeldung/netty/ResponseDataEncoder.java (100%) rename {libraries => libraries-server}/src/main/java/com/baeldung/netty/SimpleProcessingHandler.java (100%) rename {libraries => libraries-server}/src/main/java/com/baeldung/tomcat/MyFilter.java (100%) rename {libraries => libraries-server}/src/main/java/com/baeldung/tomcat/MyServlet.java (100%) rename {libraries => libraries-server}/src/main/java/com/baeldung/tomcat/ProgrammaticTomcat.java (100%) rename {libraries => libraries-server}/src/test/java/com/baeldung/jetty/JettyIntegrationTest.java (100%) rename {libraries => libraries-server}/src/test/java/com/baeldung/jetty/JettyServerFactoryUnitTest.java (100%) rename {libraries => libraries-server}/src/test/java/com/baeldung/netty/EmbeddedChannelUnitTest.java (100%) rename {libraries => libraries-server}/src/test/java/com/baeldung/tomcat/ProgrammaticTomcatIntegrationTest.java (100%) rename {libraries => libraries-server}/src/test/resources/jetty-embedded-demo-app.war (100%) diff --git a/libraries-server/README.md b/libraries-server/README.md new file mode 100644 index 0000000000..cff201fe07 --- /dev/null +++ b/libraries-server/README.md @@ -0,0 +1,7 @@ +### Relevant articles + +- [Embedded Jetty Server in Java](http://www.baeldung.com/jetty-embedded) +- [Introduction to Netty](http://www.baeldung.com/netty) +- [Exceptions in Netty](http://www.baeldung.com/netty-exception-handling) +- [Programatically Create, Configure, and Run a Tomcat Server](http://www.baeldung.com/tomcat-programmatic-setup) +- [Creating and Configuring Jetty 9 Server in Java](http://www.baeldung.com/jetty-java-programmatic) diff --git a/libraries-server/pom.xml b/libraries-server/pom.xml index 517cf6a07c..6fca09faf4 100644 --- a/libraries-server/pom.xml +++ b/libraries-server/pom.xml @@ -14,6 +14,73 @@ org.eclipse.paho org.eclipse.paho.client.mqttv3 1.2.0 - + + + + org.assertj + assertj-core + ${assertj.version} + + + org.eclipse.jetty + jetty-server + ${jetty.version} + + + org.eclipse.jetty + jetty-servlet + ${jetty.version} + + + org.eclipse.jetty + jetty-webapp + ${jetty.version} + + + org.apache.httpcomponents + httpclient + ${httpclient.version} + + + commons-logging + commons-logging + + + + + commons-io + commons-io + ${commons.io.version} + + + io.netty + netty-all + ${netty.version} + + + junit + junit + ${junit.version} + test + + + + + org.apache.tomcat + tomcat-catalina + ${tomcat.version} + -
\ No newline at end of file + + + 3.6.2 + 4.5.3 + 2.5 + 9.4.8.v20171121 + 4.1.20.Final + 4.1 + 4.12 + 8.5.24 + + +
\ No newline at end of file diff --git a/libraries/src/main/java/com/baeldung/jetty/AsyncServlet.java b/libraries-server/src/main/java/com/baeldung/jetty/AsyncServlet.java similarity index 100% rename from libraries/src/main/java/com/baeldung/jetty/AsyncServlet.java rename to libraries-server/src/main/java/com/baeldung/jetty/AsyncServlet.java diff --git a/libraries/src/main/java/com/baeldung/jetty/BlockingServlet.java b/libraries-server/src/main/java/com/baeldung/jetty/BlockingServlet.java similarity index 100% rename from libraries/src/main/java/com/baeldung/jetty/BlockingServlet.java rename to libraries-server/src/main/java/com/baeldung/jetty/BlockingServlet.java diff --git a/libraries/src/main/java/com/baeldung/jetty/JettyServer.java b/libraries-server/src/main/java/com/baeldung/jetty/JettyServer.java similarity index 100% rename from libraries/src/main/java/com/baeldung/jetty/JettyServer.java rename to libraries-server/src/main/java/com/baeldung/jetty/JettyServer.java diff --git a/libraries/src/main/java/com/baeldung/jetty/JettyServerFactory.java b/libraries-server/src/main/java/com/baeldung/jetty/JettyServerFactory.java similarity index 100% rename from libraries/src/main/java/com/baeldung/jetty/JettyServerFactory.java rename to libraries-server/src/main/java/com/baeldung/jetty/JettyServerFactory.java diff --git a/libraries/src/main/java/com/baeldung/jetty/LoggingRequestHandler.java b/libraries-server/src/main/java/com/baeldung/jetty/LoggingRequestHandler.java similarity index 100% rename from libraries/src/main/java/com/baeldung/jetty/LoggingRequestHandler.java rename to libraries-server/src/main/java/com/baeldung/jetty/LoggingRequestHandler.java diff --git a/libraries/src/main/java/com/baeldung/netty/CalculatorOperationHandler.java b/libraries-server/src/main/java/com/baeldung/netty/CalculatorOperationHandler.java similarity index 100% rename from libraries/src/main/java/com/baeldung/netty/CalculatorOperationHandler.java rename to libraries-server/src/main/java/com/baeldung/netty/CalculatorOperationHandler.java diff --git a/libraries/src/main/java/com/baeldung/netty/ChannelHandlerA.java b/libraries-server/src/main/java/com/baeldung/netty/ChannelHandlerA.java similarity index 100% rename from libraries/src/main/java/com/baeldung/netty/ChannelHandlerA.java rename to libraries-server/src/main/java/com/baeldung/netty/ChannelHandlerA.java diff --git a/libraries/src/main/java/com/baeldung/netty/ChannelHandlerB.java b/libraries-server/src/main/java/com/baeldung/netty/ChannelHandlerB.java similarity index 100% rename from libraries/src/main/java/com/baeldung/netty/ChannelHandlerB.java rename to libraries-server/src/main/java/com/baeldung/netty/ChannelHandlerB.java diff --git a/libraries/src/main/java/com/baeldung/netty/ClientHandler.java b/libraries-server/src/main/java/com/baeldung/netty/ClientHandler.java similarity index 100% rename from libraries/src/main/java/com/baeldung/netty/ClientHandler.java rename to libraries-server/src/main/java/com/baeldung/netty/ClientHandler.java diff --git a/libraries/src/main/java/com/baeldung/netty/HttpMessageHandler.java b/libraries-server/src/main/java/com/baeldung/netty/HttpMessageHandler.java similarity index 100% rename from libraries/src/main/java/com/baeldung/netty/HttpMessageHandler.java rename to libraries-server/src/main/java/com/baeldung/netty/HttpMessageHandler.java diff --git a/libraries/src/main/java/com/baeldung/netty/NettyClient.java b/libraries-server/src/main/java/com/baeldung/netty/NettyClient.java similarity index 100% rename from libraries/src/main/java/com/baeldung/netty/NettyClient.java rename to libraries-server/src/main/java/com/baeldung/netty/NettyClient.java diff --git a/libraries/src/main/java/com/baeldung/netty/NettyServer.java b/libraries-server/src/main/java/com/baeldung/netty/NettyServer.java similarity index 100% rename from libraries/src/main/java/com/baeldung/netty/NettyServer.java rename to libraries-server/src/main/java/com/baeldung/netty/NettyServer.java diff --git a/libraries/src/main/java/com/baeldung/netty/NettyServerB.java b/libraries-server/src/main/java/com/baeldung/netty/NettyServerB.java similarity index 100% rename from libraries/src/main/java/com/baeldung/netty/NettyServerB.java rename to libraries-server/src/main/java/com/baeldung/netty/NettyServerB.java diff --git a/libraries/src/main/java/com/baeldung/netty/Operation.java b/libraries-server/src/main/java/com/baeldung/netty/Operation.java similarity index 100% rename from libraries/src/main/java/com/baeldung/netty/Operation.java rename to libraries-server/src/main/java/com/baeldung/netty/Operation.java diff --git a/libraries/src/main/java/com/baeldung/netty/ProcessingHandler.java b/libraries-server/src/main/java/com/baeldung/netty/ProcessingHandler.java similarity index 100% rename from libraries/src/main/java/com/baeldung/netty/ProcessingHandler.java rename to libraries-server/src/main/java/com/baeldung/netty/ProcessingHandler.java diff --git a/libraries/src/main/java/com/baeldung/netty/RequestData.java b/libraries-server/src/main/java/com/baeldung/netty/RequestData.java similarity index 100% rename from libraries/src/main/java/com/baeldung/netty/RequestData.java rename to libraries-server/src/main/java/com/baeldung/netty/RequestData.java diff --git a/libraries/src/main/java/com/baeldung/netty/RequestDataEncoder.java b/libraries-server/src/main/java/com/baeldung/netty/RequestDataEncoder.java similarity index 100% rename from libraries/src/main/java/com/baeldung/netty/RequestDataEncoder.java rename to libraries-server/src/main/java/com/baeldung/netty/RequestDataEncoder.java diff --git a/libraries/src/main/java/com/baeldung/netty/RequestDecoder.java b/libraries-server/src/main/java/com/baeldung/netty/RequestDecoder.java similarity index 100% rename from libraries/src/main/java/com/baeldung/netty/RequestDecoder.java rename to libraries-server/src/main/java/com/baeldung/netty/RequestDecoder.java diff --git a/libraries/src/main/java/com/baeldung/netty/ResponseData.java b/libraries-server/src/main/java/com/baeldung/netty/ResponseData.java similarity index 100% rename from libraries/src/main/java/com/baeldung/netty/ResponseData.java rename to libraries-server/src/main/java/com/baeldung/netty/ResponseData.java diff --git a/libraries/src/main/java/com/baeldung/netty/ResponseDataDecoder.java b/libraries-server/src/main/java/com/baeldung/netty/ResponseDataDecoder.java similarity index 100% rename from libraries/src/main/java/com/baeldung/netty/ResponseDataDecoder.java rename to libraries-server/src/main/java/com/baeldung/netty/ResponseDataDecoder.java diff --git a/libraries/src/main/java/com/baeldung/netty/ResponseDataEncoder.java b/libraries-server/src/main/java/com/baeldung/netty/ResponseDataEncoder.java similarity index 100% rename from libraries/src/main/java/com/baeldung/netty/ResponseDataEncoder.java rename to libraries-server/src/main/java/com/baeldung/netty/ResponseDataEncoder.java diff --git a/libraries/src/main/java/com/baeldung/netty/SimpleProcessingHandler.java b/libraries-server/src/main/java/com/baeldung/netty/SimpleProcessingHandler.java similarity index 100% rename from libraries/src/main/java/com/baeldung/netty/SimpleProcessingHandler.java rename to libraries-server/src/main/java/com/baeldung/netty/SimpleProcessingHandler.java diff --git a/libraries/src/main/java/com/baeldung/tomcat/MyFilter.java b/libraries-server/src/main/java/com/baeldung/tomcat/MyFilter.java similarity index 100% rename from libraries/src/main/java/com/baeldung/tomcat/MyFilter.java rename to libraries-server/src/main/java/com/baeldung/tomcat/MyFilter.java diff --git a/libraries/src/main/java/com/baeldung/tomcat/MyServlet.java b/libraries-server/src/main/java/com/baeldung/tomcat/MyServlet.java similarity index 100% rename from libraries/src/main/java/com/baeldung/tomcat/MyServlet.java rename to libraries-server/src/main/java/com/baeldung/tomcat/MyServlet.java diff --git a/libraries/src/main/java/com/baeldung/tomcat/ProgrammaticTomcat.java b/libraries-server/src/main/java/com/baeldung/tomcat/ProgrammaticTomcat.java similarity index 100% rename from libraries/src/main/java/com/baeldung/tomcat/ProgrammaticTomcat.java rename to libraries-server/src/main/java/com/baeldung/tomcat/ProgrammaticTomcat.java diff --git a/libraries/src/test/java/com/baeldung/jetty/JettyIntegrationTest.java b/libraries-server/src/test/java/com/baeldung/jetty/JettyIntegrationTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/jetty/JettyIntegrationTest.java rename to libraries-server/src/test/java/com/baeldung/jetty/JettyIntegrationTest.java diff --git a/libraries/src/test/java/com/baeldung/jetty/JettyServerFactoryUnitTest.java b/libraries-server/src/test/java/com/baeldung/jetty/JettyServerFactoryUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/jetty/JettyServerFactoryUnitTest.java rename to libraries-server/src/test/java/com/baeldung/jetty/JettyServerFactoryUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/netty/EmbeddedChannelUnitTest.java b/libraries-server/src/test/java/com/baeldung/netty/EmbeddedChannelUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/netty/EmbeddedChannelUnitTest.java rename to libraries-server/src/test/java/com/baeldung/netty/EmbeddedChannelUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/tomcat/ProgrammaticTomcatIntegrationTest.java b/libraries-server/src/test/java/com/baeldung/tomcat/ProgrammaticTomcatIntegrationTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/tomcat/ProgrammaticTomcatIntegrationTest.java rename to libraries-server/src/test/java/com/baeldung/tomcat/ProgrammaticTomcatIntegrationTest.java diff --git a/libraries/src/test/resources/jetty-embedded-demo-app.war b/libraries-server/src/test/resources/jetty-embedded-demo-app.war similarity index 100% rename from libraries/src/test/resources/jetty-embedded-demo-app.war rename to libraries-server/src/test/resources/jetty-embedded-demo-app.war diff --git a/libraries/README.md b/libraries/README.md index aad3a644ad..13ec65c29e 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -5,13 +5,11 @@ - [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) -- [Embedded Jetty Server in Java](http://www.baeldung.com/jetty-embedded) - [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) -- [Introduction to Netty](http://www.baeldung.com/netty) - [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) @@ -54,10 +52,7 @@ - [Introduction to BouncyCastle with Java](http://www.baeldung.com/java-bouncy-castle) - [Guide to google-http-client](http://www.baeldung.com/google-http-client) - [Interact with Google Sheets from Java](http://www.baeldung.com/google-sheets-java-client) -- [Programatically Create, Configure, and Run a Tomcat Server](http://www.baeldung.com/tomcat-programmatic-setup) - [A Docker Guide for Java](http://www.baeldung.com/docker-java-api) -- [Exceptions in Netty](http://www.baeldung.com/netty-exception-handling) -- [Creating and Configuring Jetty 9 Server in Java](http://www.baeldung.com/jetty-java-programmatic) - [Introduction To OpenCSV](http://www.baeldung.com/opencsv) - [Introduction to Akka Actors in Java](http://www.baeldung.com/akka-actors-java) - [Asynchronous HTTP with async-http-client in Java](http://www.baeldung.com/async-http-client) diff --git a/libraries/pom.xml b/libraries/pom.xml index 6b1f842aeb..80e3303ba5 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -106,21 +106,6 @@ javers-core ${javers.version} - - org.eclipse.jetty - jetty-server - ${jetty.version} - - - org.eclipse.jetty - jetty-servlet - ${jetty.version} - - - org.eclipse.jetty - jetty-webapp - ${jetty.version} - io.nats @@ -379,11 +364,6 @@ jmh-generator-annprocess ${jmh.version} - - io.netty - netty-all - ${netty.version} - junit junit @@ -658,13 +638,7 @@ test test - - - - org.apache.tomcat - tomcat-catalina - ${tomcat.version} - + org.milyn milyn-smooks-all @@ -924,7 +898,6 @@ 2.5 1.6 1.4.196 - 9.4.8.v20171121 1.0 4.5.3 @@ -937,7 +910,6 @@ 1.9.0 1.9.27 1.1.0 - 4.1.20.Final 4.1 4.12 0.10 @@ -966,7 +938,6 @@ 1.0.0 1.7.0 3.0.14 - 8.5.24 2.2.0 9.1.5.Final 4.1 From 56ba65c2ea8b43e4cf58139bf0c7f914b4a84b76 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sat, 1 Sep 2018 13:40:29 +0300 Subject: [PATCH 073/128] Update README.md --- libraries/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/README.md b/libraries/README.md index 13ec65c29e..c2c4b2718a 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -72,7 +72,6 @@ - [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) -- [Testing Netty with EmbeddedChannel](http://www.baeldung.com/testing-netty-embedded-channel) - [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) From c0f11e7d29dce7b62141fe100e36b01c2b251769 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sat, 1 Sep 2018 13:40:58 +0300 Subject: [PATCH 074/128] Update README.md --- libraries-server/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries-server/README.md b/libraries-server/README.md index cff201fe07..c25e9a10ab 100644 --- a/libraries-server/README.md +++ b/libraries-server/README.md @@ -5,3 +5,5 @@ - [Exceptions in Netty](http://www.baeldung.com/netty-exception-handling) - [Programatically Create, Configure, and Run a Tomcat Server](http://www.baeldung.com/tomcat-programmatic-setup) - [Creating and Configuring Jetty 9 Server in Java](http://www.baeldung.com/jetty-java-programmatic) +- [Testing Netty with EmbeddedChannel](http://www.baeldung.com/testing-netty-embedded-channel) + From 14b984f4d714a46938fb5d54c166b690be27394e Mon Sep 17 00:00:00 2001 From: cdjole Date: Sat, 1 Sep 2018 15:32:55 +0200 Subject: [PATCH 075/128] BAEL-2132 - Date to String conversion (#5116) * BAEL-2132 - Date to String conversion * BAEL-2132 - TimeZone set to CET --- .../DateToStringFormatterUnitTest.java | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 java-strings/src/test/java/com/baeldung/string/formatter/DateToStringFormatterUnitTest.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 new file mode 100644 index 0000000000..f236c641c3 --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/formatter/DateToStringFormatterUnitTest.java @@ -0,0 +1,67 @@ +package com.baeldung.string.formatter; + +import org.junit.BeforeClass; +import org.junit.Test; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Calendar; +import java.util.Date; +import java.util.TimeZone; + +import static org.junit.Assert.assertEquals; + +public class DateToStringFormatterUnitTest { + + private static final String DATE_FORMAT = "MMM d, yyyy HH:mm a"; + private static final String EXPECTED_STRING_DATE = "Aug 1, 2018 12:00 PM"; + private static Date date; + + @BeforeClass + public static void setUp() { + TimeZone.setDefault(TimeZone.getTimeZone("CET")); + Calendar calendar = Calendar.getInstance(); + calendar.set(2018, Calendar.AUGUST, 1, 12, 0); + date = calendar.getTime(); + } + + @Test + public void whenDateConvertedUsingSimpleDateFormatToString_thenCorrect() { + DateFormat formatter = new SimpleDateFormat(DATE_FORMAT); + String formattedDate = formatter.format(date); + + assertEquals(EXPECTED_STRING_DATE, formattedDate); + } + + @Test + public void whenDateConvertedUsingDateFormatToString_thenCorrect() { + String formattedDate = DateFormat + .getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT) + .format(date); + + assertEquals(EXPECTED_STRING_DATE, formattedDate); + } + + @Test + public void whenDateConvertedUsingFormatterToString_thenCorrect() { + String formattedDate = String.format("%1$tb %1$te, %1$tY %1$tI:%1$tM %1$Tp", date); + + assertEquals(EXPECTED_STRING_DATE, formattedDate); + } + + @Test + public void whenDateConvertedUsingDateTimeApiToString_thenCorrect() { + DateTimeFormatter fmt = DateTimeFormatter.ofPattern(DATE_FORMAT); + Instant instant = date.toInstant(); + LocalDateTime ldt = instant + .atZone(ZoneId.of("CET")) + .toLocalDateTime(); + String formattedDate = ldt.format(fmt); + + assertEquals(EXPECTED_STRING_DATE, formattedDate); + } +} From 82951cd96ca861f46ede2075e0171e8915d4402b Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sat, 1 Sep 2018 18:12:48 +0300 Subject: [PATCH 076/128] fix formatting --- spring-rest-full/pom.xml | 630 ++++++++++++++++++------------------- spring-rest-simple/pom.xml | 624 ++++++++++++++++++------------------ spring-rest/pom.xml | 552 ++++++++++++++++---------------- 3 files changed, 903 insertions(+), 903 deletions(-) diff --git a/spring-rest-full/pom.xml b/spring-rest-full/pom.xml index baa1ebf51a..81c938a289 100644 --- a/spring-rest-full/pom.xml +++ b/spring-rest-full/pom.xml @@ -1,344 +1,344 @@ - 4.0.0 - com.baeldung - spring-rest-full - 0.1-SNAPSHOT - spring-rest-full - war + 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-full + 0.1-SNAPSHOT + spring-rest-full + war - - parent-boot-1 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-1 - + + parent-boot-1 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-1 + - + - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-actuator - - - org.aspectj - aspectjweaver - - - org.apache.tomcat.embed - tomcat-embed-jasper - provided - + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-actuator + + + org.aspectj + aspectjweaver + + + org.apache.tomcat.embed + tomcat-embed-jasper + provided + - + - - org.springframework - spring-core - - - commons-logging - commons-logging - - - - - org.springframework - spring-context - - - org.springframework - spring-jdbc - - - org.springframework - spring-beans - - - org.springframework - spring-aop - - - org.springframework - spring-tx - - - org.springframework - spring-expression - - - org.springframework - spring-web - - - org.springframework - spring-webmvc - - - org.springframework.data - spring-data-commons - + + org.springframework + spring-core + + + commons-logging + commons-logging + + + + + org.springframework + spring-context + + + org.springframework + spring-jdbc + + + org.springframework + spring-beans + + + org.springframework + spring-aop + + + org.springframework + spring-tx + + + org.springframework + spring-expression + + + org.springframework + spring-web + + + org.springframework + spring-webmvc + + + org.springframework.data + spring-data-commons + - + - - org.springframework.boot - spring-boot-starter-tomcat - + + org.springframework.boot + spring-boot-starter-tomcat + - + - - org.apache.httpcomponents - httpclient - - - commons-logging - commons-logging - - - - - org.apache.httpcomponents - httpcore - + + org.apache.httpcomponents + httpclient + + + commons-logging + commons-logging + + + + + org.apache.httpcomponents + httpcore + - + - - org.springframework - spring-orm - - - org.springframework.data - spring-data-jpa - - - org.hibernate - hibernate-entitymanager - - - xml-apis - xml-apis - - - org.javassist - javassist - - - mysql - mysql-connector-java - runtime - - - com.h2database - h2 - + + org.springframework + spring-orm + + + org.springframework.data + spring-data-jpa + + + org.hibernate + hibernate-entitymanager + + + xml-apis + xml-apis + + + org.javassist + javassist + + + mysql + mysql-connector-java + runtime + + + com.h2database + h2 + - + - - javax.servlet - javax.servlet-api - provided - - - javax.servlet - jstl - runtime - + + javax.servlet + javax.servlet-api + provided + + + javax.servlet + jstl + runtime + - - - com.fasterxml.jackson.core - jackson-databind - - - com.thoughtworks.xstream - xstream - ${xstream.version} - + + + com.fasterxml.jackson.core + jackson-databind + + + com.thoughtworks.xstream + xstream + ${xstream.version} + - + - - com.google.guava - guava - ${guava.version} - + + com.google.guava + guava + ${guava.version} + - + - - org.springframework - spring-test - test - + + org.springframework + spring-test + test + - - - - - - - org.hamcrest - hamcrest-library - test - + + + + + + + org.hamcrest + hamcrest-library + test + - - org.mockito - mockito-core - test - + + org.mockito + mockito-core + test + - + - - spring-rest-full - - - src/main/resources - true - - - - - org.apache.maven.plugins - maven-war-plugin - - - - org.apache.maven.plugins - maven-surefire-plugin - - 3 - true - - **/*IntegrationTest.java - **/*IntTest.java - **/*LongRunningUnitTest.java - **/*ManualTest.java - **/*LiveTest.java - **/*TestSuite.java - - - - - org.codehaus.cargo - cargo-maven2-plugin - ${cargo-maven2-plugin.version} - - true - - jetty8x - embedded - - - - - - - 8082 - - - - - - - com.mysema.maven - apt-maven-plugin - ${apt-maven-plugin.version} - - - - process - - - target/generated-sources/java - com.querydsl.apt.jpa.JPAAnnotationProcessor - - - - - - + + spring-rest-full + + + src/main/resources + true + + + + + org.apache.maven.plugins + maven-war-plugin + + + + org.apache.maven.plugins + maven-surefire-plugin + + 3 + true + + **/*IntegrationTest.java + **/*IntTest.java + **/*LongRunningUnitTest.java + **/*ManualTest.java + **/*LiveTest.java + **/*TestSuite.java + + + + + org.codehaus.cargo + cargo-maven2-plugin + ${cargo-maven2-plugin.version} + + true + + jetty8x + embedded + + + + + + + 8082 + + + + + + + com.mysema.maven + apt-maven-plugin + ${apt-maven-plugin.version} + + + + process + + + target/generated-sources/java + com.querydsl.apt.jpa.JPAAnnotationProcessor + + + + + + - - - live - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - **/*IntegrationTest.java - **/*IntTest.java - - - **/*LiveTest.java - - - - - - - json - - - - - org.codehaus.cargo - cargo-maven2-plugin - - false - - - - start-server - pre-integration-test - - start - - - - stop-server - post-integration-test - - stop - - - - - - - - + + + live + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*IntegrationTest.java + **/*IntTest.java + + + **/*LiveTest.java + + + + + + + json + + + + + org.codehaus.cargo + cargo-maven2-plugin + + false + + + + start-server + pre-integration-test + + start + + + + stop-server + post-integration-test + + stop + + + + + + + + - - - 1.4.9 + + + 1.4.9 - - 19.0 - 3.5 + + 19.0 + 3.5 - - 1.6.1 - 1.1.3 - + + 1.6.1 + 1.1.3 + \ No newline at end of file diff --git a/spring-rest-simple/pom.xml b/spring-rest-simple/pom.xml index 004c925a8f..d39e3a43c1 100644 --- a/spring-rest-simple/pom.xml +++ b/spring-rest-simple/pom.xml @@ -1,339 +1,339 @@ - 4.0.0 - com.baeldung - spring-rest-simple - 0.1-SNAPSHOT - spring-rest-simple - war + 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-simple + 0.1-SNAPSHOT + spring-rest-simple + war - - parent-boot-1 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-1 - + + parent-boot-1 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-1 + - + - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-devtools - - - org.springframework.boot - spring-boot-starter-test - test - + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-devtools + + + org.springframework.boot + spring-boot-starter-test + test + - - - org.springframework - spring-web - - - commons-logging - commons-logging - - - - - org.springframework - spring-webmvc - - - org.springframework - spring-oxm - - - commons-fileupload - commons-fileupload - ${commons-fileupload.version} - - + + + org.springframework + spring-web + + + commons-logging + commons-logging + + + + + org.springframework + spring-webmvc + + + org.springframework + spring-oxm + + + commons-fileupload + commons-fileupload + ${commons-fileupload.version} + + - - javax.servlet - javax.servlet-api - provided - - - javax.servlet - jstl - runtime - + + javax.servlet + javax.servlet-api + provided + + + javax.servlet + jstl + runtime + - + - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.dataformat - jackson-dataformat-xml - - - com.thoughtworks.xstream - xstream - ${xstream.version} - + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + + + com.thoughtworks.xstream + xstream + ${xstream.version} + - + - - com.google.guava - guava - ${guava.version} - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - + + com.google.guava + guava + ${guava.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + - + - - org.slf4j - slf4j-api - - - ch.qos.logback - logback-classic - - - - org.slf4j - jcl-over-slf4j - - + + org.slf4j + slf4j-api + + + ch.qos.logback + logback-classic + + + + org.slf4j + jcl-over-slf4j + + - + - - com.squareup.okhttp3 - okhttp - ${com.squareup.okhttp3.version} - + + com.squareup.okhttp3 + okhttp + ${com.squareup.okhttp3.version} + - + - - junit - junit - test - - - org.hamcrest - hamcrest-core - test - - - org.hamcrest - hamcrest-library - test - - - org.mockito - mockito-core - test - - - org.springframework - spring-test - - - com.jayway.restassured - rest-assured - ${jayway-rest-assured.version} - - - com.google.protobuf - protobuf-java - ${protobuf-java.version} - - - com.googlecode.protobuf-java-format - protobuf-java-format - ${protobuf-java-format.version} - - - com.esotericsoftware - kryo - ${kryo.version} - - - com.jayway.jsonpath - json-path - - + + junit + junit + test + + + org.hamcrest + hamcrest-core + test + + + org.hamcrest + hamcrest-library + test + + + org.mockito + mockito-core + test + + + org.springframework + spring-test + + + com.jayway.restassured + rest-assured + ${jayway-rest-assured.version} + + + com.google.protobuf + protobuf-java + ${protobuf-java.version} + + + com.googlecode.protobuf-java-format + protobuf-java-format + ${protobuf-java-format.version} + + + com.esotericsoftware + kryo + ${kryo.version} + + + com.jayway.jsonpath + json-path + + - - spring-rest - - - src/main/resources - true - - - - - org.codehaus.cargo - cargo-maven2-plugin - ${cargo-maven2-plugin.version} - - - - tomcat8x - embedded - - - - - - - 8082 - - - - - - + + spring-rest + + + src/main/resources + true + + + + + org.codehaus.cargo + cargo-maven2-plugin + ${cargo-maven2-plugin.version} + + + + tomcat8x + embedded + + + + + + + 8082 + + + + + + - - - integration - - - - org.codehaus.cargo - cargo-maven2-plugin - - - start-server - pre-integration-test - - start - - - - stop-server - post-integration-test - - stop - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - none - - - **/*IntegrationTest.java - **/*IntTest.java - - - - - - - - - - - live - - - - org.codehaus.cargo - cargo-maven2-plugin - - - start-server - pre-integration-test - - start - - - - stop-server - post-integration-test - - stop - - - - + + + integration + + + + org.codehaus.cargo + cargo-maven2-plugin + + + start-server + pre-integration-test + + start + + + + stop-server + post-integration-test + + stop + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + none + + + **/*IntegrationTest.java + **/*IntTest.java + + + + + + + + + + + live + + + + org.codehaus.cargo + cargo-maven2-plugin + + + start-server + pre-integration-test + + start + + + + stop-server + post-integration-test + + stop + + + + - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - none - - - **/*LiveTest.java - - - cargo - - - - - + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + none + + + **/*LiveTest.java + + + cargo + + + + + - - - - + + + + - - 1.3.3 - 4.0.0 - 1.4 - 3.1.0 - 3.5 - 1.4.9 + + 1.3.3 + 4.0.0 + 1.4 + 3.1.0 + 3.5 + 1.4.9 - - 20.0 - 2.9.0 + + 20.0 + 2.9.0 - - 1.6.0 - 3.0.4 + + 1.6.0 + 3.0.4 - - 3.4.1 + + 3.4.1 - 2.2.0 - + 2.2.0 + diff --git a/spring-rest/pom.xml b/spring-rest/pom.xml index bd17811801..ba74d26c35 100644 --- a/spring-rest/pom.xml +++ b/spring-rest/pom.xml @@ -1,305 +1,305 @@ - 4.0.0 - spring-rest - 0.1-SNAPSHOT - spring-rest - war + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + spring-rest + 0.1-SNAPSHOT + spring-rest + war - - parent-boot-2 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-2 - + + parent-boot-2 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-2 + - + - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-devtools - - - org.springframework.boot - spring-boot-starter-test - + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-devtools + + + org.springframework.boot + spring-boot-starter-test + - - - org.springframework - spring-web - - - commons-logging - commons-logging - - - - - org.springframework - spring-webmvc - - - org.springframework - spring-oxm - - - commons-fileupload - commons-fileupload - ${commons-fileupload.version} - + + + org.springframework + spring-web + + + commons-logging + commons-logging + + + + + org.springframework + spring-webmvc + + + org.springframework + spring-oxm + + + commons-fileupload + commons-fileupload + ${commons-fileupload.version} + - - - javax.servlet - javax.servlet-api - provided - + + + javax.servlet + javax.servlet-api + provided + - - javax.servlet - jstl - runtime - + + javax.servlet + jstl + runtime + - - - com.fasterxml.jackson.core - jackson-databind - + + + com.fasterxml.jackson.core + jackson-databind + - - com.fasterxml.jackson.dataformat - jackson-dataformat-xml - + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + - - com.thoughtworks.xstream - xstream - ${xstream.version} - + + com.thoughtworks.xstream + xstream + ${xstream.version} + - - - com.google.guava - guava - ${guava.version} - - - org.apache.commons - commons-lang3 - + + + com.google.guava + guava + ${guava.version} + + + org.apache.commons + commons-lang3 + - - - com.squareup.okhttp3 - okhttp - ${com.squareup.okhttp3.version} - + + + com.squareup.okhttp3 + okhttp + ${com.squareup.okhttp3.version} + - - - org.hamcrest - hamcrest-core - test - - - org.hamcrest - hamcrest-library - test - - - org.mockito - mockito-core - test - - - org.springframework - spring-test - + + + org.hamcrest + hamcrest-core + test + + + org.hamcrest + hamcrest-library + test + + + org.mockito + mockito-core + test + + + org.springframework + spring-test + - - - com.google.protobuf - protobuf-java - ${protobuf-java.version} - - - com.googlecode.protobuf-java-format - protobuf-java-format - ${protobuf-java-format.version} - - - com.esotericsoftware - kryo - ${kryo.version} - - - com.jayway.jsonpath - json-path - + + + com.google.protobuf + protobuf-java + ${protobuf-java.version} + + + com.googlecode.protobuf-java-format + protobuf-java-format + ${protobuf-java-format.version} + + + com.esotericsoftware + kryo + ${kryo.version} + + + com.jayway.jsonpath + json-path + - - - commons-io - commons-io - 2.4 - - - au.com.dius - pact-jvm-provider-junit_2.11 - ${pact.version} - - - io.rest-assured - rest-assured - + + + commons-io + commons-io + 2.4 + + + au.com.dius + pact-jvm-provider-junit_2.11 + ${pact.version} + + + io.rest-assured + rest-assured + - + - - spring-rest - - - src/main/resources - true - - + + spring-rest + + + src/main/resources + true + + - - - org.springframework.boot - spring-boot-maven-plugin - - true - - - - org.apache.maven.plugins - maven-war-plugin - - - org.apache.maven.plugins - maven-checkstyle-plugin - ${checkstyle-maven-plugin.version} - - checkstyle.xml - - - - - check - - - - - - + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + org.apache.maven.plugins + maven-war-plugin + + + org.apache.maven.plugins + maven-checkstyle-plugin + ${checkstyle-maven-plugin.version} + + checkstyle.xml + + + + + check + + + + + + - - - live - - - - org.codehaus.cargo - cargo-maven2-plugin - - - start-server - pre-integration-test - - start - - - - stop-server - post-integration-test - - stop - - - - + + + live + + + + org.codehaus.cargo + cargo-maven2-plugin + + + start-server + pre-integration-test + + start + + + + stop-server + post-integration-test + + stop + + + + - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - none - - - **/*LiveTest.java - - - cargo - - - - - + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + none + + + **/*LiveTest.java + + + cargo + + + + + - - - + + + - + - - - - org.apache.maven.plugins - maven-checkstyle-plugin - ${checkstyle-maven-plugin.version} - - checkstyle.xml - - - - + + + + org.apache.maven.plugins + maven-checkstyle-plugin + ${checkstyle-maven-plugin.version} + + checkstyle.xml + + + + - - 1.3.2 - 4.0.0 - 1.4 - 3.1.0 - 3.5 - 1.4.9 + + 1.3.2 + 4.0.0 + 1.4 + 3.1.0 + 3.5 + 1.4.9 - - 20.0 + + 20.0 - - 1.6.0 - 3.0.4 - 3.0.0 - false - - 3.4.1 + + 1.6.0 + 3.0.4 + 3.0.0 + false + + 3.4.1 - 2.2.0 - 3.5.11 - 3.1.0 - + 2.2.0 + 3.5.11 + 3.1.0 + From a50afec871787ca2d21297e022aeafa9708c021e Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sat, 1 Sep 2018 21:36:49 +0530 Subject: [PATCH 077/128] [BAEL-8855] - Moved all code from module jpa-storedprocedure into module persistence-modules/java-jpa --- jpa-storedprocedure/README.md | 1 - persistence-modules/java-jpa/README.md | 3 ++- .../src/main/java/com/baeldung/jpa/model/Car.java | 0 .../com/baeldung/jpa/model/QueryParameter.java | 0 .../src/main/resources/META-INF/persistence.xml | 14 ++++++++++++++ .../database/FindCarByYearProcedureMySQL.sql | 0 .../config/database/create_table_mysql.sql | 0 .../main/resources/config/database/insert_cars.sql | 0 .../storedprocedure/StoredProcedureLiveTest.java | 0 .../java-jpa}/src/test/resources/persistence.xml | 0 10 files changed, 16 insertions(+), 2 deletions(-) rename {jpa-storedprocedure => persistence-modules/java-jpa}/src/main/java/com/baeldung/jpa/model/Car.java (100%) rename {jpa-storedprocedure => persistence-modules/java-jpa}/src/main/java/com/baeldung/jpa/model/QueryParameter.java (100%) rename {jpa-storedprocedure => persistence-modules/java-jpa}/src/main/resources/config/database/FindCarByYearProcedureMySQL.sql (100%) rename {jpa-storedprocedure => persistence-modules/java-jpa}/src/main/resources/config/database/create_table_mysql.sql (100%) rename {jpa-storedprocedure => persistence-modules/java-jpa}/src/main/resources/config/database/insert_cars.sql (100%) rename {jpa-storedprocedure => persistence-modules/java-jpa}/src/test/java/com/baeldung/jpa/storedprocedure/StoredProcedureLiveTest.java (100%) rename {jpa-storedprocedure => persistence-modules/java-jpa}/src/test/resources/persistence.xml (100%) diff --git a/jpa-storedprocedure/README.md b/jpa-storedprocedure/README.md index 39d6784d8b..7d843af9ea 100644 --- a/jpa-storedprocedure/README.md +++ b/jpa-storedprocedure/README.md @@ -1,2 +1 @@ ### Relevant Articles: -- [A Guide to Stored Procedures with JPA](http://www.baeldung.com/jpa-stored-procedures) diff --git a/persistence-modules/java-jpa/README.md b/persistence-modules/java-jpa/README.md index e9aabaaa74..418e0a67e2 100644 --- a/persistence-modules/java-jpa/README.md +++ b/persistence-modules/java-jpa/README.md @@ -1,3 +1,4 @@ # Relevant Articles -* [A Guide to SqlResultSetMapping](http://www.baeldung.com/jpa-sql-resultset-mapping) +- [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 diff --git a/jpa-storedprocedure/src/main/java/com/baeldung/jpa/model/Car.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/model/Car.java similarity index 100% rename from jpa-storedprocedure/src/main/java/com/baeldung/jpa/model/Car.java rename to persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/model/Car.java diff --git a/jpa-storedprocedure/src/main/java/com/baeldung/jpa/model/QueryParameter.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/model/QueryParameter.java similarity index 100% rename from jpa-storedprocedure/src/main/java/com/baeldung/jpa/model/QueryParameter.java rename to persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/model/QueryParameter.java 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 e9230eb6cd..3d881673b2 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 @@ -20,4 +20,18 @@
+ + + org.hibernate.jpa.HibernatePersistenceProvider + com.baeldung.jpa.model.Car + + + + + + + + + + \ No newline at end of file diff --git a/jpa-storedprocedure/src/main/resources/config/database/FindCarByYearProcedureMySQL.sql b/persistence-modules/java-jpa/src/main/resources/config/database/FindCarByYearProcedureMySQL.sql similarity index 100% rename from jpa-storedprocedure/src/main/resources/config/database/FindCarByYearProcedureMySQL.sql rename to persistence-modules/java-jpa/src/main/resources/config/database/FindCarByYearProcedureMySQL.sql diff --git a/jpa-storedprocedure/src/main/resources/config/database/create_table_mysql.sql b/persistence-modules/java-jpa/src/main/resources/config/database/create_table_mysql.sql similarity index 100% rename from jpa-storedprocedure/src/main/resources/config/database/create_table_mysql.sql rename to persistence-modules/java-jpa/src/main/resources/config/database/create_table_mysql.sql diff --git a/jpa-storedprocedure/src/main/resources/config/database/insert_cars.sql b/persistence-modules/java-jpa/src/main/resources/config/database/insert_cars.sql similarity index 100% rename from jpa-storedprocedure/src/main/resources/config/database/insert_cars.sql rename to persistence-modules/java-jpa/src/main/resources/config/database/insert_cars.sql diff --git a/jpa-storedprocedure/src/test/java/com/baeldung/jpa/storedprocedure/StoredProcedureLiveTest.java b/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/storedprocedure/StoredProcedureLiveTest.java similarity index 100% rename from jpa-storedprocedure/src/test/java/com/baeldung/jpa/storedprocedure/StoredProcedureLiveTest.java rename to persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/storedprocedure/StoredProcedureLiveTest.java diff --git a/jpa-storedprocedure/src/test/resources/persistence.xml b/persistence-modules/java-jpa/src/test/resources/persistence.xml similarity index 100% rename from jpa-storedprocedure/src/test/resources/persistence.xml rename to persistence-modules/java-jpa/src/test/resources/persistence.xml From d717277dcdef4bb331f788f4fe81861b6f09992f Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sat, 1 Sep 2018 22:57:19 +0530 Subject: [PATCH 078/128] [BAEL-8855] - Deleted module jpa-storedprocedure --- jpa-storedprocedure/README.md | 1 - jpa-storedprocedure/pom.xml | 65 ------------------- .../main/resources/META-INF/persistence.xml | 20 ------ .../src/main/resources/logback.xml | 13 ---- pom.xml | 2 - 5 files changed, 101 deletions(-) delete mode 100644 jpa-storedprocedure/README.md delete mode 100644 jpa-storedprocedure/pom.xml delete mode 100644 jpa-storedprocedure/src/main/resources/META-INF/persistence.xml delete mode 100644 jpa-storedprocedure/src/main/resources/logback.xml diff --git a/jpa-storedprocedure/README.md b/jpa-storedprocedure/README.md deleted file mode 100644 index 7d843af9ea..0000000000 --- a/jpa-storedprocedure/README.md +++ /dev/null @@ -1 +0,0 @@ -### Relevant Articles: diff --git a/jpa-storedprocedure/pom.xml b/jpa-storedprocedure/pom.xml deleted file mode 100644 index 79fa637cb6..0000000000 --- a/jpa-storedprocedure/pom.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - 4.0.0 - com.baeldung - jpa-storedprocedure - 1.0 - jar - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - - - javax - javaee-api - ${jee.version} - provided - - - org.hibernate - hibernate-entitymanager - ${hibernate.version} - - - - mysql - mysql-connector-java - ${mysql.version} - - - commons-io - commons-io - ${commons-io.version} - - - - - JpaStoredProcedure - - - maven-assembly-plugin - - ${project.basedir} - - - jar-with-dependencies - - - - - - - - 7.0 - 5.2.5.Final - 6.0.5 - 2.5 - - - \ No newline at end of file diff --git a/jpa-storedprocedure/src/main/resources/META-INF/persistence.xml b/jpa-storedprocedure/src/main/resources/META-INF/persistence.xml deleted file mode 100644 index 4c443cb7cf..0000000000 --- a/jpa-storedprocedure/src/main/resources/META-INF/persistence.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - org.hibernate.jpa.HibernatePersistenceProvider - com.baeldung.jpa.model.Car - - - - - - - - - - \ No newline at end of file diff --git a/jpa-storedprocedure/src/main/resources/logback.xml b/jpa-storedprocedure/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/jpa-storedprocedure/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/pom.xml b/pom.xml index 92df840079..7bed9c5cc0 100644 --- a/pom.xml +++ b/pom.xml @@ -398,7 +398,6 @@ jee-7 jhipster/jhipster-monolithic jjwt - jpa-storedprocedure jsf json-path json @@ -949,7 +948,6 @@ jgroups jee-7 jjwt - jpa-storedprocedure jsf json-path json From 409f252b0ea6df2ad791c6ac615efdbe37dfa25b Mon Sep 17 00:00:00 2001 From: DOHA Date: Sat, 1 Sep 2018 21:57:20 +0300 Subject: [PATCH 079/128] remove emojis --- java-strings/pom.xml | 7 ++ .../RemovingEmojiFromStringUnitTest.java | 78 +++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 java-strings/src/test/java/com/baeldung/string/RemovingEmojiFromStringUnitTest.java diff --git a/java-strings/pom.xml b/java-strings/pom.xml index 86b8924c4b..0c83b4d9e7 100644 --- a/java-strings/pom.xml +++ b/java-strings/pom.xml @@ -52,6 +52,13 @@ icu4j ${icu4j.version} + + + com.vdurmont + emoji-java + 4.0.0 + + diff --git a/java-strings/src/test/java/com/baeldung/string/RemovingEmojiFromStringUnitTest.java b/java-strings/src/test/java/com/baeldung/string/RemovingEmojiFromStringUnitTest.java new file mode 100644 index 0000000000..163f28d0d8 --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/RemovingEmojiFromStringUnitTest.java @@ -0,0 +1,78 @@ +package com.baeldung.string; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.not; +import static org.junit.Assert.assertThat; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.junit.Test; + +import com.vdurmont.emoji.EmojiParser; + +public class RemovingEmojiFromStringUnitTest { + String text = "la conférence, commencera à 10 heures 😅 ✿"; + String regex = "[^\\p{L}\\p{N}\\p{P}\\p{Z}]"; + + @Test + public void whenRemoveEmojiUsingLibrary_thenSuccess() { + String result = EmojiParser.removeAllEmojis(text); + System.out.println(result); + assertThat(result, not(containsString("😅"))); + assertThat(result, containsString("à")); + assertThat(result, containsString("la")); + assertThat(result, containsString("10")); + } + + @Test + public void whenReplaceEmojiUsingLibrary_thenSuccess() { + String result = EmojiParser.parseToAliases(text); + System.out.println(result); + assertThat(result, not(containsString("😅"))); + assertThat(result, containsString("sweat_smile")); + } + + @Test + public void whenRemoveEmojiUsingRegex_thenSuccess() { + String result = text.replaceAll(regex, ""); + System.out.println(result); + assertThat(result, not(containsString("😅"))); + assertThat(result, containsString("à")); + assertThat(result, containsString("la")); + assertThat(result, containsString("10")); + } + + @Test + public void whenRemoveEmojiUsingMatcher_thenSuccess() { + Pattern pattern = Pattern.compile(regex, Pattern.UNICODE_CHARACTER_CLASS); + Matcher matcher = pattern.matcher(text); + + String result = matcher.replaceAll(""); + System.out.println(result); + assertThat(result, not(containsString("😅"))); + assertThat(result, containsString("à")); + assertThat(result, containsString("la")); + assertThat(result, containsString("10")); + } + + @Test + public void whenRemoveEmojiUsingCodepoints_thenSuccess() { + String result = text.replaceAll("[\\x{0001f300}-\\x{0001f64f}]|[\\x{0001f680}-\\x{0001f6ff}]", ""); + System.out.println(result); + assertThat(result, not(containsString("😅"))); + assertThat(result, containsString("à")); + assertThat(result, containsString("la")); + assertThat(result, containsString("10")); + } + + @Test + public void whenRemoveEmojiUsingUnicode_thenSuccess() { + String result = text.replaceAll("[\ud83c\udf00-\ud83d\ude4f]|[\ud83d\ude80-\ud83d\udeff]", ""); + System.out.println(result); + assertThat(result, not(containsString("😅"))); + assertThat(result, containsString("à")); + assertThat(result, containsString("la")); + assertThat(result, containsString("10")); + } +} From 4f18b712f968f1e5a1b4a2ecacdf002e02c94143 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 2 Sep 2018 01:37:11 +0530 Subject: [PATCH 080/128] [] - Moved artices / codes from from the core-java related modules --- core-java-8/README.md | 7 ------- core-java-collections/README.md | 6 ++++++ .../java/com/baeldung/findanelement/Customer.java | 0 .../findanelement/FindACustomerInGivenList.java | 0 .../src/main/java/com/baeldung/hashtable/Word.java | 0 .../main/java/com/baeldung/iterators/Iterators.java | 0 .../com/baeldung/java}/list/CopyListService.java | 2 +- .../main/java/com/baeldung/java_8_features/Car.java | 0 .../java/com/baeldung/java_8_features/Person.java | 0 .../FindACustomerInGivenListUnitTest.java | 0 .../com/baeldung/hashtable/HashtableUnitTest.java | 0 .../com/baeldung/iterators/IteratorsUnitTest.java | 0 .../baeldung/java}/list/CopyListServiceUnitTest.java | 12 ++++++++---- .../java/com/baeldung/java8/Java8MaxMinUnitTest.java | 0 .../ShufflingCollectionsUnitTest.java | 0 15 files changed, 15 insertions(+), 12 deletions(-) rename {core-java-8 => core-java-collections}/src/main/java/com/baeldung/findanelement/Customer.java (100%) rename {core-java-8 => core-java-collections}/src/main/java/com/baeldung/findanelement/FindACustomerInGivenList.java (100%) rename {core-java-8 => core-java-collections}/src/main/java/com/baeldung/hashtable/Word.java (100%) rename {core-java-8 => core-java-collections}/src/main/java/com/baeldung/iterators/Iterators.java (100%) rename {core-java-8/src/main/java/com/baeldung => core-java-collections/src/main/java/com/baeldung/java}/list/CopyListService.java (98%) rename {core-java-8 => core-java-collections}/src/main/java/com/baeldung/java_8_features/Car.java (100%) rename {core-java-8 => core-java-collections}/src/main/java/com/baeldung/java_8_features/Person.java (100%) rename {core-java-8 => core-java-collections}/src/test/java/com/baeldung/findanelement/FindACustomerInGivenListUnitTest.java (100%) rename {core-java-8 => core-java-collections}/src/test/java/com/baeldung/hashtable/HashtableUnitTest.java (100%) rename {core-java-8 => core-java-collections}/src/test/java/com/baeldung/iterators/IteratorsUnitTest.java (100%) rename {core-java-8/src/test/java/com/baeldung => core-java-collections/src/test/java/com/baeldung/java}/list/CopyListServiceUnitTest.java (95%) rename {core-java-8 => core-java-collections}/src/test/java/com/baeldung/java8/Java8MaxMinUnitTest.java (100%) rename {core-java-8 => core-java-collections}/src/test/java/com/baeldung/shufflingcollections/ShufflingCollectionsUnitTest.java (100%) diff --git a/core-java-8/README.md b/core-java-8/README.md index 4d463482fb..e23a2a6d1e 100644 --- a/core-java-8/README.md +++ b/core-java-8/README.md @@ -15,24 +15,17 @@ - [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) -- [Finding Max/Min of a List or Collection](http://www.baeldung.com/java-collection-min-max) - [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) -- [Copy a File with Java](http://www.baeldung.com/java-copy-file) - [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) -- [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) - [Introduction to Spliterator in Java](http://www.baeldung.com/java-spliterator) - [Java 8 Math New Methods](http://www.baeldung.com/java-8-math) - [Overview of Java Built-in Annotations](http://www.baeldung.com/java-default-annotations) - [Finding Min/Max in an Array with Java](http://www.baeldung.com/java-array-min-max) - [Internationalization and Localization in Java 8](http://www.baeldung.com/java-8-localization) -- [How to Find an Element in a List with Java](http://www.baeldung.com/find-list-element-java) - [Java Optional – orElse() vs orElseGet()](http://www.baeldung.com/java-optional-or-else-vs-or-else-get) -- [An Introduction to Java.util.Hashtable Class](http://www.baeldung.com/java-hash-table) - [Method Parameter Reflection in Java](http://www.baeldung.com/java-parameter-reflection) - [Java 8 Unsigned Arithmetic Support](http://www.baeldung.com/java-unsigned-arithmetic) - [Generalized Target-Type Inference in Java](http://www.baeldung.com/java-generalized-target-type-inference) -- [Copy a List to Another List in Java](http://www.baeldung.com/java-copy-list-to-another) - [Overriding System Time for Testing in Java](http://www.baeldung.com/java-override-system-time) diff --git a/core-java-collections/README.md b/core-java-collections/README.md index 99d03cad26..ab13ba7c01 100644 --- a/core-java-collections/README.md +++ b/core-java-collections/README.md @@ -37,3 +37,9 @@ - [How to Convert List to Map in Java](http://www.baeldung.com/java-list-to-map) - [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) diff --git a/core-java-8/src/main/java/com/baeldung/findanelement/Customer.java b/core-java-collections/src/main/java/com/baeldung/findanelement/Customer.java similarity index 100% rename from core-java-8/src/main/java/com/baeldung/findanelement/Customer.java rename to core-java-collections/src/main/java/com/baeldung/findanelement/Customer.java diff --git a/core-java-8/src/main/java/com/baeldung/findanelement/FindACustomerInGivenList.java b/core-java-collections/src/main/java/com/baeldung/findanelement/FindACustomerInGivenList.java similarity index 100% rename from core-java-8/src/main/java/com/baeldung/findanelement/FindACustomerInGivenList.java rename to core-java-collections/src/main/java/com/baeldung/findanelement/FindACustomerInGivenList.java diff --git a/core-java-8/src/main/java/com/baeldung/hashtable/Word.java b/core-java-collections/src/main/java/com/baeldung/hashtable/Word.java similarity index 100% rename from core-java-8/src/main/java/com/baeldung/hashtable/Word.java rename to core-java-collections/src/main/java/com/baeldung/hashtable/Word.java diff --git a/core-java-8/src/main/java/com/baeldung/iterators/Iterators.java b/core-java-collections/src/main/java/com/baeldung/iterators/Iterators.java similarity index 100% rename from core-java-8/src/main/java/com/baeldung/iterators/Iterators.java rename to core-java-collections/src/main/java/com/baeldung/iterators/Iterators.java diff --git a/core-java-8/src/main/java/com/baeldung/list/CopyListService.java b/core-java-collections/src/main/java/com/baeldung/java/list/CopyListService.java similarity index 98% rename from core-java-8/src/main/java/com/baeldung/list/CopyListService.java rename to core-java-collections/src/main/java/com/baeldung/java/list/CopyListService.java index 55d5bb9379..5c92d856aa 100644 --- a/core-java-8/src/main/java/com/baeldung/list/CopyListService.java +++ b/core-java-collections/src/main/java/com/baeldung/java/list/CopyListService.java @@ -1,4 +1,4 @@ -package com.baeldung.list; +package com.baeldung.java.list; import java.util.ArrayList; import java.util.Collections; diff --git a/core-java-8/src/main/java/com/baeldung/java_8_features/Car.java b/core-java-collections/src/main/java/com/baeldung/java_8_features/Car.java similarity index 100% rename from core-java-8/src/main/java/com/baeldung/java_8_features/Car.java rename to core-java-collections/src/main/java/com/baeldung/java_8_features/Car.java diff --git a/core-java-8/src/main/java/com/baeldung/java_8_features/Person.java b/core-java-collections/src/main/java/com/baeldung/java_8_features/Person.java similarity index 100% rename from core-java-8/src/main/java/com/baeldung/java_8_features/Person.java rename to core-java-collections/src/main/java/com/baeldung/java_8_features/Person.java diff --git a/core-java-8/src/test/java/com/baeldung/findanelement/FindACustomerInGivenListUnitTest.java b/core-java-collections/src/test/java/com/baeldung/findanelement/FindACustomerInGivenListUnitTest.java similarity index 100% rename from core-java-8/src/test/java/com/baeldung/findanelement/FindACustomerInGivenListUnitTest.java rename to core-java-collections/src/test/java/com/baeldung/findanelement/FindACustomerInGivenListUnitTest.java diff --git a/core-java-8/src/test/java/com/baeldung/hashtable/HashtableUnitTest.java b/core-java-collections/src/test/java/com/baeldung/hashtable/HashtableUnitTest.java similarity index 100% rename from core-java-8/src/test/java/com/baeldung/hashtable/HashtableUnitTest.java rename to core-java-collections/src/test/java/com/baeldung/hashtable/HashtableUnitTest.java diff --git a/core-java-8/src/test/java/com/baeldung/iterators/IteratorsUnitTest.java b/core-java-collections/src/test/java/com/baeldung/iterators/IteratorsUnitTest.java similarity index 100% rename from core-java-8/src/test/java/com/baeldung/iterators/IteratorsUnitTest.java rename to core-java-collections/src/test/java/com/baeldung/iterators/IteratorsUnitTest.java diff --git a/core-java-8/src/test/java/com/baeldung/list/CopyListServiceUnitTest.java b/core-java-collections/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java similarity index 95% rename from core-java-8/src/test/java/com/baeldung/list/CopyListServiceUnitTest.java rename to core-java-collections/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java index 348747111f..bc1611038c 100644 --- a/core-java-8/src/test/java/com/baeldung/list/CopyListServiceUnitTest.java +++ b/core-java-collections/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java @@ -1,13 +1,17 @@ -package com.baeldung.list; +package com.baeldung.java.list; -import org.junit.Before; -import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; public class CopyListServiceUnitTest { diff --git a/core-java-8/src/test/java/com/baeldung/java8/Java8MaxMinUnitTest.java b/core-java-collections/src/test/java/com/baeldung/java8/Java8MaxMinUnitTest.java similarity index 100% rename from core-java-8/src/test/java/com/baeldung/java8/Java8MaxMinUnitTest.java rename to core-java-collections/src/test/java/com/baeldung/java8/Java8MaxMinUnitTest.java diff --git a/core-java-8/src/test/java/com/baeldung/shufflingcollections/ShufflingCollectionsUnitTest.java b/core-java-collections/src/test/java/com/baeldung/shufflingcollections/ShufflingCollectionsUnitTest.java similarity index 100% rename from core-java-8/src/test/java/com/baeldung/shufflingcollections/ShufflingCollectionsUnitTest.java rename to core-java-collections/src/test/java/com/baeldung/shufflingcollections/ShufflingCollectionsUnitTest.java From b7aa6a2caaef6dbbac7740bd67d0a3a7157ad314 Mon Sep 17 00:00:00 2001 From: Swapan Pramanick Date: Sun, 2 Sep 2018 10:38:12 +0530 Subject: [PATCH 081/128] BAEL-2140 (#5092) --- .../string/AppendCharAtPositionX.java | 45 +++++++ .../string/AppendCharAtPositionXUnitTest.java | 110 ++++++++++++++++++ 2 files changed, 155 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/string/AppendCharAtPositionX.java create mode 100644 core-java/src/test/java/com/baeldung/string/AppendCharAtPositionXUnitTest.java diff --git a/core-java/src/main/java/com/baeldung/string/AppendCharAtPositionX.java b/core-java/src/main/java/com/baeldung/string/AppendCharAtPositionX.java new file mode 100644 index 0000000000..bebffe52f1 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/string/AppendCharAtPositionX.java @@ -0,0 +1,45 @@ +/** + * + */ +package com.baeldung.string; + +/** + * @author swpraman + * + */ +public class AppendCharAtPositionX { + + public String addCharUsingCharArray(String str, char ch, int position) { + validate(str, position); + int len = str.length(); + char[] updatedArr = new char[len + 1]; + str.getChars(0, position, updatedArr, 0); + updatedArr[position] = ch; + str.getChars(position, len, updatedArr, position + 1); + return new String(updatedArr); + } + + public String addCharUsingSubstring(String str, char ch, int position) { + validate(str, position); + return str.substring(0, position) + ch + str.substring(position); + } + + public String addCharUsingStringBuilder(String str, char ch, int position) { + validate(str, position); + StringBuilder sb = new StringBuilder(str); + sb.insert(position, ch); + return sb.toString(); + } + + private void validate(String str, int position) { + if (str == null) { + throw new IllegalArgumentException("Str should not be null"); + } + int len = str.length(); + if (position < 0 || position > len) { + throw new IllegalArgumentException("position[" + position + "] should be " + + "in the range 0.." + len + " for string " + str); + } + } + +} diff --git a/core-java/src/test/java/com/baeldung/string/AppendCharAtPositionXUnitTest.java b/core-java/src/test/java/com/baeldung/string/AppendCharAtPositionXUnitTest.java new file mode 100644 index 0000000000..2cdf6145d3 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/string/AppendCharAtPositionXUnitTest.java @@ -0,0 +1,110 @@ +/** + * + */ +package com.baeldung.string; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +/** + * @author swpraman + * + */ +public class AppendCharAtPositionXUnitTest { + + private AppendCharAtPositionX appendCharAtPosition = new AppendCharAtPositionX(); + private String word = "Titanc"; + private char letter = 'i'; + + @Test + public void whenUsingCharacterArrayAndCharacterAddedAtBeginning_shouldAddCharacter() { + assertEquals("iTitanc", appendCharAtPosition.addCharUsingCharArray(word, letter, 0)); + } + + @Test + public void whenUsingSubstringAndCharacterAddedAtBeginning_shouldAddCharacter() { + assertEquals("iTitanc", appendCharAtPosition.addCharUsingSubstring(word, letter, 0)); + } + + @Test + public void whenUsingStringBuilderAndCharacterAddedAtBeginning_shouldAddCharacter() { + assertEquals("iTitanc", appendCharAtPosition.addCharUsingStringBuilder(word, letter, 0)); + } + + @Test + public void whenUsingCharacterArrayAndCharacterAddedAtMiddle_shouldAddCharacter() { + assertEquals("Titianc", appendCharAtPosition.addCharUsingCharArray(word, letter, 3)); + } + + @Test + public void whenUsingSubstringAndCharacterAddedAtMiddle_shouldAddCharacter() { + assertEquals("Titianc", appendCharAtPosition.addCharUsingSubstring(word, letter, 3)); + } + + @Test + public void whenUsingStringBuilderAndCharacterAddedAtMiddle_shouldAddCharacter() { + assertEquals("Titianc", appendCharAtPosition.addCharUsingStringBuilder(word, letter, 3)); + } + + @Test + public void whenUsingCharacterArrayAndCharacterAddedAtEnd_shouldAddCharacter() { + assertEquals("Titanci", appendCharAtPosition.addCharUsingCharArray(word, letter, word.length())); + } + + @Test + public void whenUsingSubstringAndCharacterAddedAtEnd_shouldAddCharacter() { + assertEquals("Titanci", appendCharAtPosition.addCharUsingSubstring(word, letter, word.length())); + } + + @Test + public void whenUsingStringBuilderAndCharacterAddedAtEnd_shouldAddCharacter() { + assertEquals("Titanci", appendCharAtPosition.addCharUsingStringBuilder(word, letter, word.length())); + } + + @Test(expected=IllegalArgumentException.class) + public void whenUsingCharacterArrayAndCharacterAddedAtNegativePosition_shouldThrowException() { + appendCharAtPosition.addCharUsingStringBuilder(word, letter, -1); + } + + @Test(expected=IllegalArgumentException.class) + public void whenUsingSubstringAndCharacterAddedAtNegativePosition_shouldThrowException() { + appendCharAtPosition.addCharUsingStringBuilder(word, letter, -1); + } + + @Test(expected=IllegalArgumentException.class) + public void whenUsingStringBuilderAndCharacterAddedAtNegativePosition_shouldThrowException() { + appendCharAtPosition.addCharUsingStringBuilder(word, letter, -1); + } + + @Test(expected=IllegalArgumentException.class) + public void whenUsingCharacterArrayAndCharacterAddedAtInvalidPosition_shouldThrowException() { + appendCharAtPosition.addCharUsingStringBuilder(word, letter, word.length() + 2); + } + + @Test(expected=IllegalArgumentException.class) + public void whenUsingSubstringAndCharacterAddedAtInvalidPosition_shouldThrowException() { + appendCharAtPosition.addCharUsingStringBuilder(word, letter, word.length() + 2); + } + + @Test(expected=IllegalArgumentException.class) + public void whenUsingStringBuilderAndCharacterAddedAtInvalidPosition_shouldThrowException() { + appendCharAtPosition.addCharUsingStringBuilder(word, letter, word.length() + 2); + } + + @Test(expected=IllegalArgumentException.class) + public void whenUsingCharacterArrayAndCharacterAddedAtPositionXAndStringIsNull_shouldThrowException() { + appendCharAtPosition.addCharUsingStringBuilder(null, letter, 3); + } + + @Test(expected=IllegalArgumentException.class) + public void whenUsingSubstringAndCharacterAddedAtPositionXAndStringIsNull_shouldThrowException() { + appendCharAtPosition.addCharUsingStringBuilder(null, letter, 3); + } + + @Test(expected=IllegalArgumentException.class) + public void whenUsingStringBuilderAndCharacterAddedAtPositionXAndStringIsNull_shouldThrowException() { + appendCharAtPosition.addCharUsingStringBuilder(null, letter, 3); + } + +} From b4d0b797e20fdb7353977e55bd0fca91d24b14c0 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 30 Aug 2018 20:45:12 +0200 Subject: [PATCH 082/128] [BAEL-2048] Spring Data JPA query article --- spring-data-jpa/pom.xml | 10 +++ .../config/PersistenceJPAConfigL2Cache.java | 89 +++++++++++++++++++ .../org/baeldung/persistence/model/User.java | 0 .../repository/UserRepository.java | 2 +- .../main/resources/persistence-h2.properties | 13 +++ .../UserRepositoryIntegrationTest.java | 0 6 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 spring-data-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigL2Cache.java rename {persistence-modules/spring-jpa => spring-data-jpa}/src/main/java/org/baeldung/persistence/model/User.java (100%) rename {persistence-modules/spring-jpa => spring-data-jpa}/src/main/java/org/baeldung/persistence/repository/UserRepository.java (95%) create mode 100644 spring-data-jpa/src/main/resources/persistence-h2.properties rename {persistence-modules/spring-jpa => spring-data-jpa}/src/test/java/org/baeldung/persistence/repository/UserRepositoryIntegrationTest.java (100%) diff --git a/spring-data-jpa/pom.xml b/spring-data-jpa/pom.xml index 517d43bd0e..e84115b70a 100644 --- a/spring-data-jpa/pom.xml +++ b/spring-data-jpa/pom.xml @@ -17,10 +17,20 @@ org.springframework.boot spring-boot-starter-data-jpa + + org.hibernate + hibernate-ehcache + com.h2database h2 + + + com.google.guava + guava + 21.0 +
\ No newline at end of file diff --git a/spring-data-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigL2Cache.java b/spring-data-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigL2Cache.java new file mode 100644 index 0000000000..a236cf2331 --- /dev/null +++ b/spring-data-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigL2Cache.java @@ -0,0 +1,89 @@ +package org.baeldung.config; + +import com.google.common.base.Preconditions; +import org.springframework.beans.factory.annotation.Autowired; +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.EnableJpaRepositories; +import org.springframework.jdbc.datasource.DriverManagerDataSource; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.persistence.EntityManagerFactory; +import javax.sql.DataSource; +import java.util.Properties; + +@Configuration +@EnableTransactionManagement +@PropertySource({ "classpath:persistence-h2.properties" }) +@ComponentScan({ "org.baeldung.persistence" }) +@EnableJpaRepositories(basePackages = { "org.baeldung.persistence.dao", "org.baeldung.persistence.repository" }) +public class PersistenceJPAConfigL2Cache { + + @Autowired + private Environment env; + + public PersistenceJPAConfigL2Cache() { + super(); + } + + // beans + + @Bean + public LocalContainerEntityManagerFactoryBean entityManagerFactory() { + final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); + em.setDataSource(dataSource()); + em.setPackagesToScan(getPackagesToScan()); + + final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); + em.setJpaVendorAdapter(vendorAdapter); + em.setJpaProperties(additionalProperties()); + + return em; + } + + protected String[] getPackagesToScan() { + return new String[] { "org.baeldung.persistence.model" }; + } + + @Bean + public DataSource dataSource() { + final DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName"))); + dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url"))); + dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("jdbc.user"))); + + return dataSource; + } + + @Bean + public PlatformTransactionManager transactionManager(final EntityManagerFactory emf) { + final JpaTransactionManager transactionManager = new JpaTransactionManager(); + transactionManager.setEntityManagerFactory(emf); + return transactionManager; + } + + @Bean + public PersistenceExceptionTranslationPostProcessor exceptionTranslation() { + return new PersistenceExceptionTranslationPostProcessor(); + } + + final Properties additionalProperties() { + final Properties hibernateProperties = new Properties(); + hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); + hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect")); + hibernateProperties.setProperty("hibernate.cache.use_second_level_cache", env.getProperty("hibernate.cache.use_second_level_cache")); + hibernateProperties.setProperty("hibernate.cache.use_query_cache", env.getProperty("hibernate.cache.use_query_cache")); + hibernateProperties.setProperty("hibernate.cache.region.factory_class", env.getProperty("hibernate.cache.region.factory_class")); + hibernateProperties.setProperty("hibernate.show_sql", env.getProperty("hibernate.show_sql")); + return hibernateProperties; + } + +} \ No newline at end of file diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/model/User.java b/spring-data-jpa/src/main/java/org/baeldung/persistence/model/User.java similarity index 100% rename from persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/model/User.java rename to spring-data-jpa/src/main/java/org/baeldung/persistence/model/User.java diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/repository/UserRepository.java b/spring-data-jpa/src/main/java/org/baeldung/persistence/repository/UserRepository.java similarity index 95% rename from persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/repository/UserRepository.java rename to spring-data-jpa/src/main/java/org/baeldung/persistence/repository/UserRepository.java index eadac9a0d7..5ceb6a9f04 100644 --- a/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/repository/UserRepository.java +++ b/spring-data-jpa/src/main/java/org/baeldung/persistence/repository/UserRepository.java @@ -55,7 +55,7 @@ public interface UserRepository extends JpaRepository { @Query(value = "SELECT u FROM User u ORDER BY id") Page findAllUsersWithPagination(Pageable pageable); - @Query(value = "SELECT * FROM Users ORDER BY id \n-- #pageable\n", countQuery = "SELECT count(*) FROM Users", nativeQuery = true) + @Query(value = "SELECT * FROM Users ORDER BY id", countQuery = "SELECT count(*) FROM Users", nativeQuery = true) Page findAllUsersWithPaginationNative(Pageable pageable); @Modifying diff --git a/spring-data-jpa/src/main/resources/persistence-h2.properties b/spring-data-jpa/src/main/resources/persistence-h2.properties new file mode 100644 index 0000000000..716a96fde3 --- /dev/null +++ b/spring-data-jpa/src/main/resources/persistence-h2.properties @@ -0,0 +1,13 @@ +# jdbc.X +jdbc.driverClassName=org.h2.Driver +jdbc.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 +jdbc.user=sa +jdbc.pass= + +# hibernate.X +hibernate.dialect=org.hibernate.dialect.H2Dialect +hibernate.show_sql=true +hibernate.hbm2ddl.auto=create-drop +hibernate.cache.use_second_level_cache=true +hibernate.cache.use_query_cache=true +hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory \ No newline at end of file diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/UserRepositoryIntegrationTest.java b/spring-data-jpa/src/test/java/org/baeldung/persistence/repository/UserRepositoryIntegrationTest.java similarity index 100% rename from persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/UserRepositoryIntegrationTest.java rename to spring-data-jpa/src/test/java/org/baeldung/persistence/repository/UserRepositoryIntegrationTest.java From 8aa7dc5aab0912aacb85fe24add7ff3863b1dc78 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 30 Aug 2018 22:21:24 +0200 Subject: [PATCH 083/128] [BAEL-2048] Spring Data JPA adding a method to all repositories --- .../baeldung/config/StudentJPAH2Config.java | 0 .../persistence/dao/ExtendedRepository.java | 0 .../dao/ExtendedRepositoryImpl.java | 0 .../dao/ExtendedStudentRepository.java | 0 .../inmemory/persistence/model/KVTag.java | 34 +++++++++ .../inmemory/persistence/model/SkillTag.java | 30 ++++++++ .../inmemory/persistence/model/Student.java | 74 +++++++++++++++++++ .../persistence-student-h2.properties | 12 +++ ...endedStudentRepositoryIntegrationTest.java | 0 9 files changed, 150 insertions(+) rename {persistence-modules/spring-jpa => spring-data-jpa}/src/main/java/org/baeldung/config/StudentJPAH2Config.java (100%) rename {persistence-modules/spring-jpa => spring-data-jpa}/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepository.java (100%) rename {persistence-modules/spring-jpa => spring-data-jpa}/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepositoryImpl.java (100%) rename {persistence-modules/spring-jpa => spring-data-jpa}/src/main/java/org/baeldung/extended/persistence/dao/ExtendedStudentRepository.java (100%) create mode 100644 spring-data-jpa/src/main/java/org/baeldung/inmemory/persistence/model/KVTag.java create mode 100644 spring-data-jpa/src/main/java/org/baeldung/inmemory/persistence/model/SkillTag.java create mode 100644 spring-data-jpa/src/main/java/org/baeldung/inmemory/persistence/model/Student.java create mode 100644 spring-data-jpa/src/main/resources/persistence-student-h2.properties rename {persistence-modules/spring-jpa => spring-data-jpa}/src/test/java/org/baeldung/persistence/repository/ExtendedStudentRepositoryIntegrationTest.java (100%) diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/StudentJPAH2Config.java b/spring-data-jpa/src/main/java/org/baeldung/config/StudentJPAH2Config.java similarity index 100% rename from persistence-modules/spring-jpa/src/main/java/org/baeldung/config/StudentJPAH2Config.java rename to spring-data-jpa/src/main/java/org/baeldung/config/StudentJPAH2Config.java diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepository.java b/spring-data-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepository.java similarity index 100% rename from persistence-modules/spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepository.java rename to spring-data-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepository.java diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepositoryImpl.java b/spring-data-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepositoryImpl.java similarity index 100% rename from persistence-modules/spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepositoryImpl.java rename to spring-data-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepositoryImpl.java diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedStudentRepository.java b/spring-data-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedStudentRepository.java similarity index 100% rename from persistence-modules/spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedStudentRepository.java rename to spring-data-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedStudentRepository.java diff --git a/spring-data-jpa/src/main/java/org/baeldung/inmemory/persistence/model/KVTag.java b/spring-data-jpa/src/main/java/org/baeldung/inmemory/persistence/model/KVTag.java new file mode 100644 index 0000000000..1522744116 --- /dev/null +++ b/spring-data-jpa/src/main/java/org/baeldung/inmemory/persistence/model/KVTag.java @@ -0,0 +1,34 @@ +package org.baeldung.inmemory.persistence.model; + +import javax.persistence.Embeddable; + +@Embeddable +public class KVTag { + private String key; + private String value; + + public KVTag() { + } + + public KVTag(String key, String value) { + super(); + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/spring-data-jpa/src/main/java/org/baeldung/inmemory/persistence/model/SkillTag.java b/spring-data-jpa/src/main/java/org/baeldung/inmemory/persistence/model/SkillTag.java new file mode 100644 index 0000000000..490ee0a18e --- /dev/null +++ b/spring-data-jpa/src/main/java/org/baeldung/inmemory/persistence/model/SkillTag.java @@ -0,0 +1,30 @@ +package org.baeldung.inmemory.persistence.model; + +import javax.persistence.Embeddable; + +@Embeddable +public class SkillTag { + private String name; + private int value; + + public SkillTag() { + } + + public SkillTag(String name, int value) { + super(); + this.name = name; + this.value = value; + } + + public int getValue() { + return value; + } + + public void setValue(int value) { + this.value = value; + } + + public String getName() { + return name; + } +} diff --git a/spring-data-jpa/src/main/java/org/baeldung/inmemory/persistence/model/Student.java b/spring-data-jpa/src/main/java/org/baeldung/inmemory/persistence/model/Student.java new file mode 100644 index 0000000000..26772e5ca5 --- /dev/null +++ b/spring-data-jpa/src/main/java/org/baeldung/inmemory/persistence/model/Student.java @@ -0,0 +1,74 @@ +package org.baeldung.inmemory.persistence.model; + +import javax.persistence.ElementCollection; +import javax.persistence.Entity; +import javax.persistence.Id; +import java.util.ArrayList; +import java.util.List; + +@Entity +public class Student { + + @Id + private long id; + private String name; + + @ElementCollection + private List tags = new ArrayList<>(); + + @ElementCollection + private List skillTags = new ArrayList<>(); + + @ElementCollection + private List kvTags = new ArrayList<>(); + + public Student() { + } + + public Student(long id, String name) { + super(); + 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; + } + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags.addAll(tags); + } + + public List getSkillTags() { + return skillTags; + } + + public void setSkillTags(List skillTags) { + this.skillTags.addAll(skillTags); + } + + public List getKVTags() { + return this.kvTags; + } + + public void setKVTags(List kvTags) { + this.kvTags.addAll(kvTags); + } + +} diff --git a/spring-data-jpa/src/main/resources/persistence-student-h2.properties b/spring-data-jpa/src/main/resources/persistence-student-h2.properties new file mode 100644 index 0000000000..405e6ff109 --- /dev/null +++ b/spring-data-jpa/src/main/resources/persistence-student-h2.properties @@ -0,0 +1,12 @@ +# jdbc.X +jdbc.driverClassName=org.h2.Driver +jdbc.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 +jdbc.user=sa +jdbc.pass= + +# hibernate.X +hibernate.dialect=org.hibernate.dialect.H2Dialect +hibernate.show_sql=true +hibernate.hbm2ddl.auto=create-drop +hibernate.cache.use_second_level_cache=false +hibernate.cache.use_query_cache=false \ No newline at end of file diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/ExtendedStudentRepositoryIntegrationTest.java b/spring-data-jpa/src/test/java/org/baeldung/persistence/repository/ExtendedStudentRepositoryIntegrationTest.java similarity index 100% rename from persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/ExtendedStudentRepositoryIntegrationTest.java rename to spring-data-jpa/src/test/java/org/baeldung/persistence/repository/ExtendedStudentRepositoryIntegrationTest.java From 55e09af47943adda8d793ed8b1037c2a916ffebc Mon Sep 17 00:00:00 2001 From: dupirefr Date: Sat, 1 Sep 2018 10:22:34 +0200 Subject: [PATCH 084/128] [BAEL-2048] Spring Data JPA multiple databases article --- .../multiple/model/user/Possession.java | 6 +- .../persistence/multiple/model/user/User.java | 9 +- .../org/baeldung/config/ProductConfig.java | 0 .../java/org/baeldung/config/UserConfig.java | 0 .../dao/product/ProductRepository.java | 0 .../dao/user/PossessionRepository.java | 0 .../multiple/dao/user/UserRepository.java | 0 .../multiple/model/product/Product.java | 0 .../multiple/model/user/Possession.java | 86 +++++++++++++++++++ .../persistence/multiple/model/user/User.java | 81 +++++++++++++++++ .../persistence-multiple-db.properties | 0 .../service/JpaMultipleDBIntegrationTest.java | 25 +++--- 12 files changed, 181 insertions(+), 26 deletions(-) rename {persistence-modules/spring-jpa => spring-data-jpa}/src/main/java/org/baeldung/config/ProductConfig.java (100%) rename {persistence-modules/spring-jpa => spring-data-jpa}/src/main/java/org/baeldung/config/UserConfig.java (100%) rename {persistence-modules/spring-jpa => spring-data-jpa}/src/main/java/org/baeldung/persistence/multiple/dao/product/ProductRepository.java (100%) rename {persistence-modules/spring-jpa => spring-data-jpa}/src/main/java/org/baeldung/persistence/multiple/dao/user/PossessionRepository.java (100%) rename {persistence-modules/spring-jpa => spring-data-jpa}/src/main/java/org/baeldung/persistence/multiple/dao/user/UserRepository.java (100%) rename {persistence-modules/spring-jpa => spring-data-jpa}/src/main/java/org/baeldung/persistence/multiple/model/product/Product.java (100%) create mode 100644 spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/Possession.java create mode 100644 spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java rename {persistence-modules/spring-jpa => spring-data-jpa}/src/main/resources/persistence-multiple-db.properties (100%) rename {persistence-modules/spring-jpa => spring-data-jpa}/src/test/java/org/baeldung/persistence/service/JpaMultipleDBIntegrationTest.java (84%) diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/Possession.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/Possession.java index 079888155e..7aff5f51d0 100644 --- a/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/Possession.java +++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/Possession.java @@ -1,10 +1,6 @@ package org.baeldung.persistence.multiple.model.user; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; +import javax.persistence.*; @Entity @Table(schema = "spring_jpa_user") diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java index 61904198f5..6fb9de4a47 100644 --- a/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java +++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java @@ -1,15 +1,8 @@ package org.baeldung.persistence.multiple.model.user; +import javax.persistence.*; import java.util.List; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.OneToMany; -import javax.persistence.Table; - @Entity @Table(schema = "spring_jpa_user") public class User { diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/ProductConfig.java b/spring-data-jpa/src/main/java/org/baeldung/config/ProductConfig.java similarity index 100% rename from persistence-modules/spring-jpa/src/main/java/org/baeldung/config/ProductConfig.java rename to spring-data-jpa/src/main/java/org/baeldung/config/ProductConfig.java diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/UserConfig.java b/spring-data-jpa/src/main/java/org/baeldung/config/UserConfig.java similarity index 100% rename from persistence-modules/spring-jpa/src/main/java/org/baeldung/config/UserConfig.java rename to spring-data-jpa/src/main/java/org/baeldung/config/UserConfig.java diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/product/ProductRepository.java b/spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/dao/product/ProductRepository.java similarity index 100% rename from persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/product/ProductRepository.java rename to spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/dao/product/ProductRepository.java diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/PossessionRepository.java b/spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/PossessionRepository.java similarity index 100% rename from persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/PossessionRepository.java rename to spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/PossessionRepository.java diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/UserRepository.java b/spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/UserRepository.java similarity index 100% rename from persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/UserRepository.java rename to spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/UserRepository.java diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/product/Product.java b/spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/model/product/Product.java similarity index 100% rename from persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/product/Product.java rename to spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/model/product/Product.java diff --git a/spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/Possession.java b/spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/Possession.java new file mode 100644 index 0000000000..079888155e --- /dev/null +++ b/spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/Possession.java @@ -0,0 +1,86 @@ +package org.baeldung.persistence.multiple.model.user; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(schema = "spring_jpa_user") +public class Possession { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + private String name; + + public Possession() { + super(); + } + + public Possession(final String name) { + super(); + + this.name = name; + } + + public long getId() { + return id; + } + + public void setId(final int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = (prime * result) + (int) (id ^ (id >>> 32)); + result = (prime * result) + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final Possession other = (Possession) obj; + if (id != other.id) { + return false; + } + if (name == null) { + if (other.name != null) { + return false; + } + } else if (!name.equals(other.name)) { + return false; + } + return true; + } + + @Override + public String toString() { + final StringBuilder builder = new StringBuilder(); + builder.append("Possesion [id=").append(id).append(", name=").append(name).append("]"); + return builder.toString(); + } + +} diff --git a/spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java b/spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java new file mode 100644 index 0000000000..61904198f5 --- /dev/null +++ b/spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java @@ -0,0 +1,81 @@ +package org.baeldung.persistence.multiple.model.user; + +import java.util.List; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.Table; + +@Entity +@Table(schema = "spring_jpa_user") +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + private String name; + + @Column(unique = true, nullable = false) + private String email; + + private int age; + + @OneToMany + List possessionList; + + public User() { + super(); + } + + public int getId() { + return id; + } + + public void setId(final int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(final String email) { + this.email = email; + } + + public int getAge() { + return age; + } + + public void setAge(final int age) { + this.age = age; + } + + public List getPossessionList() { + return possessionList; + } + + public void setPossessionList(List possessionList) { + this.possessionList = possessionList; + } + + @Override + public String toString() { + final StringBuilder builder = new StringBuilder(); + builder.append("User [name=").append(name).append(", id=").append(id).append("]"); + return builder.toString(); + } +} \ No newline at end of file diff --git a/persistence-modules/spring-jpa/src/main/resources/persistence-multiple-db.properties b/spring-data-jpa/src/main/resources/persistence-multiple-db.properties similarity index 100% rename from persistence-modules/spring-jpa/src/main/resources/persistence-multiple-db.properties rename to spring-data-jpa/src/main/resources/persistence-multiple-db.properties diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/JpaMultipleDBIntegrationTest.java b/spring-data-jpa/src/test/java/org/baeldung/persistence/service/JpaMultipleDBIntegrationTest.java similarity index 84% rename from persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/JpaMultipleDBIntegrationTest.java rename to spring-data-jpa/src/test/java/org/baeldung/persistence/service/JpaMultipleDBIntegrationTest.java index 6cd187230c..64b082b14d 100644 --- a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/JpaMultipleDBIntegrationTest.java +++ b/spring-data-jpa/src/test/java/org/baeldung/persistence/service/JpaMultipleDBIntegrationTest.java @@ -1,11 +1,5 @@ package org.baeldung.persistence.service; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import java.util.Arrays; - import org.baeldung.config.ProductConfig; import org.baeldung.config.UserConfig; import org.baeldung.persistence.multiple.dao.product.ProductRepository; @@ -24,6 +18,11 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.Transactional; +import java.util.Collections; +import java.util.Optional; + +import static org.junit.Assert.*; + @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { UserConfig.class, ProductConfig.class }) @EnableTransactionManagement @@ -50,12 +49,12 @@ public class JpaMultipleDBIntegrationTest { user.setAge(20); Possession p = new Possession("sample"); p = possessionRepository.save(p); - user.setPossessionList(Arrays.asList(p)); + user.setPossessionList(Collections.singletonList(p)); user = userRepository.save(user); - final User result = userRepository.findOne(user.getId()); - assertNotNull(result); - System.out.println(result.getPossessionList()); - assertTrue(result.getPossessionList().size() == 1); + final Optional result = userRepository.findById(user.getId()); + assertTrue(result.isPresent()); + System.out.println(result.get().getPossessionList()); + assertEquals(1, result.get().getPossessionList().size()); } @Test @@ -66,7 +65,7 @@ public class JpaMultipleDBIntegrationTest { user1.setEmail("john@test.com"); user1.setAge(20); user1 = userRepository.save(user1); - assertNotNull(userRepository.findOne(user1.getId())); + assertTrue(userRepository.findById(user1.getId()).isPresent()); User user2 = new User(); user2.setName("Tom"); @@ -92,7 +91,7 @@ public class JpaMultipleDBIntegrationTest { product.setPrice(20); product = productRepository.save(product); - assertNotNull(productRepository.findOne(product.getId())); + assertTrue(productRepository.findById(product.getId()).isPresent()); } } From b5a2fea255b6cd0386baddc87552d779e003a28c Mon Sep 17 00:00:00 2001 From: dupirefr Date: Sat, 1 Sep 2018 10:49:14 +0200 Subject: [PATCH 085/128] [BAEL-2048] Spring Data JPA Java 8 support article --- .../baeldung/repository/UserRepository.java | 2 - .../UserRepositoryIntegrationTest.java | 24 ------- .../java/org/baeldung/config/H2JpaConfig.java | 66 +++++++++++++++++++ .../baeldung/repository/UserRepository.java | 14 ++++ .../persistence-generic-entity.properties | 8 +++ .../UserRepositoryIntegrationTest.java | 58 ++++++++++++++++ 6 files changed, 146 insertions(+), 26 deletions(-) create mode 100644 spring-data-jpa/src/main/java/org/baeldung/config/H2JpaConfig.java create mode 100644 spring-data-jpa/src/main/java/org/baeldung/repository/UserRepository.java create mode 100644 spring-data-jpa/src/main/resources/persistence-generic-entity.properties create mode 100644 spring-data-jpa/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java diff --git a/spring-boot/src/main/java/org/baeldung/repository/UserRepository.java b/spring-boot/src/main/java/org/baeldung/repository/UserRepository.java index cba504b6c6..7335af2616 100644 --- a/spring-boot/src/main/java/org/baeldung/repository/UserRepository.java +++ b/spring-boot/src/main/java/org/baeldung/repository/UserRepository.java @@ -24,8 +24,6 @@ public interface UserRepository extends JpaRepository { Optional findOneByName(String name); - Stream findAllByName(String name); - @Async CompletableFuture findOneByStatus(Integer status); diff --git a/spring-boot/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java index 72d204820e..04bb1170f8 100644 --- a/spring-boot/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java @@ -52,30 +52,6 @@ public class UserRepositoryIntegrationTest { .getName()).isEqualTo(USER_NAME_ADAM); } - @Test - @Transactional - public void givenUsersWithSameNameInDBWhenFindAllByNameThenReturnStreamOfUsers() { - User user1 = new User(); - user1.setName(USER_NAME_ADAM); - userRepository.save(user1); - - User user2 = new User(); - user2.setName(USER_NAME_ADAM); - userRepository.save(user2); - - User user3 = new User(); - user3.setName(USER_NAME_ADAM); - userRepository.save(user3); - - User user4 = new User(); - user4.setName("SAMPLE"); - userRepository.save(user4); - - try (Stream foundUsersStream = userRepository.findAllByName(USER_NAME_ADAM)) { - assertThat(foundUsersStream.count()).isEqualTo(3l); - } - } - @Test public void givenUserInDBWhenFindOneByStatusAsyncThenReturnCompletableFutureUser() throws ExecutionException, InterruptedException { User user = new User(); diff --git a/spring-data-jpa/src/main/java/org/baeldung/config/H2JpaConfig.java b/spring-data-jpa/src/main/java/org/baeldung/config/H2JpaConfig.java new file mode 100644 index 0000000000..9f3dbeb788 --- /dev/null +++ b/spring-data-jpa/src/main/java/org/baeldung/config/H2JpaConfig.java @@ -0,0 +1,66 @@ +package org.baeldung.config; + +import org.springframework.beans.factory.annotation.Autowired; +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.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.jdbc.datasource.DriverManagerDataSource; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.persistence.EntityManagerFactory; +import javax.sql.DataSource; +import java.util.Properties; + +@Configuration +@EnableJpaRepositories(basePackages = {"org.baeldung.repository" }) +@PropertySource("classpath:persistence-generic-entity.properties") +@EnableTransactionManagement +public class H2JpaConfig { + + @Autowired + private Environment env; + + @Bean + public DataSource dataSource() { + final DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName")); + dataSource.setUrl(env.getProperty("jdbc.url")); + dataSource.setUsername(env.getProperty("jdbc.user")); + dataSource.setPassword(env.getProperty("jdbc.pass")); + + return dataSource; + } + + @Bean + public LocalContainerEntityManagerFactoryBean entityManagerFactory() { + final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); + em.setDataSource(dataSource()); + em.setPackagesToScan("org.baeldung.persistence.model"); + em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); + em.setJpaProperties(additionalProperties()); + return em; + } + + @Bean + JpaTransactionManager transactionManager(final EntityManagerFactory entityManagerFactory) { + final JpaTransactionManager transactionManager = new JpaTransactionManager(); + transactionManager.setEntityManagerFactory(entityManagerFactory); + return transactionManager; + } + + final Properties additionalProperties() { + final Properties hibernateProperties = new Properties(); + + hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); + hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect")); + hibernateProperties.setProperty("hibernate.show_sql", env.getProperty("hibernate.show_sql")); + + return hibernateProperties; + } + +} diff --git a/spring-data-jpa/src/main/java/org/baeldung/repository/UserRepository.java b/spring-data-jpa/src/main/java/org/baeldung/repository/UserRepository.java new file mode 100644 index 0000000000..623e009b6d --- /dev/null +++ b/spring-data-jpa/src/main/java/org/baeldung/repository/UserRepository.java @@ -0,0 +1,14 @@ +package org.baeldung.repository; + +import org.baeldung.persistence.model.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.stream.Stream; + +@Repository("userRepository") +public interface UserRepository extends JpaRepository { + + Stream findAllByName(String name); + +} diff --git a/spring-data-jpa/src/main/resources/persistence-generic-entity.properties b/spring-data-jpa/src/main/resources/persistence-generic-entity.properties new file mode 100644 index 0000000000..b19304cb1f --- /dev/null +++ b/spring-data-jpa/src/main/resources/persistence-generic-entity.properties @@ -0,0 +1,8 @@ +jdbc.driverClassName=org.h2.Driver +jdbc.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 +jdbc.user=sa +jdbc.pass=sa + +hibernate.dialect=org.hibernate.dialect.H2Dialect +hibernate.show_sql=true +hibernate.hbm2ddl.auto=create-drop diff --git a/spring-data-jpa/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java b/spring-data-jpa/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java new file mode 100644 index 0000000000..4a7a59e799 --- /dev/null +++ b/spring-data-jpa/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java @@ -0,0 +1,58 @@ +package org.baeldung.repository; + +import org.baeldung.config.H2JpaConfig; +import org.baeldung.persistence.model.User; +import org.junit.After; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.transaction.annotation.Transactional; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Created by adam. + */ +@RunWith(SpringRunner.class) +@SpringBootTest(classes = H2JpaConfig.class) +public class UserRepositoryIntegrationTest { + + private final String USER_NAME_ADAM = "Adam"; + + @Autowired + private UserRepository userRepository; + + @Test + @Transactional + public void givenUsersWithSameNameInDBWhenFindAllByNameThenReturnStreamOfUsers() { + User user1 = new User(); + user1.setName(USER_NAME_ADAM); + userRepository.save(user1); + + User user2 = new User(); + user2.setName(USER_NAME_ADAM); + userRepository.save(user2); + + User user3 = new User(); + user3.setName(USER_NAME_ADAM); + userRepository.save(user3); + + User user4 = new User(); + user4.setName("SAMPLE"); + userRepository.save(user4); + + try (Stream foundUsersStream = userRepository.findAllByName(USER_NAME_ADAM)) { + assertThat(foundUsersStream.count()).isEqualTo(3l); + } + } + + @After + public void cleanUp() { + userRepository.deleteAll(); + } + +} From 784d99eeb3e366b50bc3d5d5013a5bf470f17072 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Sat, 1 Sep 2018 14:01:39 +0200 Subject: [PATCH 086/128] [BAEL-2048] Introduction to Spring Data JPA article --- .../org/baeldung/persistence/IOperations.java | 30 +++ .../org/baeldung/persistence/dao/IFooDao.java | 12 + .../org/baeldung/persistence/model/Foo.java | 78 ++++++ .../persistence/service/IFooService.java | 14 + .../service/common/AbstractService.java | 61 +++++ .../persistence/service/impl/FooService.java | 55 ++++ .../baeldung/spring/PersistenceConfig.java | 83 ++++++ ...ractServicePersistenceIntegrationTest.java | 252 ++++++++++++++++++ .../FooServicePersistenceIntegrationTest.java | 76 ++++++ .../test/java/org/baeldung/util/IDUtil.java | 33 +++ 10 files changed, 694 insertions(+) create mode 100644 spring-data-jpa/src/main/java/org/baeldung/persistence/IOperations.java create mode 100644 spring-data-jpa/src/main/java/org/baeldung/persistence/dao/IFooDao.java create mode 100644 spring-data-jpa/src/main/java/org/baeldung/persistence/model/Foo.java create mode 100644 spring-data-jpa/src/main/java/org/baeldung/persistence/service/IFooService.java create mode 100644 spring-data-jpa/src/main/java/org/baeldung/persistence/service/common/AbstractService.java create mode 100644 spring-data-jpa/src/main/java/org/baeldung/persistence/service/impl/FooService.java create mode 100644 spring-data-jpa/src/main/java/org/baeldung/spring/PersistenceConfig.java create mode 100644 spring-data-jpa/src/test/java/org/baeldung/persistence/service/AbstractServicePersistenceIntegrationTest.java create mode 100644 spring-data-jpa/src/test/java/org/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java create mode 100644 spring-data-jpa/src/test/java/org/baeldung/util/IDUtil.java diff --git a/spring-data-jpa/src/main/java/org/baeldung/persistence/IOperations.java b/spring-data-jpa/src/main/java/org/baeldung/persistence/IOperations.java new file mode 100644 index 0000000000..85332899e3 --- /dev/null +++ b/spring-data-jpa/src/main/java/org/baeldung/persistence/IOperations.java @@ -0,0 +1,30 @@ +package org.baeldung.persistence; + +import org.springframework.data.domain.Page; + +import java.io.Serializable; +import java.util.List; + +public interface IOperations { + + // read - one + + T findOne(final long id); + + // read - all + + List findAll(); + + Page findPaginated(int page, int size); + + // write + + T create(final T entity); + + T update(final T entity); + + void delete(final T entity); + + void deleteById(final long entityId); + +} diff --git a/spring-data-jpa/src/main/java/org/baeldung/persistence/dao/IFooDao.java b/spring-data-jpa/src/main/java/org/baeldung/persistence/dao/IFooDao.java new file mode 100644 index 0000000000..c6d51e263b --- /dev/null +++ b/spring-data-jpa/src/main/java/org/baeldung/persistence/dao/IFooDao.java @@ -0,0 +1,12 @@ +package org.baeldung.persistence.dao; + +import org.baeldung.persistence.model.Foo; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +public interface IFooDao extends JpaRepository { + + @Query("SELECT f FROM Foo f WHERE LOWER(f.name) = LOWER(:name)") + Foo retrieveByName(@Param("name") String name); +} diff --git a/spring-data-jpa/src/main/java/org/baeldung/persistence/model/Foo.java b/spring-data-jpa/src/main/java/org/baeldung/persistence/model/Foo.java new file mode 100644 index 0000000000..c80aac6e0c --- /dev/null +++ b/spring-data-jpa/src/main/java/org/baeldung/persistence/model/Foo.java @@ -0,0 +1,78 @@ +package org.baeldung.persistence.model; + +import javax.persistence.*; +import java.io.Serializable; + +@Entity +public class Foo implements Serializable { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + + @Column(nullable = false) + private String name; + + public Foo() { + super(); + } + + public Foo(final String name) { + super(); + + this.name = name; + } + + // API + + public long getId() { + return id; + } + + public void setId(final long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + // + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + final Foo other = (Foo) obj; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; + } + + @Override + public String toString() { + final StringBuilder builder = new StringBuilder(); + builder.append("Foo [name=").append(name).append("]"); + return builder.toString(); + } + +} diff --git a/spring-data-jpa/src/main/java/org/baeldung/persistence/service/IFooService.java b/spring-data-jpa/src/main/java/org/baeldung/persistence/service/IFooService.java new file mode 100644 index 0000000000..a3d16d9c15 --- /dev/null +++ b/spring-data-jpa/src/main/java/org/baeldung/persistence/service/IFooService.java @@ -0,0 +1,14 @@ +package org.baeldung.persistence.service; + +import org.baeldung.persistence.IOperations; +import org.baeldung.persistence.model.Foo; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +public interface IFooService extends IOperations { + + Foo retrieveByName(String name); + + Page findPaginated(Pageable pageable); + +} diff --git a/spring-data-jpa/src/main/java/org/baeldung/persistence/service/common/AbstractService.java b/spring-data-jpa/src/main/java/org/baeldung/persistence/service/common/AbstractService.java new file mode 100644 index 0000000000..8201df7343 --- /dev/null +++ b/spring-data-jpa/src/main/java/org/baeldung/persistence/service/common/AbstractService.java @@ -0,0 +1,61 @@ +package org.baeldung.persistence.service.common; + +import com.google.common.collect.Lists; +import org.baeldung.persistence.IOperations; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.repository.PagingAndSortingRepository; +import org.springframework.transaction.annotation.Transactional; + +import java.io.Serializable; +import java.util.List; + +@Transactional +public abstract class AbstractService implements IOperations { + + // read - one + + @Override + @Transactional(readOnly = true) + public T findOne(final long id) { + return getDao().findById(id).orElse(null); + } + + // read - all + + @Override + @Transactional(readOnly = true) + public List findAll() { + return Lists.newArrayList(getDao().findAll()); + } + + @Override + public Page findPaginated(final int page, final int size) { + return getDao().findAll(new PageRequest(page, size)); + } + + // write + + @Override + public T create(final T entity) { + return getDao().save(entity); + } + + @Override + public T update(final T entity) { + return getDao().save(entity); + } + + @Override + public void delete(final T entity) { + getDao().delete(entity); + } + + @Override + public void deleteById(final long entityId) { + getDao().deleteById(entityId); + } + + protected abstract PagingAndSortingRepository getDao(); + +} diff --git a/spring-data-jpa/src/main/java/org/baeldung/persistence/service/impl/FooService.java b/spring-data-jpa/src/main/java/org/baeldung/persistence/service/impl/FooService.java new file mode 100644 index 0000000000..f1360b08cc --- /dev/null +++ b/spring-data-jpa/src/main/java/org/baeldung/persistence/service/impl/FooService.java @@ -0,0 +1,55 @@ +package org.baeldung.persistence.service.impl; + +import com.google.common.collect.Lists; +import org.baeldung.persistence.dao.IFooDao; +import org.baeldung.persistence.model.Foo; +import org.baeldung.persistence.service.IFooService; +import org.baeldung.persistence.service.common.AbstractService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.repository.PagingAndSortingRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@Transactional +public class FooService extends AbstractService implements IFooService { + + @Autowired + private IFooDao dao; + + public FooService() { + super(); + } + + // API + + @Override + protected PagingAndSortingRepository getDao() { + return dao; + } + + // custom methods + + @Override + public Foo retrieveByName(final String name) { + return dao.retrieveByName(name); + } + + // overridden to be secured + + @Override + @Transactional(readOnly = true) + public List findAll() { + return Lists.newArrayList(getDao().findAll()); + } + + @Override + public Page findPaginated(Pageable pageable) { + return dao.findAll(pageable); + } + +} diff --git a/spring-data-jpa/src/main/java/org/baeldung/spring/PersistenceConfig.java b/spring-data-jpa/src/main/java/org/baeldung/spring/PersistenceConfig.java new file mode 100644 index 0000000000..1696025590 --- /dev/null +++ b/spring-data-jpa/src/main/java/org/baeldung/spring/PersistenceConfig.java @@ -0,0 +1,83 @@ +package org.baeldung.spring; + +import com.google.common.base.Preconditions; +import org.springframework.beans.factory.annotation.Autowired; +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.EnableJpaRepositories; +import org.springframework.jdbc.datasource.DriverManagerDataSource; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +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; + +@Configuration +@EnableTransactionManagement +@PropertySource({ "classpath:persistence-${envTarget:h2}.properties" }) +@ComponentScan({ "org.baeldung.persistence" }) +// @ImportResource("classpath*:springDataPersistenceConfig.xml") +@EnableJpaRepositories(basePackages = "org.baeldung.persistence.dao") +public class PersistenceConfig { + + @Autowired + private Environment env; + + public PersistenceConfig() { + super(); + } + + @Bean + public LocalContainerEntityManagerFactoryBean entityManagerFactory() { + final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); + em.setDataSource(dataSource()); + em.setPackagesToScan(new String[] { "org.baeldung.persistence.model" }); + + final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); + // vendorAdapter.set + em.setJpaVendorAdapter(vendorAdapter); + em.setJpaProperties(additionalProperties()); + + return em; + } + + @Bean + public DataSource dataSource() { + final DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName"))); + dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url"))); + dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("jdbc.user"))); + dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("jdbc.pass"))); + + return dataSource; + } + + @Bean + public PlatformTransactionManager transactionManager() { + final JpaTransactionManager transactionManager = new JpaTransactionManager(); + transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); + + return transactionManager; + } + + @Bean + public PersistenceExceptionTranslationPostProcessor exceptionTranslation() { + return new PersistenceExceptionTranslationPostProcessor(); + } + + final Properties additionalProperties() { + final Properties hibernateProperties = new Properties(); + hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); + hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect")); + // hibernateProperties.setProperty("hibernate.globally_quoted_identifiers", "true"); + return hibernateProperties; + } + +} \ No newline at end of file diff --git a/spring-data-jpa/src/test/java/org/baeldung/persistence/service/AbstractServicePersistenceIntegrationTest.java b/spring-data-jpa/src/test/java/org/baeldung/persistence/service/AbstractServicePersistenceIntegrationTest.java new file mode 100644 index 0000000000..0fdb3a19e1 --- /dev/null +++ b/spring-data-jpa/src/test/java/org/baeldung/persistence/service/AbstractServicePersistenceIntegrationTest.java @@ -0,0 +1,252 @@ +package org.baeldung.persistence.service; + +import org.baeldung.persistence.IOperations; +import org.baeldung.persistence.model.Foo; +import org.baeldung.util.IDUtil; +import org.hamcrest.Matchers; +import org.junit.Ignore; +import org.junit.Test; +import org.springframework.dao.DataAccessException; + +import java.io.Serializable; +import java.util.List; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.not; +import static org.junit.Assert.*; + +public abstract class AbstractServicePersistenceIntegrationTest { + + // tests + + // find - one + + @Test + /**/public final void givenResourceDoesNotExist_whenResourceIsRetrieved_thenNoResourceIsReceived() { + // When + final Foo createdResource = getApi().findOne(IDUtil.randomPositiveLong()); + + // Then + assertNull(createdResource); + } + + @Test + public void givenResourceExists_whenResourceIsRetrieved_thenNoExceptions() { + final Foo existingResource = persistNewEntity(); + getApi().findOne(existingResource.getId()); + } + + @Test + public void givenResourceDoesNotExist_whenResourceIsRetrieved_thenNoExceptions() { + getApi().findOne(IDUtil.randomPositiveLong()); + } + + @Test + public void givenResourceExists_whenResourceIsRetrieved_thenTheResultIsNotNull() { + final Foo existingResource = persistNewEntity(); + final Foo retrievedResource = getApi().findOne(existingResource.getId()); + assertNotNull(retrievedResource); + } + + @Test + public void givenResourceExists_whenResourceIsRetrieved_thenResourceIsRetrievedCorrectly() { + final Foo existingResource = persistNewEntity(); + final Foo retrievedResource = getApi().findOne(existingResource.getId()); + assertEquals(existingResource, retrievedResource); + } + + // find - one - by name + + // find - all + + @Test + /**/public void whenAllResourcesAreRetrieved_thenNoExceptions() { + getApi().findAll(); + } + + @Test + /**/public void whenAllResourcesAreRetrieved_thenTheResultIsNotNull() { + final List resources = getApi().findAll(); + + assertNotNull(resources); + } + + @Test + /**/public void givenAtLeastOneResourceExists_whenAllResourcesAreRetrieved_thenRetrievedResourcesAreNotEmpty() { + persistNewEntity(); + + // When + final List allResources = getApi().findAll(); + + // Then + assertThat(allResources, not(Matchers. empty())); + } + + @Test + /**/public void givenAnResourceExists_whenAllResourcesAreRetrieved_thenTheExistingResourceIsIndeedAmongThem() { + final Foo existingResource = persistNewEntity(); + + final List resources = getApi().findAll(); + + assertThat(resources, hasItem(existingResource)); + } + + @Test + /**/public void whenAllResourcesAreRetrieved_thenResourcesHaveIds() { + persistNewEntity(); + + // When + final List allResources = getApi().findAll(); + + // Then + for (final Foo resource : allResources) { + assertNotNull(resource.getId()); + } + } + + // create + + @Test(expected = RuntimeException.class) + /**/public void whenNullResourceIsCreated_thenException() { + getApi().create(null); + } + + @Test + /**/public void whenResourceIsCreated_thenNoExceptions() { + persistNewEntity(); + } + + @Test + /**/public void whenResourceIsCreated_thenResourceIsRetrievable() { + final Foo existingResource = persistNewEntity(); + + assertNotNull(getApi().findOne(existingResource.getId())); + } + + @Test + /**/public void whenResourceIsCreated_thenSavedResourceIsEqualToOriginalResource() { + final Foo originalResource = createNewEntity(); + final Foo savedResource = getApi().create(originalResource); + + assertEquals(originalResource, savedResource); + } + + @Test(expected = RuntimeException.class) + public void whenResourceWithFailedConstraintsIsCreated_thenException() { + final Foo invalidResource = createNewEntity(); + invalidate(invalidResource); + + getApi().create(invalidResource); + } + + /** + * -- specific to the persistence engine + */ + @Test(expected = DataAccessException.class) + @Ignore("Hibernate simply ignores the id silently and still saved (tracking this)") + public void whenResourceWithIdIsCreated_thenDataAccessException() { + final Foo resourceWithId = createNewEntity(); + resourceWithId.setId(IDUtil.randomPositiveLong()); + + getApi().create(resourceWithId); + } + + // update + + @Test(expected = RuntimeException.class) + /**/public void whenNullResourceIsUpdated_thenException() { + getApi().update(null); + } + + @Test + /**/public void givenResourceExists_whenResourceIsUpdated_thenNoExceptions() { + // Given + final Foo existingResource = persistNewEntity(); + + // When + getApi().update(existingResource); + } + + /** + * - can also be the ConstraintViolationException which now occurs on the update operation will not be translated; as a consequence, it will be a TransactionSystemException + */ + @Test(expected = RuntimeException.class) + public void whenResourceIsUpdatedWithFailedConstraints_thenException() { + final Foo existingResource = persistNewEntity(); + invalidate(existingResource); + + getApi().update(existingResource); + } + + @Test + /**/public void givenResourceExists_whenResourceIsUpdated_thenUpdatesArePersisted() { + // Given + final Foo existingResource = persistNewEntity(); + + // When + change(existingResource); + getApi().update(existingResource); + + final Foo updatedResource = getApi().findOne(existingResource.getId()); + + // Then + assertEquals(existingResource, updatedResource); + } + + // delete + + // @Test(expected = RuntimeException.class) + // public void givenResourceDoesNotExists_whenResourceIsDeleted_thenException() { + // // When + // getApi().delete(IDUtil.randomPositiveLong()); + // } + // + // @Test(expected = RuntimeException.class) + // public void whenResourceIsDeletedByNegativeId_thenException() { + // // When + // getApi().delete(IDUtil.randomNegativeLong()); + // } + // + // @Test + // public void givenResourceExists_whenResourceIsDeleted_thenNoExceptions() { + // // Given + // final Foo existingResource = persistNewEntity(); + // + // // When + // getApi().delete(existingResource.getId()); + // } + // + // @Test + // /**/public final void givenResourceExists_whenResourceIsDeleted_thenResourceNoLongerExists() { + // // Given + // final Foo existingResource = persistNewEntity(); + // + // // When + // getApi().delete(existingResource.getId()); + // + // // Then + // assertNull(getApi().findOne(existingResource.getId())); + // } + + // template method + + protected Foo createNewEntity() { + return new Foo(randomAlphabetic(6)); + } + + protected abstract IOperations getApi(); + + private final void invalidate(final Foo entity) { + entity.setName(null); + } + + private final void change(final Foo entity) { + entity.setName(randomAlphabetic(6)); + } + + protected Foo persistNewEntity() { + return getApi().create(createNewEntity()); + } + +} diff --git a/spring-data-jpa/src/test/java/org/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java b/spring-data-jpa/src/test/java/org/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java new file mode 100644 index 0000000000..6385bc5509 --- /dev/null +++ b/spring-data-jpa/src/test/java/org/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java @@ -0,0 +1,76 @@ +package org.baeldung.persistence.service; + +import org.baeldung.persistence.IOperations; +import org.baeldung.persistence.model.Foo; +import org.baeldung.spring.PersistenceConfig; +import org.junit.Ignore; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.dao.InvalidDataAccessApiUsageException; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; +import static org.junit.Assert.assertNotNull; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class) +public class FooServicePersistenceIntegrationTest extends AbstractServicePersistenceIntegrationTest { + + @Autowired + private IFooService service; + + // tests + + @Test + public final void whenContextIsBootstrapped_thenNoExceptions() { + // + } + + @Test + public final void whenEntityIsCreated_thenNoExceptions() { + service.create(new Foo(randomAlphabetic(6))); + } + + @Test(expected = DataIntegrityViolationException.class) + public final void whenInvalidEntityIsCreated_thenDataException() { + service.create(new Foo()); + } + + @Test(expected = DataIntegrityViolationException.class) + public final void whenEntityWithLongNameIsCreated_thenDataException() { + service.create(new Foo(randomAlphabetic(2048))); + } + + // custom Query method + + @Test + public final void givenUsingCustomQuery_whenRetrievingEntity_thenFound() { + final String name = randomAlphabetic(6); + service.create(new Foo(name)); + + final Foo retrievedByName = service.retrieveByName(name); + assertNotNull(retrievedByName); + } + + // work in progress + + @Test(expected = InvalidDataAccessApiUsageException.class) + @Ignore("Right now, persist has saveOrUpdate semantics, so this will no longer fail") + public final void whenSameEntityIsCreatedTwice_thenDataException() { + final Foo entity = new Foo(randomAlphabetic(8)); + service.create(entity); + service.create(entity); + } + + // API + + @Override + protected final IOperations getApi() { + return service; + } + +} diff --git a/spring-data-jpa/src/test/java/org/baeldung/util/IDUtil.java b/spring-data-jpa/src/test/java/org/baeldung/util/IDUtil.java new file mode 100644 index 0000000000..85ab623e5f --- /dev/null +++ b/spring-data-jpa/src/test/java/org/baeldung/util/IDUtil.java @@ -0,0 +1,33 @@ +package org.baeldung.util; + +import java.util.Random; + +public final class IDUtil { + + private IDUtil() { + throw new AssertionError(); + } + + // API + + public static String randomPositiveLongAsString() { + return Long.toString(randomPositiveLong()); + } + + public static String randomNegativeLongAsString() { + return Long.toString(randomNegativeLong()); + } + + public static long randomPositiveLong() { + long id = new Random().nextLong() * 10000; + id = (id < 0) ? (-1 * id) : id; + return id; + } + + private static long randomNegativeLong() { + long id = new Random().nextLong() * 10000; + id = (id > 0) ? (-1 * id) : id; + return id; + } + +} From 2e6bc30aad7b41941a5c8e8fac4ce19d8ab48f81 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Sat, 1 Sep 2018 14:21:57 +0200 Subject: [PATCH 087/128] [BAEL-2048] Auditing with Spring Data JPA article --- spring-data-jpa/pom.xml | 10 + .../persistence/dao/IBarCrudRepository.java | 10 + .../persistence/dao/common/IOperations.java | 20 ++ .../com/baeldung/persistence/model/Bar.java | 229 ++++++++++++++++++ .../com/baeldung/persistence/model/Foo.java | 94 +++++++ .../persistence/service/IBarService.java | 8 + .../common/AbstractSpringDataJpaService.java | 45 ++++ .../service/impl/BarSpringDataJpaService.java | 26 ++ .../baeldung/spring/PersistenceConfig.java | 169 +++++++++++++ .../SpringDataJPABarAuditIntegrationTest.java | 72 ++++++ .../spring/config/PersistenceTestConfig.java | 169 +++++++++++++ 11 files changed, 852 insertions(+) create mode 100644 spring-data-jpa/src/main/java/com/baeldung/persistence/dao/IBarCrudRepository.java create mode 100644 spring-data-jpa/src/main/java/com/baeldung/persistence/dao/common/IOperations.java create mode 100644 spring-data-jpa/src/main/java/com/baeldung/persistence/model/Bar.java create mode 100644 spring-data-jpa/src/main/java/com/baeldung/persistence/model/Foo.java create mode 100644 spring-data-jpa/src/main/java/com/baeldung/persistence/service/IBarService.java create mode 100644 spring-data-jpa/src/main/java/com/baeldung/persistence/service/common/AbstractSpringDataJpaService.java create mode 100644 spring-data-jpa/src/main/java/com/baeldung/persistence/service/impl/BarSpringDataJpaService.java create mode 100644 spring-data-jpa/src/main/java/com/baeldung/spring/PersistenceConfig.java create mode 100644 spring-data-jpa/src/test/java/com/baeldung/persistence/audit/SpringDataJPABarAuditIntegrationTest.java create mode 100644 spring-data-jpa/src/test/java/com/baeldung/spring/config/PersistenceTestConfig.java diff --git a/spring-data-jpa/pom.xml b/spring-data-jpa/pom.xml index e84115b70a..c4893df759 100644 --- a/spring-data-jpa/pom.xml +++ b/spring-data-jpa/pom.xml @@ -21,11 +21,21 @@ org.hibernate hibernate-ehcache + + org.hibernate + hibernate-envers + com.h2database h2 + + org.springframework.security + spring-security-test + test + + com.google.guava guava diff --git a/spring-data-jpa/src/main/java/com/baeldung/persistence/dao/IBarCrudRepository.java b/spring-data-jpa/src/main/java/com/baeldung/persistence/dao/IBarCrudRepository.java new file mode 100644 index 0000000000..e7941e7093 --- /dev/null +++ b/spring-data-jpa/src/main/java/com/baeldung/persistence/dao/IBarCrudRepository.java @@ -0,0 +1,10 @@ +package com.baeldung.persistence.dao; + +import com.baeldung.persistence.model.Bar; +import org.springframework.data.repository.CrudRepository; + +import java.io.Serializable; + +public interface IBarCrudRepository extends CrudRepository { + // +} diff --git a/spring-data-jpa/src/main/java/com/baeldung/persistence/dao/common/IOperations.java b/spring-data-jpa/src/main/java/com/baeldung/persistence/dao/common/IOperations.java new file mode 100644 index 0000000000..4ef99221ab --- /dev/null +++ b/spring-data-jpa/src/main/java/com/baeldung/persistence/dao/common/IOperations.java @@ -0,0 +1,20 @@ +package com.baeldung.persistence.dao.common; + +import java.io.Serializable; +import java.util.List; + +public interface IOperations { + + T findOne(final long id); + + List findAll(); + + void create(final T entity); + + T update(final T entity); + + void delete(final T entity); + + void deleteById(final long entityId); + +} diff --git a/spring-data-jpa/src/main/java/com/baeldung/persistence/model/Bar.java b/spring-data-jpa/src/main/java/com/baeldung/persistence/model/Bar.java new file mode 100644 index 0000000000..daa590e43c --- /dev/null +++ b/spring-data-jpa/src/main/java/com/baeldung/persistence/model/Bar.java @@ -0,0 +1,229 @@ +package com.baeldung.persistence.model; + +import com.google.common.collect.Sets; +import org.baeldung.persistence.model.Foo; +import org.hibernate.annotations.OrderBy; +import org.hibernate.envers.Audited; +import org.jboss.logging.Logger; +import org.springframework.data.annotation.CreatedBy; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import javax.persistence.*; +import java.io.Serializable; +import java.util.Date; +import java.util.Set; + +@Entity +@NamedQuery(name = "Bar.findAll", query = "SELECT b FROM Bar b") +@Audited +@EntityListeners(AuditingEntityListener.class) +public class Bar implements Serializable { + + private static Logger logger = Logger.getLogger(Bar.class); + + public enum OPERATION { + INSERT, UPDATE, DELETE; + private String value; + + OPERATION() { + value = toString(); + } + + public String getValue() { + return value; + } + + public static OPERATION parse(final String value) { + OPERATION operation = null; + for (final OPERATION op : OPERATION.values()) { + if (op.getValue().equals(value)) { + operation = op; + break; + } + } + return operation; + } + }; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id") + private int id; + + @Column(name = "name") + private String name; + + @OneToMany(mappedBy = "bar", cascade = CascadeType.ALL, fetch = FetchType.LAZY) + @OrderBy(clause = "NAME DESC") + // @NotAudited + private Set fooSet = Sets.newHashSet(); + + @Column(name = "operation") + private String operation; + + @Column(name = "timestamp") + private long timestamp; + + @Column(name = "created_date", updatable = false, nullable = false) + @CreatedDate + private long createdDate; + + @Column(name = "modified_date") + @LastModifiedDate + private long modifiedDate; + + @Column(name = "created_by") + @CreatedBy + private String createdBy; + + @Column(name = "modified_by") + @LastModifiedBy + private String modifiedBy; + + public Bar() { + super(); + } + + public Bar(final String name) { + super(); + + this.name = name; + } + + // API + + public Set getFooSet() { + return fooSet; + } + + public void setFooSet(final Set fooSet) { + this.fooSet = fooSet; + } + + public int getId() { + return id; + } + + public void setId(final int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public OPERATION getOperation() { + return OPERATION.parse(operation); + } + + public void setOperation(final OPERATION operation) { + this.operation = operation.getValue(); + } + + public long getTimestamp() { + return timestamp; + } + + public void setTimestamp(final long timestamp) { + this.timestamp = timestamp; + } + + public long getCreatedDate() { + return createdDate; + } + + public void setCreatedDate(final long createdDate) { + this.createdDate = createdDate; + } + + public long getModifiedDate() { + return modifiedDate; + } + + public void setModifiedDate(final long modifiedDate) { + this.modifiedDate = modifiedDate; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(final String createdBy) { + this.createdBy = createdBy; + } + + public String getModifiedBy() { + return modifiedBy; + } + + public void setModifiedBy(final String modifiedBy) { + this.modifiedBy = modifiedBy; + } + + public void setOperation(final String operation) { + this.operation = operation; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + final Bar other = (Bar) obj; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; + } + + @Override + public String toString() { + final StringBuilder builder = new StringBuilder(); + builder.append("Bar [name=").append(name).append("]"); + return builder.toString(); + } + + @PrePersist + public void onPrePersist() { + logger.info("@PrePersist"); + audit(OPERATION.INSERT); + } + + @PreUpdate + public void onPreUpdate() { + logger.info("@PreUpdate"); + audit(OPERATION.UPDATE); + } + + @PreRemove + public void onPreRemove() { + logger.info("@PreRemove"); + audit(OPERATION.DELETE); + } + + private void audit(final OPERATION operation) { + setOperation(operation); + setTimestamp((new Date()).getTime()); + } + +} diff --git a/spring-data-jpa/src/main/java/com/baeldung/persistence/model/Foo.java b/spring-data-jpa/src/main/java/com/baeldung/persistence/model/Foo.java new file mode 100644 index 0000000000..2e6c80de22 --- /dev/null +++ b/spring-data-jpa/src/main/java/com/baeldung/persistence/model/Foo.java @@ -0,0 +1,94 @@ +package com.baeldung.persistence.model; + +import org.hibernate.envers.Audited; + +import javax.persistence.*; +import java.io.Serializable; + +@NamedNativeQueries({ @NamedNativeQuery(name = "callGetAllFoos", query = "CALL GetAllFoos()", resultClass = Foo.class), @NamedNativeQuery(name = "callGetFoosByName", query = "CALL GetFoosByName(:fooName)", resultClass = Foo.class) }) +@Entity +@Audited +// @Proxy(lazy = false) +public class Foo implements Serializable { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id") + private long id; + + @Column(name = "name") + private String name; + + @ManyToOne(targetEntity = Bar.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER) + @JoinColumn(name = "BAR_ID") + private Bar bar = new Bar(); + + public Foo() { + super(); + } + + public Foo(final String name) { + super(); + this.name = name; + } + + // + + public Bar getBar() { + return bar; + } + + public void setBar(final Bar bar) { + this.bar = bar; + } + + public long getId() { + return id; + } + + public void setId(final long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + // + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + final Foo other = (Foo) obj; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; + } + + @Override + public String toString() { + final StringBuilder builder = new StringBuilder(); + builder.append("Foo [name=").append(name).append("]"); + return builder.toString(); + } +} diff --git a/spring-data-jpa/src/main/java/com/baeldung/persistence/service/IBarService.java b/spring-data-jpa/src/main/java/com/baeldung/persistence/service/IBarService.java new file mode 100644 index 0000000000..21185b5990 --- /dev/null +++ b/spring-data-jpa/src/main/java/com/baeldung/persistence/service/IBarService.java @@ -0,0 +1,8 @@ +package com.baeldung.persistence.service; + +import com.baeldung.persistence.dao.common.IOperations; +import com.baeldung.persistence.model.Bar; + +public interface IBarService extends IOperations { + // +} diff --git a/spring-data-jpa/src/main/java/com/baeldung/persistence/service/common/AbstractSpringDataJpaService.java b/spring-data-jpa/src/main/java/com/baeldung/persistence/service/common/AbstractSpringDataJpaService.java new file mode 100644 index 0000000000..b5c3120ff5 --- /dev/null +++ b/spring-data-jpa/src/main/java/com/baeldung/persistence/service/common/AbstractSpringDataJpaService.java @@ -0,0 +1,45 @@ +package com.baeldung.persistence.service.common; + +import com.baeldung.persistence.dao.common.IOperations; +import com.google.common.collect.Lists; +import org.springframework.data.repository.CrudRepository; +import org.springframework.transaction.annotation.Transactional; + +import java.io.Serializable; +import java.util.List; + +@Transactional(value = "jpaTransactionManager") +public abstract class AbstractSpringDataJpaService implements IOperations { + + @Override + public T findOne(final long id) { + return getDao().findOne(Long.valueOf(id)); + } + + @Override + public List findAll() { + return Lists.newArrayList(getDao().findAll()); + } + + @Override + public void create(final T entity) { + getDao().save(entity); + } + + @Override + public T update(final T entity) { + return getDao().save(entity); + } + + @Override + public void delete(final T entity) { + getDao().delete(entity); + } + + @Override + public void deleteById(final long entityId) { + getDao().delete(Long.valueOf(entityId)); + } + + protected abstract CrudRepository getDao(); +} diff --git a/spring-data-jpa/src/main/java/com/baeldung/persistence/service/impl/BarSpringDataJpaService.java b/spring-data-jpa/src/main/java/com/baeldung/persistence/service/impl/BarSpringDataJpaService.java new file mode 100644 index 0000000000..c893473e04 --- /dev/null +++ b/spring-data-jpa/src/main/java/com/baeldung/persistence/service/impl/BarSpringDataJpaService.java @@ -0,0 +1,26 @@ +package com.baeldung.persistence.service.impl; + +import com.baeldung.persistence.dao.IBarCrudRepository; +import com.baeldung.persistence.model.Bar; +import com.baeldung.persistence.service.IBarService; +import com.baeldung.persistence.service.common.AbstractSpringDataJpaService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.repository.CrudRepository; + +import java.io.Serializable; + +public class BarSpringDataJpaService extends AbstractSpringDataJpaService implements IBarService { + + @Autowired + private IBarCrudRepository dao; + + public BarSpringDataJpaService() { + super(); + } + + @Override + protected CrudRepository getDao() { + return dao; + } + +} diff --git a/spring-data-jpa/src/main/java/com/baeldung/spring/PersistenceConfig.java b/spring-data-jpa/src/main/java/com/baeldung/spring/PersistenceConfig.java new file mode 100644 index 0000000000..75583b3eb9 --- /dev/null +++ b/spring-data-jpa/src/main/java/com/baeldung/spring/PersistenceConfig.java @@ -0,0 +1,169 @@ +package com.baeldung.spring; + +import com.baeldung.persistence.dao.IBarAuditableDao; +import com.baeldung.persistence.dao.IBarDao; +import com.baeldung.persistence.dao.IFooAuditableDao; +import com.baeldung.persistence.dao.IFooDao; +import com.baeldung.persistence.dao.impl.*; +import com.baeldung.persistence.service.IBarAuditableService; +import com.baeldung.persistence.service.IBarService; +import com.baeldung.persistence.service.IFooAuditableService; +import com.baeldung.persistence.service.IFooService; +import com.baeldung.persistence.service.impl.*; +import com.google.common.base.Preconditions; +import org.apache.tomcat.dbcp.dbcp2.BasicDataSource; +import org.springframework.beans.factory.annotation.Autowired; +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; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.orm.hibernate4.HibernateTransactionManager; +import org.springframework.orm.hibernate4.LocalSessionFactoryBean; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.JpaVendorAdapter; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +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; + +@Configuration +@EnableTransactionManagement +@EnableJpaRepositories(basePackages = { "com.baeldung.persistence" }, transactionManagerRef = "jpaTransactionManager") +@EnableJpaAuditing +@PropertySource({ "classpath:persistence-mysql.properties" }) +@ComponentScan({ "com.baeldung.persistence" }) +public class PersistenceConfig { + + @Autowired + private Environment env; + + public PersistenceConfig() { + super(); + } + + @Bean + public LocalSessionFactoryBean sessionFactory() { + final LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); + sessionFactory.setDataSource(restDataSource()); + sessionFactory.setPackagesToScan(new String[] { "com.baeldung.persistence.model" }); + sessionFactory.setHibernateProperties(hibernateProperties()); + + return sessionFactory; + } + + @Bean + public LocalContainerEntityManagerFactoryBean entityManagerFactory() { + final LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean(); + emf.setDataSource(restDataSource()); + emf.setPackagesToScan(new String[] { "com.baeldung.persistence.model" }); + + final JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); + emf.setJpaVendorAdapter(vendorAdapter); + emf.setJpaProperties(hibernateProperties()); + + return emf; + } + + @Bean + public DataSource restDataSource() { + final BasicDataSource dataSource = new BasicDataSource(); + dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName"))); + dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url"))); + dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("jdbc.user"))); + dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("jdbc.pass"))); + + return dataSource; + } + + @Bean + public PlatformTransactionManager hibernateTransactionManager() { + final HibernateTransactionManager transactionManager = new HibernateTransactionManager(); + transactionManager.setSessionFactory(sessionFactory().getObject()); + return transactionManager; + } + + @Bean + public PlatformTransactionManager jpaTransactionManager() { + final JpaTransactionManager transactionManager = new JpaTransactionManager(); + transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); + return transactionManager; + } + + @Bean + public PersistenceExceptionTranslationPostProcessor exceptionTranslation() { + return new PersistenceExceptionTranslationPostProcessor(); + } + + @Bean + public IBarService barJpaService() { + return new BarJpaService(); + } + + @Bean + public IBarService barSpringDataJpaService() { + return new BarSpringDataJpaService(); + } + + @Bean + public IFooService fooHibernateService() { + return new FooService(); + } + + @Bean + public IBarAuditableService barHibernateAuditableService() { + return new BarAuditableService(); + } + + @Bean + public IFooAuditableService fooHibernateAuditableService() { + return new FooAuditableService(); + } + + @Bean + public IBarDao barJpaDao() { + return new BarJpaDao(); + } + + @Bean + public IBarDao barHibernateDao() { + return new BarDao(); + } + + @Bean + public IBarAuditableDao barHibernateAuditableDao() { + return new BarAuditableDao(); + } + + @Bean + public IFooDao fooHibernateDao() { + return new FooDao(); + } + + @Bean + public IFooAuditableDao fooHibernateAuditableDao() { + return new FooAuditableDao(); + } + + private final Properties hibernateProperties() { + final Properties hibernateProperties = new Properties(); + hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); + hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect")); + + hibernateProperties.setProperty("hibernate.show_sql", "true"); + // hibernateProperties.setProperty("hibernate.format_sql", "true"); + // hibernateProperties.setProperty("hibernate.globally_quoted_identifiers", "true"); + + // Envers properties + hibernateProperties.setProperty("org.hibernate.envers.audit_table_suffix", env.getProperty("envers.audit_table_suffix")); + + return hibernateProperties; + } + +} \ No newline at end of file diff --git a/spring-data-jpa/src/test/java/com/baeldung/persistence/audit/SpringDataJPABarAuditIntegrationTest.java b/spring-data-jpa/src/test/java/com/baeldung/persistence/audit/SpringDataJPABarAuditIntegrationTest.java new file mode 100644 index 0000000000..4105773e3b --- /dev/null +++ b/spring-data-jpa/src/test/java/com/baeldung/persistence/audit/SpringDataJPABarAuditIntegrationTest.java @@ -0,0 +1,72 @@ +package com.baeldung.persistence.audit; + +import com.baeldung.persistence.model.Bar; +import com.baeldung.persistence.service.IBarService; +import com.baeldung.spring.config.PersistenceTestConfig; +import org.junit.*; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { PersistenceTestConfig.class }, loader = AnnotationConfigContextLoader.class) +public class SpringDataJPABarAuditIntegrationTest { + + private static Logger logger = LoggerFactory.getLogger(SpringDataJPABarAuditIntegrationTest.class); + + @BeforeClass + public static void setUpBeforeClass() throws Exception { + logger.info("setUpBeforeClass()"); + } + + @AfterClass + public static void tearDownAfterClass() throws Exception { + logger.info("tearDownAfterClass()"); + } + + @Autowired + @Qualifier("barSpringDataJpaService") + private IBarService barService; + + @Autowired + private EntityManagerFactory entityManagerFactory; + + private EntityManager em; + + @Before + public void setUp() throws Exception { + logger.info("setUp()"); + em = entityManagerFactory.createEntityManager(); + } + + @After + public void tearDown() throws Exception { + logger.info("tearDown()"); + em.close(); + } + + @Test + @WithMockUser(username = "tutorialuser") + public final void whenBarsModified_thenBarsAudited() { + Bar bar = new Bar("BAR1"); + barService.create(bar); + assertEquals(bar.getCreatedDate(), bar.getModifiedDate()); + assertEquals("tutorialuser", bar.getCreatedBy(), bar.getModifiedBy()); + bar.setName("BAR2"); + bar = barService.update(bar); + assertTrue(bar.getCreatedDate() < bar.getModifiedDate()); + assertEquals("tutorialuser", bar.getCreatedBy(), bar.getModifiedBy()); + } +} diff --git a/spring-data-jpa/src/test/java/com/baeldung/spring/config/PersistenceTestConfig.java b/spring-data-jpa/src/test/java/com/baeldung/spring/config/PersistenceTestConfig.java new file mode 100644 index 0000000000..4e3ecd67f5 --- /dev/null +++ b/spring-data-jpa/src/test/java/com/baeldung/spring/config/PersistenceTestConfig.java @@ -0,0 +1,169 @@ +package com.baeldung.spring.config; + +import com.baeldung.persistence.dao.IBarAuditableDao; +import com.baeldung.persistence.dao.IBarDao; +import com.baeldung.persistence.dao.IFooAuditableDao; +import com.baeldung.persistence.dao.IFooDao; +import com.baeldung.persistence.dao.impl.*; +import com.baeldung.persistence.service.IBarAuditableService; +import com.baeldung.persistence.service.IBarService; +import com.baeldung.persistence.service.IFooAuditableService; +import com.baeldung.persistence.service.IFooService; +import com.baeldung.persistence.service.impl.*; +import com.google.common.base.Preconditions; +import org.apache.tomcat.dbcp.dbcp2.BasicDataSource; +import org.springframework.beans.factory.annotation.Autowired; +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; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.orm.hibernate4.HibernateTransactionManager; +import org.springframework.orm.hibernate4.LocalSessionFactoryBean; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.JpaVendorAdapter; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +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; + +@Configuration +@EnableTransactionManagement +@EnableJpaRepositories(basePackages = { "com.baeldung.persistence" }, transactionManagerRef = "jpaTransactionManager") +@EnableJpaAuditing +@PropertySource({ "classpath:persistence-h2.properties" }) +@ComponentScan({ "com.baeldung.persistence" }) +public class PersistenceTestConfig { + + @Autowired + private Environment env; + + public PersistenceTestConfig() { + super(); + } + + @Bean + public LocalSessionFactoryBean sessionFactory() { + final LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); + sessionFactory.setDataSource(restDataSource()); + sessionFactory.setPackagesToScan(new String[] { "com.baeldung.persistence.model" }); + sessionFactory.setHibernateProperties(hibernateProperties()); + + return sessionFactory; + } + + @Bean + public LocalContainerEntityManagerFactoryBean entityManagerFactory() { + final LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean(); + emf.setDataSource(restDataSource()); + emf.setPackagesToScan(new String[] { "com.baeldung.persistence.model" }); + + final JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); + emf.setJpaVendorAdapter(vendorAdapter); + emf.setJpaProperties(hibernateProperties()); + + return emf; + } + + @Bean + public DataSource restDataSource() { + final BasicDataSource dataSource = new BasicDataSource(); + dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName"))); + dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url"))); + dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("jdbc.user"))); + dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("jdbc.pass"))); + + return dataSource; + } + + @Bean + public PlatformTransactionManager hibernateTransactionManager() { + final HibernateTransactionManager transactionManager = new HibernateTransactionManager(); + transactionManager.setSessionFactory(sessionFactory().getObject()); + return transactionManager; + } + + @Bean + public PlatformTransactionManager jpaTransactionManager() { + final JpaTransactionManager transactionManager = new JpaTransactionManager(); + transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); + return transactionManager; + } + + @Bean + public PersistenceExceptionTranslationPostProcessor exceptionTranslation() { + return new PersistenceExceptionTranslationPostProcessor(); + } + + @Bean + public IBarService barJpaService() { + return new BarJpaService(); + } + + @Bean + public IBarService barSpringDataJpaService() { + return new BarSpringDataJpaService(); + } + + @Bean + public IFooService fooHibernateService() { + return new FooService(); + } + + @Bean + public IBarAuditableService barHibernateAuditableService() { + return new BarAuditableService(); + } + + @Bean + public IFooAuditableService fooHibernateAuditableService() { + return new FooAuditableService(); + } + + @Bean + public IBarDao barJpaDao() { + return new BarJpaDao(); + } + + @Bean + public IBarDao barHibernateDao() { + return new BarDao(); + } + + @Bean + public IBarAuditableDao barHibernateAuditableDao() { + return new BarAuditableDao(); + } + + @Bean + public IFooDao fooHibernateDao() { + return new FooDao(); + } + + @Bean + public IFooAuditableDao fooHibernateAuditableDao() { + return new FooAuditableDao(); + } + + private final Properties hibernateProperties() { + final Properties hibernateProperties = new Properties(); + hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); + hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect")); + + hibernateProperties.setProperty("hibernate.show_sql", "true"); + // hibernateProperties.setProperty("hibernate.format_sql", "true"); + // hibernateProperties.setProperty("hibernate.globally_quoted_identifiers", "true"); + + // Envers properties + hibernateProperties.setProperty("org.hibernate.envers.audit_table_suffix", env.getProperty("envers.audit_table_suffix")); + + return hibernateProperties; + } + +} \ No newline at end of file From 7ddb86e748138706f953bb99f21033009a01a280 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Sat, 1 Sep 2018 18:32:39 +0200 Subject: [PATCH 088/128] [BAEL-2048] Rearranging code --- core-java-11/pom.xml | 4 +- .../main/java/com/baeldung/Application.java | 9 +- .../config/PersistenceConfiguration.java} | 61 ++++--- .../PersistenceProductConfiguration.java} | 20 +-- .../config/PersistenceUserConfiguration.java} | 20 +-- .../baeldung}/dao/IFooDao.java | 4 +- .../repositories}/ArticleRepository.java | 2 +- .../repositories}/CustomItemRepository.java | 30 ++-- .../CustomItemTypeRepository.java | 26 +-- .../dao/repositories}/ExtendedRepository.java | 6 +- .../ExtendedStudentRepository.java | 6 + .../repositories}/IBarCrudRepository.java | 4 +- .../repositories}/ItemTypeRepository.java | 20 +-- .../repositories}/LocationRepository.java | 2 +- .../ReadOnlyLocationRepository.java | 30 ++-- .../repositories}/StoreRepository.java | 26 +-- .../impl/CustomItemRepositoryImpl.java | 64 +++---- .../impl/CustomItemTypeRepositoryImpl.java | 62 +++---- .../impl}/ExtendedRepositoryImpl.java | 3 +- .../product/ProductRepository.java | 4 +- .../user/PossessionRepository.java | 4 +- .../repositories/user}/UserRepository.java | 22 +-- .../{persistence/model => domain}/Bar.java | 71 ++++---- .../{persistence/model => domain}/Foo.java | 6 +- .../model => com/baeldung/domain}/KVTag.java | 2 +- .../baeldung/domain}/SkillTag.java | 2 +- .../baeldung/domain}/Student.java | 2 +- .../baeldung/domain}/product/Product.java | 4 +- .../baeldung/domain}/user/Possession.java | 4 +- .../baeldung/domain}/user/User.java | 35 ++-- .../persistence/dao/common/IOperations.java | 20 --- .../persistence/service/IBarService.java | 8 - .../com/baeldung/services/IBarService.java | 7 + .../baeldung/services}/IFooService.java | 5 +- .../baeldung/services}/IOperations.java | 6 +- .../services/impl}/AbstractService.java | 4 +- .../impl}/AbstractSpringDataJpaService.java | 14 +- .../impl/BarSpringDataJpaService.java | 14 +- .../baeldung/services}/impl/FooService.java | 9 +- .../baeldung/spring/PersistenceConfig.java | 169 ------------------ .../java/org/baeldung/config/H2JpaConfig.java | 66 ------- .../config/PersistenceJPAConfigL2Cache.java | 89 --------- .../baeldung/config/StudentJPAH2Config.java | 69 ------- .../dao/ExtendedStudentRepository.java | 6 - .../org/baeldung/persistence/model/Foo.java | 78 -------- .../org/baeldung/persistence/model/User.java | 49 ----- .../multiple/dao/user/UserRepository.java | 8 - .../baeldung/repository/UserRepository.java | 14 -- .../resources/application.properties | 0 .../persistence-generic-entity.properties | 8 - .../persistence-multiple-db.properties | 4 +- .../persistence-student-h2.properties | 12 -- ...e-h2.properties => persistence.properties} | 7 +- .../ArticleRepositoryIntegrationTest.java | 8 +- ...endedStudentRepositoryIntegrationTest.java | 24 ++- .../JpaRepositoriesIntegrationTest.java | 13 +- .../UserRepositoryIntegrationTest.java | 125 +++++++++---- ...ractServicePersistenceIntegrationTest.java | 7 +- .../FooServicePersistenceIntegrationTest.java | 13 +- .../JpaMultipleDBIntegrationTest.java | 23 +-- .../SpringDataJPABarAuditIntegrationTest.java | 12 +- .../spring/config/PersistenceTestConfig.java | 169 ------------------ .../{org => com}/baeldung/util/IDUtil.java | 2 +- .../UserRepositoryIntegrationTest.java | 58 ------ 64 files changed, 474 insertions(+), 1201 deletions(-) rename spring-data-jpa/src/main/java/{org/baeldung/spring/PersistenceConfig.java => com/baeldung/config/PersistenceConfiguration.java} (57%) rename spring-data-jpa/src/main/java/{org/baeldung/config/ProductConfig.java => com/baeldung/config/PersistenceProductConfiguration.java} (84%) rename spring-data-jpa/src/main/java/{org/baeldung/config/UserConfig.java => com/baeldung/config/PersistenceUserConfiguration.java} (85%) rename spring-data-jpa/src/main/java/{org/baeldung/persistence => com/baeldung}/dao/IFooDao.java (81%) rename spring-data-jpa/src/main/java/com/baeldung/{repository => dao/repositories}/ArticleRepository.java (95%) rename spring-data-jpa/src/main/java/com/baeldung/{repository => dao/repositories}/CustomItemRepository.java (83%) rename spring-data-jpa/src/main/java/com/baeldung/{repository => dao/repositories}/CustomItemTypeRepository.java (82%) rename spring-data-jpa/src/main/java/{org/baeldung/extended/persistence/dao => com/baeldung/dao/repositories}/ExtendedRepository.java (69%) create mode 100644 spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ExtendedStudentRepository.java rename spring-data-jpa/src/main/java/com/baeldung/{persistence/dao => dao/repositories}/IBarCrudRepository.java (68%) rename spring-data-jpa/src/main/java/com/baeldung/{repository => dao/repositories}/ItemTypeRepository.java (87%) rename spring-data-jpa/src/main/java/com/baeldung/{repository => dao/repositories}/LocationRepository.java (86%) rename spring-data-jpa/src/main/java/com/baeldung/{repository => dao/repositories}/ReadOnlyLocationRepository.java (87%) rename spring-data-jpa/src/main/java/com/baeldung/{repository => dao/repositories}/StoreRepository.java (87%) rename spring-data-jpa/src/main/java/com/baeldung/{repository => dao/repositories}/impl/CustomItemRepositoryImpl.java (85%) rename spring-data-jpa/src/main/java/com/baeldung/{repository => dao/repositories}/impl/CustomItemTypeRepositoryImpl.java (86%) rename spring-data-jpa/src/main/java/{org/baeldung/extended/persistence/dao => com/baeldung/dao/repositories/impl}/ExtendedRepositoryImpl.java (93%) rename spring-data-jpa/src/main/java/{org/baeldung/persistence/multiple/dao => com/baeldung/dao/repositories}/product/ProductRepository.java (54%) rename spring-data-jpa/src/main/java/{org/baeldung/persistence/multiple/dao => com/baeldung/dao/repositories}/user/PossessionRepository.java (55%) rename spring-data-jpa/src/main/java/{org/baeldung/persistence/repository => com/baeldung/dao/repositories/user}/UserRepository.java (74%) rename spring-data-jpa/src/main/java/com/baeldung/{persistence/model => domain}/Bar.java (98%) rename spring-data-jpa/src/main/java/com/baeldung/{persistence/model => domain}/Foo.java (85%) rename spring-data-jpa/src/main/java/{org/baeldung/inmemory/persistence/model => com/baeldung/domain}/KVTag.java (91%) rename spring-data-jpa/src/main/java/{org/baeldung/inmemory/persistence/model => com/baeldung/domain}/SkillTag.java (90%) rename spring-data-jpa/src/main/java/{org/baeldung/inmemory/persistence/model => com/baeldung/domain}/Student.java (96%) rename spring-data-jpa/src/main/java/{org/baeldung/persistence/multiple/model => com/baeldung/domain}/product/Product.java (90%) rename spring-data-jpa/src/main/java/{org/baeldung/persistence/multiple/model => com/baeldung/domain}/user/Possession.java (95%) rename spring-data-jpa/src/main/java/{org/baeldung/persistence/multiple/model => com/baeldung/domain}/user/User.java (75%) delete mode 100644 spring-data-jpa/src/main/java/com/baeldung/persistence/dao/common/IOperations.java delete mode 100644 spring-data-jpa/src/main/java/com/baeldung/persistence/service/IBarService.java create mode 100644 spring-data-jpa/src/main/java/com/baeldung/services/IBarService.java rename spring-data-jpa/src/main/java/{org/baeldung/persistence/service => com/baeldung/services}/IFooService.java (65%) rename spring-data-jpa/src/main/java/{org/baeldung/persistence => com/baeldung/services}/IOperations.java (85%) rename spring-data-jpa/src/main/java/{org/baeldung/persistence/service/common => com/baeldung/services/impl}/AbstractService.java (93%) rename spring-data-jpa/src/main/java/com/baeldung/{persistence/service/common => services/impl}/AbstractSpringDataJpaService.java (72%) rename spring-data-jpa/src/main/java/com/baeldung/{persistence/service => services}/impl/BarSpringDataJpaService.java (56%) rename spring-data-jpa/src/main/java/{org/baeldung/persistence/service => com/baeldung/services}/impl/FooService.java (81%) delete mode 100644 spring-data-jpa/src/main/java/com/baeldung/spring/PersistenceConfig.java delete mode 100644 spring-data-jpa/src/main/java/org/baeldung/config/H2JpaConfig.java delete mode 100644 spring-data-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigL2Cache.java delete mode 100644 spring-data-jpa/src/main/java/org/baeldung/config/StudentJPAH2Config.java delete mode 100644 spring-data-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedStudentRepository.java delete mode 100644 spring-data-jpa/src/main/java/org/baeldung/persistence/model/Foo.java delete mode 100644 spring-data-jpa/src/main/java/org/baeldung/persistence/model/User.java delete mode 100644 spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/UserRepository.java delete mode 100644 spring-data-jpa/src/main/java/org/baeldung/repository/UserRepository.java rename spring-data-jpa/src/{test => main}/resources/application.properties (100%) delete mode 100644 spring-data-jpa/src/main/resources/persistence-generic-entity.properties delete mode 100644 spring-data-jpa/src/main/resources/persistence-student-h2.properties rename spring-data-jpa/src/main/resources/{persistence-h2.properties => persistence.properties} (69%) rename spring-data-jpa/src/test/java/com/baeldung/{repository => dao/repositories}/ArticleRepositoryIntegrationTest.java (85%) rename spring-data-jpa/src/test/java/{org/baeldung/persistence/repository => com/baeldung/dao/repositories}/ExtendedStudentRepositoryIntegrationTest.java (72%) rename spring-data-jpa/src/test/java/com/baeldung/{repository => dao/repositories}/JpaRepositoriesIntegrationTest.java (81%) rename spring-data-jpa/src/test/java/{org/baeldung/persistence/repository => com/baeldung/dao/repositories}/UserRepositoryIntegrationTest.java (67%) rename spring-data-jpa/src/test/java/{org/baeldung/persistence/service => com/baeldung/services}/AbstractServicePersistenceIntegrationTest.java (97%) rename spring-data-jpa/src/test/java/{org/baeldung/persistence/service => com/baeldung/services}/FooServicePersistenceIntegrationTest.java (84%) rename spring-data-jpa/src/test/java/{org/baeldung/persistence/service => com/baeldung/services}/JpaMultipleDBIntegrationTest.java (81%) rename spring-data-jpa/src/test/java/com/baeldung/{persistence/audit => services}/SpringDataJPABarAuditIntegrationTest.java (86%) delete mode 100644 spring-data-jpa/src/test/java/com/baeldung/spring/config/PersistenceTestConfig.java rename spring-data-jpa/src/test/java/{org => com}/baeldung/util/IDUtil.java (96%) delete mode 100644 spring-data-jpa/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java diff --git a/core-java-11/pom.xml b/core-java-11/pom.xml index 4dcab49867..bfcb7bd81a 100644 --- a/core-java-11/pom.xml +++ b/core-java-11/pom.xml @@ -21,8 +21,8 @@ maven-compiler-plugin ${maven-compiler-plugin.version} - ${maven.compiler.source.version} - ${maven.compiler.target.version} + 10 + 10 diff --git a/spring-data-jpa/src/main/java/com/baeldung/Application.java b/spring-data-jpa/src/main/java/com/baeldung/Application.java index 43888c2d67..4e14f94311 100644 --- a/spring-data-jpa/src/main/java/com/baeldung/Application.java +++ b/spring-data-jpa/src/main/java/com/baeldung/Application.java @@ -1,14 +1,17 @@ package com.baeldung; +import com.baeldung.dao.repositories.impl.ExtendedRepositoryImpl; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.ApplicationContext; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @SpringBootApplication +@EnableJpaRepositories(repositoryBaseClass = ExtendedRepositoryImpl.class) public class Application { - private static ApplicationContext applicationContext; public static void main(String[] args) { - applicationContext = SpringApplication.run(Application.class, args); + SpringApplication.run(Application.class, args); } + } diff --git a/spring-data-jpa/src/main/java/org/baeldung/spring/PersistenceConfig.java b/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceConfiguration.java similarity index 57% rename from spring-data-jpa/src/main/java/org/baeldung/spring/PersistenceConfig.java rename to spring-data-jpa/src/main/java/com/baeldung/config/PersistenceConfiguration.java index 1696025590..16407e510a 100644 --- a/spring-data-jpa/src/main/java/org/baeldung/spring/PersistenceConfig.java +++ b/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceConfiguration.java @@ -1,16 +1,20 @@ -package org.baeldung.spring; +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 org.springframework.beans.factory.annotation.Autowired; -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.context.annotation.*; import org.springframework.core.env.Environment; import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.JpaVendorAdapter; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.PlatformTransactionManager; @@ -20,32 +24,31 @@ import javax.sql.DataSource; import java.util.Properties; @Configuration +@ComponentScan({"com.baeldung.dao", "com.baeldung.services"}) @EnableTransactionManagement -@PropertySource({ "classpath:persistence-${envTarget:h2}.properties" }) -@ComponentScan({ "org.baeldung.persistence" }) -// @ImportResource("classpath*:springDataPersistenceConfig.xml") -@EnableJpaRepositories(basePackages = "org.baeldung.persistence.dao") -public class PersistenceConfig { +@EnableJpaRepositories(basePackages = {"com.baeldung.dao"}, repositoryBaseClass = ExtendedRepositoryImpl.class) +@EnableJpaAuditing +@PropertySource("classpath:persistence.properties") +public class PersistenceConfiguration { @Autowired private Environment env; - public PersistenceConfig() { + public PersistenceConfiguration() { super(); } @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory() { - final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); - em.setDataSource(dataSource()); - em.setPackagesToScan(new String[] { "org.baeldung.persistence.model" }); + final LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean(); + emf.setDataSource(dataSource()); + emf.setPackagesToScan("com.baeldung.domain"); - final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); - // vendorAdapter.set - em.setJpaVendorAdapter(vendorAdapter); - em.setJpaProperties(additionalProperties()); + final JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); + emf.setJpaVendorAdapter(vendorAdapter); + emf.setJpaProperties(hibernateProperties()); - return em; + return emf; } @Bean @@ -63,7 +66,6 @@ public class PersistenceConfig { public PlatformTransactionManager transactionManager() { final JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); - return transactionManager; } @@ -72,11 +74,28 @@ public class PersistenceConfig { return new PersistenceExceptionTranslationPostProcessor(); } - final Properties additionalProperties() { + @Bean + public IBarService barSpringDataJpaService() { + 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")); hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect")); + + hibernateProperties.setProperty("hibernate.show_sql", "true"); + // hibernateProperties.setProperty("hibernate.format_sql", "true"); // hibernateProperties.setProperty("hibernate.globally_quoted_identifiers", "true"); + + // Envers properties + hibernateProperties.setProperty("org.hibernate.envers.audit_table_suffix", env.getProperty("envers.audit_table_suffix")); + return hibernateProperties; } diff --git a/spring-data-jpa/src/main/java/org/baeldung/config/ProductConfig.java b/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceProductConfiguration.java similarity index 84% rename from spring-data-jpa/src/main/java/org/baeldung/config/ProductConfig.java rename to spring-data-jpa/src/main/java/com/baeldung/config/PersistenceProductConfiguration.java index 13f8f4b27c..207fba9bc5 100644 --- a/spring-data-jpa/src/main/java/org/baeldung/config/ProductConfig.java +++ b/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceProductConfiguration.java @@ -1,9 +1,6 @@ -package org.baeldung.config; - -import java.util.HashMap; - -import javax.sql.DataSource; +package com.baeldung.config; +import com.google.common.base.Preconditions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -16,16 +13,17 @@ import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.PlatformTransactionManager; -import com.google.common.base.Preconditions; +import javax.sql.DataSource; +import java.util.HashMap; @Configuration -@PropertySource({ "classpath:persistence-multiple-db.properties" }) -@EnableJpaRepositories(basePackages = "org.baeldung.persistence.multiple.dao.product", entityManagerFactoryRef = "productEntityManager", transactionManagerRef = "productTransactionManager") -public class ProductConfig { +@PropertySource({"classpath:persistence-multiple-db.properties"}) +@EnableJpaRepositories(basePackages = "com.baeldung.dao.repositories.product", entityManagerFactoryRef = "productEntityManager", transactionManagerRef = "productTransactionManager") +public class PersistenceProductConfiguration { @Autowired private Environment env; - public ProductConfig() { + public PersistenceProductConfiguration() { super(); } @@ -35,7 +33,7 @@ public class ProductConfig { public LocalContainerEntityManagerFactoryBean productEntityManager() { final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(productDataSource()); - em.setPackagesToScan(new String[] { "org.baeldung.persistence.multiple.model.product" }); + em.setPackagesToScan("com.baeldung.domain.product"); final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); em.setJpaVendorAdapter(vendorAdapter); diff --git a/spring-data-jpa/src/main/java/org/baeldung/config/UserConfig.java b/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceUserConfiguration.java similarity index 85% rename from spring-data-jpa/src/main/java/org/baeldung/config/UserConfig.java rename to spring-data-jpa/src/main/java/com/baeldung/config/PersistenceUserConfiguration.java index 8e85f5d8e0..dd32477755 100644 --- a/spring-data-jpa/src/main/java/org/baeldung/config/UserConfig.java +++ b/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceUserConfiguration.java @@ -1,9 +1,6 @@ -package org.baeldung.config; - -import java.util.HashMap; - -import javax.sql.DataSource; +package com.baeldung.config; +import com.google.common.base.Preconditions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -17,16 +14,17 @@ import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.PlatformTransactionManager; -import com.google.common.base.Preconditions; +import javax.sql.DataSource; +import java.util.HashMap; @Configuration -@PropertySource({ "classpath:persistence-multiple-db.properties" }) -@EnableJpaRepositories(basePackages = "org.baeldung.persistence.multiple.dao.user", entityManagerFactoryRef = "userEntityManager", transactionManagerRef = "userTransactionManager") -public class UserConfig { +@PropertySource({"classpath:persistence-multiple-db.properties"}) +@EnableJpaRepositories(basePackages = "com.baeldung.dao.repositories.user", entityManagerFactoryRef = "userEntityManager", transactionManagerRef = "userTransactionManager") +public class PersistenceUserConfiguration { @Autowired private Environment env; - public UserConfig() { + public PersistenceUserConfiguration() { super(); } @@ -37,7 +35,7 @@ public class UserConfig { public LocalContainerEntityManagerFactoryBean userEntityManager() { final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(userDataSource()); - em.setPackagesToScan(new String[] { "org.baeldung.persistence.multiple.model.user" }); + em.setPackagesToScan("com.baeldung.domain.user"); final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); em.setJpaVendorAdapter(vendorAdapter); diff --git a/spring-data-jpa/src/main/java/org/baeldung/persistence/dao/IFooDao.java b/spring-data-jpa/src/main/java/com/baeldung/dao/IFooDao.java similarity index 81% rename from spring-data-jpa/src/main/java/org/baeldung/persistence/dao/IFooDao.java rename to spring-data-jpa/src/main/java/com/baeldung/dao/IFooDao.java index c6d51e263b..bb3c229945 100644 --- a/spring-data-jpa/src/main/java/org/baeldung/persistence/dao/IFooDao.java +++ b/spring-data-jpa/src/main/java/com/baeldung/dao/IFooDao.java @@ -1,6 +1,6 @@ -package org.baeldung.persistence.dao; +package com.baeldung.dao; -import org.baeldung.persistence.model.Foo; +import com.baeldung.domain.Foo; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; diff --git a/spring-data-jpa/src/main/java/com/baeldung/repository/ArticleRepository.java b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ArticleRepository.java similarity index 95% rename from spring-data-jpa/src/main/java/com/baeldung/repository/ArticleRepository.java rename to spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ArticleRepository.java index 4e1b109430..8402c099d9 100644 --- a/spring-data-jpa/src/main/java/com/baeldung/repository/ArticleRepository.java +++ b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ArticleRepository.java @@ -1,4 +1,4 @@ -package com.baeldung.repository; +package com.baeldung.dao.repositories; import com.baeldung.domain.Article; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/spring-data-jpa/src/main/java/com/baeldung/repository/CustomItemRepository.java b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/CustomItemRepository.java similarity index 83% rename from spring-data-jpa/src/main/java/com/baeldung/repository/CustomItemRepository.java rename to spring-data-jpa/src/main/java/com/baeldung/dao/repositories/CustomItemRepository.java index 91eddb800a..ba077ccf1f 100644 --- a/spring-data-jpa/src/main/java/com/baeldung/repository/CustomItemRepository.java +++ b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/CustomItemRepository.java @@ -1,15 +1,15 @@ -package com.baeldung.repository; - -import org.springframework.stereotype.Repository; - -import com.baeldung.domain.Item; - -@Repository -public interface CustomItemRepository { - - void deleteCustom(Item entity); - - Item findItemById(Long id); - - void findThenDelete(Long id); -} +package com.baeldung.dao.repositories; + +import org.springframework.stereotype.Repository; + +import com.baeldung.domain.Item; + +@Repository +public interface CustomItemRepository { + + void deleteCustom(Item entity); + + Item findItemById(Long id); + + void findThenDelete(Long id); +} diff --git a/spring-data-jpa/src/main/java/com/baeldung/repository/CustomItemTypeRepository.java b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/CustomItemTypeRepository.java similarity index 82% rename from spring-data-jpa/src/main/java/com/baeldung/repository/CustomItemTypeRepository.java rename to spring-data-jpa/src/main/java/com/baeldung/dao/repositories/CustomItemTypeRepository.java index 77bbf294a0..81ebdf3fda 100644 --- a/spring-data-jpa/src/main/java/com/baeldung/repository/CustomItemTypeRepository.java +++ b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/CustomItemTypeRepository.java @@ -1,13 +1,13 @@ -package com.baeldung.repository; - -import org.springframework.stereotype.Repository; - -import com.baeldung.domain.ItemType; - -@Repository -public interface CustomItemTypeRepository { - - void deleteCustom(ItemType entity); - - void findThenDelete(Long id); -} +package com.baeldung.dao.repositories; + +import org.springframework.stereotype.Repository; + +import com.baeldung.domain.ItemType; + +@Repository +public interface CustomItemTypeRepository { + + void deleteCustom(ItemType entity); + + void findThenDelete(Long id); +} diff --git a/spring-data-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepository.java b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ExtendedRepository.java similarity index 69% rename from spring-data-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepository.java rename to spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ExtendedRepository.java index 9c9c12029a..9e82f02fa6 100644 --- a/spring-data-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepository.java +++ b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ExtendedRepository.java @@ -1,4 +1,4 @@ -package org.baeldung.extended.persistence.dao; +package com.baeldung.dao.repositories; import java.io.Serializable; import java.util.List; @@ -8,5 +8,7 @@ import org.springframework.data.repository.NoRepositoryBean; @NoRepositoryBean public interface ExtendedRepository extends JpaRepository { - public List findByAttributeContainsText(String attributeName, String text); + + List findByAttributeContainsText(String attributeName, String text); + } diff --git a/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ExtendedStudentRepository.java b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ExtendedStudentRepository.java new file mode 100644 index 0000000000..199e4e5ff6 --- /dev/null +++ b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ExtendedStudentRepository.java @@ -0,0 +1,6 @@ +package com.baeldung.dao.repositories; + +import com.baeldung.domain.Student; + +public interface ExtendedStudentRepository extends ExtendedRepository { +} diff --git a/spring-data-jpa/src/main/java/com/baeldung/persistence/dao/IBarCrudRepository.java b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/IBarCrudRepository.java similarity index 68% rename from spring-data-jpa/src/main/java/com/baeldung/persistence/dao/IBarCrudRepository.java rename to spring-data-jpa/src/main/java/com/baeldung/dao/repositories/IBarCrudRepository.java index e7941e7093..54a7d77691 100644 --- a/spring-data-jpa/src/main/java/com/baeldung/persistence/dao/IBarCrudRepository.java +++ b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/IBarCrudRepository.java @@ -1,6 +1,6 @@ -package com.baeldung.persistence.dao; +package com.baeldung.dao.repositories; -import com.baeldung.persistence.model.Bar; +import com.baeldung.domain.Bar; import org.springframework.data.repository.CrudRepository; import java.io.Serializable; diff --git a/spring-data-jpa/src/main/java/com/baeldung/repository/ItemTypeRepository.java b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ItemTypeRepository.java similarity index 87% rename from spring-data-jpa/src/main/java/com/baeldung/repository/ItemTypeRepository.java rename to spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ItemTypeRepository.java index c3146aa297..2af83bc322 100644 --- a/spring-data-jpa/src/main/java/com/baeldung/repository/ItemTypeRepository.java +++ b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ItemTypeRepository.java @@ -1,10 +1,10 @@ -package com.baeldung.repository; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import com.baeldung.domain.ItemType; - -@Repository -public interface ItemTypeRepository extends JpaRepository, CustomItemTypeRepository, CustomItemRepository { -} +package com.baeldung.dao.repositories; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.baeldung.domain.ItemType; + +@Repository +public interface ItemTypeRepository extends JpaRepository, CustomItemTypeRepository, CustomItemRepository { +} diff --git a/spring-data-jpa/src/main/java/com/baeldung/repository/LocationRepository.java b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/LocationRepository.java similarity index 86% rename from spring-data-jpa/src/main/java/com/baeldung/repository/LocationRepository.java rename to spring-data-jpa/src/main/java/com/baeldung/dao/repositories/LocationRepository.java index f119ff916b..27bbe27af0 100644 --- a/spring-data-jpa/src/main/java/com/baeldung/repository/LocationRepository.java +++ b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/LocationRepository.java @@ -1,4 +1,4 @@ -package com.baeldung.repository; +package com.baeldung.dao.repositories; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/spring-data-jpa/src/main/java/com/baeldung/repository/ReadOnlyLocationRepository.java b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ReadOnlyLocationRepository.java similarity index 87% rename from spring-data-jpa/src/main/java/com/baeldung/repository/ReadOnlyLocationRepository.java rename to spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ReadOnlyLocationRepository.java index 2107712484..8f68cdbbe5 100644 --- a/spring-data-jpa/src/main/java/com/baeldung/repository/ReadOnlyLocationRepository.java +++ b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ReadOnlyLocationRepository.java @@ -1,15 +1,15 @@ -package com.baeldung.repository; - -import java.util.Optional; - -import org.springframework.data.repository.Repository; - -import com.baeldung.domain.Location; - -@org.springframework.stereotype.Repository -public interface ReadOnlyLocationRepository extends Repository { - - Optional findById(Long id); - - Location save(Location location); -} +package com.baeldung.dao.repositories; + +import java.util.Optional; + +import org.springframework.data.repository.Repository; + +import com.baeldung.domain.Location; + +@org.springframework.stereotype.Repository +public interface ReadOnlyLocationRepository extends Repository { + + Optional findById(Long id); + + Location save(Location location); +} diff --git a/spring-data-jpa/src/main/java/com/baeldung/repository/StoreRepository.java b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/StoreRepository.java similarity index 87% rename from spring-data-jpa/src/main/java/com/baeldung/repository/StoreRepository.java rename to spring-data-jpa/src/main/java/com/baeldung/dao/repositories/StoreRepository.java index 939ca1dacb..9318c32ee9 100644 --- a/spring-data-jpa/src/main/java/com/baeldung/repository/StoreRepository.java +++ b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/StoreRepository.java @@ -1,13 +1,13 @@ -package com.baeldung.repository; - -import java.util.List; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import com.baeldung.domain.Store; - -@Repository -public interface StoreRepository extends JpaRepository { - List findStoreByLocationId(Long locationId); -} +package com.baeldung.dao.repositories; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.baeldung.domain.Store; + +@Repository +public interface StoreRepository extends JpaRepository { + List findStoreByLocationId(Long locationId); +} diff --git a/spring-data-jpa/src/main/java/com/baeldung/repository/impl/CustomItemRepositoryImpl.java b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/CustomItemRepositoryImpl.java similarity index 85% rename from spring-data-jpa/src/main/java/com/baeldung/repository/impl/CustomItemRepositoryImpl.java rename to spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/CustomItemRepositoryImpl.java index 44492a8f35..53def88af0 100644 --- a/spring-data-jpa/src/main/java/com/baeldung/repository/impl/CustomItemRepositoryImpl.java +++ b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/CustomItemRepositoryImpl.java @@ -1,32 +1,32 @@ -package com.baeldung.repository.impl; - -import javax.persistence.EntityManager; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Repository; - -import com.baeldung.domain.Item; -import com.baeldung.repository.CustomItemRepository; - -@Repository -public class CustomItemRepositoryImpl implements CustomItemRepository { - - @Autowired - private EntityManager entityManager; - - @Override - public void deleteCustom(Item item) { - entityManager.remove(item); - } - - @Override - public Item findItemById(Long id) { - return entityManager.find(Item.class, id); - } - - @Override - public void findThenDelete(Long id) { - final Item item = entityManager.find(Item.class, id); - entityManager.remove(item); - } -} +package com.baeldung.dao.repositories.impl; + +import javax.persistence.EntityManager; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +import com.baeldung.domain.Item; +import com.baeldung.dao.repositories.CustomItemRepository; + +@Repository +public class CustomItemRepositoryImpl implements CustomItemRepository { + + @Autowired + private EntityManager entityManager; + + @Override + public void deleteCustom(Item item) { + entityManager.remove(item); + } + + @Override + public Item findItemById(Long id) { + return entityManager.find(Item.class, id); + } + + @Override + public void findThenDelete(Long id) { + final Item item = entityManager.find(Item.class, id); + entityManager.remove(item); + } +} diff --git a/spring-data-jpa/src/main/java/com/baeldung/repository/impl/CustomItemTypeRepositoryImpl.java b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/CustomItemTypeRepositoryImpl.java similarity index 86% rename from spring-data-jpa/src/main/java/com/baeldung/repository/impl/CustomItemTypeRepositoryImpl.java rename to spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/CustomItemTypeRepositoryImpl.java index 594fd24ea9..2b49f2380c 100644 --- a/spring-data-jpa/src/main/java/com/baeldung/repository/impl/CustomItemTypeRepositoryImpl.java +++ b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/CustomItemTypeRepositoryImpl.java @@ -1,31 +1,31 @@ -package com.baeldung.repository.impl; - -import javax.persistence.EntityManager; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Repository; - -import com.baeldung.domain.ItemType; -import com.baeldung.repository.CustomItemTypeRepository; - -@Repository -public class CustomItemTypeRepositoryImpl implements CustomItemTypeRepository { - - private static final Logger LOGGER = LoggerFactory.getLogger(CustomItemTypeRepositoryImpl.class); - - @Autowired - private EntityManager entityManager; - - @Override - public void deleteCustom(ItemType itemType) { - entityManager.remove(itemType); - } - - @Override - public void findThenDelete(Long id) { - ItemType itemTypeToDelete = entityManager.find(ItemType.class, id); - entityManager.remove(itemTypeToDelete); - } -} +package com.baeldung.dao.repositories.impl; + +import javax.persistence.EntityManager; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +import com.baeldung.domain.ItemType; +import com.baeldung.dao.repositories.CustomItemTypeRepository; + +@Repository +public class CustomItemTypeRepositoryImpl implements CustomItemTypeRepository { + + private static final Logger LOGGER = LoggerFactory.getLogger(CustomItemTypeRepositoryImpl.class); + + @Autowired + private EntityManager entityManager; + + @Override + public void deleteCustom(ItemType itemType) { + entityManager.remove(itemType); + } + + @Override + public void findThenDelete(Long id) { + ItemType itemTypeToDelete = entityManager.find(ItemType.class, id); + entityManager.remove(itemTypeToDelete); + } +} diff --git a/spring-data-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepositoryImpl.java b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/ExtendedRepositoryImpl.java similarity index 93% rename from spring-data-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepositoryImpl.java rename to spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/ExtendedRepositoryImpl.java index 7ed652dc4d..f6f06efb51 100644 --- a/spring-data-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepositoryImpl.java +++ b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/ExtendedRepositoryImpl.java @@ -1,4 +1,4 @@ -package org.baeldung.extended.persistence.dao; +package com.baeldung.dao.repositories.impl; import java.io.Serializable; import java.util.List; @@ -10,6 +10,7 @@ import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import javax.transaction.Transactional; +import com.baeldung.dao.repositories.ExtendedRepository; import org.springframework.data.jpa.repository.support.JpaEntityInformation; import org.springframework.data.jpa.repository.support.SimpleJpaRepository; diff --git a/spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/dao/product/ProductRepository.java b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/product/ProductRepository.java similarity index 54% rename from spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/dao/product/ProductRepository.java rename to spring-data-jpa/src/main/java/com/baeldung/dao/repositories/product/ProductRepository.java index bad0170a3a..7044d57e53 100644 --- a/spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/dao/product/ProductRepository.java +++ b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/product/ProductRepository.java @@ -1,6 +1,6 @@ -package org.baeldung.persistence.multiple.dao.product; +package com.baeldung.dao.repositories.product; -import org.baeldung.persistence.multiple.model.product.Product; +import com.baeldung.domain.product.Product; import org.springframework.data.jpa.repository.JpaRepository; public interface ProductRepository extends JpaRepository { diff --git a/spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/PossessionRepository.java b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/PossessionRepository.java similarity index 55% rename from spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/PossessionRepository.java rename to spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/PossessionRepository.java index 34913632d8..f0eeb475c1 100644 --- a/spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/PossessionRepository.java +++ b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/PossessionRepository.java @@ -1,6 +1,6 @@ -package org.baeldung.persistence.multiple.dao.user; +package com.baeldung.dao.repositories.user; -import org.baeldung.persistence.multiple.model.user.Possession; +import com.baeldung.domain.user.Possession; import org.springframework.data.jpa.repository.JpaRepository; public interface PossessionRepository extends JpaRepository { diff --git a/spring-data-jpa/src/main/java/org/baeldung/persistence/repository/UserRepository.java b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepository.java similarity index 74% rename from spring-data-jpa/src/main/java/org/baeldung/persistence/repository/UserRepository.java rename to spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepository.java index 5ceb6a9f04..5bb0232e4a 100644 --- a/spring-data-jpa/src/main/java/org/baeldung/persistence/repository/UserRepository.java +++ b/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepository.java @@ -1,6 +1,6 @@ -package org.baeldung.persistence.repository; +package com.baeldung.dao.repositories.user; -import org.baeldung.persistence.model.User; +import com.baeldung.domain.user.User; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; @@ -8,24 +8,25 @@ 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; import java.util.Collection; import java.util.List; +import java.util.stream.Stream; -@Repository("userRepository") public interface UserRepository extends JpaRepository { + Stream findAllByName(String name); + @Query("SELECT u FROM User u WHERE u.status = 1") Collection findAllActiveUsers(); - @Query(value = "SELECT * FROM USERS u WHERE u.status = 1", nativeQuery = true) + @Query(value = "SELECT * FROM USERS.USERS u WHERE u.status = 1", nativeQuery = true) Collection findAllActiveUsersNative(); @Query("SELECT u FROM User u WHERE u.status = ?1") User findUserByStatus(Integer status); - @Query(value = "SELECT * FROM Users u WHERE u.status = ?1", nativeQuery = true) + @Query(value = "SELECT * FROM USERS.Users u WHERE u.status = ?1", nativeQuery = true) User findUserByStatusNative(Integer status); @Query("SELECT u FROM User u WHERE u.status = ?1 and u.name = ?2") @@ -34,7 +35,7 @@ public interface UserRepository extends JpaRepository { @Query("SELECT u FROM User u WHERE u.status = :status and u.name = :name") User findUserByStatusAndNameNamedParams(@Param("status") Integer status, @Param("name") String name); - @Query(value = "SELECT * FROM Users u WHERE u.status = :status AND u.name = :name", nativeQuery = true) + @Query(value = "SELECT * FROM USERS.Users u WHERE u.status = :status AND u.name = :name", nativeQuery = true) User findUserByStatusAndNameNamedParamsNative(@Param("status") Integer status, @Param("name") String name); @Query("SELECT u FROM User u WHERE u.status = :status and u.name = :name") @@ -46,7 +47,7 @@ public interface UserRepository extends JpaRepository { @Query("SELECT u FROM User u WHERE u.name like :name%") User findUserByNameLikeNamedParam(@Param("name") String name); - @Query(value = "SELECT * FROM users u WHERE u.name LIKE ?1%", nativeQuery = true) + @Query(value = "SELECT * FROM USERS.users u WHERE u.name LIKE ?1%", nativeQuery = true) User findUserByNameLikeNative(String name); @Query(value = "SELECT u FROM User u") @@ -55,7 +56,7 @@ public interface UserRepository extends JpaRepository { @Query(value = "SELECT u FROM User u ORDER BY id") Page findAllUsersWithPagination(Pageable pageable); - @Query(value = "SELECT * FROM Users ORDER BY id", countQuery = "SELECT count(*) FROM Users", nativeQuery = true) + @Query(value = "SELECT * FROM USERS.Users ORDER BY id", countQuery = "SELECT count(*) FROM USERS.Users", nativeQuery = true) Page findAllUsersWithPaginationNative(Pageable pageable); @Modifying @@ -63,7 +64,6 @@ public interface UserRepository extends JpaRepository { int updateUserSetStatusForName(@Param("status") Integer status, @Param("name") String name); @Modifying - @Query(value = "UPDATE Users u SET u.status = ? WHERE u.name = ?", nativeQuery = true) + @Query(value = "UPDATE USERS.Users u SET u.status = ? WHERE u.name = ?", nativeQuery = true) int updateUserSetStatusForNameNative(Integer status, String name); - } diff --git a/spring-data-jpa/src/main/java/com/baeldung/persistence/model/Bar.java b/spring-data-jpa/src/main/java/com/baeldung/domain/Bar.java similarity index 98% rename from spring-data-jpa/src/main/java/com/baeldung/persistence/model/Bar.java rename to spring-data-jpa/src/main/java/com/baeldung/domain/Bar.java index daa590e43c..efd297bafc 100644 --- a/spring-data-jpa/src/main/java/com/baeldung/persistence/model/Bar.java +++ b/spring-data-jpa/src/main/java/com/baeldung/domain/Bar.java @@ -1,7 +1,6 @@ -package com.baeldung.persistence.model; +package com.baeldung.domain; import com.google.common.collect.Sets; -import org.baeldung.persistence.model.Foo; import org.hibernate.annotations.OrderBy; import org.hibernate.envers.Audited; import org.jboss.logging.Logger; @@ -23,31 +22,6 @@ import java.util.Set; public class Bar implements Serializable { private static Logger logger = Logger.getLogger(Bar.class); - - public enum OPERATION { - INSERT, UPDATE, DELETE; - private String value; - - OPERATION() { - value = toString(); - } - - public String getValue() { - return value; - } - - public static OPERATION parse(final String value) { - OPERATION operation = null; - for (final OPERATION op : OPERATION.values()) { - if (op.getValue().equals(value)) { - operation = op; - break; - } - } - return operation; - } - }; - @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") @@ -55,30 +29,23 @@ public class Bar implements Serializable { @Column(name = "name") private String name; - @OneToMany(mappedBy = "bar", cascade = CascadeType.ALL, fetch = FetchType.LAZY) @OrderBy(clause = "NAME DESC") // @NotAudited private Set fooSet = Sets.newHashSet(); - @Column(name = "operation") private String operation; - @Column(name = "timestamp") private long timestamp; - @Column(name = "created_date", updatable = false, nullable = false) @CreatedDate private long createdDate; - @Column(name = "modified_date") @LastModifiedDate private long modifiedDate; - @Column(name = "created_by") @CreatedBy private String createdBy; - @Column(name = "modified_by") @LastModifiedBy private String modifiedBy; @@ -93,12 +60,12 @@ public class Bar implements Serializable { this.name = name; } - // API - public Set getFooSet() { return fooSet; } + // API + public void setFooSet(final Set fooSet) { this.fooSet = fooSet; } @@ -123,6 +90,10 @@ public class Bar implements Serializable { return OPERATION.parse(operation); } + public void setOperation(final String operation) { + this.operation = operation; + } + public void setOperation(final OPERATION operation) { this.operation = operation.getValue(); } @@ -167,10 +138,6 @@ public class Bar implements Serializable { this.modifiedBy = modifiedBy; } - public void setOperation(final String operation) { - this.operation = operation; - } - @Override public int hashCode() { final int prime = 31; @@ -226,4 +193,28 @@ public class Bar implements Serializable { setTimestamp((new Date()).getTime()); } + public enum OPERATION { + INSERT, UPDATE, DELETE; + private String value; + + OPERATION() { + value = toString(); + } + + public static OPERATION parse(final String value) { + OPERATION operation = null; + for (final OPERATION op : OPERATION.values()) { + if (op.getValue().equals(value)) { + operation = op; + break; + } + } + return operation; + } + + public String getValue() { + return value; + } + } + } diff --git a/spring-data-jpa/src/main/java/com/baeldung/persistence/model/Foo.java b/spring-data-jpa/src/main/java/com/baeldung/domain/Foo.java similarity index 85% rename from spring-data-jpa/src/main/java/com/baeldung/persistence/model/Foo.java rename to spring-data-jpa/src/main/java/com/baeldung/domain/Foo.java index 2e6c80de22..ef88840746 100644 --- a/spring-data-jpa/src/main/java/com/baeldung/persistence/model/Foo.java +++ b/spring-data-jpa/src/main/java/com/baeldung/domain/Foo.java @@ -1,11 +1,11 @@ -package com.baeldung.persistence.model; +package com.baeldung.domain; import org.hibernate.envers.Audited; import javax.persistence.*; import java.io.Serializable; -@NamedNativeQueries({ @NamedNativeQuery(name = "callGetAllFoos", query = "CALL GetAllFoos()", resultClass = Foo.class), @NamedNativeQuery(name = "callGetFoosByName", query = "CALL GetFoosByName(:fooName)", resultClass = Foo.class) }) +@NamedNativeQueries({@NamedNativeQuery(name = "callGetAllFoos", query = "CALL GetAllFoos()", resultClass = Foo.class), @NamedNativeQuery(name = "callGetFoosByName", query = "CALL GetFoosByName(:fooName)", resultClass = Foo.class)}) @Entity @Audited // @Proxy(lazy = false) @@ -16,7 +16,7 @@ public class Foo implements Serializable { @Column(name = "id") private long id; - @Column(name = "name") + @Column(name = "name", nullable = false) private String name; @ManyToOne(targetEntity = Bar.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER) diff --git a/spring-data-jpa/src/main/java/org/baeldung/inmemory/persistence/model/KVTag.java b/spring-data-jpa/src/main/java/com/baeldung/domain/KVTag.java similarity index 91% rename from spring-data-jpa/src/main/java/org/baeldung/inmemory/persistence/model/KVTag.java rename to spring-data-jpa/src/main/java/com/baeldung/domain/KVTag.java index 1522744116..b3e7d78b30 100644 --- a/spring-data-jpa/src/main/java/org/baeldung/inmemory/persistence/model/KVTag.java +++ b/spring-data-jpa/src/main/java/com/baeldung/domain/KVTag.java @@ -1,4 +1,4 @@ -package org.baeldung.inmemory.persistence.model; +package com.baeldung.domain; import javax.persistence.Embeddable; diff --git a/spring-data-jpa/src/main/java/org/baeldung/inmemory/persistence/model/SkillTag.java b/spring-data-jpa/src/main/java/com/baeldung/domain/SkillTag.java similarity index 90% rename from spring-data-jpa/src/main/java/org/baeldung/inmemory/persistence/model/SkillTag.java rename to spring-data-jpa/src/main/java/com/baeldung/domain/SkillTag.java index 490ee0a18e..1f2778c589 100644 --- a/spring-data-jpa/src/main/java/org/baeldung/inmemory/persistence/model/SkillTag.java +++ b/spring-data-jpa/src/main/java/com/baeldung/domain/SkillTag.java @@ -1,4 +1,4 @@ -package org.baeldung.inmemory.persistence.model; +package com.baeldung.domain; import javax.persistence.Embeddable; diff --git a/spring-data-jpa/src/main/java/org/baeldung/inmemory/persistence/model/Student.java b/spring-data-jpa/src/main/java/com/baeldung/domain/Student.java similarity index 96% rename from spring-data-jpa/src/main/java/org/baeldung/inmemory/persistence/model/Student.java rename to spring-data-jpa/src/main/java/com/baeldung/domain/Student.java index 26772e5ca5..bd7eaeb24b 100644 --- a/spring-data-jpa/src/main/java/org/baeldung/inmemory/persistence/model/Student.java +++ b/spring-data-jpa/src/main/java/com/baeldung/domain/Student.java @@ -1,4 +1,4 @@ -package org.baeldung.inmemory.persistence.model; +package com.baeldung.domain; import javax.persistence.ElementCollection; import javax.persistence.Entity; diff --git a/spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/model/product/Product.java b/spring-data-jpa/src/main/java/com/baeldung/domain/product/Product.java similarity index 90% rename from spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/model/product/Product.java rename to spring-data-jpa/src/main/java/com/baeldung/domain/product/Product.java index 8490ed397d..42e6dd8f45 100644 --- a/spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/model/product/Product.java +++ b/spring-data-jpa/src/main/java/com/baeldung/domain/product/Product.java @@ -1,11 +1,11 @@ -package org.baeldung.persistence.multiple.model.product; +package com.baeldung.domain.product; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Entity -@Table(schema = "spring_jpa_product") +@Table(schema = "products") public class Product { @Id diff --git a/spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/Possession.java b/spring-data-jpa/src/main/java/com/baeldung/domain/user/Possession.java similarity index 95% rename from spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/Possession.java rename to spring-data-jpa/src/main/java/com/baeldung/domain/user/Possession.java index 079888155e..614e13df36 100644 --- a/spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/Possession.java +++ b/spring-data-jpa/src/main/java/com/baeldung/domain/user/Possession.java @@ -1,4 +1,4 @@ -package org.baeldung.persistence.multiple.model.user; +package com.baeldung.domain.user; import javax.persistence.Entity; import javax.persistence.GeneratedValue; @@ -7,7 +7,7 @@ import javax.persistence.Id; import javax.persistence.Table; @Entity -@Table(schema = "spring_jpa_user") +@Table(schema = "users") public class Possession { @Id diff --git a/spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java b/spring-data-jpa/src/main/java/com/baeldung/domain/user/User.java similarity index 75% rename from spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java rename to spring-data-jpa/src/main/java/com/baeldung/domain/user/User.java index 61904198f5..3a8b617d9a 100644 --- a/spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java +++ b/spring-data-jpa/src/main/java/com/baeldung/domain/user/User.java @@ -1,30 +1,20 @@ -package org.baeldung.persistence.multiple.model.user; +package com.baeldung.domain.user; +import javax.persistence.*; import java.util.List; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.OneToMany; -import javax.persistence.Table; - @Entity -@Table(schema = "spring_jpa_user") +@Table(name = "users", schema = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; - private String name; - + private int age; @Column(unique = true, nullable = false) private String email; - - private int age; - + private Integer status; @OneToMany List possessionList; @@ -32,6 +22,12 @@ public class User { super(); } + public User(String name, String email, Integer status) { + this.name = name; + this.email = email; + this.status = status; + } + public int getId() { return id; } @@ -56,6 +52,14 @@ public class User { this.email = email; } + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + public int getAge() { return age; } @@ -78,4 +82,5 @@ public class User { builder.append("User [name=").append(name).append(", id=").append(id).append("]"); return builder.toString(); } + } \ No newline at end of file diff --git a/spring-data-jpa/src/main/java/com/baeldung/persistence/dao/common/IOperations.java b/spring-data-jpa/src/main/java/com/baeldung/persistence/dao/common/IOperations.java deleted file mode 100644 index 4ef99221ab..0000000000 --- a/spring-data-jpa/src/main/java/com/baeldung/persistence/dao/common/IOperations.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.baeldung.persistence.dao.common; - -import java.io.Serializable; -import java.util.List; - -public interface IOperations { - - T findOne(final long id); - - List findAll(); - - void create(final T entity); - - T update(final T entity); - - void delete(final T entity); - - void deleteById(final long entityId); - -} diff --git a/spring-data-jpa/src/main/java/com/baeldung/persistence/service/IBarService.java b/spring-data-jpa/src/main/java/com/baeldung/persistence/service/IBarService.java deleted file mode 100644 index 21185b5990..0000000000 --- a/spring-data-jpa/src/main/java/com/baeldung/persistence/service/IBarService.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.baeldung.persistence.service; - -import com.baeldung.persistence.dao.common.IOperations; -import com.baeldung.persistence.model.Bar; - -public interface IBarService extends IOperations { - // -} diff --git a/spring-data-jpa/src/main/java/com/baeldung/services/IBarService.java b/spring-data-jpa/src/main/java/com/baeldung/services/IBarService.java new file mode 100644 index 0000000000..7e127488db --- /dev/null +++ b/spring-data-jpa/src/main/java/com/baeldung/services/IBarService.java @@ -0,0 +1,7 @@ +package com.baeldung.services; + +import com.baeldung.domain.Bar; + +public interface IBarService extends IOperations { + // +} diff --git a/spring-data-jpa/src/main/java/org/baeldung/persistence/service/IFooService.java b/spring-data-jpa/src/main/java/com/baeldung/services/IFooService.java similarity index 65% rename from spring-data-jpa/src/main/java/org/baeldung/persistence/service/IFooService.java rename to spring-data-jpa/src/main/java/com/baeldung/services/IFooService.java index a3d16d9c15..7e16ace5b6 100644 --- a/spring-data-jpa/src/main/java/org/baeldung/persistence/service/IFooService.java +++ b/spring-data-jpa/src/main/java/com/baeldung/services/IFooService.java @@ -1,7 +1,6 @@ -package org.baeldung.persistence.service; +package com.baeldung.services; -import org.baeldung.persistence.IOperations; -import org.baeldung.persistence.model.Foo; +import com.baeldung.domain.Foo; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; diff --git a/spring-data-jpa/src/main/java/org/baeldung/persistence/IOperations.java b/spring-data-jpa/src/main/java/com/baeldung/services/IOperations.java similarity index 85% rename from spring-data-jpa/src/main/java/org/baeldung/persistence/IOperations.java rename to spring-data-jpa/src/main/java/com/baeldung/services/IOperations.java index 85332899e3..d50d465639 100644 --- a/spring-data-jpa/src/main/java/org/baeldung/persistence/IOperations.java +++ b/spring-data-jpa/src/main/java/com/baeldung/services/IOperations.java @@ -1,4 +1,4 @@ -package org.baeldung.persistence; +package com.baeldung.services; import org.springframework.data.domain.Page; @@ -7,12 +7,8 @@ import java.util.List; public interface IOperations { - // read - one - T findOne(final long id); - // read - all - List findAll(); Page findPaginated(int page, int size); diff --git a/spring-data-jpa/src/main/java/org/baeldung/persistence/service/common/AbstractService.java b/spring-data-jpa/src/main/java/com/baeldung/services/impl/AbstractService.java similarity index 93% rename from spring-data-jpa/src/main/java/org/baeldung/persistence/service/common/AbstractService.java rename to spring-data-jpa/src/main/java/com/baeldung/services/impl/AbstractService.java index 8201df7343..708524225b 100644 --- a/spring-data-jpa/src/main/java/org/baeldung/persistence/service/common/AbstractService.java +++ b/spring-data-jpa/src/main/java/com/baeldung/services/impl/AbstractService.java @@ -1,7 +1,7 @@ -package org.baeldung.persistence.service.common; +package com.baeldung.services.impl; +import com.baeldung.services.IOperations; import com.google.common.collect.Lists; -import org.baeldung.persistence.IOperations; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.repository.PagingAndSortingRepository; diff --git a/spring-data-jpa/src/main/java/com/baeldung/persistence/service/common/AbstractSpringDataJpaService.java b/spring-data-jpa/src/main/java/com/baeldung/services/impl/AbstractSpringDataJpaService.java similarity index 72% rename from spring-data-jpa/src/main/java/com/baeldung/persistence/service/common/AbstractSpringDataJpaService.java rename to spring-data-jpa/src/main/java/com/baeldung/services/impl/AbstractSpringDataJpaService.java index b5c3120ff5..28c86bee28 100644 --- a/spring-data-jpa/src/main/java/com/baeldung/persistence/service/common/AbstractSpringDataJpaService.java +++ b/spring-data-jpa/src/main/java/com/baeldung/services/impl/AbstractSpringDataJpaService.java @@ -1,6 +1,6 @@ -package com.baeldung.persistence.service.common; +package com.baeldung.services.impl; -import com.baeldung.persistence.dao.common.IOperations; +import com.baeldung.services.IOperations; import com.google.common.collect.Lists; import org.springframework.data.repository.CrudRepository; import org.springframework.transaction.annotation.Transactional; @@ -8,12 +8,12 @@ import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; import java.util.List; -@Transactional(value = "jpaTransactionManager") +@Transactional(value = "transactionManager") public abstract class AbstractSpringDataJpaService implements IOperations { @Override public T findOne(final long id) { - return getDao().findOne(Long.valueOf(id)); + return getDao().findById(id).orElse(null); } @Override @@ -22,8 +22,8 @@ public abstract class AbstractSpringDataJpaService imple } @Override - public void create(final T entity) { - getDao().save(entity); + public T create(final T entity) { + return getDao().save(entity); } @Override @@ -38,7 +38,7 @@ public abstract class AbstractSpringDataJpaService imple @Override public void deleteById(final long entityId) { - getDao().delete(Long.valueOf(entityId)); + getDao().deleteById(entityId); } protected abstract CrudRepository getDao(); diff --git a/spring-data-jpa/src/main/java/com/baeldung/persistence/service/impl/BarSpringDataJpaService.java b/spring-data-jpa/src/main/java/com/baeldung/services/impl/BarSpringDataJpaService.java similarity index 56% rename from spring-data-jpa/src/main/java/com/baeldung/persistence/service/impl/BarSpringDataJpaService.java rename to spring-data-jpa/src/main/java/com/baeldung/services/impl/BarSpringDataJpaService.java index c893473e04..ca3e5f868d 100644 --- a/spring-data-jpa/src/main/java/com/baeldung/persistence/service/impl/BarSpringDataJpaService.java +++ b/spring-data-jpa/src/main/java/com/baeldung/services/impl/BarSpringDataJpaService.java @@ -1,10 +1,10 @@ -package com.baeldung.persistence.service.impl; +package com.baeldung.services.impl; -import com.baeldung.persistence.dao.IBarCrudRepository; -import com.baeldung.persistence.model.Bar; -import com.baeldung.persistence.service.IBarService; -import com.baeldung.persistence.service.common.AbstractSpringDataJpaService; +import com.baeldung.domain.Bar; +import com.baeldung.dao.repositories.IBarCrudRepository; +import com.baeldung.services.IBarService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; import org.springframework.data.repository.CrudRepository; import java.io.Serializable; @@ -23,4 +23,8 @@ public class BarSpringDataJpaService extends AbstractSpringDataJpaService i return dao; } + @Override + public Page findPaginated(int page, int size) { + throw new UnsupportedOperationException("Not implemented yet"); + } } diff --git a/spring-data-jpa/src/main/java/org/baeldung/persistence/service/impl/FooService.java b/spring-data-jpa/src/main/java/com/baeldung/services/impl/FooService.java similarity index 81% rename from spring-data-jpa/src/main/java/org/baeldung/persistence/service/impl/FooService.java rename to spring-data-jpa/src/main/java/com/baeldung/services/impl/FooService.java index f1360b08cc..319ab3a825 100644 --- a/spring-data-jpa/src/main/java/org/baeldung/persistence/service/impl/FooService.java +++ b/spring-data-jpa/src/main/java/com/baeldung/services/impl/FooService.java @@ -1,10 +1,9 @@ -package org.baeldung.persistence.service.impl; +package com.baeldung.services.impl; import com.google.common.collect.Lists; -import org.baeldung.persistence.dao.IFooDao; -import org.baeldung.persistence.model.Foo; -import org.baeldung.persistence.service.IFooService; -import org.baeldung.persistence.service.common.AbstractService; +import com.baeldung.dao.IFooDao; +import com.baeldung.domain.Foo; +import com.baeldung.services.IFooService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; diff --git a/spring-data-jpa/src/main/java/com/baeldung/spring/PersistenceConfig.java b/spring-data-jpa/src/main/java/com/baeldung/spring/PersistenceConfig.java deleted file mode 100644 index 75583b3eb9..0000000000 --- a/spring-data-jpa/src/main/java/com/baeldung/spring/PersistenceConfig.java +++ /dev/null @@ -1,169 +0,0 @@ -package com.baeldung.spring; - -import com.baeldung.persistence.dao.IBarAuditableDao; -import com.baeldung.persistence.dao.IBarDao; -import com.baeldung.persistence.dao.IFooAuditableDao; -import com.baeldung.persistence.dao.IFooDao; -import com.baeldung.persistence.dao.impl.*; -import com.baeldung.persistence.service.IBarAuditableService; -import com.baeldung.persistence.service.IBarService; -import com.baeldung.persistence.service.IFooAuditableService; -import com.baeldung.persistence.service.IFooService; -import com.baeldung.persistence.service.impl.*; -import com.google.common.base.Preconditions; -import org.apache.tomcat.dbcp.dbcp2.BasicDataSource; -import org.springframework.beans.factory.annotation.Autowired; -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; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.orm.hibernate4.HibernateTransactionManager; -import org.springframework.orm.hibernate4.LocalSessionFactoryBean; -import org.springframework.orm.jpa.JpaTransactionManager; -import org.springframework.orm.jpa.JpaVendorAdapter; -import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; -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; - -@Configuration -@EnableTransactionManagement -@EnableJpaRepositories(basePackages = { "com.baeldung.persistence" }, transactionManagerRef = "jpaTransactionManager") -@EnableJpaAuditing -@PropertySource({ "classpath:persistence-mysql.properties" }) -@ComponentScan({ "com.baeldung.persistence" }) -public class PersistenceConfig { - - @Autowired - private Environment env; - - public PersistenceConfig() { - super(); - } - - @Bean - public LocalSessionFactoryBean sessionFactory() { - final LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); - sessionFactory.setDataSource(restDataSource()); - sessionFactory.setPackagesToScan(new String[] { "com.baeldung.persistence.model" }); - sessionFactory.setHibernateProperties(hibernateProperties()); - - return sessionFactory; - } - - @Bean - public LocalContainerEntityManagerFactoryBean entityManagerFactory() { - final LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean(); - emf.setDataSource(restDataSource()); - emf.setPackagesToScan(new String[] { "com.baeldung.persistence.model" }); - - final JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); - emf.setJpaVendorAdapter(vendorAdapter); - emf.setJpaProperties(hibernateProperties()); - - return emf; - } - - @Bean - public DataSource restDataSource() { - final BasicDataSource dataSource = new BasicDataSource(); - dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName"))); - dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url"))); - dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("jdbc.user"))); - dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("jdbc.pass"))); - - return dataSource; - } - - @Bean - public PlatformTransactionManager hibernateTransactionManager() { - final HibernateTransactionManager transactionManager = new HibernateTransactionManager(); - transactionManager.setSessionFactory(sessionFactory().getObject()); - return transactionManager; - } - - @Bean - public PlatformTransactionManager jpaTransactionManager() { - final JpaTransactionManager transactionManager = new JpaTransactionManager(); - transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); - return transactionManager; - } - - @Bean - public PersistenceExceptionTranslationPostProcessor exceptionTranslation() { - return new PersistenceExceptionTranslationPostProcessor(); - } - - @Bean - public IBarService barJpaService() { - return new BarJpaService(); - } - - @Bean - public IBarService barSpringDataJpaService() { - return new BarSpringDataJpaService(); - } - - @Bean - public IFooService fooHibernateService() { - return new FooService(); - } - - @Bean - public IBarAuditableService barHibernateAuditableService() { - return new BarAuditableService(); - } - - @Bean - public IFooAuditableService fooHibernateAuditableService() { - return new FooAuditableService(); - } - - @Bean - public IBarDao barJpaDao() { - return new BarJpaDao(); - } - - @Bean - public IBarDao barHibernateDao() { - return new BarDao(); - } - - @Bean - public IBarAuditableDao barHibernateAuditableDao() { - return new BarAuditableDao(); - } - - @Bean - public IFooDao fooHibernateDao() { - return new FooDao(); - } - - @Bean - public IFooAuditableDao fooHibernateAuditableDao() { - return new FooAuditableDao(); - } - - private final Properties hibernateProperties() { - final Properties hibernateProperties = new Properties(); - hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); - hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect")); - - hibernateProperties.setProperty("hibernate.show_sql", "true"); - // hibernateProperties.setProperty("hibernate.format_sql", "true"); - // hibernateProperties.setProperty("hibernate.globally_quoted_identifiers", "true"); - - // Envers properties - hibernateProperties.setProperty("org.hibernate.envers.audit_table_suffix", env.getProperty("envers.audit_table_suffix")); - - return hibernateProperties; - } - -} \ No newline at end of file diff --git a/spring-data-jpa/src/main/java/org/baeldung/config/H2JpaConfig.java b/spring-data-jpa/src/main/java/org/baeldung/config/H2JpaConfig.java deleted file mode 100644 index 9f3dbeb788..0000000000 --- a/spring-data-jpa/src/main/java/org/baeldung/config/H2JpaConfig.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.baeldung.config; - -import org.springframework.beans.factory.annotation.Autowired; -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.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.jdbc.datasource.DriverManagerDataSource; -import org.springframework.orm.jpa.JpaTransactionManager; -import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; -import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -import javax.persistence.EntityManagerFactory; -import javax.sql.DataSource; -import java.util.Properties; - -@Configuration -@EnableJpaRepositories(basePackages = {"org.baeldung.repository" }) -@PropertySource("classpath:persistence-generic-entity.properties") -@EnableTransactionManagement -public class H2JpaConfig { - - @Autowired - private Environment env; - - @Bean - public DataSource dataSource() { - final DriverManagerDataSource dataSource = new DriverManagerDataSource(); - dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName")); - dataSource.setUrl(env.getProperty("jdbc.url")); - dataSource.setUsername(env.getProperty("jdbc.user")); - dataSource.setPassword(env.getProperty("jdbc.pass")); - - return dataSource; - } - - @Bean - public LocalContainerEntityManagerFactoryBean entityManagerFactory() { - final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); - em.setDataSource(dataSource()); - em.setPackagesToScan("org.baeldung.persistence.model"); - em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); - em.setJpaProperties(additionalProperties()); - return em; - } - - @Bean - JpaTransactionManager transactionManager(final EntityManagerFactory entityManagerFactory) { - final JpaTransactionManager transactionManager = new JpaTransactionManager(); - transactionManager.setEntityManagerFactory(entityManagerFactory); - return transactionManager; - } - - final Properties additionalProperties() { - final Properties hibernateProperties = new Properties(); - - hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); - hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect")); - hibernateProperties.setProperty("hibernate.show_sql", env.getProperty("hibernate.show_sql")); - - return hibernateProperties; - } - -} diff --git a/spring-data-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigL2Cache.java b/spring-data-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigL2Cache.java deleted file mode 100644 index a236cf2331..0000000000 --- a/spring-data-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigL2Cache.java +++ /dev/null @@ -1,89 +0,0 @@ -package org.baeldung.config; - -import com.google.common.base.Preconditions; -import org.springframework.beans.factory.annotation.Autowired; -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.EnableJpaRepositories; -import org.springframework.jdbc.datasource.DriverManagerDataSource; -import org.springframework.orm.jpa.JpaTransactionManager; -import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; -import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; -import org.springframework.transaction.PlatformTransactionManager; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -import javax.persistence.EntityManagerFactory; -import javax.sql.DataSource; -import java.util.Properties; - -@Configuration -@EnableTransactionManagement -@PropertySource({ "classpath:persistence-h2.properties" }) -@ComponentScan({ "org.baeldung.persistence" }) -@EnableJpaRepositories(basePackages = { "org.baeldung.persistence.dao", "org.baeldung.persistence.repository" }) -public class PersistenceJPAConfigL2Cache { - - @Autowired - private Environment env; - - public PersistenceJPAConfigL2Cache() { - super(); - } - - // beans - - @Bean - public LocalContainerEntityManagerFactoryBean entityManagerFactory() { - final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); - em.setDataSource(dataSource()); - em.setPackagesToScan(getPackagesToScan()); - - final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); - em.setJpaVendorAdapter(vendorAdapter); - em.setJpaProperties(additionalProperties()); - - return em; - } - - protected String[] getPackagesToScan() { - return new String[] { "org.baeldung.persistence.model" }; - } - - @Bean - public DataSource dataSource() { - final DriverManagerDataSource dataSource = new DriverManagerDataSource(); - dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName"))); - dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url"))); - dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("jdbc.user"))); - - return dataSource; - } - - @Bean - public PlatformTransactionManager transactionManager(final EntityManagerFactory emf) { - final JpaTransactionManager transactionManager = new JpaTransactionManager(); - transactionManager.setEntityManagerFactory(emf); - return transactionManager; - } - - @Bean - public PersistenceExceptionTranslationPostProcessor exceptionTranslation() { - return new PersistenceExceptionTranslationPostProcessor(); - } - - final Properties additionalProperties() { - final Properties hibernateProperties = new Properties(); - hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); - hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect")); - hibernateProperties.setProperty("hibernate.cache.use_second_level_cache", env.getProperty("hibernate.cache.use_second_level_cache")); - hibernateProperties.setProperty("hibernate.cache.use_query_cache", env.getProperty("hibernate.cache.use_query_cache")); - hibernateProperties.setProperty("hibernate.cache.region.factory_class", env.getProperty("hibernate.cache.region.factory_class")); - hibernateProperties.setProperty("hibernate.show_sql", env.getProperty("hibernate.show_sql")); - return hibernateProperties; - } - -} \ No newline at end of file diff --git a/spring-data-jpa/src/main/java/org/baeldung/config/StudentJPAH2Config.java b/spring-data-jpa/src/main/java/org/baeldung/config/StudentJPAH2Config.java deleted file mode 100644 index 439c6cb602..0000000000 --- a/spring-data-jpa/src/main/java/org/baeldung/config/StudentJPAH2Config.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.baeldung.config; - -import java.util.Properties; - -import javax.persistence.EntityManagerFactory; -import javax.sql.DataSource; - -import org.baeldung.extended.persistence.dao.ExtendedRepositoryImpl; -import org.springframework.beans.factory.annotation.Autowired; -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.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.jdbc.datasource.DriverManagerDataSource; -import org.springframework.orm.jpa.JpaTransactionManager; -import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; -import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -@Configuration -@EnableJpaRepositories(basePackages = "org.baeldung.extended.persistence.dao", repositoryBaseClass = ExtendedRepositoryImpl.class) -@PropertySource("persistence-student-h2.properties") -@EnableTransactionManagement -public class StudentJPAH2Config { - - @Autowired - private Environment env; - - @Bean - public DataSource dataSource() { - final DriverManagerDataSource dataSource = new DriverManagerDataSource(); - dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName")); - dataSource.setUrl(env.getProperty("jdbc.url")); - dataSource.setUsername(env.getProperty("jdbc.user")); - dataSource.setPassword(env.getProperty("jdbc.pass")); - - return dataSource; - } - - @Bean - public LocalContainerEntityManagerFactoryBean entityManagerFactory() { - final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); - em.setDataSource(dataSource()); - em.setPackagesToScan(new String[] { "org.baeldung.inmemory.persistence.model" }); - em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); - em.setJpaProperties(additionalProperties()); - return em; - } - - @Bean - JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) { - JpaTransactionManager transactionManager = new JpaTransactionManager(); - transactionManager.setEntityManagerFactory(entityManagerFactory); - return transactionManager; - } - - final Properties additionalProperties() { - final Properties hibernateProperties = new Properties(); - - hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); - hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect")); - hibernateProperties.setProperty("hibernate.show_sql", env.getProperty("hibernate.show_sql")); - hibernateProperties.setProperty("hibernate.cache.use_second_level_cache", env.getProperty("hibernate.cache.use_second_level_cache")); - hibernateProperties.setProperty("hibernate.cache.use_query_cache", env.getProperty("hibernate.cache.use_query_cache")); - - return hibernateProperties; - } -} diff --git a/spring-data-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedStudentRepository.java b/spring-data-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedStudentRepository.java deleted file mode 100644 index 7e2efc72bc..0000000000 --- a/spring-data-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedStudentRepository.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.baeldung.extended.persistence.dao; - -import org.baeldung.inmemory.persistence.model.Student; - -public interface ExtendedStudentRepository extends ExtendedRepository { -} diff --git a/spring-data-jpa/src/main/java/org/baeldung/persistence/model/Foo.java b/spring-data-jpa/src/main/java/org/baeldung/persistence/model/Foo.java deleted file mode 100644 index c80aac6e0c..0000000000 --- a/spring-data-jpa/src/main/java/org/baeldung/persistence/model/Foo.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.baeldung.persistence.model; - -import javax.persistence.*; -import java.io.Serializable; - -@Entity -public class Foo implements Serializable { - - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private long id; - - @Column(nullable = false) - private String name; - - public Foo() { - super(); - } - - public Foo(final String name) { - super(); - - this.name = name; - } - - // API - - public long getId() { - return id; - } - - public void setId(final long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(final String name) { - this.name = name; - } - - // - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((name == null) ? 0 : name.hashCode()); - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - final Foo other = (Foo) obj; - if (name == null) { - if (other.name != null) - return false; - } else if (!name.equals(other.name)) - return false; - return true; - } - - @Override - public String toString() { - final StringBuilder builder = new StringBuilder(); - builder.append("Foo [name=").append(name).append("]"); - return builder.toString(); - } - -} diff --git a/spring-data-jpa/src/main/java/org/baeldung/persistence/model/User.java b/spring-data-jpa/src/main/java/org/baeldung/persistence/model/User.java deleted file mode 100644 index f84a10cf76..0000000000 --- a/spring-data-jpa/src/main/java/org/baeldung/persistence/model/User.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.baeldung.persistence.model; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; - -@Entity -@Table(name = "users") -public class User { - - @Id - @GeneratedValue - private Integer id; - private String name; - private Integer status; - - public User() { - } - - public User(String name, Integer status) { - this.name = name; - this.status = status; - } - - 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 Integer getStatus() { - return status; - } - - public void setStatus(Integer status) { - this.status = status; - } -} diff --git a/spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/UserRepository.java b/spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/UserRepository.java deleted file mode 100644 index e250a291bc..0000000000 --- a/spring-data-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/UserRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.baeldung.persistence.multiple.dao.user; - -import org.baeldung.persistence.multiple.model.user.User; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface UserRepository extends JpaRepository { - -} diff --git a/spring-data-jpa/src/main/java/org/baeldung/repository/UserRepository.java b/spring-data-jpa/src/main/java/org/baeldung/repository/UserRepository.java deleted file mode 100644 index 623e009b6d..0000000000 --- a/spring-data-jpa/src/main/java/org/baeldung/repository/UserRepository.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.baeldung.repository; - -import org.baeldung.persistence.model.User; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.stream.Stream; - -@Repository("userRepository") -public interface UserRepository extends JpaRepository { - - Stream findAllByName(String name); - -} diff --git a/spring-data-jpa/src/test/resources/application.properties b/spring-data-jpa/src/main/resources/application.properties similarity index 100% rename from spring-data-jpa/src/test/resources/application.properties rename to spring-data-jpa/src/main/resources/application.properties diff --git a/spring-data-jpa/src/main/resources/persistence-generic-entity.properties b/spring-data-jpa/src/main/resources/persistence-generic-entity.properties deleted file mode 100644 index b19304cb1f..0000000000 --- a/spring-data-jpa/src/main/resources/persistence-generic-entity.properties +++ /dev/null @@ -1,8 +0,0 @@ -jdbc.driverClassName=org.h2.Driver -jdbc.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 -jdbc.user=sa -jdbc.pass=sa - -hibernate.dialect=org.hibernate.dialect.H2Dialect -hibernate.show_sql=true -hibernate.hbm2ddl.auto=create-drop diff --git a/spring-data-jpa/src/main/resources/persistence-multiple-db.properties b/spring-data-jpa/src/main/resources/persistence-multiple-db.properties index ce1b6da9ff..53c6cecf8b 100644 --- a/spring-data-jpa/src/main/resources/persistence-multiple-db.properties +++ b/spring-data-jpa/src/main/resources/persistence-multiple-db.properties @@ -1,7 +1,7 @@ # jdbc.X jdbc.driverClassName=org.h2.Driver -user.jdbc.url=jdbc:h2:mem:spring_jpa_user;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS SPRING_JPA_USER -product.jdbc.url=jdbc:h2:mem:spring_jpa_product;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS SPRING_JPA_PRODUCT +user.jdbc.url=jdbc:h2:mem:spring_jpa_user;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS USERS +product.jdbc.url=jdbc:h2:mem:spring_jpa_product;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS PRODUCTS jdbc.user=sa jdbc.pass= diff --git a/spring-data-jpa/src/main/resources/persistence-student-h2.properties b/spring-data-jpa/src/main/resources/persistence-student-h2.properties deleted file mode 100644 index 405e6ff109..0000000000 --- a/spring-data-jpa/src/main/resources/persistence-student-h2.properties +++ /dev/null @@ -1,12 +0,0 @@ -# jdbc.X -jdbc.driverClassName=org.h2.Driver -jdbc.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 -jdbc.user=sa -jdbc.pass= - -# hibernate.X -hibernate.dialect=org.hibernate.dialect.H2Dialect -hibernate.show_sql=true -hibernate.hbm2ddl.auto=create-drop -hibernate.cache.use_second_level_cache=false -hibernate.cache.use_query_cache=false \ No newline at end of file diff --git a/spring-data-jpa/src/main/resources/persistence-h2.properties b/spring-data-jpa/src/main/resources/persistence.properties similarity index 69% rename from spring-data-jpa/src/main/resources/persistence-h2.properties rename to spring-data-jpa/src/main/resources/persistence.properties index 716a96fde3..5e83653401 100644 --- a/spring-data-jpa/src/main/resources/persistence-h2.properties +++ b/spring-data-jpa/src/main/resources/persistence.properties @@ -1,6 +1,6 @@ # jdbc.X jdbc.driverClassName=org.h2.Driver -jdbc.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 +jdbc.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS USERS jdbc.user=sa jdbc.pass= @@ -10,4 +10,7 @@ hibernate.show_sql=true hibernate.hbm2ddl.auto=create-drop hibernate.cache.use_second_level_cache=true hibernate.cache.use_query_cache=true -hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory \ No newline at end of file +hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory + +# envers.X +envers.audit_table_suffix=_audit_log \ No newline at end of file diff --git a/spring-data-jpa/src/test/java/com/baeldung/repository/ArticleRepositoryIntegrationTest.java b/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/ArticleRepositoryIntegrationTest.java similarity index 85% rename from spring-data-jpa/src/test/java/com/baeldung/repository/ArticleRepositoryIntegrationTest.java rename to spring-data-jpa/src/test/java/com/baeldung/dao/repositories/ArticleRepositoryIntegrationTest.java index dd1fe66a0d..093e744003 100644 --- a/spring-data-jpa/src/test/java/com/baeldung/repository/ArticleRepositoryIntegrationTest.java +++ b/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/ArticleRepositoryIntegrationTest.java @@ -1,7 +1,9 @@ -package com.baeldung.repository; +package com.baeldung.dao.repositories; +import com.baeldung.config.PersistenceConfiguration; +import com.baeldung.config.PersistenceProductConfiguration; +import com.baeldung.config.PersistenceUserConfiguration; import com.baeldung.domain.Article; -import com.baeldung.repository.ArticleRepository; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -16,7 +18,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @RunWith(SpringRunner.class) -@DataJpaTest +@DataJpaTest(excludeAutoConfiguration = {PersistenceConfiguration.class, PersistenceUserConfiguration.class, PersistenceProductConfiguration.class}) public class ArticleRepositoryIntegrationTest { @Autowired diff --git a/spring-data-jpa/src/test/java/org/baeldung/persistence/repository/ExtendedStudentRepositoryIntegrationTest.java b/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/ExtendedStudentRepositoryIntegrationTest.java similarity index 72% rename from spring-data-jpa/src/test/java/org/baeldung/persistence/repository/ExtendedStudentRepositoryIntegrationTest.java rename to spring-data-jpa/src/test/java/com/baeldung/dao/repositories/ExtendedStudentRepositoryIntegrationTest.java index f3cf921632..b19a34df82 100644 --- a/spring-data-jpa/src/test/java/org/baeldung/persistence/repository/ExtendedStudentRepositoryIntegrationTest.java +++ b/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/ExtendedStudentRepositoryIntegrationTest.java @@ -1,23 +1,21 @@ -package org.baeldung.persistence.repository; +package com.baeldung.dao.repositories; -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.List; - -import javax.annotation.Resource; - -import org.baeldung.config.StudentJPAH2Config; -import org.baeldung.extended.persistence.dao.ExtendedStudentRepository; -import org.baeldung.inmemory.persistence.model.Student; +import com.baeldung.config.PersistenceConfiguration; +import com.baeldung.domain.Student; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.junit4.SpringRunner; -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { StudentJPAH2Config.class }) +import javax.annotation.Resource; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = {PersistenceConfiguration.class}) @DirtiesContext public class ExtendedStudentRepositoryIntegrationTest { @Resource diff --git a/spring-data-jpa/src/test/java/com/baeldung/repository/JpaRepositoriesIntegrationTest.java b/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/JpaRepositoriesIntegrationTest.java similarity index 81% rename from spring-data-jpa/src/test/java/com/baeldung/repository/JpaRepositoriesIntegrationTest.java rename to spring-data-jpa/src/test/java/com/baeldung/dao/repositories/JpaRepositoriesIntegrationTest.java index d8b7bc4a88..eaadb9e44a 100644 --- a/spring-data-jpa/src/test/java/com/baeldung/repository/JpaRepositoriesIntegrationTest.java +++ b/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/JpaRepositoriesIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.repository; +package com.baeldung.dao.repositories; import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.assertFalse; @@ -9,10 +9,19 @@ import static junit.framework.TestCase.assertTrue; import java.util.List; import java.util.Optional; +import com.baeldung.config.PersistenceConfiguration; +import com.baeldung.config.PersistenceProductConfiguration; +import com.baeldung.config.PersistenceUserConfiguration; +import com.baeldung.dao.repositories.ItemTypeRepository; +import com.baeldung.dao.repositories.LocationRepository; +import com.baeldung.dao.repositories.ReadOnlyLocationRepository; +import com.baeldung.dao.repositories.StoreRepository; 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.boot.test.context.SpringBootTest; +import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; import com.baeldung.domain.Item; @@ -21,7 +30,7 @@ import com.baeldung.domain.Location; import com.baeldung.domain.Store; @RunWith(SpringRunner.class) -@DataJpaTest +@DataJpaTest(excludeAutoConfiguration = {PersistenceConfiguration.class, PersistenceUserConfiguration.class, PersistenceProductConfiguration.class}) public class JpaRepositoriesIntegrationTest { @Autowired private LocationRepository locationRepository; diff --git a/spring-data-jpa/src/test/java/org/baeldung/persistence/repository/UserRepositoryIntegrationTest.java b/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/UserRepositoryIntegrationTest.java similarity index 67% rename from spring-data-jpa/src/test/java/org/baeldung/persistence/repository/UserRepositoryIntegrationTest.java rename to spring-data-jpa/src/test/java/com/baeldung/dao/repositories/UserRepositoryIntegrationTest.java index 9effd4717f..e29161394b 100644 --- a/spring-data-jpa/src/test/java/org/baeldung/persistence/repository/UserRepositoryIntegrationTest.java +++ b/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/UserRepositoryIntegrationTest.java @@ -1,23 +1,25 @@ -package org.baeldung.persistence.repository; +package com.baeldung.dao.repositories; -import org.baeldung.config.PersistenceJPAConfigL2Cache; -import org.baeldung.persistence.model.User; +import com.baeldung.config.PersistenceConfiguration; +import com.baeldung.dao.repositories.user.UserRepository; +import com.baeldung.domain.user.User; import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.data.jpa.domain.JpaSort; import org.springframework.data.mapping.PropertyReferenceException; import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; import java.util.Collection; import java.util.List; +import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; @@ -25,32 +27,71 @@ import static org.assertj.core.api.Assertions.assertThat; * Created by adam. */ @RunWith(SpringRunner.class) -@ContextConfiguration(classes = PersistenceJPAConfigL2Cache.class) +@SpringBootTest(classes = PersistenceConfiguration.class) @DirtiesContext public class UserRepositoryIntegrationTest { private final String USER_NAME_ADAM = "Adam"; private final String USER_NAME_PETER = "Peter"; + + private final String USER_EMAIL = "email@example.com"; + private final String USER_EMAIL2 = "email2@example.com"; + private final String USER_EMAIL3 = "email3@example.com"; + private final String USER_EMAIL4 = "email4@example.com"; + private final String USER_EMAIL5 = "email5@example.com"; + private final String USER_EMAIL6 = "email6@example.com"; + private final Integer INACTIVE_STATUS = 0; private final Integer ACTIVE_STATUS = 1; @Autowired private UserRepository userRepository; + @Test + @Transactional + public void givenUsersWithSameNameInDBWhenFindAllByNameThenReturnStreamOfUsers() { + User user1 = new User(); + user1.setName(USER_NAME_ADAM); + user1.setEmail(USER_EMAIL); + userRepository.save(user1); + + User user2 = new User(); + user2.setName(USER_NAME_ADAM); + user2.setEmail(USER_EMAIL2); + userRepository.save(user2); + + User user3 = new User(); + user3.setName(USER_NAME_ADAM); + user3.setEmail(USER_EMAIL3); + userRepository.save(user3); + + User user4 = new User(); + user4.setName("SAMPLE"); + user4.setEmail(USER_EMAIL4); + userRepository.save(user4); + + try (Stream foundUsersStream = userRepository.findAllByName(USER_NAME_ADAM)) { + assertThat(foundUsersStream.count()).isEqualTo(3l); + } + } + @Test public void givenUsersInDBWhenFindAllWithQueryAnnotationThenReturnCollectionWithActiveUsers() { User user1 = new User(); user1.setName(USER_NAME_ADAM); + user1.setEmail(USER_EMAIL); user1.setStatus(ACTIVE_STATUS); userRepository.save(user1); User user2 = new User(); user2.setName(USER_NAME_ADAM); + user2.setEmail(USER_EMAIL2); user2.setStatus(ACTIVE_STATUS); userRepository.save(user2); User user3 = new User(); user3.setName(USER_NAME_ADAM); + user3.setEmail(USER_EMAIL3); user3.setStatus(INACTIVE_STATUS); userRepository.save(user3); @@ -63,16 +104,19 @@ public class UserRepositoryIntegrationTest { public void givenUsersInDBWhenFindAllWithQueryAnnotationNativeThenReturnCollectionWithActiveUsers() { User user1 = new User(); user1.setName(USER_NAME_ADAM); + user1.setEmail(USER_EMAIL); user1.setStatus(ACTIVE_STATUS); userRepository.save(user1); User user2 = new User(); user2.setName(USER_NAME_ADAM); + user2.setEmail(USER_EMAIL2); user2.setStatus(ACTIVE_STATUS); userRepository.save(user2); User user3 = new User(); user3.setName(USER_NAME_ADAM); + user3.setEmail(USER_EMAIL3); user3.setStatus(INACTIVE_STATUS); userRepository.save(user3); @@ -85,6 +129,7 @@ public class UserRepositoryIntegrationTest { public void givenUserInDBWhenFindUserByStatusWithQueryAnnotationThenReturnActiveUser() { User user = new User(); user.setName(USER_NAME_ADAM); + user.setEmail(USER_EMAIL); user.setStatus(ACTIVE_STATUS); userRepository.save(user); @@ -97,6 +142,7 @@ public class UserRepositoryIntegrationTest { public void givenUserInDBWhenFindUserByStatusWithQueryAnnotationNativeThenReturnActiveUser() { User user = new User(); user.setName(USER_NAME_ADAM); + user.setEmail(USER_EMAIL); user.setStatus(ACTIVE_STATUS); userRepository.save(user); @@ -109,11 +155,13 @@ public class UserRepositoryIntegrationTest { public void givenUsersInDBWhenFindUserByStatusAndNameWithQueryAnnotationIndexedParamsThenReturnOneUser() { User user = new User(); user.setName(USER_NAME_ADAM); + user.setEmail(USER_EMAIL); user.setStatus(ACTIVE_STATUS); userRepository.save(user); User user2 = new User(); user2.setName(USER_NAME_PETER); + user2.setEmail(USER_EMAIL2); user2.setStatus(ACTIVE_STATUS); userRepository.save(user2); @@ -126,11 +174,13 @@ public class UserRepositoryIntegrationTest { public void givenUsersInDBWhenFindUserByStatusAndNameWithQueryAnnotationNamedParamsThenReturnOneUser() { User user = new User(); user.setName(USER_NAME_ADAM); + user.setEmail(USER_EMAIL); user.setStatus(ACTIVE_STATUS); userRepository.save(user); User user2 = new User(); user2.setName(USER_NAME_PETER); + user2.setEmail(USER_EMAIL2); user2.setStatus(ACTIVE_STATUS); userRepository.save(user2); @@ -143,11 +193,13 @@ public class UserRepositoryIntegrationTest { public void givenUsersInDBWhenFindUserByStatusAndNameWithQueryAnnotationNativeNamedParamsThenReturnOneUser() { User user = new User(); user.setName(USER_NAME_ADAM); + user.setEmail(USER_EMAIL); user.setStatus(ACTIVE_STATUS); userRepository.save(user); User user2 = new User(); user2.setName(USER_NAME_PETER); + user2.setEmail(USER_EMAIL2); user2.setStatus(ACTIVE_STATUS); userRepository.save(user2); @@ -160,11 +212,13 @@ public class UserRepositoryIntegrationTest { public void givenUsersInDBWhenFindUserByStatusAndNameWithQueryAnnotationNamedParamsCustomNamesThenReturnOneUser() { User user = new User(); user.setName(USER_NAME_ADAM); + user.setEmail(USER_EMAIL); user.setStatus(ACTIVE_STATUS); userRepository.save(user); User user2 = new User(); user2.setName(USER_NAME_PETER); + user2.setEmail(USER_EMAIL2); user2.setStatus(ACTIVE_STATUS); userRepository.save(user2); @@ -177,6 +231,7 @@ public class UserRepositoryIntegrationTest { public void givenUsersInDBWhenFindUserByNameLikeWithQueryAnnotationIndexedParamsThenReturnUser() { User user = new User(); user.setName(USER_NAME_ADAM); + user.setEmail(USER_EMAIL); user.setStatus(ACTIVE_STATUS); userRepository.save(user); @@ -189,6 +244,7 @@ public class UserRepositoryIntegrationTest { public void givenUsersInDBWhenFindUserByNameLikeWithQueryAnnotationNamedParamsThenReturnUser() { User user = new User(); user.setName(USER_NAME_ADAM); + user.setEmail(USER_EMAIL); user.setStatus(ACTIVE_STATUS); userRepository.save(user); @@ -201,6 +257,7 @@ public class UserRepositoryIntegrationTest { public void givenUsersInDBWhenFindUserByNameLikeWithQueryAnnotationNativeThenReturnUser() { User user = new User(); user.setName(USER_NAME_ADAM); + user.setEmail(USER_EMAIL); user.setStatus(ACTIVE_STATUS); userRepository.save(user); @@ -211,9 +268,9 @@ public class UserRepositoryIntegrationTest { @Test public void givenUsersInDBWhenFindAllWithSortByNameThenReturnUsersSorted() { - userRepository.save(new User(USER_NAME_ADAM, ACTIVE_STATUS)); - userRepository.save(new User(USER_NAME_PETER, ACTIVE_STATUS)); - userRepository.save(new User("SAMPLE", INACTIVE_STATUS)); + userRepository.save(new User(USER_NAME_ADAM, USER_EMAIL, ACTIVE_STATUS)); + userRepository.save(new User(USER_NAME_PETER, USER_EMAIL2, ACTIVE_STATUS)); + userRepository.save(new User("SAMPLE", USER_EMAIL3, INACTIVE_STATUS)); List usersSortByName = userRepository.findAll(new Sort(Sort.Direction.ASC, "name")); @@ -224,9 +281,9 @@ public class UserRepositoryIntegrationTest { @Test(expected = PropertyReferenceException.class) public void givenUsersInDBWhenFindAllSortWithFunctionThenThrowException() { - userRepository.save(new User(USER_NAME_ADAM, ACTIVE_STATUS)); - userRepository.save(new User(USER_NAME_PETER, ACTIVE_STATUS)); - userRepository.save(new User("SAMPLE", INACTIVE_STATUS)); + userRepository.save(new User(USER_NAME_ADAM, USER_EMAIL, ACTIVE_STATUS)); + userRepository.save(new User(USER_NAME_PETER, USER_EMAIL2, ACTIVE_STATUS)); + userRepository.save(new User("SAMPLE", USER_EMAIL3, INACTIVE_STATUS)); userRepository.findAll(new Sort(Sort.Direction.ASC, "name")); @@ -239,9 +296,9 @@ public class UserRepositoryIntegrationTest { @Test public void givenUsersInDBWhenFindAllSortWithFunctionQueryAnnotationJPQLThenReturnUsersSorted() { - userRepository.save(new User(USER_NAME_ADAM, ACTIVE_STATUS)); - userRepository.save(new User(USER_NAME_PETER, ACTIVE_STATUS)); - userRepository.save(new User("SAMPLE", INACTIVE_STATUS)); + userRepository.save(new User(USER_NAME_ADAM, USER_EMAIL, ACTIVE_STATUS)); + userRepository.save(new User(USER_NAME_PETER, USER_EMAIL2, ACTIVE_STATUS)); + userRepository.save(new User("SAMPLE", USER_EMAIL3, INACTIVE_STATUS)); userRepository.findAllUsers(new Sort("name")); @@ -254,12 +311,12 @@ public class UserRepositoryIntegrationTest { @Test public void givenUsersInDBWhenFindAllWithPageRequestQueryAnnotationJPQLThenReturnPageOfUsers() { - userRepository.save(new User(USER_NAME_ADAM, ACTIVE_STATUS)); - userRepository.save(new User(USER_NAME_PETER, ACTIVE_STATUS)); - userRepository.save(new User("SAMPLE", INACTIVE_STATUS)); - userRepository.save(new User("SAMPLE1", INACTIVE_STATUS)); - userRepository.save(new User("SAMPLE2", INACTIVE_STATUS)); - userRepository.save(new User("SAMPLE3", INACTIVE_STATUS)); + userRepository.save(new User(USER_NAME_ADAM, USER_EMAIL, ACTIVE_STATUS)); + userRepository.save(new User(USER_NAME_PETER, USER_EMAIL2, ACTIVE_STATUS)); + userRepository.save(new User("SAMPLE", USER_EMAIL3, INACTIVE_STATUS)); + userRepository.save(new User("SAMPLE1", USER_EMAIL4, INACTIVE_STATUS)); + userRepository.save(new User("SAMPLE2", USER_EMAIL5, INACTIVE_STATUS)); + userRepository.save(new User("SAMPLE3", USER_EMAIL6, INACTIVE_STATUS)); Page usersPage = userRepository.findAllUsersWithPagination(new PageRequest(1, 3)); @@ -271,12 +328,12 @@ public class UserRepositoryIntegrationTest { @Test public void givenUsersInDBWhenFindAllWithPageRequestQueryAnnotationNativeThenReturnPageOfUsers() { - userRepository.save(new User(USER_NAME_ADAM, ACTIVE_STATUS)); - userRepository.save(new User(USER_NAME_PETER, ACTIVE_STATUS)); - userRepository.save(new User("SAMPLE", INACTIVE_STATUS)); - userRepository.save(new User("SAMPLE1", INACTIVE_STATUS)); - userRepository.save(new User("SAMPLE2", INACTIVE_STATUS)); - userRepository.save(new User("SAMPLE3", INACTIVE_STATUS)); + userRepository.save(new User(USER_NAME_ADAM, USER_EMAIL, ACTIVE_STATUS)); + userRepository.save(new User(USER_NAME_PETER, USER_EMAIL2, ACTIVE_STATUS)); + userRepository.save(new User("SAMPLE", USER_EMAIL3, INACTIVE_STATUS)); + userRepository.save(new User("SAMPLE1", USER_EMAIL4, INACTIVE_STATUS)); + userRepository.save(new User("SAMPLE2", USER_EMAIL5, INACTIVE_STATUS)); + userRepository.save(new User("SAMPLE3", USER_EMAIL6, INACTIVE_STATUS)); Page usersSortByNameLength = userRepository.findAllUsersWithPaginationNative(new PageRequest(1, 3)); @@ -289,10 +346,10 @@ public class UserRepositoryIntegrationTest { @Test @Transactional public void givenUsersInDBWhenUpdateStatusForNameModifyingQueryAnnotationJPQLThenModifyMatchingUsers() { - userRepository.save(new User("SAMPLE", ACTIVE_STATUS)); - userRepository.save(new User("SAMPLE1", ACTIVE_STATUS)); - userRepository.save(new User("SAMPLE", ACTIVE_STATUS)); - userRepository.save(new User("SAMPLE3", ACTIVE_STATUS)); + userRepository.save(new User("SAMPLE", USER_EMAIL, ACTIVE_STATUS)); + userRepository.save(new User("SAMPLE1", USER_EMAIL2, ACTIVE_STATUS)); + userRepository.save(new User("SAMPLE", USER_EMAIL3, ACTIVE_STATUS)); + userRepository.save(new User("SAMPLE3", USER_EMAIL4, ACTIVE_STATUS)); int updatedUsersSize = userRepository.updateUserSetStatusForName(INACTIVE_STATUS, "SAMPLE"); @@ -302,10 +359,10 @@ public class UserRepositoryIntegrationTest { @Test @Transactional public void givenUsersInDBWhenUpdateStatusForNameModifyingQueryAnnotationNativeThenModifyMatchingUsers() { - userRepository.save(new User("SAMPLE", ACTIVE_STATUS)); - userRepository.save(new User("SAMPLE1", ACTIVE_STATUS)); - userRepository.save(new User("SAMPLE", ACTIVE_STATUS)); - userRepository.save(new User("SAMPLE3", ACTIVE_STATUS)); + userRepository.save(new User("SAMPLE", USER_EMAIL, ACTIVE_STATUS)); + userRepository.save(new User("SAMPLE1", USER_EMAIL2, ACTIVE_STATUS)); + userRepository.save(new User("SAMPLE", USER_EMAIL3, ACTIVE_STATUS)); + userRepository.save(new User("SAMPLE3", USER_EMAIL4, ACTIVE_STATUS)); userRepository.flush(); int updatedUsersSize = userRepository.updateUserSetStatusForNameNative(INACTIVE_STATUS, "SAMPLE"); diff --git a/spring-data-jpa/src/test/java/org/baeldung/persistence/service/AbstractServicePersistenceIntegrationTest.java b/spring-data-jpa/src/test/java/com/baeldung/services/AbstractServicePersistenceIntegrationTest.java similarity index 97% rename from spring-data-jpa/src/test/java/org/baeldung/persistence/service/AbstractServicePersistenceIntegrationTest.java rename to spring-data-jpa/src/test/java/com/baeldung/services/AbstractServicePersistenceIntegrationTest.java index 0fdb3a19e1..acac66f2f7 100644 --- a/spring-data-jpa/src/test/java/org/baeldung/persistence/service/AbstractServicePersistenceIntegrationTest.java +++ b/spring-data-jpa/src/test/java/com/baeldung/services/AbstractServicePersistenceIntegrationTest.java @@ -1,8 +1,7 @@ -package org.baeldung.persistence.service; +package com.baeldung.services; -import org.baeldung.persistence.IOperations; -import org.baeldung.persistence.model.Foo; -import org.baeldung.util.IDUtil; +import com.baeldung.domain.Foo; +import com.baeldung.util.IDUtil; import org.hamcrest.Matchers; import org.junit.Ignore; import org.junit.Test; diff --git a/spring-data-jpa/src/test/java/org/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java b/spring-data-jpa/src/test/java/com/baeldung/services/FooServicePersistenceIntegrationTest.java similarity index 84% rename from spring-data-jpa/src/test/java/org/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java rename to spring-data-jpa/src/test/java/com/baeldung/services/FooServicePersistenceIntegrationTest.java index 6385bc5509..fd17d033e1 100644 --- a/spring-data-jpa/src/test/java/org/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java +++ b/spring-data-jpa/src/test/java/com/baeldung/services/FooServicePersistenceIntegrationTest.java @@ -1,8 +1,7 @@ -package org.baeldung.persistence.service; +package com.baeldung.services; -import org.baeldung.persistence.IOperations; -import org.baeldung.persistence.model.Foo; -import org.baeldung.spring.PersistenceConfig; +import com.baeldung.config.PersistenceConfiguration; +import com.baeldung.domain.Foo; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -10,14 +9,14 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; import static org.junit.Assert.assertNotNull; -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class) +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = {PersistenceConfiguration.class}, loader = AnnotationConfigContextLoader.class) public class FooServicePersistenceIntegrationTest extends AbstractServicePersistenceIntegrationTest { @Autowired diff --git a/spring-data-jpa/src/test/java/org/baeldung/persistence/service/JpaMultipleDBIntegrationTest.java b/spring-data-jpa/src/test/java/com/baeldung/services/JpaMultipleDBIntegrationTest.java similarity index 81% rename from spring-data-jpa/src/test/java/org/baeldung/persistence/service/JpaMultipleDBIntegrationTest.java rename to spring-data-jpa/src/test/java/com/baeldung/services/JpaMultipleDBIntegrationTest.java index 64b082b14d..29b96ae597 100644 --- a/spring-data-jpa/src/test/java/org/baeldung/persistence/service/JpaMultipleDBIntegrationTest.java +++ b/spring-data-jpa/src/test/java/com/baeldung/services/JpaMultipleDBIntegrationTest.java @@ -1,13 +1,13 @@ -package org.baeldung.persistence.service; +package com.baeldung.services; -import org.baeldung.config.ProductConfig; -import org.baeldung.config.UserConfig; -import org.baeldung.persistence.multiple.dao.product.ProductRepository; -import org.baeldung.persistence.multiple.dao.user.PossessionRepository; -import org.baeldung.persistence.multiple.dao.user.UserRepository; -import org.baeldung.persistence.multiple.model.product.Product; -import org.baeldung.persistence.multiple.model.user.Possession; -import org.baeldung.persistence.multiple.model.user.User; +import com.baeldung.config.PersistenceProductConfiguration; +import com.baeldung.config.PersistenceUserConfiguration; +import com.baeldung.dao.repositories.user.PossessionRepository; +import com.baeldung.dao.repositories.product.ProductRepository; +import com.baeldung.dao.repositories.user.UserRepository; +import com.baeldung.domain.user.Possession; +import com.baeldung.domain.product.Product; +import com.baeldung.domain.user.User; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -15,6 +15,7 @@ import org.springframework.dao.DataIntegrityViolationException; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.Transactional; @@ -23,8 +24,8 @@ import java.util.Optional; import static org.junit.Assert.*; -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { UserConfig.class, ProductConfig.class }) +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = {PersistenceUserConfiguration.class, PersistenceProductConfiguration.class}) @EnableTransactionManagement @DirtiesContext public class JpaMultipleDBIntegrationTest { diff --git a/spring-data-jpa/src/test/java/com/baeldung/persistence/audit/SpringDataJPABarAuditIntegrationTest.java b/spring-data-jpa/src/test/java/com/baeldung/services/SpringDataJPABarAuditIntegrationTest.java similarity index 86% rename from spring-data-jpa/src/test/java/com/baeldung/persistence/audit/SpringDataJPABarAuditIntegrationTest.java rename to spring-data-jpa/src/test/java/com/baeldung/services/SpringDataJPABarAuditIntegrationTest.java index 4105773e3b..3c36f43192 100644 --- a/spring-data-jpa/src/test/java/com/baeldung/persistence/audit/SpringDataJPABarAuditIntegrationTest.java +++ b/spring-data-jpa/src/test/java/com/baeldung/services/SpringDataJPABarAuditIntegrationTest.java @@ -1,8 +1,7 @@ -package com.baeldung.persistence.audit; +package com.baeldung.services; -import com.baeldung.persistence.model.Bar; -import com.baeldung.persistence.service.IBarService; -import com.baeldung.spring.config.PersistenceTestConfig; +import com.baeldung.config.PersistenceConfiguration; +import com.baeldung.domain.Bar; import org.junit.*; import org.junit.runner.RunWith; import org.slf4j.Logger; @@ -12,6 +11,7 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; import javax.persistence.EntityManager; @@ -20,8 +20,8 @@ import javax.persistence.EntityManagerFactory; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { PersistenceTestConfig.class }, loader = AnnotationConfigContextLoader.class) +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = { PersistenceConfiguration.class }, loader = AnnotationConfigContextLoader.class) public class SpringDataJPABarAuditIntegrationTest { private static Logger logger = LoggerFactory.getLogger(SpringDataJPABarAuditIntegrationTest.class); diff --git a/spring-data-jpa/src/test/java/com/baeldung/spring/config/PersistenceTestConfig.java b/spring-data-jpa/src/test/java/com/baeldung/spring/config/PersistenceTestConfig.java deleted file mode 100644 index 4e3ecd67f5..0000000000 --- a/spring-data-jpa/src/test/java/com/baeldung/spring/config/PersistenceTestConfig.java +++ /dev/null @@ -1,169 +0,0 @@ -package com.baeldung.spring.config; - -import com.baeldung.persistence.dao.IBarAuditableDao; -import com.baeldung.persistence.dao.IBarDao; -import com.baeldung.persistence.dao.IFooAuditableDao; -import com.baeldung.persistence.dao.IFooDao; -import com.baeldung.persistence.dao.impl.*; -import com.baeldung.persistence.service.IBarAuditableService; -import com.baeldung.persistence.service.IBarService; -import com.baeldung.persistence.service.IFooAuditableService; -import com.baeldung.persistence.service.IFooService; -import com.baeldung.persistence.service.impl.*; -import com.google.common.base.Preconditions; -import org.apache.tomcat.dbcp.dbcp2.BasicDataSource; -import org.springframework.beans.factory.annotation.Autowired; -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; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.orm.hibernate4.HibernateTransactionManager; -import org.springframework.orm.hibernate4.LocalSessionFactoryBean; -import org.springframework.orm.jpa.JpaTransactionManager; -import org.springframework.orm.jpa.JpaVendorAdapter; -import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; -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; - -@Configuration -@EnableTransactionManagement -@EnableJpaRepositories(basePackages = { "com.baeldung.persistence" }, transactionManagerRef = "jpaTransactionManager") -@EnableJpaAuditing -@PropertySource({ "classpath:persistence-h2.properties" }) -@ComponentScan({ "com.baeldung.persistence" }) -public class PersistenceTestConfig { - - @Autowired - private Environment env; - - public PersistenceTestConfig() { - super(); - } - - @Bean - public LocalSessionFactoryBean sessionFactory() { - final LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); - sessionFactory.setDataSource(restDataSource()); - sessionFactory.setPackagesToScan(new String[] { "com.baeldung.persistence.model" }); - sessionFactory.setHibernateProperties(hibernateProperties()); - - return sessionFactory; - } - - @Bean - public LocalContainerEntityManagerFactoryBean entityManagerFactory() { - final LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean(); - emf.setDataSource(restDataSource()); - emf.setPackagesToScan(new String[] { "com.baeldung.persistence.model" }); - - final JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); - emf.setJpaVendorAdapter(vendorAdapter); - emf.setJpaProperties(hibernateProperties()); - - return emf; - } - - @Bean - public DataSource restDataSource() { - final BasicDataSource dataSource = new BasicDataSource(); - dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName"))); - dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url"))); - dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("jdbc.user"))); - dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("jdbc.pass"))); - - return dataSource; - } - - @Bean - public PlatformTransactionManager hibernateTransactionManager() { - final HibernateTransactionManager transactionManager = new HibernateTransactionManager(); - transactionManager.setSessionFactory(sessionFactory().getObject()); - return transactionManager; - } - - @Bean - public PlatformTransactionManager jpaTransactionManager() { - final JpaTransactionManager transactionManager = new JpaTransactionManager(); - transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); - return transactionManager; - } - - @Bean - public PersistenceExceptionTranslationPostProcessor exceptionTranslation() { - return new PersistenceExceptionTranslationPostProcessor(); - } - - @Bean - public IBarService barJpaService() { - return new BarJpaService(); - } - - @Bean - public IBarService barSpringDataJpaService() { - return new BarSpringDataJpaService(); - } - - @Bean - public IFooService fooHibernateService() { - return new FooService(); - } - - @Bean - public IBarAuditableService barHibernateAuditableService() { - return new BarAuditableService(); - } - - @Bean - public IFooAuditableService fooHibernateAuditableService() { - return new FooAuditableService(); - } - - @Bean - public IBarDao barJpaDao() { - return new BarJpaDao(); - } - - @Bean - public IBarDao barHibernateDao() { - return new BarDao(); - } - - @Bean - public IBarAuditableDao barHibernateAuditableDao() { - return new BarAuditableDao(); - } - - @Bean - public IFooDao fooHibernateDao() { - return new FooDao(); - } - - @Bean - public IFooAuditableDao fooHibernateAuditableDao() { - return new FooAuditableDao(); - } - - private final Properties hibernateProperties() { - final Properties hibernateProperties = new Properties(); - hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); - hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect")); - - hibernateProperties.setProperty("hibernate.show_sql", "true"); - // hibernateProperties.setProperty("hibernate.format_sql", "true"); - // hibernateProperties.setProperty("hibernate.globally_quoted_identifiers", "true"); - - // Envers properties - hibernateProperties.setProperty("org.hibernate.envers.audit_table_suffix", env.getProperty("envers.audit_table_suffix")); - - return hibernateProperties; - } - -} \ No newline at end of file diff --git a/spring-data-jpa/src/test/java/org/baeldung/util/IDUtil.java b/spring-data-jpa/src/test/java/com/baeldung/util/IDUtil.java similarity index 96% rename from spring-data-jpa/src/test/java/org/baeldung/util/IDUtil.java rename to spring-data-jpa/src/test/java/com/baeldung/util/IDUtil.java index 85ab623e5f..45e72e046d 100644 --- a/spring-data-jpa/src/test/java/org/baeldung/util/IDUtil.java +++ b/spring-data-jpa/src/test/java/com/baeldung/util/IDUtil.java @@ -1,4 +1,4 @@ -package org.baeldung.util; +package com.baeldung.util; import java.util.Random; diff --git a/spring-data-jpa/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java b/spring-data-jpa/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java deleted file mode 100644 index 4a7a59e799..0000000000 --- a/spring-data-jpa/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.baeldung.repository; - -import org.baeldung.config.H2JpaConfig; -import org.baeldung.persistence.model.User; -import org.junit.After; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.transaction.annotation.Transactional; - -import java.util.stream.Stream; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Created by adam. - */ -@RunWith(SpringRunner.class) -@SpringBootTest(classes = H2JpaConfig.class) -public class UserRepositoryIntegrationTest { - - private final String USER_NAME_ADAM = "Adam"; - - @Autowired - private UserRepository userRepository; - - @Test - @Transactional - public void givenUsersWithSameNameInDBWhenFindAllByNameThenReturnStreamOfUsers() { - User user1 = new User(); - user1.setName(USER_NAME_ADAM); - userRepository.save(user1); - - User user2 = new User(); - user2.setName(USER_NAME_ADAM); - userRepository.save(user2); - - User user3 = new User(); - user3.setName(USER_NAME_ADAM); - userRepository.save(user3); - - User user4 = new User(); - user4.setName("SAMPLE"); - userRepository.save(user4); - - try (Stream foundUsersStream = userRepository.findAllByName(USER_NAME_ADAM)) { - assertThat(foundUsersStream.count()).isEqualTo(3l); - } - } - - @After - public void cleanUp() { - userRepository.deleteAll(); - } - -} From 66cd8b6c0bf3382777946e625555f5863663475a Mon Sep 17 00:00:00 2001 From: dupirefr Date: Sun, 2 Sep 2018 09:21:53 +0200 Subject: [PATCH 089/128] [BAEL-2048] Reverting pom.xml wrong modifications --- core-java-11/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java-11/pom.xml b/core-java-11/pom.xml index bfcb7bd81a..4dcab49867 100644 --- a/core-java-11/pom.xml +++ b/core-java-11/pom.xml @@ -21,8 +21,8 @@ maven-compiler-plugin ${maven-compiler-plugin.version} - 10 - 10 + ${maven.compiler.source.version} + ${maven.compiler.target.version} From 212e6fe8205be2ffcc309b70e7db2a3f0817ac6e Mon Sep 17 00:00:00 2001 From: chrisoberle Date: Sun, 2 Sep 2018 05:14:16 -0400 Subject: [PATCH 090/128] BAEL-1969 spring security for spring boot integration tests (#5074) * BAEL-1969 spring security for spring boot integration tests * BAEL-1969 spring security for spring boot integration tests --- .../MethodSecurityConfigurer.java | 13 +++++ .../SecuredApplication.java | 13 +++++ .../integrationtesting/SecuredController.java | 21 ++++++++ .../integrationtesting/SecuredService.java | 13 +++++ .../WebSecurityConfigurer.java | 31 +++++++++++ ...ControllerRestTemplateIntegrationTest.java | 34 ++++++++++++ ...edControllerSpringBootIntegrationTest.java | 52 +++++++++++++++++++ ...ecuredControllerWebMvcIntegrationTest.java | 39 ++++++++++++++ ...ecuredMethodSpringBootIntegrationTest.java | 32 ++++++++++++ 9 files changed, 248 insertions(+) create mode 100644 spring-boot-security/src/main/java/com/baeldung/integrationtesting/MethodSecurityConfigurer.java create mode 100644 spring-boot-security/src/main/java/com/baeldung/integrationtesting/SecuredApplication.java create mode 100644 spring-boot-security/src/main/java/com/baeldung/integrationtesting/SecuredController.java create mode 100644 spring-boot-security/src/main/java/com/baeldung/integrationtesting/SecuredService.java create mode 100644 spring-boot-security/src/main/java/com/baeldung/integrationtesting/WebSecurityConfigurer.java create mode 100644 spring-boot-security/src/test/java/com/baeldung/integrationtesting/SecuredControllerRestTemplateIntegrationTest.java create mode 100644 spring-boot-security/src/test/java/com/baeldung/integrationtesting/SecuredControllerSpringBootIntegrationTest.java create mode 100644 spring-boot-security/src/test/java/com/baeldung/integrationtesting/SecuredControllerWebMvcIntegrationTest.java create mode 100644 spring-boot-security/src/test/java/com/baeldung/integrationtesting/SecuredMethodSpringBootIntegrationTest.java diff --git a/spring-boot-security/src/main/java/com/baeldung/integrationtesting/MethodSecurityConfigurer.java b/spring-boot-security/src/main/java/com/baeldung/integrationtesting/MethodSecurityConfigurer.java new file mode 100644 index 0000000000..dccbace106 --- /dev/null +++ b/spring-boot-security/src/main/java/com/baeldung/integrationtesting/MethodSecurityConfigurer.java @@ -0,0 +1,13 @@ +package com.baeldung.integrationtesting; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration; + +@Configuration +@EnableGlobalMethodSecurity( + prePostEnabled = true, + securedEnabled = true) +public class MethodSecurityConfigurer extends GlobalMethodSecurityConfiguration { + +} diff --git a/spring-boot-security/src/main/java/com/baeldung/integrationtesting/SecuredApplication.java b/spring-boot-security/src/main/java/com/baeldung/integrationtesting/SecuredApplication.java new file mode 100644 index 0000000000..18469e4752 --- /dev/null +++ b/spring-boot-security/src/main/java/com/baeldung/integrationtesting/SecuredApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.integrationtesting; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SecuredApplication { + + public static void main(String[] args) { + SpringApplication.run(SecuredApplication.class, args); + } + +} diff --git a/spring-boot-security/src/main/java/com/baeldung/integrationtesting/SecuredController.java b/spring-boot-security/src/main/java/com/baeldung/integrationtesting/SecuredController.java new file mode 100644 index 0000000000..495c358784 --- /dev/null +++ b/spring-boot-security/src/main/java/com/baeldung/integrationtesting/SecuredController.java @@ -0,0 +1,21 @@ +package com.baeldung.integrationtesting; + +import java.util.Arrays; +import java.util.List; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class SecuredController { + + @GetMapping("/public/hello") + public List publicHello() { + return Arrays.asList("Hello", "World", "from", "Public"); + } + + @GetMapping("/private/hello") + public List privateHello() { + return Arrays.asList("Hello", "World", "from", "Private"); + } + +} diff --git a/spring-boot-security/src/main/java/com/baeldung/integrationtesting/SecuredService.java b/spring-boot-security/src/main/java/com/baeldung/integrationtesting/SecuredService.java new file mode 100644 index 0000000000..25253f163a --- /dev/null +++ b/spring-boot-security/src/main/java/com/baeldung/integrationtesting/SecuredService.java @@ -0,0 +1,13 @@ +package com.baeldung.integrationtesting; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Service; + +@Service +public class SecuredService { + + @PreAuthorize("authenticated") + public String sayHelloSecured() { + return "Hello user."; + } +} diff --git a/spring-boot-security/src/main/java/com/baeldung/integrationtesting/WebSecurityConfigurer.java b/spring-boot-security/src/main/java/com/baeldung/integrationtesting/WebSecurityConfigurer.java new file mode 100644 index 0000000000..32a48ce612 --- /dev/null +++ b/spring-boot-security/src/main/java/com/baeldung/integrationtesting/WebSecurityConfigurer.java @@ -0,0 +1,31 @@ +package com.baeldung.integrationtesting; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +@Configuration +public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.inMemoryAuthentication() + .withUser("spring") + .password("secret") + .roles("USER"); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.authorizeRequests() + .antMatchers("/private/**") + .hasRole("USER") + .antMatchers("/public/**") + .permitAll() + .and() + .httpBasic(); + } + + +} diff --git a/spring-boot-security/src/test/java/com/baeldung/integrationtesting/SecuredControllerRestTemplateIntegrationTest.java b/spring-boot-security/src/test/java/com/baeldung/integrationtesting/SecuredControllerRestTemplateIntegrationTest.java new file mode 100644 index 0000000000..c224058155 --- /dev/null +++ b/spring-boot-security/src/test/java/com/baeldung/integrationtesting/SecuredControllerRestTemplateIntegrationTest.java @@ -0,0 +1,34 @@ +package com.baeldung.integrationtesting; + +import static org.junit.Assert.assertEquals; +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.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +public class SecuredControllerRestTemplateIntegrationTest { + + @Autowired + private TestRestTemplate template; + + @Test + public void givenRequestOnPrivateService_shouldFailWith401() throws Exception { + ResponseEntity result = template.getForEntity("/private/hello", String.class); + assertEquals(HttpStatus.UNAUTHORIZED, result.getStatusCode()); + } + + @Test + public void givenAuthRequestOnPrivateService_shouldSucceedWith200() throws Exception { + ResponseEntity result = template.withBasicAuth("spring", "secret") + .getForEntity("/private/hello", String.class); + assertEquals(HttpStatus.OK, result.getStatusCode()); + } + +} diff --git a/spring-boot-security/src/test/java/com/baeldung/integrationtesting/SecuredControllerSpringBootIntegrationTest.java b/spring-boot-security/src/test/java/com/baeldung/integrationtesting/SecuredControllerSpringBootIntegrationTest.java new file mode 100644 index 0000000000..ce9e6de917 --- /dev/null +++ b/spring-boot-security/src/test/java/com/baeldung/integrationtesting/SecuredControllerSpringBootIntegrationTest.java @@ -0,0 +1,52 @@ +package com.baeldung.integrationtesting; + +import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.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.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +public class SecuredControllerSpringBootIntegrationTest { + + @Autowired + private WebApplicationContext context; + + private MockMvc mvc; + + @Before + public void setup() { + mvc = MockMvcBuilders + .webAppContextSetup(context) + .apply(springSecurity()) + .build(); + } + + @Test + public void givenRequestOnPrivateService_shouldFailWith401() throws Exception { + mvc.perform(get("/private/hello") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isUnauthorized()); + } + + @WithMockUser("spring") + @Test + public void givenAuthRequestOnPrivateService_shouldSucceedWith200() throws Exception { + mvc.perform(get("/private/hello") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + } + +} diff --git a/spring-boot-security/src/test/java/com/baeldung/integrationtesting/SecuredControllerWebMvcIntegrationTest.java b/spring-boot-security/src/test/java/com/baeldung/integrationtesting/SecuredControllerWebMvcIntegrationTest.java new file mode 100644 index 0000000000..7281648856 --- /dev/null +++ b/spring-boot-security/src/test/java/com/baeldung/integrationtesting/SecuredControllerWebMvcIntegrationTest.java @@ -0,0 +1,39 @@ +package com.baeldung.integrationtesting; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; + +import com.baeldung.integrationtesting.SecuredController; + +@RunWith(SpringRunner.class) +@WebMvcTest(SecuredController.class) +public class SecuredControllerWebMvcIntegrationTest { + + @Autowired + private MockMvc mvc; + + @Test + public void givenRequestOnPrivateService_shouldFailWith401() throws Exception { + mvc.perform(get("/private/hello") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isUnauthorized()); + } + + @WithMockUser(value = "spring") + @Test + public void givenAuthRequestOnPrivateService_shouldSucceedWith200() throws Exception { + mvc.perform(get("/private/hello") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + } + +} diff --git a/spring-boot-security/src/test/java/com/baeldung/integrationtesting/SecuredMethodSpringBootIntegrationTest.java b/spring-boot-security/src/test/java/com/baeldung/integrationtesting/SecuredMethodSpringBootIntegrationTest.java new file mode 100644 index 0000000000..816b05bd5a --- /dev/null +++ b/spring-boot-security/src/test/java/com/baeldung/integrationtesting/SecuredMethodSpringBootIntegrationTest.java @@ -0,0 +1,32 @@ +package com.baeldung.integrationtesting; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.integrationtesting.SecuredService; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class SecuredMethodSpringBootIntegrationTest { + + @Autowired + private SecuredService service; + + @Test(expected = AuthenticationCredentialsNotFoundException.class) + public void givenUnauthenticated_whenCallService_thenThrowsException() { + service.sayHelloSecured(); + } + + @WithMockUser(username="spring") + @Test + public void givenAuthenticated_whenCallServiceWithSecured_thenOk() { + assertThat(service.sayHelloSecured()).isNotBlank(); + } +} From c0b78ee35e5ad9351252eb023173008aedce31dd Mon Sep 17 00:00:00 2001 From: smokeyrobot Date: Sun, 2 Sep 2018 05:32:52 -0400 Subject: [PATCH 091/128] Bael-801 A Guide to OptaPlanner Pull Request (#4986) * BAEL-801 A Guide to OptaPlanner * BAEL-801 Optaplanner per Editor Review * BAEL-801 Fixed parent pom merge issue * BAEL-801 Fixed parent pom merge issue * BAEL-801 Added logback to suppress debug logging causing build failures * BAEL-801 Updated per editor review * BAEL-801 Removed static variables --- optaplanner/pom.xml | 27 ++++++++ .../baeldung/optaplanner/CourseSchedule.java | 63 +++++++++++++++++++ .../com/baeldung/optaplanner/Lecture.java | 30 +++++++++ .../baeldung/optaplanner/ScoreCalculator.java | 32 ++++++++++ .../src/main/resources/courseSchedule.drl | 14 +++++ .../courseScheduleSolverConfigDrools.xml | 12 ++++ .../courseScheduleSolverConfiguration.xml | 12 ++++ optaplanner/src/main/resources/logback.xml | 3 + .../optaplanner/test/OptaPlannerUnitTest.java | 50 +++++++++++++++ pom.xml | 3 +- 10 files changed, 245 insertions(+), 1 deletion(-) create mode 100644 optaplanner/pom.xml create mode 100644 optaplanner/src/main/java/com/baeldung/optaplanner/CourseSchedule.java create mode 100644 optaplanner/src/main/java/com/baeldung/optaplanner/Lecture.java create mode 100644 optaplanner/src/main/java/com/baeldung/optaplanner/ScoreCalculator.java create mode 100644 optaplanner/src/main/resources/courseSchedule.drl create mode 100644 optaplanner/src/main/resources/courseScheduleSolverConfigDrools.xml create mode 100644 optaplanner/src/main/resources/courseScheduleSolverConfiguration.xml create mode 100644 optaplanner/src/main/resources/logback.xml create mode 100644 optaplanner/src/test/java/com/baeldung/optaplanner/test/OptaPlannerUnitTest.java diff --git a/optaplanner/pom.xml b/optaplanner/pom.xml new file mode 100644 index 0000000000..22abbedc8c --- /dev/null +++ b/optaplanner/pom.xml @@ -0,0 +1,27 @@ + + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + 4.0.0 + + optaplanner + + + + org.optaplanner + optaplanner-core + 7.9.0.Final + + + + + + + + + \ No newline at end of file diff --git a/optaplanner/src/main/java/com/baeldung/optaplanner/CourseSchedule.java b/optaplanner/src/main/java/com/baeldung/optaplanner/CourseSchedule.java new file mode 100644 index 0000000000..8a820ab56e --- /dev/null +++ b/optaplanner/src/main/java/com/baeldung/optaplanner/CourseSchedule.java @@ -0,0 +1,63 @@ +package com.baeldung.optaplanner; + +import org.optaplanner.core.api.domain.solution.PlanningEntityCollectionProperty; +import org.optaplanner.core.api.domain.solution.PlanningScore; +import org.optaplanner.core.api.domain.solution.PlanningSolution; +import org.optaplanner.core.api.domain.solution.drools.ProblemFactCollectionProperty; +import org.optaplanner.core.api.domain.valuerange.ValueRangeProvider; +import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScore; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; + +@PlanningSolution +public class CourseSchedule { + + Logger logger = LoggerFactory.getLogger("CourseSchedule"); + + private List roomList; + private List periodList; + private List lectureList; + private HardSoftScore score; + + public CourseSchedule(){ + roomList = new ArrayList<>(); + periodList = new ArrayList<>(); + lectureList = new ArrayList<>(); + } + + @ValueRangeProvider(id = "availableRooms") + @ProblemFactCollectionProperty + public List getRoomList() { + return roomList; + } + + @ValueRangeProvider(id = "availablePeriods") + @ProblemFactCollectionProperty + public List getPeriodList() { + return periodList; + } + + @PlanningEntityCollectionProperty + public List getLectureList() { + return lectureList; + } + + @PlanningScore + public HardSoftScore getScore() { + return score; + } + + public void setScore(HardSoftScore score) { + this.score = score; + } + + public void printCourseSchedule() { + lectureList.stream() + .map(c -> "Lecture in Room " + c.getRoomNumber().toString() + " during Period " + c.getPeriod().toString()) + .forEach(k -> logger.info(k)); + } + +} diff --git a/optaplanner/src/main/java/com/baeldung/optaplanner/Lecture.java b/optaplanner/src/main/java/com/baeldung/optaplanner/Lecture.java new file mode 100644 index 0000000000..48af4e89d1 --- /dev/null +++ b/optaplanner/src/main/java/com/baeldung/optaplanner/Lecture.java @@ -0,0 +1,30 @@ +package com.baeldung.optaplanner; + +import org.optaplanner.core.api.domain.entity.PlanningEntity; +import org.optaplanner.core.api.domain.variable.PlanningVariable; + +@PlanningEntity +public class Lecture { + + private Integer roomNumber; + private Integer period; + + @PlanningVariable(valueRangeProviderRefs = {"availablePeriods"}) + public Integer getPeriod() { + return period; + } + + @PlanningVariable(valueRangeProviderRefs = {"availableRooms"}) + public Integer getRoomNumber() { + return roomNumber; + } + + public void setPeriod(Integer period) { + this.period = period; + } + + public void setRoomNumber(Integer roomNumber) { + this.roomNumber = roomNumber; + } + +} diff --git a/optaplanner/src/main/java/com/baeldung/optaplanner/ScoreCalculator.java b/optaplanner/src/main/java/com/baeldung/optaplanner/ScoreCalculator.java new file mode 100644 index 0000000000..11e5e4a5be --- /dev/null +++ b/optaplanner/src/main/java/com/baeldung/optaplanner/ScoreCalculator.java @@ -0,0 +1,32 @@ +package com.baeldung.optaplanner; + +import org.optaplanner.core.api.score.Score; +import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScore; +import org.optaplanner.core.impl.score.director.easy.EasyScoreCalculator; + +import java.util.HashSet; + +public class ScoreCalculator implements EasyScoreCalculator { + + @Override + public Score calculateScore(CourseSchedule courseSchedule) { + int hardScore = 0; + int softScore = 0; + + HashSet occupiedRooms = new HashSet<>(); + for (Lecture lecture : courseSchedule.getLectureList()) { + if(lecture.getPeriod() != null && lecture.getRoomNumber() != null) { + String roomInUse = lecture.getPeriod().toString() + ":" + lecture.getRoomNumber().toString(); + if (occupiedRooms.contains(roomInUse)) { + hardScore += -1; + } else { + occupiedRooms.add(roomInUse); + } + } else { + hardScore += -1; + } + } + + return HardSoftScore.valueOf(hardScore, softScore); + } +} diff --git a/optaplanner/src/main/resources/courseSchedule.drl b/optaplanner/src/main/resources/courseSchedule.drl new file mode 100644 index 0000000000..9372a24976 --- /dev/null +++ b/optaplanner/src/main/resources/courseSchedule.drl @@ -0,0 +1,14 @@ +package com.baeldung.optaplanner + +import com.baeldung.optaplanner.Lecture; +import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScoreHolder; + +global HardSoftScoreHolder scoreHolder; + +rule "noNullRoomPeriod" + when + Lecture( roomNumber == null ); + Lecture( period == null ); + then + scoreHolder.addHardConstraintMatch(kcontext, -1); +end \ No newline at end of file diff --git a/optaplanner/src/main/resources/courseScheduleSolverConfigDrools.xml b/optaplanner/src/main/resources/courseScheduleSolverConfigDrools.xml new file mode 100644 index 0000000000..7cf95fdcd3 --- /dev/null +++ b/optaplanner/src/main/resources/courseScheduleSolverConfigDrools.xml @@ -0,0 +1,12 @@ + + + + + + courseSchedule.drl + + + + 10 + + \ No newline at end of file diff --git a/optaplanner/src/main/resources/courseScheduleSolverConfiguration.xml b/optaplanner/src/main/resources/courseScheduleSolverConfiguration.xml new file mode 100644 index 0000000000..0ad2264dcd --- /dev/null +++ b/optaplanner/src/main/resources/courseScheduleSolverConfiguration.xml @@ -0,0 +1,12 @@ + + + + + + com.baeldung.optaplanner.ScoreCalculator + + + + 10 + + \ No newline at end of file diff --git a/optaplanner/src/main/resources/logback.xml b/optaplanner/src/main/resources/logback.xml new file mode 100644 index 0000000000..c109aa19e2 --- /dev/null +++ b/optaplanner/src/main/resources/logback.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/optaplanner/src/test/java/com/baeldung/optaplanner/test/OptaPlannerUnitTest.java b/optaplanner/src/test/java/com/baeldung/optaplanner/test/OptaPlannerUnitTest.java new file mode 100644 index 0000000000..2847a233a5 --- /dev/null +++ b/optaplanner/src/test/java/com/baeldung/optaplanner/test/OptaPlannerUnitTest.java @@ -0,0 +1,50 @@ +package com.baeldung.optaplanner.test; + +import com.baeldung.optaplanner.CourseSchedule; +import com.baeldung.optaplanner.Lecture; +import org.junit.Assert; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.optaplanner.core.api.solver.Solver; +import org.optaplanner.core.api.solver.SolverFactory; +import java.util.Arrays; + +public class OptaPlannerUnitTest { + + static CourseSchedule unsolvedCourseSchedule; + + @BeforeAll + public static void setUp() { + + unsolvedCourseSchedule = new CourseSchedule(); + + for(int i = 0; i < 10; i++){ + unsolvedCourseSchedule.getLectureList().add(new Lecture()); + } + + unsolvedCourseSchedule.getPeriodList().addAll(Arrays.asList(new Integer[] { 1, 2, 3 })); + unsolvedCourseSchedule.getRoomList().addAll(Arrays.asList(new Integer[] { 1, 2 })); + } + + @Test + public void test_whenCustomJavaSolver() { + + SolverFactory solverFactory = SolverFactory.createFromXmlResource("courseScheduleSolverConfiguration.xml"); + Solver solver = solverFactory.buildSolver(); + CourseSchedule solvedCourseSchedule = solver.solve(unsolvedCourseSchedule); + + Assert.assertNotNull(solvedCourseSchedule.getScore()); + Assert.assertEquals(-4, solvedCourseSchedule.getScore().getHardScore()); + } + + @Test + public void test_whenDroolsSolver() { + + SolverFactory solverFactory = SolverFactory.createFromXmlResource("courseScheduleSolverConfigDrools.xml"); + Solver solver = solverFactory.buildSolver(); + CourseSchedule solvedCourseSchedule = solver.solve(unsolvedCourseSchedule); + + Assert.assertNotNull(solvedCourseSchedule.getScore()); + Assert.assertEquals(0, solvedCourseSchedule.getScore().getHardScore()); + } +} diff --git a/pom.xml b/pom.xml index 7bed9c5cc0..583ab8a957 100644 --- a/pom.xml +++ b/pom.xml @@ -592,6 +592,7 @@ spring-webflux-amqp antlr maven-archetype + optaplanner apache-meecrowave spring-reactive-kotlin jnosql @@ -1295,4 +1296,4 @@ 3.8
- + \ No newline at end of file From a32904fc19d47a1f8338512e9fa6d66119616598 Mon Sep 17 00:00:00 2001 From: Predrag Maric Date: Sun, 2 Sep 2018 12:06:04 +0200 Subject: [PATCH 092/128] BAEL-2151 code moved to algorithms module (#5141) --- .../algorithms}/linesintersection/LinesIntersectionService.java | 2 +- .../linesintersection/LinesIntersectionServiceUnitTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename {core-java/src/main/java/com/baeldung => algorithms/src/main/java/com/baeldung/algorithms}/linesintersection/LinesIntersectionService.java (89%) rename {core-java/src/test/java/com/baeldung => algorithms/src/test/java/com/baeldung/algorithms}/linesintersection/LinesIntersectionServiceUnitTest.java (95%) diff --git a/core-java/src/main/java/com/baeldung/linesintersection/LinesIntersectionService.java b/algorithms/src/main/java/com/baeldung/algorithms/linesintersection/LinesIntersectionService.java similarity index 89% rename from core-java/src/main/java/com/baeldung/linesintersection/LinesIntersectionService.java rename to algorithms/src/main/java/com/baeldung/algorithms/linesintersection/LinesIntersectionService.java index a2cce53c8f..35d6c8b424 100644 --- a/core-java/src/main/java/com/baeldung/linesintersection/LinesIntersectionService.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/linesintersection/LinesIntersectionService.java @@ -1,4 +1,4 @@ -package com.baeldung.linesintersection; +package com.baeldung.algorithms.linesintersection; import java.awt.Point; import java.util.Optional; diff --git a/core-java/src/test/java/com/baeldung/linesintersection/LinesIntersectionServiceUnitTest.java b/algorithms/src/test/java/com/baeldung/algorithms/linesintersection/LinesIntersectionServiceUnitTest.java similarity index 95% rename from core-java/src/test/java/com/baeldung/linesintersection/LinesIntersectionServiceUnitTest.java rename to algorithms/src/test/java/com/baeldung/algorithms/linesintersection/LinesIntersectionServiceUnitTest.java index 640115a8a0..22371107f3 100644 --- a/core-java/src/test/java/com/baeldung/linesintersection/LinesIntersectionServiceUnitTest.java +++ b/algorithms/src/test/java/com/baeldung/algorithms/linesintersection/LinesIntersectionServiceUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.linesintersection; +package com.baeldung.algorithms.linesintersection; import java.awt.Point; import java.util.Optional; From 4a91a058ff5400b182a6ed78323cd94339d0e068 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Sun, 2 Sep 2018 12:55:18 +0200 Subject: [PATCH 093/128] [BAEL-2048] Removing moved class from TestSuite --- .../org/baeldung/persistence/service/PersistenceTestSuite.java | 1 - 1 file changed, 1 deletion(-) diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/PersistenceTestSuite.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/PersistenceTestSuite.java index aa2dfb5293..beaa51f5f9 100644 --- a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/PersistenceTestSuite.java +++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/PersistenceTestSuite.java @@ -8,7 +8,6 @@ import org.junit.runners.Suite; FooPaginationPersistenceIntegrationTest.class ,FooServicePersistenceIntegrationTest.class ,FooServiceSortingIntegrationTest.class - ,JpaMultipleDBIntegrationTest.class ,FooServiceSortingWitNullsManualIntegrationTest.class }) // @formatter:on public class PersistenceTestSuite { From 1484597cb12382b096a8c4ab063b95ee8106af48 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sun, 2 Sep 2018 19:18:58 +0300 Subject: [PATCH 094/128] update links --- persistence-modules/README.md | 1 - persistence-modules/spring-jpa/README.md | 5 ----- spring-boot/README.MD | 1 - spring-data-jpa/README.md | 22 ++++++++++++++++++++++ 4 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 spring-data-jpa/README.md diff --git a/persistence-modules/README.md b/persistence-modules/README.md index 8f8c3eb13d..f12163bd6a 100644 --- a/persistence-modules/README.md +++ b/persistence-modules/README.md @@ -7,6 +7,5 @@ - [Introduction to Hibernate Search](http://www.baeldung.com/hibernate-search) - [Bootstrapping Hibernate 5 with Spring](http://www.baeldung.com/hibernate-5-spring) - [Introduction to Lettuce – the Java Redis Client](http://www.baeldung.com/java-redis-lettuce) -- [A Simple Tagging Implementation with JPA](http://www.baeldung.com/jpa-tagging) - [A Guide to Jdbi](http://www.baeldung.com/jdbi) - [Pessimistic Locking in JPA](http://www.baeldung.com/jpa-pessimistic-locking) diff --git a/persistence-modules/spring-jpa/README.md b/persistence-modules/spring-jpa/README.md index 02d4306ecb..1c89f2453d 100644 --- a/persistence-modules/spring-jpa/README.md +++ b/persistence-modules/spring-jpa/README.md @@ -9,20 +9,15 @@ - [The DAO with JPA and Spring](http://www.baeldung.com/spring-dao-jpa) - [JPA Pagination](http://www.baeldung.com/jpa-pagination) - [Sorting with JPA](http://www.baeldung.com/jpa-sort) -- [Spring JPA – Multiple Databases](http://www.baeldung.com/spring-data-jpa-multiple-databases) - [Hibernate Second-Level Cache](http://www.baeldung.com/hibernate-second-level-cache) - [Spring, Hibernate and a JNDI Datasource](http://www.baeldung.com/spring-persistence-jpa-jndi-datasource) - [Deleting Objects with Hibernate](http://www.baeldung.com/delete-with-hibernate) - [Self-Contained Testing Using an In-Memory Database](http://www.baeldung.com/spring-jpa-test-in-memory-database) -- [Spring Data JPA – Adding a Method in All Repositories](http://www.baeldung.com/spring-data-jpa-method-in-all-repositories) - [A Guide to Spring AbstractRoutingDatasource](http://www.baeldung.com/spring-abstract-routing-data-source) -- [Advanced Tagging Implementation with JPA](http://www.baeldung.com/jpa-tagging-advanced) - [A Guide to Hibernate with Spring 4](http://www.baeldung.com/the-persistence-layer-with-spring-and-jpa) - [Testing REST with multiple MIME types](http://www.baeldung.com/testing-rest-api-with-multiple-media-types) - [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) -- [Spring Data JPA @Query](http://www.baeldung.com/spring-data-jpa-query) -- [Spring Data Annotations](http://www.baeldung.com/spring-data-annotations) ### Eclipse Config After importing the project into Eclipse, you may see the following error: diff --git a/spring-boot/README.MD b/spring-boot/README.MD index 5d1170b905..f11ea1b7ed 100644 --- a/spring-boot/README.MD +++ b/spring-boot/README.MD @@ -20,7 +20,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [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) -- [Spring Data Java 8 Support](http://www.baeldung.com/spring-data-java-8) - [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) diff --git a/spring-data-jpa/README.md b/spring-data-jpa/README.md new file mode 100644 index 0000000000..f54764e05c --- /dev/null +++ b/spring-data-jpa/README.md @@ -0,0 +1,22 @@ +========= + +## Spring Data JPA Example Project + +### Relevant Articles: +- [Spring JPA – Multiple Databases](http://www.baeldung.com/spring-data-jpa-multiple-databases) +- [Spring Data JPA – Adding a Method in All Repositories](http://www.baeldung.com/spring-data-jpa-method-in-all-repositories) +- [Advanced Tagging Implementation with JPA](http://www.baeldung.com/jpa-tagging-advanced) +- [Spring Data JPA @Query](http://www.baeldung.com/spring-data-jpa-query) +- [Spring Data Annotations](http://www.baeldung.com/spring-data-annotations) +- [Spring Data Java 8 Support](http://www.baeldung.com/spring-data-java-8) +- [A Simple Tagging Implementation with JPA](http://www.baeldung.com/jpa-tagging) + +### Eclipse Config +After importing the project into Eclipse, you may see the following error: +"No persistence xml file found in project" + +This can be ignored: +- Project -> Properties -> Java Persistance -> JPA -> Error/Warnings -> Select Ignore on "No persistence xml file found in project" +Or: +- Eclipse -> Preferences - Validation - disable the "Build" execution of the JPA Validator + From d05c0ad524a0f73b34306141cc14a5f9fc2cae69 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sun, 2 Sep 2018 19:20:34 +0300 Subject: [PATCH 095/128] add spring-data module --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 583ab8a957..be6029a946 100644 --- a/pom.xml +++ b/pom.xml @@ -749,6 +749,7 @@ spring-data-elasticsearch spring-data-keyvalue spring-data-mongodb + spring-data-jpa persistence-modules/spring-data-neo4j persistence-modules/spring-data-redis spring-data-rest From 550952c9958f1a292deba34051514b1c2a9b63fa Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Sun, 2 Sep 2018 11:39:07 +0530 Subject: [PATCH 096/128] BAEL-8844 Get rid of all warnings in build start due to incorrect pom configurations - Fixed pom configurations to get rid of startup warnings --- apache-cxf/sse-jaxrs/sse-jaxrs-server/pom.xml | 2 +- ejb/ejb-client/pom.xml | 1 - jhipster/jhipster-monolithic/pom.xml | 2 + jnosql/jnosql-artemis/pom.xml | 2 +- jsf/pom.xml | 5 -- libraries/pom.xml | 3 +- msf4j/pom.xml | 22 ++++++--- .../spring-data-eclipselink/pom.xml | 3 -- persistence-modules/spring-data-neo4j/pom.xml | 6 --- spring-5-reactive-client/pom.xml | 7 --- spring-boot-ops/pom.xml | 13 +---- spring-boot-security/pom.xml | 10 ---- spring-jooq/pom.xml | 8 +--- spring-security-mvc-digest-auth/pom.xml | 8 ---- testing-modules/mockito/pom.xml | 48 ++++++++++--------- xml/pom.xml | 22 ++------- 16 files changed, 54 insertions(+), 108 deletions(-) diff --git a/apache-cxf/sse-jaxrs/sse-jaxrs-server/pom.xml b/apache-cxf/sse-jaxrs/sse-jaxrs-server/pom.xml index 46572a2b75..2e82dc3829 100644 --- a/apache-cxf/sse-jaxrs/sse-jaxrs-server/pom.xml +++ b/apache-cxf/sse-jaxrs/sse-jaxrs-server/pom.xml @@ -20,7 +20,7 @@ - ${artifactId} + ${project.artifactId} net.wasdev.wlp.maven.plugins diff --git a/ejb/ejb-client/pom.xml b/ejb/ejb-client/pom.xml index 44112a4396..6231030cec 100755 --- a/ejb/ejb-client/pom.xml +++ b/ejb/ejb-client/pom.xml @@ -16,7 +16,6 @@ org.wildfly wildfly-ejb-client-bom pom - import com.baeldung.ejb diff --git a/jhipster/jhipster-monolithic/pom.xml b/jhipster/jhipster-monolithic/pom.xml index 24956745e4..d82b048798 100644 --- a/jhipster/jhipster-monolithic/pom.xml +++ b/jhipster/jhipster-monolithic/pom.xml @@ -412,6 +412,7 @@ org.apache.maven.plugins maven-eclipse-plugin + ${maven-eclipse-plugin.version} true true @@ -909,6 +910,7 @@ 1.1.0.Final 1.4.1 3.0.1 + 2.10 yyyyMMddHHmmss 3.0.0 3.1.3 diff --git a/jnosql/jnosql-artemis/pom.xml b/jnosql/jnosql-artemis/pom.xml index 6186b3510c..9c2bfd1ba0 100644 --- a/jnosql/jnosql-artemis/pom.xml +++ b/jnosql/jnosql-artemis/pom.xml @@ -19,7 +19,7 @@ - ${artifactId} + ${project.artifactId} net.wasdev.wlp.maven.plugins diff --git a/jsf/pom.xml b/jsf/pom.xml index 19ea4b569f..2ac8a9f7c2 100644 --- a/jsf/pom.xml +++ b/jsf/pom.xml @@ -36,11 +36,6 @@ ${jstl.version} - - org.springframework - spring-web - ${org.springframework.version} - org.springframework spring-webmvc diff --git a/libraries/pom.xml b/libraries/pom.xml index 6b1f842aeb..a82472d707 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -729,7 +729,7 @@ org.apache.commons commons-math3 - ${common-math3-version} + ${common-math3.version} org.knowm.xchart @@ -977,7 +977,6 @@ 2.1.2 2.5.11 0.12.1 - 3.6.1 3.5.2 3.6 2.7.1 diff --git a/msf4j/pom.xml b/msf4j/pom.xml index cca8281764..9a6483772b 100644 --- a/msf4j/pom.xml +++ b/msf4j/pom.xml @@ -6,12 +6,22 @@ msf4j 0.0.1-SNAPSHOT - - org.wso2.msf4j - msf4j-service - 2.6.0 - + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + + + + org.wso2.msf4j + msf4j-service + ${msf4j.version} + pom + + + org.wso2.msf4j @@ -27,7 +37,7 @@ com.baeldung.msf4j.msf4jintro.Application - 2.6.1 + 2.6.3 \ No newline at end of file diff --git a/persistence-modules/spring-data-eclipselink/pom.xml b/persistence-modules/spring-data-eclipselink/pom.xml index 8a55425fc2..618fa83ee5 100644 --- a/persistence-modules/spring-data-eclipselink/pom.xml +++ b/persistence-modules/spring-data-eclipselink/pom.xml @@ -2,9 +2,7 @@ 4.0.0 - com.baeldung spring-data-eclipselink - 1.0.0-SNAPSHOT spring-data-eclipselink @@ -20,7 +18,6 @@ spring-boot-dependencies ${spring.version} pom - import org.springframework.boot diff --git a/persistence-modules/spring-data-neo4j/pom.xml b/persistence-modules/spring-data-neo4j/pom.xml index bd7d783646..2be4df71be 100644 --- a/persistence-modules/spring-data-neo4j/pom.xml +++ b/persistence-modules/spring-data-neo4j/pom.xml @@ -1,7 +1,6 @@ 4.0.0 - com.baeldung spring-data-neo4j 1.0 @@ -74,11 +73,6 @@ ${neo4j-ogm.version} test - - org.neo4j - neo4j-ogm-embedded-driver - ${neo4j-ogm.version} - org.neo4j.test neo4j-harness diff --git a/spring-5-reactive-client/pom.xml b/spring-5-reactive-client/pom.xml index f2f7dd1729..6e39743ed0 100644 --- a/spring-5-reactive-client/pom.xml +++ b/spring-5-reactive-client/pom.xml @@ -3,9 +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 - com.baeldung spring-5-reactive-client - 0.0.1-SNAPSHOT jar spring-5-reactive-client spring 5 sample project about new features @@ -92,11 +90,6 @@ org.projectlombok lombok - - org.apache.commons - commons-lang3 - - diff --git a/spring-boot-ops/pom.xml b/spring-boot-ops/pom.xml index 223fe72bd5..57779c3f8e 100644 --- a/spring-boot-ops/pom.xml +++ b/spring-boot-ops/pom.xml @@ -3,9 +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 - com.baeldung spring-boot-ops - 0.0.1-SNAPSHOT war spring-boot-ops Demo project for Spring Boot @@ -19,10 +17,6 @@ - - org.springframework.boot spring-boot-starter-web @@ -95,13 +89,8 @@ - ${artifactId} + ${project.artifactId} - - org.springframework.boot - spring-boot-maven-plugin - - org.springframework.boot spring-boot-maven-plugin diff --git a/spring-boot-security/pom.xml b/spring-boot-security/pom.xml index 18d292c8a1..6bc013d1ed 100644 --- a/spring-boot-security/pom.xml +++ b/spring-boot-security/pom.xml @@ -2,7 +2,6 @@ 4.0.0 - com.baeldung spring-boot-security 0.0.1-SNAPSHOT jar @@ -28,10 +27,6 @@ - - - - org.springframework.boot spring-boot-starter-security @@ -72,11 +67,6 @@ spring-security-test test - - org.springframework.security - spring-security-test - test - diff --git a/spring-jooq/pom.xml b/spring-jooq/pom.xml index e1c13ef774..744ae34cc8 100644 --- a/spring-jooq/pom.xml +++ b/spring-jooq/pom.xml @@ -2,8 +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-jooq - 0.0.1-SNAPSHOT - + parent-boot-1 com.baeldung @@ -54,11 +53,6 @@ spring-test test - - org.springframework.boot - spring-boot-starter-test - - diff --git a/spring-security-mvc-digest-auth/pom.xml b/spring-security-mvc-digest-auth/pom.xml index 2d3f1a3a00..33b3b5ff31 100644 --- a/spring-security-mvc-digest-auth/pom.xml +++ b/spring-security-mvc-digest-auth/pom.xml @@ -1,8 +1,6 @@ 4.0.0 - - com.baeldung spring-security-mvc-digest-auth 0.1-SNAPSHOT spring-security-mvc-digest-auth @@ -91,12 +89,6 @@ ${spring.version} - - org.springframework - spring-web - ${spring.version} - - diff --git a/testing-modules/mockito/pom.xml b/testing-modules/mockito/pom.xml index fab2fcc795..acdd7eb2ac 100644 --- a/testing-modules/mockito/pom.xml +++ b/testing-modules/mockito/pom.xml @@ -14,6 +14,27 @@
+ + + org.springframework + spring-core + ${spring-framework.version} + + + org.springframework + spring-context + ${spring-framework.version} + + + org.springframework.data + spring-data-jpa + ${spring-data.version} + + + org.eclipse.persistence + javax.persistence + 2.1.1 + @@ -46,35 +67,15 @@ org.springframework.boot spring-boot-starter - LATEST + ${spring-boot.version} test org.springframework.boot spring-boot-starter-test - LATEST + ${spring-boot.version} test - - org.springframework - spring-core - LATEST - - - org.springframework - spring-context - LATEST - - - org.eclipse.persistence - javax.persistence - 2.1.1 - - - org.springframework.data - spring-data-jpa - LATEST - @@ -88,6 +89,9 @@ + 2.0.4.RELEASE + 5.0.8.RELEASE + 2.0.9.RELEASE 19.0 3.5 diff --git a/xml/pom.xml b/xml/pom.xml index dba0308337..39590711e0 100644 --- a/xml/pom.xml +++ b/xml/pom.xml @@ -1,8 +1,6 @@ 4.0.0 - - com.baeldung xml 0.1-SNAPSHOT xml @@ -168,6 +166,10 @@ template-binding.xml + src/main/resources + + *-binding.xml + true @@ -177,21 +179,7 @@ bind - - - - org.jibx - maven-jibx-plugin - 1.3.1 - - src/main/resources - - *-binding.xml - - true - - - + process-test-classes test-bind From be81f87c3cb93108d24e69ac2f76d2660ad637af Mon Sep 17 00:00:00 2001 From: DomWos Date: Mon, 3 Sep 2018 12:08:45 +0200 Subject: [PATCH 097/128] Switched fields to be static to remove initialization in method. --- .../main/java/com/baeldung/flink/FlinkDataPipeline.java | 2 +- .../baeldung/flink/schema/BackupSerializationSchema.java | 6 +++++- .../flink/schema/InputMessageDeserializationSchema.java | 9 +++++---- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/libraries/src/main/java/com/baeldung/flink/FlinkDataPipeline.java b/libraries/src/main/java/com/baeldung/flink/FlinkDataPipeline.java index 423637bf53..d02b1bcb83 100644 --- a/libraries/src/main/java/com/baeldung/flink/FlinkDataPipeline.java +++ b/libraries/src/main/java/com/baeldung/flink/FlinkDataPipeline.java @@ -48,7 +48,7 @@ public static void createBackup () throws Exception { String inputTopic = "flink_input"; String outputTopic = "flink_output"; String consumerGroup = "baeldung"; - String kafkaAddress = "192.168.99.100:9092"; + String kafkaAddress = "localhost:9092"; StreamExecutionEnvironment environment = StreamExecutionEnvironment.getExecutionEnvironment(); diff --git a/libraries/src/main/java/com/baeldung/flink/schema/BackupSerializationSchema.java b/libraries/src/main/java/com/baeldung/flink/schema/BackupSerializationSchema.java index 4db9556d8d..967b266bb6 100644 --- a/libraries/src/main/java/com/baeldung/flink/schema/BackupSerializationSchema.java +++ b/libraries/src/main/java/com/baeldung/flink/schema/BackupSerializationSchema.java @@ -1,6 +1,8 @@ package com.baeldung.flink.schema; import com.baeldung.flink.model.Backup; +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.apache.flink.api.common.serialization.SerializationSchema; @@ -10,12 +12,14 @@ import org.slf4j.LoggerFactory; public class BackupSerializationSchema implements SerializationSchema { - ObjectMapper objectMapper; + static ObjectMapper objectMapper = new ObjectMapper().registerModule(new JavaTimeModule()); + Logger logger = LoggerFactory.getLogger(BackupSerializationSchema.class); @Override public byte[] serialize(Backup backupMessage) { if(objectMapper == null) { + objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); objectMapper = new ObjectMapper().registerModule(new JavaTimeModule()); } try { diff --git a/libraries/src/main/java/com/baeldung/flink/schema/InputMessageDeserializationSchema.java b/libraries/src/main/java/com/baeldung/flink/schema/InputMessageDeserializationSchema.java index 3c81b67ec1..1df456bbe5 100644 --- a/libraries/src/main/java/com/baeldung/flink/schema/InputMessageDeserializationSchema.java +++ b/libraries/src/main/java/com/baeldung/flink/schema/InputMessageDeserializationSchema.java @@ -1,6 +1,8 @@ package com.baeldung.flink.schema; import com.baeldung.flink.model.InputMessage; +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.apache.flink.api.common.serialization.DeserializationSchema; @@ -11,13 +13,12 @@ import java.io.IOException; public class InputMessageDeserializationSchema implements DeserializationSchema { - ObjectMapper objectMapper; + static ObjectMapper objectMapper = new ObjectMapper().registerModule(new JavaTimeModule()); + @Override public InputMessage deserialize(byte[] bytes) throws IOException { - if(objectMapper == null) { - objectMapper = new ObjectMapper().registerModule(new JavaTimeModule()); - } + return objectMapper.readValue(bytes, InputMessage.class); } From ffce600b8dfdf5df7943cc3d2957d1cd232b6273 Mon Sep 17 00:00:00 2001 From: rozagerardo Date: Mon, 3 Sep 2018 12:32:50 -0300 Subject: [PATCH 098/128] [BAEL-2114] spring-5-reactive & spring-5-mvc | Server Sent Events in Spring (#5146) * * added spring 5 reactive examples * * added MVC example * added spring 5 webflux test --- .../baeldung/web/SseEmitterController.java | 29 ++++++- spring-5-reactive/pom.xml | 7 ++ .../consumer/ConsumerSSEApplication.java | 19 +++++ .../consumer/controller/ClientController.java | 83 +++++++++++++++++++ .../server/ServerSSEApplication.java | 17 ++++ .../server/controllers/ServerController.java | 35 ++++++++ .../ServiceSentEventLiveTest.java | 49 +++++++++++ 7 files changed, 238 insertions(+), 1 deletion(-) create mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/serversentevents/consumer/ConsumerSSEApplication.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/serversentevents/consumer/controller/ClientController.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/serversentevents/server/ServerSSEApplication.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/serversentevents/server/controllers/ServerController.java create mode 100644 spring-5-reactive/src/test/java/com/baeldung/reactive/serversentsevents/ServiceSentEventLiveTest.java diff --git a/spring-5-mvc/src/main/java/com/baeldung/web/SseEmitterController.java b/spring-5-mvc/src/main/java/com/baeldung/web/SseEmitterController.java index b11c93fb08..00113c5ff7 100644 --- a/spring-5-mvc/src/main/java/com/baeldung/web/SseEmitterController.java +++ b/spring-5-mvc/src/main/java/com/baeldung/web/SseEmitterController.java @@ -1,12 +1,16 @@ package com.baeldung.web; -import com.baeldung.Constants; +import java.time.LocalTime; import java.util.Date; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; + import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter.SseEventBuilder; + +import com.baeldung.Constants; @Controller public class SseEmitterController { @@ -29,4 +33,27 @@ public class SseEmitterController { return emitter; } + @GetMapping("/stream-sse-mvc") + public SseEmitter streamSseMvc() { + SseEmitter emitter = new SseEmitter(); + ExecutorService sseMvcExecutor = Executors.newSingleThreadExecutor(); + + sseMvcExecutor.execute(() -> { + try { + for (int i = 0; true; i++) { + SseEventBuilder event = SseEmitter.event() + .data("SSE MVC - " + LocalTime.now() + .toString()) + .id(String.valueOf(i)) + .name("sse event - mvc"); + emitter.send(event); + Thread.sleep(1000); + } + } catch (Exception ex) { + emitter.completeWithError(ex); + } + }); + return emitter; + } + } diff --git a/spring-5-reactive/pom.xml b/spring-5-reactive/pom.xml index e81d3d8b79..5f455c3906 100644 --- a/spring-5-reactive/pom.xml +++ b/spring-5-reactive/pom.xml @@ -94,6 +94,12 @@ ${project-reactor-test} test + + org.junit.platform + junit-platform-runner + ${junit.platform.version} + test + @@ -117,6 +123,7 @@ 1.0 4.1 3.1.6.RELEASE + 1.2.0 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 new file mode 100644 index 0000000000..3997607ef0 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/serversentevents/consumer/ConsumerSSEApplication.java @@ -0,0 +1,19 @@ +package com.baeldung.reactive.serversentevents.consumer; + +import java.util.Collections; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableAsync; + +@SpringBootApplication +@EnableAsync +public class ConsumerSSEApplication { + + public static void main(String[] args) { + SpringApplication app = new SpringApplication(ConsumerSSEApplication.class); + app.setDefaultProperties(Collections.singletonMap("server.port", "8082")); + app.run(args); + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/serversentevents/consumer/controller/ClientController.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/serversentevents/consumer/controller/ClientController.java new file mode 100644 index 0000000000..69a6bc396c --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/serversentevents/consumer/controller/ClientController.java @@ -0,0 +1,83 @@ +package com.baeldung.reactive.serversentevents.consumer.controller; + +import java.time.LocalTime; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.MediaType; +import org.springframework.http.codec.ServerSentEvent; +import org.springframework.scheduling.annotation.Async; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.reactive.function.client.WebClient; + +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@RestController +@RequestMapping("/sse-consumer") +public class ClientController { + + private static Logger logger = LoggerFactory.getLogger(ClientController.class); + private WebClient client = WebClient.create("http://localhost:8081/sse-server"); + + @GetMapping("/launch-sse-client") + public String launchSSEFromSSEWebClient() { + consumeSSE(); + return "LAUNCHED EVENT CLIENT!!! Check the logs..."; + } + + @GetMapping("/launch-flux-client") + public String launchcFluxFromSSEWebClient() { + consumeFlux(); + return "LAUNCHED EVENT CLIENT!!! Check the logs..."; + } + + @GetMapping("/launch-sse-from-flux-endpoint-client") + public String launchFluxFromFluxWebClient() { + consumeSSEFromFluxEndpoint(); + return "LAUNCHED EVENT CLIENT!!! Check the logs..."; + } + + @Async + public void consumeSSE() { + ParameterizedTypeReference> type = new ParameterizedTypeReference>() { + }; + + Flux> eventStream = client.get() + .uri("/stream-sse") + .retrieve() + .bodyToFlux(type); + + eventStream.subscribe(content -> logger.info("Current time: {} - Received SSE: name[{}], id [{}], content[{}] ", LocalTime.now(), content.event(), content.id(), content.data()), error -> logger.error("Error receiving SSE: {}", error), + () -> logger.info("Completed!!!")); + } + + @Async + public void consumeFlux() { + Flux stringStream = client.get() + .uri("/stream-flux") + .accept(MediaType.TEXT_EVENT_STREAM) + .retrieve() + .bodyToFlux(String.class); + + stringStream.subscribe(content -> logger.info("Current time: {} - Received content: {} ", LocalTime.now(), content), error -> logger.error("Error retrieving content: {}", error), () -> logger.info("Completed!!!")); + } + + @Async + public void consumeSSEFromFluxEndpoint() { + ParameterizedTypeReference> type = new ParameterizedTypeReference>() { + }; + + Flux> eventStream = client.get() + .uri("/stream-flux") + .accept(MediaType.TEXT_EVENT_STREAM) + .retrieve() + .bodyToFlux(type); + + eventStream.subscribe(content -> logger.info("Current time: {} - Received SSE: name[{}], id [{}], content[{}] ", LocalTime.now(), content.event(), content.id(), content.data()), error -> logger.error("Error receiving SSE: {}", error), + () -> logger.info("Completed!!!")); + } +} 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 new file mode 100644 index 0000000000..2750e6616d --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/serversentevents/server/ServerSSEApplication.java @@ -0,0 +1,17 @@ +package com.baeldung.reactive.serversentevents.server; + +import java.util.Collections; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@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); + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/serversentevents/server/controllers/ServerController.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/serversentevents/server/controllers/ServerController.java new file mode 100644 index 0000000000..1ad8e848cf --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/serversentevents/server/controllers/ServerController.java @@ -0,0 +1,35 @@ +package com.baeldung.reactive.serversentevents.server.controllers; + +import java.time.Duration; +import java.time.LocalTime; + +import org.springframework.http.MediaType; +import org.springframework.http.codec.ServerSentEvent; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import reactor.core.publisher.Flux; + +@RestController +@RequestMapping("/sse-server") +public class ServerController { + + @GetMapping("/stream-sse") + public Flux> streamEvents() { + return Flux.interval(Duration.ofSeconds(1)) + .map(sequence -> ServerSentEvent. builder() + .id(String.valueOf(sequence)) + .event("periodic-event") + .data("SSE - " + LocalTime.now() + .toString()) + .build()); + } + + @GetMapping(path = "/stream-flux", produces = MediaType.TEXT_EVENT_STREAM_VALUE) + public Flux streamFlux() { + return Flux.interval(Duration.ofSeconds(1)) + .map(sequence -> "Flux - " + LocalTime.now() + .toString()); + } +} 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 new file mode 100644 index 0000000000..53f4a3b1bb --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/reactive/serversentsevents/ServiceSentEventLiveTest.java @@ -0,0 +1,49 @@ +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.test.web.reactive.server.WebTestClient; + +@RunWith(JUnitPlatform.class) +@SpringBootTest +public class ServiceSentEventLiveTest { + + private WebTestClient client = WebTestClient.bindToServer() + .baseUrl("http://localhost:8081/sse-server") + .build(); + + @Test + public void whenSSEEndpointIsCalled_thenEventStreamingBegins() { + + Executable sseStreamingCall = () -> client.get() + .uri("/stream-sse") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .contentTypeCompatibleWith(MediaType.TEXT_EVENT_STREAM) + .expectBody(String.class); + + Assertions.assertThrows(IllegalStateException.class, sseStreamingCall, "Expected test to timeout and throw IllegalStateException, but it didn't"); + } + + @Test + public void whenFluxEndpointIsCalled_thenEventStreamingBegins() { + + Executable sseStreamingCall = () -> client.get() + .uri("/stream-flux") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .contentTypeCompatibleWith(MediaType.TEXT_EVENT_STREAM) + .expectBody(String.class); + + Assertions.assertThrows(IllegalStateException.class, sseStreamingCall, "Expected test to timeout and throw IllegalStateException, but it didn't"); + } +} From 3130251d3ab0b5b8b4cea3d0056bd163a5aa0a54 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Mon, 3 Sep 2018 22:19:38 +0530 Subject: [PATCH 099/128] BAEL-8824 Align module names, folder names and artifact id - Fixed pom of projects as per new project artifacts --- osgi/osgi-intro-sample-activator/pom.xml | 2 +- osgi/osgi-intro-sample-client/pom.xml | 2 +- osgi/osgi-intro-sample-service/pom.xml | 2 +- patterns/design-patterns/pom.xml | 3 +-- patterns/front-controller/pom.xml | 2 +- patterns/intercepting-filter/pom.xml | 2 +- patterns/pom.xml | 3 +-- performance-tests/pom.xml | 2 +- spring-ejb/ejb-beans/pom.xml | 2 +- spring-ejb/ejb-remote-for-spring/pom.xml | 2 +- 10 files changed, 10 insertions(+), 12 deletions(-) diff --git a/osgi/osgi-intro-sample-activator/pom.xml b/osgi/osgi-intro-sample-activator/pom.xml index 42008dafdd..77d7198698 100644 --- a/osgi/osgi-intro-sample-activator/pom.xml +++ b/osgi/osgi-intro-sample-activator/pom.xml @@ -8,7 +8,7 @@ - osgi-intro + osgi com.baeldung 1.0-SNAPSHOT diff --git a/osgi/osgi-intro-sample-client/pom.xml b/osgi/osgi-intro-sample-client/pom.xml index f0cf0a357a..7f5faedb30 100644 --- a/osgi/osgi-intro-sample-client/pom.xml +++ b/osgi/osgi-intro-sample-client/pom.xml @@ -8,7 +8,7 @@ bundle - osgi-intro + osgi com.baeldung 1.0-SNAPSHOT diff --git a/osgi/osgi-intro-sample-service/pom.xml b/osgi/osgi-intro-sample-service/pom.xml index 29741e7eb2..8f81645ad4 100644 --- a/osgi/osgi-intro-sample-service/pom.xml +++ b/osgi/osgi-intro-sample-service/pom.xml @@ -8,7 +8,7 @@ - osgi-intro + osgi com.baeldung 1.0-SNAPSHOT diff --git a/patterns/design-patterns/pom.xml b/patterns/design-patterns/pom.xml index 22fc88b75a..dc2631b36e 100644 --- a/patterns/design-patterns/pom.xml +++ b/patterns/design-patterns/pom.xml @@ -2,13 +2,12 @@ 4.0.0 - com.baeldung design-patterns 1.0 jar com.baeldung - patterns-parent + patterns 1.0.0-SNAPSHOT .. diff --git a/patterns/front-controller/pom.xml b/patterns/front-controller/pom.xml index 96ed86d975..435b0dd9cd 100644 --- a/patterns/front-controller/pom.xml +++ b/patterns/front-controller/pom.xml @@ -6,7 +6,7 @@ war - patterns-parent + patterns com.baeldung 1.0.0-SNAPSHOT .. diff --git a/patterns/intercepting-filter/pom.xml b/patterns/intercepting-filter/pom.xml index ee6fef30c9..fa94d5d1fd 100644 --- a/patterns/intercepting-filter/pom.xml +++ b/patterns/intercepting-filter/pom.xml @@ -8,7 +8,7 @@ com.baeldung - patterns-parent + patterns 1.0.0-SNAPSHOT .. diff --git a/patterns/pom.xml b/patterns/pom.xml index c8f44227a3..df09f1836a 100644 --- a/patterns/pom.xml +++ b/patterns/pom.xml @@ -2,8 +2,7 @@ 4.0.0 - com.baeldung - patterns-parent + patterns pom diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index 0240b2c2ea..8c9d027724 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -3,7 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - performancetests + performance-tests parent-modules diff --git a/spring-ejb/ejb-beans/pom.xml b/spring-ejb/ejb-beans/pom.xml index 6ab48741f3..76c0afadee 100644 --- a/spring-ejb/ejb-beans/pom.xml +++ b/spring-ejb/ejb-beans/pom.xml @@ -8,7 +8,7 @@ com.baeldung.spring.ejb - ejb-for-spring + spring-ejb 1.0.1 diff --git a/spring-ejb/ejb-remote-for-spring/pom.xml b/spring-ejb/ejb-remote-for-spring/pom.xml index 5f4869968f..21256fa801 100755 --- a/spring-ejb/ejb-remote-for-spring/pom.xml +++ b/spring-ejb/ejb-remote-for-spring/pom.xml @@ -7,7 +7,7 @@ com.baeldung.spring.ejb - ejb-for-spring + spring-ejb 1.0.1 From 2a66773c7c57420a564a096811a99ed514d31fdc Mon Sep 17 00:00:00 2001 From: Donato Rimenti Date: Mon, 3 Sep 2018 19:05:41 +0200 Subject: [PATCH 100/128] [BAEL-1935] Synthetic Class in Java (#5122) * BAEL-1935: Synthetic Class in Java * Converted tabs to spaces --- .../baeldung/synthetic/BridgeMethodDemo.java | 23 +++++ .../synthetic/SyntheticConstructorDemo.java | 34 +++++++ .../synthetic/SyntheticFieldDemo.java | 22 +++++ .../synthetic/SyntheticMethodDemo.java | 48 +++++++++ .../baeldung/synthetic/SyntheticUnitTest.java | 99 +++++++++++++++++++ 5 files changed, 226 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/synthetic/BridgeMethodDemo.java create mode 100644 core-java/src/main/java/com/baeldung/synthetic/SyntheticConstructorDemo.java create mode 100644 core-java/src/main/java/com/baeldung/synthetic/SyntheticFieldDemo.java create mode 100644 core-java/src/main/java/com/baeldung/synthetic/SyntheticMethodDemo.java create mode 100644 core-java/src/test/java/com/baeldung/synthetic/SyntheticUnitTest.java diff --git a/core-java/src/main/java/com/baeldung/synthetic/BridgeMethodDemo.java b/core-java/src/main/java/com/baeldung/synthetic/BridgeMethodDemo.java new file mode 100644 index 0000000000..bdf6684f78 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/synthetic/BridgeMethodDemo.java @@ -0,0 +1,23 @@ +package com.baeldung.synthetic; + +import java.util.Comparator; + +/** + * Class which contains a synthetic bridge method. + * + * @author Donato Rimenti + * + */ +public class BridgeMethodDemo implements Comparator { + + /* + * (non-Javadoc) + * + * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) + */ + @Override + public int compare(Integer o1, Integer o2) { + return 0; + } + +} diff --git a/core-java/src/main/java/com/baeldung/synthetic/SyntheticConstructorDemo.java b/core-java/src/main/java/com/baeldung/synthetic/SyntheticConstructorDemo.java new file mode 100644 index 0000000000..d3d75ac05e --- /dev/null +++ b/core-java/src/main/java/com/baeldung/synthetic/SyntheticConstructorDemo.java @@ -0,0 +1,34 @@ +package com.baeldung.synthetic; + +/** + * Wrapper for a class which contains a synthetic constructor. + * + * @author Donato Rimenti + * + */ +public class SyntheticConstructorDemo { + + /** + * We need to instantiate the {@link NestedClass} using a private + * constructor from the enclosing instance in order to generate a synthetic + * constructor. + */ + private NestedClass nestedClass = new NestedClass(); + + /** + * Class which contains a synthetic constructor. + * + * @author Donato Rimenti + * + */ + class NestedClass { + + /** + * In order to generate a synthetic constructor, this class must have a + * private constructor. + */ + private NestedClass() { + } + } + +} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/synthetic/SyntheticFieldDemo.java b/core-java/src/main/java/com/baeldung/synthetic/SyntheticFieldDemo.java new file mode 100644 index 0000000000..1813e03953 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/synthetic/SyntheticFieldDemo.java @@ -0,0 +1,22 @@ +package com.baeldung.synthetic; + +/** + * Wrapper for a class which contains a synthetic field reference to the outer + * class. + * + * @author Donato Rimenti + * + */ +public class SyntheticFieldDemo { + + /** + * Class which contains a synthetic field reference to the outer class. + * + * @author Donato Rimenti + * + */ + class NestedClass { + + } + +} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/synthetic/SyntheticMethodDemo.java b/core-java/src/main/java/com/baeldung/synthetic/SyntheticMethodDemo.java new file mode 100644 index 0000000000..59be4e1429 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/synthetic/SyntheticMethodDemo.java @@ -0,0 +1,48 @@ +package com.baeldung.synthetic; + +/** + * Wrapper for a class which contains two synthetic methods accessors to a + * private field. + * + * @author Donato Rimenti + * + */ +public class SyntheticMethodDemo { + + /** + * Class which contains two synthetic methods accessors to a private field. + * + * @author Donato Rimenti + * + */ + class NestedClass { + + /** + * Field for which will be generated synthetic methods accessors. It's + * important that this field is private for this purpose. + */ + private String nestedField; + } + + /** + * Gets the private nested field. We need to read the nested field in order + * to generate the synthetic getter. + * + * @return the {@link NestedClass#nestedField} + */ + public String getNestedField() { + return new NestedClass().nestedField; + } + + /** + * Sets the private nested field. We need to write the nested field in order + * to generate the synthetic setter. + * + * @param nestedField + * the {@link NestedClass#nestedField} + */ + public void setNestedField(String nestedField) { + new NestedClass().nestedField = nestedField; + } + +} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/synthetic/SyntheticUnitTest.java b/core-java/src/test/java/com/baeldung/synthetic/SyntheticUnitTest.java new file mode 100644 index 0000000000..20f7647f48 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/synthetic/SyntheticUnitTest.java @@ -0,0 +1,99 @@ +package com.baeldung.synthetic; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Unit test for {@link SyntheticFieldDemo}, {@link SyntheticMethodDemo}, + * {@link SyntheticConstructorDemo} and {@link BridgeMethodDemo} classes. + * + * @author Donato Rimenti + * + */ +public class SyntheticUnitTest { + + /** + * Tests that the {@link SyntheticMethodDemo.NestedClass} contains two synthetic + * methods. + */ + @Test + public void givenSyntheticMethod_whenIsSinthetic_thenTrue() { + // Checks that the nested class contains exactly two synthetic methods. + Method[] methods = SyntheticMethodDemo.NestedClass.class.getDeclaredMethods(); + Assert.assertEquals("This class should contain only two methods", 2, methods.length); + + for (Method m : methods) { + System.out.println("Method: " + m.getName() + ", isSynthetic: " + m.isSynthetic()); + Assert.assertTrue("All the methods of this class should be synthetic", m.isSynthetic()); + } + } + + /** + * Tests that {@link SyntheticConstructorDemo.NestedClass} contains a synthetic + * constructor. + */ + @Test + public void givenSyntheticConstructor_whenIsSinthetic_thenTrue() { + // Checks that the nested class contains exactly a synthetic + // constructor. + int syntheticConstructors = 0; + Constructor[] constructors = SyntheticConstructorDemo.NestedClass.class.getDeclaredConstructors(); + Assert.assertEquals("This class should contain only two constructors", 2, constructors.length); + + for (Constructor c : constructors) { + System.out.println("Constructor: " + c.getName() + ", isSynthetic: " + c.isSynthetic()); + + // Counts the synthetic constructors. + if (c.isSynthetic()) { + syntheticConstructors++; + } + } + + // Checks that there's exactly one synthetic constructor. + Assert.assertEquals(1, syntheticConstructors); + } + + /** + * Tests that {@link SyntheticFieldDemo.NestedClass} contains a synthetic field. + */ + @Test + public void givenSyntheticField_whenIsSinthetic_thenTrue() { + // This class should contain exactly one synthetic field. + Field[] fields = SyntheticFieldDemo.NestedClass.class.getDeclaredFields(); + Assert.assertEquals("This class should contain only one field", 1, fields.length); + + for (Field f : fields) { + System.out.println("Field: " + f.getName() + ", isSynthetic: " + f.isSynthetic()); + Assert.assertTrue("All the fields of this class should be synthetic", f.isSynthetic()); + } + } + + /** + * Tests that {@link BridgeMethodDemo} contains a synthetic bridge method. + */ + @Test + public void givenBridgeMethod_whenIsBridge_thenTrue() { + // This class should contain exactly one synthetic bridge method. + int syntheticMethods = 0; + Method[] methods = BridgeMethodDemo.class.getDeclaredMethods(); + for (Method m : methods) { + System.out.println( + "Method: " + m.getName() + ", isSynthetic: " + m.isSynthetic() + ", isBridge: " + m.isBridge()); + + // Counts the synthetic methods and checks that they are also bridge + // methods. + if (m.isSynthetic()) { + syntheticMethods++; + Assert.assertTrue("The synthetic method in this class should also be a bridge method", m.isBridge()); + } + } + + // Checks that there's exactly one synthetic bridge method. + Assert.assertEquals("There should be exactly 1 synthetic bridge method in this class", 1, syntheticMethods); + } + +} \ No newline at end of file From 9ab54cb4ab11c8f561f819cd5bfa89ff10fdffa5 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Mon, 3 Sep 2018 23:32:35 +0530 Subject: [PATCH 101/128] BAEL-8844 Get rid of all warnings in build start due to incorrect pom configurations - Removed prerequisites tag from jee-7, jhipster-monolithic, spring-swagger-codegen-api-client - Fixed other issues causing warnings --- jee-7/pom.xml | 4 ---- jhipster/jhipster-monolithic/pom.xml | 4 ---- jws/pom.xml | 23 +++++++++++-------- libraries/pom.xml | 5 ---- .../spring-swagger-codegen-api-client/pom.xml | 6 +---- xml/pom.xml | 2 ++ 6 files changed, 16 insertions(+), 28 deletions(-) diff --git a/jee-7/pom.xml b/jee-7/pom.xml index fbf102185d..08c8b5a068 100644 --- a/jee-7/pom.xml +++ b/jee-7/pom.xml @@ -384,10 +384,6 @@ - - ${maven.min.version} - - bintray-mvc-spec-maven diff --git a/jhipster/jhipster-monolithic/pom.xml b/jhipster/jhipster-monolithic/pom.xml index d82b048798..9708b83a70 100644 --- a/jhipster/jhipster-monolithic/pom.xml +++ b/jhipster/jhipster-monolithic/pom.xml @@ -880,10 +880,6 @@ - - ${maven.version} - - -Djava.security.egd=file:/dev/./urandom -Xmx256m 3.6.2 diff --git a/jws/pom.xml b/jws/pom.xml index 01d9820b42..1970ab9921 100644 --- a/jws/pom.xml +++ b/jws/pom.xml @@ -13,20 +13,23 @@ 1.0.0-SNAPSHOT + + + OpenNMS Repository + http://repo.opennms.org/maven2/ + + + - javax.jnlp + javax.samples.jnlp jnlp-servlet ${jnlp-servlet.version} - system - ${project.basedir}/java-core-samples-lib/jnlp-servlet.jar - javax.jnlp - jardiff - ${jardiff.version} - system - ${project.basedir}/java-core-samples-lib/jardiff.jar + javax.samples.jnlp + jnlp-jardiff + ${jnlp-jardiff.version} @@ -81,8 +84,8 @@ 3.0.2 3.0.0 - 7.0 - 7.0 + 1.6.0 + 1.6.0 diff --git a/libraries/pom.xml b/libraries/pom.xml index a82472d707..b82828e848 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -726,11 +726,6 @@ resilience4j-timelimiter ${resilience4j.version} - - org.apache.commons - commons-math3 - ${common-math3.version} - org.knowm.xchart xchart 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 aac6fe9843..0129875f60 100644 --- a/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml +++ b/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml @@ -2,11 +2,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 - com.baeldung spring-swagger-codegen-api-client jar spring-swagger-codegen-api-client - 0.0.1-SNAPSHOT https://github.com/swagger-api/swagger-codegen Swagger Java @@ -14,9 +12,7 @@ scm:git:git@github.com:swagger-api/swagger-codegen.git https://github.com/swagger-api/swagger-codegen - - 2.2.0 - + Unlicense diff --git a/xml/pom.xml b/xml/pom.xml index 39590711e0..5490f3a89f 100644 --- a/xml/pom.xml +++ b/xml/pom.xml @@ -174,12 +174,14 @@ + process-classes process-classes bind + process-test-classes process-test-classes test-bind From 86aaeed8e1aa382e41d1a5df817bb993176ff744 Mon Sep 17 00:00:00 2001 From: myluckagain Date: Mon, 3 Sep 2018 23:34:21 +0500 Subject: [PATCH 102/128] BAEL-2155 (#5149) --- .../DistanceBetweenPointsService.java | 38 +++++++++++++ .../DistanceBetweenPointsServiceUnitTest.java | 54 +++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 algorithms/src/main/java/com/baeldung/algorithms/distancebetweenpoints/DistanceBetweenPointsService.java create mode 100644 algorithms/src/test/java/com/baeldung/algorithms/distancebetweenpoints/DistanceBetweenPointsServiceUnitTest.java diff --git a/algorithms/src/main/java/com/baeldung/algorithms/distancebetweenpoints/DistanceBetweenPointsService.java b/algorithms/src/main/java/com/baeldung/algorithms/distancebetweenpoints/DistanceBetweenPointsService.java new file mode 100644 index 0000000000..0c8eb86a38 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/distancebetweenpoints/DistanceBetweenPointsService.java @@ -0,0 +1,38 @@ +package com.baeldung.algorithms.distancebetweenpoints; + +import java.awt.geom.Point2D; + +public class DistanceBetweenPointsService { + + public double calculateDistanceBetweenPoints( + double x1, + double y1, + double x2, + double y2) { + + return Math.sqrt((y2 - y1) * (y2 - y1) + (x2 - x1) * (x2 - x1)); + } + + public double calculateDistanceBetweenPointsWithHypot( + double x1, + double y1, + double x2, + double y2) { + + double ac = Math.abs(y2 - y1); + double cb = Math.abs(x2 - x1); + + return Math.hypot(ac, cb); + } + + public double calculateDistanceBetweenPointsWithPoint2D( + double x1, + double y1, + double x2, + double y2) { + + return Point2D.distance(x1, y1, x2, y2); + + } + +} diff --git a/algorithms/src/test/java/com/baeldung/algorithms/distancebetweenpoints/DistanceBetweenPointsServiceUnitTest.java b/algorithms/src/test/java/com/baeldung/algorithms/distancebetweenpoints/DistanceBetweenPointsServiceUnitTest.java new file mode 100644 index 0000000000..785afdbb2b --- /dev/null +++ b/algorithms/src/test/java/com/baeldung/algorithms/distancebetweenpoints/DistanceBetweenPointsServiceUnitTest.java @@ -0,0 +1,54 @@ +package com.baeldung.algorithms.distancebetweenpoints; + +import org.junit.Test; + +import com.baeldung.algorithms.distancebetweenpoints.DistanceBetweenPointsService; + +import static org.junit.Assert.assertEquals; + +public class DistanceBetweenPointsServiceUnitTest { + + private DistanceBetweenPointsService service = new DistanceBetweenPointsService(); + + @Test + public void givenTwoPoints_whenCalculateDistanceByFormula_thenCorrect() { + + double x1 = 3; + double y1 = 4; + double x2 = 7; + double y2 = 1; + + double distance = service.calculateDistanceBetweenPoints(x1, y1, x2, y2); + + assertEquals(distance, 5, 0.001); + + } + + @Test + public void givenTwoPoints_whenCalculateDistanceWithHypot_thenCorrect() { + + double x1 = 3; + double y1 = 4; + double x2 = 7; + double y2 = 1; + + double distance = service.calculateDistanceBetweenPointsWithHypot(x1, y1, x2, y2); + + assertEquals(distance, 5, 0.001); + + } + + @Test + public void givenTwoPoints_whenCalculateDistanceWithPoint2D_thenCorrect() { + + double x1 = 3; + double y1 = 4; + double x2 = 7; + double y2 = 1; + + double distance = service.calculateDistanceBetweenPointsWithPoint2D(x1, y1, x2, y2); + + assertEquals(distance, 5, 0.001); + + } +} From a45f51da115a8e9ddc4306dcc0460563da089b63 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Tue, 4 Sep 2018 00:14:20 +0530 Subject: [PATCH 103/128] BAEL-8844 Get rid of all warnings in build start due to incorrect pom configurations - Fixing ejb projects hierarchy --- ejb/pom.xml | 1 - pom.xml | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/ejb/pom.xml b/ejb/pom.xml index a188d43272..4cb700d087 100755 --- a/ejb/pom.xml +++ b/ejb/pom.xml @@ -17,7 +17,6 @@ ejb-remote - ejb-client ejb-session-beans diff --git a/pom.xml b/pom.xml index be6029a946..b64c8ccaea 100644 --- a/pom.xml +++ b/pom.xml @@ -360,6 +360,7 @@ dozer ethereum ejb + ejb/ejb-client feign flips testing-modules/gatling From 93339f4828b67f26c6fc2684de770f30618f5567 Mon Sep 17 00:00:00 2001 From: micropatel <31759369+micropatel@users.noreply.github.com> Date: Mon, 3 Sep 2018 23:48:56 -0300 Subject: [PATCH 104/128] BAEL-1980 - Sharing H2 database (#5039) * Added Spring-Boot-H2 project * Optimized imports and formatted code * Code Formatting changes * Renamed the client applicaiton * Removed Name from pom.xml * formatting changes - applied formatting style * added souts * Update SpringBootApp.java * Update ClientSpringBootApp.java * Fixed Formatting issues * Fixed formatting and spelling mistakes --- .../spring-boot-h2-database/.gitignore | 25 ++++++++ .../spring-boot-h2-database/pom.xml | 52 ++++++++++++++++ .../com/baeldung/h2db/demo/SpringBootApp.java | 60 +++++++++++++++++++ .../src/main/resources/application.properties | 7 +++ .../spring-boot-h2-remote-app/.gitignore | 25 ++++++++ .../spring-boot-h2-remote-app/pom.xml | 55 +++++++++++++++++ .../h2db/demo/ClientSpringBootApp.java | 49 +++++++++++++++ .../src/main/resources/application.properties | 5 ++ 8 files changed, 278 insertions(+) create mode 100644 spring-boot-h2/spring-boot-h2-database/.gitignore create mode 100644 spring-boot-h2/spring-boot-h2-database/pom.xml create mode 100644 spring-boot-h2/spring-boot-h2-database/src/main/java/com/baeldung/h2db/demo/SpringBootApp.java create mode 100644 spring-boot-h2/spring-boot-h2-database/src/main/resources/application.properties create mode 100644 spring-boot-h2/spring-boot-h2-remote-app/.gitignore create mode 100644 spring-boot-h2/spring-boot-h2-remote-app/pom.xml create mode 100644 spring-boot-h2/spring-boot-h2-remote-app/src/main/java/com/baeldung/h2db/demo/ClientSpringBootApp.java create mode 100644 spring-boot-h2/spring-boot-h2-remote-app/src/main/resources/application.properties diff --git a/spring-boot-h2/spring-boot-h2-database/.gitignore b/spring-boot-h2/spring-boot-h2-database/.gitignore new file mode 100644 index 0000000000..82eca336e3 --- /dev/null +++ b/spring-boot-h2/spring-boot-h2-database/.gitignore @@ -0,0 +1,25 @@ +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/build/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ \ No newline at end of file diff --git a/spring-boot-h2/spring-boot-h2-database/pom.xml b/spring-boot-h2/spring-boot-h2-database/pom.xml new file mode 100644 index 0000000000..4b660334da --- /dev/null +++ b/spring-boot-h2/spring-boot-h2-database/pom.xml @@ -0,0 +1,52 @@ + + + 4.0.0 + + com.baeldung.h2db + spring-boot-h2-database + 0.0.1-SNAPSHOT + jar + + Demo Spring Boot applications that starts H2 in memory database + + + org.springframework.boot + spring-boot-starter-parent + 2.0.4.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + com.h2database + h2 + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/spring-boot-h2/spring-boot-h2-database/src/main/java/com/baeldung/h2db/demo/SpringBootApp.java b/spring-boot-h2/spring-boot-h2-database/src/main/java/com/baeldung/h2db/demo/SpringBootApp.java new file mode 100644 index 0000000000..1fe080ec22 --- /dev/null +++ b/spring-boot-h2/spring-boot-h2-database/src/main/java/com/baeldung/h2db/demo/SpringBootApp.java @@ -0,0 +1,60 @@ +package com.baeldung.h2db.demo; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Arrays; +import javax.annotation.PostConstruct; +import org.h2.tools.Server; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; + +@SpringBootApplication +public class SpringBootApp { + + @Autowired + private JdbcTemplate jdbcTemplate; + + public static void main(String[] args) { + SpringApplication.run(SpringBootApp.class, args); + } + + @PostConstruct + private void initDb() { + System.out.println(String.format( + "****** Creating table: %s, and Inserting test data ******", "Employees")); + + String sqlStatements[] = { + "drop table employees if exists", + "create table employees(id serial,first_name varchar(255),last_name varchar(255))", + "insert into employees(first_name, last_name) values('Eugen','Paraschiv')", + "insert into employees(first_name, last_name) values('Scott','Tiger')" + }; + + Arrays.asList(sqlStatements).stream().forEach(sql -> { + System.out.println(sql); + jdbcTemplate.execute(sql); + }); + + System.out.println(String.format("****** Fetching from table: %s ******", "Employees")); + jdbcTemplate.query("select id,first_name,last_name from employees", + new RowMapper() { + @Override + public Object mapRow(ResultSet rs, int i) throws SQLException { + System.out.println(String.format("id:%s,first_name:%s,last_name:%s", + rs.getString("id"), + rs.getString("first_name"), + rs.getString("last_name"))); + return null; + } + }); + } + + @Bean(initMethod = "start", destroyMethod = "stop") + public Server inMemoryH2DatabaseServer() throws SQLException { + return Server.createTcpServer("-tcp", "-tcpAllowOthers", "-tcpPort", "9091"); + } +} \ No newline at end of file diff --git a/spring-boot-h2/spring-boot-h2-database/src/main/resources/application.properties b/spring-boot-h2/spring-boot-h2-database/src/main/resources/application.properties new file mode 100644 index 0000000000..0591cc9e0f --- /dev/null +++ b/spring-boot-h2/spring-boot-h2-database/src/main/resources/application.properties @@ -0,0 +1,7 @@ +spring.datasource.url=jdbc:h2:mem:mydb +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password= +spring.jpa.hibernate.ddl-auto=create +spring.h2.console.enabled=true +spring.h2.console.path=/h2-console \ No newline at end of file diff --git a/spring-boot-h2/spring-boot-h2-remote-app/.gitignore b/spring-boot-h2/spring-boot-h2-remote-app/.gitignore new file mode 100644 index 0000000000..82eca336e3 --- /dev/null +++ b/spring-boot-h2/spring-boot-h2-remote-app/.gitignore @@ -0,0 +1,25 @@ +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/build/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ \ No newline at end of file diff --git a/spring-boot-h2/spring-boot-h2-remote-app/pom.xml b/spring-boot-h2/spring-boot-h2-remote-app/pom.xml new file mode 100644 index 0000000000..8eb59d2098 --- /dev/null +++ b/spring-boot-h2/spring-boot-h2-remote-app/pom.xml @@ -0,0 +1,55 @@ + + + 4.0.0 + + com.baeldung.h2db + spring-boot-h2-remote-app + 0.0.1-SNAPSHOT + jar + + Demo Spring Boot applications that access H2 in memory database created + in another Spring Boot application + + + + org.springframework.boot + spring-boot-starter-parent + 2.0.4.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + com.h2database + h2 + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/spring-boot-h2/spring-boot-h2-remote-app/src/main/java/com/baeldung/h2db/demo/ClientSpringBootApp.java b/spring-boot-h2/spring-boot-h2-remote-app/src/main/java/com/baeldung/h2db/demo/ClientSpringBootApp.java new file mode 100644 index 0000000000..39e52afd2c --- /dev/null +++ b/spring-boot-h2/spring-boot-h2-remote-app/src/main/java/com/baeldung/h2db/demo/ClientSpringBootApp.java @@ -0,0 +1,49 @@ +package com.baeldung.h2db.demo; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Arrays; +import javax.annotation.PostConstruct; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; + +@SpringBootApplication +public class ClientSpringBootApp { + + @Autowired + private JdbcTemplate jdbcTemplate; + + public static void main(String[] args) { + SpringApplication.run(ClientSpringBootApp.class, args); + } + + @PostConstruct + private void initDb() { + System.out.println("****** Inserting more sample data in the table: Employees ******"); + String sqlStatements[] = { + "insert into employees(first_name, last_name) values('Donald','Trump')", + "insert into employees(first_name, last_name) values('Barack','Obama')" + }; + + Arrays.asList(sqlStatements).stream().forEach(sql -> { + System.out.println(sql); + jdbcTemplate.execute(sql); + }); + + System.out.println(String.format("****** Fetching from table: %s ******", "Employees")); + jdbcTemplate.query("select id,first_name,last_name from employees", + new RowMapper() { + @Override + public Object mapRow(ResultSet rs, int i) throws SQLException { + System.out.println(String.format("id:%s,first_name:%s,last_name:%s", + rs.getString("id"), + rs.getString("first_name"), + rs.getString("last_name"))); + return null; + } + }); + } +} \ No newline at end of file diff --git a/spring-boot-h2/spring-boot-h2-remote-app/src/main/resources/application.properties b/spring-boot-h2/spring-boot-h2-remote-app/src/main/resources/application.properties new file mode 100644 index 0000000000..6c3446f03a --- /dev/null +++ b/spring-boot-h2/spring-boot-h2-remote-app/src/main/resources/application.properties @@ -0,0 +1,5 @@ +spring.datasource.url=jdbc:h2:tcp://localhost:9091/mem:mydb +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password= +spring.jpa.hibernate.ddl-auto=create \ No newline at end of file From e88ef768054c0da934645142da767f47eedb8178 Mon Sep 17 00:00:00 2001 From: Mher Baghinyan Date: Tue, 4 Sep 2018 10:38:36 +0400 Subject: [PATCH 105/128] Bael 2052 (#5051) * collections benchmark tests * more benchmark tests * set benchmark tests * include linkedlist in benchmark tests * Update ArrayListBenchmark.java --- .../performance/ArrayListBenchmark.java | 77 ++++++++++++++++++ .../performance/CopyOnWriteBenchmark.java | 78 +++++++++++++++++++ .../com/baeldung/performance/Employee.java | 16 ++++ .../performance/HashMapBenchmark.java | 73 +++++++++++++++++ .../baeldung/performance/SetBenchMark.java | 66 ++++++++++++++++ 5 files changed, 310 insertions(+) create mode 100644 core-java-collections/src/main/java/com/baeldung/performance/ArrayListBenchmark.java create mode 100644 core-java-collections/src/main/java/com/baeldung/performance/CopyOnWriteBenchmark.java create mode 100644 core-java-collections/src/main/java/com/baeldung/performance/HashMapBenchmark.java create mode 100644 core-java-collections/src/main/java/com/baeldung/performance/SetBenchMark.java diff --git a/core-java-collections/src/main/java/com/baeldung/performance/ArrayListBenchmark.java b/core-java-collections/src/main/java/com/baeldung/performance/ArrayListBenchmark.java new file mode 100644 index 0000000000..dddd85007d --- /dev/null +++ b/core-java-collections/src/main/java/com/baeldung/performance/ArrayListBenchmark.java @@ -0,0 +1,77 @@ +package com.baeldung.performance; + +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@Warmup(iterations = 10) +public class ArrayListBenchmark { + + @State(Scope.Thread) + public static class MyState { + + List employeeList = new ArrayList<>(); + //LinkedList employeeList = new LinkedList<>(); + + long iterations = 100000; + + Employee employee = new Employee(100L, "Harry"); + + int employeeIndex = -1; + + @Setup(Level.Trial) + public void setUp() { + for (long i = 0; i < iterations; i++) { + employeeList.add(new Employee(i, "John")); + } + + employeeList.add(employee); + employeeIndex = employeeList.indexOf(employee); + } + } + + @Benchmark + public void testAddAt(ArrayListBenchmark.MyState state) { + state.employeeList.add((int) (state.iterations), new Employee(state.iterations, "John")); + } + + @Benchmark + public boolean testContains(ArrayListBenchmark.MyState state) { + return state.employeeList.contains(state.employee); + } + + @Benchmark + public int testIndexOf(ArrayListBenchmark.MyState state) { + return state.employeeList.indexOf(state.employee); + } + + @Benchmark + public Employee testGet(ArrayListBenchmark.MyState state) { + return state.employeeList.get(state.employeeIndex); + } + + @Benchmark + public boolean testRemove(ArrayListBenchmark.MyState state) { + return state.employeeList.remove(state.employee); + } + +// @Benchmark +// public void testAdd(ArrayListBenchmark.MyState state) { +// state.employeeList.add(new Employee(state.iterations + 1, "John")); +// } + + public static void main(String[] args) throws Exception { + Options options = new OptionsBuilder() + .include(ArrayListBenchmark.class.getSimpleName()).threads(1) + .forks(1).shouldFailOnError(true) + .shouldDoGC(true) + .jvmArgs("-server").build(); + new Runner(options).run(); + } +} diff --git a/core-java-collections/src/main/java/com/baeldung/performance/CopyOnWriteBenchmark.java b/core-java-collections/src/main/java/com/baeldung/performance/CopyOnWriteBenchmark.java new file mode 100644 index 0000000000..30c50291dd --- /dev/null +++ b/core-java-collections/src/main/java/com/baeldung/performance/CopyOnWriteBenchmark.java @@ -0,0 +1,78 @@ +package com.baeldung.performance; + +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.TimeUnit; + +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@Warmup(iterations = 10) +public class CopyOnWriteBenchmark { + + @State(Scope.Thread) + public static class MyState { + + CopyOnWriteArrayList employeeList = new CopyOnWriteArrayList<>(); + + long iterations = 100000; + + Employee employee = new Employee(100L, "Harry"); + + int employeeIndex = -1; + + @Setup(Level.Trial) + public void setUp() { + for (long i = 0; i < iterations; i++) { + employeeList.add(new Employee(i, "John")); + } + + employeeList.add(employee); + + employeeIndex = employeeList.indexOf(employee); + } + } + + @Benchmark + public void testAdd(CopyOnWriteBenchmark.MyState state) { + state.employeeList.add(new Employee(state.iterations + 1, "John")); + } + + @Benchmark + public void testAddAt(CopyOnWriteBenchmark.MyState state) { + state.employeeList.add((int) (state.iterations), new Employee(state.iterations, "John")); + } + + @Benchmark + public boolean testContains(CopyOnWriteBenchmark.MyState state) { + return state.employeeList.contains(state.employee); + } + + @Benchmark + public int testIndexOf(CopyOnWriteBenchmark.MyState state) { + return state.employeeList.indexOf(state.employee); + } + + @Benchmark + public Employee testGet(CopyOnWriteBenchmark.MyState state) { + return state.employeeList.get(state.employeeIndex); + } + + @Benchmark + public boolean testRemove(CopyOnWriteBenchmark.MyState state) { + return state.employeeList.remove(state.employee); + } + + + public static void main(String[] args) throws Exception { + Options options = new OptionsBuilder() + .include(CopyOnWriteBenchmark.class.getSimpleName()).threads(1) + .forks(1).shouldFailOnError(true) + .shouldDoGC(true) + .jvmArgs("-server").build(); + new Runner(options).run(); + } +} diff --git a/core-java-collections/src/main/java/com/baeldung/performance/Employee.java b/core-java-collections/src/main/java/com/baeldung/performance/Employee.java index daa68ae2f1..d811cfbb7d 100644 --- a/core-java-collections/src/main/java/com/baeldung/performance/Employee.java +++ b/core-java-collections/src/main/java/com/baeldung/performance/Employee.java @@ -10,6 +10,22 @@ public class Employee { this.id = id; } + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/core-java-collections/src/main/java/com/baeldung/performance/HashMapBenchmark.java b/core-java-collections/src/main/java/com/baeldung/performance/HashMapBenchmark.java new file mode 100644 index 0000000000..085daaceb7 --- /dev/null +++ b/core-java-collections/src/main/java/com/baeldung/performance/HashMapBenchmark.java @@ -0,0 +1,73 @@ +package com.baeldung.performance; + +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@Warmup(iterations = 10) +public class HashMapBenchmark { + + @State(Scope.Thread) + public static class MyState { + + Map employeeMap = new HashMap<>(); + //LinkedHashMap employeeMap = new LinkedHashMap<>(); + //IdentityHashMap employeeMap = new IdentityHashMap<>(); + //WeakHashMap employeeMap = new WeakHashMap<>(); + //ConcurrentHashMap employeeMap = new ConcurrentHashMap<>(); + //ConcurrentSkipListMap employeeMap = new ConcurrentSkipListMap <>(); + + // TreeMap + + long iterations = 100000; + + Employee employee = new Employee(100L, "Harry"); + + int employeeIndex = -1; + + @Setup(Level.Trial) + public void setUp() { + for (long i = 0; i < iterations; i++) { + employeeMap.put(i, new Employee(i, "John")); + } + + //employeeMap.put(iterations, employee); + } + } + + @Benchmark + public Employee testGet(HashMapBenchmark.MyState state) { + return state.employeeMap.get(state.iterations); + } + + @Benchmark + public Employee testRemove(HashMapBenchmark.MyState state) { + return state.employeeMap.remove(state.iterations); + } + + @Benchmark + public Employee testPut(HashMapBenchmark.MyState state) { + return state.employeeMap.put(state.employee.getId(), state.employee); + } + + @Benchmark + public Boolean testContainsKey(HashMapBenchmark.MyState state) { + return state.employeeMap.containsKey(state.employee.getId()); + } + + + public static void main(String[] args) throws Exception { + Options options = new OptionsBuilder() + .include(HashMapBenchmark.class.getSimpleName()).threads(1) + .forks(1).shouldFailOnError(true) + .shouldDoGC(true) + .jvmArgs("-server").build(); + new Runner(options).run(); + } +} diff --git a/core-java-collections/src/main/java/com/baeldung/performance/SetBenchMark.java b/core-java-collections/src/main/java/com/baeldung/performance/SetBenchMark.java new file mode 100644 index 0000000000..f70bab4fcf --- /dev/null +++ b/core-java-collections/src/main/java/com/baeldung/performance/SetBenchMark.java @@ -0,0 +1,66 @@ +package com.baeldung.performance; + +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.Set; +import java.util.TreeSet; +import java.util.concurrent.ConcurrentSkipListSet; +import java.util.concurrent.TimeUnit; + +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@Warmup(iterations = 10) +public class SetBenchMark { + + @State(Scope.Thread) + public static class MyState { + + //Set employeeSet = new HashSet<>(); + LinkedHashSet employeeSet = new LinkedHashSet<>(); + //ConcurrentSkipListSet employeeSet = new ConcurrentSkipListSet <>(); + + // TreeSet  + + long iterations = 1000; + Employee employee = new Employee(100L, "Harry"); + + @Setup(Level.Trial) + public void setUp() { + for (long i = 0; i < iterations; i++) { + employeeSet.add(new Employee(i, "John")); + } + + //employeeSet.add(employee); + } + } + + @Benchmark + public boolean testAdd(SetBenchMark.MyState state) { + return state.employeeSet.add(state.employee); + } + + @Benchmark + public Boolean testContains(SetBenchMark.MyState state) { + return state.employeeSet.contains(state.employee); + } + + @Benchmark + public boolean testRemove(SetBenchMark.MyState state) { + return state.employeeSet.remove(state.employee); + } + + + public static void main(String[] args) throws Exception { + Options options = new OptionsBuilder() + .include(SetBenchMark.class.getSimpleName()).threads(1) + .forks(1).shouldFailOnError(true) + .shouldDoGC(true) + .jvmArgs("-server").build(); + new Runner(options).run(); + } +} From 6ea3e51f19a53ac254c03ae770bd4226d829a93c Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Tue, 4 Sep 2018 20:23:31 +0530 Subject: [PATCH 106/128] BAEL-8824 Align module names, folder names and artifact id - Folder name changes --- pom.xml | 8 ++++++++ .../README.md | 0 .../pom.xml | 0 .../reactive/Spring5ReactiveApplication.java | 0 .../com/baeldung/reactive/model/Account.java | 0 .../repository/AccountCrudRepository.java | 0 .../repository/AccountMongoRepository.java | 0 .../repository/AccountRxJavaRepository.java | 0 .../template/AccountTemplateOperations.java | 0 .../main/kotlin/com/baeldung/Application.kt | 0 .../src/main/kotlin/com/baeldung/Event.kt | 0 .../kotlin/com/baeldung/EventRepository.kt | 0 .../main/kotlin/com/baeldung/MongoConfig.kt | 0 .../main/kotlin/com/baeldung/SendEmitter.kt | 0 .../src/main/resources/logback.xml | 0 .../src/main/resources/static/index.html | 0 .../AccountCrudRepositoryIntegrationTest.java | 0 ...AccountMongoRepositoryIntegrationTest.java | 0 ...ccountRxJavaRepositoryIntegrationTest.java | 0 ...ountTemplateOperationsIntegrationTest.java | 0 {camel-api => spring-boot-camel}/README.md | 0 {camel-api => spring-boot-camel}/pom.xml | 0 .../java/com/baeldung/camel/Application.java | 0 .../com/baeldung/camel/ExampleServices.java | 0 .../main/java/com/baeldung/camel/MyBean.java | 0 .../src/main/resources/application.properties | 0 .../src/main/resources/application.yml | 0 .../src/main/resources/logback.xml | 0 spring-cloud/pom.xml | 1 + .../twitter/twitter | 1 + .../{boot => twitterhdfs}/.gitignore | 0 .../{boot => twitterhdfs}/pom.xml | 0 .../twitterhdfs/aggregate/AggregateApp.java | 0 .../twitterhdfs/processor/ProcessorApp.java | 0 .../baeldung/twitterhdfs/sink/SinkApp.java | 0 .../twitterhdfs/source/SourceApp.java | 0 .../src/main/resources/application.properties | 0 .../src/main/resources/logback.xml | 0 spring-remoting/pom.xml | 2 +- .../remoting-hessian-burlap/pom.xml | 17 ++++++++-------- .../pom.xml | 0 .../com/baeldung/client/BurlapClient.java | 0 .../com/baeldung/client/HessianClient.java | 0 .../src/main/resources/logback.xml | 0 .../CabBookingServiceIntegrationTest.java | 0 .../src/test/resources/application.properties | 0 .../pom.xml | 0 .../main/java/com/baeldung/server/Server.java | 0 .../src/main/resources/logback.xml | 0 spring-remoting/remoting-http/pom.xml | 20 ++++++++++--------- .../{api => remoting-http-api}/pom.xml | 14 +++++++------ .../main/java/com/baeldung/api/Booking.java | 0 .../com/baeldung/api/BookingException.java | 0 .../com/baeldung/api/CabBookingService.java | 0 .../{client => remoting-http-client}/pom.xml | 9 +++++---- .../main/java/com/baeldug/client/Client.java | 0 .../src/main/resources/logback.xml | 0 .../{server => remoting-http-server}/pom.xml | 8 +++++--- .../readme.md | 0 .../server/CabBookingServiceImpl.java | 0 .../main/java/com/baeldung/server/Server.java | 0 .../src/main/resources/logback.xml | 0 .../pom.xml | 14 ++++++------- .../remoting-rmi-client/pom.xml | 2 +- .../java/com/baeldung/client/RmiClient.java | 0 .../src/main/resources/logback.xml | 0 .../remoting-rmi-server/pom.xml | 2 +- .../server/CabBookingServiceImpl.java | 0 .../java/com/baeldung/server/RmiServer.java | 0 .../src/main/resources/logback.xml | 0 70 files changed, 57 insertions(+), 41 deletions(-) rename {spring-data-5-reactive => spring-5-data-reactive}/README.md (100%) rename {spring-data-5-reactive => spring-5-data-reactive}/pom.xml (100%) rename {spring-data-5-reactive => spring-5-data-reactive}/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java (100%) rename {spring-data-5-reactive => spring-5-data-reactive}/src/main/java/com/baeldung/reactive/model/Account.java (100%) rename {spring-data-5-reactive => spring-5-data-reactive}/src/main/java/com/baeldung/reactive/repository/AccountCrudRepository.java (100%) rename {spring-data-5-reactive => spring-5-data-reactive}/src/main/java/com/baeldung/reactive/repository/AccountMongoRepository.java (100%) rename {spring-data-5-reactive => spring-5-data-reactive}/src/main/java/com/baeldung/reactive/repository/AccountRxJavaRepository.java (100%) rename {spring-data-5-reactive => spring-5-data-reactive}/src/main/java/com/baeldung/reactive/template/AccountTemplateOperations.java (100%) rename {spring-data-5-reactive => spring-5-data-reactive}/src/main/kotlin/com/baeldung/Application.kt (100%) rename {spring-data-5-reactive => spring-5-data-reactive}/src/main/kotlin/com/baeldung/Event.kt (100%) rename {spring-data-5-reactive => spring-5-data-reactive}/src/main/kotlin/com/baeldung/EventRepository.kt (100%) rename {spring-data-5-reactive => spring-5-data-reactive}/src/main/kotlin/com/baeldung/MongoConfig.kt (100%) rename {spring-data-5-reactive => spring-5-data-reactive}/src/main/kotlin/com/baeldung/SendEmitter.kt (100%) rename {spring-cloud/spring-cloud-stream-starters/boot => spring-5-data-reactive}/src/main/resources/logback.xml (100%) rename {spring-data-5-reactive => spring-5-data-reactive}/src/main/resources/static/index.html (100%) rename {spring-data-5-reactive => spring-5-data-reactive}/src/test/java/com/baeldung/reactive/repository/AccountCrudRepositoryIntegrationTest.java (100%) rename {spring-data-5-reactive => spring-5-data-reactive}/src/test/java/com/baeldung/reactive/repository/AccountMongoRepositoryIntegrationTest.java (100%) rename {spring-data-5-reactive => spring-5-data-reactive}/src/test/java/com/baeldung/reactive/repository/AccountRxJavaRepositoryIntegrationTest.java (100%) rename {spring-data-5-reactive => spring-5-data-reactive}/src/test/java/com/baeldung/reactive/template/AccountTemplateOperationsIntegrationTest.java (100%) rename {camel-api => spring-boot-camel}/README.md (100%) rename {camel-api => spring-boot-camel}/pom.xml (100%) rename {camel-api => spring-boot-camel}/src/main/java/com/baeldung/camel/Application.java (100%) rename {camel-api => spring-boot-camel}/src/main/java/com/baeldung/camel/ExampleServices.java (100%) rename {camel-api => spring-boot-camel}/src/main/java/com/baeldung/camel/MyBean.java (100%) rename {camel-api => spring-boot-camel}/src/main/resources/application.properties (100%) rename {camel-api => spring-boot-camel}/src/main/resources/application.yml (100%) rename {camel-api => spring-boot-camel}/src/main/resources/logback.xml (100%) create mode 160000 spring-cloud/spring-cloud-stream-starters/twitter/twitter rename spring-cloud/spring-cloud-stream-starters/{boot => twitterhdfs}/.gitignore (100%) rename spring-cloud/spring-cloud-stream-starters/{boot => twitterhdfs}/pom.xml (100%) rename spring-cloud/spring-cloud-stream-starters/{boot => twitterhdfs}/src/main/java/com/baeldung/twitterhdfs/aggregate/AggregateApp.java (100%) rename spring-cloud/spring-cloud-stream-starters/{boot => twitterhdfs}/src/main/java/com/baeldung/twitterhdfs/processor/ProcessorApp.java (100%) rename spring-cloud/spring-cloud-stream-starters/{boot => twitterhdfs}/src/main/java/com/baeldung/twitterhdfs/sink/SinkApp.java (100%) rename spring-cloud/spring-cloud-stream-starters/{boot => twitterhdfs}/src/main/java/com/baeldung/twitterhdfs/source/SourceApp.java (100%) rename spring-cloud/spring-cloud-stream-starters/{boot => twitterhdfs}/src/main/resources/application.properties (100%) rename {spring-data-5-reactive => spring-cloud/spring-cloud-stream-starters/twitterhdfs}/src/main/resources/logback.xml (100%) rename spring-remoting/remoting-hessian-burlap/{client => remoting-hessian-burlap-client}/pom.xml (100%) rename spring-remoting/remoting-hessian-burlap/{client => remoting-hessian-burlap-client}/src/main/java/com/baeldung/client/BurlapClient.java (100%) rename spring-remoting/remoting-hessian-burlap/{client => remoting-hessian-burlap-client}/src/main/java/com/baeldung/client/HessianClient.java (100%) rename spring-remoting/remoting-hessian-burlap/{client => remoting-hessian-burlap-client}/src/main/resources/logback.xml (100%) rename spring-remoting/remoting-hessian-burlap/{client => remoting-hessian-burlap-client}/src/test/java/com/baeldung/client/CabBookingServiceIntegrationTest.java (100%) rename spring-remoting/remoting-hessian-burlap/{client => remoting-hessian-burlap-client}/src/test/resources/application.properties (100%) rename spring-remoting/remoting-hessian-burlap/{server => remoting-hessian-burlap-server}/pom.xml (100%) rename spring-remoting/remoting-hessian-burlap/{server => remoting-hessian-burlap-server}/src/main/java/com/baeldung/server/Server.java (100%) rename spring-remoting/remoting-hessian-burlap/{server => remoting-hessian-burlap-server}/src/main/resources/logback.xml (100%) rename spring-remoting/remoting-http/{api => remoting-http-api}/pom.xml (75%) rename spring-remoting/remoting-http/{api => remoting-http-api}/src/main/java/com/baeldung/api/Booking.java (100%) rename spring-remoting/remoting-http/{api => remoting-http-api}/src/main/java/com/baeldung/api/BookingException.java (100%) rename spring-remoting/remoting-http/{api => remoting-http-api}/src/main/java/com/baeldung/api/CabBookingService.java (100%) rename spring-remoting/remoting-http/{client => remoting-http-client}/pom.xml (89%) rename spring-remoting/remoting-http/{client => remoting-http-client}/src/main/java/com/baeldug/client/Client.java (100%) rename spring-remoting/remoting-http/{client => remoting-http-client}/src/main/resources/logback.xml (100%) rename spring-remoting/remoting-http/{server => remoting-http-server}/pom.xml (87%) rename spring-remoting/remoting-http/{server => remoting-http-server}/readme.md (100%) rename spring-remoting/remoting-http/{server => remoting-http-server}/src/main/java/com/baeldung/server/CabBookingServiceImpl.java (100%) rename spring-remoting/remoting-http/{server => remoting-http-server}/src/main/java/com/baeldung/server/Server.java (100%) rename spring-remoting/remoting-http/{server => remoting-http-server}/src/main/resources/logback.xml (100%) rename spring-remoting/{spring-remoting-rmi => remoting-rmi}/pom.xml (86%) rename spring-remoting/{spring-remoting-rmi => remoting-rmi}/remoting-rmi-client/pom.xml (94%) rename spring-remoting/{spring-remoting-rmi => remoting-rmi}/remoting-rmi-client/src/main/java/com/baeldung/client/RmiClient.java (100%) rename spring-remoting/{spring-remoting-rmi => remoting-rmi}/remoting-rmi-client/src/main/resources/logback.xml (100%) rename spring-remoting/{spring-remoting-rmi => remoting-rmi}/remoting-rmi-server/pom.xml (95%) rename spring-remoting/{spring-remoting-rmi => remoting-rmi}/remoting-rmi-server/src/main/java/com/baeldung/server/CabBookingServiceImpl.java (100%) rename spring-remoting/{spring-remoting-rmi => remoting-rmi}/remoting-rmi-server/src/main/java/com/baeldung/server/RmiServer.java (100%) rename spring-remoting/{spring-remoting-rmi => remoting-rmi}/remoting-rmi-server/src/main/resources/logback.xml (100%) diff --git a/pom.xml b/pom.xml index ad2f607141..d10d31365b 100644 --- a/pom.xml +++ b/pom.xml @@ -445,6 +445,7 @@ spark-java spring-4 spring-5 + spring-5-data-reactive spring-5-reactive spring-5-reactive-security spring-5-reactive-client @@ -463,6 +464,7 @@ spring-boot-keycloak spring-boot-bootstrap spring-boot-admin + spring-boot-camel spring-boot-ops spring-boot-persistence spring-boot-security @@ -552,6 +554,7 @@ spring-thymeleaf spring-userservice spring-zuul + spring-remoting spring-reactor spring-vertx spring-jinq @@ -707,6 +710,7 @@ spark-java spring-4 spring-5 + spring-5-data-reactive spring-5-reactive spring-5-reactive-security spring-5-reactive-client @@ -731,6 +735,7 @@ spring-boot-keycloak spring-boot-bootstrap spring-boot-admin + spring-boot-camel spring-boot-ops spring-boot-persistence spring-boot-security @@ -993,6 +998,7 @@ persistence-modules/solr spark-java spring-4 + spring-5-data-reactive spring-5-reactive spring-5-reactive-security spring-5-reactive-client @@ -1009,6 +1015,7 @@ spring-boot-keycloak spring-boot-bootstrap spring-boot-admin + spring-boot-camel spring-boot-persistence spring-boot-security spring-boot-mvc @@ -1092,6 +1099,7 @@ spring-thymeleaf spring-userservice spring-zuul + spring-remoting spring-reactor spring-vertx spring-jinq diff --git a/spring-data-5-reactive/README.md b/spring-5-data-reactive/README.md similarity index 100% rename from spring-data-5-reactive/README.md rename to spring-5-data-reactive/README.md diff --git a/spring-data-5-reactive/pom.xml b/spring-5-data-reactive/pom.xml similarity index 100% rename from spring-data-5-reactive/pom.xml rename to spring-5-data-reactive/pom.xml diff --git a/spring-data-5-reactive/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java b/spring-5-data-reactive/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java similarity index 100% rename from spring-data-5-reactive/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java rename to spring-5-data-reactive/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java diff --git a/spring-data-5-reactive/src/main/java/com/baeldung/reactive/model/Account.java b/spring-5-data-reactive/src/main/java/com/baeldung/reactive/model/Account.java similarity index 100% rename from spring-data-5-reactive/src/main/java/com/baeldung/reactive/model/Account.java rename to spring-5-data-reactive/src/main/java/com/baeldung/reactive/model/Account.java diff --git a/spring-data-5-reactive/src/main/java/com/baeldung/reactive/repository/AccountCrudRepository.java b/spring-5-data-reactive/src/main/java/com/baeldung/reactive/repository/AccountCrudRepository.java similarity index 100% rename from spring-data-5-reactive/src/main/java/com/baeldung/reactive/repository/AccountCrudRepository.java rename to spring-5-data-reactive/src/main/java/com/baeldung/reactive/repository/AccountCrudRepository.java diff --git a/spring-data-5-reactive/src/main/java/com/baeldung/reactive/repository/AccountMongoRepository.java b/spring-5-data-reactive/src/main/java/com/baeldung/reactive/repository/AccountMongoRepository.java similarity index 100% rename from spring-data-5-reactive/src/main/java/com/baeldung/reactive/repository/AccountMongoRepository.java rename to spring-5-data-reactive/src/main/java/com/baeldung/reactive/repository/AccountMongoRepository.java diff --git a/spring-data-5-reactive/src/main/java/com/baeldung/reactive/repository/AccountRxJavaRepository.java b/spring-5-data-reactive/src/main/java/com/baeldung/reactive/repository/AccountRxJavaRepository.java similarity index 100% rename from spring-data-5-reactive/src/main/java/com/baeldung/reactive/repository/AccountRxJavaRepository.java rename to spring-5-data-reactive/src/main/java/com/baeldung/reactive/repository/AccountRxJavaRepository.java diff --git a/spring-data-5-reactive/src/main/java/com/baeldung/reactive/template/AccountTemplateOperations.java b/spring-5-data-reactive/src/main/java/com/baeldung/reactive/template/AccountTemplateOperations.java similarity index 100% rename from spring-data-5-reactive/src/main/java/com/baeldung/reactive/template/AccountTemplateOperations.java rename to spring-5-data-reactive/src/main/java/com/baeldung/reactive/template/AccountTemplateOperations.java diff --git a/spring-data-5-reactive/src/main/kotlin/com/baeldung/Application.kt b/spring-5-data-reactive/src/main/kotlin/com/baeldung/Application.kt similarity index 100% rename from spring-data-5-reactive/src/main/kotlin/com/baeldung/Application.kt rename to spring-5-data-reactive/src/main/kotlin/com/baeldung/Application.kt diff --git a/spring-data-5-reactive/src/main/kotlin/com/baeldung/Event.kt b/spring-5-data-reactive/src/main/kotlin/com/baeldung/Event.kt similarity index 100% rename from spring-data-5-reactive/src/main/kotlin/com/baeldung/Event.kt rename to spring-5-data-reactive/src/main/kotlin/com/baeldung/Event.kt diff --git a/spring-data-5-reactive/src/main/kotlin/com/baeldung/EventRepository.kt b/spring-5-data-reactive/src/main/kotlin/com/baeldung/EventRepository.kt similarity index 100% rename from spring-data-5-reactive/src/main/kotlin/com/baeldung/EventRepository.kt rename to spring-5-data-reactive/src/main/kotlin/com/baeldung/EventRepository.kt diff --git a/spring-data-5-reactive/src/main/kotlin/com/baeldung/MongoConfig.kt b/spring-5-data-reactive/src/main/kotlin/com/baeldung/MongoConfig.kt similarity index 100% rename from spring-data-5-reactive/src/main/kotlin/com/baeldung/MongoConfig.kt rename to spring-5-data-reactive/src/main/kotlin/com/baeldung/MongoConfig.kt diff --git a/spring-data-5-reactive/src/main/kotlin/com/baeldung/SendEmitter.kt b/spring-5-data-reactive/src/main/kotlin/com/baeldung/SendEmitter.kt similarity index 100% rename from spring-data-5-reactive/src/main/kotlin/com/baeldung/SendEmitter.kt rename to spring-5-data-reactive/src/main/kotlin/com/baeldung/SendEmitter.kt diff --git a/spring-cloud/spring-cloud-stream-starters/boot/src/main/resources/logback.xml b/spring-5-data-reactive/src/main/resources/logback.xml similarity index 100% rename from spring-cloud/spring-cloud-stream-starters/boot/src/main/resources/logback.xml rename to spring-5-data-reactive/src/main/resources/logback.xml diff --git a/spring-data-5-reactive/src/main/resources/static/index.html b/spring-5-data-reactive/src/main/resources/static/index.html similarity index 100% rename from spring-data-5-reactive/src/main/resources/static/index.html rename to spring-5-data-reactive/src/main/resources/static/index.html diff --git a/spring-data-5-reactive/src/test/java/com/baeldung/reactive/repository/AccountCrudRepositoryIntegrationTest.java b/spring-5-data-reactive/src/test/java/com/baeldung/reactive/repository/AccountCrudRepositoryIntegrationTest.java similarity index 100% rename from spring-data-5-reactive/src/test/java/com/baeldung/reactive/repository/AccountCrudRepositoryIntegrationTest.java rename to spring-5-data-reactive/src/test/java/com/baeldung/reactive/repository/AccountCrudRepositoryIntegrationTest.java diff --git a/spring-data-5-reactive/src/test/java/com/baeldung/reactive/repository/AccountMongoRepositoryIntegrationTest.java b/spring-5-data-reactive/src/test/java/com/baeldung/reactive/repository/AccountMongoRepositoryIntegrationTest.java similarity index 100% rename from spring-data-5-reactive/src/test/java/com/baeldung/reactive/repository/AccountMongoRepositoryIntegrationTest.java rename to spring-5-data-reactive/src/test/java/com/baeldung/reactive/repository/AccountMongoRepositoryIntegrationTest.java diff --git a/spring-data-5-reactive/src/test/java/com/baeldung/reactive/repository/AccountRxJavaRepositoryIntegrationTest.java b/spring-5-data-reactive/src/test/java/com/baeldung/reactive/repository/AccountRxJavaRepositoryIntegrationTest.java similarity index 100% rename from spring-data-5-reactive/src/test/java/com/baeldung/reactive/repository/AccountRxJavaRepositoryIntegrationTest.java rename to spring-5-data-reactive/src/test/java/com/baeldung/reactive/repository/AccountRxJavaRepositoryIntegrationTest.java diff --git a/spring-data-5-reactive/src/test/java/com/baeldung/reactive/template/AccountTemplateOperationsIntegrationTest.java b/spring-5-data-reactive/src/test/java/com/baeldung/reactive/template/AccountTemplateOperationsIntegrationTest.java similarity index 100% rename from spring-data-5-reactive/src/test/java/com/baeldung/reactive/template/AccountTemplateOperationsIntegrationTest.java rename to spring-5-data-reactive/src/test/java/com/baeldung/reactive/template/AccountTemplateOperationsIntegrationTest.java diff --git a/camel-api/README.md b/spring-boot-camel/README.md similarity index 100% rename from camel-api/README.md rename to spring-boot-camel/README.md diff --git a/camel-api/pom.xml b/spring-boot-camel/pom.xml similarity index 100% rename from camel-api/pom.xml rename to spring-boot-camel/pom.xml diff --git a/camel-api/src/main/java/com/baeldung/camel/Application.java b/spring-boot-camel/src/main/java/com/baeldung/camel/Application.java similarity index 100% rename from camel-api/src/main/java/com/baeldung/camel/Application.java rename to spring-boot-camel/src/main/java/com/baeldung/camel/Application.java diff --git a/camel-api/src/main/java/com/baeldung/camel/ExampleServices.java b/spring-boot-camel/src/main/java/com/baeldung/camel/ExampleServices.java similarity index 100% rename from camel-api/src/main/java/com/baeldung/camel/ExampleServices.java rename to spring-boot-camel/src/main/java/com/baeldung/camel/ExampleServices.java diff --git a/camel-api/src/main/java/com/baeldung/camel/MyBean.java b/spring-boot-camel/src/main/java/com/baeldung/camel/MyBean.java similarity index 100% rename from camel-api/src/main/java/com/baeldung/camel/MyBean.java rename to spring-boot-camel/src/main/java/com/baeldung/camel/MyBean.java diff --git a/camel-api/src/main/resources/application.properties b/spring-boot-camel/src/main/resources/application.properties similarity index 100% rename from camel-api/src/main/resources/application.properties rename to spring-boot-camel/src/main/resources/application.properties diff --git a/camel-api/src/main/resources/application.yml b/spring-boot-camel/src/main/resources/application.yml similarity index 100% rename from camel-api/src/main/resources/application.yml rename to spring-boot-camel/src/main/resources/application.yml diff --git a/camel-api/src/main/resources/logback.xml b/spring-boot-camel/src/main/resources/logback.xml similarity index 100% rename from camel-api/src/main/resources/logback.xml rename to spring-boot-camel/src/main/resources/logback.xml diff --git a/spring-cloud/pom.xml b/spring-cloud/pom.xml index 1fdab4213c..7d180047de 100644 --- a/spring-cloud/pom.xml +++ b/spring-cloud/pom.xml @@ -25,6 +25,7 @@ spring-cloud-zookeeper spring-cloud-gateway spring-cloud-stream + spring-cloud-stream-starters/twitterhdfs spring-cloud-connectors-heroku spring-cloud-aws spring-cloud-consul diff --git a/spring-cloud/spring-cloud-stream-starters/twitter/twitter b/spring-cloud/spring-cloud-stream-starters/twitter/twitter new file mode 160000 index 0000000000..f9673ef0c1 --- /dev/null +++ b/spring-cloud/spring-cloud-stream-starters/twitter/twitter @@ -0,0 +1 @@ +Subproject commit f9673ef0c11c51b327555aaca61ee196935f998b diff --git a/spring-cloud/spring-cloud-stream-starters/boot/.gitignore b/spring-cloud/spring-cloud-stream-starters/twitterhdfs/.gitignore similarity index 100% rename from spring-cloud/spring-cloud-stream-starters/boot/.gitignore rename to spring-cloud/spring-cloud-stream-starters/twitterhdfs/.gitignore diff --git a/spring-cloud/spring-cloud-stream-starters/boot/pom.xml b/spring-cloud/spring-cloud-stream-starters/twitterhdfs/pom.xml similarity index 100% rename from spring-cloud/spring-cloud-stream-starters/boot/pom.xml rename to spring-cloud/spring-cloud-stream-starters/twitterhdfs/pom.xml diff --git a/spring-cloud/spring-cloud-stream-starters/boot/src/main/java/com/baeldung/twitterhdfs/aggregate/AggregateApp.java b/spring-cloud/spring-cloud-stream-starters/twitterhdfs/src/main/java/com/baeldung/twitterhdfs/aggregate/AggregateApp.java similarity index 100% rename from spring-cloud/spring-cloud-stream-starters/boot/src/main/java/com/baeldung/twitterhdfs/aggregate/AggregateApp.java rename to spring-cloud/spring-cloud-stream-starters/twitterhdfs/src/main/java/com/baeldung/twitterhdfs/aggregate/AggregateApp.java diff --git a/spring-cloud/spring-cloud-stream-starters/boot/src/main/java/com/baeldung/twitterhdfs/processor/ProcessorApp.java b/spring-cloud/spring-cloud-stream-starters/twitterhdfs/src/main/java/com/baeldung/twitterhdfs/processor/ProcessorApp.java similarity index 100% rename from spring-cloud/spring-cloud-stream-starters/boot/src/main/java/com/baeldung/twitterhdfs/processor/ProcessorApp.java rename to spring-cloud/spring-cloud-stream-starters/twitterhdfs/src/main/java/com/baeldung/twitterhdfs/processor/ProcessorApp.java diff --git a/spring-cloud/spring-cloud-stream-starters/boot/src/main/java/com/baeldung/twitterhdfs/sink/SinkApp.java b/spring-cloud/spring-cloud-stream-starters/twitterhdfs/src/main/java/com/baeldung/twitterhdfs/sink/SinkApp.java similarity index 100% rename from spring-cloud/spring-cloud-stream-starters/boot/src/main/java/com/baeldung/twitterhdfs/sink/SinkApp.java rename to spring-cloud/spring-cloud-stream-starters/twitterhdfs/src/main/java/com/baeldung/twitterhdfs/sink/SinkApp.java diff --git a/spring-cloud/spring-cloud-stream-starters/boot/src/main/java/com/baeldung/twitterhdfs/source/SourceApp.java b/spring-cloud/spring-cloud-stream-starters/twitterhdfs/src/main/java/com/baeldung/twitterhdfs/source/SourceApp.java similarity index 100% rename from spring-cloud/spring-cloud-stream-starters/boot/src/main/java/com/baeldung/twitterhdfs/source/SourceApp.java rename to spring-cloud/spring-cloud-stream-starters/twitterhdfs/src/main/java/com/baeldung/twitterhdfs/source/SourceApp.java diff --git a/spring-cloud/spring-cloud-stream-starters/boot/src/main/resources/application.properties b/spring-cloud/spring-cloud-stream-starters/twitterhdfs/src/main/resources/application.properties similarity index 100% rename from spring-cloud/spring-cloud-stream-starters/boot/src/main/resources/application.properties rename to spring-cloud/spring-cloud-stream-starters/twitterhdfs/src/main/resources/application.properties diff --git a/spring-data-5-reactive/src/main/resources/logback.xml b/spring-cloud/spring-cloud-stream-starters/twitterhdfs/src/main/resources/logback.xml similarity index 100% rename from spring-data-5-reactive/src/main/resources/logback.xml rename to spring-cloud/spring-cloud-stream-starters/twitterhdfs/src/main/resources/logback.xml diff --git a/spring-remoting/pom.xml b/spring-remoting/pom.xml index 8db51e2a16..9f05bc91d2 100644 --- a/spring-remoting/pom.xml +++ b/spring-remoting/pom.xml @@ -32,7 +32,7 @@ remoting-hessian-burlap remoting-amqp remoting-jms - spring-remoting-rmi + remoting-rmi \ No newline at end of file diff --git a/spring-remoting/remoting-hessian-burlap/pom.xml b/spring-remoting/remoting-hessian-burlap/pom.xml index 682e460880..6cb5a51812 100644 --- a/spring-remoting/remoting-hessian-burlap/pom.xml +++ b/spring-remoting/remoting-hessian-burlap/pom.xml @@ -2,19 +2,18 @@ - + 4.0.0 + remoting-hessian-burlap + pom + + spring-remoting com.baeldung 1.0-SNAPSHOT - pom + - server - client + remoting-hessian-burlap-server + remoting-hessian-burlap-client - 4.0.0 - - remoting-hessian-burlap - - \ No newline at end of file diff --git a/spring-remoting/remoting-hessian-burlap/client/pom.xml b/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-client/pom.xml similarity index 100% rename from spring-remoting/remoting-hessian-burlap/client/pom.xml rename to spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-client/pom.xml diff --git a/spring-remoting/remoting-hessian-burlap/client/src/main/java/com/baeldung/client/BurlapClient.java b/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-client/src/main/java/com/baeldung/client/BurlapClient.java similarity index 100% rename from spring-remoting/remoting-hessian-burlap/client/src/main/java/com/baeldung/client/BurlapClient.java rename to spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-client/src/main/java/com/baeldung/client/BurlapClient.java diff --git a/spring-remoting/remoting-hessian-burlap/client/src/main/java/com/baeldung/client/HessianClient.java b/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-client/src/main/java/com/baeldung/client/HessianClient.java similarity index 100% rename from spring-remoting/remoting-hessian-burlap/client/src/main/java/com/baeldung/client/HessianClient.java rename to spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-client/src/main/java/com/baeldung/client/HessianClient.java diff --git a/spring-remoting/remoting-hessian-burlap/client/src/main/resources/logback.xml b/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-client/src/main/resources/logback.xml similarity index 100% rename from spring-remoting/remoting-hessian-burlap/client/src/main/resources/logback.xml rename to spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-client/src/main/resources/logback.xml diff --git a/spring-remoting/remoting-hessian-burlap/client/src/test/java/com/baeldung/client/CabBookingServiceIntegrationTest.java b/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-client/src/test/java/com/baeldung/client/CabBookingServiceIntegrationTest.java similarity index 100% rename from spring-remoting/remoting-hessian-burlap/client/src/test/java/com/baeldung/client/CabBookingServiceIntegrationTest.java rename to spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-client/src/test/java/com/baeldung/client/CabBookingServiceIntegrationTest.java diff --git a/spring-remoting/remoting-hessian-burlap/client/src/test/resources/application.properties b/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-client/src/test/resources/application.properties similarity index 100% rename from spring-remoting/remoting-hessian-burlap/client/src/test/resources/application.properties rename to spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-client/src/test/resources/application.properties diff --git a/spring-remoting/remoting-hessian-burlap/server/pom.xml b/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-server/pom.xml similarity index 100% rename from spring-remoting/remoting-hessian-burlap/server/pom.xml rename to spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-server/pom.xml diff --git a/spring-remoting/remoting-hessian-burlap/server/src/main/java/com/baeldung/server/Server.java b/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-server/src/main/java/com/baeldung/server/Server.java similarity index 100% rename from spring-remoting/remoting-hessian-burlap/server/src/main/java/com/baeldung/server/Server.java rename to spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-server/src/main/java/com/baeldung/server/Server.java diff --git a/spring-remoting/remoting-hessian-burlap/server/src/main/resources/logback.xml b/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-server/src/main/resources/logback.xml similarity index 100% rename from spring-remoting/remoting-hessian-burlap/server/src/main/resources/logback.xml rename to spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-server/src/main/resources/logback.xml diff --git a/spring-remoting/remoting-http/pom.xml b/spring-remoting/remoting-http/pom.xml index 95b5ad3e14..3262736ec8 100644 --- a/spring-remoting/remoting-http/pom.xml +++ b/spring-remoting/remoting-http/pom.xml @@ -3,17 +3,19 @@ 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 - remoting-http - 1.0-SNAPSHOT - - spring-remoting-http + remoting-http Parent for all modules related to HTTP Spring Remoting. pom + + + com.baeldung + spring-remoting + 1.0-SNAPSHOT + + - server - client - api + remoting-http-server + remoting-http-client + remoting-http-api \ No newline at end of file diff --git a/spring-remoting/remoting-http/api/pom.xml b/spring-remoting/remoting-http/remoting-http-api/pom.xml similarity index 75% rename from spring-remoting/remoting-http/api/pom.xml rename to spring-remoting/remoting-http/remoting-http-api/pom.xml index 633217f7de..579255060d 100644 --- a/spring-remoting/remoting-http/api/pom.xml +++ b/spring-remoting/remoting-http/remoting-http-api/pom.xml @@ -2,13 +2,15 @@ - - spring-remoting-http + 4.0.0 + remoting-http-api + remoting-http-api + API definition shared between client and server. + + + remoting-http com.baeldung 1.0-SNAPSHOT - 4.0.0 - api - spring-remoting-http-api - API definition shared between client and server. + \ No newline at end of file diff --git a/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/Booking.java b/spring-remoting/remoting-http/remoting-http-api/src/main/java/com/baeldung/api/Booking.java similarity index 100% rename from spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/Booking.java rename to spring-remoting/remoting-http/remoting-http-api/src/main/java/com/baeldung/api/Booking.java diff --git a/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/BookingException.java b/spring-remoting/remoting-http/remoting-http-api/src/main/java/com/baeldung/api/BookingException.java similarity index 100% rename from spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/BookingException.java rename to spring-remoting/remoting-http/remoting-http-api/src/main/java/com/baeldung/api/BookingException.java diff --git a/spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/CabBookingService.java b/spring-remoting/remoting-http/remoting-http-api/src/main/java/com/baeldung/api/CabBookingService.java similarity index 100% rename from spring-remoting/remoting-http/api/src/main/java/com/baeldung/api/CabBookingService.java rename to spring-remoting/remoting-http/remoting-http-api/src/main/java/com/baeldung/api/CabBookingService.java diff --git a/spring-remoting/remoting-http/client/pom.xml b/spring-remoting/remoting-http/remoting-http-client/pom.xml similarity index 89% rename from spring-remoting/remoting-http/client/pom.xml rename to spring-remoting/remoting-http/remoting-http-client/pom.xml index 94a536fc18..f297a81e2b 100644 --- a/spring-remoting/remoting-http/client/pom.xml +++ b/spring-remoting/remoting-http/remoting-http-client/pom.xml @@ -3,14 +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 - + remoting-http-client + Shows how to invoke a remote service using Spring Remoting HTTP. + com.baeldung - spring-remoting-http + remoting-http 1.0-SNAPSHOT - spring-remoting-http-client - Shows how to invoke a remote service using Spring Remoting HTTP. + org.springframework.boot diff --git a/spring-remoting/remoting-http/client/src/main/java/com/baeldug/client/Client.java b/spring-remoting/remoting-http/remoting-http-client/src/main/java/com/baeldug/client/Client.java similarity index 100% rename from spring-remoting/remoting-http/client/src/main/java/com/baeldug/client/Client.java rename to spring-remoting/remoting-http/remoting-http-client/src/main/java/com/baeldug/client/Client.java diff --git a/spring-remoting/remoting-http/client/src/main/resources/logback.xml b/spring-remoting/remoting-http/remoting-http-client/src/main/resources/logback.xml similarity index 100% rename from spring-remoting/remoting-http/client/src/main/resources/logback.xml rename to spring-remoting/remoting-http/remoting-http-client/src/main/resources/logback.xml diff --git a/spring-remoting/remoting-http/server/pom.xml b/spring-remoting/remoting-http/remoting-http-server/pom.xml similarity index 87% rename from spring-remoting/remoting-http/server/pom.xml rename to spring-remoting/remoting-http/remoting-http-server/pom.xml index 517f4451f7..36add406c4 100644 --- a/spring-remoting/remoting-http/server/pom.xml +++ b/spring-remoting/remoting-http/remoting-http-server/pom.xml @@ -3,13 +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 + remoting-http-server + Shows how to expose a service using Spring Remoting HTTP. + com.baeldung - spring-remoting-http + remoting-http 1.0-SNAPSHOT - spring-remoting-http-server - Shows how to expose a service using Spring Remoting HTTP. + org.springframework.boot diff --git a/spring-remoting/remoting-http/server/readme.md b/spring-remoting/remoting-http/remoting-http-server/readme.md similarity index 100% rename from spring-remoting/remoting-http/server/readme.md rename to spring-remoting/remoting-http/remoting-http-server/readme.md diff --git a/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/CabBookingServiceImpl.java b/spring-remoting/remoting-http/remoting-http-server/src/main/java/com/baeldung/server/CabBookingServiceImpl.java similarity index 100% rename from spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/CabBookingServiceImpl.java rename to spring-remoting/remoting-http/remoting-http-server/src/main/java/com/baeldung/server/CabBookingServiceImpl.java diff --git a/spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/Server.java b/spring-remoting/remoting-http/remoting-http-server/src/main/java/com/baeldung/server/Server.java similarity index 100% rename from spring-remoting/remoting-http/server/src/main/java/com/baeldung/server/Server.java rename to spring-remoting/remoting-http/remoting-http-server/src/main/java/com/baeldung/server/Server.java diff --git a/spring-remoting/remoting-http/server/src/main/resources/logback.xml b/spring-remoting/remoting-http/remoting-http-server/src/main/resources/logback.xml similarity index 100% rename from spring-remoting/remoting-http/server/src/main/resources/logback.xml rename to spring-remoting/remoting-http/remoting-http-server/src/main/resources/logback.xml diff --git a/spring-remoting/spring-remoting-rmi/pom.xml b/spring-remoting/remoting-rmi/pom.xml similarity index 86% rename from spring-remoting/spring-remoting-rmi/pom.xml rename to spring-remoting/remoting-rmi/pom.xml index 723158775f..cd15a6ec60 100644 --- a/spring-remoting/spring-remoting-rmi/pom.xml +++ b/spring-remoting/remoting-rmi/pom.xml @@ -2,18 +2,18 @@ - + 4.0.0 + pom + remoting-rmi + + spring-remoting com.baeldung 1.0-SNAPSHOT - 4.0.0 - pom - + + remoting-rmi-server remoting-rmi-client - spring-remoting-rmi - - \ No newline at end of file diff --git a/spring-remoting/spring-remoting-rmi/remoting-rmi-client/pom.xml b/spring-remoting/remoting-rmi/remoting-rmi-client/pom.xml similarity index 94% rename from spring-remoting/spring-remoting-rmi/remoting-rmi-client/pom.xml rename to spring-remoting/remoting-rmi/remoting-rmi-client/pom.xml index 003976dc7b..4eb9d6cc43 100644 --- a/spring-remoting/spring-remoting-rmi/remoting-rmi-client/pom.xml +++ b/spring-remoting/remoting-rmi/remoting-rmi-client/pom.xml @@ -3,7 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - spring-remoting-rmi + remoting-rmi com.baeldung 1.0-SNAPSHOT diff --git a/spring-remoting/spring-remoting-rmi/remoting-rmi-client/src/main/java/com/baeldung/client/RmiClient.java b/spring-remoting/remoting-rmi/remoting-rmi-client/src/main/java/com/baeldung/client/RmiClient.java similarity index 100% rename from spring-remoting/spring-remoting-rmi/remoting-rmi-client/src/main/java/com/baeldung/client/RmiClient.java rename to spring-remoting/remoting-rmi/remoting-rmi-client/src/main/java/com/baeldung/client/RmiClient.java diff --git a/spring-remoting/spring-remoting-rmi/remoting-rmi-client/src/main/resources/logback.xml b/spring-remoting/remoting-rmi/remoting-rmi-client/src/main/resources/logback.xml similarity index 100% rename from spring-remoting/spring-remoting-rmi/remoting-rmi-client/src/main/resources/logback.xml rename to spring-remoting/remoting-rmi/remoting-rmi-client/src/main/resources/logback.xml diff --git a/spring-remoting/spring-remoting-rmi/remoting-rmi-server/pom.xml b/spring-remoting/remoting-rmi/remoting-rmi-server/pom.xml similarity index 95% rename from spring-remoting/spring-remoting-rmi/remoting-rmi-server/pom.xml rename to spring-remoting/remoting-rmi/remoting-rmi-server/pom.xml index f1633e5dc2..335d007441 100644 --- a/spring-remoting/spring-remoting-rmi/remoting-rmi-server/pom.xml +++ b/spring-remoting/remoting-rmi/remoting-rmi-server/pom.xml @@ -3,7 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - spring-remoting-rmi + remoting-rmi com.baeldung 1.0-SNAPSHOT diff --git a/spring-remoting/spring-remoting-rmi/remoting-rmi-server/src/main/java/com/baeldung/server/CabBookingServiceImpl.java b/spring-remoting/remoting-rmi/remoting-rmi-server/src/main/java/com/baeldung/server/CabBookingServiceImpl.java similarity index 100% rename from spring-remoting/spring-remoting-rmi/remoting-rmi-server/src/main/java/com/baeldung/server/CabBookingServiceImpl.java rename to spring-remoting/remoting-rmi/remoting-rmi-server/src/main/java/com/baeldung/server/CabBookingServiceImpl.java diff --git a/spring-remoting/spring-remoting-rmi/remoting-rmi-server/src/main/java/com/baeldung/server/RmiServer.java b/spring-remoting/remoting-rmi/remoting-rmi-server/src/main/java/com/baeldung/server/RmiServer.java similarity index 100% rename from spring-remoting/spring-remoting-rmi/remoting-rmi-server/src/main/java/com/baeldung/server/RmiServer.java rename to spring-remoting/remoting-rmi/remoting-rmi-server/src/main/java/com/baeldung/server/RmiServer.java diff --git a/spring-remoting/spring-remoting-rmi/remoting-rmi-server/src/main/resources/logback.xml b/spring-remoting/remoting-rmi/remoting-rmi-server/src/main/resources/logback.xml similarity index 100% rename from spring-remoting/spring-remoting-rmi/remoting-rmi-server/src/main/resources/logback.xml rename to spring-remoting/remoting-rmi/remoting-rmi-server/src/main/resources/logback.xml From 5f0cc2716e190572e4aca565d21e79405bb451f9 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Tue, 4 Sep 2018 22:36:54 +0530 Subject: [PATCH 107/128] BAEL-2304 Improve webflux original article - Added snippets for spring reactive functional tutorial --- .../functional/EmployeeFunctionalConfig.java | 75 +++++++++++++++++++ .../EmployeeSpringFunctionalApplication.java | 13 ++++ ...ployeeSpringFunctionalIntegrationTest.java | 28 +++++++ 3 files changed, 116 insertions(+) create mode 100644 spring-5-reactive-security/src/main/java/com/baeldung/reactive/functional/EmployeeFunctionalConfig.java create mode 100644 spring-5-reactive-security/src/main/java/com/baeldung/reactive/functional/EmployeeSpringFunctionalApplication.java create mode 100644 spring-5-reactive-security/src/test/java/com/baeldung/reactive/functional/EmployeeSpringFunctionalIntegrationTest.java diff --git a/spring-5-reactive-security/src/main/java/com/baeldung/reactive/functional/EmployeeFunctionalConfig.java b/spring-5-reactive-security/src/main/java/com/baeldung/reactive/functional/EmployeeFunctionalConfig.java new file mode 100644 index 0000000000..8d7860ccdc --- /dev/null +++ b/spring-5-reactive-security/src/main/java/com/baeldung/reactive/functional/EmployeeFunctionalConfig.java @@ -0,0 +1,75 @@ +package com.baeldung.reactive.functional; + +import static org.springframework.web.reactive.function.BodyExtractors.toMono; +import static org.springframework.web.reactive.function.server.RequestPredicates.GET; +import static org.springframework.web.reactive.function.server.RequestPredicates.POST; +import static org.springframework.web.reactive.function.server.RouterFunctions.route; +import static org.springframework.web.reactive.function.server.ServerResponse.ok; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.web.server.ServerHttpSecurity; +import org.springframework.security.web.server.SecurityWebFilterChain; +import org.springframework.web.reactive.function.server.RouterFunction; +import org.springframework.web.reactive.function.server.ServerResponse; + +import com.baeldung.webflux.Employee; +import com.baeldung.webflux.EmployeeRepository; + +@Configuration +public class EmployeeFunctionalConfig { + + @Bean + EmployeeRepository employeeRepository() { + return new EmployeeRepository(); + } + + @Bean + RouterFunction getAllEmployeesRoute() { + return route(GET("/employees"), + req -> ok().body( + employeeRepository().findAllEmployees(), Employee.class)); + } + + @Bean + RouterFunction getEmployeeByIdRoute() { + return route(GET("/employees/{id}"), + req -> ok().body( + employeeRepository().findEmployeeById(req.pathVariable("id")), Employee.class)); + } + + @Bean + RouterFunction updateEmployee() { + return route(POST("/employees/update"), + req -> req.body(toMono(Employee.class)) + .doOnNext(employeeRepository()::updateEmployee) + .then(ok().build())); + } + + @Bean + RouterFunction composedRoutes() { + return + route(GET("/employees"), + req -> ok().body( + employeeRepository().findAllEmployees(), Employee.class)) + + .and(route(GET("/employees/{id}"), + req -> ok().body( + employeeRepository().findEmployeeById(req.pathVariable("id")), Employee.class))) + + .and(route(POST("/employees/update"), + req -> req.body(toMono(Employee.class)) + .doOnNext(employeeRepository()::updateEmployee) + .then(ok().build()))); + } + + @Bean + public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { + http.csrf() + .disable() + .authorizeExchange() + .anyExchange() + .permitAll(); + return http.build(); + } +} diff --git a/spring-5-reactive-security/src/main/java/com/baeldung/reactive/functional/EmployeeSpringFunctionalApplication.java b/spring-5-reactive-security/src/main/java/com/baeldung/reactive/functional/EmployeeSpringFunctionalApplication.java new file mode 100644 index 0000000000..1f2bd871fc --- /dev/null +++ b/spring-5-reactive-security/src/main/java/com/baeldung/reactive/functional/EmployeeSpringFunctionalApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.reactive.functional; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class EmployeeSpringFunctionalApplication { + + public static void main(String[] args) { + SpringApplication.run(EmployeeSpringFunctionalApplication.class, args); + } + +} diff --git a/spring-5-reactive-security/src/test/java/com/baeldung/reactive/functional/EmployeeSpringFunctionalIntegrationTest.java b/spring-5-reactive-security/src/test/java/com/baeldung/reactive/functional/EmployeeSpringFunctionalIntegrationTest.java new file mode 100644 index 0000000000..1197820066 --- /dev/null +++ b/spring-5-reactive-security/src/test/java/com/baeldung/reactive/functional/EmployeeSpringFunctionalIntegrationTest.java @@ -0,0 +1,28 @@ +package com.baeldung.reactive.functional; + +import org.junit.Test; +import org.springframework.test.web.reactive.server.WebTestClient; + +import com.baeldung.webflux.Employee; + +public class EmployeeSpringFunctionalIntegrationTest { + + private static EmployeeFunctionalConfig config = new EmployeeFunctionalConfig(); + + @Test + public void givenEmployeeId_whenGetEmployeeById_thenCorrectEmployee() { + WebTestClient client = WebTestClient + .bindToRouterFunction(config.getEmployeeByIdRoute()) + .build(); + + Employee expected = new Employee("1", "Employee 1"); + + client.get() + .uri("/employees/1") + .exchange() + .expectStatus() + .isOk() + .expectBody(Employee.class) + .isEqualTo(expected); + } +} From 33e10ee41f71b64b646638b1e078d2dc40631d2b Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Tue, 4 Sep 2018 23:45:18 +0530 Subject: [PATCH 108/128] BAEL-8824 Align module names, folder names and artifact id - Fixed dependencies as per the new folder names --- .../remoting-amqp/remoting-amqp-client/pom.xml | 2 +- .../remoting-amqp/remoting-amqp-server/pom.xml | 8 ++++---- .../remoting-hessian-burlap-client/pom.xml | 3 ++- .../remoting-hessian-burlap-server/pom.xml | 2 +- .../remoting-http/remoting-http-client/pom.xml | 3 ++- .../remoting-http/remoting-http-server/pom.xml | 3 ++- spring-remoting/remoting-jms/remoting-jms-client/pom.xml | 3 ++- spring-remoting/remoting-jms/remoting-jms-server/pom.xml | 6 +----- spring-remoting/remoting-rmi/remoting-rmi-client/pom.xml | 3 ++- spring-remoting/remoting-rmi/remoting-rmi-server/pom.xml | 6 +----- 10 files changed, 18 insertions(+), 21 deletions(-) diff --git a/spring-remoting/remoting-amqp/remoting-amqp-client/pom.xml b/spring-remoting/remoting-amqp/remoting-amqp-client/pom.xml index b715327c28..98e0bc5df5 100644 --- a/spring-remoting/remoting-amqp/remoting-amqp-client/pom.xml +++ b/spring-remoting/remoting-amqp/remoting-amqp-client/pom.xml @@ -26,7 +26,7 @@ com.baeldung - api + remoting-http-api ${project.version} diff --git a/spring-remoting/remoting-amqp/remoting-amqp-server/pom.xml b/spring-remoting/remoting-amqp/remoting-amqp-server/pom.xml index a456ba8d2c..7fe276f824 100644 --- a/spring-remoting/remoting-amqp/remoting-amqp-server/pom.xml +++ b/spring-remoting/remoting-amqp/remoting-amqp-server/pom.xml @@ -16,7 +16,7 @@ com.baeldung - api + remoting-http-api ${project.version} @@ -25,13 +25,13 @@ com.baeldung - spring-remoting-http-server - ${spring-remoting-http-server.version} + remoting-http-server + ${remoting-http-server.version} - 1.0-SNAPSHOT + 1.0-SNAPSHOT diff --git a/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-client/pom.xml b/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-client/pom.xml index 1ae9b10019..f337d5e51f 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 @@ -24,7 +24,8 @@ ${project.groupId} - api + remoting-http-api + ${project.version} com.caucho 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 f1fed73ed8..5b6e03348f 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 @@ -14,7 +14,7 @@ com.baeldung - spring-remoting-http-server + remoting-http-server ${project.version} diff --git a/spring-remoting/remoting-http/remoting-http-client/pom.xml b/spring-remoting/remoting-http/remoting-http-client/pom.xml index f297a81e2b..9a6e98ffdd 100644 --- a/spring-remoting/remoting-http/remoting-http-client/pom.xml +++ b/spring-remoting/remoting-http/remoting-http-client/pom.xml @@ -25,7 +25,8 @@ ${project.groupId} - api + remoting-http-api + ${project.version} \ No newline at end of file diff --git a/spring-remoting/remoting-http/remoting-http-server/pom.xml b/spring-remoting/remoting-http/remoting-http-server/pom.xml index 36add406c4..53d27a5efa 100644 --- a/spring-remoting/remoting-http/remoting-http-server/pom.xml +++ b/spring-remoting/remoting-http/remoting-http-server/pom.xml @@ -19,7 +19,8 @@ ${project.groupId} - api + remoting-http-api + ${project.version} \ 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 01b7bea657..ed27282a38 100644 --- a/spring-remoting/remoting-jms/remoting-jms-client/pom.xml +++ b/spring-remoting/remoting-jms/remoting-jms-client/pom.xml @@ -28,7 +28,8 @@ com.baeldung - api + remoting-http-api + ${project.version} diff --git a/spring-remoting/remoting-jms/remoting-jms-server/pom.xml b/spring-remoting/remoting-jms/remoting-jms-server/pom.xml index 8feac4df57..7657267f1d 100644 --- a/spring-remoting/remoting-jms/remoting-jms-server/pom.xml +++ b/spring-remoting/remoting-jms/remoting-jms-server/pom.xml @@ -28,11 +28,7 @@ com.baeldung - api - - - com.baeldung - api + remoting-http-api ${project.version} diff --git a/spring-remoting/remoting-rmi/remoting-rmi-client/pom.xml b/spring-remoting/remoting-rmi/remoting-rmi-client/pom.xml index 4eb9d6cc43..1e3cd4b977 100644 --- a/spring-remoting/remoting-rmi/remoting-rmi-client/pom.xml +++ b/spring-remoting/remoting-rmi/remoting-rmi-client/pom.xml @@ -24,7 +24,8 @@ com.baeldung - api + remoting-http-api + ${project.version} \ No newline at end of file diff --git a/spring-remoting/remoting-rmi/remoting-rmi-server/pom.xml b/spring-remoting/remoting-rmi/remoting-rmi-server/pom.xml index 335d007441..68b01829e1 100644 --- a/spring-remoting/remoting-rmi/remoting-rmi-server/pom.xml +++ b/spring-remoting/remoting-rmi/remoting-rmi-server/pom.xml @@ -28,11 +28,7 @@ com.baeldung - api - - - com.baeldung - api + remoting-http-api ${project.version} From 4344385d2490a6da720c1d5b1daf05e51939a28b Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Tue, 4 Sep 2018 23:54:52 +0530 Subject: [PATCH 109/128] BAEL-8824 Align module names, folder names and artifact id - Fixed warning occurring due to spring-5-data-reactive module --- spring-5-data-reactive/pom.xml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/spring-5-data-reactive/pom.xml b/spring-5-data-reactive/pom.xml index 36ace53da2..e4dd454635 100644 --- a/spring-5-data-reactive/pom.xml +++ b/spring-5-data-reactive/pom.xml @@ -2,9 +2,7 @@ 4.0.0 - com.baeldung spring-5-data-reactive - 0.0.1-SNAPSHOT jar @@ -44,11 +42,6 @@ reactor-test test - - org.jetbrains.kotlin - kotlin-stdlib-jdk8 - ${kotlin.version} - org.jetbrains.kotlin kotlin-test @@ -101,6 +94,7 @@ kotlin-maven-plugin + ${kotlin-maven-plugin.version} compile @@ -204,6 +198,7 @@ UTF-8 1.8 1.2.40 + 1.2.40 1.0.0 5.0.2 From a42dfbcf12483e18877f65f7da9b8a21f7335d80 Mon Sep 17 00:00:00 2001 From: Adam InTae Gerard Date: Tue, 4 Sep 2018 19:39:00 -0700 Subject: [PATCH 110/128] BAEL-1973 (#5059) * BAEL-1973 * Modified CSS Background * removed unnecessary comment --- spring-security-mvc-socket/README.md | 1 + spring-security-mvc-socket/pom.xml | 6 +- .../springsecuredsockets/Constants.java | 8 ++ .../config/AppConfig.java | 4 +- .../config/SecurityConfig.java | 2 +- .../config/SocketBrokerConfig.java | 16 ++- .../config/SocketSecurityConfig.java | 2 +- .../controllers/SocketController.java | 23 +++- .../transfer/socket/Message.java | 8 ++ .../src/main/webapp/WEB-INF/jsp/denied.jsp | 27 ++-- .../src/main/webapp/WEB-INF/jsp/index.jsp | 49 +++---- .../src/main/webapp/WEB-INF/jsp/login.jsp | 80 ++++++------ .../src/main/webapp/WEB-INF/jsp/socket.jsp | 90 +++++++------ .../src/main/webapp/WEB-INF/jsp/success.jsp | 47 ++++--- .../scripts/controllers/indexController.js | 15 ++- .../scripts/controllers/loginController.js | 6 - .../scripts/controllers/socketController.js | 73 ++++++----- .../scripts/controllers/successController.js | 15 +-- .../webapp/resources/scripts/routes/router.js | 29 ++--- .../scripts/services/SocketService.js | 121 +++++++++++++----- .../src/main/webapp/resources/styles/app.css | 70 ++++++++++ .../main/webapp/resources/styles/denied.css | 3 + .../main/webapp/resources/styles/index.css | 7 + .../main/webapp/resources/styles/login.css | 17 +++ .../main/webapp/resources/styles/socket.css | 19 +++ .../main/webapp/resources/styles/style.css | 0 .../main/webapp/resources/styles/success.css | 3 + 27 files changed, 496 insertions(+), 245 deletions(-) create mode 100644 spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/Constants.java delete mode 100644 spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/loginController.js create mode 100644 spring-security-mvc-socket/src/main/webapp/resources/styles/app.css create mode 100644 spring-security-mvc-socket/src/main/webapp/resources/styles/denied.css create mode 100644 spring-security-mvc-socket/src/main/webapp/resources/styles/index.css create mode 100644 spring-security-mvc-socket/src/main/webapp/resources/styles/login.css create mode 100644 spring-security-mvc-socket/src/main/webapp/resources/styles/socket.css delete mode 100644 spring-security-mvc-socket/src/main/webapp/resources/styles/style.css create mode 100644 spring-security-mvc-socket/src/main/webapp/resources/styles/success.css diff --git a/spring-security-mvc-socket/README.md b/spring-security-mvc-socket/README.md index 5ae9d4f4cd..828d9a3448 100644 --- a/spring-security-mvc-socket/README.md +++ b/spring-security-mvc-socket/README.md @@ -1,2 +1,3 @@ ### Relevant Articles: - [Intro to Security and WebSockets](http://www.baeldung.com/spring-security-websockets) +- [Spring WebSockets: Specific User Chat](http://www.baeldung.com/spring-websocket-specific-user-chat) \ No newline at end of file diff --git a/spring-security-mvc-socket/pom.xml b/spring-security-mvc-socket/pom.xml index 1f75becc98..b7559753b5 100644 --- a/spring-security-mvc-socket/pom.xml +++ b/spring-security-mvc-socket/pom.xml @@ -11,9 +11,9 @@ com.baeldung - parent-spring-5 + parent-spring-4 0.0.1-SNAPSHOT - ../parent-spring-5 + ../parent-spring-4 @@ -177,9 +177,11 @@ 5.2.10.Final + 4.2.3.RELEASE 1.11.3.RELEASE 1.4.196 1.2.3 + 2.8.7 \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/Constants.java b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/Constants.java new file mode 100644 index 0000000000..77bcf7f343 --- /dev/null +++ b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/Constants.java @@ -0,0 +1,8 @@ +package com.baeldung.springsecuredsockets; + +public class Constants { + public static final String SECURED_CHAT_HISTORY = "/secured/history"; + public static final String SECURED_CHAT = "/secured/chat"; + public static final String SECURED_CHAT_ROOM = "/secured/room"; + public static final String SECURED_CHAT_SPECIFIC_USER = "/secured/user/queue/specific-user"; +} diff --git a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/AppConfig.java b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/AppConfig.java index 49b7ab2ff8..afb1970b25 100644 --- a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/AppConfig.java +++ b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/AppConfig.java @@ -9,7 +9,7 @@ import org.springframework.data.jpa.repository.config.EnableJpaRepositories; 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.WebMvcConfigurer; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.resource.PathResourceResolver; import org.springframework.web.servlet.view.JstlView; import org.springframework.web.servlet.view.UrlBasedViewResolver; @@ -20,7 +20,7 @@ import java.sql.SQLException; @EnableJpaRepositories @ComponentScan("com.baeldung.springsecuredsockets") @Import({ SecurityConfig.class, DataStoreConfig.class, SocketBrokerConfig.class, SocketSecurityConfig.class }) -public class AppConfig implements WebMvcConfigurer { +public class AppConfig extends WebMvcConfigurerAdapter { public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("index"); diff --git a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/SecurityConfig.java b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/SecurityConfig.java index d7b57d1829..be00662e3e 100644 --- a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/SecurityConfig.java +++ b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/SecurityConfig.java @@ -88,7 +88,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { .authorizeRequests() .antMatchers("/", "/index", "/authenticate") .permitAll() - .antMatchers("/secured/**/**", "/secured/socket", "/secured/success") + .antMatchers("/secured/**/**", "/secured/**/**/**", "/secured/socket", "/secured/success") .authenticated() .anyRequest().authenticated() .and() diff --git a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/SocketBrokerConfig.java b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/SocketBrokerConfig.java index 941cac8392..9b19de7b5a 100644 --- a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/SocketBrokerConfig.java +++ b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/SocketBrokerConfig.java @@ -1,27 +1,33 @@ package com.baeldung.springsecuredsockets.config; +import static com.baeldung.springsecuredsockets.Constants.SECURED_CHAT; +import static com.baeldung.springsecuredsockets.Constants.SECURED_CHAT_HISTORY; +import static com.baeldung.springsecuredsockets.Constants.SECURED_CHAT_ROOM; +import static com.baeldung.springsecuredsockets.Constants.SECURED_CHAT_SPECIFIC_USER; + import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; -import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; - @Configuration @EnableWebSocketMessageBroker @ComponentScan("com.baeldung.springsecuredsockets.controllers") -public class SocketBrokerConfig implements WebSocketMessageBrokerConfigurer { +public class SocketBrokerConfig extends AbstractWebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { - config.enableSimpleBroker("/secured/history"); + config.enableSimpleBroker(SECURED_CHAT_HISTORY, SECURED_CHAT_SPECIFIC_USER); config.setApplicationDestinationPrefixes("/spring-security-mvc-socket"); + config.setUserDestinationPrefix("/secured/user"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { - registry.addEndpoint("/secured/chat").withSockJS(); + registry.addEndpoint(SECURED_CHAT_ROOM).withSockJS(); + registry.addEndpoint(SECURED_CHAT).withSockJS(); } } diff --git a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/SocketSecurityConfig.java b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/SocketSecurityConfig.java index a37dfb7672..c833e70d47 100644 --- a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/SocketSecurityConfig.java +++ b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/SocketSecurityConfig.java @@ -15,7 +15,7 @@ public class SocketSecurityConfig extends AbstractSecurityWebSocketMessageBroker @Override protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) { messages - .simpDestMatchers("/secured/**").authenticated() + .simpDestMatchers("/secured/**", "/secured/**/**").authenticated() .anyMessage().authenticated(); } } \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/controllers/SocketController.java b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/controllers/SocketController.java index 68c5e306d8..6a74009c16 100644 --- a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/controllers/SocketController.java +++ b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/controllers/SocketController.java @@ -1,11 +1,19 @@ package com.baeldung.springsecuredsockets.controllers; +import static com.baeldung.springsecuredsockets.Constants.SECURED_CHAT; +import static com.baeldung.springsecuredsockets.Constants.SECURED_CHAT_HISTORY; +import static com.baeldung.springsecuredsockets.Constants.SECURED_CHAT_ROOM; +import static com.baeldung.springsecuredsockets.Constants.SECURED_CHAT_SPECIFIC_USER; + import com.baeldung.springsecuredsockets.transfer.socket.Message; import com.baeldung.springsecuredsockets.transfer.socket.OutputMessage; +import java.security.Principal; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.handler.annotation.Header; import org.springframework.messaging.handler.annotation.MessageMapping; +import org.springframework.messaging.handler.annotation.Payload; import org.springframework.messaging.handler.annotation.SendTo; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Controller; @@ -19,10 +27,19 @@ public class SocketController { private SimpMessagingTemplate simpMessagingTemplate; private static final Logger log = LoggerFactory.getLogger(SocketController.class); - @MessageMapping("/secured/chat") - @SendTo("/secured/history") - public OutputMessage send(Message msg) throws Exception { + @MessageMapping(SECURED_CHAT) + @SendTo(SECURED_CHAT_HISTORY) + public OutputMessage sendAll(Message msg) throws Exception { OutputMessage out = new OutputMessage(msg.getFrom(), msg.getText(), new SimpleDateFormat("HH:mm").format(new Date())); return out; } + + /** + * Example of sending message to specific user using 'convertAndSendToUser()' and '/queue' + */ + @MessageMapping(SECURED_CHAT_ROOM) + public void sendSpecific(@Payload Message msg, Principal user, @Header("simpSessionId") String sessionId) throws Exception { + OutputMessage out = new OutputMessage(msg.getFrom(), msg.getText(), new SimpleDateFormat("HH:mm").format(new Date())); + simpMessagingTemplate.convertAndSendToUser(msg.getTo(), SECURED_CHAT_SPECIFIC_USER, out); + } } diff --git a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/transfer/socket/Message.java b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/transfer/socket/Message.java index 024b386164..fd5d632fce 100644 --- a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/transfer/socket/Message.java +++ b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/transfer/socket/Message.java @@ -3,6 +3,7 @@ package com.baeldung.springsecuredsockets.transfer.socket; public class Message { private String from; + private String to; private String text; public String getFrom() { @@ -11,6 +12,13 @@ public class Message { public void setFrom(String from) { this.from = from; } + + public String getTo() { + return to; + } + public void setTo(String to) { + this.to = to; + } public String getText() { return text; } diff --git a/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/denied.jsp b/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/denied.jsp index d61148b04f..e4c40da0a8 100644 --- a/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/denied.jsp +++ b/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/denied.jsp @@ -4,15 +4,20 @@ - - Spring Secured Sockets - " rel="stylesheet"> - - - -

ACCESS DENIED!

-
-
- Click to login. - + + + Spring Secured Sockets + " rel="stylesheet"> + " rel="stylesheet"> + + + + +
+
+

ACCESS DENIED!

+ Click to login. +
+
+ \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/index.jsp b/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/index.jsp index d83338680e..d1435e8c2b 100644 --- a/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/index.jsp +++ b/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/index.jsp @@ -4,27 +4,32 @@ - - Spring Secured Sockets - " rel="stylesheet"> - - - - - - - - - - - - -

Welcome!

-
- {{greeting}} -
-
- Click to login. - + + Spring Secured Sockets + " rel="stylesheet"> + " rel="stylesheet"> + + + + + + + + + + + + + + +
+
+

Welcome!

+ {{greeting}} + Click to login. +
+
+ + \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/login.jsp b/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/login.jsp index d50059c674..76e3334bbe 100644 --- a/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/login.jsp +++ b/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/login.jsp @@ -4,42 +4,50 @@ - - Spring Secured Sockets - " rel="stylesheet"> - - - - - - - - - - - - - - -

JSP Login Form


-
- - - - - - - - - - - - -
User:
Password:
-
+ + Spring Secured Sockets + " rel="stylesheet"> + " rel="stylesheet"> + + + + + + + + + + + + + + + +
+
+ +

JSP Login Form

+
+ + + + + + + + + + + + +
User:
Password:
+
+ +
+
+ + + - - - \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/socket.jsp b/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/socket.jsp index b5807d74a6..ccd48672a1 100644 --- a/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/socket.jsp +++ b/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/socket.jsp @@ -4,48 +4,56 @@ - - Spring Secured Sockets - " rel="stylesheet"> - - - - - - - - - - - - - - -

Socket Chat

- -
-
- -
-
-
- - - -
-
-
- - -

-
-
+ + Spring Secured Sockets + " rel="stylesheet"> + " rel="stylesheet"> -Click to go back! -Click to start over (you will still be authenticated)! + + + + + + + + + + + + + + + + +
+
+

Socket Chat

+
+

(Chat With Everyone)

+ + + +
+
+

(Chat With A Specific User)

+ + + +
+
+

(Send and See Messages)

+ + +
+ +
+ Click to go back! + Click to start over (you will still be authenticated)! +
+
+ + + - - - \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/success.jsp b/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/success.jsp index 27e8f7aa44..4cff3f7a25 100644 --- a/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/success.jsp +++ b/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/success.jsp @@ -4,28 +4,33 @@ - - Spring Secured Sockets - " rel="stylesheet"> - - - - - - - - - - - - -

Congrats! You've logged in.

+ + Spring Secured Sockets + " rel="stylesheet"> + " rel="stylesheet"> - Click to chat! - Click to start over (you will still be authenticated)! + + + - - - + + + + + + + + + +
+ +
+ + + \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/indexController.js b/spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/indexController.js index 04c02e339b..5de3dcc78b 100644 --- a/spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/indexController.js +++ b/spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/indexController.js @@ -1,12 +1,13 @@ 'use strict'; angularApp - .controller('indexController', function ($scope) { - $scope.greeting = ''; +.controller('indexController', function ($scope) { - $scope.initialize = function () { - $scope.greeting = "Howdy!" - }; + $scope.greeting = ''; - $scope.initialize(); - }); \ No newline at end of file + $scope.initialize = function () { + $scope.greeting = "Howdy!" + }; + + $scope.initialize(); +}); \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/loginController.js b/spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/loginController.js deleted file mode 100644 index 07187d5327..0000000000 --- a/spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/loginController.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict'; - -angularApp - .controller('loginController', function ($scope) { - - }); diff --git a/spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/socketController.js b/spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/socketController.js index 395bf85c4a..ff000c251e 100644 --- a/spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/socketController.js +++ b/spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/socketController.js @@ -1,37 +1,52 @@ 'use strict'; angularApp - .controller('socketController', function ($scope, SocketService) { +.controller('socketController', function ($scope, SocketService) { - $scope.stompClient = null; - $scope.sendEndpoint = '/secured/chat'; - $scope.subscribeEndpoint = '/secured/history'; - $scope.elems = { - connect: 'connect', - from: 'from', - text: 'text', - disconnect: 'disconnect', - conversationDiv: 'conversationDiv', - response: 'response' - }; + /** + * URL mapping endpoints. + */ - $scope.connect = function (context) { - $scope.sendEndpoint = '/secured/chat'; - $scope.sendEndpoint = context + $scope.sendEndpoint ; - $scope.stompClient = SocketService.connect($scope.sendEndpoint, $scope.elems); - }; + var SECURED_CHAT = '/secured/chat'; + var SECURED_CHAT_HISTORY = '/secured/history'; + var SECURED_CHAT_ROOM = '/secured/room'; + var SECURED_CHAT_SPECIFIC_USER = '/secured/user/queue/specific-user'; - $scope.subscribe = function () { - $scope.stompClient.subscribe($scope.subscribeEndpoint, function (msgOut) { - SocketService.messageOut(JSON.parse(msgOut.body), $scope.elems); - }); - }; + var opts = { + from: 'from', + to: 'to', + text: 'text', + disconnect: 'disconnect', + conversationDiv: 'conversationDiv', + response: 'response' + }; - $scope.disconnect = function () { - SocketService.disconnect($scope.elems, $scope.stompClient); - }; + $scope.sendEndpoint = ''; + $scope.stompClient = null; - $scope.sendMessage = function () { - SocketService.sendMessage( $scope.elems, $scope.stompClient, $scope.sendEndpoint); - }; - }); \ No newline at end of file + /** + * Broadcast to All Users. + */ + + $scope.connectAll = function (context) { + $scope.sendEndpoint = context + SECURED_CHAT; + $scope.stompClient = SocketService.connect($scope.sendEndpoint , opts, true); + }; + + $scope.subscribeAll = function () { SocketService.subscribeToAll($scope.stompClient, SECURED_CHAT_HISTORY, opts); }; + + /** + * Broadcast to Specific User. + */ + + $scope.connectSpecific = function (context) { + $scope.sendEndpoint = context + SECURED_CHAT_ROOM; + $scope.stompClient = SocketService.connect(context + SECURED_CHAT_ROOM, opts, false); + }; + + $scope.subscribeSpecific = function () { SocketService.subscribeToSpecific($scope.stompClient, SECURED_CHAT_SPECIFIC_USER, opts); }; + + $scope.disconnect = function () { SocketService.disconnect(opts, $scope.stompClient); }; + + $scope.sendMessage = function () { SocketService.sendMessage(opts, $scope.stompClient, $scope.sendEndpoint); }; +}); \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/successController.js b/spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/successController.js index ccb972202d..6926239202 100644 --- a/spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/successController.js +++ b/spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/successController.js @@ -1,13 +1,12 @@ 'use strict'; angularApp - .controller('successController', function ($scope) { +.controller('successController', function ($scope) { + $scope.successMsg = ''; - $scope.successMsg = ''; + $scope.initialize = function () { + $scope.successMsg = "You've logged in!"; + }; - $scope.initialize = function () { - $scope.successMsg = "You've logged in!"; - }; - - $scope.initialize(); - }); + $scope.initialize(); +}); diff --git a/spring-security-mvc-socket/src/main/webapp/resources/scripts/routes/router.js b/spring-security-mvc-socket/src/main/webapp/resources/scripts/routes/router.js index 70644f996d..004c7b331a 100644 --- a/spring-security-mvc-socket/src/main/webapp/resources/scripts/routes/router.js +++ b/spring-security-mvc-socket/src/main/webapp/resources/scripts/routes/router.js @@ -1,19 +1,16 @@ 'use strict'; angularApp - .config(function ($routeProvider) { - $routeProvider - .when('/index', { - controller: 'indexController' - }) - .when('/login', { - controller: 'loginController' - }) - .when('/sockets', { - controller: 'socketController' - }) - .when('/success', { - controller: 'successController' - }) - .otherwise('/index'); - }); \ No newline at end of file +.config(function ($routeProvider) { + $routeProvider + .when('/index', { + controller: 'indexController' + }) + .when('/sockets', { + controller: 'socketController' + }) + .when('/success', { + controller: 'successController' + }) + .otherwise('/index'); +}); \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/webapp/resources/scripts/services/SocketService.js b/spring-security-mvc-socket/src/main/webapp/resources/scripts/services/SocketService.js index 56930808a3..ba3f397f89 100644 --- a/spring-security-mvc-socket/src/main/webapp/resources/scripts/services/SocketService.js +++ b/spring-security-mvc-socket/src/main/webapp/resources/scripts/services/SocketService.js @@ -1,46 +1,99 @@ 'use strict'; +var idHelper = function (context) { + return document.getElementById(context); +}; + function SocketService() { - var that = this, - idHelper = function(context) { - return document.getElementById(context); - }; - that.setConnected = function (elems, connected) { - idHelper(elems.connect).disabled = connected; - idHelper(elems.disconnect).disabled = !connected; - idHelper(elems.conversationDiv).style.visibility = connected ? 'visible' : 'hidden'; - idHelper(elems.response).innerHTML = ''; + var that = this; + + that.sessionId = ''; + + /** + * Generic methods. + */ + + that.setConnected = function (opts, connected) { + idHelper('connectAll').disabled = connected; + idHelper('connectSpecific').disabled = connected; + idHelper(opts.disconnect).disabled = !connected; + idHelper(opts.response).innerHTML = ''; + idHelper('subscribeAll').disabled = !connected; + idHelper('subscribeSpecific').disabled = !connected; + }; + + that.connect = function (endpoint, opts, isBroadcastAll) { + var socket = new SockJS(endpoint), stompClient = Stomp.over(socket); + stompClient.connect({}, function (frame) { + that.setConnected(opts, true); + + if (!isBroadcastAll) { + var url = stompClient.ws._transport.url; + console.log(stompClient.ws._transport.url); + url = url.replace("ws://localhost:8080/spring-security-mvc-socket/secured/room/", ""); + url = url.replace("/websocket", ""); + url = url.replace(/^[0-9]+\//, ""); + console.log("Your current session is: " + url); + that.sessionId = url; + } + + }); + return stompClient; + }; + + that.disconnect = function (opts, stompClient) { + if (stompClient !== null && stompClient !== undefined) { stompClient.disconnect(); } + that.setConnected(opts, false); + }; + + that.sendMessage = function (opts, stompClient, endpoint) { + var to = idHelper(opts.to).value; + var from = idHelper(opts.from).value; + + var msg = { + 'from': (from === undefined || from === null ) ? to : from, + 'to': (to === undefined || to === null ) ? "ALL" : to, + 'text': idHelper(opts.text).value }; - that.connect = function (endpoint, elems) { - var socket = new SockJS(endpoint), stompClient = Stomp.over(socket); - stompClient.connect({}, function (frame) { - that.setConnected(elems, true); - }); - return stompClient; - }; + console.log(JSON.stringify(msg)); + stompClient.send(endpoint, {}, JSON.stringify(msg)); + }; - that.disconnect = function (elems, stompClient) { - if (stompClient !== null && stompClient !== undefined) stompClient.disconnect(); - that.setConnected(elems, false); - }; + that.messageOut = function (msg, opts) { + var r = idHelper(opts.response), p = document.createElement('p'); + p.style.wordWrap = 'break-word'; + p.appendChild(document.createTextNode(msg.from + ': ' + msg.text + ' (' + msg.time + ')')); + r.appendChild(p); + }; + + /** + * Broadcast to All Users. + */ + + that.subscribeToAll = function(client, url, opts) { + idHelper('subscribeAll').disabled = true; + idHelper('subscribeSpecific').disabled = true; + client.subscribe(url, function (msgOut) { + that.messageOut(JSON.parse(msgOut.body), opts); + }); + }; + + /** + * Broadcast to Specific User. + */ + + that.subscribeToSpecific = function(client, url, opts) { + idHelper('subscribeAll').disabled = true; + idHelper('subscribeSpecific').disabled = true; + client.subscribe(url + "-user" + that.sessionId, function (msgOut) { + that.messageOut(JSON.parse(msgOut.body), opts); + }); + }; - that.sendMessage = function (elems, stompClient, endpoint) { - stompClient.send(endpoint, {}, - JSON.stringify({ - 'from': idHelper(elems.from).value, - 'text': idHelper(elems.text).value - })); - }; - that.messageOut = function (msg, elems) { - var r = idHelper(elems.response), p = document.createElement('p'); - p.style.wordWrap = 'break-word'; - p.appendChild(document.createTextNode(msg.from + ': ' + msg.text + ' (' + msg.time + ')')); - r.appendChild(p); - }; } angularApp - .service('SocketService', SocketService); \ No newline at end of file +.service('SocketService', SocketService); \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/webapp/resources/styles/app.css b/spring-security-mvc-socket/src/main/webapp/resources/styles/app.css new file mode 100644 index 0000000000..ee2cb4d717 --- /dev/null +++ b/spring-security-mvc-socket/src/main/webapp/resources/styles/app.css @@ -0,0 +1,70 @@ +@import url('https://fonts.googleapis.com/css?family=Poiret+One'); + +html, body, main { + padding: 0; + margin: 0; + position: absolute; + height: 100%; + width: 100%; + color: white; + font-family: 'Poiret One', sans-serif; + opacity:.95; +} + +main { + background-size: cover; +} + +main > div.wrapper { + position: relative; + left: 15%; + top: 15%; + width: 40%; +} + +h1 { + text-transform: uppercase; + font-size: 48px; + letter-spacing: 2px; +} + +span, a { + font-size: 24px; + letter-spacing: 1px; +} + +a { + text-decoration: none; + color: white; +} + +a:hover { + color: lightgray; +} + +input { + width: 225px; + background: none !important; + border-radius: 25px; + background-color: #fff; + color: white; + outline: none; + margin-left: 2px; + padding-left: 25px; + padding-bottom: 9px; + padding-top: 9px; +} + +button { + width: 100px; + align-content: center; + text-align: center; + background: transparent; + border-radius: 25px; + padding: 6px; + color: white; +} + +button:hover { + opacity: .6; +} \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/webapp/resources/styles/denied.css b/spring-security-mvc-socket/src/main/webapp/resources/styles/denied.css new file mode 100644 index 0000000000..3956715e4a --- /dev/null +++ b/spring-security-mvc-socket/src/main/webapp/resources/styles/denied.css @@ -0,0 +1,3 @@ +main { + background-color: black; +} diff --git a/spring-security-mvc-socket/src/main/webapp/resources/styles/index.css b/spring-security-mvc-socket/src/main/webapp/resources/styles/index.css new file mode 100644 index 0000000000..b6da4814b7 --- /dev/null +++ b/spring-security-mvc-socket/src/main/webapp/resources/styles/index.css @@ -0,0 +1,7 @@ +main { + background-color: black; +} + +span, a { + top: 175px; +} \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/webapp/resources/styles/login.css b/spring-security-mvc-socket/src/main/webapp/resources/styles/login.css new file mode 100644 index 0000000000..197f3e41bb --- /dev/null +++ b/spring-security-mvc-socket/src/main/webapp/resources/styles/login.css @@ -0,0 +1,17 @@ +main { + background-color: black; +} + +input[type="submit"] { + width: 100px; + align-content: center; + text-align: center; + background: transparent; + border-radius: 25px; + padding: 6px; + color: white; +} + +input[type="submit"]:hover { + opacity:.6; +} \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/webapp/resources/styles/socket.css b/spring-security-mvc-socket/src/main/webapp/resources/styles/socket.css new file mode 100644 index 0000000000..aa483fd684 --- /dev/null +++ b/spring-security-mvc-socket/src/main/webapp/resources/styles/socket.css @@ -0,0 +1,19 @@ +main { + background-color: black; +} + +div#all, div#specific, div#conversationDiv { + border: 1px solid white; + border-radius: 25px; + padding: 15px; + margin: 15px +} + +button[disabled=true] { + color: lightgray; + border: 1px solid lightgray; +} + +button[disabled=true]:hover { + opacity: 1; +} \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/webapp/resources/styles/style.css b/spring-security-mvc-socket/src/main/webapp/resources/styles/style.css deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/spring-security-mvc-socket/src/main/webapp/resources/styles/success.css b/spring-security-mvc-socket/src/main/webapp/resources/styles/success.css new file mode 100644 index 0000000000..3956715e4a --- /dev/null +++ b/spring-security-mvc-socket/src/main/webapp/resources/styles/success.css @@ -0,0 +1,3 @@ +main { + background-color: black; +} From 2449866727fea6eb3365c6c1ba0063c0fe4a1957 Mon Sep 17 00:00:00 2001 From: rozagerardo Date: Wed, 5 Sep 2018 00:18:03 -0300 Subject: [PATCH 111/128] BAEL-2131 disable logging in console (#5103) * * first approach dividing spring-boot-logging into modules * * first approach dividing spring-boot-logging into modules * * modularized spring-boot-logging-log4j2 module * existing example as module * created module for new examples of "disabling console output" article * * removed name from poms * removed logback-properties submodule * added comment about logback properties in logback module * fixed comment typo * removed one last name tag --- .../disabling-console-jul/pom.xml | 53 +++++++++++++++++++ .../properties/DisablingConsoleJulApp.java | 11 ++++ .../DisabledConsoleRestController.java | 19 +++++++ .../src/main/resources/application.properties | 1 + .../src/main/resources/logging.properties | 4 ++ .../disabling-console-log4j2/pom.xml | 49 +++++++++++++++++ .../log4j2/xml/DisablingConsoleLog4j2App.java | 11 ++++ .../DisabledConsoleRestController.java | 20 +++++++ .../src/main/resources/log4j2.xml | 13 +++++ .../disabling-console-logback/pom.xml | 9 ++++ .../xml/DisablingConsoleLogbackApp.java | 11 ++++ .../DisabledConsoleRestController.java | 20 +++++++ .../src/main/resources/application.properties | 7 +++ .../src/main/resources/logback-spring.xml | 8 +++ .../disabling-console-logging/pom.xml | 21 ++++++++ spring-boot-logging-log4j2/pom.xml | 19 +++---- .../spring-boot-logging-log4j2-app/pom.xml | 35 ++++++++++++ .../springbootlogging/LoggingController.java | 0 .../SpringBootLoggingApplication.java | 0 .../src/main/resources/application.properties | 0 .../src/main/resources/log4j2-spring.xml | 0 21 files changed, 299 insertions(+), 12 deletions(-) create mode 100644 spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/pom.xml create mode 100644 spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/DisablingConsoleJulApp.java create mode 100644 spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/controllers/DisabledConsoleRestController.java create mode 100644 spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/src/main/resources/application.properties create mode 100644 spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/src/main/resources/logging.properties create mode 100644 spring-boot-logging-log4j2/disabling-console-logging/disabling-console-log4j2/pom.xml create mode 100644 spring-boot-logging-log4j2/disabling-console-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/DisablingConsoleLog4j2App.java create mode 100644 spring-boot-logging-log4j2/disabling-console-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/controllers/DisabledConsoleRestController.java create mode 100644 spring-boot-logging-log4j2/disabling-console-logging/disabling-console-log4j2/src/main/resources/log4j2.xml create mode 100644 spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/pom.xml create mode 100644 spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/DisablingConsoleLogbackApp.java create mode 100644 spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/controllers/DisabledConsoleRestController.java create mode 100644 spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/src/main/resources/application.properties create mode 100644 spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/src/main/resources/logback-spring.xml create mode 100644 spring-boot-logging-log4j2/disabling-console-logging/pom.xml create mode 100644 spring-boot-logging-log4j2/spring-boot-logging-log4j2-app/pom.xml rename spring-boot-logging-log4j2/{ => spring-boot-logging-log4j2-app}/src/main/java/com/baeldung/springbootlogging/LoggingController.java (100%) rename spring-boot-logging-log4j2/{ => spring-boot-logging-log4j2-app}/src/main/java/com/baeldung/springbootlogging/SpringBootLoggingApplication.java (100%) rename spring-boot-logging-log4j2/{ => spring-boot-logging-log4j2-app}/src/main/resources/application.properties (100%) rename spring-boot-logging-log4j2/{ => spring-boot-logging-log4j2-app}/src/main/resources/log4j2-spring.xml (100%) diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/pom.xml b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/pom.xml new file mode 100644 index 0000000000..c4f9b12676 --- /dev/null +++ b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/pom.xml @@ -0,0 +1,53 @@ + + 4.0.0 + com.baeldung + 0.0.1-SNAPSHOT + disabling-console-jul + + + org.springframework.boot + spring-boot-starter-parent + 2.0.4.RELEASE + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-logging + + + + + org.slf4j + jul-to-slf4j + + + org.slf4j + slf4j-simple + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + UTF-8 + UTF-8 + 1.8 + + \ No newline at end of file diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/DisablingConsoleJulApp.java b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/DisablingConsoleJulApp.java new file mode 100644 index 0000000000..c9187e9ace --- /dev/null +++ b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/DisablingConsoleJulApp.java @@ -0,0 +1,11 @@ +package com.baeldung.springbootlogging.disablingconsole.jul.properties; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class DisablingConsoleJulApp { + public static void main(String[] args) { + SpringApplication.run(DisablingConsoleJulApp.class, args); + } +} diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/controllers/DisabledConsoleRestController.java b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/controllers/DisabledConsoleRestController.java new file mode 100644 index 0000000000..e33089ed36 --- /dev/null +++ b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/controllers/DisabledConsoleRestController.java @@ -0,0 +1,19 @@ +package com.baeldung.springbootlogging.disablingconsole.jul.properties.controllers; + +import java.time.LocalTime; +import java.util.logging.Logger; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class DisabledConsoleRestController { + + private static final Logger LOG = Logger.getLogger(DisabledConsoleRestController.class.getName()); + + @GetMapping("/disabled-console-jul-properties") + public String logTime() { + LOG.info("Current time: " + LocalTime.now()); + return "finished!"; + } +} diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/src/main/resources/application.properties b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/src/main/resources/application.properties new file mode 100644 index 0000000000..d81eed95d3 --- /dev/null +++ b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/src/main/resources/application.properties @@ -0,0 +1 @@ +logging.file=true \ No newline at end of file diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/src/main/resources/logging.properties b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/src/main/resources/logging.properties new file mode 100644 index 0000000000..0136354868 --- /dev/null +++ b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/src/main/resources/logging.properties @@ -0,0 +1,4 @@ +handlers= java.util.logging.FileHandler + +java.util.logging.FileHandler.pattern=baeldung.log +java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter \ No newline at end of file diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-log4j2/pom.xml b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-log4j2/pom.xml new file mode 100644 index 0000000000..97d10c574a --- /dev/null +++ b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-log4j2/pom.xml @@ -0,0 +1,49 @@ + + 4.0.0 + com.baeldung + 0.0.1-SNAPSHOT + disabling-console-log4j2 + + org.springframework.boot + spring-boot-starter-parent + 2.0.4.RELEASE + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-logging + + + + + org.springframework.boot + spring-boot-starter-log4j2 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + UTF-8 + UTF-8 + 1.8 + + + \ No newline at end of file diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/DisablingConsoleLog4j2App.java b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/DisablingConsoleLog4j2App.java new file mode 100644 index 0000000000..ae59f3b3e1 --- /dev/null +++ b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/DisablingConsoleLog4j2App.java @@ -0,0 +1,11 @@ +package com.baeldung.springbootlogging.disablingconsole.log4j2.xml; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class DisablingConsoleLog4j2App { + public static void main(String[] args) { + SpringApplication.run(DisablingConsoleLog4j2App.class, args); + } +} diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/controllers/DisabledConsoleRestController.java b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/controllers/DisabledConsoleRestController.java new file mode 100644 index 0000000000..f6485b63d4 --- /dev/null +++ b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/controllers/DisabledConsoleRestController.java @@ -0,0 +1,20 @@ +package com.baeldung.springbootlogging.disablingconsole.log4j2.xml.controllers; + +import java.time.LocalTime; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class DisabledConsoleRestController { + + private static final Logger LOG = LoggerFactory.getLogger(DisabledConsoleRestController.class); + + @GetMapping("/disabled-console-log4j2-xml") + public String logTime() { + LOG.info("Current time: {}", LocalTime.now()); + return "finished!"; + } +} diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-log4j2/src/main/resources/log4j2.xml b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-log4j2/src/main/resources/log4j2.xml new file mode 100644 index 0000000000..20975f40d9 --- /dev/null +++ b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-log4j2/src/main/resources/log4j2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/pom.xml b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/pom.xml new file mode 100644 index 0000000000..6f2170390b --- /dev/null +++ b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/pom.xml @@ -0,0 +1,9 @@ + + 4.0.0 + + com.baeldung + disabling-console-logging + 0.0.1-SNAPSHOT + + disabling-console-logback + \ No newline at end of file diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/DisablingConsoleLogbackApp.java b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/DisablingConsoleLogbackApp.java new file mode 100644 index 0000000000..9b38d42477 --- /dev/null +++ b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/DisablingConsoleLogbackApp.java @@ -0,0 +1,11 @@ +package com.baeldung.springbootlogging.disablingconsole.logback.xml; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class DisablingConsoleLogbackApp { + public static void main(String[] args) { + SpringApplication.run(DisablingConsoleLogbackApp.class, args); + } +} diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/controllers/DisabledConsoleRestController.java b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/controllers/DisabledConsoleRestController.java new file mode 100644 index 0000000000..e1d6b1d45e --- /dev/null +++ b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/controllers/DisabledConsoleRestController.java @@ -0,0 +1,20 @@ +package com.baeldung.springbootlogging.disablingconsole.logback.xml.controllers; + +import java.time.LocalTime; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class DisabledConsoleRestController { + + private static final Logger LOG = LoggerFactory.getLogger(DisabledConsoleRestController.class); + + @GetMapping("/disabled-console-logback-xml") + public String logTime() { + LOG.info("Current time: {}", LocalTime.now()); + return "finished!"; + } +} diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/src/main/resources/application.properties b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/src/main/resources/application.properties new file mode 100644 index 0000000000..70c2f97194 --- /dev/null +++ b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/src/main/resources/application.properties @@ -0,0 +1,7 @@ +logging.file=disabled-console.log + +### we could potentially 'disable' console logging by setting a blank log pattern: +#logging.pattern.console= + +### or disable the logs completely by setting the root logging level as 'OFF': +#logging.level.root=OFF diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/src/main/resources/logback-spring.xml b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/src/main/resources/logback-spring.xml new file mode 100644 index 0000000000..5c751e994f --- /dev/null +++ b/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/src/main/resources/logback-spring.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/spring-boot-logging-log4j2/disabling-console-logging/pom.xml b/spring-boot-logging-log4j2/disabling-console-logging/pom.xml new file mode 100644 index 0000000000..bc248e49b2 --- /dev/null +++ b/spring-boot-logging-log4j2/disabling-console-logging/pom.xml @@ -0,0 +1,21 @@ + + 4.0.0 + 0.0.1-SNAPSHOT + com.baeldung + disabling-console-logging + pom + Projects for Disabling Spring Boot Console Logging tutorials + + + com.baeldung + spring-boot-logging-log4j2 + 0.0.1-SNAPSHOT + + + + disabling-console-logback + disabling-console-log4j2 + disabling-console-jul + + \ No newline at end of file diff --git a/spring-boot-logging-log4j2/pom.xml b/spring-boot-logging-log4j2/pom.xml index 61f949b820..ee4d07c3e8 100644 --- a/spring-boot-logging-log4j2/pom.xml +++ b/spring-boot-logging-log4j2/pom.xml @@ -6,8 +6,8 @@ com.baeldung spring-boot-logging-log4j2 0.0.1-SNAPSHOT - jar - Demo project for Spring Boot Logging with Log4J2 + pom + Projects for Spring Boot Logging tutorials parent-boot-2 @@ -20,16 +20,6 @@ org.springframework.boot spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-logging - - - - - org.springframework.boot - spring-boot-starter-log4j2 @@ -38,6 +28,11 @@ test + + + spring-boot-logging-log4j2-app + disabling-console-logging + diff --git a/spring-boot-logging-log4j2/spring-boot-logging-log4j2-app/pom.xml b/spring-boot-logging-log4j2/spring-boot-logging-log4j2-app/pom.xml new file mode 100644 index 0000000000..1d4c8867fb --- /dev/null +++ b/spring-boot-logging-log4j2/spring-boot-logging-log4j2-app/pom.xml @@ -0,0 +1,35 @@ + + + 4.0.0 + + com.baeldung + spring-boot-logging-log4j2-app + 0.0.1-SNAPSHOT + jar + Demo project for Spring Boot Logging with Log4J2 + + + spring-boot-logging-log4j2 + com.baeldung + 0.0.1-SNAPSHOT + .. + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-logging + + + + + org.springframework.boot + spring-boot-starter-log4j2 + + + diff --git a/spring-boot-logging-log4j2/src/main/java/com/baeldung/springbootlogging/LoggingController.java b/spring-boot-logging-log4j2/spring-boot-logging-log4j2-app/src/main/java/com/baeldung/springbootlogging/LoggingController.java similarity index 100% rename from spring-boot-logging-log4j2/src/main/java/com/baeldung/springbootlogging/LoggingController.java rename to spring-boot-logging-log4j2/spring-boot-logging-log4j2-app/src/main/java/com/baeldung/springbootlogging/LoggingController.java diff --git a/spring-boot-logging-log4j2/src/main/java/com/baeldung/springbootlogging/SpringBootLoggingApplication.java b/spring-boot-logging-log4j2/spring-boot-logging-log4j2-app/src/main/java/com/baeldung/springbootlogging/SpringBootLoggingApplication.java similarity index 100% rename from spring-boot-logging-log4j2/src/main/java/com/baeldung/springbootlogging/SpringBootLoggingApplication.java rename to spring-boot-logging-log4j2/spring-boot-logging-log4j2-app/src/main/java/com/baeldung/springbootlogging/SpringBootLoggingApplication.java diff --git a/spring-boot-logging-log4j2/src/main/resources/application.properties b/spring-boot-logging-log4j2/spring-boot-logging-log4j2-app/src/main/resources/application.properties similarity index 100% rename from spring-boot-logging-log4j2/src/main/resources/application.properties rename to spring-boot-logging-log4j2/spring-boot-logging-log4j2-app/src/main/resources/application.properties diff --git a/spring-boot-logging-log4j2/src/main/resources/log4j2-spring.xml b/spring-boot-logging-log4j2/spring-boot-logging-log4j2-app/src/main/resources/log4j2-spring.xml similarity index 100% rename from spring-boot-logging-log4j2/src/main/resources/log4j2-spring.xml rename to spring-boot-logging-log4j2/spring-boot-logging-log4j2-app/src/main/resources/log4j2-spring.xml From 84d18e7a828c76151fcc74bd5a28cc11bf34887e Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 5 Sep 2018 09:09:57 +0530 Subject: [PATCH 112/128] BAEL-8852 Remove extra bin folder from javaxval project - Removed bin folder --- javaxval/bin/.gitignore | 6 ------ javaxval/bin/pom.xml | 44 ----------------------------------------- 2 files changed, 50 deletions(-) delete mode 100644 javaxval/bin/.gitignore delete mode 100644 javaxval/bin/pom.xml diff --git a/javaxval/bin/.gitignore b/javaxval/bin/.gitignore deleted file mode 100644 index 55a6bcf596..0000000000 --- a/javaxval/bin/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -.classpath -.project -.settings/ -target/ - - diff --git a/javaxval/bin/pom.xml b/javaxval/bin/pom.xml deleted file mode 100644 index a16072bb1a..0000000000 --- a/javaxval/bin/pom.xml +++ /dev/null @@ -1,44 +0,0 @@ - - 4.0.0 - com.baeldung - javaxval - 0.1-SNAPSHOT - - - - - - javax.validation - validation-api - 1.1.0.Final - - - - org.hibernate - hibernate-validator - 5.2.1.Final - - - - org.hibernate - hibernate-validator-annotation-processor - 5.2.1.Final - - - - javax.el - javax.el-api - 2.2.4 - - - - org.glassfish.web - javax.el - 2.2.4 - - - - - - \ No newline at end of file From e899b76d4354c47fddd7d7d45429a80fc356de8c Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 5 Sep 2018 10:21:18 +0530 Subject: [PATCH 113/128] BAEL-8853 Merge jsonb module into another module - Moved jsonb module resources to json module and deleted jsonb module --- json/README.md | 1 + json/pom.xml | 22 +++- .../com/baeldung/adapter/PersonAdapter.java | 0 .../main/java/com/baeldung/jsonb/Person.java | 0 .../java/com/baeldung/jsonb/JsonbTest.java | 1 + jsonb/.gitignore | 12 --- jsonb/README.md | 4 - jsonb/pom.xml | 101 ------------------ jsonb/src/main/resources/logback.xml | 13 --- 9 files changed, 22 insertions(+), 132 deletions(-) rename {jsonb => json}/src/main/java/com/baeldung/adapter/PersonAdapter.java (100%) rename {jsonb => json}/src/main/java/com/baeldung/jsonb/Person.java (100%) rename {jsonb => json}/src/test/java/com/baeldung/jsonb/JsonbTest.java (99%) delete mode 100644 jsonb/.gitignore delete mode 100644 jsonb/README.md delete mode 100644 jsonb/pom.xml delete mode 100644 jsonb/src/main/resources/logback.xml diff --git a/json/README.md b/json/README.md index 8c2abc3e47..e0679bc60b 100644 --- a/json/README.md +++ b/json/README.md @@ -9,3 +9,4 @@ - [Introduction to JsonPath](http://www.baeldung.com/guide-to-jayway-jsonpath) - [Introduction to JSON-Java (org.json)](http://www.baeldung.com/java-org-json) - [Overview of JSON Pointer](https://www.baeldung.com/json-pointer) +- [Introduction to the JSON Binding API (JSR 367) in Java](http://www.baeldung.com/java-json-binding-api) \ No newline at end of file diff --git a/json/pom.xml b/json/pom.xml index fa3fcafa65..b688baec06 100644 --- a/json/pom.xml +++ b/json/pom.xml @@ -33,7 +33,11 @@ json 20171018 - + + javax.json.bind + javax.json.bind-api + ${jsonb-api.version} + junit junit @@ -46,12 +50,26 @@ javax.json 1.1.2 - + + org.eclipse + yasson + ${yasson.version} + + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + test + 1.4.1 1.2.21 + 1.0 + 4.1 + 1.0.1 diff --git a/jsonb/src/main/java/com/baeldung/adapter/PersonAdapter.java b/json/src/main/java/com/baeldung/adapter/PersonAdapter.java similarity index 100% rename from jsonb/src/main/java/com/baeldung/adapter/PersonAdapter.java rename to json/src/main/java/com/baeldung/adapter/PersonAdapter.java diff --git a/jsonb/src/main/java/com/baeldung/jsonb/Person.java b/json/src/main/java/com/baeldung/jsonb/Person.java similarity index 100% rename from jsonb/src/main/java/com/baeldung/jsonb/Person.java rename to json/src/main/java/com/baeldung/jsonb/Person.java diff --git a/jsonb/src/test/java/com/baeldung/jsonb/JsonbTest.java b/json/src/test/java/com/baeldung/jsonb/JsonbTest.java similarity index 99% rename from jsonb/src/test/java/com/baeldung/jsonb/JsonbTest.java rename to json/src/test/java/com/baeldung/jsonb/JsonbTest.java index 67beda77e1..cc36af1d1d 100644 --- a/jsonb/src/test/java/com/baeldung/jsonb/JsonbTest.java +++ b/json/src/test/java/com/baeldung/jsonb/JsonbTest.java @@ -18,6 +18,7 @@ import org.apache.commons.collections4.ListUtils; import org.junit.Test; import com.baeldung.adapter.PersonAdapter; +import com.baeldung.jsonb.Person; public class JsonbTest { diff --git a/jsonb/.gitignore b/jsonb/.gitignore deleted file mode 100644 index dec013dfa4..0000000000 --- a/jsonb/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -#folders# -.idea -/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/jsonb/README.md b/jsonb/README.md deleted file mode 100644 index 9293a44808..0000000000 --- a/jsonb/README.md +++ /dev/null @@ -1,4 +0,0 @@ -## JSON B - -## Relevant articles: -- [Introduction to the JSON Binding API (JSR 367) in Java](http://www.baeldung.com/java-json-binding-api) diff --git a/jsonb/pom.xml b/jsonb/pom.xml deleted file mode 100644 index 160b9d5df7..0000000000 --- a/jsonb/pom.xml +++ /dev/null @@ -1,101 +0,0 @@ - - - 4.0.0 - com.baeldung - json-b - 0.0.1-SNAPSHOT - jar - json-b - json-b sample project - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - - javax.json.bind - javax.json.bind-api - ${jsonb-api.version} - - - - org.apache.commons - commons-collections4 - ${commons-collections4.version} - test - - - - org.junit.jupiter - junit-jupiter-api - ${junit.jupiter.version} - - - org.junit.platform - junit-platform-surefire-provider - ${junit.platform.version} - test - - - org.junit.platform - junit-platform-runner - ${junit.platform.version} - test - - - - - - yasson - - true - - - - - org.eclipse - yasson - ${yasson.version} - - - org.glassfish - javax.json - ${javax.json.version} - - - - - johnzon - - - - org.apache.geronimo.specs - geronimo-json_1.1_spec - ${geronimo-json_1.1_spec.version} - - - org.apache.johnzon - johnzon-jsonb - ${johnzon.version} - - - - - - - 1.8 - 1.8 - 1.0.0 - 1.0 - 1.1.3 - 1.0 - 1.0.1 - 1.1.2 - 4.1 - - - \ No newline at end of file diff --git a/jsonb/src/main/resources/logback.xml b/jsonb/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/jsonb/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 0966bd3bb022b9746088a071a47794258241df2f Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 5 Sep 2018 11:24:34 +0530 Subject: [PATCH 114/128] BAEL-8853 Merge jsonb module into another module - Fixed PMD violation --- .../com/baeldung/jsonb/{JsonbTest.java => JsonbUnitTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename json/src/test/java/com/baeldung/jsonb/{JsonbTest.java => JsonbUnitTest.java} (99%) diff --git a/json/src/test/java/com/baeldung/jsonb/JsonbTest.java b/json/src/test/java/com/baeldung/jsonb/JsonbUnitTest.java similarity index 99% rename from json/src/test/java/com/baeldung/jsonb/JsonbTest.java rename to json/src/test/java/com/baeldung/jsonb/JsonbUnitTest.java index cc36af1d1d..f258700c6b 100644 --- a/json/src/test/java/com/baeldung/jsonb/JsonbTest.java +++ b/json/src/test/java/com/baeldung/jsonb/JsonbUnitTest.java @@ -20,7 +20,7 @@ import org.junit.Test; import com.baeldung.adapter.PersonAdapter; import com.baeldung.jsonb.Person; -public class JsonbTest { +public class JsonbUnitTest { @Test public void givenPersonList_whenSerializeWithJsonb_thenGetPersonJsonArray() { From b48458d3fd76f74a347f1ab98ab2b4a37d43b409 Mon Sep 17 00:00:00 2001 From: smokeyrobot Date: Wed, 5 Sep 2018 02:18:57 -0400 Subject: [PATCH 115/128] Bael 801 (#5150) * BAEL-801 A Guide to OptaPlanner * BAEL-801 Optaplanner per Editor Review * BAEL-801 Fixed parent pom merge issue * BAEL-801 Fixed parent pom merge issue * BAEL-801 Added logback to suppress debug logging causing build failures * BAEL-801 Updated per editor review * BAEL-801 Removed static variables * BAEL-801 - Updated per Senior Editor review. Moved classes to Drools module. * BAEL-801 - Updated per Senior Editor review. Moved classes to Drools module. * BAEL-801 - Deleted duplicate class. --- drools/pom.xml | 6 ++ .../drools/optaplanner/CourseSchedule.java | 63 +++++++++++++++++++ .../baeldung/drools/optaplanner/Lecture.java | 30 +++++++++ .../drools/optaplanner/ScoreCalculator.java | 32 ++++++++++ drools/src/main/resources/courseSchedule.drl | 14 +++++ .../courseScheduleSolverConfigDrools.xml | 12 ++++ .../courseScheduleSolverConfiguration.xml | 12 ++++ .../optaplanner/OptaPlannerUnitTest.java | 49 +++++++++++++++ 8 files changed, 218 insertions(+) create mode 100644 drools/src/main/java/com/baeldung/drools/optaplanner/CourseSchedule.java create mode 100644 drools/src/main/java/com/baeldung/drools/optaplanner/Lecture.java create mode 100644 drools/src/main/java/com/baeldung/drools/optaplanner/ScoreCalculator.java create mode 100644 drools/src/main/resources/courseSchedule.drl create mode 100644 drools/src/main/resources/courseScheduleSolverConfigDrools.xml create mode 100644 drools/src/main/resources/courseScheduleSolverConfiguration.xml create mode 100644 drools/src/test/java/com/baeldung/drools/optaplanner/OptaPlannerUnitTest.java diff --git a/drools/pom.xml b/drools/pom.xml index 631bc8c792..009ac8acec 100644 --- a/drools/pom.xml +++ b/drools/pom.xml @@ -48,12 +48,18 @@ poi-ooxml ${apache-poi-version} + + org.optaplanner + optaplanner-core + ${opta-planner-version} + 4.4.6 7.4.1.Final 3.13 + 7.10.0.Final diff --git a/drools/src/main/java/com/baeldung/drools/optaplanner/CourseSchedule.java b/drools/src/main/java/com/baeldung/drools/optaplanner/CourseSchedule.java new file mode 100644 index 0000000000..7b2ba117a1 --- /dev/null +++ b/drools/src/main/java/com/baeldung/drools/optaplanner/CourseSchedule.java @@ -0,0 +1,63 @@ +package com.baeldung.drools.optaplanner; + +import java.util.ArrayList; +import java.util.List; + +import org.optaplanner.core.api.domain.solution.PlanningEntityCollectionProperty; +import org.optaplanner.core.api.domain.solution.PlanningScore; +import org.optaplanner.core.api.domain.solution.PlanningSolution; +import org.optaplanner.core.api.domain.solution.drools.ProblemFactCollectionProperty; +import org.optaplanner.core.api.domain.valuerange.ValueRangeProvider; +import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScore; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@PlanningSolution +public class CourseSchedule { + + Logger logger = LoggerFactory.getLogger("CourseSchedule"); + + private List roomList; + private List periodList; + private List lectureList; + private HardSoftScore score; + + public CourseSchedule(){ + roomList = new ArrayList<>(); + periodList = new ArrayList<>(); + lectureList = new ArrayList<>(); + } + + @ValueRangeProvider(id = "availableRooms") + @ProblemFactCollectionProperty + public List getRoomList() { + return roomList; + } + + @ValueRangeProvider(id = "availablePeriods") + @ProblemFactCollectionProperty + public List getPeriodList() { + return periodList; + } + + @PlanningEntityCollectionProperty + public List getLectureList() { + return lectureList; + } + + @PlanningScore + public HardSoftScore getScore() { + return score; + } + + public void setScore(HardSoftScore score) { + this.score = score; + } + + public void printCourseSchedule() { + lectureList.stream() + .map(c -> "Lecture in Room " + c.getRoomNumber().toString() + " during Period " + c.getPeriod().toString()) + .forEach(k -> logger.info(k)); + } + +} diff --git a/drools/src/main/java/com/baeldung/drools/optaplanner/Lecture.java b/drools/src/main/java/com/baeldung/drools/optaplanner/Lecture.java new file mode 100644 index 0000000000..193cdb08b1 --- /dev/null +++ b/drools/src/main/java/com/baeldung/drools/optaplanner/Lecture.java @@ -0,0 +1,30 @@ +package com.baeldung.drools.optaplanner; + +import org.optaplanner.core.api.domain.entity.PlanningEntity; +import org.optaplanner.core.api.domain.variable.PlanningVariable; + +@PlanningEntity +public class Lecture { + + private Integer roomNumber; + private Integer period; + + @PlanningVariable(valueRangeProviderRefs = {"availablePeriods"}) + public Integer getPeriod() { + return period; + } + + @PlanningVariable(valueRangeProviderRefs = {"availableRooms"}) + public Integer getRoomNumber() { + return roomNumber; + } + + public void setPeriod(Integer period) { + this.period = period; + } + + public void setRoomNumber(Integer roomNumber) { + this.roomNumber = roomNumber; + } + +} diff --git a/drools/src/main/java/com/baeldung/drools/optaplanner/ScoreCalculator.java b/drools/src/main/java/com/baeldung/drools/optaplanner/ScoreCalculator.java new file mode 100644 index 0000000000..86501cdccd --- /dev/null +++ b/drools/src/main/java/com/baeldung/drools/optaplanner/ScoreCalculator.java @@ -0,0 +1,32 @@ +package com.baeldung.drools.optaplanner; + +import java.util.HashSet; + +import org.optaplanner.core.api.score.Score; +import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScore; +import org.optaplanner.core.impl.score.director.easy.EasyScoreCalculator; + +public class ScoreCalculator implements EasyScoreCalculator { + + @Override + public Score calculateScore(CourseSchedule courseSchedule) { + int hardScore = 0; + int softScore = 0; + + HashSet occupiedRooms = new HashSet<>(); + for (Lecture lecture : courseSchedule.getLectureList()) { + if(lecture.getPeriod() != null && lecture.getRoomNumber() != null) { + String roomInUse = lecture.getPeriod().toString() + ":" + lecture.getRoomNumber().toString(); + if (occupiedRooms.contains(roomInUse)) { + hardScore += -1; + } else { + occupiedRooms.add(roomInUse); + } + } else { + hardScore += -1; + } + } + + return HardSoftScore.valueOf(hardScore, softScore); + } +} diff --git a/drools/src/main/resources/courseSchedule.drl b/drools/src/main/resources/courseSchedule.drl new file mode 100644 index 0000000000..35dd57df84 --- /dev/null +++ b/drools/src/main/resources/courseSchedule.drl @@ -0,0 +1,14 @@ +package com.baeldung.drools.optaplanner + +import com.baeldung.drools.optaplanner.Lecture; +import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScoreHolder; + +global HardSoftScoreHolder scoreHolder; + +rule "noNullRoomPeriod" + when + Lecture( roomNumber == null ); + Lecture( period == null ); + then + scoreHolder.addHardConstraintMatch(kcontext, -1); +end \ No newline at end of file diff --git a/drools/src/main/resources/courseScheduleSolverConfigDrools.xml b/drools/src/main/resources/courseScheduleSolverConfigDrools.xml new file mode 100644 index 0000000000..7cf95fdcd3 --- /dev/null +++ b/drools/src/main/resources/courseScheduleSolverConfigDrools.xml @@ -0,0 +1,12 @@ + + + + + + courseSchedule.drl + + + + 10 + + \ No newline at end of file diff --git a/drools/src/main/resources/courseScheduleSolverConfiguration.xml b/drools/src/main/resources/courseScheduleSolverConfiguration.xml new file mode 100644 index 0000000000..dfedb8f2fd --- /dev/null +++ b/drools/src/main/resources/courseScheduleSolverConfiguration.xml @@ -0,0 +1,12 @@ + + + + + + com.baeldung.drools.optaplanner.ScoreCalculator + + + + 10 + + \ No newline at end of file diff --git a/drools/src/test/java/com/baeldung/drools/optaplanner/OptaPlannerUnitTest.java b/drools/src/test/java/com/baeldung/drools/optaplanner/OptaPlannerUnitTest.java new file mode 100644 index 0000000000..1880e30b86 --- /dev/null +++ b/drools/src/test/java/com/baeldung/drools/optaplanner/OptaPlannerUnitTest.java @@ -0,0 +1,49 @@ +package com.baeldung.drools.optaplanner; + +import java.util.Arrays; + +import org.junit.Assert; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.optaplanner.core.api.solver.Solver; +import org.optaplanner.core.api.solver.SolverFactory; + +public class OptaPlannerUnitTest { + + static CourseSchedule unsolvedCourseSchedule; + + @BeforeAll + public static void setUp() { + + unsolvedCourseSchedule = new CourseSchedule(); + + for(int i = 0; i < 10; i++){ + unsolvedCourseSchedule.getLectureList().add(new Lecture()); + } + + unsolvedCourseSchedule.getPeriodList().addAll(Arrays.asList(new Integer[] { 1, 2, 3 })); + unsolvedCourseSchedule.getRoomList().addAll(Arrays.asList(new Integer[] { 1, 2 })); + } + + @Test + public void test_whenCustomJavaSolver() { + + SolverFactory solverFactory = SolverFactory.createFromXmlResource("courseScheduleSolverConfiguration.xml"); + Solver solver = solverFactory.buildSolver(); + CourseSchedule solvedCourseSchedule = solver.solve(unsolvedCourseSchedule); + + Assert.assertNotNull(solvedCourseSchedule.getScore()); + Assert.assertEquals(-4, solvedCourseSchedule.getScore().getHardScore()); + } + + @Test + public void test_whenDroolsSolver() { + + SolverFactory solverFactory = SolverFactory.createFromXmlResource("courseScheduleSolverConfigDrools.xml"); + Solver solver = solverFactory.buildSolver(); + CourseSchedule solvedCourseSchedule = solver.solve(unsolvedCourseSchedule); + + Assert.assertNotNull(solvedCourseSchedule.getScore()); + Assert.assertEquals(0, solvedCourseSchedule.getScore().getHardScore()); + } +} From ad3b0a527fd14723676894edefc536c2208226ac Mon Sep 17 00:00:00 2001 From: Amitabh Mandal Date: Wed, 5 Sep 2018 14:36:48 +0530 Subject: [PATCH 116/128] Renamed Junits to standard (#5147) --- .../com/baeldung/java9/process/ProcessUnderstandingTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java-9/src/test/java/com/baeldung/java9/process/ProcessUnderstandingTest.java b/core-java-9/src/test/java/com/baeldung/java9/process/ProcessUnderstandingTest.java index 2f61846c1c..2c5525b9ed 100644 --- a/core-java-9/src/test/java/com/baeldung/java9/process/ProcessUnderstandingTest.java +++ b/core-java-9/src/test/java/com/baeldung/java9/process/ProcessUnderstandingTest.java @@ -48,7 +48,7 @@ class ProcessUnderstandingTest { } //@Test - windows specific - public void givenSubProcess_thenStartSuccessIsAlive() throws IOException { + public void givenSubProcess_whenStarted_thenStartSuccessIsAlive() throws IOException { ProcessBuilder builder = new ProcessBuilder("notepad.exe"); assertTrue(builder.start().isAlive()); } @@ -75,7 +75,7 @@ class ProcessUnderstandingTest { } //@Test - windows specific - public void givenSubProcess_checkAlive() throws IOException, InterruptedException { + public void givenSubProcess_whenDestroyed_thenCheckIfAlive() throws IOException, InterruptedException { ProcessBuilder builder = new ProcessBuilder("notepad.exe"); Process process = builder.start(); Thread.sleep(10000); From 717fb11d11b077fc3e00e827096bff92a2f57b32 Mon Sep 17 00:00:00 2001 From: Syed Muhammad Mansoor Date: Wed, 5 Sep 2018 19:21:31 +1000 Subject: [PATCH 117/128] [BAEL-1824] Working with Aamazon Aurora RDS with Java (#4917) * [BAEL-1824] Working with Aamazon Aurora RDS with Java * Fixed error handling * Fixed code as per review comments * Added comment for accesskey usage --- aws/.gitignore | 1 + .../java/com/baeldung/rds/AWSRDSService.java | 184 ++++++++++++++++++ aws/src/main/resources/db.properties | 4 + 3 files changed, 189 insertions(+) create mode 100644 aws/src/main/java/com/baeldung/rds/AWSRDSService.java create mode 100644 aws/src/main/resources/db.properties diff --git a/aws/.gitignore b/aws/.gitignore index b83d22266a..bf11a4cc38 100644 --- a/aws/.gitignore +++ b/aws/.gitignore @@ -1 +1,2 @@ /target/ +.idea/ \ No newline at end of file diff --git a/aws/src/main/java/com/baeldung/rds/AWSRDSService.java b/aws/src/main/java/com/baeldung/rds/AWSRDSService.java new file mode 100644 index 0000000000..d4da92f30f --- /dev/null +++ b/aws/src/main/java/com/baeldung/rds/AWSRDSService.java @@ -0,0 +1,184 @@ +package com.baeldung.rds; + +import com.amazonaws.auth.AWSCredentialsProvider; +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.regions.Regions; +import com.amazonaws.services.rds.AmazonRDS; +import com.amazonaws.services.rds.AmazonRDSClientBuilder; +import com.amazonaws.services.rds.model.*; + +import java.io.IOException; +import java.io.InputStream; +import java.sql.*; +import java.util.List; +import java.util.Properties; +import java.util.UUID; +import java.util.logging.Logger; + +public class AWSRDSService { + + + final static Logger logger = Logger.getLogger(AWSRDSService.class.getName()); + private AWSCredentialsProvider credentials; + private AmazonRDS amazonRDS; + private String db_username; + private String db_password; + private String db_database; + private String db_hostname; + + /* + * User access key and secret key must be set before execute any operation. + * Follow the link on how to get the user access and secret key + * https://aws.amazon.com/blogs/security/wheres-my-secret-access-key/ + * **/ + public AWSRDSService() throws IOException { + //Init RDS client with credentials and region. + credentials = new + AWSStaticCredentialsProvider(new + BasicAWSCredentials("", + "")); + amazonRDS = AmazonRDSClientBuilder.standard().withCredentials(credentials) + .withRegion(Regions.AP_SOUTHEAST_2).build(); + Properties prop = new Properties(); + InputStream input = AWSRDSService.class.getClassLoader().getResourceAsStream("db.properties"); + prop.load(input); + db_username = prop.getProperty("db_username"); + db_password = prop.getProperty("db_password"); + db_database = prop.getProperty("db_database"); + } + + public AWSRDSService(AmazonRDS amazonRDS){ + this.amazonRDS = amazonRDS; + } + + /** + * create the RDS instance. + * After instance creation, update the db_hostname with endpoint in db.properties. + * */ + + public String launchInstance() { + + String identifier = ""; + CreateDBInstanceRequest request = new CreateDBInstanceRequest(); + // RDS instance name + request.setDBInstanceIdentifier("Sydney"); + request.setEngine("postgres"); + request.setMultiAZ(false); + request.setMasterUsername(db_username); + request.setMasterUserPassword(db_password); + request.setDBName(db_database); + request.setStorageType("gp2"); + request.setAllocatedStorage(10); + + DBInstance instance = amazonRDS.createDBInstance(request); + + // Information about the new RDS instance + identifier = instance.getDBInstanceIdentifier(); + String status = instance.getDBInstanceStatus(); + Endpoint endpoint = instance.getEndpoint(); + String endpoint_url = "Endpoint URL not available yet."; + if (endpoint != null) { + endpoint_url = endpoint.toString(); + } + logger.info(identifier + "\t" + status); + logger.info(endpoint_url); + + return identifier; + + } + + // Describe DB instances + public void listInstances() { + DescribeDBInstancesResult result = amazonRDS.describeDBInstances(); + List instances = result.getDBInstances(); + for (DBInstance instance : instances) { + // Information about each RDS instance + String identifier = instance.getDBInstanceIdentifier(); + String engine = instance.getEngine(); + String status = instance.getDBInstanceStatus(); + Endpoint endpoint = instance.getEndpoint(); + String endpoint_url = "Endpoint URL not available yet."; + if (endpoint != null) { + endpoint_url = endpoint.toString(); + } + logger.info(identifier + "\t" + engine + "\t" + status); + logger.info("\t" + endpoint_url); + } + + } + + //Delete RDS instance + public void terminateInstance(String identifier) { + + DeleteDBInstanceRequest request = new DeleteDBInstanceRequest(); + request.setDBInstanceIdentifier(identifier); + request.setSkipFinalSnapshot(true); + + // Delete the RDS instance + DBInstance instance = amazonRDS.deleteDBInstance(request); + + // Information about the RDS instance being deleted + String status = instance.getDBInstanceStatus(); + Endpoint endpoint = instance.getEndpoint(); + String endpoint_url = "Endpoint URL not available yet."; + if (endpoint != null) { + endpoint_url = endpoint.toString(); + } + + logger.info(identifier + "\t" + status); + logger.info(endpoint_url); + + } + + + public void runJdbcTests() throws SQLException, IOException { + + // Getting database properties from db.properties + Properties prop = new Properties(); + InputStream input = AWSRDSService.class.getClassLoader().getResourceAsStream("db.properties"); + prop.load(input); + db_hostname = prop.getProperty("db_hostname"); + String jdbc_url = "jdbc:postgresql://" + db_hostname + ":5432/" + db_database; + + // Create a connection using the JDBC driver + try (Connection conn = DriverManager.getConnection(jdbc_url, db_username, db_password)) { + + // Create the test table if not exists + Statement statement = conn.createStatement(); + String sql = "CREATE TABLE IF NOT EXISTS jdbc_test (id SERIAL PRIMARY KEY, content VARCHAR(80))"; + statement.executeUpdate(sql); + + // Do some INSERT + PreparedStatement preparedStatement = conn.prepareStatement("INSERT INTO jdbc_test (content) VALUES (?)"); + String content = "" + UUID.randomUUID(); + preparedStatement.setString(1, content); + preparedStatement.executeUpdate(); + logger.info("INSERT: " + content); + + // Do some SELECT + sql = "SELECT * FROM jdbc_test"; + ResultSet resultSet = statement.executeQuery(sql); + while (resultSet.next()) { + String count = resultSet.getString("content"); + logger.info("Total Records: " + count); + } + } + + + } + + public static void main(String[] args) throws IOException, SQLException { + AWSRDSService awsrdsService = new AWSRDSService(); + + String instanceName = awsrdsService.launchInstance(); + + //Add some wait for instance creation. + + awsrdsService.listInstances(); + + awsrdsService.runJdbcTests(); + + awsrdsService.terminateInstance(instanceName); + } +} diff --git a/aws/src/main/resources/db.properties b/aws/src/main/resources/db.properties new file mode 100644 index 0000000000..e934611a2b --- /dev/null +++ b/aws/src/main/resources/db.properties @@ -0,0 +1,4 @@ +db_hostname= +db_username=username +db_password=password +db_database=mydb \ No newline at end of file From 381908a3a05e84e742b36140587ddd23e233ca23 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 6 Sep 2018 00:33:00 +0530 Subject: [PATCH 118/128] BAEL-8841 Merge vaadin and vaadin-spring - Moved vaadin-spring code to vaadin module --- pom.xml | 2 + vaadin/README.md | 1 + vaadin/pom.xml | 59 ++++++++---- .../main/java/com/baeldung/Application.java | 29 ++++++ .../src/main/java/com/baeldung/Employee.java | 51 +++++++++++ .../java/com/baeldung/EmployeeEditor.java | 90 +++++++++++++++++++ .../java/com/baeldung/EmployeeRepository.java | 10 +++ .../src/main/java/com/baeldung/MainView.java | 67 ++++++++++++++ 8 files changed, 290 insertions(+), 19 deletions(-) create mode 100644 vaadin/src/main/java/com/baeldung/Application.java create mode 100644 vaadin/src/main/java/com/baeldung/Employee.java create mode 100644 vaadin/src/main/java/com/baeldung/EmployeeEditor.java create mode 100644 vaadin/src/main/java/com/baeldung/EmployeeRepository.java create mode 100644 vaadin/src/main/java/com/baeldung/MainView.java diff --git a/pom.xml b/pom.xml index 0536a536c2..95c5e23e0a 100644 --- a/pom.xml +++ b/pom.xml @@ -579,6 +579,7 @@ testing-modules/mockserver testing-modules/test-containers undertow + vaadin vertx-and-rxjava saas deeplearning4j @@ -1126,6 +1127,7 @@ testing-modules/mockserver testing-modules/test-containers undertow + vaadin vertx-and-rxjava saas deeplearning4j diff --git a/vaadin/README.md b/vaadin/README.md index 0dfeea8996..43d2cc8961 100644 --- a/vaadin/README.md +++ b/vaadin/README.md @@ -1,3 +1,4 @@ ## Relevant articles: - [Introduction to Vaadin](http://www.baeldung.com/vaadin) +- [Sample Application with Spring Boot and Vaadin](https://www.baeldung.com/spring-boot-vaadin) diff --git a/vaadin/pom.xml b/vaadin/pom.xml index ce2cd592d7..c34ffa3636 100644 --- a/vaadin/pom.xml +++ b/vaadin/pom.xml @@ -8,21 +8,30 @@ war 1.0-SNAPSHOT Vaadin - - 3 - - + + parent-boot-2 com.baeldung - parent-modules - 1.0.0-SNAPSHOT + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + com.vaadin + vaadin-bom + ${vaadin.version} + pom + import + + + + javax.servlet javax.servlet-api - ${servlet.version} provided @@ -41,6 +50,25 @@ com.vaadin vaadin-themes + + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.vaadin + vaadin-spring-boot-starter + ${vaadin-spring-boot-starter.version} + + + com.h2database + h2 + + + org.springframework.boot + spring-boot-starter-test + test + @@ -97,21 +125,13 @@ 2 + + org.springframework.boot + spring-boot-maven-plugin + - - - - com.vaadin - vaadin-bom - ${vaadin.version} - pom - import - - - - vaadin-addons @@ -166,6 +186,7 @@ 3.0.1 7.7.10 8.0.6 + 10.0.1 9.3.9.v20160517 UTF-8 1.8 diff --git a/vaadin/src/main/java/com/baeldung/Application.java b/vaadin/src/main/java/com/baeldung/Application.java new file mode 100644 index 0000000000..1d3084723a --- /dev/null +++ b/vaadin/src/main/java/com/baeldung/Application.java @@ -0,0 +1,29 @@ +package com.baeldung; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; + +@SpringBootApplication +public class Application { + + private static final Logger log = LoggerFactory.getLogger(Application.class); + + public static void main(String[] args) { + SpringApplication.run(Application.class); + } + + @Bean + public CommandLineRunner loadData(EmployeeRepository repository) { + return (args) -> { + repository.save(new Employee("Bill", "Gates")); + repository.save(new Employee("Mark", "Zuckerberg")); + repository.save(new Employee("Sundar", "Pichai")); + repository.save(new Employee("Jeff", "Bezos")); + }; + } +} diff --git a/vaadin/src/main/java/com/baeldung/Employee.java b/vaadin/src/main/java/com/baeldung/Employee.java new file mode 100644 index 0000000000..726f0838b6 --- /dev/null +++ b/vaadin/src/main/java/com/baeldung/Employee.java @@ -0,0 +1,51 @@ +package com.baeldung; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +public class Employee { + + @Id + @GeneratedValue + private Long id; + + private String firstName; + + private String lastName; + + protected Employee() { + } + + public Employee(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } + + public Long getId() { + return 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; + } + + @Override + public String toString() { + return String.format("Employee[id=%d, firstName='%s', lastName='%s']", id, firstName, lastName); + } + +} diff --git a/vaadin/src/main/java/com/baeldung/EmployeeEditor.java b/vaadin/src/main/java/com/baeldung/EmployeeEditor.java new file mode 100644 index 0000000000..ee312786d1 --- /dev/null +++ b/vaadin/src/main/java/com/baeldung/EmployeeEditor.java @@ -0,0 +1,90 @@ +package com.baeldung; + +import com.vaadin.flow.component.Key; +import com.vaadin.flow.component.KeyNotifier; +import com.vaadin.flow.component.button.Button; +import com.vaadin.flow.component.icon.VaadinIcon; +import com.vaadin.flow.component.orderedlayout.HorizontalLayout; +import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.component.textfield.TextField; +import com.vaadin.flow.data.binder.Binder; +import com.vaadin.flow.spring.annotation.SpringComponent; +import com.vaadin.flow.spring.annotation.UIScope; +import org.springframework.beans.factory.annotation.Autowired; + +@SpringComponent +@UIScope +public class EmployeeEditor extends VerticalLayout implements KeyNotifier { + + private final EmployeeRepository repository; + + private Employee employee; + + TextField firstName = new TextField("First name"); + TextField lastName = new TextField("Last name"); + + Button save = new Button("Save", VaadinIcon.CHECK.create()); + Button cancel = new Button("Cancel"); + Button delete = new Button("Delete", VaadinIcon.TRASH.create()); + HorizontalLayout actions = new HorizontalLayout(save, cancel, delete); + + Binder binder = new Binder<>(Employee.class); + private ChangeHandler changeHandler; + + @Autowired + public EmployeeEditor(EmployeeRepository repository) { + this.repository = repository; + + add(firstName, lastName, actions); + + binder.bindInstanceFields(this); + + setSpacing(true); + + save.getElement().getThemeList().add("primary"); + delete.getElement().getThemeList().add("error"); + + addKeyPressListener(Key.ENTER, e -> save()); + + save.addClickListener(e -> save()); + delete.addClickListener(e -> delete()); + cancel.addClickListener(e -> editEmployee(employee)); + setVisible(false); + } + + void delete() { + repository.delete(employee); + changeHandler.onChange(); + } + + void save() { + repository.save(employee); + changeHandler.onChange(); + } + + public interface ChangeHandler { + void onChange(); + } + + public final void editEmployee(Employee c) { + if (c == null) { + setVisible(false); + return; + } + final boolean persisted = c.getId() != null; + if (persisted) { + employee = repository.findById(c.getId()).get(); + } else { + employee = c; + } + + cancel.setVisible(persisted); + binder.setBean(employee); + setVisible(true); + firstName.focus(); + } + + public void setChangeHandler(ChangeHandler h) { + changeHandler = h; + } +} diff --git a/vaadin/src/main/java/com/baeldung/EmployeeRepository.java b/vaadin/src/main/java/com/baeldung/EmployeeRepository.java new file mode 100644 index 0000000000..044160da78 --- /dev/null +++ b/vaadin/src/main/java/com/baeldung/EmployeeRepository.java @@ -0,0 +1,10 @@ +package com.baeldung; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface EmployeeRepository extends JpaRepository { + + List findByLastNameStartsWithIgnoreCase(String lastName); +} diff --git a/vaadin/src/main/java/com/baeldung/MainView.java b/vaadin/src/main/java/com/baeldung/MainView.java new file mode 100644 index 0000000000..6d4c0aaa88 --- /dev/null +++ b/vaadin/src/main/java/com/baeldung/MainView.java @@ -0,0 +1,67 @@ +package com.baeldung; + +import org.springframework.util.StringUtils; + +import com.vaadin.flow.component.button.Button; +import com.vaadin.flow.component.grid.Grid; +import com.vaadin.flow.component.icon.VaadinIcon; +import com.vaadin.flow.component.orderedlayout.HorizontalLayout; +import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.component.textfield.TextField; +import com.vaadin.flow.data.value.ValueChangeMode; +import com.vaadin.flow.router.Route; + +@Route +public class MainView extends VerticalLayout { + + private final EmployeeRepository employeeRepository; + + private final EmployeeEditor editor; + + final Grid grid; + + final TextField filter; + + private final Button addNewBtn; + + public MainView(EmployeeRepository repo, EmployeeEditor editor) { + this.employeeRepository = repo; + this.editor = editor; + this.grid = new Grid<>(Employee.class); + this.filter = new TextField(); + this.addNewBtn = new Button("New employee", VaadinIcon.PLUS.create()); + + HorizontalLayout actions = new HorizontalLayout(filter, addNewBtn); + add(actions, grid, editor); + + grid.setHeight("200px"); + grid.setColumns("id", "firstName", "lastName"); + grid.getColumnByKey("id").setWidth("50px").setFlexGrow(0); + + filter.setPlaceholder("Filter by last name"); + + filter.setValueChangeMode(ValueChangeMode.EAGER); + filter.addValueChangeListener(e -> listEmployees(e.getValue())); + + grid.asSingleSelect().addValueChangeListener(e -> { + editor.editEmployee(e.getValue()); + }); + + addNewBtn.addClickListener(e -> editor.editEmployee(new Employee("", ""))); + + editor.setChangeHandler(() -> { + editor.setVisible(false); + listEmployees(filter.getValue()); + }); + + listEmployees(null); + } + + void listEmployees(String filterText) { + if (StringUtils.isEmpty(filterText)) { + grid.setItems(employeeRepository.findAll()); + } else { + grid.setItems(employeeRepository.findByLastNameStartsWithIgnoreCase(filterText)); + } + } +} From 06cccd587b8ba3935885611a77aff27fc3647b0b Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 6 Sep 2018 00:34:59 +0530 Subject: [PATCH 119/128] BAEL-8841 Merge vaadin and vaadin-spring - Removed vaadin-spring project --- vaadin-spring/pom.xml | 64 ------------- .../main/java/com/baeldung/Application.java | 29 ------ .../src/main/java/com/baeldung/Employee.java | 51 ----------- .../java/com/baeldung/EmployeeEditor.java | 90 ------------------- .../java/com/baeldung/EmployeeRepository.java | 10 --- .../src/main/java/com/baeldung/MainView.java | 67 -------------- vaadin-spring/src/main/resources/logback.xml | 13 --- 7 files changed, 324 deletions(-) delete mode 100644 vaadin-spring/pom.xml delete mode 100644 vaadin-spring/src/main/java/com/baeldung/Application.java delete mode 100644 vaadin-spring/src/main/java/com/baeldung/Employee.java delete mode 100644 vaadin-spring/src/main/java/com/baeldung/EmployeeEditor.java delete mode 100644 vaadin-spring/src/main/java/com/baeldung/EmployeeRepository.java delete mode 100644 vaadin-spring/src/main/java/com/baeldung/MainView.java delete mode 100644 vaadin-spring/src/main/resources/logback.xml diff --git a/vaadin-spring/pom.xml b/vaadin-spring/pom.xml deleted file mode 100644 index 09f79f2676..0000000000 --- a/vaadin-spring/pom.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - 4.0.0 - - com.baeldung - vaadin-spring - 0.1.0 - - - parent-boot-2 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-2 - - - - 1.8 - - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - com.vaadin - vaadin-spring-boot-starter - - - com.h2database - h2 - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - com.vaadin - vaadin-bom - 10.0.1 - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/vaadin-spring/src/main/java/com/baeldung/Application.java b/vaadin-spring/src/main/java/com/baeldung/Application.java deleted file mode 100644 index 1d3084723a..0000000000 --- a/vaadin-spring/src/main/java/com/baeldung/Application.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.baeldung; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; - -@SpringBootApplication -public class Application { - - private static final Logger log = LoggerFactory.getLogger(Application.class); - - public static void main(String[] args) { - SpringApplication.run(Application.class); - } - - @Bean - public CommandLineRunner loadData(EmployeeRepository repository) { - return (args) -> { - repository.save(new Employee("Bill", "Gates")); - repository.save(new Employee("Mark", "Zuckerberg")); - repository.save(new Employee("Sundar", "Pichai")); - repository.save(new Employee("Jeff", "Bezos")); - }; - } -} diff --git a/vaadin-spring/src/main/java/com/baeldung/Employee.java b/vaadin-spring/src/main/java/com/baeldung/Employee.java deleted file mode 100644 index 726f0838b6..0000000000 --- a/vaadin-spring/src/main/java/com/baeldung/Employee.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.baeldung; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; - -@Entity -public class Employee { - - @Id - @GeneratedValue - private Long id; - - private String firstName; - - private String lastName; - - protected Employee() { - } - - public Employee(String firstName, String lastName) { - this.firstName = firstName; - this.lastName = lastName; - } - - public Long getId() { - return 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; - } - - @Override - public String toString() { - return String.format("Employee[id=%d, firstName='%s', lastName='%s']", id, firstName, lastName); - } - -} diff --git a/vaadin-spring/src/main/java/com/baeldung/EmployeeEditor.java b/vaadin-spring/src/main/java/com/baeldung/EmployeeEditor.java deleted file mode 100644 index ee312786d1..0000000000 --- a/vaadin-spring/src/main/java/com/baeldung/EmployeeEditor.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.baeldung; - -import com.vaadin.flow.component.Key; -import com.vaadin.flow.component.KeyNotifier; -import com.vaadin.flow.component.button.Button; -import com.vaadin.flow.component.icon.VaadinIcon; -import com.vaadin.flow.component.orderedlayout.HorizontalLayout; -import com.vaadin.flow.component.orderedlayout.VerticalLayout; -import com.vaadin.flow.component.textfield.TextField; -import com.vaadin.flow.data.binder.Binder; -import com.vaadin.flow.spring.annotation.SpringComponent; -import com.vaadin.flow.spring.annotation.UIScope; -import org.springframework.beans.factory.annotation.Autowired; - -@SpringComponent -@UIScope -public class EmployeeEditor extends VerticalLayout implements KeyNotifier { - - private final EmployeeRepository repository; - - private Employee employee; - - TextField firstName = new TextField("First name"); - TextField lastName = new TextField("Last name"); - - Button save = new Button("Save", VaadinIcon.CHECK.create()); - Button cancel = new Button("Cancel"); - Button delete = new Button("Delete", VaadinIcon.TRASH.create()); - HorizontalLayout actions = new HorizontalLayout(save, cancel, delete); - - Binder binder = new Binder<>(Employee.class); - private ChangeHandler changeHandler; - - @Autowired - public EmployeeEditor(EmployeeRepository repository) { - this.repository = repository; - - add(firstName, lastName, actions); - - binder.bindInstanceFields(this); - - setSpacing(true); - - save.getElement().getThemeList().add("primary"); - delete.getElement().getThemeList().add("error"); - - addKeyPressListener(Key.ENTER, e -> save()); - - save.addClickListener(e -> save()); - delete.addClickListener(e -> delete()); - cancel.addClickListener(e -> editEmployee(employee)); - setVisible(false); - } - - void delete() { - repository.delete(employee); - changeHandler.onChange(); - } - - void save() { - repository.save(employee); - changeHandler.onChange(); - } - - public interface ChangeHandler { - void onChange(); - } - - public final void editEmployee(Employee c) { - if (c == null) { - setVisible(false); - return; - } - final boolean persisted = c.getId() != null; - if (persisted) { - employee = repository.findById(c.getId()).get(); - } else { - employee = c; - } - - cancel.setVisible(persisted); - binder.setBean(employee); - setVisible(true); - firstName.focus(); - } - - public void setChangeHandler(ChangeHandler h) { - changeHandler = h; - } -} diff --git a/vaadin-spring/src/main/java/com/baeldung/EmployeeRepository.java b/vaadin-spring/src/main/java/com/baeldung/EmployeeRepository.java deleted file mode 100644 index 044160da78..0000000000 --- a/vaadin-spring/src/main/java/com/baeldung/EmployeeRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.baeldung; - -import java.util.List; - -import org.springframework.data.jpa.repository.JpaRepository; - -public interface EmployeeRepository extends JpaRepository { - - List findByLastNameStartsWithIgnoreCase(String lastName); -} diff --git a/vaadin-spring/src/main/java/com/baeldung/MainView.java b/vaadin-spring/src/main/java/com/baeldung/MainView.java deleted file mode 100644 index 6d4c0aaa88..0000000000 --- a/vaadin-spring/src/main/java/com/baeldung/MainView.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.baeldung; - -import org.springframework.util.StringUtils; - -import com.vaadin.flow.component.button.Button; -import com.vaadin.flow.component.grid.Grid; -import com.vaadin.flow.component.icon.VaadinIcon; -import com.vaadin.flow.component.orderedlayout.HorizontalLayout; -import com.vaadin.flow.component.orderedlayout.VerticalLayout; -import com.vaadin.flow.component.textfield.TextField; -import com.vaadin.flow.data.value.ValueChangeMode; -import com.vaadin.flow.router.Route; - -@Route -public class MainView extends VerticalLayout { - - private final EmployeeRepository employeeRepository; - - private final EmployeeEditor editor; - - final Grid grid; - - final TextField filter; - - private final Button addNewBtn; - - public MainView(EmployeeRepository repo, EmployeeEditor editor) { - this.employeeRepository = repo; - this.editor = editor; - this.grid = new Grid<>(Employee.class); - this.filter = new TextField(); - this.addNewBtn = new Button("New employee", VaadinIcon.PLUS.create()); - - HorizontalLayout actions = new HorizontalLayout(filter, addNewBtn); - add(actions, grid, editor); - - grid.setHeight("200px"); - grid.setColumns("id", "firstName", "lastName"); - grid.getColumnByKey("id").setWidth("50px").setFlexGrow(0); - - filter.setPlaceholder("Filter by last name"); - - filter.setValueChangeMode(ValueChangeMode.EAGER); - filter.addValueChangeListener(e -> listEmployees(e.getValue())); - - grid.asSingleSelect().addValueChangeListener(e -> { - editor.editEmployee(e.getValue()); - }); - - addNewBtn.addClickListener(e -> editor.editEmployee(new Employee("", ""))); - - editor.setChangeHandler(() -> { - editor.setVisible(false); - listEmployees(filter.getValue()); - }); - - listEmployees(null); - } - - void listEmployees(String filterText) { - if (StringUtils.isEmpty(filterText)) { - grid.setItems(employeeRepository.findAll()); - } else { - grid.setItems(employeeRepository.findByLastNameStartsWithIgnoreCase(filterText)); - } - } -} diff --git a/vaadin-spring/src/main/resources/logback.xml b/vaadin-spring/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/vaadin-spring/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 a2f77a27834092f2b03e9ff9a2daf0df706322ce Mon Sep 17 00:00:00 2001 From: freddyaott Date: Thu, 6 Sep 2018 03:45:42 +0200 Subject: [PATCH 120/128] [BAEL-1401] Fuel HTTP Library with Kotlin (#5142) * builder pattern in kotlin * builder pattern in kotlin new-line * deleted Sandbox, added unit test * add other tests * named and default parameters builder * Make FoodOrderNamed a data class * idiomatic Kotlin version * Fuel HTTP library * fuel pom property * BAEL-1401 Removed extra pom.xml properties --- core-kotlin/pom.xml | 23 +- .../kotlin/com/baeldung/fuel/Interceptors.kt | 11 + .../src/main/kotlin/com/baeldung/fuel/Post.kt | 15 + .../com/baeldung/fuel/PostRoutingAPI.kt | 42 +++ .../builder/BuilderPatternUnitTest.kt | 1 + .../com/baeldung/fuel/FuelHttpUnitTest.kt | 286 ++++++++++++++++++ 6 files changed, 377 insertions(+), 1 deletion(-) create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/fuel/Interceptors.kt create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/fuel/Post.kt create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/fuel/PostRoutingAPI.kt create mode 100644 core-kotlin/src/test/kotlin/com/baeldung/fuel/FuelHttpUnitTest.kt diff --git a/core-kotlin/pom.xml b/core-kotlin/pom.xml index 6fdc7c7c1a..88f54963ed 100644 --- a/core-kotlin/pom.xml +++ b/core-kotlin/pom.xml @@ -87,6 +87,26 @@ h2 ${h2database.version} + + com.github.kittinunf.fuel + fuel + ${fuel.version} + + + com.github.kittinunf.fuel + fuel-gson + ${fuel.version} + + + com.github.kittinunf.fuel + fuel-rxjava + ${fuel.version} + + + com.github.kittinunf.fuel + fuel-coroutines + ${fuel.version} + @@ -100,6 +120,7 @@ 3.10.0 1.4.197 0.10.4 + 1.15.0 - \ No newline at end of file + diff --git a/core-kotlin/src/main/kotlin/com/baeldung/fuel/Interceptors.kt b/core-kotlin/src/main/kotlin/com/baeldung/fuel/Interceptors.kt new file mode 100644 index 0000000000..377ef979dc --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/fuel/Interceptors.kt @@ -0,0 +1,11 @@ +package com.baeldung.fuel + +import com.github.kittinunf.fuel.core.Request + +fun tokenInterceptor() = { + next: (Request) -> Request -> + { req: Request -> + req.header(mapOf("Authorization" to "Bearer AbCdEf123456")) + next(req) + } +} \ No newline at end of file diff --git a/core-kotlin/src/main/kotlin/com/baeldung/fuel/Post.kt b/core-kotlin/src/main/kotlin/com/baeldung/fuel/Post.kt new file mode 100644 index 0000000000..035dfe7aa0 --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/fuel/Post.kt @@ -0,0 +1,15 @@ +package com.baeldung.fuel + +import com.github.kittinunf.fuel.core.ResponseDeserializable +import com.google.gson.Gson + +data class Post(var userId:Int, + var id:Int, + var title:String, + var body:String){ + + + class Deserializer : ResponseDeserializable> { + override fun deserialize(content: String): Array = Gson().fromJson(content, Array::class.java) + } +} \ No newline at end of file diff --git a/core-kotlin/src/main/kotlin/com/baeldung/fuel/PostRoutingAPI.kt b/core-kotlin/src/main/kotlin/com/baeldung/fuel/PostRoutingAPI.kt new file mode 100644 index 0000000000..8238c41e56 --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/fuel/PostRoutingAPI.kt @@ -0,0 +1,42 @@ +package com.baeldung.fuel + +import com.github.kittinunf.fuel.core.Method +import com.github.kittinunf.fuel.util.FuelRouting + +sealed class PostRoutingAPI : FuelRouting { + + override val basePath = "https://jsonplaceholder.typicode.com" + + class posts(val id: String, override val body: String?): PostRoutingAPI() + + class comments(val postId: String, override val body: String?): PostRoutingAPI() + + override val method: Method + get() { + return when(this) { + is PostRoutingAPI.posts -> Method.GET + is PostRoutingAPI.comments -> Method.GET + } + } + + override val path: String + get() { + return when(this) { + is PostRoutingAPI.posts -> "/posts" + is PostRoutingAPI.comments -> "/comments" + } + } + + override val params: List>? + get() { + return when(this) { + is PostRoutingAPI.posts -> listOf("id" to this.id) + is PostRoutingAPI.comments -> listOf("postId" to this.postId) + } + } + + override val headers: Map? + get() { + return null + } +} diff --git a/core-kotlin/src/test/kotlin/com/baeldung/builder/BuilderPatternUnitTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/builder/BuilderPatternUnitTest.kt index 17f5a43479..a6687b6e0a 100644 --- a/core-kotlin/src/test/kotlin/com/baeldung/builder/BuilderPatternUnitTest.kt +++ b/core-kotlin/src/test/kotlin/com/baeldung/builder/BuilderPatternUnitTest.kt @@ -93,6 +93,7 @@ internal class BuilderPatternUnitTest { Assertions.assertNull(foodOrder.fish) } + @Test fun whenBuildingFoodOrderApplySettingValues_thenFieldsNotNull() { diff --git a/core-kotlin/src/test/kotlin/com/baeldung/fuel/FuelHttpUnitTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/fuel/FuelHttpUnitTest.kt new file mode 100644 index 0000000000..f0f9267618 --- /dev/null +++ b/core-kotlin/src/test/kotlin/com/baeldung/fuel/FuelHttpUnitTest.kt @@ -0,0 +1,286 @@ +package com.baeldung.fuel + +import awaitObjectResult +import awaitStringResponse +import com.github.kittinunf.fuel.Fuel +import com.github.kittinunf.fuel.core.FuelManager +import com.github.kittinunf.fuel.core.Request +import com.github.kittinunf.fuel.core.interceptors.cUrlLoggingRequestInterceptor +import com.github.kittinunf.fuel.gson.responseObject +import com.github.kittinunf.fuel.httpGet +import com.github.kittinunf.fuel.rx.rx_object +import com.google.gson.Gson +import kotlinx.coroutines.experimental.runBlocking +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.Test +import java.io.File +import java.util.concurrent.CountDownLatch + +internal class FuelHttpUnitTest { + + @Test + fun whenMakingAsyncHttpGetRequest_thenResponseNotNullAndErrorNullAndStatusCode200() { + + val latch = CountDownLatch(1) + + "http://httpbin.org/get".httpGet().response{ + request, response, result -> + + val (data, error) = result + + Assertions.assertNull(error) + Assertions.assertNotNull(data) + Assertions.assertEquals(200,response.statusCode) + + latch.countDown() + } + + latch.await() + + } + + @Test + fun whenMakingSyncHttpGetRequest_thenResponseNotNullAndErrorNullAndStatusCode200() { + + val (request, response, result) = "http://httpbin.org/get".httpGet().response() + val (data, error) = result + + Assertions.assertNull(error) + Assertions.assertNotNull(data) + Assertions.assertEquals(200,response.statusCode) + + } + + @Test + fun whenMakingSyncHttpGetURLEncodedRequest_thenResponseNotNullAndErrorNullAndStatusCode200() { + + val (request, response, result) = + "https://jsonplaceholder.typicode.com/posts" + .httpGet(listOf("id" to "1")).response() + val (data, error) = result + + Assertions.assertNull(error) + Assertions.assertNotNull(data) + Assertions.assertEquals(200,response.statusCode) + + } + + @Test + fun whenMakingAsyncHttpPostRequest_thenResponseNotNullAndErrorNullAndStatusCode200() { + + val latch = CountDownLatch(1) + + Fuel.post("http://httpbin.org/post").response{ + request, response, result -> + + val (data, error) = result + + Assertions.assertNull(error) + Assertions.assertNotNull(data) + Assertions.assertEquals(200,response.statusCode) + + latch.countDown() + } + + latch.await() + + } + + @Test + fun whenMakingSyncHttpPostRequest_thenResponseNotNullAndErrorNullAndStatusCode200() { + + val (request, response, result) = Fuel.post("http://httpbin.org/post").response() + val (data, error) = result + + Assertions.assertNull(error) + Assertions.assertNotNull(data) + Assertions.assertEquals(200,response.statusCode) + } + + @Test + fun whenMakingSyncHttpPostRequestwithBody_thenResponseNotNullAndErrorNullAndStatusCode200() { + + val (request, response, result) = Fuel.post("https://jsonplaceholder.typicode.com/posts") + .body("{ \"title\" : \"foo\",\"body\" : \"bar\",\"id\" : \"1\"}") + .response() + + val (data, error) = result + + Assertions.assertNull(error) + Assertions.assertNotNull(data) + Assertions.assertEquals(201,response.statusCode) + } + + @Test + fun givenFuelInstance_whenMakingSyncHttpGetRequest_thenResponseNotNullAndErrorNullAndStatusCode200() { + + FuelManager.instance.basePath = "http://httpbin.org" + FuelManager.instance.baseHeaders = mapOf("OS" to "macOS High Sierra") + + FuelManager.instance.addRequestInterceptor(cUrlLoggingRequestInterceptor()) + FuelManager.instance.addRequestInterceptor(tokenInterceptor()) + + + val (request, response, result) = "/get" + .httpGet().response() + val (data, error) = result + + Assertions.assertNull(error) + Assertions.assertNotNull(data) + Assertions.assertEquals(200,response.statusCode) + } + + @Test + fun givenInterceptors_whenMakingSyncHttpGetRequest_thenResponseNotNullAndErrorNullAndStatusCode200() { + + FuelManager.instance.basePath = "http://httpbin.org" + FuelManager.instance.addRequestInterceptor(cUrlLoggingRequestInterceptor()) + FuelManager.instance.addRequestInterceptor(tokenInterceptor()) + + val (request, response, result) = "/get" + .httpGet().response() + val (data, error) = result + + Assertions.assertNull(error) + Assertions.assertNotNull(data) + Assertions.assertEquals(200,response.statusCode) + } + + @Test + fun whenDownloadFile_thenCreateFileResponseNotNullAndErrorNullAndStatusCode200() { + + Fuel.download("http://httpbin.org/bytes/32768").destination { response, url -> + File.createTempFile("temp", ".tmp") + }.response{ + request, response, result -> + + val (data, error) = result + Assertions.assertNull(error) + Assertions.assertNotNull(data) + Assertions.assertEquals(200,response.statusCode) + } + } + + @Test + fun whenDownloadFilewithProgressHandler_thenCreateFileResponseNotNullAndErrorNullAndStatusCode200() { + + val (request, response, result) = Fuel.download("http://httpbin.org/bytes/327680") + .destination { response, url -> File.createTempFile("temp", ".tmp") + }.progress { readBytes, totalBytes -> + val progress = readBytes.toFloat() / totalBytes.toFloat() + }.response () + + val (data, error) = result + Assertions.assertNull(error) + Assertions.assertNotNull(data) + Assertions.assertEquals(200,response.statusCode) + + + } + + @Test + fun whenMakeGetRequest_thenDeserializePostwithGson() { + + val latch = CountDownLatch(1) + + "https://jsonplaceholder.typicode.com/posts/1".httpGet().responseObject { _,_, result -> + val post = result.component1() + Assertions.assertEquals(1, post?.userId) + latch.countDown() + } + + latch.await() + + } + + @Test + fun whenMakePOSTRequest_thenSerializePostwithGson() { + + val post = Post(1,1, "Lorem", "Lorem Ipse dolor sit amet") + + val (request, response, result) = Fuel.post("https://jsonplaceholder.typicode.com/posts") + .header("Content-Type" to "application/json") + .body(Gson().toJson(post).toString()) + .response() + + Assertions.assertEquals(201,response.statusCode) + + } + + @Test + fun whenMakeGETRequestWithRxJava_thenDeserializePostwithGson() { + + val latch = CountDownLatch(1) + + + "https://jsonplaceholder.typicode.com/posts?id=1" + .httpGet().rx_object(Post.Deserializer()).subscribe{ + res, throwable -> + + val post = res.component1() + Assertions.assertEquals(1, post?.get(0)?.userId) + latch.countDown() + } + + latch.await() + + } + + @Test + fun whenMakeGETRequestUsingCoroutines_thenResponseStatusCode200() { + + runBlocking { + val (request, response, result) = Fuel.get("http://httpbin.org/get").awaitStringResponse() + + result.fold({ data -> + Assertions.assertEquals(200, response.statusCode) + + }, { error -> }) + } + + } + + @Test + fun whenMakeGETRequestUsingCoroutines_thenDeserializeResponse() { + + + runBlocking { + Fuel.get("https://jsonplaceholder.typicode.com/posts?id=1").awaitObjectResult(Post.Deserializer()) + .fold({ data -> + Assertions.assertEquals(1, data.get(0).userId) + }, { error -> }) + } + + } + + @Test + fun whenMakeGETPostRequestUsingRoutingAPI_thenDeserializeResponse() { + + val latch = CountDownLatch(1) + + Fuel.request(PostRoutingAPI.posts("1",null)) + .responseObject(Post.Deserializer()) { + request, response, result -> + Assertions.assertEquals(1, result.component1()?.get(0)?.userId) + latch.countDown() + } + + latch.await() + } + + @Test + fun whenMakeGETCommentRequestUsingRoutingAPI_thenResponseStausCode200() { + + val latch = CountDownLatch(1) + + Fuel.request(PostRoutingAPI.comments("1",null)) + .responseString { request, response, result -> + Assertions.assertEquals(200, response.statusCode) + latch.countDown() + } + + latch.await() + } + + +} \ No newline at end of file From f9277b37fe7fe0170dca271a95310e2a45bef1d7 Mon Sep 17 00:00:00 2001 From: Sai <41847480+psychsane@users.noreply.github.com> Date: Thu, 6 Sep 2018 17:57:53 +0530 Subject: [PATCH 121/128] Add examples for substring operations (#5139) --- .../baeldung/string/SubstringUnitTest.java | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 java-strings/src/test/java/com/baeldung/string/SubstringUnitTest.java diff --git a/java-strings/src/test/java/com/baeldung/string/SubstringUnitTest.java b/java-strings/src/test/java/com/baeldung/string/SubstringUnitTest.java new file mode 100644 index 0000000000..3a4e231828 --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/SubstringUnitTest.java @@ -0,0 +1,62 @@ +package com.baeldung.string; + +import java.util.Scanner; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.lang3.StringUtils; +import org.junit.Assert; +import org.junit.Test; + +public class SubstringUnitTest { + + String text = "Julia Evans was born on 25-09-1984. She is currently living in the USA (United States of America)."; + + @Test + public void givenAString_whenUsedStringUtils_ShouldReturnProperSubstring() { + Assert.assertEquals("United States of America", StringUtils.substringBetween(text, "(", ")")); + Assert.assertEquals("the USA (United States of America).", StringUtils.substringAfter(text, "living in ")); + Assert.assertEquals("Julia Evans", StringUtils.substringBefore(text, " was born")); + } + + @Test + public void givenAString_whenUsedScanner_ShouldReturnProperSubstring() { + try (Scanner scanner = new Scanner(text)) { + scanner.useDelimiter("\\."); + Assert.assertEquals("Julia Evans was born on 25-09-1984", scanner.next()); + } + } + + @Test + public void givenAString_whenUsedSplit_ShouldReturnProperSubstring() { + String[] sentences = text.split("\\."); + Assert.assertEquals("Julia Evans was born on 25-09-1984", sentences[0]); + } + + @Test + public void givenAString_whenUsedRegex_ShouldReturnProperSubstring() { + Pattern pattern = Pattern.compile("\\d{2}\\-\\d{2}-\\d{4}"); + Matcher matcher = pattern.matcher(text); + + if (matcher.find()) { + Assert.assertEquals("25-09-1984", matcher.group()); + } + } + + @Test + public void givenAString_whenUsedSubSequence_ShouldReturnProperSubstring() { + Assert.assertEquals("USA (United States of America)", text.subSequence(67, text.length() - 1)); + } + + @Test + public void givenAString_whenUsedSubstring_ShouldReturnProperSubstring() { + Assert.assertEquals("USA (United States of America).", text.substring(67)); + Assert.assertEquals("USA (United States of America)", text.substring(67, text.length() - 1)); + } + + @Test + public void givenAString_whenUsedSubstringWithIndexOf_ShouldReturnProperSubstring() { + Assert.assertEquals("United States of America", text.substring(text.indexOf('(') + 1, text.indexOf(')'))); + } + +} From 4798ba0ea235f10a3d3838baa1acc6597e2aa355 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 6 Sep 2018 22:37:01 +0530 Subject: [PATCH 122/128] BAEL-8841 Merge vaadin and vaadin-spring - Added spring-boot-maven-plugin inside plugin management for parent-boot-1 and parent-boot-2 so that it is available as a managed resource for their child projects --- parent-boot-1/pom.xml | 17 +++++++++-------- parent-boot-2/pom.xml | 16 +++++++++------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/parent-boot-1/pom.xml b/parent-boot-1/pom.xml index c52327a42e..7742841d07 100644 --- a/parent-boot-1/pom.xml +++ b/parent-boot-1/pom.xml @@ -37,16 +37,17 @@ - - - org.springframework.boot - spring-boot-maven-plugin - 1.5.15.RELEASE - - + + + + org.springframework.boot + spring-boot-maven-plugin + 1.5.15.RELEASE + + + - 3.1.0 diff --git a/parent-boot-2/pom.xml b/parent-boot-2/pom.xml index 86a77a90db..de6cb5d068 100644 --- a/parent-boot-2/pom.xml +++ b/parent-boot-2/pom.xml @@ -36,13 +36,15 @@ - - - org.springframework.boot - spring-boot-maven-plugin - 2.0.4.RELEASE - - + + + + org.springframework.boot + spring-boot-maven-plugin + 2.0.4.RELEASE + + + From 53c8528e7b86264233132818443970bfcb22c943 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 6 Sep 2018 22:47:36 +0530 Subject: [PATCH 123/128] BAEL-8873 Analyse and remove meecrowave - Removing corrupted duplicated project meecrowave, all source is same as existing project apache-meecrowave --- meecrowave/pom.xml | 57 ------------------- .../java/com/baeldung/meecrowave/Article.java | 30 ---------- .../baeldung/meecrowave/ArticleEndpoints.java | 32 ----------- .../baeldung/meecrowave/ArticleService.java | 10 ---- .../java/com/baeldung/meecrowave/Server.java | 16 ------ meecrowave/src/main/resources/logback.xml | 13 ----- .../meecrowave/ArticleEndpointsTest.java | 41 ------------- 7 files changed, 199 deletions(-) delete mode 100644 meecrowave/pom.xml delete mode 100644 meecrowave/src/main/java/com/baeldung/meecrowave/Article.java delete mode 100644 meecrowave/src/main/java/com/baeldung/meecrowave/ArticleEndpoints.java delete mode 100644 meecrowave/src/main/java/com/baeldung/meecrowave/ArticleService.java delete mode 100644 meecrowave/src/main/java/com/baeldung/meecrowave/Server.java delete mode 100644 meecrowave/src/main/resources/logback.xml delete mode 100644 meecrowave/src/test/java/com/baeldung/meecrowave/ArticleEndpointsTest.java diff --git a/meecrowave/pom.xml b/meecrowave/pom.xml deleted file mode 100644 index cf13aa1c1b..0000000000 --- a/meecrowave/pom.xml +++ /dev/null @@ -1,57 +0,0 @@ - - 4.0.0 - com.baeldung - apache-meecrowave - 0.0.1 - apache-meecrowave - A sample REST API application with Meecrowave - - - 1.8 - 1.8 - - - - - org.apache.meecrowave - meecrowave-core - 1.2.1 - - - - org.apache.meecrowave - meecrowave-jpa - 1.2.1 - - - - com.squareup.okhttp3 - okhttp - 3.10.0 - - - org.apache.meecrowave - meecrowave-junit - 1.2.0 - test - - - - junit - junit - 4.10 - test - - - - - - - org.apache.meecrowave - meecrowave-maven-plugin - 1.2.1 - - - - \ No newline at end of file diff --git a/meecrowave/src/main/java/com/baeldung/meecrowave/Article.java b/meecrowave/src/main/java/com/baeldung/meecrowave/Article.java deleted file mode 100644 index 7925e8ff99..0000000000 --- a/meecrowave/src/main/java/com/baeldung/meecrowave/Article.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.baeldung.meecrowave; - -public class Article { - private String name; - private String author; - - public Article() { - } - - public Article(String name, String author) { - this.author = author; - this.name = name; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getAuthor() { - return author; - } - - public void setAuthor(String author) { - this.author = author; - } -} \ No newline at end of file diff --git a/meecrowave/src/main/java/com/baeldung/meecrowave/ArticleEndpoints.java b/meecrowave/src/main/java/com/baeldung/meecrowave/ArticleEndpoints.java deleted file mode 100644 index 6cb7012c64..0000000000 --- a/meecrowave/src/main/java/com/baeldung/meecrowave/ArticleEndpoints.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.meecrowave; - -import javax.enterprise.context.RequestScoped; -import javax.inject.Inject; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; - -@RequestScoped -@Path("article") -public class ArticleEndpoints { - - @Inject - ArticleService articleService; - - @GET - public Response getArticle() { - return Response.ok() - .entity(new Article("name", "author")) - .build(); - - } - - @POST - public Response createArticle(Article article) { - return Response.status(Status.CREATED) - .entity(articleService.createArticle(article)) - .build(); - } -} \ No newline at end of file diff --git a/meecrowave/src/main/java/com/baeldung/meecrowave/ArticleService.java b/meecrowave/src/main/java/com/baeldung/meecrowave/ArticleService.java deleted file mode 100644 index 7bd6b87345..0000000000 --- a/meecrowave/src/main/java/com/baeldung/meecrowave/ArticleService.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.baeldung.meecrowave; - -import javax.enterprise.context.ApplicationScoped; - -@ApplicationScoped -public class ArticleService { - public Article createArticle(Article article) { - return article; - } -} diff --git a/meecrowave/src/main/java/com/baeldung/meecrowave/Server.java b/meecrowave/src/main/java/com/baeldung/meecrowave/Server.java deleted file mode 100644 index 2aa7d0556f..0000000000 --- a/meecrowave/src/main/java/com/baeldung/meecrowave/Server.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.baeldung.meecrowave; - -import org.apache.meecrowave.Meecrowave; - -public class Server { - public static void main(String[] args) { - final Meecrowave.Builder builder = new Meecrowave.Builder(); - builder.setScanningPackageIncludes("com.baeldung.meecrowave"); - builder.setJaxrsMapping("/api/*"); - builder.setJsonpPrettify(true); - - try (Meecrowave meecrowave = new Meecrowave(builder)) { - meecrowave.bake().await(); - } - } -} diff --git a/meecrowave/src/main/resources/logback.xml b/meecrowave/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/meecrowave/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/meecrowave/src/test/java/com/baeldung/meecrowave/ArticleEndpointsTest.java b/meecrowave/src/test/java/com/baeldung/meecrowave/ArticleEndpointsTest.java deleted file mode 100644 index 0dc9773490..0000000000 --- a/meecrowave/src/test/java/com/baeldung/meecrowave/ArticleEndpointsTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.baeldung.meecrowave; - - -import static org.junit.Assert.assertEquals; - -import java.io.IOException; - -import org.apache.meecrowave.Meecrowave; -import org.apache.meecrowave.junit.MonoMeecrowave; -import org.apache.meecrowave.testing.ConfigurationInject; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; - -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; - -@RunWith(MonoMeecrowave.Runner.class) -public class ArticleEndpointsTest { - - @ConfigurationInject - private Meecrowave.Builder config; - private static OkHttpClient client; - - @BeforeClass - public static void setup() { - client = new OkHttpClient(); - } - - @Test - public void whenRetunedArticle_thenCorrect() throws IOException { - final String base = "http://localhost:"+config.getHttpPort(); - - Request request = new Request.Builder() - .url(base+"/article") - .build(); - Response response = client.newCall(request).execute(); - assertEquals(200, response.code()); - } -} From 297f5f6cd3c627a0debc4b7c2e961a3863e738af Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 6 Sep 2018 23:03:15 +0530 Subject: [PATCH 124/128] BAEL-8840 Remove one from spring-security-anguar vs spring-security-angular - Removing duplicated project spring-security-anguar, all source is present in existing project spring-security-angular --- spring-security-anguar/client/anguarjs/app.js | 40 ----- .../client/anguarjs/home/home.controller.js | 34 ----- .../client/anguarjs/home/home.view.html | 3 - .../client/anguarjs/index.html | 17 --- .../client/anguarjs/login/login.controller.js | 38 ----- .../client/anguarjs/login/login.view.html | 18 --- .../client/angular2/app.css | 7 - .../client/angular2/app/app.component.html | 7 - .../client/angular2/app/app.component.ts | 8 - .../client/angular2/app/app.module.ts | 27 ---- .../client/angular2/app/app.routing.ts | 12 -- .../angular2/app/home/home.component.html | 4 - .../angular2/app/home/home.component.ts | 36 ----- .../angular2/app/login/login.component.html | 18 --- .../angular2/app/login/login.component.ts | 36 ----- .../client/angular2/app/main.ts | 5 - .../client/angular2/index.html | 17 --- .../client/angular2/package.json | 37 ----- .../client/angular2/systemjs.config.js | 41 ----- .../client/angular2/tsconfig.json | 16 -- .../client/angular4/.angular-cli.json | 65 -------- .../client/angular4/package.json | 54 ------- .../angular4/src/app/app.component.html | 7 - .../client/angular4/src/app/app.component.ts | 8 - .../client/angular4/src/app/app.module.ts | 29 ---- .../client/angular4/src/app/app.routing.ts | 12 -- .../angular4/src/app/home/home.component.html | 4 - .../angular4/src/app/home/home.component.ts | 37 ----- .../src/app/login/login.component.html | 18 --- .../angular4/src/app/login/login.component.ts | 39 ----- .../client/angular4/src/index.html | 14 -- .../client/angular4/src/main.ts | 5 - .../client/angular4/src/polyfills.ts | 68 --------- .../client/angular4/src/styles.css | 7 - .../client/angular4/src/tsconfig.app.json | 13 -- .../client/angular4/tsconfig.json | 20 --- .../client/angular4/tslint.json | 130 ---------------- .../client/angular5/.angular-cli.json | 61 -------- .../client/angular5/package.json | 50 ------ .../angular5/src/app/app.component.html | 7 - .../client/angular5/src/app/app.component.ts | 8 - .../client/angular5/src/app/app.module.ts | 29 ---- .../client/angular5/src/app/app.routing.ts | 12 -- .../angular5/src/app/home/home.component.html | 4 - .../angular5/src/app/home/home.component.ts | 37 ----- .../src/app/login/login.component.html | 18 --- .../angular5/src/app/login/login.component.ts | 37 ----- .../client/angular5/src/index.html | 14 -- .../client/angular5/src/main.ts | 5 - .../client/angular5/src/polyfills.ts | 68 --------- .../client/angular5/src/styles.css | 7 - .../client/angular5/src/tsconfig.app.json | 13 -- .../client/angular5/tsconfig.json | 19 --- .../client/angular5/tslint.json | 144 ------------------ .../client/angular6/angular.json | 127 --------------- .../client/angular6/package.json | 48 ------ .../angular6/src/app/app.component.html | 2 - .../client/angular6/src/app/app.component.ts | 8 - .../client/angular6/src/app/app.module.ts | 27 ---- .../client/angular6/src/app/app.routing.ts | 11 -- .../angular6/src/app/home/home.component.html | 4 - .../angular6/src/app/home/home.component.ts | 49 ------ .../src/app/login/login.component.html | 15 -- .../angular6/src/app/login/login.component.ts | 39 ----- .../client/angular6/src/index.html | 14 -- .../client/angular6/src/main.ts | 5 - .../client/angular6/src/polyfills.ts | 68 --------- .../client/angular6/src/styles.css | 7 - .../client/angular6/src/tsconfig.app.json | 13 -- .../client/angular6/tsconfig.json | 20 --- .../client/angular6/tslint.json | 130 ---------------- spring-security-anguar/server/pom.xml | 71 --------- .../SpringBootSecurityApplication.java | 14 -- .../config/BasicAuthConfiguration.java | 34 ----- .../controller/UserController.java | 32 ---- .../springbootsecurityrest/vo/User.java | 21 --- .../src/main/resources/application.properties | 5 - .../server/src/main/resources/logback.xml | 13 -- 78 files changed, 2261 deletions(-) delete mode 100644 spring-security-anguar/client/anguarjs/app.js delete mode 100644 spring-security-anguar/client/anguarjs/home/home.controller.js delete mode 100644 spring-security-anguar/client/anguarjs/home/home.view.html delete mode 100644 spring-security-anguar/client/anguarjs/index.html delete mode 100644 spring-security-anguar/client/anguarjs/login/login.controller.js delete mode 100644 spring-security-anguar/client/anguarjs/login/login.view.html delete mode 100644 spring-security-anguar/client/angular2/app.css delete mode 100644 spring-security-anguar/client/angular2/app/app.component.html delete mode 100644 spring-security-anguar/client/angular2/app/app.component.ts delete mode 100644 spring-security-anguar/client/angular2/app/app.module.ts delete mode 100644 spring-security-anguar/client/angular2/app/app.routing.ts delete mode 100644 spring-security-anguar/client/angular2/app/home/home.component.html delete mode 100644 spring-security-anguar/client/angular2/app/home/home.component.ts delete mode 100644 spring-security-anguar/client/angular2/app/login/login.component.html delete mode 100644 spring-security-anguar/client/angular2/app/login/login.component.ts delete mode 100644 spring-security-anguar/client/angular2/app/main.ts delete mode 100644 spring-security-anguar/client/angular2/index.html delete mode 100644 spring-security-anguar/client/angular2/package.json delete mode 100644 spring-security-anguar/client/angular2/systemjs.config.js delete mode 100644 spring-security-anguar/client/angular2/tsconfig.json delete mode 100644 spring-security-anguar/client/angular4/.angular-cli.json delete mode 100644 spring-security-anguar/client/angular4/package.json delete mode 100644 spring-security-anguar/client/angular4/src/app/app.component.html delete mode 100644 spring-security-anguar/client/angular4/src/app/app.component.ts delete mode 100644 spring-security-anguar/client/angular4/src/app/app.module.ts delete mode 100644 spring-security-anguar/client/angular4/src/app/app.routing.ts delete mode 100644 spring-security-anguar/client/angular4/src/app/home/home.component.html delete mode 100644 spring-security-anguar/client/angular4/src/app/home/home.component.ts delete mode 100644 spring-security-anguar/client/angular4/src/app/login/login.component.html delete mode 100644 spring-security-anguar/client/angular4/src/app/login/login.component.ts delete mode 100644 spring-security-anguar/client/angular4/src/index.html delete mode 100644 spring-security-anguar/client/angular4/src/main.ts delete mode 100644 spring-security-anguar/client/angular4/src/polyfills.ts delete mode 100644 spring-security-anguar/client/angular4/src/styles.css delete mode 100644 spring-security-anguar/client/angular4/src/tsconfig.app.json delete mode 100644 spring-security-anguar/client/angular4/tsconfig.json delete mode 100644 spring-security-anguar/client/angular4/tslint.json delete mode 100644 spring-security-anguar/client/angular5/.angular-cli.json delete mode 100644 spring-security-anguar/client/angular5/package.json delete mode 100644 spring-security-anguar/client/angular5/src/app/app.component.html delete mode 100644 spring-security-anguar/client/angular5/src/app/app.component.ts delete mode 100644 spring-security-anguar/client/angular5/src/app/app.module.ts delete mode 100644 spring-security-anguar/client/angular5/src/app/app.routing.ts delete mode 100644 spring-security-anguar/client/angular5/src/app/home/home.component.html delete mode 100644 spring-security-anguar/client/angular5/src/app/home/home.component.ts delete mode 100644 spring-security-anguar/client/angular5/src/app/login/login.component.html delete mode 100644 spring-security-anguar/client/angular5/src/app/login/login.component.ts delete mode 100644 spring-security-anguar/client/angular5/src/index.html delete mode 100644 spring-security-anguar/client/angular5/src/main.ts delete mode 100644 spring-security-anguar/client/angular5/src/polyfills.ts delete mode 100644 spring-security-anguar/client/angular5/src/styles.css delete mode 100644 spring-security-anguar/client/angular5/src/tsconfig.app.json delete mode 100644 spring-security-anguar/client/angular5/tsconfig.json delete mode 100644 spring-security-anguar/client/angular5/tslint.json delete mode 100644 spring-security-anguar/client/angular6/angular.json delete mode 100644 spring-security-anguar/client/angular6/package.json delete mode 100644 spring-security-anguar/client/angular6/src/app/app.component.html delete mode 100644 spring-security-anguar/client/angular6/src/app/app.component.ts delete mode 100644 spring-security-anguar/client/angular6/src/app/app.module.ts delete mode 100644 spring-security-anguar/client/angular6/src/app/app.routing.ts delete mode 100644 spring-security-anguar/client/angular6/src/app/home/home.component.html delete mode 100644 spring-security-anguar/client/angular6/src/app/home/home.component.ts delete mode 100644 spring-security-anguar/client/angular6/src/app/login/login.component.html delete mode 100644 spring-security-anguar/client/angular6/src/app/login/login.component.ts delete mode 100644 spring-security-anguar/client/angular6/src/index.html delete mode 100644 spring-security-anguar/client/angular6/src/main.ts delete mode 100644 spring-security-anguar/client/angular6/src/polyfills.ts delete mode 100644 spring-security-anguar/client/angular6/src/styles.css delete mode 100644 spring-security-anguar/client/angular6/src/tsconfig.app.json delete mode 100644 spring-security-anguar/client/angular6/tsconfig.json delete mode 100644 spring-security-anguar/client/angular6/tslint.json delete mode 100644 spring-security-anguar/server/pom.xml delete mode 100644 spring-security-anguar/server/src/main/java/com/baeldung/springbootsecurityrest/basicauth/SpringBootSecurityApplication.java delete mode 100644 spring-security-anguar/server/src/main/java/com/baeldung/springbootsecurityrest/basicauth/config/BasicAuthConfiguration.java delete mode 100644 spring-security-anguar/server/src/main/java/com/baeldung/springbootsecurityrest/controller/UserController.java delete mode 100644 spring-security-anguar/server/src/main/java/com/baeldung/springbootsecurityrest/vo/User.java delete mode 100644 spring-security-anguar/server/src/main/resources/application.properties delete mode 100644 spring-security-anguar/server/src/main/resources/logback.xml diff --git a/spring-security-anguar/client/anguarjs/app.js b/spring-security-anguar/client/anguarjs/app.js deleted file mode 100644 index 4b7268da3f..0000000000 --- a/spring-security-anguar/client/anguarjs/app.js +++ /dev/null @@ -1,40 +0,0 @@ -(function () { - 'use strict'; - - angular - .module('app', ['ngRoute']) - .config(config) - .run(run); - - config.$inject = ['$routeProvider', '$locationProvider']; - function config($routeProvider, $locationProvider) { - $routeProvider - .when('/', { - controller: 'HomeController', - templateUrl: 'home/home.view.html', - controllerAs: 'vm' - }) - .when('/login', { - controller: 'LoginController', - templateUrl: 'login/login.view.html', - controllerAs: 'vm' - }) - .otherwise({ redirectTo: '/login' }); - } - - run.$inject = ['$rootScope', '$location', '$http', '$window']; - function run($rootScope, $location, $http, $window) { - var userData = $window.sessionStorage.getItem('userData'); - if (userData) { - $http.defaults.headers.common['Authorization'] = 'Basic ' + JSON.parse(userData).authData; - } - - $rootScope.$on('$locationChangeStart', function (event, next, current) { - var restrictedPage = $.inArray($location.path(), ['/login']) === -1; - var loggedIn = $window.sessionStorage.getItem('userData');; - if (restrictedPage && !loggedIn) { - $location.path('/login'); - } - }); - } -})(); \ No newline at end of file diff --git a/spring-security-anguar/client/anguarjs/home/home.controller.js b/spring-security-anguar/client/anguarjs/home/home.controller.js deleted file mode 100644 index 6449029ec2..0000000000 --- a/spring-security-anguar/client/anguarjs/home/home.controller.js +++ /dev/null @@ -1,34 +0,0 @@ -(function () { - 'use strict'; - - angular - .module('app') - .controller('HomeController', HomeController); - - HomeController.$inject = ['$window', '$http', '$scope']; - function HomeController($window, $http, $scope) { - var vm = this; - - vm.user = null; - - initController(); - - function initController() { - - $http({ - url: 'http://localhost:8082/user', - method: "GET" - }).then(function (response) { - vm.user = response.data.name; - },function(error){ - console.log(error); - }); - }; - - $scope.logout = function(){ - $window.sessionStorage.setItem('userData', ''); - $http.defaults.headers.common['Authorization'] = 'Basic'; - } - } - -})(); \ No newline at end of file diff --git a/spring-security-anguar/client/anguarjs/home/home.view.html b/spring-security-anguar/client/anguarjs/home/home.view.html deleted file mode 100644 index bb5c2d3dbf..0000000000 --- a/spring-security-anguar/client/anguarjs/home/home.view.html +++ /dev/null @@ -1,3 +0,0 @@ -

Hi {{vm.user}}!

-

You're logged in!!

-

Logout

\ No newline at end of file diff --git a/spring-security-anguar/client/anguarjs/index.html b/spring-security-anguar/client/anguarjs/index.html deleted file mode 100644 index a5584d53be..0000000000 --- a/spring-security-anguar/client/anguarjs/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - -
- - - - - - - - - - \ No newline at end of file diff --git a/spring-security-anguar/client/anguarjs/login/login.controller.js b/spring-security-anguar/client/anguarjs/login/login.controller.js deleted file mode 100644 index 2da509ec83..0000000000 --- a/spring-security-anguar/client/anguarjs/login/login.controller.js +++ /dev/null @@ -1,38 +0,0 @@ -(function () { - 'use strict'; - - angular - .module('app') - .controller('LoginController', LoginController); - - LoginController.$inject = ['$location', '$window', '$http']; - function LoginController($location, $window, $http) { - var vm = this; - vm.login = login; - - (function initController() { - $window.localStorage.setItem('token', ''); - })(); - - function login() { - $http({ - url: 'http://localhost:8082/login', - method: "POST", - data: { 'userName': vm.username, 'password': vm.password } - }).then(function (response) { - if (response.data) { - var token = $window.btoa(vm.username + ':' + vm.password); - var userData = { - userName: vm.username, - authData: token - } - $window.sessionStorage.setItem('userData', JSON.stringify(userData)); - $http.defaults.headers.common['Authorization'] = 'Basic ' + token; - $location.path('/'); - } else { - alert("Authentication failed.") - } - }); - }; - } -})(); diff --git a/spring-security-anguar/client/anguarjs/login/login.view.html b/spring-security-anguar/client/anguarjs/login/login.view.html deleted file mode 100644 index 0d42f29b54..0000000000 --- a/spring-security-anguar/client/anguarjs/login/login.view.html +++ /dev/null @@ -1,18 +0,0 @@ -
-

Login

-
-
- - - Username is required -
-
- - - Password is required -
-
- -
-
-
\ No newline at end of file diff --git a/spring-security-anguar/client/angular2/app.css b/spring-security-anguar/client/angular2/app.css deleted file mode 100644 index cdd2d591d8..0000000000 --- a/spring-security-anguar/client/angular2/app.css +++ /dev/null @@ -1,7 +0,0 @@ -a { - cursor: pointer; -} - -.help-block { - font-size: 12px; -} \ No newline at end of file diff --git a/spring-security-anguar/client/angular2/app/app.component.html b/spring-security-anguar/client/angular2/app/app.component.html deleted file mode 100644 index 7f77adea7b..0000000000 --- a/spring-security-anguar/client/angular2/app/app.component.html +++ /dev/null @@ -1,7 +0,0 @@ -
-
-
- -
-
-
diff --git a/spring-security-anguar/client/angular2/app/app.component.ts b/spring-security-anguar/client/angular2/app/app.component.ts deleted file mode 100644 index 0aae2b6992..0000000000 --- a/spring-security-anguar/client/angular2/app/app.component.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app', - templateUrl: './app/app.component.html' -}) - -export class AppComponent { } \ No newline at end of file diff --git a/spring-security-anguar/client/angular2/app/app.module.ts b/spring-security-anguar/client/angular2/app/app.module.ts deleted file mode 100644 index 4d484b49f8..0000000000 --- a/spring-security-anguar/client/angular2/app/app.module.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { FormsModule } from '@angular/forms'; -import { HttpModule } from '@angular/http'; - -import { AppComponent } from './app.component'; -import { routing } from './app.routing'; - -import { HomeComponent } from './home/home.component'; -import { LoginComponent } from './login/login.component'; - -@NgModule({ - imports: [ - BrowserModule, - FormsModule, - HttpModule, - routing - ], - declarations: [ - AppComponent, - HomeComponent, - LoginComponent - ], - bootstrap: [AppComponent] -}) - -export class AppModule { } \ No newline at end of file diff --git a/spring-security-anguar/client/angular2/app/app.routing.ts b/spring-security-anguar/client/angular2/app/app.routing.ts deleted file mode 100644 index c794fc5c50..0000000000 --- a/spring-security-anguar/client/angular2/app/app.routing.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Routes, RouterModule } from '@angular/router'; - -import { HomeComponent } from './home/home.component'; -import { LoginComponent } from './login/login.component'; - -const appRoutes: Routes = [ - { path: '', component: HomeComponent}, - { path: 'login', component: LoginComponent }, - { path: '**', redirectTo: '' } -]; - -export const routing = RouterModule.forRoot(appRoutes); \ No newline at end of file diff --git a/spring-security-anguar/client/angular2/app/home/home.component.html b/spring-security-anguar/client/angular2/app/home/home.component.html deleted file mode 100644 index 5f3b24be3a..0000000000 --- a/spring-security-anguar/client/angular2/app/home/home.component.html +++ /dev/null @@ -1,4 +0,0 @@ -
-

Hi {{userName}}!

-

Logout

-
\ No newline at end of file diff --git a/spring-security-anguar/client/angular2/app/home/home.component.ts b/spring-security-anguar/client/angular2/app/home/home.component.ts deleted file mode 100644 index 1b168bfb30..0000000000 --- a/spring-security-anguar/client/angular2/app/home/home.component.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Http, RequestOptions, Headers } from '@angular/http'; -import 'rxjs/add/operator/map' - -@Component({ - selector:'home', - templateUrl: './app/home/home.component.html' -}) - -export class HomeComponent implements OnInit { - - userName: string; - - constructor(private http: Http) { } - - ngOnInit() { - let url = 'http://localhost:8082/user'; - let headers = new Headers({ - 'Authorization': 'Basic ' + sessionStorage.getItem('token') - }); - let options = new RequestOptions({ headers: headers }); - this.http.post(url,{}, options). - map(res => res.json()). - subscribe( - principal => this.userName = principal.name, - error => { - if(error.status == 401) - alert('Unauthorized'); - } - ); - } - - logout() { - sessionStorage.setItem('token', ''); - } -} \ No newline at end of file diff --git a/spring-security-anguar/client/angular2/app/login/login.component.html b/spring-security-anguar/client/angular2/app/login/login.component.html deleted file mode 100644 index d87b91a7bb..0000000000 --- a/spring-security-anguar/client/angular2/app/login/login.component.html +++ /dev/null @@ -1,18 +0,0 @@ -
-

Login

-
-
- - -
Username is required
-
-
- - -
Password is required
-
-
- -
-
-
diff --git a/spring-security-anguar/client/angular2/app/login/login.component.ts b/spring-security-anguar/client/angular2/app/login/login.component.ts deleted file mode 100644 index 81d6c1d7ae..0000000000 --- a/spring-security-anguar/client/angular2/app/login/login.component.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Router, ActivatedRoute } from '@angular/router'; -import { Http } from '@angular/http'; - -@Component({ - selector: 'login', - templateUrl: './app/login/login.component.html' -}) - -export class LoginComponent implements OnInit { - model: any = {}; - - constructor( - private route: ActivatedRoute, - private router: Router, - private http: Http) { } - - ngOnInit() { - sessionStorage.setItem('token', ''); - } - - login() { - let url = 'http://localhost:8082/login'; - let result = this.http.post(url, { - userName: this.model.username, - password: this.model.password - }).map(res => res.json()).subscribe(isValid => { - if (isValid) { - sessionStorage.setItem('token', btoa(this.model.username + ':' + this.model.password)); - this.router.navigate(['']); - } else { - alert("Authentication failed."); - } - }); - } -} diff --git a/spring-security-anguar/client/angular2/app/main.ts b/spring-security-anguar/client/angular2/app/main.ts deleted file mode 100644 index 3a6c754786..0000000000 --- a/spring-security-anguar/client/angular2/app/main.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; - -import { AppModule } from './app.module'; - -platformBrowserDynamic().bootstrapModule(AppModule); \ No newline at end of file diff --git a/spring-security-anguar/client/angular2/index.html b/spring-security-anguar/client/angular2/index.html deleted file mode 100644 index c9730a8568..0000000000 --- a/spring-security-anguar/client/angular2/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - Loading... - - diff --git a/spring-security-anguar/client/angular2/package.json b/spring-security-anguar/client/angular2/package.json deleted file mode 100644 index 9b36652fac..0000000000 --- a/spring-security-anguar/client/angular2/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "angular2-quickstart", - "version": "1.0.0", - "description": "Sample of how easy and fast to start hacking with Angular2 and ng2-bootstrap", - "scripts": { - "start": "tsc && concurrently \"tsc -w\" \"lite-server\" ", - "lite": "lite-server", - "tsc": "tsc", - "tsc:w": "tsc -w" - }, - "license": "ISC", - "dependencies": { - "@angular/common": "2.4.4", - "@angular/compiler": "2.4.4", - "@angular/core": "2.4.4", - "@angular/forms": "2.4.4", - "@angular/http": "2.4.4", - "@angular/platform-browser": "2.4.4", - "@angular/platform-browser-dynamic": "2.4.4", - "@angular/router": "3.4.4", - "@angular/upgrade": "2.4.4", - "angular2-in-memory-web-api": "0.0.21", - "bootstrap": "^3.3.7", - "core-js": "^2.4.1", - "ng2-bootstrap": "1.3.0", - "reflect-metadata": "^0.1.8", - "rxjs": "5.0.3", - "systemjs": "0.20.0", - "zone.js": "0.7.6" - }, - "devDependencies": { - "concurrently": "3.1.0", - "lite-server": "^2.2.0", - "typescript": "2.1.5" - }, - "repository": {} -} diff --git a/spring-security-anguar/client/angular2/systemjs.config.js b/spring-security-anguar/client/angular2/systemjs.config.js deleted file mode 100644 index ea4c543fdd..0000000000 --- a/spring-security-anguar/client/angular2/systemjs.config.js +++ /dev/null @@ -1,41 +0,0 @@ -/** - * System configuration for Angular 2 samples - * Adjust as necessary for your application needs. - */ -(function (global) { - System.config({ - paths: { - // paths serve as alias - 'npm:': 'node_modules/' - }, - // map tells the System loader where to look for things - map: { - // our app is within the app folder - app: 'app', - - // angular bundles - '@angular/core': 'npm:@angular/core/bundles/core.umd.js', - '@angular/common': 'npm:@angular/common/bundles/common.umd.js', - '@angular/http': 'npm:@angular/http/bundles/http.umd.js', - '@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js', - '@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js', - '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js', - '@angular/router': 'npm:@angular/router/bundles/router.umd.js', - '@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js', - - // other libraries - 'rxjs': 'npm:rxjs', - 'tslib': 'npm:tslib/tslib.js' - }, - // packages tells the System loader how to load when no filename and/or no extension - packages: { - app: { - main: './main.js', - defaultExtension: 'js' - }, - rxjs: { - defaultExtension: 'js' - } - } - }); -})(this); diff --git a/spring-security-anguar/client/angular2/tsconfig.json b/spring-security-anguar/client/angular2/tsconfig.json deleted file mode 100644 index 55f9ad70c3..0000000000 --- a/spring-security-anguar/client/angular2/tsconfig.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "compilerOptions": { - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "lib": [ "es2015", "dom" ], - "module": "commonjs", - "moduleResolution": "node", - "noImplicitAny": true, - "sourceMap": true, - "suppressImplicitAnyIndexErrors": true, - "target": "es5" - }, - "exclude": [ - "node_modules/*" - ] -} \ No newline at end of file diff --git a/spring-security-anguar/client/angular4/.angular-cli.json b/spring-security-anguar/client/angular4/.angular-cli.json deleted file mode 100644 index 967934b2f7..0000000000 --- a/spring-security-anguar/client/angular4/.angular-cli.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", - "project": { - "name": "angular-crud" - }, - "apps": [ - { - "root": "src", - "outDir": "dist", - "assets": [ - "assets", - "favicon.ico" - ], - "index": "index.html", - "main": "main.ts", - "polyfills": "polyfills.ts", - "test": "test.ts", - "tsconfig": "tsconfig.app.json", - "testTsconfig": "tsconfig.spec.json", - "prefix": "app", - "styles": [ - "../node_modules/bootstrap/dist/css/bootstrap.min.css", - "styles.css", - "../node_modules/font-awesome/css/font-awesome.min.css" - ], - "scripts": [ - "../node_modules/jquery/dist/jquery.js", - "../node_modules/bootstrap/dist/js/bootstrap.js" - ], - "environmentSource": "environments/environment.ts", - "environments": { - "dev": "environments/environment.ts", - "prod": "environments/environment.prod.ts" - } - } - ], - "e2e": { - "protractor": { - "config": "./protractor.conf.js" - } - }, - "lint": [ - { - "project": "src/tsconfig.app.json", - "exclude": "**/node_modules/**" - }, - { - "project": "src/tsconfig.spec.json", - "exclude": "**/node_modules/**" - }, - { - "project": "e2e/tsconfig.e2e.json", - "exclude": "**/node_modules/**" - } - ], - "test": { - "karma": { - "config": "./karma.conf.js" - } - }, - "defaults": { - "styleExt": "css", - "component": {} - } -} \ No newline at end of file diff --git a/spring-security-anguar/client/angular4/package.json b/spring-security-anguar/client/angular4/package.json deleted file mode 100644 index 8c6ddcaf1f..0000000000 --- a/spring-security-anguar/client/angular4/package.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "name": "angular-crud", - "version": "0.0.0", - "license": "MIT", - "scripts": { - "ng": "ng", - "start": "ng serve", - "build": "ng build", - "test": "ng test", - "lint": "ng lint", - "e2e": "ng e2e" - }, - "private": true, - "dependencies": { - "@angular/animations": "^4.0.0", - "@angular/common": "^4.0.0", - "@angular/compiler": "^4.0.0", - "@angular/core": "^4.0.0", - "@angular/forms": "^4.0.0", - "@angular/http": "^4.0.0", - "@angular/platform-browser": "^4.0.0", - "@angular/platform-browser-dynamic": "^4.0.0", - "@angular/router": "^4.0.0", - "bootstrap": "^3.3.7", - "core-js": "^2.4.1", - "font-awesome": "^4.7.0", - "jquery": "^3.2.1", - "lodash": "^4.17.4", - "rxjs": "^5.4.1", - "zone.js": "^0.8.14" - }, - "devDependencies": { - "@angular/cli": "1.2.3", - "@angular/compiler-cli": "^4.0.0", - "@angular/language-service": "^4.0.0", - "@types/jasmine": "~2.5.53", - "@types/jasminewd2": "~2.0.2", - "@types/lodash": "^4.14.66", - "@types/node": "~6.0.60", - "codelyzer": "~3.0.1", - "jasmine-core": "~2.6.2", - "jasmine-spec-reporter": "~4.1.0", - "karma": "~1.7.0", - "karma-chrome-launcher": "~2.1.1", - "karma-cli": "~1.0.1", - "karma-coverage-istanbul-reporter": "^1.2.1", - "karma-jasmine": "~1.1.0", - "karma-jasmine-html-reporter": "^0.2.2", - "protractor": "~5.1.2", - "ts-node": "~3.0.4", - "tslint": "~5.3.2", - "typescript": "~2.3.3" - } -} diff --git a/spring-security-anguar/client/angular4/src/app/app.component.html b/spring-security-anguar/client/angular4/src/app/app.component.html deleted file mode 100644 index 7f77adea7b..0000000000 --- a/spring-security-anguar/client/angular4/src/app/app.component.html +++ /dev/null @@ -1,7 +0,0 @@ -
-
-
- -
-
-
diff --git a/spring-security-anguar/client/angular4/src/app/app.component.ts b/spring-security-anguar/client/angular4/src/app/app.component.ts deleted file mode 100644 index 36f986c63f..0000000000 --- a/spring-security-anguar/client/angular4/src/app/app.component.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-root', - templateUrl: './app.component.html' -}) - -export class AppComponent { } \ No newline at end of file diff --git a/spring-security-anguar/client/angular4/src/app/app.module.ts b/spring-security-anguar/client/angular4/src/app/app.module.ts deleted file mode 100644 index 9e840e6f13..0000000000 --- a/spring-security-anguar/client/angular4/src/app/app.module.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { FormsModule } from '@angular/forms'; -import { HttpModule } from '@angular/http'; - -// used to create fake backend - -import { AppComponent } from './app.component'; -import { routing } from './app.routing'; - -import { HomeComponent } from './home/home.component'; -import { LoginComponent } from './login/login.component'; - -@NgModule({ - imports: [ - BrowserModule, - FormsModule, - HttpModule, - routing - ], - declarations: [ - AppComponent, - HomeComponent, - LoginComponent - ], - bootstrap: [AppComponent] -}) - -export class AppModule { } \ No newline at end of file diff --git a/spring-security-anguar/client/angular4/src/app/app.routing.ts b/spring-security-anguar/client/angular4/src/app/app.routing.ts deleted file mode 100644 index c794fc5c50..0000000000 --- a/spring-security-anguar/client/angular4/src/app/app.routing.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Routes, RouterModule } from '@angular/router'; - -import { HomeComponent } from './home/home.component'; -import { LoginComponent } from './login/login.component'; - -const appRoutes: Routes = [ - { path: '', component: HomeComponent}, - { path: 'login', component: LoginComponent }, - { path: '**', redirectTo: '' } -]; - -export const routing = RouterModule.forRoot(appRoutes); \ No newline at end of file diff --git a/spring-security-anguar/client/angular4/src/app/home/home.component.html b/spring-security-anguar/client/angular4/src/app/home/home.component.html deleted file mode 100644 index 7ccd2c2a3a..0000000000 --- a/spring-security-anguar/client/angular4/src/app/home/home.component.html +++ /dev/null @@ -1,4 +0,0 @@ -
-

Hi {{userName}}!

-

Logout

-
\ No newline at end of file diff --git a/spring-security-anguar/client/angular4/src/app/home/home.component.ts b/spring-security-anguar/client/angular4/src/app/home/home.component.ts deleted file mode 100644 index 0f66f42ce2..0000000000 --- a/spring-security-anguar/client/angular4/src/app/home/home.component.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Http, RequestOptions, Headers } from '@angular/http'; -import 'rxjs/add/operator/map' - -@Component({ - selector:'home', - templateUrl: './home.component.html' -}) - -export class HomeComponent implements OnInit { - - userName: string; - - constructor(private http: Http) { } - - ngOnInit() { - let url = 'http://localhost:8082/user'; - let headers = new Headers({ - 'Authorization': 'Basic ' + sessionStorage.getItem('token') - }); - let options = new RequestOptions({ headers: headers }); - this.http.post(url,{}, options). - map( - res => res.json(), - error => { - if(error.status == 401) - alert('Unauthorized'); - } - ).subscribe(principal => { - this.userName = principal.name; - }); - } - - logout() { - sessionStorage.setItem('token', ''); - } -} \ No newline at end of file diff --git a/spring-security-anguar/client/angular4/src/app/login/login.component.html b/spring-security-anguar/client/angular4/src/app/login/login.component.html deleted file mode 100644 index d87b91a7bb..0000000000 --- a/spring-security-anguar/client/angular4/src/app/login/login.component.html +++ /dev/null @@ -1,18 +0,0 @@ -
-

Login

-
-
- - -
Username is required
-
-
- - -
Password is required
-
-
- -
-
-
diff --git a/spring-security-anguar/client/angular4/src/app/login/login.component.ts b/spring-security-anguar/client/angular4/src/app/login/login.component.ts deleted file mode 100644 index 2a2dc102af..0000000000 --- a/spring-security-anguar/client/angular4/src/app/login/login.component.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Router, ActivatedRoute } from '@angular/router'; -import { Http } from '@angular/http'; - -@Component({ - selector: 'login', - templateUrl: './login.component.html' -}) - -export class LoginComponent implements OnInit { - model: any = {}; - - constructor( - private route: ActivatedRoute, - private router: Router, - private http: Http) { } - - ngOnInit() { - sessionStorage.setItem('token', ''); - } - - - login() { - let url = 'http://localhost:8082/login'; - let result = this.http.post(url, { - userName: this.model.username, - password: this.model.password - }). - map(res => res.json()). - subscribe(isValid => { - if (isValid) { - sessionStorage.setItem('token', btoa(this.model.username + ':' + this.model.password)); - this.router.navigate(['']); - } else { - alert("Authentication failed.") - } - }); - } -} diff --git a/spring-security-anguar/client/angular4/src/index.html b/spring-security-anguar/client/angular4/src/index.html deleted file mode 100644 index c716820396..0000000000 --- a/spring-security-anguar/client/angular4/src/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - AngularCRUD - - - - - - - - - \ No newline at end of file diff --git a/spring-security-anguar/client/angular4/src/main.ts b/spring-security-anguar/client/angular4/src/main.ts deleted file mode 100644 index 49db98ae89..0000000000 --- a/spring-security-anguar/client/angular4/src/main.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; - -import { AppModule } from './app/app.module'; - -platformBrowserDynamic().bootstrapModule(AppModule); \ No newline at end of file diff --git a/spring-security-anguar/client/angular4/src/polyfills.ts b/spring-security-anguar/client/angular4/src/polyfills.ts deleted file mode 100644 index a4984ced57..0000000000 --- a/spring-security-anguar/client/angular4/src/polyfills.ts +++ /dev/null @@ -1,68 +0,0 @@ -/** - * This file includes polyfills needed by Angular and is loaded before the app. - * You can add your own extra polyfills to this file. - * - * This file is divided into 2 sections: - * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. - * 2. Application imports. Files imported after ZoneJS that should be loaded before your main - * file. - * - * The current setup is for so-called "evergreen" browsers; the last versions of browsers that - * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), - * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. - * - * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html - */ - -/*************************************************************************************************** - * BROWSER POLYFILLS - */ - -/** IE9, IE10 and IE11 requires all of the following polyfills. **/ -// import 'core-js/es6/symbol'; -// import 'core-js/es6/object'; -// import 'core-js/es6/function'; -// import 'core-js/es6/parse-int'; -// import 'core-js/es6/parse-float'; -// import 'core-js/es6/number'; -// import 'core-js/es6/math'; -// import 'core-js/es6/string'; -// import 'core-js/es6/date'; -// import 'core-js/es6/array'; -// import 'core-js/es6/regexp'; -// import 'core-js/es6/map'; -// import 'core-js/es6/weak-map'; -// import 'core-js/es6/set'; -/** IE10 and IE11 requires the following for NgClass support on SVG elements */ -// import 'classlist.js'; // Run `npm install --save classlist.js`. -/** Evergreen browsers require these. **/ -import 'core-js/es6/reflect'; -import 'core-js/es7/reflect'; - - -/** - * Required to support Web Animations `@angular/animation`. - * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation - **/ -// import 'web-animations-js'; // Run `npm install --save web-animations-js`. - - -/*************************************************************************************************** - * Zone JS is required by Angular itself. - */ -import 'zone.js/dist/zone'; // Included with Angular CLI. - - -/*************************************************************************************************** - * APPLICATION IMPORTS - */ - -/** - * Date, currency, decimal and percent pipes. - * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10 - */ -// import 'intl'; // Run `npm install --save intl`. -/** - * Need to import at least one locale-data with intl. - */ -// import 'intl/locale-data/jsonp/en'; \ No newline at end of file diff --git a/spring-security-anguar/client/angular4/src/styles.css b/spring-security-anguar/client/angular4/src/styles.css deleted file mode 100644 index cdd2d591d8..0000000000 --- a/spring-security-anguar/client/angular4/src/styles.css +++ /dev/null @@ -1,7 +0,0 @@ -a { - cursor: pointer; -} - -.help-block { - font-size: 12px; -} \ No newline at end of file diff --git a/spring-security-anguar/client/angular4/src/tsconfig.app.json b/spring-security-anguar/client/angular4/src/tsconfig.app.json deleted file mode 100644 index 213ce42a1b..0000000000 --- a/spring-security-anguar/client/angular4/src/tsconfig.app.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/app", - "baseUrl": "./", - "module": "es2015", - "types": [] - }, - "exclude": [ - "test.ts", - "**/*.spec.ts" - ] -} \ No newline at end of file diff --git a/spring-security-anguar/client/angular4/tsconfig.json b/spring-security-anguar/client/angular4/tsconfig.json deleted file mode 100644 index ef44e2862b..0000000000 --- a/spring-security-anguar/client/angular4/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compileOnSave": false, - "compilerOptions": { - "baseUrl": "./", - "outDir": "./dist/out-tsc", - "sourceMap": true, - "declaration": false, - "moduleResolution": "node", - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "target": "es5", - "typeRoots": [ - "node_modules/@types" - ], - "lib": [ - "es2017", - "dom" - ] - } -} diff --git a/spring-security-anguar/client/angular4/tslint.json b/spring-security-anguar/client/angular4/tslint.json deleted file mode 100644 index 3ea984c776..0000000000 --- a/spring-security-anguar/client/angular4/tslint.json +++ /dev/null @@ -1,130 +0,0 @@ -{ - "rulesDirectory": [ - "node_modules/codelyzer" - ], - "rules": { - "arrow-return-shorthand": true, - "callable-types": true, - "class-name": true, - "comment-format": [ - true, - "check-space" - ], - "curly": true, - "deprecation": { - "severity": "warn" - }, - "eofline": true, - "forin": true, - "import-blacklist": [ - true, - "rxjs/Rx" - ], - "import-spacing": true, - "indent": [ - true, - "spaces" - ], - "interface-over-type-literal": true, - "label-position": true, - "max-line-length": [ - true, - 140 - ], - "member-access": false, - "member-ordering": [ - true, - { - "order": [ - "static-field", - "instance-field", - "static-method", - "instance-method" - ] - } - ], - "no-arg": true, - "no-bitwise": true, - "no-console": [ - true, - "debug", - "info", - "time", - "timeEnd", - "trace" - ], - "no-construct": true, - "no-debugger": true, - "no-duplicate-super": true, - "no-empty": false, - "no-empty-interface": true, - "no-eval": true, - "no-inferrable-types": [ - true, - "ignore-params" - ], - "no-misused-new": true, - "no-non-null-assertion": true, - "no-shadowed-variable": true, - "no-string-literal": false, - "no-string-throw": true, - "no-switch-case-fall-through": true, - "no-trailing-whitespace": true, - "no-unnecessary-initializer": true, - "no-unused-expression": true, - "no-use-before-declare": true, - "no-var-keyword": true, - "object-literal-sort-keys": false, - "one-line": [ - true, - "check-open-brace", - "check-catch", - "check-else", - "check-whitespace" - ], - "prefer-const": true, - "quotemark": [ - true, - "single" - ], - "radix": true, - "semicolon": [ - true, - "always" - ], - "triple-equals": [ - true, - "allow-null-check" - ], - "typedef-whitespace": [ - true, - { - "call-signature": "nospace", - "index-signature": "nospace", - "parameter": "nospace", - "property-declaration": "nospace", - "variable-declaration": "nospace" - } - ], - "unified-signatures": true, - "variable-name": false, - "whitespace": [ - true, - "check-branch", - "check-decl", - "check-operator", - "check-separator", - "check-type" - ], - "no-output-on-prefix": true, - "use-input-property-decorator": true, - "use-output-property-decorator": true, - "use-host-property-decorator": true, - "no-input-rename": true, - "no-output-rename": true, - "use-life-cycle-interface": true, - "use-pipe-transform-interface": true, - "component-class-suffix": true, - "directive-class-suffix": true - } -} diff --git a/spring-security-anguar/client/angular5/.angular-cli.json b/spring-security-anguar/client/angular5/.angular-cli.json deleted file mode 100644 index d390652214..0000000000 --- a/spring-security-anguar/client/angular5/.angular-cli.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", - "project": { - "name": "angular5" - }, - "apps": [ - { - "root": "src", - "outDir": "dist", - "assets": [ - "assets", - "favicon.ico" - ], - "index": "index.html", - "main": "main.ts", - "polyfills": "polyfills.ts", - "test": "test.ts", - "tsconfig": "tsconfig.app.json", - "testTsconfig": "tsconfig.spec.json", - "prefix": "app", - "styles": [ - "styles.css", - "../node_modules/ngx-toastr/toastr.css" - ], - "scripts": [], - "environmentSource": "environments/environment.ts", - "environments": { - "dev": "environments/environment.ts", - "prod": "environments/environment.prod.ts" - } - } - ], - "e2e": { - "protractor": { - "config": "./protractor.conf.js" - } - }, - "lint": [ - { - "project": "src/tsconfig.app.json", - "exclude": "**/node_modules/**" - }, - { - "project": "src/tsconfig.spec.json", - "exclude": "**/node_modules/**" - }, - { - "project": "e2e/tsconfig.e2e.json", - "exclude": "**/node_modules/**" - } - ], - "test": { - "karma": { - "config": "./karma.conf.js" - } - }, - "defaults": { - "styleExt": "css", - "component": {} - } -} \ No newline at end of file diff --git a/spring-security-anguar/client/angular5/package.json b/spring-security-anguar/client/angular5/package.json deleted file mode 100644 index 45f455d191..0000000000 --- a/spring-security-anguar/client/angular5/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "angular5", - "version": "0.0.0", - "license": "MIT", - "scripts": { - "ng": "ng", - "start": "ng serve", - "build": "ng build --prod", - "test": "ng test", - "lint": "ng lint", - "e2e": "ng e2e" - }, - "private": true, - "dependencies": { - "@angular/animations": "^5.0.0", - "@angular/common": "^5.0.0", - "@angular/compiler": "^5.0.0", - "@angular/core": "^5.0.0", - "@angular/forms": "^5.0.0", - "@angular/http": "^5.0.0", - "@angular/platform-browser": "^5.0.0", - "@angular/platform-browser-dynamic": "^5.0.0", - "@angular/router": "^5.0.0", - "core-js": "^2.4.1", - "ngx-toastr": "^8.1.1", - "rxjs": "^5.5.2", - "zone.js": "^0.8.14" - }, - "devDependencies": { - "@angular/cli": "^1.6.6", - "@angular/compiler-cli": "^5.0.0", - "@angular/language-service": "^5.0.0", - "@types/jasmine": "~2.5.53", - "@types/jasminewd2": "~2.0.2", - "@types/node": "~6.0.60", - "codelyzer": "^4.0.1", - "jasmine-core": "~2.6.2", - "jasmine-spec-reporter": "~4.1.0", - "karma": "~1.7.0", - "karma-chrome-launcher": "~2.1.1", - "karma-cli": "~1.0.1", - "karma-coverage-istanbul-reporter": "^1.2.1", - "karma-jasmine": "~1.1.0", - "karma-jasmine-html-reporter": "^0.2.2", - "protractor": "~5.1.2", - "ts-node": "~3.2.0", - "tslint": "~5.7.0", - "typescript": "~2.4.2" - } -} diff --git a/spring-security-anguar/client/angular5/src/app/app.component.html b/spring-security-anguar/client/angular5/src/app/app.component.html deleted file mode 100644 index 7f77adea7b..0000000000 --- a/spring-security-anguar/client/angular5/src/app/app.component.html +++ /dev/null @@ -1,7 +0,0 @@ -
-
-
- -
-
-
diff --git a/spring-security-anguar/client/angular5/src/app/app.component.ts b/spring-security-anguar/client/angular5/src/app/app.component.ts deleted file mode 100644 index 36f986c63f..0000000000 --- a/spring-security-anguar/client/angular5/src/app/app.component.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-root', - templateUrl: './app.component.html' -}) - -export class AppComponent { } \ No newline at end of file diff --git a/spring-security-anguar/client/angular5/src/app/app.module.ts b/spring-security-anguar/client/angular5/src/app/app.module.ts deleted file mode 100644 index 9e840e6f13..0000000000 --- a/spring-security-anguar/client/angular5/src/app/app.module.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { FormsModule } from '@angular/forms'; -import { HttpModule } from '@angular/http'; - -// used to create fake backend - -import { AppComponent } from './app.component'; -import { routing } from './app.routing'; - -import { HomeComponent } from './home/home.component'; -import { LoginComponent } from './login/login.component'; - -@NgModule({ - imports: [ - BrowserModule, - FormsModule, - HttpModule, - routing - ], - declarations: [ - AppComponent, - HomeComponent, - LoginComponent - ], - bootstrap: [AppComponent] -}) - -export class AppModule { } \ No newline at end of file diff --git a/spring-security-anguar/client/angular5/src/app/app.routing.ts b/spring-security-anguar/client/angular5/src/app/app.routing.ts deleted file mode 100644 index c794fc5c50..0000000000 --- a/spring-security-anguar/client/angular5/src/app/app.routing.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Routes, RouterModule } from '@angular/router'; - -import { HomeComponent } from './home/home.component'; -import { LoginComponent } from './login/login.component'; - -const appRoutes: Routes = [ - { path: '', component: HomeComponent}, - { path: 'login', component: LoginComponent }, - { path: '**', redirectTo: '' } -]; - -export const routing = RouterModule.forRoot(appRoutes); \ No newline at end of file diff --git a/spring-security-anguar/client/angular5/src/app/home/home.component.html b/spring-security-anguar/client/angular5/src/app/home/home.component.html deleted file mode 100644 index 7ccd2c2a3a..0000000000 --- a/spring-security-anguar/client/angular5/src/app/home/home.component.html +++ /dev/null @@ -1,4 +0,0 @@ -
-

Hi {{userName}}!

-

Logout

-
\ No newline at end of file diff --git a/spring-security-anguar/client/angular5/src/app/home/home.component.ts b/spring-security-anguar/client/angular5/src/app/home/home.component.ts deleted file mode 100644 index 7fe1ac4eff..0000000000 --- a/spring-security-anguar/client/angular5/src/app/home/home.component.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Http, Headers, RequestOptions } from '@angular/http'; -import 'rxjs/add/operator/map' - -@Component({ - selector:'home', - templateUrl: './home.component.html' -}) - -export class HomeComponent implements OnInit { - - userName: string; - - constructor(private http: Http) { } - - ngOnInit() { - let url = 'http://localhost:8082/user'; - - let headers:Headers = new Headers({ - 'Authorization': 'Basic ' + sessionStorage.getItem('token') - }) - let options = new RequestOptions({headers: headers}); - this.http.post(url,{}, options).map( - res => res.json(), - error => { - if(error.status == 401) - alert('Unauthorized'); - } - ).subscribe(principal => { - this.userName = principal.name; - }); - } - - logout() { - sessionStorage.setItem('token', ''); - } -} \ No newline at end of file diff --git a/spring-security-anguar/client/angular5/src/app/login/login.component.html b/spring-security-anguar/client/angular5/src/app/login/login.component.html deleted file mode 100644 index d87b91a7bb..0000000000 --- a/spring-security-anguar/client/angular5/src/app/login/login.component.html +++ /dev/null @@ -1,18 +0,0 @@ -
-

Login

-
-
- - -
Username is required
-
-
- - -
Password is required
-
-
- -
-
-
diff --git a/spring-security-anguar/client/angular5/src/app/login/login.component.ts b/spring-security-anguar/client/angular5/src/app/login/login.component.ts deleted file mode 100644 index 2db8f32871..0000000000 --- a/spring-security-anguar/client/angular5/src/app/login/login.component.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Router, ActivatedRoute } from '@angular/router'; -import { Http } from '@angular/http'; - -@Component({ - selector: 'login', - templateUrl: './login.component.html' -}) - -export class LoginComponent implements OnInit { - model: any = {}; - - constructor( - private route: ActivatedRoute, - private router: Router, - private http: Http) { } - - ngOnInit() { - sessionStorage.setItem('token', ''); - } - - - login() { - let url = 'http://localhost:8082/login'; - let result = this.http.post(url, { - userName: this.model.username, - password: this.model.password - }).map(res => res.json()).subscribe(isValid => { - if (isValid) { - sessionStorage.setItem('token', btoa(this.model.username + ':' + this.model.password)); - this.router.navigate(['']); - } else { - alert("Authentication failed.") - } - }); - } -} diff --git a/spring-security-anguar/client/angular5/src/index.html b/spring-security-anguar/client/angular5/src/index.html deleted file mode 100644 index c716820396..0000000000 --- a/spring-security-anguar/client/angular5/src/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - AngularCRUD - - - - - - - - - \ No newline at end of file diff --git a/spring-security-anguar/client/angular5/src/main.ts b/spring-security-anguar/client/angular5/src/main.ts deleted file mode 100644 index 49db98ae89..0000000000 --- a/spring-security-anguar/client/angular5/src/main.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; - -import { AppModule } from './app/app.module'; - -platformBrowserDynamic().bootstrapModule(AppModule); \ No newline at end of file diff --git a/spring-security-anguar/client/angular5/src/polyfills.ts b/spring-security-anguar/client/angular5/src/polyfills.ts deleted file mode 100644 index a4984ced57..0000000000 --- a/spring-security-anguar/client/angular5/src/polyfills.ts +++ /dev/null @@ -1,68 +0,0 @@ -/** - * This file includes polyfills needed by Angular and is loaded before the app. - * You can add your own extra polyfills to this file. - * - * This file is divided into 2 sections: - * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. - * 2. Application imports. Files imported after ZoneJS that should be loaded before your main - * file. - * - * The current setup is for so-called "evergreen" browsers; the last versions of browsers that - * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), - * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. - * - * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html - */ - -/*************************************************************************************************** - * BROWSER POLYFILLS - */ - -/** IE9, IE10 and IE11 requires all of the following polyfills. **/ -// import 'core-js/es6/symbol'; -// import 'core-js/es6/object'; -// import 'core-js/es6/function'; -// import 'core-js/es6/parse-int'; -// import 'core-js/es6/parse-float'; -// import 'core-js/es6/number'; -// import 'core-js/es6/math'; -// import 'core-js/es6/string'; -// import 'core-js/es6/date'; -// import 'core-js/es6/array'; -// import 'core-js/es6/regexp'; -// import 'core-js/es6/map'; -// import 'core-js/es6/weak-map'; -// import 'core-js/es6/set'; -/** IE10 and IE11 requires the following for NgClass support on SVG elements */ -// import 'classlist.js'; // Run `npm install --save classlist.js`. -/** Evergreen browsers require these. **/ -import 'core-js/es6/reflect'; -import 'core-js/es7/reflect'; - - -/** - * Required to support Web Animations `@angular/animation`. - * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation - **/ -// import 'web-animations-js'; // Run `npm install --save web-animations-js`. - - -/*************************************************************************************************** - * Zone JS is required by Angular itself. - */ -import 'zone.js/dist/zone'; // Included with Angular CLI. - - -/*************************************************************************************************** - * APPLICATION IMPORTS - */ - -/** - * Date, currency, decimal and percent pipes. - * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10 - */ -// import 'intl'; // Run `npm install --save intl`. -/** - * Need to import at least one locale-data with intl. - */ -// import 'intl/locale-data/jsonp/en'; \ No newline at end of file diff --git a/spring-security-anguar/client/angular5/src/styles.css b/spring-security-anguar/client/angular5/src/styles.css deleted file mode 100644 index cdd2d591d8..0000000000 --- a/spring-security-anguar/client/angular5/src/styles.css +++ /dev/null @@ -1,7 +0,0 @@ -a { - cursor: pointer; -} - -.help-block { - font-size: 12px; -} \ No newline at end of file diff --git a/spring-security-anguar/client/angular5/src/tsconfig.app.json b/spring-security-anguar/client/angular5/src/tsconfig.app.json deleted file mode 100644 index 213ce42a1b..0000000000 --- a/spring-security-anguar/client/angular5/src/tsconfig.app.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/app", - "baseUrl": "./", - "module": "es2015", - "types": [] - }, - "exclude": [ - "test.ts", - "**/*.spec.ts" - ] -} \ No newline at end of file diff --git a/spring-security-anguar/client/angular5/tsconfig.json b/spring-security-anguar/client/angular5/tsconfig.json deleted file mode 100644 index 0fdb5c817d..0000000000 --- a/spring-security-anguar/client/angular5/tsconfig.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "compileOnSave": false, - "compilerOptions": { - "outDir": "./dist/out-tsc", - "sourceMap": true, - "declaration": false, - "moduleResolution": "node", - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "target": "es5", - "typeRoots": [ - "node_modules/@types" - ], - "lib": [ - "es2017", - "dom" - ] - } -} \ No newline at end of file diff --git a/spring-security-anguar/client/angular5/tslint.json b/spring-security-anguar/client/angular5/tslint.json deleted file mode 100644 index 1c1d53b0d9..0000000000 --- a/spring-security-anguar/client/angular5/tslint.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "rulesDirectory": [ - "node_modules/codelyzer" - ], - "rules": { - "arrow-return-shorthand": true, - "callable-types": true, - "class-name": true, - "comment-format": [ - true, - "check-space" - ], - "curly": true, - "deprecation": { - "severity": "warn" - }, - "eofline": true, - "forin": true, - "import-blacklist": [ - true, - "rxjs", - "rxjs/Rx" - ], - "import-spacing": true, - "indent": [ - true, - "spaces" - ], - "interface-over-type-literal": true, - "label-position": true, - "max-line-length": [ - true, - 140 - ], - "member-access": false, - "member-ordering": [ - true, - { - "order": [ - "static-field", - "instance-field", - "static-method", - "instance-method" - ] - } - ], - "no-arg": true, - "no-bitwise": true, - "no-console": [ - true, - "debug", - "info", - "time", - "timeEnd", - "trace" - ], - "no-construct": true, - "no-debugger": true, - "no-duplicate-super": true, - "no-empty": false, - "no-empty-interface": true, - "no-eval": true, - "no-inferrable-types": [ - true, - "ignore-params" - ], - "no-misused-new": true, - "no-non-null-assertion": true, - "no-shadowed-variable": true, - "no-string-literal": false, - "no-string-throw": true, - "no-switch-case-fall-through": true, - "no-trailing-whitespace": true, - "no-unnecessary-initializer": true, - "no-unused-expression": true, - "no-use-before-declare": true, - "no-var-keyword": true, - "object-literal-sort-keys": false, - "one-line": [ - true, - "check-open-brace", - "check-catch", - "check-else", - "check-whitespace" - ], - "prefer-const": true, - "quotemark": [ - true, - "single" - ], - "radix": true, - "semicolon": [ - true, - "always" - ], - "triple-equals": [ - true, - "allow-null-check" - ], - "typedef-whitespace": [ - true, - { - "call-signature": "nospace", - "index-signature": "nospace", - "parameter": "nospace", - "property-declaration": "nospace", - "variable-declaration": "nospace" - } - ], - "typeof-compare": true, - "unified-signatures": true, - "variable-name": false, - "whitespace": [ - true, - "check-branch", - "check-decl", - "check-operator", - "check-separator", - "check-type" - ], - "directive-selector": [ - true, - "attribute", - "app", - "camelCase" - ], - "component-selector": [ - true, - "element", - "app", - "kebab-case" - ], - "no-output-on-prefix": true, - "use-input-property-decorator": true, - "use-output-property-decorator": true, - "use-host-property-decorator": true, - "no-input-rename": true, - "no-output-rename": true, - "use-life-cycle-interface": true, - "use-pipe-transform-interface": true, - "component-class-suffix": true, - "directive-class-suffix": true - } -} \ No newline at end of file diff --git a/spring-security-anguar/client/angular6/angular.json b/spring-security-anguar/client/angular6/angular.json deleted file mode 100644 index 0168c58817..0000000000 --- a/spring-security-anguar/client/angular6/angular.json +++ /dev/null @@ -1,127 +0,0 @@ -{ - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", - "version": 1, - "newProjectRoot": "projects", - "projects": { - "angular6-login": { - "root": "", - "sourceRoot": "src", - "projectType": "application", - "prefix": "app", - "schematics": {}, - "architect": { - "build": { - "builder": "@angular-devkit/build-angular:browser", - "options": { - "outputPath": "dist/angular6-login", - "index": "src/index.html", - "main": "src/main.ts", - "polyfills": "src/polyfills.ts", - "tsConfig": "src/tsconfig.app.json", - "assets": [ - "src/favicon.ico", - "src/assets" - ], - "styles": [ - "src/styles.css" - ], - "scripts": [] - }, - "configurations": { - "production": { - "fileReplacements": [ - { - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.prod.ts" - } - ], - "optimization": true, - "outputHashing": "all", - "sourceMap": false, - "extractCss": true, - "namedChunks": false, - "aot": true, - "extractLicenses": true, - "vendorChunk": false, - "buildOptimizer": true - } - } - }, - "serve": { - "builder": "@angular-devkit/build-angular:dev-server", - "options": { - "browserTarget": "angular6-login:build" - }, - "configurations": { - "production": { - "browserTarget": "angular6-login:build:production" - } - } - }, - "extract-i18n": { - "builder": "@angular-devkit/build-angular:extract-i18n", - "options": { - "browserTarget": "angular6-login:build" - } - }, - "test": { - "builder": "@angular-devkit/build-angular:karma", - "options": { - "main": "src/test.ts", - "polyfills": "src/polyfills.ts", - "tsConfig": "src/tsconfig.spec.json", - "karmaConfig": "src/karma.conf.js", - "styles": [ - "src/styles.css" - ], - "scripts": [], - "assets": [ - "src/favicon.ico", - "src/assets" - ] - } - }, - "lint": { - "builder": "@angular-devkit/build-angular:tslint", - "options": { - "tsConfig": [ - "src/tsconfig.app.json", - "src/tsconfig.spec.json" - ], - "exclude": [ - "**/node_modules/**" - ] - } - } - } - }, - "angular6-login-e2e": { - "root": "e2e/", - "projectType": "application", - "architect": { - "e2e": { - "builder": "@angular-devkit/build-angular:protractor", - "options": { - "protractorConfig": "e2e/protractor.conf.js", - "devServerTarget": "angular6-login:serve" - }, - "configurations": { - "production": { - "devServerTarget": "angular6-login:serve:production" - } - } - }, - "lint": { - "builder": "@angular-devkit/build-angular:tslint", - "options": { - "tsConfig": "e2e/tsconfig.e2e.json", - "exclude": [ - "**/node_modules/**" - ] - } - } - } - } - }, - "defaultProject": "angular6-login" -} \ No newline at end of file diff --git a/spring-security-anguar/client/angular6/package.json b/spring-security-anguar/client/angular6/package.json deleted file mode 100644 index a0adcd03f3..0000000000 --- a/spring-security-anguar/client/angular6/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "angular6-login", - "version": "0.0.0", - "scripts": { - "ng": "ng", - "start": "ng serve", - "build": "ng build", - "test": "ng test", - "lint": "ng lint", - "e2e": "ng e2e" - }, - "private": true, - "dependencies": { - "@angular/animations": "^6.0.3", - "@angular/common": "^6.0.3", - "@angular/compiler": "^6.0.3", - "@angular/core": "^6.0.3", - "@angular/forms": "^6.0.3", - "@angular/http": "^6.0.3", - "@angular/platform-browser": "^6.0.3", - "@angular/platform-browser-dynamic": "^6.0.3", - "@angular/router": "^6.0.3", - "core-js": "^2.5.4", - "rxjs": "^6.0.0", - "zone.js": "^0.8.26" - }, - "devDependencies": { - "@angular/compiler-cli": "^6.0.3", - "@angular-devkit/build-angular": "~0.6.8", - "typescript": "~2.7.2", - "@angular/cli": "~6.0.8", - "@angular/language-service": "^6.0.3", - "@types/jasmine": "~2.8.6", - "@types/jasminewd2": "~2.0.3", - "@types/node": "~8.9.4", - "codelyzer": "~4.2.1", - "jasmine-core": "~2.99.1", - "jasmine-spec-reporter": "~4.2.1", - "karma": "~1.7.1", - "karma-chrome-launcher": "~2.2.0", - "karma-coverage-istanbul-reporter": "~2.0.0", - "karma-jasmine": "~1.1.1", - "karma-jasmine-html-reporter": "^0.2.2", - "protractor": "~5.3.0", - "ts-node": "~5.0.1", - "tslint": "~5.9.1" - } -} diff --git a/spring-security-anguar/client/angular6/src/app/app.component.html b/spring-security-anguar/client/angular6/src/app/app.component.html deleted file mode 100644 index 6bf00f3018..0000000000 --- a/spring-security-anguar/client/angular6/src/app/app.component.html +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/spring-security-anguar/client/angular6/src/app/app.component.ts b/spring-security-anguar/client/angular6/src/app/app.component.ts deleted file mode 100644 index 36f986c63f..0000000000 --- a/spring-security-anguar/client/angular6/src/app/app.component.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-root', - templateUrl: './app.component.html' -}) - -export class AppComponent { } \ No newline at end of file diff --git a/spring-security-anguar/client/angular6/src/app/app.module.ts b/spring-security-anguar/client/angular6/src/app/app.module.ts deleted file mode 100644 index 4f9a792e19..0000000000 --- a/spring-security-anguar/client/angular6/src/app/app.module.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { FormsModule } from '@angular/forms'; -import { HttpClientModule } from '@angular/common/http'; - -import { AppComponent } from './app.component'; -import { routing } from './app.routing'; - -import { HomeComponent } from './home/home.component'; -import { LoginComponent } from './login/login.component'; - -@NgModule({ - imports: [ - BrowserModule, - FormsModule, - HttpClientModule, - routing - ], - declarations: [ - AppComponent, - HomeComponent, - LoginComponent - ], - bootstrap: [AppComponent] -}) - -export class AppModule { } \ No newline at end of file diff --git a/spring-security-anguar/client/angular6/src/app/app.routing.ts b/spring-security-anguar/client/angular6/src/app/app.routing.ts deleted file mode 100644 index e5f5e04aa8..0000000000 --- a/spring-security-anguar/client/angular6/src/app/app.routing.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Routes, RouterModule } from '@angular/router'; -import { HomeComponent } from './home/home.component'; -import { LoginComponent } from './login/login.component'; - -const appRoutes: Routes = [ - { path: '', component: HomeComponent }, - { path: 'login', component: LoginComponent }, - { path: '**', redirectTo: '' } -]; - -export const routing = RouterModule.forRoot(appRoutes); \ No newline at end of file diff --git a/spring-security-anguar/client/angular6/src/app/home/home.component.html b/spring-security-anguar/client/angular6/src/app/home/home.component.html deleted file mode 100644 index 7ccd2c2a3a..0000000000 --- a/spring-security-anguar/client/angular6/src/app/home/home.component.html +++ /dev/null @@ -1,4 +0,0 @@ -
-

Hi {{userName}}!

-

Logout

-
\ No newline at end of file diff --git a/spring-security-anguar/client/angular6/src/app/home/home.component.ts b/spring-security-anguar/client/angular6/src/app/home/home.component.ts deleted file mode 100644 index 6c9fcfd97f..0000000000 --- a/spring-security-anguar/client/angular6/src/app/home/home.component.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http'; -import { Observable, throwError } from 'rxjs'; -import { catchError, map, tap} from 'rxjs/operators'; -@Component({ - selector: 'home', - templateUrl: './home.component.html' -}) - -export class HomeComponent implements OnInit { - - userName: string; - - constructor(private http: HttpClient) { } - - ngOnInit() { - let url = 'http://localhost:8082/user'; - - let headers: HttpHeaders = new HttpHeaders({ - 'Authorization': 'Basic ' + sessionStorage.getItem('token') - }); - - let options = { headers: headers }; - this.http.post>(url, {}, options). - subscribe(principal => { - this.userName = principal['name']; - }, - error => { - if(error.status == 401) - alert('Unauthorized'); - } - ); - } - - logout() { - sessionStorage.setItem('token', ''); - } - private handleError(error: HttpErrorResponse) { - if (error.error instanceof ErrorEvent) { - console.error('An error occurred:', error.error.message); - } else { - console.error( - `Backend returned code ${error.status}, ` + - `body was: ${error.error}`); - } - return throwError( - 'Something bad happened; please try again later.'); - }; -} \ No newline at end of file diff --git a/spring-security-anguar/client/angular6/src/app/login/login.component.html b/spring-security-anguar/client/angular6/src/app/login/login.component.html deleted file mode 100644 index 4291206469..0000000000 --- a/spring-security-anguar/client/angular6/src/app/login/login.component.html +++ /dev/null @@ -1,15 +0,0 @@ -
-
- - -
Username is required
-
-
- - -
Password is required
-
-
- -
-
\ No newline at end of file diff --git a/spring-security-anguar/client/angular6/src/app/login/login.component.ts b/spring-security-anguar/client/angular6/src/app/login/login.component.ts deleted file mode 100644 index 27af9ebba5..0000000000 --- a/spring-security-anguar/client/angular6/src/app/login/login.component.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Router, ActivatedRoute } from '@angular/router'; -import { HttpClient } from '@angular/common/http'; -import { Observable } from 'rxjs'; - -@Component({ - selector: 'login', - templateUrl: './login.component.html' -}) - -export class LoginComponent implements OnInit { - - model: any = {}; - - constructor( - private route: ActivatedRoute, - private router: Router, - private http: HttpClient - ) { } - - ngOnInit() { - sessionStorage.setItem('token', ''); - } - - login() { - let url = 'http://localhost:8082/login'; - this.http.post>(url, { - userName: this.model.username, - password: this.model.password - }).subscribe(isValid => { - if (isValid) { - sessionStorage.setItem('token', btoa(this.model.username + ':' + this.model.password)); - this.router.navigate(['']); - } else { - alert("Authentication failed.") - } - }); - } -} diff --git a/spring-security-anguar/client/angular6/src/index.html b/spring-security-anguar/client/angular6/src/index.html deleted file mode 100644 index c716820396..0000000000 --- a/spring-security-anguar/client/angular6/src/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - AngularCRUD - - - - - - - - - \ No newline at end of file diff --git a/spring-security-anguar/client/angular6/src/main.ts b/spring-security-anguar/client/angular6/src/main.ts deleted file mode 100644 index 49db98ae89..0000000000 --- a/spring-security-anguar/client/angular6/src/main.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; - -import { AppModule } from './app/app.module'; - -platformBrowserDynamic().bootstrapModule(AppModule); \ No newline at end of file diff --git a/spring-security-anguar/client/angular6/src/polyfills.ts b/spring-security-anguar/client/angular6/src/polyfills.ts deleted file mode 100644 index a4984ced57..0000000000 --- a/spring-security-anguar/client/angular6/src/polyfills.ts +++ /dev/null @@ -1,68 +0,0 @@ -/** - * This file includes polyfills needed by Angular and is loaded before the app. - * You can add your own extra polyfills to this file. - * - * This file is divided into 2 sections: - * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. - * 2. Application imports. Files imported after ZoneJS that should be loaded before your main - * file. - * - * The current setup is for so-called "evergreen" browsers; the last versions of browsers that - * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), - * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. - * - * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html - */ - -/*************************************************************************************************** - * BROWSER POLYFILLS - */ - -/** IE9, IE10 and IE11 requires all of the following polyfills. **/ -// import 'core-js/es6/symbol'; -// import 'core-js/es6/object'; -// import 'core-js/es6/function'; -// import 'core-js/es6/parse-int'; -// import 'core-js/es6/parse-float'; -// import 'core-js/es6/number'; -// import 'core-js/es6/math'; -// import 'core-js/es6/string'; -// import 'core-js/es6/date'; -// import 'core-js/es6/array'; -// import 'core-js/es6/regexp'; -// import 'core-js/es6/map'; -// import 'core-js/es6/weak-map'; -// import 'core-js/es6/set'; -/** IE10 and IE11 requires the following for NgClass support on SVG elements */ -// import 'classlist.js'; // Run `npm install --save classlist.js`. -/** Evergreen browsers require these. **/ -import 'core-js/es6/reflect'; -import 'core-js/es7/reflect'; - - -/** - * Required to support Web Animations `@angular/animation`. - * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation - **/ -// import 'web-animations-js'; // Run `npm install --save web-animations-js`. - - -/*************************************************************************************************** - * Zone JS is required by Angular itself. - */ -import 'zone.js/dist/zone'; // Included with Angular CLI. - - -/*************************************************************************************************** - * APPLICATION IMPORTS - */ - -/** - * Date, currency, decimal and percent pipes. - * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10 - */ -// import 'intl'; // Run `npm install --save intl`. -/** - * Need to import at least one locale-data with intl. - */ -// import 'intl/locale-data/jsonp/en'; \ No newline at end of file diff --git a/spring-security-anguar/client/angular6/src/styles.css b/spring-security-anguar/client/angular6/src/styles.css deleted file mode 100644 index cdd2d591d8..0000000000 --- a/spring-security-anguar/client/angular6/src/styles.css +++ /dev/null @@ -1,7 +0,0 @@ -a { - cursor: pointer; -} - -.help-block { - font-size: 12px; -} \ No newline at end of file diff --git a/spring-security-anguar/client/angular6/src/tsconfig.app.json b/spring-security-anguar/client/angular6/src/tsconfig.app.json deleted file mode 100644 index 213ce42a1b..0000000000 --- a/spring-security-anguar/client/angular6/src/tsconfig.app.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/app", - "baseUrl": "./", - "module": "es2015", - "types": [] - }, - "exclude": [ - "test.ts", - "**/*.spec.ts" - ] -} \ No newline at end of file diff --git a/spring-security-anguar/client/angular6/tsconfig.json b/spring-security-anguar/client/angular6/tsconfig.json deleted file mode 100644 index ef44e2862b..0000000000 --- a/spring-security-anguar/client/angular6/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compileOnSave": false, - "compilerOptions": { - "baseUrl": "./", - "outDir": "./dist/out-tsc", - "sourceMap": true, - "declaration": false, - "moduleResolution": "node", - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "target": "es5", - "typeRoots": [ - "node_modules/@types" - ], - "lib": [ - "es2017", - "dom" - ] - } -} diff --git a/spring-security-anguar/client/angular6/tslint.json b/spring-security-anguar/client/angular6/tslint.json deleted file mode 100644 index 3ea984c776..0000000000 --- a/spring-security-anguar/client/angular6/tslint.json +++ /dev/null @@ -1,130 +0,0 @@ -{ - "rulesDirectory": [ - "node_modules/codelyzer" - ], - "rules": { - "arrow-return-shorthand": true, - "callable-types": true, - "class-name": true, - "comment-format": [ - true, - "check-space" - ], - "curly": true, - "deprecation": { - "severity": "warn" - }, - "eofline": true, - "forin": true, - "import-blacklist": [ - true, - "rxjs/Rx" - ], - "import-spacing": true, - "indent": [ - true, - "spaces" - ], - "interface-over-type-literal": true, - "label-position": true, - "max-line-length": [ - true, - 140 - ], - "member-access": false, - "member-ordering": [ - true, - { - "order": [ - "static-field", - "instance-field", - "static-method", - "instance-method" - ] - } - ], - "no-arg": true, - "no-bitwise": true, - "no-console": [ - true, - "debug", - "info", - "time", - "timeEnd", - "trace" - ], - "no-construct": true, - "no-debugger": true, - "no-duplicate-super": true, - "no-empty": false, - "no-empty-interface": true, - "no-eval": true, - "no-inferrable-types": [ - true, - "ignore-params" - ], - "no-misused-new": true, - "no-non-null-assertion": true, - "no-shadowed-variable": true, - "no-string-literal": false, - "no-string-throw": true, - "no-switch-case-fall-through": true, - "no-trailing-whitespace": true, - "no-unnecessary-initializer": true, - "no-unused-expression": true, - "no-use-before-declare": true, - "no-var-keyword": true, - "object-literal-sort-keys": false, - "one-line": [ - true, - "check-open-brace", - "check-catch", - "check-else", - "check-whitespace" - ], - "prefer-const": true, - "quotemark": [ - true, - "single" - ], - "radix": true, - "semicolon": [ - true, - "always" - ], - "triple-equals": [ - true, - "allow-null-check" - ], - "typedef-whitespace": [ - true, - { - "call-signature": "nospace", - "index-signature": "nospace", - "parameter": "nospace", - "property-declaration": "nospace", - "variable-declaration": "nospace" - } - ], - "unified-signatures": true, - "variable-name": false, - "whitespace": [ - true, - "check-branch", - "check-decl", - "check-operator", - "check-separator", - "check-type" - ], - "no-output-on-prefix": true, - "use-input-property-decorator": true, - "use-output-property-decorator": true, - "use-host-property-decorator": true, - "no-input-rename": true, - "no-output-rename": true, - "use-life-cycle-interface": true, - "use-pipe-transform-interface": true, - "component-class-suffix": true, - "directive-class-suffix": true - } -} diff --git a/spring-security-anguar/server/pom.xml b/spring-security-anguar/server/pom.xml deleted file mode 100644 index 39de129c87..0000000000 --- a/spring-security-anguar/server/pom.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - 4.0.0 - com.baeldung - spring-security-angular - 0.0.1-SNAPSHOT - jar - spring-boot-security-rest - Spring Boot Security REST - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - ../../ - - - - - - org.springframework.boot - spring-boot-dependencies - 1.5.9.RELEASE - pom - import - - - - - - - - - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework.security - spring-security-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - UTF-8 - UTF-8 - - - diff --git a/spring-security-anguar/server/src/main/java/com/baeldung/springbootsecurityrest/basicauth/SpringBootSecurityApplication.java b/spring-security-anguar/server/src/main/java/com/baeldung/springbootsecurityrest/basicauth/SpringBootSecurityApplication.java deleted file mode 100644 index 681c7590a8..0000000000 --- a/spring-security-anguar/server/src/main/java/com/baeldung/springbootsecurityrest/basicauth/SpringBootSecurityApplication.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.springbootsecurityrest.basicauth; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication(scanBasePackages = "com.baeldung.springbootsecurityrest") -@EnableAutoConfiguration -public class SpringBootSecurityApplication { - - public static void main(String[] args) { - SpringApplication.run(SpringBootSecurityApplication.class, args); - } -} diff --git a/spring-security-anguar/server/src/main/java/com/baeldung/springbootsecurityrest/basicauth/config/BasicAuthConfiguration.java b/spring-security-anguar/server/src/main/java/com/baeldung/springbootsecurityrest/basicauth/config/BasicAuthConfiguration.java deleted file mode 100644 index 3ed301439c..0000000000 --- a/spring-security-anguar/server/src/main/java/com/baeldung/springbootsecurityrest/basicauth/config/BasicAuthConfiguration.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.springbootsecurityrest.basicauth.config; - -import org.springframework.context.annotation.Configuration; -import org.springframework.http.HttpMethod; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; - -@Configuration -@EnableWebSecurity -public class BasicAuthConfiguration extends WebSecurityConfigurerAdapter { - - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth - .inMemoryAuthentication() - .withUser("user") - .password("password") - .roles("USER"); - } - - @Override - protected void configure(HttpSecurity http) throws Exception { - http.csrf().disable() - .authorizeRequests() - .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() - .antMatchers("/login").permitAll() - .anyRequest() - .authenticated() - .and() - .httpBasic(); - } -} diff --git a/spring-security-anguar/server/src/main/java/com/baeldung/springbootsecurityrest/controller/UserController.java b/spring-security-anguar/server/src/main/java/com/baeldung/springbootsecurityrest/controller/UserController.java deleted file mode 100644 index 825290ff2d..0000000000 --- a/spring-security-anguar/server/src/main/java/com/baeldung/springbootsecurityrest/controller/UserController.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.springbootsecurityrest.controller; - -import java.security.Principal; -import java.util.Base64; - -import javax.servlet.http.HttpServletRequest; - -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.baeldung.springbootsecurityrest.vo.User; - -@RestController -@CrossOrigin -public class UserController { - - @RequestMapping("/login") - public boolean login(@RequestBody User user) { - if(user.getUserName().equals("user") && user.getPassword().equals("password")) { - return true; - } - return false; - } - - @RequestMapping("/user") - public Principal user(HttpServletRequest request) { - String authToken = request.getHeader("Authorization").substring("Basic".length()).trim(); - return () -> new String(Base64.getDecoder().decode(authToken)).split(":")[0]; - } -} diff --git a/spring-security-anguar/server/src/main/java/com/baeldung/springbootsecurityrest/vo/User.java b/spring-security-anguar/server/src/main/java/com/baeldung/springbootsecurityrest/vo/User.java deleted file mode 100644 index 0eda5ce9ec..0000000000 --- a/spring-security-anguar/server/src/main/java/com/baeldung/springbootsecurityrest/vo/User.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.springbootsecurityrest.vo; - - -public class User { - - 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-security-anguar/server/src/main/resources/application.properties b/spring-security-anguar/server/src/main/resources/application.properties deleted file mode 100644 index 565d97a7b0..0000000000 --- a/spring-security-anguar/server/src/main/resources/application.properties +++ /dev/null @@ -1,5 +0,0 @@ -#spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration -#security.user.password=password -#security.oauth2.client.client-id=client -#security.oauth2.client.client-secret=secret -server.port=8082 diff --git a/spring-security-anguar/server/src/main/resources/logback.xml b/spring-security-anguar/server/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/spring-security-anguar/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 From de684bc3ccf0b79a8d23ce76e1a4b975f84cabec Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 6 Sep 2018 23:38:54 +0530 Subject: [PATCH 125/128] BAEL-8842 Update spring-freemarker project - Updated freemarker module's spring and freemarker version to latest --- spring-freemarker/pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/spring-freemarker/pom.xml b/spring-freemarker/pom.xml index 96607f7f10..cebbb47713 100644 --- a/spring-freemarker/pom.xml +++ b/spring-freemarker/pom.xml @@ -1,7 +1,7 @@ 4.0.0 - com.freemarker.example + com.baeldung.freemarker spring-freemarker war 1.0-SNAPSHOT @@ -9,8 +9,8 @@ com.baeldung - parent-modules - 1.0.0-SNAPSHOT + parent-spring-5 + 0.0.1-SNAPSHOT @@ -48,8 +48,8 @@ - 4.3.4.RELEASE - 2.3.23 + 5.0.8.RELEASE + 2.3.28 3.1.0 false From 2732051c6154b47bdf4aa78050d0c8124e1736d9 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 6 Sep 2018 23:55:42 +0530 Subject: [PATCH 126/128] BAEL-8854 Fix enterprise-patterns module - Removed corrupted enterprise-patterns module, relevant sources can be found in patterns module --- enterprise-patterns/README.md | 1 - .../front/controller/filters/AuditFilter.java | 25 ------------------- .../filters/VisitorCounterFilter.java | 23 ----------------- .../src/main/resources/logback.xml | 13 ---------- enterprise-patterns/pom.xml | 19 -------------- 5 files changed, 81 deletions(-) delete mode 100644 enterprise-patterns/README.md delete mode 100644 enterprise-patterns/intercepting-filter-pattern/src/main/java/com/baeldung/enterprise/patterns/front/controller/filters/AuditFilter.java delete mode 100644 enterprise-patterns/intercepting-filter-pattern/src/main/java/com/baeldung/enterprise/patterns/front/controller/filters/VisitorCounterFilter.java delete mode 100644 enterprise-patterns/intercepting-filter-pattern/src/main/resources/logback.xml delete mode 100644 enterprise-patterns/pom.xml diff --git a/enterprise-patterns/README.md b/enterprise-patterns/README.md deleted file mode 100644 index ff12555376..0000000000 --- a/enterprise-patterns/README.md +++ /dev/null @@ -1 +0,0 @@ -## Relevant articles: diff --git a/enterprise-patterns/intercepting-filter-pattern/src/main/java/com/baeldung/enterprise/patterns/front/controller/filters/AuditFilter.java b/enterprise-patterns/intercepting-filter-pattern/src/main/java/com/baeldung/enterprise/patterns/front/controller/filters/AuditFilter.java deleted file mode 100644 index d24c0a94b3..0000000000 --- a/enterprise-patterns/intercepting-filter-pattern/src/main/java/com/baeldung/enterprise/patterns/front/controller/filters/AuditFilter.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.enterprise.patterns.front.controller.filters; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; -import java.io.IOException; - -public class AuditFilter extends BaseFilter { - @Override - public void doFilter( - ServletRequest request, - ServletResponse response, - FilterChain chain - ) throws IOException, ServletException { - HttpServletRequest httpServletRequest = (HttpServletRequest) request; - HttpSession session = httpServletRequest.getSession(false); - if (session != null && session.getAttribute("username") != null) { - request.setAttribute("username", session.getAttribute("username")); - } - chain.doFilter(request, response); - } -} diff --git a/enterprise-patterns/intercepting-filter-pattern/src/main/java/com/baeldung/enterprise/patterns/front/controller/filters/VisitorCounterFilter.java b/enterprise-patterns/intercepting-filter-pattern/src/main/java/com/baeldung/enterprise/patterns/front/controller/filters/VisitorCounterFilter.java deleted file mode 100644 index 0ae7cd73fd..0000000000 --- a/enterprise-patterns/intercepting-filter-pattern/src/main/java/com/baeldung/enterprise/patterns/front/controller/filters/VisitorCounterFilter.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.enterprise.patterns.front.controller.filters; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.annotation.WebFilter; -import java.io.IOException; - -@WebFilter(servletNames = "front-controller") -public class VisitorCounterFilter extends BaseFilter { - private int counter; - - @Override - public void doFilter( - ServletRequest request, - ServletResponse response, - FilterChain chain - ) throws IOException, ServletException { - request.setAttribute("counter", ++counter); - chain.doFilter(request, response); - } -} diff --git a/enterprise-patterns/intercepting-filter-pattern/src/main/resources/logback.xml b/enterprise-patterns/intercepting-filter-pattern/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/enterprise-patterns/intercepting-filter-pattern/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/enterprise-patterns/pom.xml b/enterprise-patterns/pom.xml deleted file mode 100644 index ffd0b66aad..0000000000 --- a/enterprise-patterns/pom.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 4.0.0 - com.baeldung.enterprise.patterns - enterprise-patterns-parent - pom - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - spring-dispatcher-servlet - - - From d1baef79973e6512655de05bf9e5e62fcf6e0983 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Fri, 7 Sep 2018 00:33:33 +0530 Subject: [PATCH 127/128] Update pom.xml --- spring-freemarker/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-freemarker/pom.xml b/spring-freemarker/pom.xml index cebbb47713..9da0f1430d 100644 --- a/spring-freemarker/pom.xml +++ b/spring-freemarker/pom.xml @@ -9,7 +9,7 @@ com.baeldung - parent-spring-5 + parent-modules 0.0.1-SNAPSHOT @@ -54,4 +54,4 @@ false - \ No newline at end of file + From 873deb1d65bfa145506e06319c637b9965b7292d Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Fri, 7 Sep 2018 00:33:50 +0530 Subject: [PATCH 128/128] Update pom.xml --- spring-freemarker/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-freemarker/pom.xml b/spring-freemarker/pom.xml index 9da0f1430d..f0626195fd 100644 --- a/spring-freemarker/pom.xml +++ b/spring-freemarker/pom.xml @@ -10,7 +10,7 @@ com.baeldung parent-modules - 0.0.1-SNAPSHOT + 1.0.0-SNAPSHOT