From c1d7b27f244b355da11a4aa562002d2b94bfd953 Mon Sep 17 00:00:00 2001 From: Rafael Zucareli Date: Wed, 1 Aug 2018 20:14:08 -0300 Subject: [PATCH 001/359] Add Subject alternative name I add a Subject alternative name (SAN) parameter in all commands. This make the generated certificate work in Google Chrome. Before that change Chrome presents a ERR_CERT_COMMON_NAME_INVALID even when you had add the certificate as a know Authority. --- spring-security-x509/keystore/Makefile | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/spring-security-x509/keystore/Makefile b/spring-security-x509/keystore/Makefile index 63498fea76..2b5b5e8abe 100644 --- a/spring-security-x509/keystore/Makefile +++ b/spring-security-x509/keystore/Makefile @@ -20,65 +20,65 @@ all: clean create-keystore add-host create-truststore add-client create-keystore: # Generate a certificate authority (CA) - keytool -genkey -alias ca -ext BC=ca:true \ + keytool -genkey -alias ca -ext san=dns:localhost,ip:127.0.0.1 -ext BC=ca:true \ -keyalg RSA -keysize 4096 -sigalg SHA512withRSA -keypass $(PASSWORD) \ -validity 3650 -dname $(DNAME_CA) \ -keystore $(KEYSTORE) -storepass $(PASSWORD) add-host: # Generate a host certificate - keytool -genkey -alias $(HOSTNAME) \ + keytool -genkey -alias $(HOSTNAME) -ext san=dns:localhost,ip:127.0.0.1 \ -keyalg RSA -keysize 4096 -sigalg SHA512withRSA -keypass $(PASSWORD) \ -validity 3650 -dname $(DNAME_HOST) \ -keystore $(KEYSTORE) -storepass $(PASSWORD) # Generate a host certificate signing request - keytool -certreq -alias $(HOSTNAME) -ext BC=ca:true \ + keytool -certreq -alias $(HOSTNAME) -ext san=dns:localhost,ip:127.0.0.1 -ext BC=ca:true \ -keyalg RSA -keysize 4096 -sigalg SHA512withRSA \ -validity 3650 -file "$(HOSTNAME).csr" \ -keystore $(KEYSTORE) -storepass $(PASSWORD) # Generate signed certificate with the certificate authority - keytool -gencert -alias ca \ + keytool -gencert -alias ca -ext san=dns:localhost,ip:127.0.0.1 \ -validity 3650 -sigalg SHA512withRSA \ -infile "$(HOSTNAME).csr" -outfile "$(HOSTNAME).crt" -rfc \ -keystore $(KEYSTORE) -storepass $(PASSWORD) # Import signed certificate into the keystore - keytool -import -trustcacerts -alias $(HOSTNAME) \ + keytool -import -trustcacerts -alias $(HOSTNAME) -ext san=dns:localhost,ip:127.0.0.1 \ -file "$(HOSTNAME).crt" \ -keystore $(KEYSTORE) -storepass $(PASSWORD) export-authority: # Export certificate authority - keytool -export -alias ca -file ca.crt -rfc \ + keytool -export -alias ca -ext san=dns:localhost,ip:127.0.0.1 -file ca.crt -rfc \ -keystore $(KEYSTORE) -storepass $(PASSWORD) create-truststore: export-authority # Import certificate authority into a new truststore - keytool -import -trustcacerts -noprompt -alias ca -file ca.crt \ + keytool -import -trustcacerts -noprompt -alias ca -ext san=dns:localhost,ip:127.0.0.1 -file ca.crt \ -keystore $(TRUSTSTORE) -storepass $(PASSWORD) add-client: # Generate client certificate - keytool -genkey -alias $(CLIENTNAME) \ + keytool -genkey -alias $(CLIENTNAME) -ext san=dns:localhost,ip:127.0.0.1 \ -keyalg RSA -keysize 4096 -sigalg SHA512withRSA -keypass $(PASSWORD) \ -validity 3650 -dname $(DNAME_CLIENT) \ -keystore $(TRUSTSTORE) -storepass $(PASSWORD) # Generate a host certificate signing request - keytool -certreq -alias $(CLIENTNAME) -ext BC=ca:true \ + keytool -certreq -alias $(CLIENTNAME) -ext san=dns:localhost,ip:127.0.0.1 -ext BC=ca:true \ -keyalg RSA -keysize 4096 -sigalg SHA512withRSA \ -validity 3650 -file "$(CLIENTNAME).csr" \ -keystore $(TRUSTSTORE) -storepass $(PASSWORD) # Generate signed certificate with the certificate authority - keytool -gencert -alias ca \ + keytool -gencert -alias ca -ext san=dns:localhost,ip:127.0.0.1 \ -validity 3650 -sigalg SHA512withRSA \ -infile "$(CLIENTNAME).csr" -outfile "$(CLIENTNAME).crt" -rfc \ -keystore $(KEYSTORE) -storepass $(PASSWORD) # Import signed certificate into the truststore - keytool -import -trustcacerts -alias $(CLIENTNAME) \ + keytool -import -trustcacerts -alias $(CLIENTNAME) -ext san=dns:localhost,ip:127.0.0.1 \ -file "$(CLIENTNAME).crt" \ -keystore $(TRUSTSTORE) -storepass $(PASSWORD) # Export private certificate for importing into a browser - keytool -importkeystore -srcalias $(CLIENTNAME) \ + keytool -importkeystore -srcalias $(CLIENTNAME) -ext san=dns:localhost,ip:127.0.0.1 \ -srckeystore $(TRUSTSTORE) -srcstorepass $(PASSWORD) \ -destkeystore "$(CLIENTNAME).p12" -deststorepass $(PASSWORD) \ -deststoretype PKCS12 From e8ea3f1f804f4bf220e4279b3a4f02a59029b7e8 Mon Sep 17 00:00:00 2001 From: Jonathan Paul Cook Date: Sat, 13 Oct 2018 19:39:00 +0200 Subject: [PATCH 002/359] BAEL-2268 - Guide to JerseyTest - second attempt without formatting changes --- .../baeldung/jersey/server/model/Fruit.java | 5 +++ .../jersey/server/rest/FruitResource.java | 12 +++++++ .../GreetingsResourceIntegrationTest.java | 33 +++++++++++++++++++ .../rest/FruitResourceIntegrationTest.java | 27 +++++++++++++++ 4 files changed, 77 insertions(+) create mode 100644 jersey/src/test/java/com/baeldung/jersey/server/GreetingsResourceIntegrationTest.java diff --git a/jersey/src/main/java/com/baeldung/jersey/server/model/Fruit.java b/jersey/src/main/java/com/baeldung/jersey/server/model/Fruit.java index c55362487b..1a648290a3 100644 --- a/jersey/src/main/java/com/baeldung/jersey/server/model/Fruit.java +++ b/jersey/src/main/java/com/baeldung/jersey/server/model/Fruit.java @@ -54,4 +54,9 @@ public class Fruit { public void setSerial(String serial) { this.serial = serial; } + + @Override + public String toString() { + return "Fruit [name: " + getName() + " colour: " + getColour() + "]"; + } } diff --git a/jersey/src/main/java/com/baeldung/jersey/server/rest/FruitResource.java b/jersey/src/main/java/com/baeldung/jersey/server/rest/FruitResource.java index ee34cdd3ca..88692dcc55 100644 --- a/jersey/src/main/java/com/baeldung/jersey/server/rest/FruitResource.java +++ b/jersey/src/main/java/com/baeldung/jersey/server/rest/FruitResource.java @@ -16,6 +16,8 @@ import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; import org.glassfish.jersey.server.mvc.ErrorTemplate; import org.glassfish.jersey.server.mvc.Template; @@ -86,6 +88,16 @@ public class FruitResource { public void createFruit(@Valid Fruit fruit) { SimpleStorageService.storeFruit(fruit); } + + @POST + @Path("/created") + @Consumes(MediaType.APPLICATION_JSON) + public Response createNewFruit(@Valid Fruit fruit) { + String result = "Fruit saved : " + fruit; + return Response.status(Status.CREATED.getStatusCode()) + .entity(result) + .build(); + } @GET @Valid diff --git a/jersey/src/test/java/com/baeldung/jersey/server/GreetingsResourceIntegrationTest.java b/jersey/src/test/java/com/baeldung/jersey/server/GreetingsResourceIntegrationTest.java new file mode 100644 index 0000000000..c89e2fe23c --- /dev/null +++ b/jersey/src/test/java/com/baeldung/jersey/server/GreetingsResourceIntegrationTest.java @@ -0,0 +1,33 @@ +package com.baeldung.jersey.server; + +import static org.junit.Assert.assertEquals; + +import javax.ws.rs.core.Application; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; + +import org.glassfish.jersey.server.ResourceConfig; +import org.glassfish.jersey.test.JerseyTest; +import org.junit.Test; + +public class GreetingsResourceIntegrationTest extends JerseyTest { + + @Override + protected Application configure() { + return new ResourceConfig(Greetings.class); + } + + @Test + public void givenGetHiGreeting_whenCorrectRequest_thenResponseIsOkAndContainsHi() { + Response response = target("/greetings/hi").request() + .get(); + + assertEquals("Http Response should be 200: ", Status.OK.getStatusCode(), response.getStatus()); + assertEquals("Http Content-Type should be: ", MediaType.TEXT_HTML, response.getHeaderString(HttpHeaders.CONTENT_TYPE)); + + String content = response.readEntity(String.class); + assertEquals("Content of ressponse is: ", "hi", content); + } +} \ No newline at end of file diff --git a/jersey/src/test/java/com/baeldung/jersey/server/rest/FruitResourceIntegrationTest.java b/jersey/src/test/java/com/baeldung/jersey/server/rest/FruitResourceIntegrationTest.java index 2eeb5710cb..376c8c1e75 100644 --- a/jersey/src/test/java/com/baeldung/jersey/server/rest/FruitResourceIntegrationTest.java +++ b/jersey/src/test/java/com/baeldung/jersey/server/rest/FruitResourceIntegrationTest.java @@ -10,6 +10,7 @@ import javax.ws.rs.core.Application; import javax.ws.rs.core.Form; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; import org.glassfish.jersey.test.JerseyTest; import org.glassfish.jersey.test.TestProperties; @@ -63,6 +64,15 @@ public class FruitResourceIntegrationTest extends JerseyTest { assertEquals("Http Response should be 400 ", 400, response.getStatus()); assertThat(response.readEntity(String.class), containsString("Fruit colour must not be null")); } + + @Test + public void givenCreateFruit_whenJsonIsCorrect_thenResponseCodeIsCreated() { + Response response = target("fruit/created").request() + .post(Entity.json("{\"name\":\"strawberry\",\"weight\":20}")); + + assertEquals("Http Response should be 201 ", Status.CREATED.getStatusCode(), response.getStatus()); + assertThat(response.readEntity(String.class), containsString("Fruit saved : Fruit [name: strawberry colour: null]")); + } @Test public void givenUpdateFruit_whenFormContainsBadSerialParam_thenResponseCodeIsBadRequest() { @@ -102,6 +112,23 @@ public class FruitResourceIntegrationTest extends JerseyTest { .get(String.class); assertThat(json, containsString("{\"name\":\"strawberry\",\"weight\":20}")); } + + @Test + public void givenFruitExists_whenSearching_thenResponseContainsFruitEntity() { + Fruit fruit = new Fruit(); + fruit.setName("strawberry"); + fruit.setWeight(20); + Response response = target("fruit/create").request(MediaType.APPLICATION_JSON_TYPE) + .post(Entity.entity(fruit, MediaType.APPLICATION_JSON_TYPE)); + + assertEquals("Http Response should be 204 ", 204, response.getStatus()); + + final Fruit entity = target("fruit/search/strawberry").request() + .get(Fruit.class); + + assertEquals("Fruit name: ", "strawberry", entity.getName()); + assertEquals("Fruit weight: ", Integer.valueOf(20), entity.getWeight()); + } @Test public void givenFruit_whenFruitIsInvalid_thenReponseContainsCustomExceptions() { From 04ed393ba18daa7cd850de10cabd17a935935380 Mon Sep 17 00:00:00 2001 From: Jonathan Paul Cook Date: Sat, 13 Oct 2018 19:42:18 +0200 Subject: [PATCH 003/359] BAEL-2268 - Guide to JerseyTest - Add line break to end of file --- .../jersey/server/GreetingsResourceIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jersey/src/test/java/com/baeldung/jersey/server/GreetingsResourceIntegrationTest.java b/jersey/src/test/java/com/baeldung/jersey/server/GreetingsResourceIntegrationTest.java index c89e2fe23c..8953f4161c 100644 --- a/jersey/src/test/java/com/baeldung/jersey/server/GreetingsResourceIntegrationTest.java +++ b/jersey/src/test/java/com/baeldung/jersey/server/GreetingsResourceIntegrationTest.java @@ -30,4 +30,4 @@ public class GreetingsResourceIntegrationTest extends JerseyTest { String content = response.readEntity(String.class); assertEquals("Content of ressponse is: ", "hi", content); } -} \ No newline at end of file +} From 69c160aab9963e0fdd649719a16003c7e16e865a Mon Sep 17 00:00:00 2001 From: Yatendra Goel Date: Sun, 21 Oct 2018 07:27:01 +0530 Subject: [PATCH 004/359] BAEL-2203 - Convert java.time.Instant to java.sql.Timestamp and vice-versa --- .../datetime/ConvertInstantToTimestamp.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java diff --git a/java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java b/java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java new file mode 100644 index 0000000000..b2f18fd3bf --- /dev/null +++ b/java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java @@ -0,0 +1,36 @@ +package com.baeldung.datetime; + +import java.sql.Timestamp; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.time.ZoneId; +import java.util.TimeZone; + +public class ConvertInstantToTimestamp { + + public static void main(String[] args) { + run(); + } + + public static void run() { + Instant instant = Instant.now(); + Timestamp timestamp = Timestamp.from(instant); // same point on the time-line as Instant + + System.out.println("Instant (milliseconds from epoch)" + instant.toEpochMilli()); + System.out.println("Timestamp (milliseconds from epoch): " + timestamp.getTime()); + System.out.print("\n"); + + // Local TimeZone of the machine at the time of running this code is GMT +5:30 a.k.a IST + ZoneId zoneId = ZoneId.of(ZoneId.SHORT_IDS.get("IST")); + + DateFormat df = DateFormat.getDateTimeInstance(); + df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss:SS'Z'"); + df.setTimeZone(TimeZone.getTimeZone("UTC")); + + System.out.println("Instant (in UTC): " + instant); + System.out.println("Timestamp (in UTC): " + df.format(timestamp)); + System.out.println("Instant (in GMT +05:30): " + instant.atZone(zoneId)); + System.out.println("Timestamp (in GMT +05:30): " + timestamp); + } +} \ No newline at end of file From 8696022889af03d5af7594e79c3927c840025830 Mon Sep 17 00:00:00 2001 From: Kotharu Date: Sun, 21 Oct 2018 18:19:00 +0530 Subject: [PATCH 005/359] BAEL-1724 Akka HTTP Initial Commit --- akka-http/pom.xml | 48 +++++++++ .../com/baeldung/akkahttp/AkkaHttpServer.java | 39 ++++++++ .../main/java/com/baeldung/akkahttp/User.java | 30 ++++++ .../java/com/baeldung/akkahttp/UserActor.java | 60 ++++++++++++ .../akkahttp/UserRegistryMessages.java | 70 +++++++++++++ .../com/baeldung/akkahttp/UserRoutes.java | 98 +++++++++++++++++++ .../java/com/baeldung/akkahttp/Users.java | 25 +++++ pom.xml | 1 + 8 files changed, 371 insertions(+) create mode 100644 akka-http/pom.xml create mode 100644 akka-http/src/main/java/com/baeldung/akkahttp/AkkaHttpServer.java create mode 100644 akka-http/src/main/java/com/baeldung/akkahttp/User.java create mode 100644 akka-http/src/main/java/com/baeldung/akkahttp/UserActor.java create mode 100644 akka-http/src/main/java/com/baeldung/akkahttp/UserRegistryMessages.java create mode 100644 akka-http/src/main/java/com/baeldung/akkahttp/UserRoutes.java create mode 100644 akka-http/src/main/java/com/baeldung/akkahttp/Users.java diff --git a/akka-http/pom.xml b/akka-http/pom.xml new file mode 100644 index 0000000000..05e50d2229 --- /dev/null +++ b/akka-http/pom.xml @@ -0,0 +1,48 @@ + + + + 4.0.0 + akka-http + akka-http + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + + + + com.typesafe.akka + akka-http_2.12 + ${akka.http.version} + + + com.typesafe.akka + akka-stream_2.12 + ${akka.stream.version} + + + com.typesafe.akka + akka-http-jackson_2.12 + ${akka.http.version} + + + com.typesafe.akka + akka-http-testkit_2.12 + ${akka.http.version} + test + + + + + UTF-8 + UTF-8 + 1.8 + 10.0.11 + 2.5.11 + + diff --git a/akka-http/src/main/java/com/baeldung/akkahttp/AkkaHttpServer.java b/akka-http/src/main/java/com/baeldung/akkahttp/AkkaHttpServer.java new file mode 100644 index 0000000000..03992b6a36 --- /dev/null +++ b/akka-http/src/main/java/com/baeldung/akkahttp/AkkaHttpServer.java @@ -0,0 +1,39 @@ +package com.baeldung.akkahttp; + +import java.util.concurrent.CompletionStage; + +import akka.NotUsed; +import akka.actor.ActorRef; +import akka.actor.ActorSystem; +import akka.http.javadsl.ConnectHttp; +import akka.http.javadsl.Http; +import akka.http.javadsl.ServerBinding; +import akka.http.javadsl.model.HttpRequest; +import akka.http.javadsl.model.HttpResponse; +import akka.http.javadsl.server.AllDirectives; +import akka.stream.ActorMaterializer; +import akka.stream.javadsl.Flow; + +public class AkkaHttpServer extends AllDirectives { + + private final UserRoutes userRoutes; + + public AkkaHttpServer(ActorSystem system, ActorRef userRegistryActor) { + userRoutes = new UserRoutes(system, userRegistryActor); + } + + public static void main(String[] args) throws Exception { + ActorSystem system = ActorSystem.create("helloAkkaHttpServer"); + final ActorMaterializer materializer = ActorMaterializer.create(system); + + ActorRef userActorRef = system.actorOf(UserActor.props(), "userActor"); + + AkkaHttpServer app = new AkkaHttpServer(system, userActorRef); + + final Flow routeFlow = app.userRoutes.routes().flow(system, materializer); + + final CompletionStage binding = Http.get(system).bindAndHandle(routeFlow, + ConnectHttp.toHost("localhost", 8080), materializer); + + System.out.println("Server is online at http://localhost:8080/"); + } \ No newline at end of file diff --git a/akka-http/src/main/java/com/baeldung/akkahttp/User.java b/akka-http/src/main/java/com/baeldung/akkahttp/User.java new file mode 100644 index 0000000000..9b5b95ebc1 --- /dev/null +++ b/akka-http/src/main/java/com/baeldung/akkahttp/User.java @@ -0,0 +1,30 @@ +package com.baeldung.akkahttp; + +/** + * User Entity + * + */ +public class User { + + private final String name; + private final String address; + + public User() { + this.name = ""; + this.address = ""; + } + + public User(String name, String address) { + this.name = name; + this.address = address; + } + + public String getName() { + return name; + } + + public String getAddress() { + return address; + } + +} \ No newline at end of file diff --git a/akka-http/src/main/java/com/baeldung/akkahttp/UserActor.java b/akka-http/src/main/java/com/baeldung/akkahttp/UserActor.java new file mode 100644 index 0000000000..f6c7015070 --- /dev/null +++ b/akka-http/src/main/java/com/baeldung/akkahttp/UserActor.java @@ -0,0 +1,60 @@ +package com.baeldung.akkahttp; + +import java.util.ArrayList; +import java.util.List; + +import akka.actor.AbstractActor; +import akka.actor.Props; +import akka.event.Logging; +import akka.event.LoggingAdapter; + +/** + * User Actor + * + */ +public class UserActor extends AbstractActor { + + LoggingAdapter log = Logging.getLogger(getContext().getSystem(), this); + + /** + * In memory List to hold the users added via POST operation. + */ + private final List users = new ArrayList<>(); + + /** + * To define UserActor Props. + * + * @return Props + */ + static Props props() { + return Props.create(UserActor.class); + } + + /** + * createReveive() implementation + */ + @Override + public Receive createReceive() { + return receiveBuilder().match(UserRegistryMessages.GetUsers.class, getUsers -> getSender().tell(new Users(users), getSelf())) + .match(UserRegistryMessages.CreateUser.class, createUser -> { + users.add(createUser.getUser()); + getSender().tell(new UserRegistryMessages.ActionPerformed(String.format("User %s created.", createUser.getUser() + .getName())), getSelf()); + }) + .match(UserRegistryMessages.GetUser.class, getUser -> { + getSender().tell(users.stream() + .filter(user -> user.getName() + .equals(getUser.getName())) + .findFirst(), getSelf()); + }) + .match(UserRegistryMessages.DeleteUser.class, deleteUser -> { + users.removeIf(user -> user.getName() + .equals(deleteUser.getName())); + getSender().tell(new UserRegistryMessages.ActionPerformed(String.format("User %s deleted.", deleteUser.getName())), getSelf()); + + }) + .matchAny(o -> log.info("received unknown message")) + .build(); + } + +} diff --git a/akka-http/src/main/java/com/baeldung/akkahttp/UserRegistryMessages.java b/akka-http/src/main/java/com/baeldung/akkahttp/UserRegistryMessages.java new file mode 100644 index 0000000000..831819849a --- /dev/null +++ b/akka-http/src/main/java/com/baeldung/akkahttp/UserRegistryMessages.java @@ -0,0 +1,70 @@ +package com.baeldung.akkahttp; + +/** + * Defines all messages related to User Actor + * + */ +public interface UserRegistryMessages { + + class GetUsers implements Serializable { + + private static final long serialVersionUID = 1L; + } + + class ActionPerformed implements Serializable { + + private static final long serialVersionUID = 1L; + + private final String description; + + public ActionPerformed(String description) { + this.description = description; + } + + public String getDescription() { + return description; + } + } + + class CreateUser implements Serializable { + + private static final long serialVersionUID = 1L; + private final User user; + + public CreateUser(User user) { + this.user = user; + } + + public User getUser() { + return user; + } + } + + class GetUser implements Serializable { + + private static final long serialVersionUID = 1L; + private final String name; + + public GetUser(String name) { + this.name = name; + } + + public String getName() { + return name; + } + } + + class DeleteUser implements Serializable { + + private static final long serialVersionUID = 1L; + private final String name; + + public DeleteUser(String name) { + this.name = name; + } + + public String getName() { + return name; + } + } +} diff --git a/akka-http/src/main/java/com/baeldung/akkahttp/UserRoutes.java b/akka-http/src/main/java/com/baeldung/akkahttp/UserRoutes.java new file mode 100644 index 0000000000..aa3c9b612f --- /dev/null +++ b/akka-http/src/main/java/com/baeldung/akkahttp/UserRoutes.java @@ -0,0 +1,98 @@ +package com.baeldung.akkahttp; + +import java.time.Duration; +import java.util.Optional; +import java.util.concurrent.CompletionStage; +import java.util.concurrent.TimeUnit; + +import akka.actor.ActorRef; +import akka.actor.ActorSystem; +import akka.event.Logging; +import akka.event.LoggingAdapter; +import akka.http.javadsl.marshallers.jackson.Jackson; +import akka.http.javadsl.model.StatusCodes; +import akka.http.javadsl.server.AllDirectives; +import akka.http.javadsl.server.PathMatchers; +import akka.http.javadsl.server.Route; +import akka.pattern.PatternsCS; +import akka.util.Timeout; + +public class UserRoutes extends AllDirectives { + + private final ActorRef userActorRef; + private final LoggingAdapter log; + Timeout timeout = new Timeout(Duration.create(5, TimeUnit.SECONDS)); + + public UserRoutes(ActorSystem system, ActorRef userActorRef) { + this.userActorRef = userActorRef; + log = Logging.getLogger(system, this); + } + + public Route routes() { + return pathPrefix("users", () -> route(getOrPostUsers(), path(PathMatchers.segment(), name -> route(getUser(name), deleteUser(name))))); + } + + /** + * Defines and returns a route to get the user by name + * + * @param name + * @return Route + */ + private Route getUser(String name) { + + Route getRoute = get(() -> { + CompletionStage> user = PatternsCS.ask(userActorRef, new UserRegistryMessages.GetUser(name), timeout) + .thenApply(obj -> (Optional) obj); + + return onSuccess(() -> user, performed -> { + if (performed.isPresent()) + return complete(StatusCodes.OK, performed.get(), Jackson.marshaller()); + else + return complete(StatusCodes.NOT_FOUND); + }); + }); + return getRoute; + } + + /** + * Defines and returns a Route to delete the user by name. + * + * @param name + * @return Route + */ + private Route deleteUser(String name) { + + Route deleteRoute = delete(() -> { + CompletionStage userDeleted = PatternsCS.ask(userActorRef, new UserRegistryMessages.DeleteUser(name), timeout) + .thenApply(obj -> (ActionPerformed) obj); + + return onSuccess(() -> userDeleted, performed -> { + log.info("Deleted user [{}]: {}", name, performed.getDescription()); + return complete(StatusCodes.OK, performed, Jackson.marshaller()); + }); + }); + + return deleteRoute; + } + + /** + * Defines two routes, one to get all users and the other is to post users. + * + * @return + */ + private Route getOrPostUsers() { + return pathEnd(() -> route(get(() -> { + CompletionStage futureUsers = PatternsCS.ask(userActorRef, new UserRegistryMessages.GetUsers(), timeout) + .thenApply(obj -> (Users) obj); + return onSuccess(() -> futureUsers, users -> complete(StatusCodes.OK, users, Jackson.marshaller())); + }), post(() -> entity(Jackson.unmarshaller(User.class), user -> { + CompletionStage userCreated = PatternsCS.ask(userActorRef, new CreateUser(user), timeout) + .thenApply(obj -> (ActionPerformed) obj); + return onSuccess(() -> userCreated, performed -> { + log.info("Created user [{}]: {}", user.getName(), performed.getDescription()); + return complete(StatusCodes.CREATED, performed, Jackson.marshaller()); + }); + })))); + } + +} diff --git a/akka-http/src/main/java/com/baeldung/akkahttp/Users.java b/akka-http/src/main/java/com/baeldung/akkahttp/Users.java new file mode 100644 index 0000000000..e5e6c62c06 --- /dev/null +++ b/akka-http/src/main/java/com/baeldung/akkahttp/Users.java @@ -0,0 +1,25 @@ +package com.baeldung.akkahttp; + +import java.util.ArrayList; +import java.util.List; + +/** + * This class is used to send the response enclosed by Users. + * + */ +public class Users { + + private final List users; + + public Users() { + this.users = new ArrayList<>(); + } + + public Users(List users) { + this.users = users; + } + + public List getUsers() { + return users; + } +} diff --git a/pom.xml b/pom.xml index 302530fd24..d0d0fa7049 100644 --- a/pom.xml +++ b/pom.xml @@ -1254,6 +1254,7 @@ aws aws-lambda akka-streams + akka-http algorithms annotations apache-cxf From 632e46c2a0bcde213e278f738879639752d01f9a Mon Sep 17 00:00:00 2001 From: Kotharu Date: Sun, 21 Oct 2018 18:40:44 +0530 Subject: [PATCH 006/359] Initial Commit --- .../com/baeldung/akkahttp/AkkaHttpServer.java | 20 ++++++++++--------- .../akkahttp/UserRegistryMessages.java | 2 ++ .../com/baeldung/akkahttp/UserRoutes.java | 5 ++++- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/akka-http/src/main/java/com/baeldung/akkahttp/AkkaHttpServer.java b/akka-http/src/main/java/com/baeldung/akkahttp/AkkaHttpServer.java index 03992b6a36..d4c859891a 100644 --- a/akka-http/src/main/java/com/baeldung/akkahttp/AkkaHttpServer.java +++ b/akka-http/src/main/java/com/baeldung/akkahttp/AkkaHttpServer.java @@ -23,17 +23,19 @@ public class AkkaHttpServer extends AllDirectives { } public static void main(String[] args) throws Exception { - ActorSystem system = ActorSystem.create("helloAkkaHttpServer"); - final ActorMaterializer materializer = ActorMaterializer.create(system); + ActorSystem system = ActorSystem.create("helloAkkaHttpServer"); + final ActorMaterializer materializer = ActorMaterializer.create(system); - ActorRef userActorRef = system.actorOf(UserActor.props(), "userActor"); + ActorRef userActorRef = system.actorOf(UserActor.props(), "userActor"); - AkkaHttpServer app = new AkkaHttpServer(system, userActorRef); + AkkaHttpServer app = new AkkaHttpServer(system, userActorRef); - final Flow routeFlow = app.userRoutes.routes().flow(system, materializer); + final Flow routeFlow = app.userRoutes.routes() + .flow(system, materializer); - final CompletionStage binding = Http.get(system).bindAndHandle(routeFlow, - ConnectHttp.toHost("localhost", 8080), materializer); + final CompletionStage binding = Http.get(system) + .bindAndHandle(routeFlow, ConnectHttp.toHost("localhost", 8080), materializer); - System.out.println("Server is online at http://localhost:8080/"); - } \ No newline at end of file + System.out.println("Server is online at http://localhost:8080/"); + } +} \ No newline at end of file diff --git a/akka-http/src/main/java/com/baeldung/akkahttp/UserRegistryMessages.java b/akka-http/src/main/java/com/baeldung/akkahttp/UserRegistryMessages.java index 831819849a..1f88e5f646 100644 --- a/akka-http/src/main/java/com/baeldung/akkahttp/UserRegistryMessages.java +++ b/akka-http/src/main/java/com/baeldung/akkahttp/UserRegistryMessages.java @@ -1,5 +1,7 @@ package com.baeldung.akkahttp; +import java.io.Serializable; + /** * Defines all messages related to User Actor * diff --git a/akka-http/src/main/java/com/baeldung/akkahttp/UserRoutes.java b/akka-http/src/main/java/com/baeldung/akkahttp/UserRoutes.java index aa3c9b612f..aeddf9224d 100644 --- a/akka-http/src/main/java/com/baeldung/akkahttp/UserRoutes.java +++ b/akka-http/src/main/java/com/baeldung/akkahttp/UserRoutes.java @@ -1,10 +1,12 @@ package com.baeldung.akkahttp; -import java.time.Duration; import java.util.Optional; import java.util.concurrent.CompletionStage; import java.util.concurrent.TimeUnit; +import com.baeldung.akkahttp.UserRegistryMessages.ActionPerformed; +import com.baeldung.akkahttp.UserRegistryMessages.CreateUser; + import akka.actor.ActorRef; import akka.actor.ActorSystem; import akka.event.Logging; @@ -16,6 +18,7 @@ import akka.http.javadsl.server.PathMatchers; import akka.http.javadsl.server.Route; import akka.pattern.PatternsCS; import akka.util.Timeout; +import scala.concurrent.duration.Duration; public class UserRoutes extends AllDirectives { From 91cc2514b2a1cdf12c9d6747d3dfa16c192d332f Mon Sep 17 00:00:00 2001 From: Kotharu Date: Sun, 21 Oct 2018 19:32:08 +0530 Subject: [PATCH 007/359] Added Route Test --- .../com/baeldung/akkahttp/UserRoutesTest.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 akka-http/src/test/java/com/baeldung/akkahttp/UserRoutesTest.java diff --git a/akka-http/src/test/java/com/baeldung/akkahttp/UserRoutesTest.java b/akka-http/src/test/java/com/baeldung/akkahttp/UserRoutesTest.java new file mode 100644 index 0000000000..db749c4f0b --- /dev/null +++ b/akka-http/src/test/java/com/baeldung/akkahttp/UserRoutesTest.java @@ -0,0 +1,48 @@ +package com.baeldung.akkahttp; + +import org.junit.Test; + +import akka.actor.ActorRef; +import akka.actor.ActorSystem; +import akka.http.javadsl.model.ContentType; +import akka.http.javadsl.model.ContentType.NonBinary; +import akka.http.javadsl.model.HttpHeader; +import akka.http.javadsl.model.HttpRequest; +import akka.http.javadsl.model.MediaType; +import akka.http.javadsl.model.MediaTypes; +import akka.http.javadsl.model.StatusCodes; +import akka.http.javadsl.model.headers.RawHeader; +import akka.http.javadsl.testkit.JUnitRouteTest; +import akka.http.javadsl.testkit.TestRoute; + +public class UserRoutesTest extends JUnitRouteTest { + + ActorSystem system = ActorSystem.create("helloAkkaHttpServer"); + ActorRef userActorRef = system.actorOf(UserActor.props(), "userActor"); + + TestRoute appRoute = testRoute(new UserRoutes(system, userActorRef).routes()); + + @Test + public void givenUser_WhenGetOrPostUsers_ThenUserRetrieved() { + + appRoute.run(HttpRequest.GET("/users")) + .assertStatusCode(200) + .assertContentType("application/json") + .assertEntity("{\"users\":[]}"); + + appRoute.run(HttpRequest.GET("/usersw")) + .assertStatusCode(404); + + appRoute.run(HttpRequest.POST("/users")) + .assertStatusCode(400); + + final RawHeader contentTypeHeader = RawHeader.create("Content-Type", "application/json"); + final RawHeader acceptHeader = RawHeader.create("", "application/json"); + + appRoute.run(HttpRequest.POST("/users") + .addHeader(contentTypeHeader) + .addHeader(acceptHeader)) + .assertStatusCode(400); + + } +} From 3b17051337aee90d0f85885263af4840666ab37f Mon Sep 17 00:00:00 2001 From: Yatendra Goel Date: Wed, 24 Oct 2018 17:55:34 +0530 Subject: [PATCH 008/359] BAEL-2203: Review edits --- .../java/com/baeldung/datetime/ConvertInstantToTimestamp.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java b/java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java index b2f18fd3bf..e8ce4adaa1 100644 --- a/java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java +++ b/java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java @@ -16,8 +16,9 @@ public class ConvertInstantToTimestamp { public static void run() { Instant instant = Instant.now(); Timestamp timestamp = Timestamp.from(instant); // same point on the time-line as Instant + instant = timestamp.toInstant(); - System.out.println("Instant (milliseconds from epoch)" + instant.toEpochMilli()); + System.out.println("Instant (milliseconds from epoch): " + instant.toEpochMilli()); System.out.println("Timestamp (milliseconds from epoch): " + timestamp.getTime()); System.out.print("\n"); From 1da262956246d688a5d996760cac5ad2f9cc42ef Mon Sep 17 00:00:00 2001 From: Jonathan Paul Cook Date: Mon, 29 Oct 2018 19:51:15 +0100 Subject: [PATCH 009/359] BAEL-2193 - Merge 2 java.util.Properties objects --- .../properties/MergePropertiesUnitTest.java | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 core-java/src/test/java/com/baeldung/properties/MergePropertiesUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/properties/MergePropertiesUnitTest.java b/core-java/src/test/java/com/baeldung/properties/MergePropertiesUnitTest.java new file mode 100644 index 0000000000..2318104b8d --- /dev/null +++ b/core-java/src/test/java/com/baeldung/properties/MergePropertiesUnitTest.java @@ -0,0 +1,84 @@ +package com.baeldung.properties; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; + +import java.util.Map; +import java.util.Properties; +import java.util.Set; +import java.util.stream.Stream; + +import org.junit.Test; + +public class MergePropertiesUnitTest { + + @Test + public void givenTwoProperties_whenMergedUsingIteration_thenAllPropertiesInResult() throws Exception { + Properties globalProperties = mergePropertiesByIteratingKeySet(propertiesA(), propertiesB()); + + testMergedProperties(globalProperties); + } + + @Test + public void givenTwoProperties_whenMergedUsingPutAll_thenAllPropertiesInResult() throws Exception { + Properties globalProperties = mergePropertiesByUsingPutAll(propertiesA(), propertiesB()); + + testMergedProperties(globalProperties); + } + + @Test + public void givenTwoProperties_whenMergedUsingStreamAPI_thenAllPropertiesInResult() throws Exception { + Properties globalProperties = mergePropertiesByUsingStreamApi(propertiesB(), propertiesA()); + + testMergedProperties(globalProperties); + } + + private Properties mergePropertiesByIteratingKeySet(Properties... properties) { + Properties mergedProperties = new Properties(); + for (Properties property : properties) { + Set propertyNames = property.stringPropertyNames(); + for (String name : propertyNames) { + String propertyValue = property.getProperty(name); + mergedProperties.setProperty(name, propertyValue); + } + } + return mergedProperties; + } + + private Properties mergePropertiesByUsingPutAll(Properties... properties) { + Properties mergedProperties = new Properties(); + for (Properties property : properties) { + mergedProperties.putAll(property); + } + return mergedProperties; + } + + private Properties mergePropertiesByUsingStreamApi(Properties... properties) { + return Stream.of(properties) + .collect(Properties::new, Map::putAll, Map::putAll); + } + + private Properties propertiesA() { + Properties properties = new Properties(); + properties.setProperty("application.name", "my-app"); + properties.setProperty("application.version", "1.0"); + return properties; + } + + private Properties propertiesB() { + Properties properties = new Properties(); + properties.setProperty("property-1", "sample property"); + properties.setProperty("property-2", "another sample property"); + return properties; + } + + private void testMergedProperties(Properties globalProperties) { + assertThat("There should be 4 properties", globalProperties.size(), equalTo(4)); + assertEquals("Property should be", globalProperties.getProperty("application.name"), "my-app"); + assertEquals("Property should be", globalProperties.getProperty("application.version"), "1.0"); + assertEquals("Property should be", globalProperties.getProperty("property-1"), "sample property"); + assertEquals("Property should be", globalProperties.getProperty("property-2"), "another sample property"); + } + +} From 5930d0d363c144e7a74c9fe09580b7e4d69a09ea Mon Sep 17 00:00:00 2001 From: Jonathan Paul Cook Date: Tue, 30 Oct 2018 08:39:11 +0100 Subject: [PATCH 010/359] BAEL-2193 - Merge 2 java.util.Properties object --- .../com/baeldung/properties/MergePropertiesUnitTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/properties/MergePropertiesUnitTest.java b/core-java/src/test/java/com/baeldung/properties/MergePropertiesUnitTest.java index 2318104b8d..8720aff36b 100644 --- a/core-java/src/test/java/com/baeldung/properties/MergePropertiesUnitTest.java +++ b/core-java/src/test/java/com/baeldung/properties/MergePropertiesUnitTest.java @@ -14,21 +14,21 @@ import org.junit.Test; public class MergePropertiesUnitTest { @Test - public void givenTwoProperties_whenMergedUsingIteration_thenAllPropertiesInResult() throws Exception { + public void givenTwoProperties_whenMergedUsingIteration_thenAllPropertiesInResult() { Properties globalProperties = mergePropertiesByIteratingKeySet(propertiesA(), propertiesB()); testMergedProperties(globalProperties); } @Test - public void givenTwoProperties_whenMergedUsingPutAll_thenAllPropertiesInResult() throws Exception { + public void givenTwoProperties_whenMergedUsingPutAll_thenAllPropertiesInResult() { Properties globalProperties = mergePropertiesByUsingPutAll(propertiesA(), propertiesB()); testMergedProperties(globalProperties); } @Test - public void givenTwoProperties_whenMergedUsingStreamAPI_thenAllPropertiesInResult() throws Exception { + public void givenTwoProperties_whenMergedUsingStreamAPI_thenAllPropertiesInResult() { Properties globalProperties = mergePropertiesByUsingStreamApi(propertiesB(), propertiesA()); testMergedProperties(globalProperties); From 7064a7e30960c51b7ed2b8aebee6465d6d4c3cb2 Mon Sep 17 00:00:00 2001 From: Yatendra Goel Date: Sat, 3 Nov 2018 01:01:07 +0530 Subject: [PATCH 011/359] Removed ZoneId code --- .../datetime/ConvertInstantToTimestamp.java | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java b/java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java index e8ce4adaa1..53618b3c31 100644 --- a/java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java +++ b/java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java @@ -1,5 +1,7 @@ package com.baeldung.datetime; +import static org.junit.Assert.assertEquals; + import java.sql.Timestamp; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -16,22 +18,15 @@ public class ConvertInstantToTimestamp { public static void run() { Instant instant = Instant.now(); Timestamp timestamp = Timestamp.from(instant); // same point on the time-line as Instant + assertEquals(instant.toEpochMilli(), timestamp.getTime()); + instant = timestamp.toInstant(); - - System.out.println("Instant (milliseconds from epoch): " + instant.toEpochMilli()); - System.out.println("Timestamp (milliseconds from epoch): " + timestamp.getTime()); - System.out.print("\n"); - - // Local TimeZone of the machine at the time of running this code is GMT +5:30 a.k.a IST - ZoneId zoneId = ZoneId.of(ZoneId.SHORT_IDS.get("IST")); + assertEquals(instant.toEpochMilli(), timestamp.getTime()); DateFormat df = DateFormat.getDateTimeInstance(); - df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss:SS'Z'"); + df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SS'Z'"); df.setTimeZone(TimeZone.getTimeZone("UTC")); - System.out.println("Instant (in UTC): " + instant); - System.out.println("Timestamp (in UTC): " + df.format(timestamp)); - System.out.println("Instant (in GMT +05:30): " + instant.atZone(zoneId)); - System.out.println("Timestamp (in GMT +05:30): " + timestamp); + assertEquals(instant.toString(), df.format(timestamp).toString()); } -} \ No newline at end of file +} From 5e1fc54ec2cfc589988af9f2b8cd4a3bf1ac7290 Mon Sep 17 00:00:00 2001 From: Yatendra Goel Date: Sat, 3 Nov 2018 15:59:05 +0530 Subject: [PATCH 012/359] Converted class to JUnit Test --- .../ConvertInstantToTimestampTest.java} | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) rename java-dates/src/{main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java => test/java/com/baeldung/datetime/ConvertInstantToTimestampTest.java} (55%) diff --git a/java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java b/java-dates/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampTest.java similarity index 55% rename from java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java rename to java-dates/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampTest.java index 53618b3c31..bfbd911e95 100644 --- a/java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java +++ b/java-dates/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampTest.java @@ -1,6 +1,6 @@ package com.baeldung.datetime; -import static org.junit.Assert.assertEquals; +import static org.assertj.core.api.Assertions.assertThat; import java.sql.Timestamp; import java.text.DateFormat; @@ -9,24 +9,22 @@ import java.time.Instant; import java.time.ZoneId; import java.util.TimeZone; -public class ConvertInstantToTimestamp { +import org.junit.Test; - public static void main(String[] args) { - run(); - } +public class ConvertInstantToTimestampTest { - public static void run() { + @Test + public void givenInstant_whenConvertedToTimestamp_thenGetTimestampWithSamePointOnTimeline() { Instant instant = Instant.now(); Timestamp timestamp = Timestamp.from(instant); // same point on the time-line as Instant - assertEquals(instant.toEpochMilli(), timestamp.getTime()); + assertThat(instant.toEpochMilli()).isEqualTo(timestamp.getTime()); instant = timestamp.toInstant(); - assertEquals(instant.toEpochMilli(), timestamp.getTime()); + assertThat(instant.toEpochMilli()).isEqualTo(timestamp.getTime()); DateFormat df = DateFormat.getDateTimeInstance(); df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SS'Z'"); df.setTimeZone(TimeZone.getTimeZone("UTC")); - - assertEquals(instant.toString(), df.format(timestamp).toString()); + assertThat(instant.toString()).isEqualTo(df.format(timestamp).toString()); } } From ce76dcde0d3594abb32b8b369d57baefaad786d1 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sat, 3 Nov 2018 20:41:53 +0200 Subject: [PATCH 013/359] Update and rename ConvertInstantToTimestampTest.java to ConvertInstantToTimestampUnitTest.java --- ...imestampTest.java => ConvertInstantToTimestampUnitTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename java-dates/src/test/java/com/baeldung/datetime/{ConvertInstantToTimestampTest.java => ConvertInstantToTimestampUnitTest.java} (95%) diff --git a/java-dates/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampTest.java b/java-dates/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampUnitTest.java similarity index 95% rename from java-dates/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampTest.java rename to java-dates/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampUnitTest.java index bfbd911e95..3ba01a591a 100644 --- a/java-dates/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampTest.java +++ b/java-dates/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampUnitTest.java @@ -11,7 +11,7 @@ import java.util.TimeZone; import org.junit.Test; -public class ConvertInstantToTimestampTest { +public class ConvertInstantToTimestampUnitTest { @Test public void givenInstant_whenConvertedToTimestamp_thenGetTimestampWithSamePointOnTimeline() { From 770b28f2418e9e875252f7a30213803faa1a9e08 Mon Sep 17 00:00:00 2001 From: Holger Ludvigsen Date: Mon, 5 Nov 2018 15:39:11 +0100 Subject: [PATCH 014/359] FileOutputStream is never closed The output file stream is not closed, so it is still in use by the Java process after the code runs. I noticed this when trying to delete the output files right afterwards. --- .../src/main/java/com/baeldung/download/FileDownload.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-io/src/main/java/com/baeldung/download/FileDownload.java b/core-java-io/src/main/java/com/baeldung/download/FileDownload.java index c7dd154023..a099406d4c 100644 --- a/core-java-io/src/main/java/com/baeldung/download/FileDownload.java +++ b/core-java-io/src/main/java/com/baeldung/download/FileDownload.java @@ -45,6 +45,7 @@ public class FileDownload { FileOutputStream fileOutputStream = new FileOutputStream(localFilename); FileChannel fileChannel = fileOutputStream.getChannel()) { fileChannel.transferFrom(readableByteChannel, 0, Long.MAX_VALUE); + fileOutputStream.close(); } } From be17633174947ac55865dcc357bf615a7448470c Mon Sep 17 00:00:00 2001 From: chandra Date: Fri, 9 Nov 2018 21:08:02 -0500 Subject: [PATCH 015/359] BAEL-2313 Convert String to Byte Array and Reverse in Java --- .../conversion/ByteArrayToStringUnitTest.java | 91 ++++++++++++++ .../conversion/StringToByteArrayUnitTest.java | 119 ++++++++++++++++++ 2 files changed, 210 insertions(+) create mode 100644 java-strings/src/test/java/com/baeldung/string/conversion/ByteArrayToStringUnitTest.java create mode 100644 java-strings/src/test/java/com/baeldung/string/conversion/StringToByteArrayUnitTest.java diff --git a/java-strings/src/test/java/com/baeldung/string/conversion/ByteArrayToStringUnitTest.java b/java-strings/src/test/java/com/baeldung/string/conversion/ByteArrayToStringUnitTest.java new file mode 100644 index 0000000000..cb18d04cc3 --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/conversion/ByteArrayToStringUnitTest.java @@ -0,0 +1,91 @@ +package com.baeldung.string.conversion; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import java.io.UnsupportedEncodingException; +import java.nio.ByteBuffer; +import java.nio.charset.CharacterCodingException; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.CodingErrorAction; +import java.nio.charset.StandardCharsets; + +import org.junit.Test; + +public class ByteArrayToStringUnitTest { + + @Test + public void whenStringConstructorWithDefaultCharset_thenOK() { + final byte[] byteArrray = { 72, 101, 108, 108, 111, 32, 87, 111, 114, + 108, 100, 33 }; + String string = new String(byteArrray); + System.out.println(string); + + assertNotNull(string); + } + + @Test + public void whenStringConstructorWithNamedCharset_thenOK() + throws UnsupportedEncodingException { + final String charsetName = "IBM01140"; + final byte[] byteArrray = { -56, -123, -109, -109, -106, 64, -26, -106, + -103, -109, -124, 90 }; + + String string = new String(byteArrray, charsetName); + + assertEquals("Hello World!", string); + } + + @Test + public void whenStringConstructorWithCharSet_thenOK() { + final Charset charset = Charset.forName("UTF-8"); + final byte[] byteArrray = { 72, 101, 108, 108, 111, 32, 87, 111, 114, + 108, 100, 33 }; + + String string = new String(byteArrray, charset); + + assertEquals("Hello World!", string); + } + + @Test + public void whenStringConstructorWithStandardCharSet_thenOK() { + final Charset charset = StandardCharsets.UTF_16; + + final byte[] byteArrray = { -2, -1, 0, 72, 0, 101, 0, 108, 0, 108, 0, + 111, 0, 32, 0, 87, 0, 111, 0, 114, 0, 108, 0, 100, 0, 33 }; + + String string = new String(byteArrray, charset); + + assertEquals("Hello World!", string); + } + + @Test + public void whenDecodeWithCharset_thenOK() { + byte[] byteArrray = { 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, + 100, 33 }; + final Charset charset = StandardCharsets.UTF_8; + + String string = charset.decode(ByteBuffer.wrap(byteArrray)).toString(); + System.out.println(string); + + assertEquals("Hello World!", string); + } + + @Test + public void whenUsingCharsetDecoder_thenOK() + throws CharacterCodingException { + byte[] byteArrray = { 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, + 100, 33 }; + CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder(); + + decoder.onMalformedInput(CodingErrorAction.IGNORE) + .onUnmappableCharacter(CodingErrorAction.REPLACE) + .replaceWith("?"); + + String string = decoder.decode(ByteBuffer.wrap(byteArrray)).toString(); + + assertEquals("Hello World!", string); + } + +} diff --git a/java-strings/src/test/java/com/baeldung/string/conversion/StringToByteArrayUnitTest.java b/java-strings/src/test/java/com/baeldung/string/conversion/StringToByteArrayUnitTest.java new file mode 100644 index 0000000000..6086e2f60b --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/conversion/StringToByteArrayUnitTest.java @@ -0,0 +1,119 @@ +package com.baeldung.string.conversion; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import java.io.UnsupportedEncodingException; +import java.nio.CharBuffer; +import java.nio.charset.CharacterCodingException; +import java.nio.charset.Charset; +import java.nio.charset.CharsetEncoder; +import java.nio.charset.CodingErrorAction; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; + +import org.junit.Test; + +public class StringToByteArrayUnitTest { + + @Test + public void whenGetBytesWithDefaultCharset_thenOK() { + final String inputString = "Hello World!"; + final String defaultCharSet = Charset.defaultCharset().displayName(); + + byte[] byteArrray = inputString.getBytes(); + + System.out.printf( + "Using default charset:%s, Input String:%s, Output byte array:%s\n", + defaultCharSet, inputString, Arrays.toString(byteArrray)); + + assertNotNull(byteArrray); + assert (byteArrray.length >= inputString.length()); + } + + @Test + public void whenGetBytesWithNamedCharset_thenOK() + throws UnsupportedEncodingException { + final String inputString = "Hello World!"; + final String charsetName = "IBM01140"; + + byte[] byteArrray = inputString.getBytes("IBM01140"); + + System.out.printf( + "Using named charset:%s, Input String:%s, Output byte array:%s\n", + charsetName, inputString, Arrays.toString(byteArrray)); + + assertArrayEquals(new byte[] { -56, -123, -109, -109, -106, 64, -26, + -106, -103, -109, -124, 90 }, + byteArrray); + } + + @Test + public void whenGetBytesWithCharset_thenOK() { + final String inputString = "Hello World!"; + final Charset charset = Charset.forName("UTF-8"); + + byte[] byteArrray = inputString.getBytes(charset); + + System.out.printf( + "Using Charset:%s, Input String:%s, Output byte array:%s\n", + charset, inputString, Arrays.toString(byteArrray)); + + assertArrayEquals(new byte[] { 72, 101, 108, 108, 111, 32, 87, 111, 114, + 108, 100, 33 }, + byteArrray); + } + + @Test + public void whenGetBytesWithStandardCharset_thenOK() { + final String inputString = "Hello World!"; + final Charset charset = StandardCharsets.UTF_16; + + byte[] byteArrray = inputString.getBytes(charset); + + System.out.printf( + "Using Standard Charset:%s, Input String:%s, Output byte array:%s\n", + charset, inputString, Arrays.toString(byteArrray)); + + assertArrayEquals(new byte[] { -2, -1, 0, 72, 0, 101, 0, 108, 0, 108, 0, + 111, 0, 32, 0, 87, 0, 111, 0, 114, 0, 108, 0, 100, 0, 33 }, + byteArrray); + } + + @Test + public void whenEncodeWithCharset_thenOK() { + final String inputString = "Hello World!"; + final Charset charset = StandardCharsets.UTF_8; + + byte[] byteArrray = charset.encode(inputString).array(); + + System.out.printf( + "Using encode with Charset:%s, Input String:%s, Output byte array:%s\n", + charset, inputString, Arrays.toString(byteArrray)); + + assertArrayEquals(new byte[] { 72, 101, 108, 108, 111, 32, 87, 111, 114, + 108, 100, 33, 0 }, + byteArrray); + } + + @Test + public void whenUsingCharsetEncoder_thenOK() + throws CharacterCodingException { + final String inputString = "Hello World!"; + CharsetEncoder encoder = Charset.forName("UTF-8").newEncoder(); + encoder.onMalformedInput(CodingErrorAction.IGNORE) + .onUnmappableCharacter(CodingErrorAction.REPLACE) + .replaceWith(new byte[] { 0 }); + + byte[] byteArrray = encoder.encode(CharBuffer.wrap(inputString)).array(); + + System.out.printf( + "Using encode with CharsetEncoder:%s, Input String:%s, Output byte array:%s\n", + encoder, inputString, Arrays.toString(byteArrray)); + + assertArrayEquals(new byte[] { 72, 101, 108, 108, 111, 32, 87, 111, 114, + 108, 100, 33, 0 }, + byteArrray); + } + +} From 243323c55f2b879b37bab9817cb9f08f9e63958e Mon Sep 17 00:00:00 2001 From: chandra Date: Mon, 12 Nov 2018 21:36:21 -0500 Subject: [PATCH 016/359] Modified sample inputs to make the tests more meaningful. --- .../conversion/ByteArrayToStringUnitTest.java | 17 +++++----- .../conversion/StringToByteArrayUnitTest.java | 33 ++++++++++--------- 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/java-strings/src/test/java/com/baeldung/string/conversion/ByteArrayToStringUnitTest.java b/java-strings/src/test/java/com/baeldung/string/conversion/ByteArrayToStringUnitTest.java index cb18d04cc3..a9f8a04c8d 100644 --- a/java-strings/src/test/java/com/baeldung/string/conversion/ByteArrayToStringUnitTest.java +++ b/java-strings/src/test/java/com/baeldung/string/conversion/ByteArrayToStringUnitTest.java @@ -62,30 +62,29 @@ public class ByteArrayToStringUnitTest { @Test public void whenDecodeWithCharset_thenOK() { - byte[] byteArrray = { 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, - 100, 33 }; - final Charset charset = StandardCharsets.UTF_8; + byte[] byteArrray = { 72, 101, 108, 108, 111, 32, -10, 111, 114, 108, -63, 33 }; + final Charset charset = StandardCharsets.US_ASCII; String string = charset.decode(ByteBuffer.wrap(byteArrray)).toString(); System.out.println(string); - assertEquals("Hello World!", string); + assertEquals("Hello �orl�!", string); } @Test public void whenUsingCharsetDecoder_thenOK() throws CharacterCodingException { - byte[] byteArrray = { 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, - 100, 33 }; - CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder(); + byte[] byteArrray = { 72, 101, 108, 108, 111, 32, -10, 111, 114, 108, -63, 33}; + CharsetDecoder decoder = StandardCharsets.US_ASCII.newDecoder(); - decoder.onMalformedInput(CodingErrorAction.IGNORE) + decoder.onMalformedInput(CodingErrorAction.REPLACE) .onUnmappableCharacter(CodingErrorAction.REPLACE) .replaceWith("?"); String string = decoder.decode(ByteBuffer.wrap(byteArrray)).toString(); - assertEquals("Hello World!", string); + assertEquals("Hello ?orl?!", string); } + } diff --git a/java-strings/src/test/java/com/baeldung/string/conversion/StringToByteArrayUnitTest.java b/java-strings/src/test/java/com/baeldung/string/conversion/StringToByteArrayUnitTest.java index 6086e2f60b..5377b4b28d 100644 --- a/java-strings/src/test/java/com/baeldung/string/conversion/StringToByteArrayUnitTest.java +++ b/java-strings/src/test/java/com/baeldung/string/conversion/StringToByteArrayUnitTest.java @@ -19,7 +19,8 @@ public class StringToByteArrayUnitTest { @Test public void whenGetBytesWithDefaultCharset_thenOK() { final String inputString = "Hello World!"; - final String defaultCharSet = Charset.defaultCharset().displayName(); + final String defaultCharSet = Charset.defaultCharset() + .displayName(); byte[] byteArrray = inputString.getBytes(); @@ -50,8 +51,8 @@ public class StringToByteArrayUnitTest { @Test public void whenGetBytesWithCharset_thenOK() { - final String inputString = "Hello World!"; - final Charset charset = Charset.forName("UTF-8"); + final String inputString = "Hello ਸੰਸਾਰ!"; + final Charset charset = Charset.forName("ASCII"); byte[] byteArrray = inputString.getBytes(charset); @@ -59,8 +60,8 @@ public class StringToByteArrayUnitTest { "Using Charset:%s, Input String:%s, Output byte array:%s\n", charset, inputString, Arrays.toString(byteArrray)); - assertArrayEquals(new byte[] { 72, 101, 108, 108, 111, 32, 87, 111, 114, - 108, 100, 33 }, + assertArrayEquals( + new byte[] { 72, 101, 108, 108, 111, 32, 63, 63, 63, 63, 63, 33 }, byteArrray); } @@ -82,37 +83,39 @@ public class StringToByteArrayUnitTest { @Test public void whenEncodeWithCharset_thenOK() { - final String inputString = "Hello World!"; - final Charset charset = StandardCharsets.UTF_8; + final String inputString = "Hello ਸੰਸਾਰ!"; + final Charset charset = StandardCharsets.US_ASCII; - byte[] byteArrray = charset.encode(inputString).array(); + byte[] byteArrray = charset.encode(inputString) + .array(); System.out.printf( "Using encode with Charset:%s, Input String:%s, Output byte array:%s\n", charset, inputString, Arrays.toString(byteArrray)); - assertArrayEquals(new byte[] { 72, 101, 108, 108, 111, 32, 87, 111, 114, - 108, 100, 33, 0 }, + assertArrayEquals( + new byte[] { 72, 101, 108, 108, 111, 32, 63, 63, 63, 63, 63, 33 }, byteArrray); } @Test public void whenUsingCharsetEncoder_thenOK() throws CharacterCodingException { - final String inputString = "Hello World!"; - CharsetEncoder encoder = Charset.forName("UTF-8").newEncoder(); + final String inputString = "Hello ਸੰਸਾਰ!"; + CharsetEncoder encoder = StandardCharsets.US_ASCII.newEncoder(); encoder.onMalformedInput(CodingErrorAction.IGNORE) .onUnmappableCharacter(CodingErrorAction.REPLACE) .replaceWith(new byte[] { 0 }); - byte[] byteArrray = encoder.encode(CharBuffer.wrap(inputString)).array(); + byte[] byteArrray = encoder.encode(CharBuffer.wrap(inputString)) + .array(); System.out.printf( "Using encode with CharsetEncoder:%s, Input String:%s, Output byte array:%s\n", encoder, inputString, Arrays.toString(byteArrray)); - assertArrayEquals(new byte[] { 72, 101, 108, 108, 111, 32, 87, 111, 114, - 108, 100, 33, 0 }, + assertArrayEquals( + new byte[] { 72, 101, 108, 108, 111, 32, 0, 0, 0, 0, 0, 33 }, byteArrray); } From 9a6688f638db1d94de0447ea15e5215f4e654330 Mon Sep 17 00:00:00 2001 From: amdegregorio Date: Fri, 16 Nov 2018 14:45:51 -0500 Subject: [PATCH 017/359] initial code for implementation code --- hexagonal-architecture/.gitignore | 1 + hexagonal-architecture/pom.xml | 14 ++++ .../com/baeldung/hexagonal/Application.java | 27 +++++++ .../baeldung/hexagonal/domain/Employee.java | 70 +++++++++++++++++++ .../hexagonal/domain/EmployeeService.java | 26 +++++++ .../hexagonal/output/EmployeeCsvWriter.java | 64 +++++++++++++++++ .../hexagonal/output/EmployeeLogger.java | 17 +++++ .../hexagonal/output/EmployeeOutput.java | 9 +++ .../hexagonal/storage/EmployeeRepository.java | 11 +++ .../storage/InMemoryEmployeeRepository.java | 31 ++++++++ .../ui/EmployeeConsoleInputImpl.java | 53 ++++++++++++++ .../baeldung/hexagonal/ui/EmployeeInput.java | 7 ++ 12 files changed, 330 insertions(+) create mode 100644 hexagonal-architecture/.gitignore create mode 100644 hexagonal-architecture/pom.xml create mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/Application.java create mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java create mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/EmployeeService.java create mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java create mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeLogger.java create mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeOutput.java create mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/EmployeeRepository.java create mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/InMemoryEmployeeRepository.java create mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java create mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeInput.java diff --git a/hexagonal-architecture/.gitignore b/hexagonal-architecture/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/hexagonal-architecture/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/hexagonal-architecture/pom.xml b/hexagonal-architecture/pom.xml new file mode 100644 index 0000000000..c8eceae21a --- /dev/null +++ b/hexagonal-architecture/pom.xml @@ -0,0 +1,14 @@ + + 4.0.0 + com.baeldung.hexagonal + hexagonal-architecture + jar + hexagonal-architecture + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + + \ No newline at end of file diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/Application.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/Application.java new file mode 100644 index 0000000000..4691d498f4 --- /dev/null +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/Application.java @@ -0,0 +1,27 @@ +package com.baeldung.hexagonal; + +import java.io.File; + +import com.baeldung.hexagonal.domain.EmployeeService; +import com.baeldung.hexagonal.output.EmployeeCsvWriter; +import com.baeldung.hexagonal.output.EmployeeLogger; +import com.baeldung.hexagonal.output.EmployeeOutput; +import com.baeldung.hexagonal.storage.EmployeeRepository; +import com.baeldung.hexagonal.storage.InMemoryEmployeeRepository; +import com.baeldung.hexagonal.ui.EmployeeConsoleInputImpl; +import com.baeldung.hexagonal.ui.EmployeeInput; + +public class Application { + + public static void main(String[] args) { + EmployeeRepository repository = new InMemoryEmployeeRepository(); + EmployeeOutput output = new EmployeeLogger(); + EmployeeOutput csvOutput = new EmployeeCsvWriter(new File(".").getAbsolutePath(), "output.csv"); + EmployeeService service = new EmployeeService(repository, csvOutput); + EmployeeInput ui = new EmployeeConsoleInputImpl(); + ui.collectData(service); + service.generateOutput(); + + } + +} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java new file mode 100644 index 0000000000..91b22d0d11 --- /dev/null +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java @@ -0,0 +1,70 @@ +package com.baeldung.hexagonal.domain; + +import java.math.BigDecimal; + +public class Employee { + private Long id; + private String firstName; + private String lastName; + private String employeeId; + private BigDecimal salary; + + public Employee( + Long id, + String firstName, + String lastName, + String employeeId, + BigDecimal salary) { + this.id = id; + this.firstName = firstName; + this.lastName = lastName; + this.employeeId = employeeId; + this.salary = salary; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(String employeeId) { + this.employeeId = employeeId; + } + + public BigDecimal getSalary() { + return salary; + } + + public void setSalary(BigDecimal salary) { + this.salary = salary; + } + + @Override + public String toString() { + return "Employee [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", employeeId=" + employeeId + ", salary=" + salary + "]"; + } + +} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/EmployeeService.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/EmployeeService.java new file mode 100644 index 0000000000..12b2028035 --- /dev/null +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/EmployeeService.java @@ -0,0 +1,26 @@ +package com.baeldung.hexagonal.domain; + + +import java.util.List; + +import com.baeldung.hexagonal.output.EmployeeOutput; +import com.baeldung.hexagonal.storage.EmployeeRepository; + +public class EmployeeService { + private EmployeeRepository employeeRepository; + private EmployeeOutput employeeOutput; + + public EmployeeService(EmployeeRepository employeeRepository, EmployeeOutput employeeOutput) { + this.employeeRepository = employeeRepository; + this.employeeOutput = employeeOutput; + } + + public Long add(Employee employee) { + return employeeRepository.save(employee); + } + + public void generateOutput() { + List employees = employeeRepository.findAll(); + employeeOutput.writeAll(employees); + } +} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java new file mode 100644 index 0000000000..c434d19525 --- /dev/null +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java @@ -0,0 +1,64 @@ +package com.baeldung.hexagonal.output; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.Iterator; +import java.util.List; + +import com.baeldung.hexagonal.domain.Employee; + +public class EmployeeCsvWriter implements EmployeeOutput { + private File outputFile; + + public EmployeeCsvWriter(String path, String fileName) throws IllegalArgumentException { + if (fileName == null || path == null || fileName.length() == 0 || path.length() == 0) { + throw new IllegalArgumentException("Path and FileName are required"); + } else if (!fileName.endsWith(".csv")) { + throw new IllegalArgumentException("File name must be a .csv file"); + } + + System.out.println(path); + if (!path.endsWith("/")) path += "/"; + + outputFile = new File(path, fileName); + } + + @Override + public void writeAll(List employees) { + BufferedWriter writer = null; + + try { + writer = new BufferedWriter(new FileWriter(outputFile)); + for (Iterator it = employees.iterator(); it.hasNext();) { + Employee emp = it.next(); + StringBuffer empLine = new StringBuffer(); + empLine.append(emp.getId()); + empLine.append(","); + empLine.append(emp.getFirstName()); + empLine.append(","); + empLine.append(emp.getLastName()); + empLine.append(","); + empLine.append(emp.getEmployeeId()); + empLine.append(","); + empLine.append(emp.getSalary()); + writer.write(empLine.toString()); + writer.newLine(); + } + writer.flush(); + } catch (IOException ioe) { + //handle the exception + } finally { + if (writer != null) { + try { + writer.close(); + } catch (IOException e) { + //handle the exception + } + } + } + + } + +} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeLogger.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeLogger.java new file mode 100644 index 0000000000..681e631012 --- /dev/null +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeLogger.java @@ -0,0 +1,17 @@ +package com.baeldung.hexagonal.output; + +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.baeldung.hexagonal.domain.Employee; + +public class EmployeeLogger implements EmployeeOutput { + private static final Logger LOG = LoggerFactory.getLogger(EmployeeLogger.class); + + @Override + public void writeAll(List employees) { + employees.forEach(employee -> LOG.info(employee.toString())); + } + +} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeOutput.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeOutput.java new file mode 100644 index 0000000000..979c06e1f4 --- /dev/null +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeOutput.java @@ -0,0 +1,9 @@ +package com.baeldung.hexagonal.output; + +import java.util.List; + +import com.baeldung.hexagonal.domain.Employee; + +public interface EmployeeOutput { + public void writeAll(List employees); +} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/EmployeeRepository.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/EmployeeRepository.java new file mode 100644 index 0000000000..f12584f8e1 --- /dev/null +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/EmployeeRepository.java @@ -0,0 +1,11 @@ +package com.baeldung.hexagonal.storage; + +import java.util.List; + +import com.baeldung.hexagonal.domain.Employee; + +public interface EmployeeRepository { + public Long save(Employee employee); + public Employee findById(Long id); + public List findAll(); +} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/InMemoryEmployeeRepository.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/InMemoryEmployeeRepository.java new file mode 100644 index 0000000000..e860c16462 --- /dev/null +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/InMemoryEmployeeRepository.java @@ -0,0 +1,31 @@ +package com.baeldung.hexagonal.storage; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.baeldung.hexagonal.domain.Employee; + +public class InMemoryEmployeeRepository implements EmployeeRepository { + private static Map employees = new HashMap<>(); + + @Override + public Long save(Employee employee) { + Long id = employee.getId(); + employees.put(id, employee); + return id; + } + + @Override + public Employee findById(Long id) { + return employees.get(id); + } + + @Override + public List findAll() { + List all = new ArrayList(employees.values()); + return all; + } + +} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java new file mode 100644 index 0000000000..5f613f7bf9 --- /dev/null +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java @@ -0,0 +1,53 @@ +package com.baeldung.hexagonal.ui; + +import java.math.BigDecimal; +import java.util.Scanner; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.baeldung.hexagonal.domain.Employee; +import com.baeldung.hexagonal.domain.EmployeeService; + +public class EmployeeConsoleInputImpl implements EmployeeInput { + private static final Logger LOG = LoggerFactory.getLogger(EmployeeConsoleInputImpl.class); + + public void enterEmployee(EmployeeService service, Scanner scanner) { + + LOG.info("ID: "); + System.out.print("> "); + Long id = scanner.nextLong(); + LOG.info("First Name: "); + System.out.print("> "); + String firstName = scanner.next(); + LOG.info("Last Name: "); + System.out.print("> "); + String lastName = scanner.next(); + LOG.info("Employee ID: "); + System.out.print("> "); + String employeeId = scanner.next(); + LOG.info("Salary: " ); + System.out.print("> "); + BigDecimal salary = scanner.nextBigDecimal(); + + Employee employee = new Employee(id, firstName, lastName, employeeId, salary); + service.add(employee); + + } + + @Override + public void collectData(EmployeeService service) { + try (final Scanner scanner = new Scanner(System.in)) { + String keepGoing = "Y"; + do { + LOG.info("Enter information for an employee"); + enterEmployee(service, scanner); + LOG.info("Do you want to enter another employee? (Y/N)"); + System.out.print("> "); + keepGoing = scanner.next(); + if (keepGoing.length() > 1) keepGoing = keepGoing.substring(0, 1); + } while (keepGoing.equalsIgnoreCase("Y")); + } + } + +} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeInput.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeInput.java new file mode 100644 index 0000000000..62156fc6d9 --- /dev/null +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeInput.java @@ -0,0 +1,7 @@ +package com.baeldung.hexagonal.ui; + +import com.baeldung.hexagonal.domain.EmployeeService; + +public interface EmployeeInput { + void collectData(EmployeeService service); +} From 35db28ccfb884d8f277c6bdb3adc4e5fa5f0bb1c Mon Sep 17 00:00:00 2001 From: amdegregorio Date: Fri, 16 Nov 2018 16:40:46 -0500 Subject: [PATCH 018/359] formatting changes --- .../com/baeldung/hexagonal/Application.java | 1 - .../baeldung/hexagonal/domain/Employee.java | 2 +- .../hexagonal/domain/EmployeeService.java | 33 +++++++------- .../hexagonal/output/EmployeeCsvWriter.java | 16 ++++--- .../hexagonal/output/EmployeeLogger.java | 2 +- .../hexagonal/storage/EmployeeRepository.java | 8 ++-- .../ui/EmployeeConsoleInputImpl.java | 43 ++++++++++--------- .../baeldung/hexagonal/ui/EmployeeInput.java | 2 +- 8 files changed, 55 insertions(+), 52 deletions(-) diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/Application.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/Application.java index 4691d498f4..237b664708 100644 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/Application.java +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/Application.java @@ -21,7 +21,6 @@ public class Application { EmployeeInput ui = new EmployeeConsoleInputImpl(); ui.collectData(service); service.generateOutput(); - } } diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java index 91b22d0d11..b785da1494 100644 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java @@ -8,7 +8,7 @@ public class Employee { private String lastName; private String employeeId; private BigDecimal salary; - + public Employee( Long id, String firstName, diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/EmployeeService.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/EmployeeService.java index 12b2028035..2ab3ce9712 100644 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/EmployeeService.java +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/EmployeeService.java @@ -1,26 +1,25 @@ package com.baeldung.hexagonal.domain; - import java.util.List; import com.baeldung.hexagonal.output.EmployeeOutput; import com.baeldung.hexagonal.storage.EmployeeRepository; public class EmployeeService { - private EmployeeRepository employeeRepository; - private EmployeeOutput employeeOutput; - - public EmployeeService(EmployeeRepository employeeRepository, EmployeeOutput employeeOutput) { - this.employeeRepository = employeeRepository; - this.employeeOutput = employeeOutput; - } - - public Long add(Employee employee) { - return employeeRepository.save(employee); - } - - public void generateOutput() { - List employees = employeeRepository.findAll(); - employeeOutput.writeAll(employees); - } + private EmployeeRepository employeeRepository; + private EmployeeOutput employeeOutput; + + public EmployeeService(EmployeeRepository employeeRepository, EmployeeOutput employeeOutput) { + this.employeeRepository = employeeRepository; + this.employeeOutput = employeeOutput; + } + + public Long add(Employee employee) { + return employeeRepository.save(employee); + } + + public void generateOutput() { + List employees = employeeRepository.findAll(); + employeeOutput.writeAll(employees); + } } diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java index c434d19525..6d364dd11b 100644 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java @@ -11,24 +11,26 @@ import com.baeldung.hexagonal.domain.Employee; public class EmployeeCsvWriter implements EmployeeOutput { private File outputFile; - + public EmployeeCsvWriter(String path, String fileName) throws IllegalArgumentException { if (fileName == null || path == null || fileName.length() == 0 || path.length() == 0) { throw new IllegalArgumentException("Path and FileName are required"); } else if (!fileName.endsWith(".csv")) { throw new IllegalArgumentException("File name must be a .csv file"); } - + System.out.println(path); - if (!path.endsWith("/")) path += "/"; - + if (!path.endsWith("/")) { + path += "/"; + } + outputFile = new File(path, fileName); } @Override public void writeAll(List employees) { BufferedWriter writer = null; - + try { writer = new BufferedWriter(new FileWriter(outputFile)); for (Iterator it = employees.iterator(); it.hasNext();) { @@ -48,13 +50,13 @@ public class EmployeeCsvWriter implements EmployeeOutput { } writer.flush(); } catch (IOException ioe) { - //handle the exception + // handle the exception } finally { if (writer != null) { try { writer.close(); } catch (IOException e) { - //handle the exception + // handle the exception } } } diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeLogger.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeLogger.java index 681e631012..5272d18961 100644 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeLogger.java +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeLogger.java @@ -11,7 +11,7 @@ public class EmployeeLogger implements EmployeeOutput { @Override public void writeAll(List employees) { - employees.forEach(employee -> LOG.info(employee.toString())); + employees.forEach(employee -> LOG.info(employee.toString())); } } diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/EmployeeRepository.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/EmployeeRepository.java index f12584f8e1..2787601998 100644 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/EmployeeRepository.java +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/EmployeeRepository.java @@ -5,7 +5,9 @@ import java.util.List; import com.baeldung.hexagonal.domain.Employee; public interface EmployeeRepository { - public Long save(Employee employee); - public Employee findById(Long id); - public List findAll(); + public Long save(Employee employee); + + public Employee findById(Long id); + + public List findAll(); } diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java index 5f613f7bf9..4960dfd254 100644 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java @@ -13,26 +13,26 @@ public class EmployeeConsoleInputImpl implements EmployeeInput { private static final Logger LOG = LoggerFactory.getLogger(EmployeeConsoleInputImpl.class); public void enterEmployee(EmployeeService service, Scanner scanner) { - - LOG.info("ID: "); - System.out.print("> "); - Long id = scanner.nextLong(); - LOG.info("First Name: "); - System.out.print("> "); - String firstName = scanner.next(); - LOG.info("Last Name: "); - System.out.print("> "); - String lastName = scanner.next(); - LOG.info("Employee ID: "); - System.out.print("> "); - String employeeId = scanner.next(); - LOG.info("Salary: " ); - System.out.print("> "); - BigDecimal salary = scanner.nextBigDecimal(); - - Employee employee = new Employee(id, firstName, lastName, employeeId, salary); - service.add(employee); - + + LOG.info("ID: "); + System.out.print("> "); + Long id = scanner.nextLong(); + LOG.info("First Name: "); + System.out.print("> "); + String firstName = scanner.next(); + LOG.info("Last Name: "); + System.out.print("> "); + String lastName = scanner.next(); + LOG.info("Employee ID: "); + System.out.print("> "); + String employeeId = scanner.next(); + LOG.info("Salary: "); + System.out.print("> "); + BigDecimal salary = scanner.nextBigDecimal(); + + Employee employee = new Employee(id, firstName, lastName, employeeId, salary); + service.add(employee); + } @Override @@ -45,7 +45,8 @@ public class EmployeeConsoleInputImpl implements EmployeeInput { LOG.info("Do you want to enter another employee? (Y/N)"); System.out.print("> "); keepGoing = scanner.next(); - if (keepGoing.length() > 1) keepGoing = keepGoing.substring(0, 1); + if (keepGoing.length() > 1) + keepGoing = keepGoing.substring(0, 1); } while (keepGoing.equalsIgnoreCase("Y")); } } diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeInput.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeInput.java index 62156fc6d9..adec2852cd 100644 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeInput.java +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeInput.java @@ -3,5 +3,5 @@ package com.baeldung.hexagonal.ui; import com.baeldung.hexagonal.domain.EmployeeService; public interface EmployeeInput { - void collectData(EmployeeService service); + void collectData(EmployeeService service); } From f1c3029c59c71eabfcd302956b4f93069d3cea02 Mon Sep 17 00:00:00 2001 From: amdegregorio Date: Sun, 18 Nov 2018 09:57:39 -0500 Subject: [PATCH 019/359] trim down Exmployee fields --- .../baeldung/hexagonal/domain/Employee.java | 80 ++++++++----------- .../hexagonal/output/EmployeeCsvWriter.java | 9 +-- .../ui/EmployeeConsoleInputImpl.java | 21 ++--- 3 files changed, 41 insertions(+), 69 deletions(-) diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java index b785da1494..0d883995b6 100644 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java @@ -1,25 +1,12 @@ package com.baeldung.hexagonal.domain; -import java.math.BigDecimal; - public class Employee { private Long id; - private String firstName; - private String lastName; - private String employeeId; - private BigDecimal salary; + private String name; - public Employee( - Long id, - String firstName, - String lastName, - String employeeId, - BigDecimal salary) { + public Employee(Long id, String name) { this.id = id; - this.firstName = firstName; - this.lastName = lastName; - this.employeeId = employeeId; - this.salary = salary; + this.name = name; } public Long getId() { @@ -30,41 +17,44 @@ public class Employee { this.id = id; } - public String getFirstName() { - return firstName; + public String getName() { + return name; } - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - - public String getEmployeeId() { - return employeeId; - } - - public void setEmployeeId(String employeeId) { - this.employeeId = employeeId; - } - - public BigDecimal getSalary() { - return salary; - } - - public void setSalary(BigDecimal salary) { - this.salary = salary; + public void setName(String name) { + this.name = name; } @Override public String toString() { - return "Employee [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", employeeId=" + employeeId + ", salary=" + salary + "]"; + return "Employee [id=" + id + ", name=" + name + "]"; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((id == null) ? 0 : id.hashCode()); + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Employee other = (Employee) obj; + if (id == null) { + if (other.id != null) { + return false; + } + } else if (!id.equals(other.id)) { + return false; + } + + return true; } } diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java index 6d364dd11b..799fbc28ba 100644 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java @@ -38,14 +38,7 @@ public class EmployeeCsvWriter implements EmployeeOutput { StringBuffer empLine = new StringBuffer(); empLine.append(emp.getId()); empLine.append(","); - empLine.append(emp.getFirstName()); - empLine.append(","); - empLine.append(emp.getLastName()); - empLine.append(","); - empLine.append(emp.getEmployeeId()); - empLine.append(","); - empLine.append(emp.getSalary()); - writer.write(empLine.toString()); + empLine.append(emp.getName()); writer.newLine(); } writer.flush(); diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java index 4960dfd254..77453da48f 100644 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java @@ -1,6 +1,5 @@ package com.baeldung.hexagonal.ui; -import java.math.BigDecimal; import java.util.Scanner; import org.slf4j.Logger; @@ -13,26 +12,15 @@ public class EmployeeConsoleInputImpl implements EmployeeInput { private static final Logger LOG = LoggerFactory.getLogger(EmployeeConsoleInputImpl.class); public void enterEmployee(EmployeeService service, Scanner scanner) { - LOG.info("ID: "); System.out.print("> "); Long id = scanner.nextLong(); - LOG.info("First Name: "); + LOG.info("Name: "); System.out.print("> "); - String firstName = scanner.next(); - LOG.info("Last Name: "); - System.out.print("> "); - String lastName = scanner.next(); - LOG.info("Employee ID: "); - System.out.print("> "); - String employeeId = scanner.next(); - LOG.info("Salary: "); - System.out.print("> "); - BigDecimal salary = scanner.nextBigDecimal(); + String name = scanner.next(); - Employee employee = new Employee(id, firstName, lastName, employeeId, salary); + Employee employee = new Employee(id, name); service.add(employee); - } @Override @@ -45,8 +33,9 @@ public class EmployeeConsoleInputImpl implements EmployeeInput { LOG.info("Do you want to enter another employee? (Y/N)"); System.out.print("> "); keepGoing = scanner.next(); - if (keepGoing.length() > 1) + if (keepGoing.length() > 1) { keepGoing = keepGoing.substring(0, 1); + } } while (keepGoing.equalsIgnoreCase("Y")); } } From 09e7119f89208eb42e535b3b4e1c9c85aa4cf108 Mon Sep 17 00:00:00 2001 From: amdegregorio Date: Sun, 18 Nov 2018 10:07:05 -0500 Subject: [PATCH 020/359] add new line to pom.xml --- hexagonal-architecture/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hexagonal-architecture/pom.xml b/hexagonal-architecture/pom.xml index c8eceae21a..d184576705 100644 --- a/hexagonal-architecture/pom.xml +++ b/hexagonal-architecture/pom.xml @@ -11,4 +11,4 @@ 0.0.1-SNAPSHOT ../parent-java - \ No newline at end of file + From 6b7dfe79ba37a7dfacad60a7b9d26cfb7343b1b8 Mon Sep 17 00:00:00 2001 From: Chandra Prakash Date: Wed, 21 Nov 2018 20:31:03 -0500 Subject: [PATCH 021/359] Update README.md --- java-strings/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/java-strings/README.md b/java-strings/README.md index a653087401..a5db51c6a5 100644 --- a/java-strings/README.md +++ b/java-strings/README.md @@ -35,3 +35,4 @@ - [String Not Empty Test Assertions in Java](https://www.baeldung.com/java-assert-string-not-empty) - [String Performance Hints](https://www.baeldung.com/java-string-performance) - [Using indexOf to Find All Occurrences of a Word in a String](https://www.baeldung.com/java-indexOf-find-string-occurrences) +- [Convert String to Byte Array and Reverse in Java](https://www.baeldung.com/java-string-to-byte-array) From 0d5d3039cfe0c0685bca8877078c46da1a0fc618 Mon Sep 17 00:00:00 2001 From: Denis Zhdanov Date: Sun, 25 Nov 2018 13:53:48 +0800 Subject: [PATCH 022/359] BAEL-2373 Kotlin Contracts * upgraded kotlin version to 1.3.10 * added contract examples --- .../baeldung/contract/CallsInPlaceEffect.kt | 23 ++++++++++ .../com/baeldung/contract/ReturnsEffect.kt | 43 +++++++++++++++++++ parent-kotlin/pom.xml | 2 +- 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/contract/CallsInPlaceEffect.kt create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/contract/ReturnsEffect.kt diff --git a/core-kotlin/src/main/kotlin/com/baeldung/contract/CallsInPlaceEffect.kt b/core-kotlin/src/main/kotlin/com/baeldung/contract/CallsInPlaceEffect.kt new file mode 100644 index 0000000000..ca0b13cdc7 --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/contract/CallsInPlaceEffect.kt @@ -0,0 +1,23 @@ +package com.baeldung.contract + +import kotlin.contracts.ExperimentalContracts +import kotlin.contracts.InvocationKind +import kotlin.contracts.contract + +@ExperimentalContracts +inline fun myRun(block: () -> R): R { + contract { + callsInPlace(block, InvocationKind.EXACTLY_ONCE) + } + return block() +} + +@ExperimentalContracts +fun callsInPlace() { + val i: Int + myRun { + i = 1 // Without contract initialization is forbidden due to possible re-assignment + } + println(i) // Without contract variable might be uninitialized +} + diff --git a/core-kotlin/src/main/kotlin/com/baeldung/contract/ReturnsEffect.kt b/core-kotlin/src/main/kotlin/com/baeldung/contract/ReturnsEffect.kt new file mode 100644 index 0000000000..56f667af82 --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/contract/ReturnsEffect.kt @@ -0,0 +1,43 @@ +package com.baeldung.contract + +import kotlin.contracts.ExperimentalContracts +import kotlin.contracts.contract + +data class Request(val arg: String) + +class Service { + + @ExperimentalContracts + fun process(request: Request?) { + validate(request) + println(request.arg) + } + +} + +@ExperimentalContracts +private fun validate(request: Request?) { + contract { + returns() implies (request != null) + } + if (request == null) { + throw IllegalArgumentException("Undefined request") + } +} + +data class MyEvent(val message: String) + +@ExperimentalContracts +fun processEvent(event: Any?) { + if (isInterested(event)) { + println(event.message) // Compiler makes smart cast here with the help of contract + } +} + +@ExperimentalContracts +fun isInterested(event: Any?): Boolean { + contract { + returns(true) implies (event is MyEvent) + } + return event is MyEvent +} \ No newline at end of file diff --git a/parent-kotlin/pom.xml b/parent-kotlin/pom.xml index f8283bd920..73c98e1a80 100644 --- a/parent-kotlin/pom.xml +++ b/parent-kotlin/pom.xml @@ -202,7 +202,7 @@ - 1.3.0 + 1.3.10 1.0.0 0.9.5 3.11.0 From 530395a44a35abab70d4ca599cc5088ba01a855a Mon Sep 17 00:00:00 2001 From: Yatendra Goel Date: Sun, 2 Dec 2018 23:45:35 +0530 Subject: [PATCH 023/359] BAEL-2403: Immutable Map implementations in Java --- .../baeldung/java/map/ImmutableMapTest.java | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapTest.java diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapTest.java b/java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapTest.java new file mode 100644 index 0000000000..d2637d8368 --- /dev/null +++ b/java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapTest.java @@ -0,0 +1,87 @@ +package com.baeldung.java.map; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import org.junit.jupiter.api.Test; + +import com.google.common.collect.ImmutableMap; + + +public class ImmutableMapTest { + + @Test + public void whenCollectionsUnModifiableMapMethod_thenOriginalCollectionChangesReflectInUnmodifiableMap() { + + Map mutableMap = new HashMap<>(); + mutableMap.put("USA", "North America"); + + Map unmodifiableMap = Collections.unmodifiableMap(mutableMap); + assertThrows(UnsupportedOperationException.class, () -> unmodifiableMap.put("Canada", "North America")); + + mutableMap.remove("USA"); + assertFalse(unmodifiableMap.containsKey("USA")); + + mutableMap.put("Mexico", "North America"); + assertTrue(unmodifiableMap.containsKey("Mexico")); + } + + @Test + @SuppressWarnings("deprecation") + public void whenGuavaImmutableMapFromCopyOfMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() { + + Map mutableMap = new HashMap<>(); + mutableMap.put("USA", "North America"); + + ImmutableMap immutableMap = ImmutableMap.copyOf(mutableMap); + assertTrue(immutableMap.containsKey("USA")); + + assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); + + mutableMap.remove("USA"); + assertTrue(immutableMap.containsKey("USA")); + + mutableMap.put("Mexico", "North America"); + assertFalse(immutableMap.containsKey("Mexico")); + } + + @Test + @SuppressWarnings("deprecation") + public void whenGuavaImmutableMapFromBuilderMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() { + + Map mutableMap = new HashMap<>(); + mutableMap.put("USA", "North America"); + + ImmutableMap immutableMap = ImmutableMap.builder() + .putAll(mutableMap) + .put("Costa Rica", "North America") + .build(); + assertTrue(immutableMap.containsKey("USA")); + assertTrue(immutableMap.containsKey("Costa Rica")); + + assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); + + mutableMap.remove("USA"); + assertTrue(immutableMap.containsKey("USA")); + + mutableMap.put("Mexico", "North America"); + assertFalse(immutableMap.containsKey("Mexico")); + } + + @Test + @SuppressWarnings("deprecation") + public void whenGuavaImmutableMapFromOfMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() { + + ImmutableMap immutableMap = ImmutableMap.of("USA", "North America", "Costa Rica", "North America"); + assertTrue(immutableMap.containsKey("USA")); + assertTrue(immutableMap.containsKey("Costa Rica")); + + assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); + } + +} From 0147b5c699123c2e4a6dff91e7c615e5fb42e2cb Mon Sep 17 00:00:00 2001 From: Loredana Date: Sun, 2 Dec 2018 23:08:16 +0200 Subject: [PATCH 024/359] fix jedis map ex --- .../src/test/java/com/baeldung/JedisIntegrationTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/persistence-modules/redis/src/test/java/com/baeldung/JedisIntegrationTest.java b/persistence-modules/redis/src/test/java/com/baeldung/JedisIntegrationTest.java index 5795e9912b..50d28af3d1 100644 --- a/persistence-modules/redis/src/test/java/com/baeldung/JedisIntegrationTest.java +++ b/persistence-modules/redis/src/test/java/com/baeldung/JedisIntegrationTest.java @@ -144,8 +144,8 @@ public class JedisIntegrationTest { scores.put("PlayerTwo", 1500.0); scores.put("PlayerThree", 8200.0); - scores.keySet().forEach(player -> { - jedis.zadd(key, scores.get(player), player); + scores.entrySet().forEach(playerScore -> { + jedis.zadd(key, playerScore.getValue(), playerScore.getKey()); }); Set players = jedis.zrevrange(key, 0, 1); From 3b30ae74ceb47604688fac7922e5a850e51d5423 Mon Sep 17 00:00:00 2001 From: Yatendra Goel Date: Mon, 3 Dec 2018 22:53:00 +0530 Subject: [PATCH 025/359] BAEL-2403: Immutable Map implementations in Java - Changed file name --- .../map/{ImmutableMapTest.java => ImmutableMapUnitTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename java-collections-maps/src/test/java/com/baeldung/java/map/{ImmutableMapTest.java => ImmutableMapUnitTest.java} (98%) diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapTest.java b/java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapUnitTest.java similarity index 98% rename from java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapTest.java rename to java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapUnitTest.java index d2637d8368..b239ae07d8 100644 --- a/java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapTest.java +++ b/java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapUnitTest.java @@ -13,7 +13,7 @@ import org.junit.jupiter.api.Test; import com.google.common.collect.ImmutableMap; -public class ImmutableMapTest { +public class ImmutableMapUnitTest { @Test public void whenCollectionsUnModifiableMapMethod_thenOriginalCollectionChangesReflectInUnmodifiableMap() { From f2d258a20561231260cb2d3021e03fe7151488c5 Mon Sep 17 00:00:00 2001 From: Javier Date: Mon, 3 Dec 2018 21:33:53 +0100 Subject: [PATCH 026/359] BAEL-2412 Working with primitive values in Gson. --- .../fromJsonPrimitiveTypes.java | 17 +++++++++++ .../toJsonPrimitiveTypes.java | 13 +++++++++ ...JsonIntegerRepresentationBooleanValue.java | 17 +++++++++++ ...nInvalidValueWithinStringBooleanValue.java | 16 +++++++++++ .../JsonYesRepresentationBooleanValue.java | 16 +++++++++++ .../byte_value/ToJsonBitString.java | 27 ++++++++++++++++++ .../byte_value/fromJsonBitString.java | 28 +++++++++++++++++++ .../char_value/JsonUnicodeCharValue.java | 16 +++++++++++ .../models/GsonBitString.java | 9 ++++++ .../models/GsonBoolean.java | 9 ++++++ .../gsonprimitivetypes/models/GsonBundle.java | 19 +++++++++++++ .../gsonprimitivetypes/models/GsonFloat.java | 9 ++++++ .../models/GsonLatinChar.java | 9 ++++++ .../JsonNonCompatibleNumberTypeValue.java | 15 ++++++++++ .../number_value/JsonOverflowValue.java | 15 ++++++++++ .../JsonPrecissionMismatchValue.java | 15 ++++++++++ .../special_value/JsonEmptyValue.java | 15 ++++++++++ .../special_value/JsonInvalidStringValue.java | 15 ++++++++++ .../special_value/JsonInvalidValue.java | 15 ++++++++++ .../special_value/JsonNullValue.java | 15 ++++++++++ .../special_value/JsonValidStringValue.java | 15 ++++++++++ 21 files changed, 325 insertions(+) create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/fromJsonPrimitiveTypes.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/toJsonPrimitiveTypes.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonIntegerRepresentationBooleanValue.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonInvalidValueWithinStringBooleanValue.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonYesRepresentationBooleanValue.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/ToJsonBitString.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/fromJsonBitString.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/char_value/JsonUnicodeCharValue.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBitString.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBoolean.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBundle.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonFloat.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonLatinChar.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonNonCompatibleNumberTypeValue.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonOverflowValue.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonPrecissionMismatchValue.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonEmptyValue.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidStringValue.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidValue.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonNullValue.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonValidStringValue.java diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/fromJsonPrimitiveTypes.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/fromJsonPrimitiveTypes.java new file mode 100644 index 0000000000..259a9ca1ce --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/fromJsonPrimitiveTypes.java @@ -0,0 +1,17 @@ +package com.baeldung.gson_primitive_types.all_primitive_values; + +import com.baeldung.gson_primitive_types.models.GsonBundle; +import com.google.gson.Gson; + +public class fromJsonPrimitiveTypes { + public static void main(String[] args) { + String json = "{\"value\": 17, \"shortValue\": 3, \"intValue\": 3, " + + "\"longValue\": 3, \"floatValue\": 3.5" + ", \"doubleValue\": 3.5" + + ", \"booleanValue\": true, \"charValue\": \"a\"}"; + + Gson gson = new Gson(); + GsonBundle gsonBundle = gson.fromJson(json, GsonBundle.class); + + System.out.println(gsonBundle); + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/toJsonPrimitiveTypes.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/toJsonPrimitiveTypes.java new file mode 100644 index 0000000000..a55ba85e4f --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/toJsonPrimitiveTypes.java @@ -0,0 +1,13 @@ +package com.baeldung.gson_primitive_types.all_primitive_values; + +import com.baeldung.gson_primitive_types.models.GsonBundle; +import com.google.gson.Gson; + +public class toJsonPrimitiveTypes { + public static void main(String[] args) { + GsonBundle gsonBundle = new GsonBundle(); + Gson gson = new Gson(); + + System.out.println(gson.toJson(gsonBundle)); + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonIntegerRepresentationBooleanValue.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonIntegerRepresentationBooleanValue.java new file mode 100644 index 0000000000..5a90e39fce --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonIntegerRepresentationBooleanValue.java @@ -0,0 +1,17 @@ +package com.baeldung.gson_primitive_types.boolean_value; + +import com.baeldung.gson_primitive_types.models.GsonBoolean; +import com.baeldung.gson_primitive_types.models.GsonFloat; +import com.google.gson.Gson; + +public class JsonIntegerRepresentationBooleanValue { + public static void main(String[] args) { + // Raises exception. + String json = "{\"value\": 1}"; + Gson gson = new Gson(); + + GsonBoolean model = gson.fromJson(json, GsonBoolean.class); + + System.out.println(model); + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonInvalidValueWithinStringBooleanValue.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonInvalidValueWithinStringBooleanValue.java new file mode 100644 index 0000000000..58fbed6a8f --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonInvalidValueWithinStringBooleanValue.java @@ -0,0 +1,16 @@ +package com.baeldung.gson_primitive_types.boolean_value; + +import com.baeldung.gson_primitive_types.models.GsonBoolean; +import com.google.gson.Gson; + +public class JsonInvalidValueWithinStringBooleanValue { + public static void main(String[] args) { + // It is ignored. + String json = "{\"value\": \"15x\"}"; + Gson gson = new Gson(); + + GsonBoolean model = gson.fromJson(json, GsonBoolean.class); + + System.out.println(model); + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonYesRepresentationBooleanValue.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonYesRepresentationBooleanValue.java new file mode 100644 index 0000000000..f6061c1cea --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonYesRepresentationBooleanValue.java @@ -0,0 +1,16 @@ +package com.baeldung.gson_primitive_types.boolean_value; + +import com.baeldung.gson_primitive_types.models.GsonBoolean; +import com.google.gson.Gson; + +public class JsonYesRepresentationBooleanValue { + public static void main(String[] args) { + // It fails silently. + String json = "{\"value\": yes}"; + Gson gson = new Gson(); + + GsonBoolean model = gson.fromJson(json, GsonBoolean.class); + + System.out.println(model); + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/ToJsonBitString.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/ToJsonBitString.java new file mode 100644 index 0000000000..f9b8045d6c --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/ToJsonBitString.java @@ -0,0 +1,27 @@ +package com.baeldung.gson_primitive_types.byte_value; + +import com.baeldung.gson_primitive_types.models.GsonBitString; +import com.google.gson.*; + +import java.lang.reflect.Type; + +public class ToJsonBitString { + public static void main(String[] args) { + GsonBuilder builder = new GsonBuilder(); + builder.registerTypeAdapter(GsonBitString.class, new GsonBitStringSerializer()); + + Gson gson = builder.create(); + GsonBitString model = new GsonBitString(); + model.value = (byte) 0b1111; + + System.out.println(gson.toJson(model)); + } + + static class GsonBitStringSerializer implements JsonSerializer { + @Override public JsonElement serialize(GsonBitString gsonBundle, Type type, JsonSerializationContext jsonSerializationContext) { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("value", Integer.toBinaryString(gsonBundle.value)); + return jsonObject; + } + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/fromJsonBitString.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/fromJsonBitString.java new file mode 100644 index 0000000000..4bd404d811 --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/fromJsonBitString.java @@ -0,0 +1,28 @@ +package com.baeldung.gson_primitive_types.byte_value; + +import com.baeldung.gson_primitive_types.models.GsonBitString; +import com.google.gson.*; + +import java.lang.reflect.Type; + +public class fromJsonBitString { + public static void main(String[] args) { + String json = "{\"value\": \"1111\"}"; + GsonBuilder gsonBuilder = new GsonBuilder(); + gsonBuilder.registerTypeAdapter(GsonBitString.class, new GsonBitStringDeserializer()); + + Gson gson = gsonBuilder.create(); + + System.out.println(gson.fromJson(json, GsonBitString.class)); + } + + static class GsonBitStringDeserializer implements JsonDeserializer { + @Override public GsonBitString deserialize(JsonElement jsonElement, + Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { + GsonBitString gsonBitString = new GsonBitString(); + gsonBitString.value = (byte) Integer.parseInt( + jsonElement.getAsJsonObject().getAsJsonPrimitive("value").getAsString(), 2); + return gsonBitString; + } + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/char_value/JsonUnicodeCharValue.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/char_value/JsonUnicodeCharValue.java new file mode 100644 index 0000000000..d98fd823d1 --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/char_value/JsonUnicodeCharValue.java @@ -0,0 +1,16 @@ +package com.baeldung.gson_primitive_types.char_value; + +import com.baeldung.gson_primitive_types.models.GsonBitString; +import com.baeldung.gson_primitive_types.models.GsonLatinChar; +import com.google.gson.Gson; + +public class JsonUnicodeCharValue { + public static void main(String[] args) { + // The field is converted. + Gson gson = new Gson(); + String json = "{\"value\": \"\\u00AE\"}"; + GsonLatinChar model = gson.fromJson(json, GsonLatinChar.class); + + System.out.println(model); + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBitString.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBitString.java new file mode 100644 index 0000000000..7598b718be --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBitString.java @@ -0,0 +1,9 @@ +package com.baeldung.gson_primitive_types.models; + +public class GsonBitString { + public byte value = (byte) 1; + + public String toString() { + return "{byte: " + value + "}"; + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBoolean.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBoolean.java new file mode 100644 index 0000000000..ce54276228 --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBoolean.java @@ -0,0 +1,9 @@ +package com.baeldung.gson_primitive_types.models; + +public class GsonBoolean { + public boolean value; + + public String toString() { + return "{boolean: " + value + "}"; + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBundle.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBundle.java new file mode 100644 index 0000000000..51c68198ca --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBundle.java @@ -0,0 +1,19 @@ +package com.baeldung.gson_primitive_types.models; + +public class GsonBundle { + public byte byteValue = (byte) 0x00001111; + public short shortValue = (short) 3; + public int intValue = 3; + public long longValue = 3; + public float floatValue = 3.5f; + public double doubleValue = 3.5; + public boolean booleanValue = true; + public char charValue = 'a'; + + public String toString() { + return "{" + "byte: " + byteValue + ", " + "short: " + shortValue + ", " + + "int: " + intValue + ", " + "long: " + longValue + ", " + "float: " + + floatValue + ", " + "double: " + doubleValue + ", " + "boolean: " + + booleanValue + ", " + "char: " + charValue + "}"; + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonFloat.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonFloat.java new file mode 100644 index 0000000000..bf4abf9fbb --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonFloat.java @@ -0,0 +1,9 @@ +package com.baeldung.gson_primitive_types.models; + +public class GsonFloat { + public float value; + + public String toString() { + return "{float: " + value + "}"; + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonLatinChar.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonLatinChar.java new file mode 100644 index 0000000000..73b73f6bb4 --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonLatinChar.java @@ -0,0 +1,9 @@ +package com.baeldung.gson_primitive_types.models; + +public class GsonLatinChar { + public char value; + + public String toString() { + return "{char: " + value + "}"; + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonNonCompatibleNumberTypeValue.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonNonCompatibleNumberTypeValue.java new file mode 100644 index 0000000000..848248fd77 --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonNonCompatibleNumberTypeValue.java @@ -0,0 +1,15 @@ +package com.baeldung.gson_primitive_types.number_value; + +import com.baeldung.gson_primitive_types.models.GsonBitString; +import com.google.gson.Gson; + +public class JsonNonCompatibleNumberTypeValue { + public static void main(String[] args) { + // Raises an exception. + Gson gson = new Gson(); + String json = "{\"value\": 2.3}"; + GsonBitString model = gson.fromJson(json, GsonBitString.class); + + System.out.println(model); + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonOverflowValue.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonOverflowValue.java new file mode 100644 index 0000000000..6b63ee791e --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonOverflowValue.java @@ -0,0 +1,15 @@ +package com.baeldung.gson_primitive_types.number_value; + +import com.baeldung.gson_primitive_types.models.GsonBitString; +import com.google.gson.Gson; + +public class JsonOverflowValue { + public static void main(String[] args) { + // Overflow happens unnoticed. + Gson gson = new Gson(); + String json = "{\"value\": \"300\"}"; + GsonBitString model = gson.fromJson(json, GsonBitString.class); + + System.out.println(model); + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonPrecissionMismatchValue.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonPrecissionMismatchValue.java new file mode 100644 index 0000000000..6abe7101ee --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonPrecissionMismatchValue.java @@ -0,0 +1,15 @@ +package com.baeldung.gson_primitive_types.number_value; + +import com.baeldung.gson_primitive_types.models.GsonFloat; +import com.google.gson.Gson; + +public class JsonPrecissionMismatchValue { + public static void main(String[] args) { + String json = "{\"value\": 12.123456789123456}"; + Gson gson = new Gson(); + + GsonFloat model = gson.fromJson(json, GsonFloat.class); + + System.out.println(model); + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonEmptyValue.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonEmptyValue.java new file mode 100644 index 0000000000..401e355efb --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonEmptyValue.java @@ -0,0 +1,15 @@ +package com.baeldung.gson_primitive_types.special_value; + +import com.baeldung.gson_primitive_types.models.GsonBitString; +import com.google.gson.Gson; + +public class JsonEmptyValue { + public static void main(String[] args) { + // Raises an exception. + Gson gson = new Gson(); + String json = "{\"value\": \"\"}"; + GsonBitString model = gson.fromJson(json, GsonBitString.class); + + System.out.println(model); + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidStringValue.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidStringValue.java new file mode 100644 index 0000000000..3100d0b939 --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidStringValue.java @@ -0,0 +1,15 @@ +package com.baeldung.gson_primitive_types.special_value; + +import com.baeldung.gson_primitive_types.models.GsonBitString; +import com.google.gson.Gson; + +public class JsonInvalidStringValue { + public static void main(String[] args) { + // Raises an exception. + Gson gson = new Gson(); + String json = "{\"value\": \"15x\"}"; + GsonBitString model = gson.fromJson(json, GsonBitString.class); + + System.out.println(model); + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidValue.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidValue.java new file mode 100644 index 0000000000..cfa88258d4 --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidValue.java @@ -0,0 +1,15 @@ +package com.baeldung.gson_primitive_types.special_value; + +import com.baeldung.gson_primitive_types.models.GsonBitString; +import com.google.gson.Gson; + +public class JsonInvalidValue { + public static void main(String[] args) { + // Raises an exception. + Gson gson = new Gson(); + String json = "{\"value\": s15s}"; + GsonBitString model = gson.fromJson(json, GsonBitString.class); + + System.out.println(model); + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonNullValue.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonNullValue.java new file mode 100644 index 0000000000..075a029f5e --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonNullValue.java @@ -0,0 +1,15 @@ +package com.baeldung.gson_primitive_types.special_value; + +import com.baeldung.gson_primitive_types.models.GsonBitString; +import com.google.gson.Gson; + +public class JsonNullValue { + public static void main(String[] args) { + // The field will just be ignored. + Gson gson = new Gson(); + String json = "{\"value\": null}"; + GsonBitString model = gson.fromJson(json, GsonBitString.class); + + System.out.println(model); + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonValidStringValue.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonValidStringValue.java new file mode 100644 index 0000000000..8b13a2b84d --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonValidStringValue.java @@ -0,0 +1,15 @@ +package com.baeldung.gson_primitive_types.special_value; + +import com.baeldung.gson_primitive_types.models.GsonBitString; +import com.google.gson.Gson; + +public class JsonValidStringValue { + public static void main(String[] args) { + // The field is converted. + Gson gson = new Gson(); + String json = "{\"value\": \"15\"}"; + GsonBitString model = gson.fromJson(json, GsonBitString.class); + + System.out.println(model); + } +} From 44e5a0b6a2cae868e7f98112feb096fd8b6d6e61 Mon Sep 17 00:00:00 2001 From: Javier Date: Tue, 4 Dec 2018 06:46:41 +0100 Subject: [PATCH 027/359] BAEL-2412 Renaming packages. --- .../allprimitives}/fromJsonPrimitiveTypes.java | 4 ++-- .../allprimitives}/toJsonPrimitiveTypes.java | 4 ++-- .../JsonIntegerRepresentationBooleanValue.java | 5 ++--- .../JsonInvalidValueWithinStringBooleanValue.java | 5 ++--- .../booleanvalue}/JsonYesRepresentationBooleanValue.java | 4 ++-- .../bytevalue}/ToJsonBitString.java | 4 ++-- .../bytevalue}/fromJsonBitString.java | 4 ++-- .../charvalue}/JsonUnicodeCharValue.java | 7 +++---- .../models/GsonBitString.java | 2 +- .../models/GsonBoolean.java | 2 +- .../models/GsonBundle.java | 2 +- .../GsonLatinChar.java => primitives/models/GsonChar.java} | 4 ++-- .../models/GsonFloat.java | 2 +- .../numbervalue}/JsonNonCompatibleNumberTypeValue.java | 4 ++-- .../numbervalue}/JsonOverflowValue.java | 4 ++-- .../numbervalue}/JsonPrecissionMismatchValue.java | 4 ++-- .../specialvalue}/JsonEmptyValue.java | 4 ++-- .../specialvalue}/JsonInvalidStringValue.java | 4 ++-- .../specialvalue}/JsonInvalidValue.java | 4 ++-- .../specialvalue}/JsonNullValue.java | 4 ++-- .../specialvalue}/JsonValidStringValue.java | 4 ++-- 21 files changed, 39 insertions(+), 42 deletions(-) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/all_primitive_values => primitives/allprimitives}/fromJsonPrimitiveTypes.java (79%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/all_primitive_values => primitives/allprimitives}/toJsonPrimitiveTypes.java (67%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/boolean_value => primitives/booleanvalue}/JsonIntegerRepresentationBooleanValue.java (65%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/boolean_value => primitives/booleanvalue}/JsonInvalidValueWithinStringBooleanValue.java (59%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/boolean_value => primitives/booleanvalue}/JsonYesRepresentationBooleanValue.java (74%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/byte_value => primitives/bytevalue}/ToJsonBitString.java (88%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/byte_value => primitives/bytevalue}/fromJsonBitString.java (89%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/char_value => primitives/charvalue}/JsonUnicodeCharValue.java (52%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes => primitives}/models/GsonBitString.java (74%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes => primitives}/models/GsonBoolean.java (73%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes => primitives}/models/GsonBundle.java (93%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/models/GsonLatinChar.java => primitives/models/GsonChar.java} (56%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes => primitives}/models/GsonFloat.java (72%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/number_value => primitives/numbervalue}/JsonNonCompatibleNumberTypeValue.java (74%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/number_value => primitives/numbervalue}/JsonOverflowValue.java (74%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/number_value => primitives/numbervalue}/JsonPrecissionMismatchValue.java (73%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/special_value => primitives/specialvalue}/JsonEmptyValue.java (73%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/special_value => primitives/specialvalue}/JsonInvalidStringValue.java (73%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/special_value => primitives/specialvalue}/JsonInvalidValue.java (73%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/special_value => primitives/specialvalue}/JsonNullValue.java (73%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/special_value => primitives/specialvalue}/JsonValidStringValue.java (73%) diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/fromJsonPrimitiveTypes.java b/gson/src/main/java/org/baeldung/gson/primitives/allprimitives/fromJsonPrimitiveTypes.java similarity index 79% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/fromJsonPrimitiveTypes.java rename to gson/src/main/java/org/baeldung/gson/primitives/allprimitives/fromJsonPrimitiveTypes.java index 259a9ca1ce..66e4d9dc77 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/fromJsonPrimitiveTypes.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/allprimitives/fromJsonPrimitiveTypes.java @@ -1,7 +1,7 @@ -package com.baeldung.gson_primitive_types.all_primitive_values; +package org.baeldung.gson.primitives.allprimitives; -import com.baeldung.gson_primitive_types.models.GsonBundle; import com.google.gson.Gson; +import org.baeldung.gson.primitives.models.GsonBundle; public class fromJsonPrimitiveTypes { public static void main(String[] args) { diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/toJsonPrimitiveTypes.java b/gson/src/main/java/org/baeldung/gson/primitives/allprimitives/toJsonPrimitiveTypes.java similarity index 67% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/toJsonPrimitiveTypes.java rename to gson/src/main/java/org/baeldung/gson/primitives/allprimitives/toJsonPrimitiveTypes.java index a55ba85e4f..ce35f37490 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/toJsonPrimitiveTypes.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/allprimitives/toJsonPrimitiveTypes.java @@ -1,6 +1,6 @@ -package com.baeldung.gson_primitive_types.all_primitive_values; +package org.baeldung.gson.primitives.allprimitives; -import com.baeldung.gson_primitive_types.models.GsonBundle; +import org.baeldung.gson.primitives.models.GsonBundle; import com.google.gson.Gson; public class toJsonPrimitiveTypes { diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonIntegerRepresentationBooleanValue.java b/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonIntegerRepresentationBooleanValue.java similarity index 65% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonIntegerRepresentationBooleanValue.java rename to gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonIntegerRepresentationBooleanValue.java index 5a90e39fce..7cbc1f7869 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonIntegerRepresentationBooleanValue.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonIntegerRepresentationBooleanValue.java @@ -1,8 +1,7 @@ -package com.baeldung.gson_primitive_types.boolean_value; +package org.baeldung.gson.primitives.booleanvalue; -import com.baeldung.gson_primitive_types.models.GsonBoolean; -import com.baeldung.gson_primitive_types.models.GsonFloat; import com.google.gson.Gson; +import org.baeldung.gson.primitives.models.GsonBoolean; public class JsonIntegerRepresentationBooleanValue { public static void main(String[] args) { diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonInvalidValueWithinStringBooleanValue.java b/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonInvalidValueWithinStringBooleanValue.java similarity index 59% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonInvalidValueWithinStringBooleanValue.java rename to gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonInvalidValueWithinStringBooleanValue.java index 58fbed6a8f..a345d5e6f9 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonInvalidValueWithinStringBooleanValue.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonInvalidValueWithinStringBooleanValue.java @@ -1,6 +1,5 @@ -package com.baeldung.gson_primitive_types.boolean_value; +package org.baeldung.gson.primitives.booleanvalue; -import com.baeldung.gson_primitive_types.models.GsonBoolean; import com.google.gson.Gson; public class JsonInvalidValueWithinStringBooleanValue { @@ -9,7 +8,7 @@ public class JsonInvalidValueWithinStringBooleanValue { String json = "{\"value\": \"15x\"}"; Gson gson = new Gson(); - GsonBoolean model = gson.fromJson(json, GsonBoolean.class); + org.baeldung.gson.primitives.models.GsonBoolean model = gson.fromJson(json, org.baeldung.gson.primitives.models.GsonBoolean.class); System.out.println(model); } diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonYesRepresentationBooleanValue.java b/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonYesRepresentationBooleanValue.java similarity index 74% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonYesRepresentationBooleanValue.java rename to gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonYesRepresentationBooleanValue.java index f6061c1cea..b5e2e74a9a 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonYesRepresentationBooleanValue.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonYesRepresentationBooleanValue.java @@ -1,7 +1,7 @@ -package com.baeldung.gson_primitive_types.boolean_value; +package org.baeldung.gson.primitives.booleanvalue; -import com.baeldung.gson_primitive_types.models.GsonBoolean; import com.google.gson.Gson; +import org.baeldung.gson.primitives.models.GsonBoolean; public class JsonYesRepresentationBooleanValue { public static void main(String[] args) { diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/ToJsonBitString.java b/gson/src/main/java/org/baeldung/gson/primitives/bytevalue/ToJsonBitString.java similarity index 88% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/ToJsonBitString.java rename to gson/src/main/java/org/baeldung/gson/primitives/bytevalue/ToJsonBitString.java index f9b8045d6c..20247efbff 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/ToJsonBitString.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/bytevalue/ToJsonBitString.java @@ -1,7 +1,7 @@ -package com.baeldung.gson_primitive_types.byte_value; +package org.baeldung.gson.primitives.bytevalue; -import com.baeldung.gson_primitive_types.models.GsonBitString; import com.google.gson.*; +import org.baeldung.gson.primitives.models.GsonBitString; import java.lang.reflect.Type; diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/fromJsonBitString.java b/gson/src/main/java/org/baeldung/gson/primitives/bytevalue/fromJsonBitString.java similarity index 89% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/fromJsonBitString.java rename to gson/src/main/java/org/baeldung/gson/primitives/bytevalue/fromJsonBitString.java index 4bd404d811..18471ff365 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/fromJsonBitString.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/bytevalue/fromJsonBitString.java @@ -1,7 +1,7 @@ -package com.baeldung.gson_primitive_types.byte_value; +package org.baeldung.gson.primitives.bytevalue; -import com.baeldung.gson_primitive_types.models.GsonBitString; import com.google.gson.*; +import org.baeldung.gson.primitives.models.GsonBitString; import java.lang.reflect.Type; diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/char_value/JsonUnicodeCharValue.java b/gson/src/main/java/org/baeldung/gson/primitives/charvalue/JsonUnicodeCharValue.java similarity index 52% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/char_value/JsonUnicodeCharValue.java rename to gson/src/main/java/org/baeldung/gson/primitives/charvalue/JsonUnicodeCharValue.java index d98fd823d1..9164607e8d 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/char_value/JsonUnicodeCharValue.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/charvalue/JsonUnicodeCharValue.java @@ -1,15 +1,14 @@ -package com.baeldung.gson_primitive_types.char_value; +package org.baeldung.gson.primitives.charvalue; -import com.baeldung.gson_primitive_types.models.GsonBitString; -import com.baeldung.gson_primitive_types.models.GsonLatinChar; import com.google.gson.Gson; +import org.baeldung.gson.primitives.models.GsonChar; public class JsonUnicodeCharValue { public static void main(String[] args) { // The field is converted. Gson gson = new Gson(); String json = "{\"value\": \"\\u00AE\"}"; - GsonLatinChar model = gson.fromJson(json, GsonLatinChar.class); + GsonChar model = gson.fromJson(json, GsonChar.class); System.out.println(model); } diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBitString.java b/gson/src/main/java/org/baeldung/gson/primitives/models/GsonBitString.java similarity index 74% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBitString.java rename to gson/src/main/java/org/baeldung/gson/primitives/models/GsonBitString.java index 7598b718be..f84a7f82f2 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBitString.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/GsonBitString.java @@ -1,4 +1,4 @@ -package com.baeldung.gson_primitive_types.models; +package org.baeldung.gson.primitives.models; public class GsonBitString { public byte value = (byte) 1; diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBoolean.java b/gson/src/main/java/org/baeldung/gson/primitives/models/GsonBoolean.java similarity index 73% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBoolean.java rename to gson/src/main/java/org/baeldung/gson/primitives/models/GsonBoolean.java index ce54276228..228f89fa3b 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBoolean.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/GsonBoolean.java @@ -1,4 +1,4 @@ -package com.baeldung.gson_primitive_types.models; +package org.baeldung.gson.primitives.models; public class GsonBoolean { public boolean value; diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBundle.java b/gson/src/main/java/org/baeldung/gson/primitives/models/GsonBundle.java similarity index 93% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBundle.java rename to gson/src/main/java/org/baeldung/gson/primitives/models/GsonBundle.java index 51c68198ca..1fff9a8a29 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBundle.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/GsonBundle.java @@ -1,4 +1,4 @@ -package com.baeldung.gson_primitive_types.models; +package org.baeldung.gson.primitives.models; public class GsonBundle { public byte byteValue = (byte) 0x00001111; diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonLatinChar.java b/gson/src/main/java/org/baeldung/gson/primitives/models/GsonChar.java similarity index 56% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonLatinChar.java rename to gson/src/main/java/org/baeldung/gson/primitives/models/GsonChar.java index 73b73f6bb4..6983f7bfff 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonLatinChar.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/GsonChar.java @@ -1,6 +1,6 @@ -package com.baeldung.gson_primitive_types.models; +package org.baeldung.gson.primitives.models; -public class GsonLatinChar { +public class GsonChar { public char value; public String toString() { diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonFloat.java b/gson/src/main/java/org/baeldung/gson/primitives/models/GsonFloat.java similarity index 72% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonFloat.java rename to gson/src/main/java/org/baeldung/gson/primitives/models/GsonFloat.java index bf4abf9fbb..43d1d9af16 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonFloat.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/GsonFloat.java @@ -1,4 +1,4 @@ -package com.baeldung.gson_primitive_types.models; +package org.baeldung.gson.primitives.models; public class GsonFloat { public float value; diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonNonCompatibleNumberTypeValue.java b/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonNonCompatibleNumberTypeValue.java similarity index 74% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonNonCompatibleNumberTypeValue.java rename to gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonNonCompatibleNumberTypeValue.java index 848248fd77..8aba292858 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonNonCompatibleNumberTypeValue.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonNonCompatibleNumberTypeValue.java @@ -1,7 +1,7 @@ -package com.baeldung.gson_primitive_types.number_value; +package org.baeldung.gson.primitives.numbervalue; -import com.baeldung.gson_primitive_types.models.GsonBitString; import com.google.gson.Gson; +import org.baeldung.gson.primitives.models.GsonBitString; public class JsonNonCompatibleNumberTypeValue { public static void main(String[] args) { diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonOverflowValue.java b/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonOverflowValue.java similarity index 74% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonOverflowValue.java rename to gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonOverflowValue.java index 6b63ee791e..0cceff042d 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonOverflowValue.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonOverflowValue.java @@ -1,7 +1,7 @@ -package com.baeldung.gson_primitive_types.number_value; +package org.baeldung.gson.primitives.numbervalue; -import com.baeldung.gson_primitive_types.models.GsonBitString; import com.google.gson.Gson; +import org.baeldung.gson.primitives.models.GsonBitString; public class JsonOverflowValue { public static void main(String[] args) { diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonPrecissionMismatchValue.java b/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonPrecissionMismatchValue.java similarity index 73% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonPrecissionMismatchValue.java rename to gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonPrecissionMismatchValue.java index 6abe7101ee..40bc6532fb 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonPrecissionMismatchValue.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonPrecissionMismatchValue.java @@ -1,7 +1,7 @@ -package com.baeldung.gson_primitive_types.number_value; +package org.baeldung.gson.primitives.numbervalue; -import com.baeldung.gson_primitive_types.models.GsonFloat; import com.google.gson.Gson; +import org.baeldung.gson.primitives.models.GsonFloat; public class JsonPrecissionMismatchValue { public static void main(String[] args) { diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonEmptyValue.java b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonEmptyValue.java similarity index 73% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonEmptyValue.java rename to gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonEmptyValue.java index 401e355efb..3460383704 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonEmptyValue.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonEmptyValue.java @@ -1,7 +1,7 @@ -package com.baeldung.gson_primitive_types.special_value; +package org.baeldung.gson.primitives.specialvalue; -import com.baeldung.gson_primitive_types.models.GsonBitString; import com.google.gson.Gson; +import org.baeldung.gson.primitives.models.GsonBitString; public class JsonEmptyValue { public static void main(String[] args) { diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidStringValue.java b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidStringValue.java similarity index 73% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidStringValue.java rename to gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidStringValue.java index 3100d0b939..9453fc1215 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidStringValue.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidStringValue.java @@ -1,7 +1,7 @@ -package com.baeldung.gson_primitive_types.special_value; +package org.baeldung.gson.primitives.specialvalue; -import com.baeldung.gson_primitive_types.models.GsonBitString; import com.google.gson.Gson; +import org.baeldung.gson.primitives.models.GsonBitString; public class JsonInvalidStringValue { public static void main(String[] args) { diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidValue.java b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidValue.java similarity index 73% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidValue.java rename to gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidValue.java index cfa88258d4..92094f98bd 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidValue.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidValue.java @@ -1,7 +1,7 @@ -package com.baeldung.gson_primitive_types.special_value; +package org.baeldung.gson.primitives.specialvalue; -import com.baeldung.gson_primitive_types.models.GsonBitString; import com.google.gson.Gson; +import org.baeldung.gson.primitives.models.GsonBitString; public class JsonInvalidValue { public static void main(String[] args) { diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonNullValue.java b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonNullValue.java similarity index 73% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonNullValue.java rename to gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonNullValue.java index 075a029f5e..47d8df7b54 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonNullValue.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonNullValue.java @@ -1,7 +1,7 @@ -package com.baeldung.gson_primitive_types.special_value; +package org.baeldung.gson.primitives.specialvalue; -import com.baeldung.gson_primitive_types.models.GsonBitString; import com.google.gson.Gson; +import org.baeldung.gson.primitives.models.GsonBitString; public class JsonNullValue { public static void main(String[] args) { diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonValidStringValue.java b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonValidStringValue.java similarity index 73% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonValidStringValue.java rename to gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonValidStringValue.java index 8b13a2b84d..315bf2a73d 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonValidStringValue.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonValidStringValue.java @@ -1,7 +1,7 @@ -package com.baeldung.gson_primitive_types.special_value; +package org.baeldung.gson.primitives.specialvalue; -import com.baeldung.gson_primitive_types.models.GsonBitString; import com.google.gson.Gson; +import org.baeldung.gson.primitives.models.GsonBitString; public class JsonValidStringValue { public static void main(String[] args) { From 4c0ce1d7464ccb173bc1380959088034001c6128 Mon Sep 17 00:00:00 2001 From: Javier Date: Tue, 4 Dec 2018 20:32:02 +0100 Subject: [PATCH 028/359] BAEL-2412 Replace main apps by unit tests. --- .../allprimitives/fromJsonPrimitiveTypes.java | 17 -- .../allprimitives/toJsonPrimitiveTypes.java | 13 -- ...JsonIntegerRepresentationBooleanValue.java | 16 -- ...nInvalidValueWithinStringBooleanValue.java | 15 -- .../JsonYesRepresentationBooleanValue.java | 16 -- .../primitives/bytevalue/ToJsonBitString.java | 27 --- .../bytevalue/fromJsonBitString.java | 28 --- .../charvalue/JsonUnicodeCharValue.java | 15 -- .../JsonNonCompatibleNumberTypeValue.java | 15 -- .../numbervalue/JsonOverflowValue.java | 15 -- .../JsonPrecissionMismatchValue.java | 15 -- .../specialvalue/JsonEmptyValue.java | 15 -- .../specialvalue/JsonInvalidStringValue.java | 15 -- .../specialvalue/JsonInvalidValue.java | 15 -- .../specialvalue/JsonNullValue.java | 15 -- .../specialvalue/JsonValidStringValue.java | 15 -- .../baeldung/gson/primitives/UnitTest.java | 180 ++++++++++++++++++ 17 files changed, 180 insertions(+), 267 deletions(-) delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/allprimitives/fromJsonPrimitiveTypes.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/allprimitives/toJsonPrimitiveTypes.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonIntegerRepresentationBooleanValue.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonInvalidValueWithinStringBooleanValue.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonYesRepresentationBooleanValue.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/bytevalue/ToJsonBitString.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/bytevalue/fromJsonBitString.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/charvalue/JsonUnicodeCharValue.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonNonCompatibleNumberTypeValue.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonOverflowValue.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonPrecissionMismatchValue.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonEmptyValue.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidStringValue.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidValue.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonNullValue.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonValidStringValue.java create mode 100644 gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java diff --git a/gson/src/main/java/org/baeldung/gson/primitives/allprimitives/fromJsonPrimitiveTypes.java b/gson/src/main/java/org/baeldung/gson/primitives/allprimitives/fromJsonPrimitiveTypes.java deleted file mode 100644 index 66e4d9dc77..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/allprimitives/fromJsonPrimitiveTypes.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.baeldung.gson.primitives.allprimitives; - -import com.google.gson.Gson; -import org.baeldung.gson.primitives.models.GsonBundle; - -public class fromJsonPrimitiveTypes { - public static void main(String[] args) { - String json = "{\"value\": 17, \"shortValue\": 3, \"intValue\": 3, " - + "\"longValue\": 3, \"floatValue\": 3.5" + ", \"doubleValue\": 3.5" - + ", \"booleanValue\": true, \"charValue\": \"a\"}"; - - Gson gson = new Gson(); - GsonBundle gsonBundle = gson.fromJson(json, GsonBundle.class); - - System.out.println(gsonBundle); - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/allprimitives/toJsonPrimitiveTypes.java b/gson/src/main/java/org/baeldung/gson/primitives/allprimitives/toJsonPrimitiveTypes.java deleted file mode 100644 index ce35f37490..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/allprimitives/toJsonPrimitiveTypes.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.baeldung.gson.primitives.allprimitives; - -import org.baeldung.gson.primitives.models.GsonBundle; -import com.google.gson.Gson; - -public class toJsonPrimitiveTypes { - public static void main(String[] args) { - GsonBundle gsonBundle = new GsonBundle(); - Gson gson = new Gson(); - - System.out.println(gson.toJson(gsonBundle)); - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonIntegerRepresentationBooleanValue.java b/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonIntegerRepresentationBooleanValue.java deleted file mode 100644 index 7cbc1f7869..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonIntegerRepresentationBooleanValue.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.baeldung.gson.primitives.booleanvalue; - -import com.google.gson.Gson; -import org.baeldung.gson.primitives.models.GsonBoolean; - -public class JsonIntegerRepresentationBooleanValue { - public static void main(String[] args) { - // Raises exception. - String json = "{\"value\": 1}"; - Gson gson = new Gson(); - - GsonBoolean model = gson.fromJson(json, GsonBoolean.class); - - System.out.println(model); - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonInvalidValueWithinStringBooleanValue.java b/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonInvalidValueWithinStringBooleanValue.java deleted file mode 100644 index a345d5e6f9..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonInvalidValueWithinStringBooleanValue.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.baeldung.gson.primitives.booleanvalue; - -import com.google.gson.Gson; - -public class JsonInvalidValueWithinStringBooleanValue { - public static void main(String[] args) { - // It is ignored. - String json = "{\"value\": \"15x\"}"; - Gson gson = new Gson(); - - org.baeldung.gson.primitives.models.GsonBoolean model = gson.fromJson(json, org.baeldung.gson.primitives.models.GsonBoolean.class); - - System.out.println(model); - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonYesRepresentationBooleanValue.java b/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonYesRepresentationBooleanValue.java deleted file mode 100644 index b5e2e74a9a..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonYesRepresentationBooleanValue.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.baeldung.gson.primitives.booleanvalue; - -import com.google.gson.Gson; -import org.baeldung.gson.primitives.models.GsonBoolean; - -public class JsonYesRepresentationBooleanValue { - public static void main(String[] args) { - // It fails silently. - String json = "{\"value\": yes}"; - Gson gson = new Gson(); - - GsonBoolean model = gson.fromJson(json, GsonBoolean.class); - - System.out.println(model); - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/bytevalue/ToJsonBitString.java b/gson/src/main/java/org/baeldung/gson/primitives/bytevalue/ToJsonBitString.java deleted file mode 100644 index 20247efbff..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/bytevalue/ToJsonBitString.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.baeldung.gson.primitives.bytevalue; - -import com.google.gson.*; -import org.baeldung.gson.primitives.models.GsonBitString; - -import java.lang.reflect.Type; - -public class ToJsonBitString { - public static void main(String[] args) { - GsonBuilder builder = new GsonBuilder(); - builder.registerTypeAdapter(GsonBitString.class, new GsonBitStringSerializer()); - - Gson gson = builder.create(); - GsonBitString model = new GsonBitString(); - model.value = (byte) 0b1111; - - System.out.println(gson.toJson(model)); - } - - static class GsonBitStringSerializer implements JsonSerializer { - @Override public JsonElement serialize(GsonBitString gsonBundle, Type type, JsonSerializationContext jsonSerializationContext) { - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("value", Integer.toBinaryString(gsonBundle.value)); - return jsonObject; - } - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/bytevalue/fromJsonBitString.java b/gson/src/main/java/org/baeldung/gson/primitives/bytevalue/fromJsonBitString.java deleted file mode 100644 index 18471ff365..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/bytevalue/fromJsonBitString.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.baeldung.gson.primitives.bytevalue; - -import com.google.gson.*; -import org.baeldung.gson.primitives.models.GsonBitString; - -import java.lang.reflect.Type; - -public class fromJsonBitString { - public static void main(String[] args) { - String json = "{\"value\": \"1111\"}"; - GsonBuilder gsonBuilder = new GsonBuilder(); - gsonBuilder.registerTypeAdapter(GsonBitString.class, new GsonBitStringDeserializer()); - - Gson gson = gsonBuilder.create(); - - System.out.println(gson.fromJson(json, GsonBitString.class)); - } - - static class GsonBitStringDeserializer implements JsonDeserializer { - @Override public GsonBitString deserialize(JsonElement jsonElement, - Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { - GsonBitString gsonBitString = new GsonBitString(); - gsonBitString.value = (byte) Integer.parseInt( - jsonElement.getAsJsonObject().getAsJsonPrimitive("value").getAsString(), 2); - return gsonBitString; - } - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/charvalue/JsonUnicodeCharValue.java b/gson/src/main/java/org/baeldung/gson/primitives/charvalue/JsonUnicodeCharValue.java deleted file mode 100644 index 9164607e8d..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/charvalue/JsonUnicodeCharValue.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.baeldung.gson.primitives.charvalue; - -import com.google.gson.Gson; -import org.baeldung.gson.primitives.models.GsonChar; - -public class JsonUnicodeCharValue { - public static void main(String[] args) { - // The field is converted. - Gson gson = new Gson(); - String json = "{\"value\": \"\\u00AE\"}"; - GsonChar model = gson.fromJson(json, GsonChar.class); - - System.out.println(model); - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonNonCompatibleNumberTypeValue.java b/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonNonCompatibleNumberTypeValue.java deleted file mode 100644 index 8aba292858..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonNonCompatibleNumberTypeValue.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.baeldung.gson.primitives.numbervalue; - -import com.google.gson.Gson; -import org.baeldung.gson.primitives.models.GsonBitString; - -public class JsonNonCompatibleNumberTypeValue { - public static void main(String[] args) { - // Raises an exception. - Gson gson = new Gson(); - String json = "{\"value\": 2.3}"; - GsonBitString model = gson.fromJson(json, GsonBitString.class); - - System.out.println(model); - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonOverflowValue.java b/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonOverflowValue.java deleted file mode 100644 index 0cceff042d..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonOverflowValue.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.baeldung.gson.primitives.numbervalue; - -import com.google.gson.Gson; -import org.baeldung.gson.primitives.models.GsonBitString; - -public class JsonOverflowValue { - public static void main(String[] args) { - // Overflow happens unnoticed. - Gson gson = new Gson(); - String json = "{\"value\": \"300\"}"; - GsonBitString model = gson.fromJson(json, GsonBitString.class); - - System.out.println(model); - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonPrecissionMismatchValue.java b/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonPrecissionMismatchValue.java deleted file mode 100644 index 40bc6532fb..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonPrecissionMismatchValue.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.baeldung.gson.primitives.numbervalue; - -import com.google.gson.Gson; -import org.baeldung.gson.primitives.models.GsonFloat; - -public class JsonPrecissionMismatchValue { - public static void main(String[] args) { - String json = "{\"value\": 12.123456789123456}"; - Gson gson = new Gson(); - - GsonFloat model = gson.fromJson(json, GsonFloat.class); - - System.out.println(model); - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonEmptyValue.java b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonEmptyValue.java deleted file mode 100644 index 3460383704..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonEmptyValue.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.baeldung.gson.primitives.specialvalue; - -import com.google.gson.Gson; -import org.baeldung.gson.primitives.models.GsonBitString; - -public class JsonEmptyValue { - public static void main(String[] args) { - // Raises an exception. - Gson gson = new Gson(); - String json = "{\"value\": \"\"}"; - GsonBitString model = gson.fromJson(json, GsonBitString.class); - - System.out.println(model); - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidStringValue.java b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidStringValue.java deleted file mode 100644 index 9453fc1215..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidStringValue.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.baeldung.gson.primitives.specialvalue; - -import com.google.gson.Gson; -import org.baeldung.gson.primitives.models.GsonBitString; - -public class JsonInvalidStringValue { - public static void main(String[] args) { - // Raises an exception. - Gson gson = new Gson(); - String json = "{\"value\": \"15x\"}"; - GsonBitString model = gson.fromJson(json, GsonBitString.class); - - System.out.println(model); - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidValue.java b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidValue.java deleted file mode 100644 index 92094f98bd..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidValue.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.baeldung.gson.primitives.specialvalue; - -import com.google.gson.Gson; -import org.baeldung.gson.primitives.models.GsonBitString; - -public class JsonInvalidValue { - public static void main(String[] args) { - // Raises an exception. - Gson gson = new Gson(); - String json = "{\"value\": s15s}"; - GsonBitString model = gson.fromJson(json, GsonBitString.class); - - System.out.println(model); - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonNullValue.java b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonNullValue.java deleted file mode 100644 index 47d8df7b54..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonNullValue.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.baeldung.gson.primitives.specialvalue; - -import com.google.gson.Gson; -import org.baeldung.gson.primitives.models.GsonBitString; - -public class JsonNullValue { - public static void main(String[] args) { - // The field will just be ignored. - Gson gson = new Gson(); - String json = "{\"value\": null}"; - GsonBitString model = gson.fromJson(json, GsonBitString.class); - - System.out.println(model); - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonValidStringValue.java b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonValidStringValue.java deleted file mode 100644 index 315bf2a73d..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonValidStringValue.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.baeldung.gson.primitives.specialvalue; - -import com.google.gson.Gson; -import org.baeldung.gson.primitives.models.GsonBitString; - -public class JsonValidStringValue { - public static void main(String[] args) { - // The field is converted. - Gson gson = new Gson(); - String json = "{\"value\": \"15\"}"; - GsonBitString model = gson.fromJson(json, GsonBitString.class); - - System.out.println(model); - } -} diff --git a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java new file mode 100644 index 0000000000..da91f02447 --- /dev/null +++ b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java @@ -0,0 +1,180 @@ +package org.baeldung.gson.primitives; + +import com.google.gson.*; +import org.baeldung.gson.primitives.models.*; +import org.junit.Test; + +import java.lang.reflect.Type; + +import static junit.framework.TestCase.*; + +public class UnitTest { + @Test public void toJsonAllPrimitives() { + GsonBundle gsonBundle = new GsonBundle(); + Gson gson = new Gson(); + + String expected = "{\"byteValue\":17,\"shortValue\":3,\"intValue\":3," + "\"longValue\":3,\"floatValue\":3.5" + ",\"doubleValue\":3.5" + ",\"booleanValue\":true,\"charValue\":\"a\"}"; + + assertEquals(expected, gson.toJson(gsonBundle)); + } + + @Test public void fromJsonAllPrimitives() { + String json = "{\"byteValue\": 17, \"shortValue\": 3, \"intValue\": 3, " + "\"longValue\": 3, \"floatValue\": 3.5" + ", \"doubleValue\": 3.5" + ", \"booleanValue\": true, \"charValue\": \"a\"}"; + + Gson gson = new Gson(); + GsonBundle model = gson.fromJson(json, GsonBundle.class); + + assertEquals(17, model.byteValue); + assertEquals(3, model.shortValue); + assertEquals(3, model.intValue); + assertEquals(3, model.longValue); + assertEquals(3.5, model.floatValue, 0.0001); + assertEquals(3.5, model.doubleValue, 0.0001); + assertTrue(model.booleanValue); + assertEquals('a', model.charValue); + } + + @Test public void toJsonByteToBitString() { + GsonBuilder builder = new GsonBuilder(); + builder.registerTypeAdapter(GsonBitString.class, new GsonBitStringSerializer()); + + Gson gson = builder.create(); + GsonBitString model = new GsonBitString(); + model.value = (byte) 0b1111; + + assertEquals("{\"value\":\"1111\"}", gson.toJson(model)); + } + + @Test public void fromJsonByteFromBitString() { + String json = "{\"value\": \"1111\"}"; + GsonBuilder gsonBuilder = new GsonBuilder(); + gsonBuilder.registerTypeAdapter(GsonBitString.class, new GsonBitStringDeserializer()); + + Gson gson = gsonBuilder.create(); + + GsonBitString model = gson.fromJson(json, GsonBitString.class); + + assertEquals(15, model.value); + } + + @Test public void fromJsonPrecissionMismatch() { + String json = "{\"value\": 12.123456789123456}"; + Gson gson = new Gson(); + GsonFloat model = gson.fromJson(json, GsonFloat.class); + assertEquals(12.123457f, model.value, 0.000001); + } + + @Test public void fromJsonOverflow() { + Gson gson = new Gson(); + String json = "{\"value\": \"300\"}"; + GsonBitString model = gson.fromJson(json, GsonBitString.class); + + assertEquals(44, model.value); + } + + @Test public void fromJsonNonCompatibleNumberTypes() { + Gson gson = new Gson(); + String json = "{\"value\": 2.3}"; + try { + gson.fromJson(json, GsonBitString.class); + } catch (Exception ex) { + assertTrue(ex instanceof JsonSyntaxException); + assertTrue(ex.getCause() instanceof NumberFormatException); + return; + } + + fail(); + } + + @Test public void fromJsonUnicodeChar() { + Gson gson = new Gson(); + String json = "{\"value\": \"\\u00AE\"}"; + GsonChar model = gson.fromJson(json, GsonChar.class); + + assertEquals('\u00AE', model.value); + } + + @Test public void fromJsonNull() { + Gson gson = new Gson(); + String json = "{\"value\": null}"; + GsonBitString model = gson.fromJson(json, GsonBitString.class); + + assertEquals(1, model.value); + } + + @Test(expected = JsonSyntaxException.class) public void fromJsonEmptyString() { + Gson gson = new Gson(); + String json = "{\"value\": \"\"}"; + gson.fromJson(json, GsonBitString.class); + } + + @Test public void fromJsonValidValueWithinString() { + Gson gson = new Gson(); + String json = "{\"value\": \"15\"}"; + GsonBitString model = gson.fromJson(json, GsonBitString.class); + + assertEquals(15, model.value); + } + + @Test(expected = JsonSyntaxException.class) public void fromJsonInvalidValueWithinString() { + Gson gson = new Gson(); + String json = "{\"value\": \"15x\"}"; + gson.fromJson(json, GsonBitString.class); + } + + @Test(expected = JsonSyntaxException.class) public void fromJsonInvalidValueNotInAString() { + Gson gson = new Gson(); + String json = "{\"value\": s15s}"; + gson.fromJson(json, GsonBitString.class); + } + + @Test public void fromJsonBooleanFrom2ValueInteger() { + String json = "{\"value\": 1}"; + Gson gson = new Gson(); + + try { + gson.fromJson(json, GsonBoolean.class); + } catch (Exception ex) { + assertTrue(ex instanceof JsonSyntaxException); + assertTrue(ex.getCause() instanceof IllegalStateException); + return; + } + + fail(); + } + + @Test public void fromJsonBooleanfromYes() { + String json = "{\"value\": yes}"; + Gson gson = new Gson(); + + GsonBoolean model = gson.fromJson(json, GsonBoolean.class); + + // pay attention here that we are deserializing yes. + assertFalse(model.value); + } + + @Test public void fromJsonBooleanFromInvalidValue() { + String json = "{\"value\": \"15x\"}"; + Gson gson = new Gson(); + + GsonBoolean model = gson.fromJson(json, GsonBoolean.class); + + assertFalse(model.value); + } + + static class GsonBitStringDeserializer implements JsonDeserializer { + @Override public GsonBitString deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { + GsonBitString gsonBitString = new GsonBitString(); + gsonBitString.value = (byte) Integer.parseInt(jsonElement.getAsJsonObject().getAsJsonPrimitive("value").getAsString(), 2); + return gsonBitString; + } + } + + static class GsonBitStringSerializer implements JsonSerializer { + @Override public JsonElement serialize(GsonBitString gsonBundle, Type type, JsonSerializationContext jsonSerializationContext) { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("value", Integer.toBinaryString(gsonBundle.value)); + return jsonObject; + } + } +} From 19ed35aef4979947448d0d13b50add52db428069 Mon Sep 17 00:00:00 2001 From: Javier Date: Thu, 6 Dec 2018 10:13:20 +0100 Subject: [PATCH 029/359] BAEL-2412 Change name of a class. Move class init code to tests. Add solution to deserializing a boolean from an 2-value integer. Change formatting for long sentences, mainly the serializers/deserializers. --- .../{GsonBundle.java => PrimitiveBundle.java} | 18 ++-- .../baeldung/gson/primitives/UnitTest.java | 87 ++++++++++++++++--- 2 files changed, 83 insertions(+), 22 deletions(-) rename gson/src/main/java/org/baeldung/gson/primitives/models/{GsonBundle.java => PrimitiveBundle.java} (55%) diff --git a/gson/src/main/java/org/baeldung/gson/primitives/models/GsonBundle.java b/gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundle.java similarity index 55% rename from gson/src/main/java/org/baeldung/gson/primitives/models/GsonBundle.java rename to gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundle.java index 1fff9a8a29..30bc4d0d9f 100644 --- a/gson/src/main/java/org/baeldung/gson/primitives/models/GsonBundle.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundle.java @@ -1,14 +1,14 @@ package org.baeldung.gson.primitives.models; -public class GsonBundle { - public byte byteValue = (byte) 0x00001111; - public short shortValue = (short) 3; - public int intValue = 3; - public long longValue = 3; - public float floatValue = 3.5f; - public double doubleValue = 3.5; - public boolean booleanValue = true; - public char charValue = 'a'; +public class PrimitiveBundle { + public byte byteValue; + public short shortValue; + public int intValue; + public long longValue; + public float floatValue; + public double doubleValue; + public boolean booleanValue; + public char charValue; public String toString() { return "{" + "byte: " + byteValue + ", " + "short: " + shortValue + ", " diff --git a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java index da91f02447..890e6eefd7 100644 --- a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java +++ b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java @@ -10,28 +10,42 @@ import static junit.framework.TestCase.*; public class UnitTest { @Test public void toJsonAllPrimitives() { - GsonBundle gsonBundle = new GsonBundle(); + PrimitiveBundle primitiveBundle = new PrimitiveBundle(); + + // @formatter:off + primitiveBundle.byteValue = (byte) 0x00001111; + primitiveBundle.shortValue = (short) 3; + primitiveBundle.intValue = 3; + primitiveBundle.longValue = 3; + primitiveBundle.floatValue = 3.5f; + primitiveBundle.doubleValue = 3.5; + primitiveBundle.booleanValue = true; + primitiveBundle.charValue = 'a'; + // @formatter:on + Gson gson = new Gson(); String expected = "{\"byteValue\":17,\"shortValue\":3,\"intValue\":3," + "\"longValue\":3,\"floatValue\":3.5" + ",\"doubleValue\":3.5" + ",\"booleanValue\":true,\"charValue\":\"a\"}"; - assertEquals(expected, gson.toJson(gsonBundle)); + assertEquals(expected, gson.toJson(primitiveBundle)); } @Test public void fromJsonAllPrimitives() { String json = "{\"byteValue\": 17, \"shortValue\": 3, \"intValue\": 3, " + "\"longValue\": 3, \"floatValue\": 3.5" + ", \"doubleValue\": 3.5" + ", \"booleanValue\": true, \"charValue\": \"a\"}"; Gson gson = new Gson(); - GsonBundle model = gson.fromJson(json, GsonBundle.class); + PrimitiveBundle model = gson.fromJson(json, PrimitiveBundle.class); - assertEquals(17, model.byteValue); - assertEquals(3, model.shortValue); - assertEquals(3, model.intValue); - assertEquals(3, model.longValue); + // @formatter:off + assertEquals(17, model.byteValue); + assertEquals(3, model.shortValue); + assertEquals(3, model.intValue); + assertEquals(3, model.longValue); assertEquals(3.5, model.floatValue, 0.0001); assertEquals(3.5, model.doubleValue, 0.0001); - assertTrue(model.booleanValue); + assertTrue( model.booleanValue); assertEquals('a', model.charValue); + // @formatter:on } @Test public void toJsonByteToBitString() { @@ -143,7 +157,19 @@ public class UnitTest { fail(); } - @Test public void fromJsonBooleanfromYes() { + @Test public void fromJsonBooleanFrom2ValueIntegerSolution() { + String json = "{\"value\": 1}"; + GsonBuilder builder = new GsonBuilder(); + builder.registerTypeAdapter(GsonBoolean.class, new GsonBoolean2ValueIntegerDeserializer()); + + Gson gson = builder.create(); + + GsonBoolean model = gson.fromJson(json, GsonBoolean.class); + + assertTrue(model.value); + } + + @Test public void fromJsonBooleanFromYes() { String json = "{\"value\": yes}"; Gson gson = new Gson(); @@ -162,19 +188,54 @@ public class UnitTest { assertFalse(model.value); } + // @formatter:off static class GsonBitStringDeserializer implements JsonDeserializer { - @Override public GsonBitString deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { + @Override public GsonBitString deserialize( + JsonElement jsonElement, + Type type, + JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { + GsonBitString gsonBitString = new GsonBitString(); - gsonBitString.value = (byte) Integer.parseInt(jsonElement.getAsJsonObject().getAsJsonPrimitive("value").getAsString(), 2); + gsonBitString.value = (byte) Integer.parseInt( + jsonElement.getAsJsonObject() + .getAsJsonPrimitive("value") + .getAsString() + , 2); return gsonBitString; } } static class GsonBitStringSerializer implements JsonSerializer { - @Override public JsonElement serialize(GsonBitString gsonBundle, Type type, JsonSerializationContext jsonSerializationContext) { + @Override public JsonElement serialize( + GsonBitString model, + Type type, + JsonSerializationContext jsonSerializationContext) { + JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("value", Integer.toBinaryString(gsonBundle.value)); + jsonObject.addProperty("value", Integer.toBinaryString(model.value)); return jsonObject; } } + + static class GsonBoolean2ValueIntegerDeserializer implements JsonDeserializer { + @Override public GsonBoolean deserialize( + JsonElement jsonElement, + Type type, + JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { + + GsonBoolean model = new GsonBoolean(); + int value = jsonElement.getAsJsonObject().getAsJsonPrimitive("value").getAsInt(); + if (value == 0) { + model.value = false; + } else if (value == 1) { + model.value = true; + } else { + throw new JsonParseException("Unexpected value. Trying to deserialize " + + "a boolean from an integer different than 0 and 1."); + } + + return model; + } + } + // @formatter:on } From a4d768763b9275d717c92bdf19ea93f4186dfd15 Mon Sep 17 00:00:00 2001 From: mherbaghinyan Date: Thu, 6 Dec 2018 15:23:13 +0400 Subject: [PATCH 030/359] Vector class example --- .../com/baeldung/java/list/VectorExample.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 core-java-collections/src/main/java/com/baeldung/java/list/VectorExample.java diff --git a/core-java-collections/src/main/java/com/baeldung/java/list/VectorExample.java b/core-java-collections/src/main/java/com/baeldung/java/list/VectorExample.java new file mode 100644 index 0000000000..38736390ca --- /dev/null +++ b/core-java-collections/src/main/java/com/baeldung/java/list/VectorExample.java @@ -0,0 +1,21 @@ +package com.baeldung.java.list; + +import java.util.Enumeration; +import java.util.Vector; + +public class VectorExample { + + public static void main(String[] args) { + + Vector vector = new Vector<>(); + vector.add("baeldung"); + vector.add("Vector"); + vector.add("example"); + + Enumeration e = vector.elements(); + while(e.hasMoreElements()){ + System.out.println(e.nextElement()); + } + } + +} From cdd6968c318d3aedbb5a0715a465ce93b53ed64b Mon Sep 17 00:00:00 2001 From: Javier Date: Fri, 7 Dec 2018 10:57:30 +0100 Subject: [PATCH 031/359] BAEL-2412 Changes PR. --- .../{GsonBoolean.java => BooleanExample.java} | 2 +- .../{GsonBitString.java => ByteExample.java} | 2 +- .../{GsonChar.java => CharExample.java} | 2 +- .../{GsonFloat.java => FloatExample.java} | 2 +- .../baeldung/gson/primitives/UnitTest.java | 56 +++++++++---------- 5 files changed, 32 insertions(+), 32 deletions(-) rename gson/src/main/java/org/baeldung/gson/primitives/models/{GsonBoolean.java => BooleanExample.java} (83%) rename gson/src/main/java/org/baeldung/gson/primitives/models/{GsonBitString.java => ByteExample.java} (84%) rename gson/src/main/java/org/baeldung/gson/primitives/models/{GsonChar.java => CharExample.java} (84%) rename gson/src/main/java/org/baeldung/gson/primitives/models/{GsonFloat.java => FloatExample.java} (84%) diff --git a/gson/src/main/java/org/baeldung/gson/primitives/models/GsonBoolean.java b/gson/src/main/java/org/baeldung/gson/primitives/models/BooleanExample.java similarity index 83% rename from gson/src/main/java/org/baeldung/gson/primitives/models/GsonBoolean.java rename to gson/src/main/java/org/baeldung/gson/primitives/models/BooleanExample.java index 228f89fa3b..1fe87650de 100644 --- a/gson/src/main/java/org/baeldung/gson/primitives/models/GsonBoolean.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/BooleanExample.java @@ -1,6 +1,6 @@ package org.baeldung.gson.primitives.models; -public class GsonBoolean { +public class BooleanExample { public boolean value; public String toString() { diff --git a/gson/src/main/java/org/baeldung/gson/primitives/models/GsonBitString.java b/gson/src/main/java/org/baeldung/gson/primitives/models/ByteExample.java similarity index 84% rename from gson/src/main/java/org/baeldung/gson/primitives/models/GsonBitString.java rename to gson/src/main/java/org/baeldung/gson/primitives/models/ByteExample.java index f84a7f82f2..2e1c68ee51 100644 --- a/gson/src/main/java/org/baeldung/gson/primitives/models/GsonBitString.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/ByteExample.java @@ -1,6 +1,6 @@ package org.baeldung.gson.primitives.models; -public class GsonBitString { +public class ByteExample { public byte value = (byte) 1; public String toString() { diff --git a/gson/src/main/java/org/baeldung/gson/primitives/models/GsonChar.java b/gson/src/main/java/org/baeldung/gson/primitives/models/CharExample.java similarity index 84% rename from gson/src/main/java/org/baeldung/gson/primitives/models/GsonChar.java rename to gson/src/main/java/org/baeldung/gson/primitives/models/CharExample.java index 6983f7bfff..ccac913f23 100644 --- a/gson/src/main/java/org/baeldung/gson/primitives/models/GsonChar.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/CharExample.java @@ -1,6 +1,6 @@ package org.baeldung.gson.primitives.models; -public class GsonChar { +public class CharExample { public char value; public String toString() { diff --git a/gson/src/main/java/org/baeldung/gson/primitives/models/GsonFloat.java b/gson/src/main/java/org/baeldung/gson/primitives/models/FloatExample.java similarity index 84% rename from gson/src/main/java/org/baeldung/gson/primitives/models/GsonFloat.java rename to gson/src/main/java/org/baeldung/gson/primitives/models/FloatExample.java index 43d1d9af16..00a97f68fc 100644 --- a/gson/src/main/java/org/baeldung/gson/primitives/models/GsonFloat.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/FloatExample.java @@ -1,6 +1,6 @@ package org.baeldung.gson.primitives.models; -public class GsonFloat { +public class FloatExample { public float value; public String toString() { diff --git a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java index 890e6eefd7..87d5cbbb60 100644 --- a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java +++ b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java @@ -50,10 +50,10 @@ public class UnitTest { @Test public void toJsonByteToBitString() { GsonBuilder builder = new GsonBuilder(); - builder.registerTypeAdapter(GsonBitString.class, new GsonBitStringSerializer()); + builder.registerTypeAdapter(ByteExample.class, new GsonBitStringSerializer()); Gson gson = builder.create(); - GsonBitString model = new GsonBitString(); + ByteExample model = new ByteExample(); model.value = (byte) 0b1111; assertEquals("{\"value\":\"1111\"}", gson.toJson(model)); @@ -62,11 +62,11 @@ public class UnitTest { @Test public void fromJsonByteFromBitString() { String json = "{\"value\": \"1111\"}"; GsonBuilder gsonBuilder = new GsonBuilder(); - gsonBuilder.registerTypeAdapter(GsonBitString.class, new GsonBitStringDeserializer()); + gsonBuilder.registerTypeAdapter(ByteExample.class, new GsonBitStringDeserializer()); Gson gson = gsonBuilder.create(); - GsonBitString model = gson.fromJson(json, GsonBitString.class); + ByteExample model = gson.fromJson(json, ByteExample.class); assertEquals(15, model.value); } @@ -74,14 +74,14 @@ public class UnitTest { @Test public void fromJsonPrecissionMismatch() { String json = "{\"value\": 12.123456789123456}"; Gson gson = new Gson(); - GsonFloat model = gson.fromJson(json, GsonFloat.class); + FloatExample model = gson.fromJson(json, FloatExample.class); assertEquals(12.123457f, model.value, 0.000001); } @Test public void fromJsonOverflow() { Gson gson = new Gson(); String json = "{\"value\": \"300\"}"; - GsonBitString model = gson.fromJson(json, GsonBitString.class); + ByteExample model = gson.fromJson(json, ByteExample.class); assertEquals(44, model.value); } @@ -90,7 +90,7 @@ public class UnitTest { Gson gson = new Gson(); String json = "{\"value\": 2.3}"; try { - gson.fromJson(json, GsonBitString.class); + gson.fromJson(json, ByteExample.class); } catch (Exception ex) { assertTrue(ex instanceof JsonSyntaxException); assertTrue(ex.getCause() instanceof NumberFormatException); @@ -103,7 +103,7 @@ public class UnitTest { @Test public void fromJsonUnicodeChar() { Gson gson = new Gson(); String json = "{\"value\": \"\\u00AE\"}"; - GsonChar model = gson.fromJson(json, GsonChar.class); + CharExample model = gson.fromJson(json, CharExample.class); assertEquals('\u00AE', model.value); } @@ -111,7 +111,7 @@ public class UnitTest { @Test public void fromJsonNull() { Gson gson = new Gson(); String json = "{\"value\": null}"; - GsonBitString model = gson.fromJson(json, GsonBitString.class); + ByteExample model = gson.fromJson(json, ByteExample.class); assertEquals(1, model.value); } @@ -119,13 +119,13 @@ public class UnitTest { @Test(expected = JsonSyntaxException.class) public void fromJsonEmptyString() { Gson gson = new Gson(); String json = "{\"value\": \"\"}"; - gson.fromJson(json, GsonBitString.class); + gson.fromJson(json, ByteExample.class); } @Test public void fromJsonValidValueWithinString() { Gson gson = new Gson(); String json = "{\"value\": \"15\"}"; - GsonBitString model = gson.fromJson(json, GsonBitString.class); + ByteExample model = gson.fromJson(json, ByteExample.class); assertEquals(15, model.value); } @@ -133,13 +133,13 @@ public class UnitTest { @Test(expected = JsonSyntaxException.class) public void fromJsonInvalidValueWithinString() { Gson gson = new Gson(); String json = "{\"value\": \"15x\"}"; - gson.fromJson(json, GsonBitString.class); + gson.fromJson(json, ByteExample.class); } @Test(expected = JsonSyntaxException.class) public void fromJsonInvalidValueNotInAString() { Gson gson = new Gson(); String json = "{\"value\": s15s}"; - gson.fromJson(json, GsonBitString.class); + gson.fromJson(json, ByteExample.class); } @Test public void fromJsonBooleanFrom2ValueInteger() { @@ -147,7 +147,7 @@ public class UnitTest { Gson gson = new Gson(); try { - gson.fromJson(json, GsonBoolean.class); + gson.fromJson(json, BooleanExample.class); } catch (Exception ex) { assertTrue(ex instanceof JsonSyntaxException); assertTrue(ex.getCause() instanceof IllegalStateException); @@ -160,11 +160,11 @@ public class UnitTest { @Test public void fromJsonBooleanFrom2ValueIntegerSolution() { String json = "{\"value\": 1}"; GsonBuilder builder = new GsonBuilder(); - builder.registerTypeAdapter(GsonBoolean.class, new GsonBoolean2ValueIntegerDeserializer()); + builder.registerTypeAdapter(BooleanExample.class, new BooleanAs2ValueIntegerDeserializer()); Gson gson = builder.create(); - GsonBoolean model = gson.fromJson(json, GsonBoolean.class); + BooleanExample model = gson.fromJson(json, BooleanExample.class); assertTrue(model.value); } @@ -173,7 +173,7 @@ public class UnitTest { String json = "{\"value\": yes}"; Gson gson = new Gson(); - GsonBoolean model = gson.fromJson(json, GsonBoolean.class); + BooleanExample model = gson.fromJson(json, BooleanExample.class); // pay attention here that we are deserializing yes. assertFalse(model.value); @@ -183,31 +183,31 @@ public class UnitTest { String json = "{\"value\": \"15x\"}"; Gson gson = new Gson(); - GsonBoolean model = gson.fromJson(json, GsonBoolean.class); + BooleanExample model = gson.fromJson(json, BooleanExample.class); assertFalse(model.value); } // @formatter:off - static class GsonBitStringDeserializer implements JsonDeserializer { - @Override public GsonBitString deserialize( + static class GsonBitStringDeserializer implements JsonDeserializer { + @Override public ByteExample deserialize( JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { - GsonBitString gsonBitString = new GsonBitString(); - gsonBitString.value = (byte) Integer.parseInt( + ByteExample byteExample = new ByteExample(); + byteExample.value = (byte) Integer.parseInt( jsonElement.getAsJsonObject() .getAsJsonPrimitive("value") .getAsString() , 2); - return gsonBitString; + return byteExample; } } - static class GsonBitStringSerializer implements JsonSerializer { + static class GsonBitStringSerializer implements JsonSerializer { @Override public JsonElement serialize( - GsonBitString model, + ByteExample model, Type type, JsonSerializationContext jsonSerializationContext) { @@ -217,13 +217,13 @@ public class UnitTest { } } - static class GsonBoolean2ValueIntegerDeserializer implements JsonDeserializer { - @Override public GsonBoolean deserialize( + static class BooleanAs2ValueIntegerDeserializer implements JsonDeserializer { + @Override public BooleanExample deserialize( JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { - GsonBoolean model = new GsonBoolean(); + BooleanExample model = new BooleanExample(); int value = jsonElement.getAsJsonObject().getAsJsonPrimitive("value").getAsInt(); if (value == 0) { model.value = false; From e3b698620c557b51c205f13b3e12fca59c0a7c78 Mon Sep 17 00:00:00 2001 From: Javier Date: Fri, 7 Dec 2018 23:42:35 +0100 Subject: [PATCH 032/359] BAEL-2412 Add tests with all the primitive values. Remove those that weren't expected to work. --- .../primitives/models/PrimitiveBundle.java | 6 +- .../models/PrimitiveBundleInitialized.java | 21 ++++++ .../baeldung/gson/primitives/UnitTest.java | 73 ++++++++++++------- 3 files changed, 72 insertions(+), 28 deletions(-) create mode 100644 gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundleInitialized.java diff --git a/gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundle.java b/gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundle.java index 30bc4d0d9f..ad7309a2f7 100644 --- a/gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundle.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundle.java @@ -12,8 +12,8 @@ public class PrimitiveBundle { public String toString() { return "{" + "byte: " + byteValue + ", " + "short: " + shortValue + ", " - + "int: " + intValue + ", " + "long: " + longValue + ", " + "float: " - + floatValue + ", " + "double: " + doubleValue + ", " + "boolean: " - + booleanValue + ", " + "char: " + charValue + "}"; + + "int: " + intValue + ", " + "long: " + longValue + ", " + + "float: " + floatValue + ", " + "double: " + doubleValue + ", " + + "boolean: " + booleanValue + ", " + "char: " + charValue + "}"; } } diff --git a/gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundleInitialized.java b/gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundleInitialized.java new file mode 100644 index 0000000000..6fa99f4e3d --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundleInitialized.java @@ -0,0 +1,21 @@ +package org.baeldung.gson.primitives.models; + +public class PrimitiveBundleInitialized { + // @formatter:off + public byte byteValue = (byte) 1; + public short shortValue = (short) 1; + public int intValue = 1; + public long longValue = 1L; + public float floatValue = 1.0f; + public double doubleValue = 1; + public boolean booleanValue = true; + public char charValue = 'a'; + // @formatter:on + + public String toString() { + return "{" + "byte: " + byteValue + ", " + "short: " + shortValue + ", " + + "int: " + intValue + ", " + "long: " + longValue + ", " + + "float: " + floatValue + ", " + "double: " + doubleValue + ", " + + "boolean: " + booleanValue + ", " + "char: " + charValue + "}"; + } +} diff --git a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java index 87d5cbbb60..475eb42fc0 100644 --- a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java +++ b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java @@ -25,13 +25,17 @@ public class UnitTest { Gson gson = new Gson(); - String expected = "{\"byteValue\":17,\"shortValue\":3,\"intValue\":3," + "\"longValue\":3,\"floatValue\":3.5" + ",\"doubleValue\":3.5" + ",\"booleanValue\":true,\"charValue\":\"a\"}"; + String expected = "{\"byteValue\":17,\"shortValue\":3,\"intValue\":3," + + "\"longValue\":3,\"floatValue\":3.5" + ",\"doubleValue\":3.5" + + ",\"booleanValue\":true,\"charValue\":\"a\"}"; assertEquals(expected, gson.toJson(primitiveBundle)); } @Test public void fromJsonAllPrimitives() { - String json = "{\"byteValue\": 17, \"shortValue\": 3, \"intValue\": 3, " + "\"longValue\": 3, \"floatValue\": 3.5" + ", \"doubleValue\": 3.5" + ", \"booleanValue\": true, \"charValue\": \"a\"}"; + String json = "{\"byteValue\": 17, \"shortValue\": 3, \"intValue\": 3, " + + "\"longValue\": 3, \"floatValue\": 3.5" + ", \"doubleValue\": 3.5" + + ", \"booleanValue\": true, \"charValue\": \"a\"}"; Gson gson = new Gson(); PrimitiveBundle model = gson.fromJson(json, PrimitiveBundle.class); @@ -50,7 +54,8 @@ public class UnitTest { @Test public void toJsonByteToBitString() { GsonBuilder builder = new GsonBuilder(); - builder.registerTypeAdapter(ByteExample.class, new GsonBitStringSerializer()); + builder.registerTypeAdapter(ByteExample.class, + new GsonBitStringSerializer()); Gson gson = builder.create(); ByteExample model = new ByteExample(); @@ -62,7 +67,8 @@ public class UnitTest { @Test public void fromJsonByteFromBitString() { String json = "{\"value\": \"1111\"}"; GsonBuilder gsonBuilder = new GsonBuilder(); - gsonBuilder.registerTypeAdapter(ByteExample.class, new GsonBitStringDeserializer()); + gsonBuilder.registerTypeAdapter(ByteExample.class, + new GsonBitStringDeserializer()); Gson gson = gsonBuilder.create(); @@ -110,36 +116,52 @@ public class UnitTest { @Test public void fromJsonNull() { Gson gson = new Gson(); - String json = "{\"value\": null}"; - ByteExample model = gson.fromJson(json, ByteExample.class); + // @formatter:off + String json = "{\"byteValue\": null, \"shortValue\": null, " + + "\"intValue\": null, " + "\"longValue\": null, \"floatValue\": null" + + ", \"doubleValue\": null" + ", \"booleanValue\": null, \"charValue\": null}"; + // @formatter:on + PrimitiveBundleInitialized model = gson.fromJson(json, + PrimitiveBundleInitialized.class); - assertEquals(1, model.value); + assertEquals(1, model.byteValue); + assertEquals(1, model.shortValue); + assertEquals(1, model.intValue); + assertEquals(1, model.longValue); + assertEquals(1, model.floatValue, 0.0001); + assertEquals(1, model.doubleValue, 0.0001); + assertTrue(model.booleanValue); + assertEquals('a', model.charValue); } @Test(expected = JsonSyntaxException.class) public void fromJsonEmptyString() { Gson gson = new Gson(); - String json = "{\"value\": \"\"}"; - gson.fromJson(json, ByteExample.class); + // @formatter:off + String json = "{\"byteValue\": \"\", \"shortValue\": \"\", " + + "\"intValue\": \"\", " + "\"longValue\": \"\", \"floatValue\": \"\"" + + ", \"doubleValue\": \"\"" + ", \"booleanValue\": \"\", \"charValue\": \"\"}"; + // @formatter:on + gson.fromJson(json, PrimitiveBundleInitialized.class); } @Test public void fromJsonValidValueWithinString() { Gson gson = new Gson(); - String json = "{\"value\": \"15\"}"; - ByteExample model = gson.fromJson(json, ByteExample.class); + // @formatter:off + String json = "{\"byteValue\": \"15\", \"shortValue\": \"15\", " + + "\"intValue\": \"15\", " + "\"longValue\": \"15\", \"floatValue\": \"15.0\"" + + ", \"doubleValue\": \"15.0\"" + ", \"booleanValue\": \"false\", \"charValue\": \"z\"}"; + // @formatter:on + PrimitiveBundleInitialized model = gson.fromJson(json, + PrimitiveBundleInitialized.class); - assertEquals(15, model.value); - } - - @Test(expected = JsonSyntaxException.class) public void fromJsonInvalidValueWithinString() { - Gson gson = new Gson(); - String json = "{\"value\": \"15x\"}"; - gson.fromJson(json, ByteExample.class); - } - - @Test(expected = JsonSyntaxException.class) public void fromJsonInvalidValueNotInAString() { - Gson gson = new Gson(); - String json = "{\"value\": s15s}"; - gson.fromJson(json, ByteExample.class); + assertEquals(15, model.byteValue); + assertEquals(15, model.shortValue); + assertEquals(15, model.intValue); + assertEquals(15, model.longValue); + assertEquals(15, model.floatValue, 0.0001); + assertEquals(15, model.doubleValue, 0.0001); + assertFalse(model.booleanValue); + assertEquals('z', model.charValue); } @Test public void fromJsonBooleanFrom2ValueInteger() { @@ -160,7 +182,8 @@ public class UnitTest { @Test public void fromJsonBooleanFrom2ValueIntegerSolution() { String json = "{\"value\": 1}"; GsonBuilder builder = new GsonBuilder(); - builder.registerTypeAdapter(BooleanExample.class, new BooleanAs2ValueIntegerDeserializer()); + builder.registerTypeAdapter(BooleanExample.class, + new BooleanAs2ValueIntegerDeserializer()); Gson gson = builder.create(); From 84ea0625b1c59d25fc8d1bb8445ec7456a36a8e4 Mon Sep 17 00:00:00 2001 From: Emily Millard Date: Fri, 7 Dec 2018 19:25:42 -0800 Subject: [PATCH 033/359] BAEL-2324 sorting arrays --- .../com/baeldung/sort/ArraySortUnitTest.java | 118 ++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 core-java-arrays/src/test/java/com/baeldung/sort/ArraySortUnitTest.java diff --git a/core-java-arrays/src/test/java/com/baeldung/sort/ArraySortUnitTest.java b/core-java-arrays/src/test/java/com/baeldung/sort/ArraySortUnitTest.java new file mode 100644 index 0000000000..489f1848e9 --- /dev/null +++ b/core-java-arrays/src/test/java/com/baeldung/sort/ArraySortUnitTest.java @@ -0,0 +1,118 @@ +package com.baeldung.sort; + +import com.baeldung.arraycopy.model.Employee; +import org.junit.Before; +import org.junit.Test; + +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.stream.IntStream; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +public class ArraySortUnitTest { + private Employee[] employees; + private int[] numbers; + private String[] strings; + + @Before + public void setup() { + createEmployeesArray(); + createNumbersArray(); + createStringArray(); + } + + private void createEmployeesArray() { + employees = new Employee[5]; + Employee employee; + for (int i = 1; i <= employees.length; i++) { + employee = new Employee(i, "Emp" + i); + employees[i - 1] = employee; + } + Collections.shuffle(Arrays.asList(employees)); + } + + private void createNumbersArray() { + numbers = new int[]{-8, 7, 5, 9, 10, -2, 3}; + } + + private void createStringArray() { + strings = new String[]{"learning", "java", "with", "baeldung"}; + } + + @Test + public void givenIntArray_whenSortingAscending_thenCorrectlySorted() { + Arrays.sort(numbers); + + assertArrayEquals(new int[]{-8, -2, 3, 5, 7, 9, 10}, numbers); + } + + @Test + public void givenIntArray_whenSortingDescending_thenCorrectlySorted() { + numbers = IntStream.of(numbers).boxed().sorted(Comparator.reverseOrder()).mapToInt(i -> i).toArray(); + + assertArrayEquals(new int[]{10, 9, 7, 5, 3, -2, -8}, numbers); + } + + @Test + public void givenStringArray_whenSortingAscending_thenCorrectlySorted() { + Arrays.sort(strings); + + assertArrayEquals(new String[]{"baeldung", "java", "learning", "with"}, strings); + } + + @Test + public void givenStringArray_whenSortingDescending_thenCorrectlySorted() { + Arrays.sort(strings, Comparator.reverseOrder()); + + assertArrayEquals(new String[]{"with", "learning", "java", "baeldung"}, strings); + } + + @Test + public void givenObjectArray_whenSortingAscending_thenCorrectlySorted() { + Arrays.sort(employees, Comparator.comparing(Employee::getName)); + + Employee[] sorted = new Employee[]{ + new Employee(1, "Emp1"), + new Employee(2, "Emp2"), + new Employee(3, "Emp3"), + new Employee(4, "Emp4"), + new Employee(5, "Emp5") + }; + + assertEquals(sorted[0].getId(), employees[0].getId()); + } + + @Test + public void givenObjectArray_whenSortingDescending_thenCorrectlySorted() { + Arrays.sort(employees, Comparator.comparing(Employee::getName).reversed()); + + Employee[] sorted = new Employee[]{ + new Employee(5, "Emp5"), + new Employee(4, "Emp4"), + new Employee(3, "Emp3"), + new Employee(2, "Emp2"), + new Employee(1, "Emp1") + }; + + assertEquals(sorted[0].getId(), employees[0].getId()); + } + + @Test + public void givenObjectArray_whenSortingMultipleAttributesAscending_thenCorrectlySorted() { + Arrays.sort(employees, Comparator.comparing(Employee::getName).thenComparing(Employee::getId)); + + Employee[] sorted = new Employee[]{ + new Employee(1, "Emp1"), + new Employee(2, "Emp2"), + new Employee(3, "Emp3"), + new Employee(4, "Emp4"), + new Employee(5, "Emp5") + }; + + assertEquals(sorted[0].getId(), employees[0].getId()); + } + +} From d737e15c6b4db542cd4e5ff42d4ffc327f470c29 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sat, 8 Dec 2018 15:29:38 +0530 Subject: [PATCH 034/359] [BAEL-10840] - Create a libraries-apache-commons module --- libraries-apache-commons/.gitignore | 9 ++ libraries-apache-commons/README.md | 21 ++++ libraries-apache-commons/log4j.properties | 1 + libraries-apache-commons/pom.xml | 116 ++++++++++++++++++ .../baeldung/commons/beanutils/Course.java | 0 .../commons/beanutils/CourseEntity.java | 0 .../commons/beanutils/CourseService.java | 0 .../baeldung/commons/beanutils/Student.java | 0 .../chain/AbstractDenominationDispenser.java | 0 .../baeldung/commons/chain/AtmCatalog.java | 0 .../baeldung/commons/chain/AtmConstants.java | 0 .../commons/chain/AtmRequestContext.java | 0 .../commons/chain/AtmWithdrawalChain.java | 0 .../baeldung/commons/chain/AuditFilter.java | 0 .../chain/FiftyDenominationDispenser.java | 0 .../chain/HundredDenominationDispenser.java | 0 .../chain/TenDenominationDispenser.java | 0 .../commons/collectionutil/Address.java | 0 .../commons/collectionutil/Customer.java | 0 .../com/baeldung/commons/dbutils/Email.java | 0 .../baeldung/commons/dbutils/Employee.java | 0 .../commons/dbutils/EmployeeHandler.java | 0 .../com/baeldung/commons/io/FileMonitor.java | 0 .../commons/lang3/BuilderMethods.java | 0 .../commons/lang3/SampleLazyInitializer.java | 0 .../baeldung/commons/lang3/SampleObject.java | 0 .../lang3/application/Application.java | 0 .../baeldung/commons/lang3/beans/User.java | 0 .../commons/lang3/beans/UserInitializer.java | 0 .../com/baeldung/commons/math3/Histogram.java | 0 .../main/java/com/baeldung/ftp/FtpClient.java | 0 .../src/main/resources/logback.xml | 13 ++ .../CircularFifoQueueUnitTest.java | 0 .../beanutils/CourseServiceUnitTest.java | 0 .../commons/chain/AtmChainUnitTest.java | 0 .../commons/collections/BidiMapUnitTest.java | 0 .../CollectionUtilsGuideUnitTest.java | 0 .../commons/collections/MapUtilsUnitTest.java | 0 .../commons/collections/SetUtilsUnitTest.java | 0 .../orderedmap/OrderedMapUnitTest.java | 0 .../commons/collections4/BagUnitTest.java | 0 .../commons/csv/CSVReaderWriterUnitTest.java | 0 .../commons/dbutils/DbUtilsUnitTest.java | 0 .../commons/io/CommonsIOUnitTest.java | 0 .../commons/lang3/ArrayUtilsUnitTest.java | 0 .../commons/lang3/Lang3UtilsUnitTest.java | 0 .../commons/lang3/StringUtilsUnitTest.java | 0 .../lang3/test/ArrayUtilsUnitTest.java | 0 .../test/BasicThreadFactoryUnitTest.java | 0 .../lang3/test/ConstructorUtilsUnitTest.java | 0 .../lang3/test/FieldUtilsUnitTest.java | 0 .../commons/lang3/test/FractionUnitTest.java | 0 .../lang3/test/HashCodeBuilderUnitTest.java | 0 .../lang3/test/ImmutablePairUnitTest.java | 0 .../lang3/test/ImmutableTripleUnitTest.java | 0 .../lang3/test/LazyInitializerUnitTest.java | 0 .../lang3/test/MethodUtilsUnitTest.java | 0 .../lang3/test/MutableObjectUnitTest.java | 0 .../lang3/test/MutablePairUnitTest.java | 0 .../lang3/test/NumberUtilsUnitTest.java | 0 .../lang3/test/StringUtilsUnitTest.java | 0 .../lang3/test/SystemsUtilsManualTest.java | 0 .../commons/lang3/test/TripleUnitTest.java | 0 .../commons/math/ComplexUnitTest.java | 0 .../commons/math/FractionUnitTest.java | 0 .../commons/math/GeometryUnitTest.java | 0 .../commons/math/LinearAlgebraUnitTest.java | 0 .../commons/math/ProbabilitiesUnitTest.java | 0 .../commons/math/RootFindingUnitTest.java | 0 .../math/SimpsonIntegratorUnitTest.java | 0 .../commons/math/StatisticsUnitTest.java | 0 .../ftp/FtpClientIntegrationTest.java | 0 .../ftp/JdkFtpClientIntegrationTest.java | 0 .../java/com/baeldung/text/DiffUnitTest.java | 0 .../LongestCommonSubsequenceUnitTest.java | 0 .../com/baeldung/text/StrBuilderUnitTest.java | 0 .../baeldung/text/StrSubstitutorUnitTest.java | 0 .../baeldung/text/UnicodeEscaperUnitTest.java | 0 .../com/baeldung/text/WordUtilsUnitTest.java | 0 .../src/test/resources/aaa.txt | 0 .../src/test/resources/book.csv | 0 .../src/test/resources/employees.sql | 0 .../src/test/resources/fileTest.txt | 0 .../src/test/resources/ftp/baz.txt | 0 .../src/test/resources/sample.txt | 0 libraries/README.md | 19 --- libraries/pom.xml | 71 ----------- pom.xml | 1 + 88 files changed, 161 insertions(+), 90 deletions(-) create mode 100644 libraries-apache-commons/.gitignore create mode 100644 libraries-apache-commons/README.md create mode 100644 libraries-apache-commons/log4j.properties create mode 100644 libraries-apache-commons/pom.xml rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/beanutils/Course.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/beanutils/CourseEntity.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/beanutils/CourseService.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/beanutils/Student.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/chain/AbstractDenominationDispenser.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/chain/AtmCatalog.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/chain/AtmConstants.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/chain/AtmRequestContext.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/chain/AtmWithdrawalChain.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/chain/AuditFilter.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/chain/FiftyDenominationDispenser.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/chain/HundredDenominationDispenser.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/chain/TenDenominationDispenser.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/collectionutil/Address.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/collectionutil/Customer.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/dbutils/Email.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/dbutils/Employee.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/dbutils/EmployeeHandler.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/io/FileMonitor.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/lang3/BuilderMethods.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/lang3/SampleLazyInitializer.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/lang3/SampleObject.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/lang3/application/Application.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/lang3/beans/User.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/lang3/beans/UserInitializer.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/math3/Histogram.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/ftp/FtpClient.java (100%) create mode 100644 libraries-apache-commons/src/main/resources/logback.xml rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/circularfifoqueue/CircularFifoQueueUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/beanutils/CourseServiceUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/chain/AtmChainUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/collections/BidiMapUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/collections/CollectionUtilsGuideUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/collections/MapUtilsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/collections/SetUtilsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/collections4/BagUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/csv/CSVReaderWriterUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/dbutils/DbUtilsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/io/CommonsIOUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/ArrayUtilsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/Lang3UtilsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/StringUtilsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/ArrayUtilsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/BasicThreadFactoryUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/ConstructorUtilsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/FieldUtilsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/FractionUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/HashCodeBuilderUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/ImmutablePairUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/ImmutableTripleUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/LazyInitializerUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/MethodUtilsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/MutableObjectUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/MutablePairUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/NumberUtilsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/StringUtilsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/SystemsUtilsManualTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/TripleUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/math/ComplexUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/math/FractionUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/math/GeometryUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/math/LinearAlgebraUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/math/ProbabilitiesUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/math/RootFindingUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/math/SimpsonIntegratorUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/math/StatisticsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/text/DiffUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/text/LongestCommonSubsequenceUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/text/StrBuilderUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/text/StrSubstitutorUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/text/UnicodeEscaperUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/text/WordUtilsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/resources/aaa.txt (100%) rename {libraries => libraries-apache-commons}/src/test/resources/book.csv (100%) rename {libraries => libraries-apache-commons}/src/test/resources/employees.sql (100%) rename {libraries => libraries-apache-commons}/src/test/resources/fileTest.txt (100%) rename {libraries => libraries-apache-commons}/src/test/resources/ftp/baz.txt (100%) rename {libraries => libraries-apache-commons}/src/test/resources/sample.txt (100%) diff --git a/libraries-apache-commons/.gitignore b/libraries-apache-commons/.gitignore new file mode 100644 index 0000000000..e594daf27a --- /dev/null +++ b/libraries-apache-commons/.gitignore @@ -0,0 +1,9 @@ +*.class + +# Folders # +/gensrc +/target + +# Packaged files # +*.jar +/bin/ diff --git a/libraries-apache-commons/README.md b/libraries-apache-commons/README.md new file mode 100644 index 0000000000..66090e3709 --- /dev/null +++ b/libraries-apache-commons/README.md @@ -0,0 +1,21 @@ +### Relevant articles + +- [Array Processing with Apache Commons Lang 3](http://www.baeldung.com/array-processing-commons-lang) +- [String Processing with Apache Commons Lang 3](http://www.baeldung.com/string-processing-commons-lang) +- [Introduction to Apache Commons Math](http://www.baeldung.com/apache-commons-math) +- [Apache Commons Collections SetUtils](http://www.baeldung.com/apache-commons-setutils) +- [Apache Commons Collections OrderedMap](http://www.baeldung.com/apache-commons-ordered-map) +- [Introduction to Apache Commons Text](http://www.baeldung.com/java-apache-commons-text) +- [A Guide to Apache Commons DbUtils](http://www.baeldung.com/apache-commons-dbutils) +- [Guide to Apache Commons CircularFifoQueue](http://www.baeldung.com/commons-circular-fifo-queue) +- [Apache Commons Chain](http://www.baeldung.com/apache-commons-chain) +- [Introduction to Apache Commons CSV](http://www.baeldung.com/apache-commons-csv) +- [Apache Commons IO](http://www.baeldung.com/apache-commons-io) +- [Apache Commons Collections Bag](http://www.baeldung.com/apache-commons-bag) +- [A Guide to Apache Commons Collections CollectionUtils](http://www.baeldung.com/apache-commons-collection-utils) +- [Apache Commons BeanUtils](http://www.baeldung.com/apache-commons-beanutils) +- [Apache Commons Collections BidiMap](http://www.baeldung.com/commons-collections-bidi-map) +- [Apache Commons Collections MapUtils](http://www.baeldung.com/apache-commons-map-utils) +- [Histograms with Apache Commons Frequency](http://www.baeldung.com/apache-commons-frequency) +- [An Introduction to Apache Commons Lang 3](https://www.baeldung.com/java-commons-lang-3) +- [Implementing a FTP-Client in Java](http://www.baeldung.com/java-ftp-client) \ No newline at end of file diff --git a/libraries-apache-commons/log4j.properties b/libraries-apache-commons/log4j.properties new file mode 100644 index 0000000000..2173c5d96f --- /dev/null +++ b/libraries-apache-commons/log4j.properties @@ -0,0 +1 @@ +log4j.rootLogger=INFO, stdout diff --git a/libraries-apache-commons/pom.xml b/libraries-apache-commons/pom.xml new file mode 100644 index 0000000000..f61a7a4a9a --- /dev/null +++ b/libraries-apache-commons/pom.xml @@ -0,0 +1,116 @@ + + + 4.0.0 + libraries-apache-commons + libraries-apache-commons + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + + + + org.assertj + assertj-core + ${assertj.version} + + + commons-beanutils + commons-beanutils + ${commons-beanutils.version} + + + org.apache.commons + commons-lang3 + ${commons-lang.version} + + + org.apache.commons + commons-text + ${commons-text.version} + + + commons-io + commons-io + ${commons.io.version} + + + commons-chain + commons-chain + ${commons-chain.version} + + + org.apache.commons + commons-csv + ${commons-csv.version} + + + commons-dbutils + commons-dbutils + ${commons.dbutils.version} + + + org.apache.commons + commons-math3 + ${common-math3.version} + + + commons-net + commons-net + ${commons-net.version} + + + com.h2database + h2 + ${h2.version} + + + org.knowm.xchart + xchart + ${xchart-version} + + + org.apache.commons + commons-collections4 + ${commons.collections.version} + + + org.hamcrest + java-hamcrest + ${org.hamcrest.java-hamcrest.version} + test + + + org.mockftpserver + MockFtpServer + ${mockftpserver.version} + test + + + + + + 3.6 + 1.1 + 1.9.3 + 1.2 + 1.4 + 3.6.2 + 2.5 + 1.6 + 1.4.196 + 4.1 + 4.12 + 2.0.0.0 + 1.10.L001 + 3.5.2 + 3.6 + 1.3 + 3.6.1 + 2.7.1 + + + diff --git a/libraries/src/main/java/com/baeldung/commons/beanutils/Course.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/beanutils/Course.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/beanutils/Course.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/beanutils/Course.java diff --git a/libraries/src/main/java/com/baeldung/commons/beanutils/CourseEntity.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/beanutils/CourseEntity.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/beanutils/CourseEntity.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/beanutils/CourseEntity.java diff --git a/libraries/src/main/java/com/baeldung/commons/beanutils/CourseService.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/beanutils/CourseService.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/beanutils/CourseService.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/beanutils/CourseService.java diff --git a/libraries/src/main/java/com/baeldung/commons/beanutils/Student.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/beanutils/Student.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/beanutils/Student.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/beanutils/Student.java diff --git a/libraries/src/main/java/com/baeldung/commons/chain/AbstractDenominationDispenser.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/chain/AbstractDenominationDispenser.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/chain/AbstractDenominationDispenser.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/chain/AbstractDenominationDispenser.java diff --git a/libraries/src/main/java/com/baeldung/commons/chain/AtmCatalog.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/chain/AtmCatalog.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/chain/AtmCatalog.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/chain/AtmCatalog.java diff --git a/libraries/src/main/java/com/baeldung/commons/chain/AtmConstants.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/chain/AtmConstants.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/chain/AtmConstants.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/chain/AtmConstants.java diff --git a/libraries/src/main/java/com/baeldung/commons/chain/AtmRequestContext.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/chain/AtmRequestContext.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/chain/AtmRequestContext.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/chain/AtmRequestContext.java diff --git a/libraries/src/main/java/com/baeldung/commons/chain/AtmWithdrawalChain.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/chain/AtmWithdrawalChain.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/chain/AtmWithdrawalChain.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/chain/AtmWithdrawalChain.java diff --git a/libraries/src/main/java/com/baeldung/commons/chain/AuditFilter.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/chain/AuditFilter.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/chain/AuditFilter.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/chain/AuditFilter.java diff --git a/libraries/src/main/java/com/baeldung/commons/chain/FiftyDenominationDispenser.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/chain/FiftyDenominationDispenser.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/chain/FiftyDenominationDispenser.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/chain/FiftyDenominationDispenser.java diff --git a/libraries/src/main/java/com/baeldung/commons/chain/HundredDenominationDispenser.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/chain/HundredDenominationDispenser.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/chain/HundredDenominationDispenser.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/chain/HundredDenominationDispenser.java diff --git a/libraries/src/main/java/com/baeldung/commons/chain/TenDenominationDispenser.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/chain/TenDenominationDispenser.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/chain/TenDenominationDispenser.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/chain/TenDenominationDispenser.java diff --git a/libraries/src/main/java/com/baeldung/commons/collectionutil/Address.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/collectionutil/Address.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/collectionutil/Address.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/collectionutil/Address.java diff --git a/libraries/src/main/java/com/baeldung/commons/collectionutil/Customer.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/collectionutil/Customer.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/collectionutil/Customer.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/collectionutil/Customer.java diff --git a/libraries/src/main/java/com/baeldung/commons/dbutils/Email.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/dbutils/Email.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/dbutils/Email.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/dbutils/Email.java diff --git a/libraries/src/main/java/com/baeldung/commons/dbutils/Employee.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/dbutils/Employee.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/dbutils/Employee.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/dbutils/Employee.java diff --git a/libraries/src/main/java/com/baeldung/commons/dbutils/EmployeeHandler.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/dbutils/EmployeeHandler.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/dbutils/EmployeeHandler.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/dbutils/EmployeeHandler.java diff --git a/libraries/src/main/java/com/baeldung/commons/io/FileMonitor.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/io/FileMonitor.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/io/FileMonitor.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/io/FileMonitor.java diff --git a/libraries/src/main/java/com/baeldung/commons/lang3/BuilderMethods.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/lang3/BuilderMethods.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/lang3/BuilderMethods.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/lang3/BuilderMethods.java diff --git a/libraries/src/main/java/com/baeldung/commons/lang3/SampleLazyInitializer.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/lang3/SampleLazyInitializer.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/lang3/SampleLazyInitializer.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/lang3/SampleLazyInitializer.java diff --git a/libraries/src/main/java/com/baeldung/commons/lang3/SampleObject.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/lang3/SampleObject.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/lang3/SampleObject.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/lang3/SampleObject.java diff --git a/libraries/src/main/java/com/baeldung/commons/lang3/application/Application.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/lang3/application/Application.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/lang3/application/Application.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/lang3/application/Application.java diff --git a/libraries/src/main/java/com/baeldung/commons/lang3/beans/User.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/lang3/beans/User.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/lang3/beans/User.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/lang3/beans/User.java diff --git a/libraries/src/main/java/com/baeldung/commons/lang3/beans/UserInitializer.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/lang3/beans/UserInitializer.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/lang3/beans/UserInitializer.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/lang3/beans/UserInitializer.java diff --git a/libraries/src/main/java/com/baeldung/commons/math3/Histogram.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/math3/Histogram.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/math3/Histogram.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/math3/Histogram.java diff --git a/libraries/src/main/java/com/baeldung/ftp/FtpClient.java b/libraries-apache-commons/src/main/java/com/baeldung/ftp/FtpClient.java similarity index 100% rename from libraries/src/main/java/com/baeldung/ftp/FtpClient.java rename to libraries-apache-commons/src/main/java/com/baeldung/ftp/FtpClient.java diff --git a/libraries-apache-commons/src/main/resources/logback.xml b/libraries-apache-commons/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/libraries-apache-commons/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/libraries/src/test/java/com/baeldung/circularfifoqueue/CircularFifoQueueUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/circularfifoqueue/CircularFifoQueueUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/circularfifoqueue/CircularFifoQueueUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/circularfifoqueue/CircularFifoQueueUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/beanutils/CourseServiceUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/beanutils/CourseServiceUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/beanutils/CourseServiceUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/beanutils/CourseServiceUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/chain/AtmChainUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/chain/AtmChainUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/chain/AtmChainUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/chain/AtmChainUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/collections/BidiMapUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/collections/BidiMapUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/collections/BidiMapUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/collections/BidiMapUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/collections/CollectionUtilsGuideUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/collections/CollectionUtilsGuideUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/collections/CollectionUtilsGuideUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/collections/CollectionUtilsGuideUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/collections/MapUtilsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/collections/MapUtilsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/collections/MapUtilsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/collections/MapUtilsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/collections/SetUtilsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/collections/SetUtilsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/collections/SetUtilsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/collections/SetUtilsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/collections4/BagUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/collections4/BagUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/collections4/BagUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/collections4/BagUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/csv/CSVReaderWriterUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/csv/CSVReaderWriterUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/csv/CSVReaderWriterUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/csv/CSVReaderWriterUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/dbutils/DbUtilsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/dbutils/DbUtilsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/dbutils/DbUtilsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/dbutils/DbUtilsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/io/CommonsIOUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/io/CommonsIOUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/io/CommonsIOUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/io/CommonsIOUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/ArrayUtilsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/ArrayUtilsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/ArrayUtilsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/ArrayUtilsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/Lang3UtilsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/Lang3UtilsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/Lang3UtilsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/Lang3UtilsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/StringUtilsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/StringUtilsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/StringUtilsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/StringUtilsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/ArrayUtilsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/ArrayUtilsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/ArrayUtilsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/ArrayUtilsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/BasicThreadFactoryUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/BasicThreadFactoryUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/BasicThreadFactoryUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/BasicThreadFactoryUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/ConstructorUtilsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/ConstructorUtilsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/ConstructorUtilsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/ConstructorUtilsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/FieldUtilsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/FieldUtilsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/FieldUtilsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/FieldUtilsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/FractionUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/FractionUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/FractionUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/FractionUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/HashCodeBuilderUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/HashCodeBuilderUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/HashCodeBuilderUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/HashCodeBuilderUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/ImmutablePairUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/ImmutablePairUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/ImmutablePairUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/ImmutablePairUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/ImmutableTripleUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/ImmutableTripleUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/ImmutableTripleUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/ImmutableTripleUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/LazyInitializerUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/LazyInitializerUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/LazyInitializerUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/LazyInitializerUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/MethodUtilsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/MethodUtilsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/MethodUtilsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/MethodUtilsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/MutableObjectUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/MutableObjectUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/MutableObjectUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/MutableObjectUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/MutablePairUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/MutablePairUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/MutablePairUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/MutablePairUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/NumberUtilsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/NumberUtilsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/NumberUtilsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/NumberUtilsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/StringUtilsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/StringUtilsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/StringUtilsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/StringUtilsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/SystemsUtilsManualTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/SystemsUtilsManualTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/SystemsUtilsManualTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/SystemsUtilsManualTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/TripleUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/TripleUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/TripleUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/TripleUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/math/ComplexUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/math/ComplexUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/math/ComplexUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/math/ComplexUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/math/FractionUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/math/FractionUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/math/FractionUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/math/FractionUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/math/GeometryUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/math/GeometryUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/math/GeometryUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/math/GeometryUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/math/LinearAlgebraUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/math/LinearAlgebraUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/math/LinearAlgebraUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/math/LinearAlgebraUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/math/ProbabilitiesUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/math/ProbabilitiesUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/math/ProbabilitiesUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/math/ProbabilitiesUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/math/RootFindingUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/math/RootFindingUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/math/RootFindingUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/math/RootFindingUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/math/SimpsonIntegratorUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/math/SimpsonIntegratorUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/math/SimpsonIntegratorUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/math/SimpsonIntegratorUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/math/StatisticsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/math/StatisticsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/math/StatisticsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/math/StatisticsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java b/libraries-apache-commons/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java diff --git a/libraries/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java b/libraries-apache-commons/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java diff --git a/libraries/src/test/java/com/baeldung/text/DiffUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/text/DiffUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/text/DiffUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/text/DiffUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/text/LongestCommonSubsequenceUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/text/LongestCommonSubsequenceUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/text/LongestCommonSubsequenceUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/text/LongestCommonSubsequenceUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/text/StrBuilderUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/text/StrBuilderUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/text/StrBuilderUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/text/StrBuilderUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/text/StrSubstitutorUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/text/StrSubstitutorUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/text/StrSubstitutorUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/text/StrSubstitutorUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/text/UnicodeEscaperUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/text/UnicodeEscaperUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/text/UnicodeEscaperUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/text/UnicodeEscaperUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/text/WordUtilsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/text/WordUtilsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/text/WordUtilsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/text/WordUtilsUnitTest.java diff --git a/libraries/src/test/resources/aaa.txt b/libraries-apache-commons/src/test/resources/aaa.txt similarity index 100% rename from libraries/src/test/resources/aaa.txt rename to libraries-apache-commons/src/test/resources/aaa.txt diff --git a/libraries/src/test/resources/book.csv b/libraries-apache-commons/src/test/resources/book.csv similarity index 100% rename from libraries/src/test/resources/book.csv rename to libraries-apache-commons/src/test/resources/book.csv diff --git a/libraries/src/test/resources/employees.sql b/libraries-apache-commons/src/test/resources/employees.sql similarity index 100% rename from libraries/src/test/resources/employees.sql rename to libraries-apache-commons/src/test/resources/employees.sql diff --git a/libraries/src/test/resources/fileTest.txt b/libraries-apache-commons/src/test/resources/fileTest.txt similarity index 100% rename from libraries/src/test/resources/fileTest.txt rename to libraries-apache-commons/src/test/resources/fileTest.txt diff --git a/libraries/src/test/resources/ftp/baz.txt b/libraries-apache-commons/src/test/resources/ftp/baz.txt similarity index 100% rename from libraries/src/test/resources/ftp/baz.txt rename to libraries-apache-commons/src/test/resources/ftp/baz.txt diff --git a/libraries/src/test/resources/sample.txt b/libraries-apache-commons/src/test/resources/sample.txt similarity index 100% rename from libraries/src/test/resources/sample.txt rename to libraries-apache-commons/src/test/resources/sample.txt diff --git a/libraries/README.md b/libraries/README.md index 851e3a3d17..28184c161b 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -1,40 +1,29 @@ ### Relevant articles - [Intro to Jasypt](http://www.baeldung.com/jasypt) -- [Array Processing with Apache Commons Lang 3](http://www.baeldung.com/array-processing-commons-lang) -- [String Processing with Apache Commons Lang 3](http://www.baeldung.com/string-processing-commons-lang) - [Introduction to Javatuples](http://www.baeldung.com/java-tuples) - [Introduction to Javassist](http://www.baeldung.com/javassist) - [Introduction to Apache Flink with Java](http://www.baeldung.com/apache-flink) - [Introduction to JSONassert](http://www.baeldung.com/jsonassert) - [Intro to JaVers](http://www.baeldung.com/javers) -- [Introduction to Apache Commons Math](http://www.baeldung.com/apache-commons-math) - [Intro to Serenity BDD](http://www.baeldung.com/serenity-bdd) - [Merging Streams in Java](http://www.baeldung.com/java-merge-streams) - [Serenity BDD and Screenplay](http://www.baeldung.com/serenity-screenplay) - [Introduction to Quartz](http://www.baeldung.com/quartz) - [How to Warm Up the JVM](http://www.baeldung.com/java-jvm-warmup) -- [Apache Commons Collections SetUtils](http://www.baeldung.com/apache-commons-setutils) - [Software Transactional Memory in Java Using Multiverse](http://www.baeldung.com/java-multiverse-stm) - [Serenity BDD with Spring and JBehave](http://www.baeldung.com/serenity-spring-jbehave) - [Locality-Sensitive Hashing in Java Using Java-LSH](http://www.baeldung.com/locality-sensitive-hashing) -- [Apache Commons Collections OrderedMap](http://www.baeldung.com/apache-commons-ordered-map) -- [Introduction to Apache Commons Text](http://www.baeldung.com/java-apache-commons-text) -- [A Guide to Apache Commons DbUtils](http://www.baeldung.com/apache-commons-dbutils) - [Introduction to Awaitility](http://www.baeldung.com/awaitlity-testing) - [Guide to the HyperLogLog Algorithm](http://www.baeldung.com/java-hyperloglog) - [Introduction to Neuroph](http://www.baeldung.com/neuroph) -- [Guide to Apache Commons CircularFifoQueue](http://www.baeldung.com/commons-circular-fifo-queue) - [Quick Guide to RSS with Rome](http://www.baeldung.com/rome-rss) - [Introduction to NoException](http://www.baeldung.com/introduction-to-noexception) - [Introduction to PCollections](http://www.baeldung.com/java-pcollections) - [Introduction to Hoverfly in Java](http://www.baeldung.com/hoverfly) -- [Apache Commons Chain](http://www.baeldung.com/apache-commons-chain) - [Introduction to Eclipse Collections](http://www.baeldung.com/eclipse-collections) - [DistinctBy in Java Stream API](http://www.baeldung.com/java-streams-distinct-by) -- [Introduction to Apache Commons CSV](http://www.baeldung.com/apache-commons-csv) - [Introduction to NoException](http://www.baeldung.com/no-exception) -- [Apache Commons IO](http://www.baeldung.com/apache-commons-io) - [Introduction to Conflict-Free Replicated Data Types](http://www.baeldung.com/java-conflict-free-replicated-data-types) - [Introduction to javax.measure](http://www.baeldung.com/javax-measure) - [Spring Yarg Integration](http://www.baeldung.com/spring-yarg) @@ -44,7 +33,6 @@ - [Introduction to MBassador](http://www.baeldung.com/mbassador) - [Introduction to Retrofit](http://www.baeldung.com/retrofit) - [Using Pairs in Java](http://www.baeldung.com/java-pairs) -- [Apache Commons Collections Bag](http://www.baeldung.com/apache-commons-bag) - [Introduction to Caffeine](http://www.baeldung.com/java-caching-caffeine) - [Introduction to Chronicle Queue](http://www.baeldung.com/java-chronicle-queue) - [Introduction To Docx4J](http://www.baeldung.com/docx4j) @@ -62,26 +50,19 @@ - [Introduction to OpenCSV](http://www.baeldung.com/opencsv) - [A Guide to Unirest](http://www.baeldung.com/unirest) - [Introduction to Akka Actors in Java](http://www.baeldung.com/akka-actors-java) -- [A Guide to Apache Commons Collections CollectionUtils](http://www.baeldung.com/apache-commons-collection-utils) - [A Guide to Byte Buddy](http://www.baeldung.com/byte-buddy) - [Introduction to jOOL](http://www.baeldung.com/jool) - [Consumer Driven Contracts with Pact](http://www.baeldung.com/pact-junit-consumer-driven-contracts) -- [Apache Commons BeanUtils](http://www.baeldung.com/apache-commons-beanutils) -- [Apache Commons Collections BidiMap](http://www.baeldung.com/commons-collections-bidi-map) - [Introduction to Atlassian Fugue](http://www.baeldung.com/java-fugue) - [Publish and Receive Messages with Nats Java Client](http://www.baeldung.com/nats-java-client) - [Java Concurrency Utility with JCTools](http://www.baeldung.com/java-concurrency-jc-tools) -- [Apache Commons Collections MapUtils](http://www.baeldung.com/apache-commons-map-utils) - [Creating REST Microservices with Javalin](http://www.baeldung.com/javalin-rest-microservices) - [Introduction to JavaPoet](http://www.baeldung.com/java-poet) - [Introduction to Joda-Time](http://www.baeldung.com/joda-time) -- [Implementing a FTP-Client in Java](http://www.baeldung.com/java-ftp-client) - [Convert String to Date in Java](http://www.baeldung.com/java-string-to-date) -- [Histograms with Apache Commons Frequency](http://www.baeldung.com/apache-commons-frequency) - [Guide to Resilience4j](http://www.baeldung.com/resilience4j) - [Parsing YAML with SnakeYAML](http://www.baeldung.com/java-snake-yaml) - [Guide to JMapper](http://www.baeldung.com/jmapper) -- [An Introduction to Apache Commons Lang 3](https://www.baeldung.com/java-commons-lang-3) - [Exactly Once Processing in Kafka](https://www.baeldung.com/kafka-exactly-once) - [An Introduction to SuanShu](https://www.baeldung.com/suanshu) diff --git a/libraries/pom.xml b/libraries/pom.xml index fb1f1cd1b6..eb0bc58225 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -50,31 +50,16 @@ opencsv ${opencsv.version} - - commons-beanutils - commons-beanutils - ${commons-beanutils.version} - org.apache.commons commons-lang3 ${commons-lang.version} - - org.apache.commons - commons-text - ${commons-text.version} - tec.units unit-ri ${unit-ri.version} - - org.apache.commons - commons-collections4 - ${commons.collections.version} - org.jasypt jasypt @@ -134,32 +119,6 @@ - - commons-io - commons-io - ${commons.io.version} - - - commons-chain - commons-chain - ${commons-chain.version} - - - org.apache.commons - commons-csv - ${commons-csv.version} - - - commons-dbutils - commons-dbutils - ${commons.dbutils.version} - - - - org.apache.commons - commons-math3 - ${common-math3.version} - net.serenity-bdd serenity-core @@ -675,24 +634,6 @@ resilience4j-timelimiter ${resilience4j.version} - - org.knowm.xchart - xchart - ${xchart-version} - - - - commons-net - commons-net - ${commons-net.version} - - - org.mockftpserver - MockFtpServer - ${mockftpserver.version} - test - - com.squareup javapoet @@ -854,10 +795,6 @@ 0.7.0 3.2.7 3.6 - 1.1 - 1.9.3 - 1.2 - 1.4 1.9.2 1.2 3.21.0-GA @@ -865,13 +802,10 @@ 1.5.0 3.1.0 4.5.3 - 2.5 - 1.6 1.4.196 1.0 4.5.3 - 2.5 2.8.5 2.92 1.9.26 @@ -879,7 +813,6 @@ 1.9.0 1.9.27 1.1.0 - 4.1 4.12 0.10 3.5.0 @@ -917,13 +850,9 @@ 2.1.2 2.5.11 0.12.1 - 3.5.2 - 3.6 - 2.7.1 1.10.0 1.3 0.8.1 - 3.6.1 3.2.0-m7 5.1.1 5.0.2 diff --git a/pom.xml b/pom.xml index 4a1db4a937..44a844b6ee 100644 --- a/pom.xml +++ b/pom.xml @@ -982,6 +982,7 @@ libraries-data + libraries-apache-commons linkrest logging-modules/log-mdc logging-modules/log4j From bc1a22babc5496e9ca115af4eda30908f3424431 Mon Sep 17 00:00:00 2001 From: Javier Date: Wed, 12 Dec 2018 05:46:16 +0100 Subject: [PATCH 035/359] BAEL-2412 Remove custom serializer and deserializer for converting byte into a string of bits. --- .../baeldung/gson/primitives/UnitTest.java | 53 ------------------- 1 file changed, 53 deletions(-) diff --git a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java index 475eb42fc0..2189e990ba 100644 --- a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java +++ b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java @@ -52,31 +52,6 @@ public class UnitTest { // @formatter:on } - @Test public void toJsonByteToBitString() { - GsonBuilder builder = new GsonBuilder(); - builder.registerTypeAdapter(ByteExample.class, - new GsonBitStringSerializer()); - - Gson gson = builder.create(); - ByteExample model = new ByteExample(); - model.value = (byte) 0b1111; - - assertEquals("{\"value\":\"1111\"}", gson.toJson(model)); - } - - @Test public void fromJsonByteFromBitString() { - String json = "{\"value\": \"1111\"}"; - GsonBuilder gsonBuilder = new GsonBuilder(); - gsonBuilder.registerTypeAdapter(ByteExample.class, - new GsonBitStringDeserializer()); - - Gson gson = gsonBuilder.create(); - - ByteExample model = gson.fromJson(json, ByteExample.class); - - assertEquals(15, model.value); - } - @Test public void fromJsonPrecissionMismatch() { String json = "{\"value\": 12.123456789123456}"; Gson gson = new Gson(); @@ -212,34 +187,6 @@ public class UnitTest { } // @formatter:off - static class GsonBitStringDeserializer implements JsonDeserializer { - @Override public ByteExample deserialize( - JsonElement jsonElement, - Type type, - JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { - - ByteExample byteExample = new ByteExample(); - byteExample.value = (byte) Integer.parseInt( - jsonElement.getAsJsonObject() - .getAsJsonPrimitive("value") - .getAsString() - , 2); - return byteExample; - } - } - - static class GsonBitStringSerializer implements JsonSerializer { - @Override public JsonElement serialize( - ByteExample model, - Type type, - JsonSerializationContext jsonSerializationContext) { - - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("value", Integer.toBinaryString(model.value)); - return jsonObject; - } - } - static class BooleanAs2ValueIntegerDeserializer implements JsonDeserializer { @Override public BooleanExample deserialize( JsonElement jsonElement, From 24bd4644ff64f5c00bc6ef1b6db2773ec3ff9bf8 Mon Sep 17 00:00:00 2001 From: Javier Date: Wed, 12 Dec 2018 06:00:53 +0100 Subject: [PATCH 036/359] BAEL-2412 Add example of deserialization of a double whose precission is too high. --- .../gson/primitives/models/DoubleExample.java | 9 +++++++++ .../java/org/baeldung/gson/primitives/UnitTest.java | 12 ++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 gson/src/main/java/org/baeldung/gson/primitives/models/DoubleExample.java diff --git a/gson/src/main/java/org/baeldung/gson/primitives/models/DoubleExample.java b/gson/src/main/java/org/baeldung/gson/primitives/models/DoubleExample.java new file mode 100644 index 0000000000..5022b6a11e --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/DoubleExample.java @@ -0,0 +1,9 @@ +package org.baeldung.gson.primitives.models; + +public class DoubleExample { + public double value; + + public String toString() { + return "{float: " + value + "}"; + } +} diff --git a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java index 2189e990ba..4ee1e67c8e 100644 --- a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java +++ b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java @@ -53,12 +53,20 @@ public class UnitTest { } @Test public void fromJsonPrecissionMismatch() { - String json = "{\"value\": 12.123456789123456}"; + String json = "{\"value\": 12.123425589123456}"; Gson gson = new Gson(); FloatExample model = gson.fromJson(json, FloatExample.class); - assertEquals(12.123457f, model.value, 0.000001); + assertEquals(12.123426f, model.value, 0.000001); } + @Test public void fromJsonPrecissionMismatchForDouble() { + String json = "{\"value\": 12.123425589123556}"; + Gson gson = new Gson(); + DoubleExample model = gson.fromJson(json, DoubleExample.class); + assertEquals(12.123425589124f, model.value, 0.000001); + } + + @Test public void fromJsonOverflow() { Gson gson = new Gson(); String json = "{\"value\": \"300\"}"; From 089162e91c9b820cad6bbd87a8eb1601a19d785e Mon Sep 17 00:00:00 2001 From: Javier Date: Wed, 12 Dec 2018 06:12:12 +0100 Subject: [PATCH 037/359] BAEL-2412 Add new code examples when deserializing real numbers to discrete number types. --- .../gson/primitives/models/LongExample.java | 9 ++++++++ .../baeldung/gson/primitives/UnitTest.java | 23 ++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 gson/src/main/java/org/baeldung/gson/primitives/models/LongExample.java diff --git a/gson/src/main/java/org/baeldung/gson/primitives/models/LongExample.java b/gson/src/main/java/org/baeldung/gson/primitives/models/LongExample.java new file mode 100644 index 0000000000..e709650789 --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/LongExample.java @@ -0,0 +1,9 @@ +package org.baeldung.gson.primitives.models; + +public class LongExample { + public long value = 1; + + public String toString() { + return "{byte: " + value + "}"; + } +} diff --git a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java index 4ee1e67c8e..335b844214 100644 --- a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java +++ b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java @@ -75,7 +75,7 @@ public class UnitTest { assertEquals(44, model.value); } - @Test public void fromJsonNonCompatibleNumberTypes() { + @Test public void fromJsonRealToByte() { Gson gson = new Gson(); String json = "{\"value\": 2.3}"; try { @@ -89,6 +89,27 @@ public class UnitTest { fail(); } + @Test public void fromJsonRealToLong() { + Gson gson = new Gson(); + String json = "{\"value\": 2.3}"; + try { + gson.fromJson(json, LongExample.class); + } catch (Exception ex) { + assertTrue(ex instanceof JsonSyntaxException); + assertTrue(ex.getCause() instanceof NumberFormatException); + return; + } + + fail(); + } + + @Test public void fromJsonRealToLongEndingIn0() { + Gson gson = new Gson(); + String json = "{\"value\": 2.0}"; + LongExample model = gson.fromJson(json, LongExample.class); + assertEquals(2, model.value); + } + @Test public void fromJsonUnicodeChar() { Gson gson = new Gson(); String json = "{\"value\": \"\\u00AE\"}"; From f69d154862bed3ebd5a47e1873b4f03a94bfddfb Mon Sep 17 00:00:00 2001 From: Javier Date: Wed, 12 Dec 2018 06:27:36 +0100 Subject: [PATCH 038/359] BAEL-2412 New example showing that the empty string can be deserialized into a char. --- .../java/org/baeldung/gson/primitives/UnitTest.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java index 335b844214..8581f07a65 100644 --- a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java +++ b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java @@ -143,11 +143,21 @@ public class UnitTest { // @formatter:off String json = "{\"byteValue\": \"\", \"shortValue\": \"\", " + "\"intValue\": \"\", " + "\"longValue\": \"\", \"floatValue\": \"\"" - + ", \"doubleValue\": \"\"" + ", \"booleanValue\": \"\", \"charValue\": \"\"}"; + + ", \"doubleValue\": \"\"" + ", \"booleanValue\": \"\"}"; // @formatter:on gson.fromJson(json, PrimitiveBundleInitialized.class); } + @Test public void fromJsonEmptyStringToChar() { + Gson gson = new Gson(); + // @formatter:off + String json = "{\"charValue\": \"\"}"; + // @formatter:on + CharExample model = gson.fromJson(json, CharExample.class); + + assertEquals(Character.MIN_VALUE, model.value); + } + @Test public void fromJsonValidValueWithinString() { Gson gson = new Gson(); // @formatter:off From 366cb9a0bc8cc91d23f24e25e19d09d8e071805a Mon Sep 17 00:00:00 2001 From: Javier Date: Wed, 12 Dec 2018 06:41:39 +0100 Subject: [PATCH 039/359] BAEL-2412 Add limit values when dealing with floats (min, max, NaN). --- .../primitives/models/LimitValuesExample.java | 6 ++++++ .../baeldung/gson/primitives/UnitTest.java | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 gson/src/main/java/org/baeldung/gson/primitives/models/LimitValuesExample.java diff --git a/gson/src/main/java/org/baeldung/gson/primitives/models/LimitValuesExample.java b/gson/src/main/java/org/baeldung/gson/primitives/models/LimitValuesExample.java new file mode 100644 index 0000000000..4960a98834 --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/LimitValuesExample.java @@ -0,0 +1,6 @@ +package org.baeldung.gson.primitives.models; + +public class LimitValuesExample { + public float minValue; + public float maxValue; +} diff --git a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java index 8581f07a65..95314d4d43 100644 --- a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java +++ b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java @@ -32,6 +32,25 @@ public class UnitTest { assertEquals(expected, gson.toJson(primitiveBundle)); } + @Test public void toJsonLimitValues() { + LimitValuesExample model = new LimitValuesExample(); + model.minValue = Float.MIN_VALUE; + model.maxValue = Float.MAX_VALUE; + + Gson gson = new Gson(); + + String expected = "{\"minValue\":1.4E-45,\"maxValue\":3.4028235E38}"; + assertEquals(expected, gson.toJson(model)); + } + + @Test(expected = IllegalArgumentException.class) public void toJsonNaN() { + FloatExample model = new FloatExample(); + model.value = Float.NaN; + + Gson gson = new Gson(); + gson.toJson(model); + } + @Test public void fromJsonAllPrimitives() { String json = "{\"byteValue\": 17, \"shortValue\": 3, \"intValue\": 3, " + "\"longValue\": 3, \"floatValue\": 3.5" + ", \"doubleValue\": 3.5" From 99dd82d2ff8f307fe4cf2bd7ae6b3c7c78b25e52 Mon Sep 17 00:00:00 2001 From: geroza Date: Tue, 11 Dec 2018 12:17:29 -0200 Subject: [PATCH 040/359] Migrated modules to parent-boot-2 usign spring-boot 2.1: spring-mvc-forms-thymeleaf spring-rest spring-rest-angular spring-rest-query-language spring-rest-shell spring-rest-simple spring-rest-template spring-resttemplate spring-security-mvc-boot spring-security-openid spring-security-sso spring-security-thymeleaf --- spring-mvc-forms-thymeleaf/pom.xml | 4 +-- spring-rest-angular/pom.xml | 4 +-- .../org/baeldung/web/main/Application.java | 4 +-- .../StudentServiceIntegrationTest.java | 34 +++++++++++-------- spring-rest-query-language/pom.xml | 4 +-- spring-rest-shell/pom.xml | 4 +-- spring-rest-simple/pom.xml | 4 +-- spring-rest-template/pom.xml | 4 +-- spring-rest/pom.xml | 4 +-- .../lists/client/EmployeeClient.java | 8 ++--- .../advice/JsonpControllerAdvice.java | 13 ------- ...pplication.java => UploadApplication.java} | 4 +-- .../SpringContextIntegrationTest.java | 2 +- spring-resttemplate/pom.xml | 4 +-- spring-security-mvc-boot/pom.xml | 6 ++-- .../src/main/resources/templates/private.html | 2 +- spring-security-openid/pom.xml | 4 +-- ...mple.properties => application.properties} | 0 spring-security-sso/pom.xml | 6 ++-- .../spring-security-sso-ui-2/pom.xml | 2 +- .../spring-security-sso-ui/pom.xml | 2 +- spring-security-thymeleaf/pom.xml | 6 ++-- 22 files changed, 58 insertions(+), 67 deletions(-) delete mode 100644 spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/advice/JsonpControllerAdvice.java rename spring-rest/src/main/java/com/baeldung/web/upload/app/{Application.java => UploadApplication.java} (79%) rename spring-security-openid/src/main/resources/{application.properties.sample.properties => application.properties} (100%) diff --git a/spring-mvc-forms-thymeleaf/pom.xml b/spring-mvc-forms-thymeleaf/pom.xml index 67a2696c8a..504ad1dcb2 100644 --- a/spring-mvc-forms-thymeleaf/pom.xml +++ b/spring-mvc-forms-thymeleaf/pom.xml @@ -9,10 +9,10 @@ spring forms examples using thymeleaf - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 diff --git a/spring-rest-angular/pom.xml b/spring-rest-angular/pom.xml index 22ddabb4ea..5240ae24e7 100644 --- a/spring-rest-angular/pom.xml +++ b/spring-rest-angular/pom.xml @@ -8,10 +8,10 @@ war - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 diff --git a/spring-rest-angular/src/main/java/org/baeldung/web/main/Application.java b/spring-rest-angular/src/main/java/org/baeldung/web/main/Application.java index d6fe719311..fd10643c53 100644 --- a/spring-rest-angular/src/main/java/org/baeldung/web/main/Application.java +++ b/spring-rest-angular/src/main/java/org/baeldung/web/main/Application.java @@ -6,12 +6,12 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; import org.springframework.web.filter.ShallowEtagHeaderFilter; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @SpringBootApplication @EnableAutoConfiguration @Import(PersistenceConfig.class) -public class Application extends WebMvcConfigurerAdapter { +public class Application implements WebMvcConfigurer { public static void main(String[] args) { SpringApplication.run(Application.class, args); diff --git a/spring-rest-angular/src/test/java/org/baeldung/web/service/StudentServiceIntegrationTest.java b/spring-rest-angular/src/test/java/org/baeldung/web/service/StudentServiceIntegrationTest.java index 4d65c02fff..1473d44b92 100644 --- a/spring-rest-angular/src/test/java/org/baeldung/web/service/StudentServiceIntegrationTest.java +++ b/spring-rest-angular/src/test/java/org/baeldung/web/service/StudentServiceIntegrationTest.java @@ -1,62 +1,66 @@ package org.baeldung.web.service; +import static io.restassured.RestAssured.given; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsCollectionContaining.hasItems; +import static org.hamcrest.core.IsEqual.equalTo; + import org.apache.commons.lang3.RandomStringUtils; import org.baeldung.web.main.Application; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.web.server.LocalServerPort; import org.springframework.test.context.junit4.SpringRunner; -import static io.restassured.RestAssured.given; -import static org.hamcrest.core.Is.is; -import static org.hamcrest.core.IsCollectionContaining.hasItems; -import static org.hamcrest.core.IsEqual.equalTo; - @RunWith(SpringRunner.class) -@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT) +@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.RANDOM_PORT) public class StudentServiceIntegrationTest { + + @LocalServerPort + int port; - private static final String ENDPOINT = "http://localhost:8080/student/get"; + private static final String ENDPOINT = "http://localhost:%s/student/get"; @Test public void givenRequestForStudents_whenPageIsOne_expectContainsNames() { - given().params("page", "0", "size", "2").get(ENDPOINT).then().assertThat() + given().params("page", "0", "size", "2").get(String.format(ENDPOINT, port)).then().assertThat() .body("content.name", hasItems("Bryan", "Ben")); } @Test public void givenRequestForStudents_whenSizeIsTwo_expectTwoItems() { - given().params("page", "0", "size", "2").get(ENDPOINT).then().assertThat().body("size", equalTo(2)); + given().params("page", "0", "size", "2").get(String.format(ENDPOINT, port)).then().assertThat().body("size", equalTo(2)); } @Test public void givenRequestForStudents_whenSizeIsTwo_expectNumberOfElementsTwo() { - given().params("page", "0", "size", "2").get(ENDPOINT).then().assertThat().body("numberOfElements", equalTo(2)); + given().params("page", "0", "size", "2").get(String.format(ENDPOINT, port)).then().assertThat().body("numberOfElements", equalTo(2)); } @Test public void givenRequestForStudents_whenResourcesAreRetrievedPaged_thenExpect200() { - given().params("page", "0", "size", "2").get(ENDPOINT).then().statusCode(200); + given().params("page", "0", "size", "2").get(String.format(ENDPOINT, port)).then().statusCode(200); } @Test public void givenRequestForStudents_whenPageOfResourcesAreRetrievedOutOfBounds_thenExpect500() { - given().params("page", "1000", "size", "2").get(ENDPOINT).then().statusCode(500); + given().params("page", "1000", "size", "2").get(String.format(ENDPOINT, port)).then().statusCode(500); } @Test public void givenRequestForStudents_whenPageNotValid_thenExpect500() { - given().params("page", RandomStringUtils.randomNumeric(5), "size", "2").get(ENDPOINT).then().statusCode(500); + given().params("page", RandomStringUtils.randomNumeric(5), "size", "2").get(String.format(ENDPOINT, port)).then().statusCode(500); } @Test public void givenRequestForStudents_whenPageSizeIsFive_expectFiveItems() { - given().params("page", "0", "size", "5").get(ENDPOINT).then().body("content.size()", is(5)); + given().params("page", "0", "size", "5").get(String.format(ENDPOINT, port)).then().body("content.size()", is(5)); } @Test public void givenResourcesExist_whenFirstPageIsRetrieved_thenPageContainsResources() { - given().params("page", "0", "size", "2").get(ENDPOINT).then().assertThat().body("first", equalTo(true)); + given().params("page", "0", "size", "2").get(String.format(ENDPOINT, port)).then().assertThat().body("first", equalTo(true)); } } diff --git a/spring-rest-query-language/pom.xml b/spring-rest-query-language/pom.xml index 6f790f1f48..70fea91f31 100644 --- a/spring-rest-query-language/pom.xml +++ b/spring-rest-query-language/pom.xml @@ -7,10 +7,10 @@ war - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 diff --git a/spring-rest-shell/pom.xml b/spring-rest-shell/pom.xml index 8b7ce1770d..540b3d08eb 100644 --- a/spring-rest-shell/pom.xml +++ b/spring-rest-shell/pom.xml @@ -8,10 +8,10 @@ A simple project to demonstrate Spring REST Shell features. - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 diff --git a/spring-rest-simple/pom.xml b/spring-rest-simple/pom.xml index e5de463999..d301957eb9 100644 --- a/spring-rest-simple/pom.xml +++ b/spring-rest-simple/pom.xml @@ -8,10 +8,10 @@ war - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 diff --git a/spring-rest-template/pom.xml b/spring-rest-template/pom.xml index d86e208987..fa93308cf5 100644 --- a/spring-rest-template/pom.xml +++ b/spring-rest-template/pom.xml @@ -8,10 +8,10 @@ jar - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 diff --git a/spring-rest/pom.xml b/spring-rest/pom.xml index ea4cfc26d7..5c88697cef 100644 --- a/spring-rest/pom.xml +++ b/spring-rest/pom.xml @@ -7,10 +7,10 @@ war - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 diff --git a/spring-rest/src/main/java/com/baeldung/resttemplate/lists/client/EmployeeClient.java b/spring-rest/src/main/java/com/baeldung/resttemplate/lists/client/EmployeeClient.java index d811045733..191719b084 100644 --- a/spring-rest/src/main/java/com/baeldung/resttemplate/lists/client/EmployeeClient.java +++ b/spring-rest/src/main/java/com/baeldung/resttemplate/lists/client/EmployeeClient.java @@ -43,7 +43,7 @@ public class EmployeeClient ResponseEntity> response = restTemplate.exchange( - "http://localhost:8080/spring-rest/employees/", + "http://localhost:8082/spring-rest/employees/", HttpMethod.GET, null, new ParameterizedTypeReference>(){}); @@ -61,7 +61,7 @@ public class EmployeeClient EmployeeList response = restTemplate.getForObject( - "http://localhost:8080/spring-rest/employees/v2", + "http://localhost:8082/spring-rest/employees/v2", EmployeeList.class); List employees = response.getEmployees(); @@ -80,7 +80,7 @@ public class EmployeeClient newEmployees.add(new Employee(4, "CEO")); restTemplate.postForObject( - "http://localhost:8080/spring-rest/employees/", + "http://localhost:8082/spring-rest/employees/", newEmployees, ResponseEntity.class); } @@ -94,7 +94,7 @@ public class EmployeeClient newEmployees.add(new Employee(4, "CEO")); restTemplate.postForObject( - "http://localhost:8080/spring-rest/employees/v2/", + "http://localhost:8082/spring-rest/employees/v2/", new EmployeeList(newEmployees), ResponseEntity.class); } diff --git a/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/advice/JsonpControllerAdvice.java b/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/advice/JsonpControllerAdvice.java deleted file mode 100644 index 853e417d46..0000000000 --- a/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/advice/JsonpControllerAdvice.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.sampleapp.web.controller.advice; - -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.servlet.mvc.method.annotation.AbstractJsonpResponseBodyAdvice; - -@ControllerAdvice -public class JsonpControllerAdvice extends AbstractJsonpResponseBodyAdvice { - - public JsonpControllerAdvice() { - super("callback"); - } - -} diff --git a/spring-rest/src/main/java/com/baeldung/web/upload/app/Application.java b/spring-rest/src/main/java/com/baeldung/web/upload/app/UploadApplication.java similarity index 79% rename from spring-rest/src/main/java/com/baeldung/web/upload/app/Application.java rename to spring-rest/src/main/java/com/baeldung/web/upload/app/UploadApplication.java index d6821196eb..f3b1c0dc6f 100644 --- a/spring-rest/src/main/java/com/baeldung/web/upload/app/Application.java +++ b/spring-rest/src/main/java/com/baeldung/web/upload/app/UploadApplication.java @@ -9,9 +9,9 @@ import org.springframework.context.annotation.ComponentScan; @EnableAutoConfiguration @ComponentScan("com.baeldung.web.upload") @SpringBootApplication -public class Application extends SpringBootServletInitializer { +public class UploadApplication extends SpringBootServletInitializer { public static void main(final String[] args) { - SpringApplication.run(Application.class, args); + SpringApplication.run(UploadApplication.class, args); } } \ No newline at end of file diff --git a/spring-rest/src/test/java/com/baeldung/SpringContextIntegrationTest.java b/spring-rest/src/test/java/com/baeldung/SpringContextIntegrationTest.java index e659897303..f04106c1e1 100644 --- a/spring-rest/src/test/java/com/baeldung/SpringContextIntegrationTest.java +++ b/spring-rest/src/test/java/com/baeldung/SpringContextIntegrationTest.java @@ -14,7 +14,7 @@ import com.baeldung.web.log.app.Application; @RunWith(SpringRunner.class) @SpringBootTest(classes = { CustomApplication.class, ImageApplication.class, PropertyEditorApplication.class, - ResponseHeadersApplication.class, Application.class, com.baeldung.web.upload.app.Application.class, + ResponseHeadersApplication.class, Application.class, com.baeldung.web.upload.app.UploadApplication.class, MainApplication.class}) public class SpringContextIntegrationTest { diff --git a/spring-resttemplate/pom.xml b/spring-resttemplate/pom.xml index 2c404a7e8c..9a0978f120 100644 --- a/spring-resttemplate/pom.xml +++ b/spring-resttemplate/pom.xml @@ -8,10 +8,10 @@ war - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 diff --git a/spring-security-mvc-boot/pom.xml b/spring-security-mvc-boot/pom.xml index c072bf0f99..0a40b0b324 100644 --- a/spring-security-mvc-boot/pom.xml +++ b/spring-security-mvc-boot/pom.xml @@ -11,10 +11,10 @@ Spring Security MVC Boot - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 @@ -36,7 +36,7 @@ org.thymeleaf.extras - thymeleaf-extras-springsecurity4 + thymeleaf-extras-springsecurity5 org.springframework.boot diff --git a/spring-security-mvc-boot/src/main/resources/templates/private.html b/spring-security-mvc-boot/src/main/resources/templates/private.html index 5af8c7a13e..035d84bbbd 100644 --- a/spring-security-mvc-boot/src/main/resources/templates/private.html +++ b/spring-security-mvc-boot/src/main/resources/templates/private.html @@ -1,6 +1,6 @@ + xmlns:sec="http://www.thymeleaf.org/extras/spring-security"> Private diff --git a/spring-security-openid/pom.xml b/spring-security-openid/pom.xml index 6a946792ba..4343996e02 100644 --- a/spring-security-openid/pom.xml +++ b/spring-security-openid/pom.xml @@ -9,10 +9,10 @@ Spring OpenID sample project - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 diff --git a/spring-security-openid/src/main/resources/application.properties.sample.properties b/spring-security-openid/src/main/resources/application.properties similarity index 100% rename from spring-security-openid/src/main/resources/application.properties.sample.properties rename to spring-security-openid/src/main/resources/application.properties diff --git a/spring-security-sso/pom.xml b/spring-security-sso/pom.xml index 4deab01464..4b297a91b5 100644 --- a/spring-security-sso/pom.xml +++ b/spring-security-sso/pom.xml @@ -9,10 +9,10 @@ pom - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 @@ -24,7 +24,7 @@ 3.1.0 2.3.3.RELEASE - 2.0.1.RELEASE + 2.1.1.RELEASE diff --git a/spring-security-sso/spring-security-sso-ui-2/pom.xml b/spring-security-sso/spring-security-sso-ui-2/pom.xml index 1f9a5754ae..e4ccb82fea 100644 --- a/spring-security-sso/spring-security-sso-ui-2/pom.xml +++ b/spring-security-sso/spring-security-sso-ui-2/pom.xml @@ -37,7 +37,7 @@ org.thymeleaf.extras - thymeleaf-extras-springsecurity4 + thymeleaf-extras-springsecurity5 diff --git a/spring-security-sso/spring-security-sso-ui/pom.xml b/spring-security-sso/spring-security-sso-ui/pom.xml index 56131749ba..a946db4c3b 100644 --- a/spring-security-sso/spring-security-sso-ui/pom.xml +++ b/spring-security-sso/spring-security-sso-ui/pom.xml @@ -38,7 +38,7 @@ org.thymeleaf.extras - thymeleaf-extras-springsecurity4 + thymeleaf-extras-springsecurity5 diff --git a/spring-security-thymeleaf/pom.xml b/spring-security-thymeleaf/pom.xml index 314783ebf2..d8b476683a 100644 --- a/spring-security-thymeleaf/pom.xml +++ b/spring-security-thymeleaf/pom.xml @@ -11,10 +11,10 @@ Spring Security with Thymeleaf tutorial - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 @@ -43,7 +43,7 @@ org.thymeleaf.extras - thymeleaf-extras-springsecurity4 + thymeleaf-extras-springsecurity5 From 9ee33c151f8110c21027954deb50944f869ca030 Mon Sep 17 00:00:00 2001 From: geroza Date: Tue, 11 Dec 2018 20:39:09 -0200 Subject: [PATCH 041/359] migrated modules to parent-boot-2 with spring-boot 2.1: spring-session/spring-session-jdbc spring-vault spring-webflux-amqp vaadin vavr --- spring-session/spring-session-jdbc/pom.xml | 4 +-- spring-vault/pom.xml | 25 +++---------------- spring-webflux-amqp/pom.xml | 4 +-- .../src/main/resources/application.yml | 2 +- vaadin/pom.xml | 4 +-- .../src/main/resources/application.properties | 2 ++ vavr/pom.xml | 4 +-- 7 files changed, 14 insertions(+), 31 deletions(-) create mode 100644 vaadin/src/main/resources/application.properties diff --git a/spring-session/spring-session-jdbc/pom.xml b/spring-session/spring-session-jdbc/pom.xml index a595a94914..ce6b5f5908 100644 --- a/spring-session/spring-session-jdbc/pom.xml +++ b/spring-session/spring-session-jdbc/pom.xml @@ -15,10 +15,10 @@ - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-2.0-temp + ../../parent-boot-2 diff --git a/spring-vault/pom.xml b/spring-vault/pom.xml index 6a7db5dd71..aad6da1cc3 100644 --- a/spring-vault/pom.xml +++ b/spring-vault/pom.xml @@ -13,10 +13,10 @@ Spring Vault sample project - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 @@ -41,27 +41,8 @@ - - - - org.springframework.boot - spring-boot-maven-plugin - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - - **/*IntegrationTest.java - - - - - - UTF-8 - 2.0.1.RELEASE + 2.1.1.RELEASE diff --git a/spring-webflux-amqp/pom.xml b/spring-webflux-amqp/pom.xml index e4e0d55ce3..4faa165c50 100755 --- a/spring-webflux-amqp/pom.xml +++ b/spring-webflux-amqp/pom.xml @@ -11,10 +11,10 @@ Spring WebFlux AMQP Sample - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 diff --git a/spring-webflux-amqp/src/main/resources/application.yml b/spring-webflux-amqp/src/main/resources/application.yml index 3f527ce4c5..702aaba357 100755 --- a/spring-webflux-amqp/src/main/resources/application.yml +++ b/spring-webflux-amqp/src/main/resources/application.yml @@ -1,6 +1,6 @@ spring: rabbitmq: - host: 192.168.99.100 + host: localhost port: 5672 username: guest password: guest diff --git a/vaadin/pom.xml b/vaadin/pom.xml index 1111c0aa0c..c34ffa3636 100644 --- a/vaadin/pom.xml +++ b/vaadin/pom.xml @@ -10,10 +10,10 @@ Vaadin - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 diff --git a/vaadin/src/main/resources/application.properties b/vaadin/src/main/resources/application.properties new file mode 100644 index 0000000000..1cb7086b82 --- /dev/null +++ b/vaadin/src/main/resources/application.properties @@ -0,0 +1,2 @@ +#Vaadin supports spring-boot 2.1 properly from V8 onwards (according to this comment https://github.com/vaadin/spring/issues/331#issuecomment-435128475) +spring.main.allow-bean-definition-overriding=true \ No newline at end of file diff --git a/vavr/pom.xml b/vavr/pom.xml index fa8eff1ce7..ae495e9830 100644 --- a/vavr/pom.xml +++ b/vavr/pom.xml @@ -7,10 +7,10 @@ vavr - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 From 2e6a5a35106f15c17187f886c8db2b58f0e260c4 Mon Sep 17 00:00:00 2001 From: amdegregorio Date: Wed, 12 Dec 2018 06:32:57 -0500 Subject: [PATCH 042/359] removed eval article code --- hexagonal-architecture/.gitignore | 1 - hexagonal-architecture/pom.xml | 14 ----- .../com/baeldung/hexagonal/Application.java | 26 -------- .../baeldung/hexagonal/domain/Employee.java | 60 ------------------- .../hexagonal/domain/EmployeeService.java | 25 -------- .../hexagonal/output/EmployeeCsvWriter.java | 59 ------------------ .../hexagonal/output/EmployeeLogger.java | 17 ------ .../hexagonal/output/EmployeeOutput.java | 9 --- .../hexagonal/storage/EmployeeRepository.java | 13 ---- .../storage/InMemoryEmployeeRepository.java | 31 ---------- .../ui/EmployeeConsoleInputImpl.java | 43 ------------- .../baeldung/hexagonal/ui/EmployeeInput.java | 7 --- 12 files changed, 305 deletions(-) delete mode 100644 hexagonal-architecture/.gitignore delete mode 100644 hexagonal-architecture/pom.xml delete mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/Application.java delete mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java delete mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/EmployeeService.java delete mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java delete mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeLogger.java delete mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeOutput.java delete mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/EmployeeRepository.java delete mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/InMemoryEmployeeRepository.java delete mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java delete mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeInput.java diff --git a/hexagonal-architecture/.gitignore b/hexagonal-architecture/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/hexagonal-architecture/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/hexagonal-architecture/pom.xml b/hexagonal-architecture/pom.xml deleted file mode 100644 index d184576705..0000000000 --- a/hexagonal-architecture/pom.xml +++ /dev/null @@ -1,14 +0,0 @@ - - 4.0.0 - com.baeldung.hexagonal - hexagonal-architecture - jar - hexagonal-architecture - - com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../parent-java - - diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/Application.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/Application.java deleted file mode 100644 index 237b664708..0000000000 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/Application.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.baeldung.hexagonal; - -import java.io.File; - -import com.baeldung.hexagonal.domain.EmployeeService; -import com.baeldung.hexagonal.output.EmployeeCsvWriter; -import com.baeldung.hexagonal.output.EmployeeLogger; -import com.baeldung.hexagonal.output.EmployeeOutput; -import com.baeldung.hexagonal.storage.EmployeeRepository; -import com.baeldung.hexagonal.storage.InMemoryEmployeeRepository; -import com.baeldung.hexagonal.ui.EmployeeConsoleInputImpl; -import com.baeldung.hexagonal.ui.EmployeeInput; - -public class Application { - - public static void main(String[] args) { - EmployeeRepository repository = new InMemoryEmployeeRepository(); - EmployeeOutput output = new EmployeeLogger(); - EmployeeOutput csvOutput = new EmployeeCsvWriter(new File(".").getAbsolutePath(), "output.csv"); - EmployeeService service = new EmployeeService(repository, csvOutput); - EmployeeInput ui = new EmployeeConsoleInputImpl(); - ui.collectData(service); - service.generateOutput(); - } - -} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java deleted file mode 100644 index 0d883995b6..0000000000 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.baeldung.hexagonal.domain; - -public class Employee { - private Long id; - private String name; - - public Employee(Long id, String name) { - this.id = id; - this.name = name; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @Override - public String toString() { - return "Employee [id=" + id + ", name=" + name + "]"; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((id == null) ? 0 : id.hashCode()); - result = prime * result + ((name == null) ? 0 : name.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Employee other = (Employee) obj; - if (id == null) { - if (other.id != null) { - return false; - } - } else if (!id.equals(other.id)) { - return false; - } - - return true; - } - -} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/EmployeeService.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/EmployeeService.java deleted file mode 100644 index 2ab3ce9712..0000000000 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/EmployeeService.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.hexagonal.domain; - -import java.util.List; - -import com.baeldung.hexagonal.output.EmployeeOutput; -import com.baeldung.hexagonal.storage.EmployeeRepository; - -public class EmployeeService { - private EmployeeRepository employeeRepository; - private EmployeeOutput employeeOutput; - - public EmployeeService(EmployeeRepository employeeRepository, EmployeeOutput employeeOutput) { - this.employeeRepository = employeeRepository; - this.employeeOutput = employeeOutput; - } - - public Long add(Employee employee) { - return employeeRepository.save(employee); - } - - public void generateOutput() { - List employees = employeeRepository.findAll(); - employeeOutput.writeAll(employees); - } -} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java deleted file mode 100644 index 799fbc28ba..0000000000 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.baeldung.hexagonal.output; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.util.Iterator; -import java.util.List; - -import com.baeldung.hexagonal.domain.Employee; - -public class EmployeeCsvWriter implements EmployeeOutput { - private File outputFile; - - public EmployeeCsvWriter(String path, String fileName) throws IllegalArgumentException { - if (fileName == null || path == null || fileName.length() == 0 || path.length() == 0) { - throw new IllegalArgumentException("Path and FileName are required"); - } else if (!fileName.endsWith(".csv")) { - throw new IllegalArgumentException("File name must be a .csv file"); - } - - System.out.println(path); - if (!path.endsWith("/")) { - path += "/"; - } - - outputFile = new File(path, fileName); - } - - @Override - public void writeAll(List employees) { - BufferedWriter writer = null; - - try { - writer = new BufferedWriter(new FileWriter(outputFile)); - for (Iterator it = employees.iterator(); it.hasNext();) { - Employee emp = it.next(); - StringBuffer empLine = new StringBuffer(); - empLine.append(emp.getId()); - empLine.append(","); - empLine.append(emp.getName()); - writer.newLine(); - } - writer.flush(); - } catch (IOException ioe) { - // handle the exception - } finally { - if (writer != null) { - try { - writer.close(); - } catch (IOException e) { - // handle the exception - } - } - } - - } - -} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeLogger.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeLogger.java deleted file mode 100644 index 5272d18961..0000000000 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeLogger.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.hexagonal.output; - -import java.util.List; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.baeldung.hexagonal.domain.Employee; - -public class EmployeeLogger implements EmployeeOutput { - private static final Logger LOG = LoggerFactory.getLogger(EmployeeLogger.class); - - @Override - public void writeAll(List employees) { - employees.forEach(employee -> LOG.info(employee.toString())); - } - -} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeOutput.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeOutput.java deleted file mode 100644 index 979c06e1f4..0000000000 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeOutput.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.baeldung.hexagonal.output; - -import java.util.List; - -import com.baeldung.hexagonal.domain.Employee; - -public interface EmployeeOutput { - public void writeAll(List employees); -} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/EmployeeRepository.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/EmployeeRepository.java deleted file mode 100644 index 2787601998..0000000000 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/EmployeeRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.hexagonal.storage; - -import java.util.List; - -import com.baeldung.hexagonal.domain.Employee; - -public interface EmployeeRepository { - public Long save(Employee employee); - - public Employee findById(Long id); - - public List findAll(); -} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/InMemoryEmployeeRepository.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/InMemoryEmployeeRepository.java deleted file mode 100644 index e860c16462..0000000000 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/InMemoryEmployeeRepository.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.baeldung.hexagonal.storage; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import com.baeldung.hexagonal.domain.Employee; - -public class InMemoryEmployeeRepository implements EmployeeRepository { - private static Map employees = new HashMap<>(); - - @Override - public Long save(Employee employee) { - Long id = employee.getId(); - employees.put(id, employee); - return id; - } - - @Override - public Employee findById(Long id) { - return employees.get(id); - } - - @Override - public List findAll() { - List all = new ArrayList(employees.values()); - return all; - } - -} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java deleted file mode 100644 index 77453da48f..0000000000 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.baeldung.hexagonal.ui; - -import java.util.Scanner; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.baeldung.hexagonal.domain.Employee; -import com.baeldung.hexagonal.domain.EmployeeService; - -public class EmployeeConsoleInputImpl implements EmployeeInput { - private static final Logger LOG = LoggerFactory.getLogger(EmployeeConsoleInputImpl.class); - - public void enterEmployee(EmployeeService service, Scanner scanner) { - LOG.info("ID: "); - System.out.print("> "); - Long id = scanner.nextLong(); - LOG.info("Name: "); - System.out.print("> "); - String name = scanner.next(); - - Employee employee = new Employee(id, name); - service.add(employee); - } - - @Override - public void collectData(EmployeeService service) { - try (final Scanner scanner = new Scanner(System.in)) { - String keepGoing = "Y"; - do { - LOG.info("Enter information for an employee"); - enterEmployee(service, scanner); - LOG.info("Do you want to enter another employee? (Y/N)"); - System.out.print("> "); - keepGoing = scanner.next(); - if (keepGoing.length() > 1) { - keepGoing = keepGoing.substring(0, 1); - } - } while (keepGoing.equalsIgnoreCase("Y")); - } - } - -} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeInput.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeInput.java deleted file mode 100644 index adec2852cd..0000000000 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeInput.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.baeldung.hexagonal.ui; - -import com.baeldung.hexagonal.domain.EmployeeService; - -public interface EmployeeInput { - void collectData(EmployeeService service); -} From 1ad6d9c8720e94d87fdc74617326da4c216acd19 Mon Sep 17 00:00:00 2001 From: geroza Date: Wed, 12 Dec 2018 10:26:07 -0200 Subject: [PATCH 043/359] Deleted temporary parent-boot module using spring-boot 2.0.x --- parent-boot-2.0-temp/README.md | 2 - parent-boot-2.0-temp/pom.xml | 85 ---------------------------------- pom.xml | 6 --- 3 files changed, 93 deletions(-) delete mode 100644 parent-boot-2.0-temp/README.md delete mode 100644 parent-boot-2.0-temp/pom.xml diff --git a/parent-boot-2.0-temp/README.md b/parent-boot-2.0-temp/README.md deleted file mode 100644 index 8134c8eafe..0000000000 --- a/parent-boot-2.0-temp/README.md +++ /dev/null @@ -1,2 +0,0 @@ -This pom will be ued only temporary until we migrate parent-boot-2 to 2.1.0 for ticket BAEL-10354 - diff --git a/parent-boot-2.0-temp/pom.xml b/parent-boot-2.0-temp/pom.xml deleted file mode 100644 index 9284e4af13..0000000000 --- a/parent-boot-2.0-temp/pom.xml +++ /dev/null @@ -1,85 +0,0 @@ - - 4.0.0 - parent-boot-2.0-temp - 0.0.1-SNAPSHOT - pom - Temporary Parent for all Spring Boot 2.0.x modules - - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - - - - io.rest-assured - rest-assured - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - ${spring-boot.version} - - ${start-class} - - - - - - - - - - thin-jar - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.springframework.boot.experimental - spring-boot-thin-layout - ${thin.version} - - - - - - - - - - 3.1.0 - - 1.0.11.RELEASE - 2.0.5.RELEASE - - - - diff --git a/pom.xml b/pom.xml index 4e1e61961e..f6a56c895d 100644 --- a/pom.xml +++ b/pom.xml @@ -324,7 +324,6 @@ parent-boot-1 parent-boot-2 - parent-boot-2.0-temp parent-spring-4 parent-spring-5 parent-java @@ -592,7 +591,6 @@ parent-boot-1 parent-boot-2 - parent-boot-2.0-temp parent-spring-4 parent-spring-5 parent-java @@ -987,7 +985,6 @@ parent-boot-1 parent-boot-2 - parent-boot-2.0-temp parent-spring-4 parent-spring-5 parent-java @@ -1038,7 +1035,6 @@ parent-boot-1 parent-boot-2 - parent-boot-2.0-temp parent-spring-4 parent-spring-5 parent-java @@ -1302,7 +1298,6 @@ parent-boot-1 parent-boot-2 - parent-boot-2.0-temp parent-spring-4 parent-spring-5 parent-java @@ -1538,7 +1533,6 @@ parent-boot-1 parent-boot-2 - parent-boot-2.0-temp parent-spring-4 parent-spring-5 parent-java From c52862fdd42d370f6a9ac923cb9a43ad2a29696d Mon Sep 17 00:00:00 2001 From: mherbaghinyan Date: Thu, 13 Dec 2018 17:23:25 +0400 Subject: [PATCH 044/359] Vector class JMH --- .../baeldung/performance/ArrayListBenchmark.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) 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 index dddd85007d..5c3f7531e3 100644 --- a/core-java-collections/src/main/java/com/baeldung/performance/ArrayListBenchmark.java +++ b/core-java-collections/src/main/java/com/baeldung/performance/ArrayListBenchmark.java @@ -17,6 +17,7 @@ public class ArrayListBenchmark { public static class MyState { List employeeList = new ArrayList<>(); + Vector employeeVector = new Vector<>(); //LinkedList employeeList = new LinkedList<>(); long iterations = 100000; @@ -29,9 +30,11 @@ public class ArrayListBenchmark { public void setUp() { for (long i = 0; i < iterations; i++) { employeeList.add(new Employee(i, "John")); + employeeVector.add(new Employee(i, "John")); } employeeList.add(employee); + employeeVector.add(employee); employeeIndex = employeeList.indexOf(employee); } } @@ -55,16 +58,20 @@ public class ArrayListBenchmark { public Employee testGet(ArrayListBenchmark.MyState state) { return state.employeeList.get(state.employeeIndex); } + @Benchmark + public Employee testVectorGet(ArrayListBenchmark.MyState state) { + return state.employeeVector.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")); -// } + @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() From 28de875e872e9cbfa6b4aec6bc9e9af4394be35c Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Thu, 13 Dec 2018 20:23:55 +0100 Subject: [PATCH 045/359] added link --- rxjava-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/rxjava-2/README.md b/rxjava-2/README.md index f9528bb1d5..d0bdeec684 100644 --- a/rxjava-2/README.md +++ b/rxjava-2/README.md @@ -6,3 +6,4 @@ - [RxJava Maybe](http://www.baeldung.com/rxjava-maybe) - [Introduction to RxRelay for RxJava](http://www.baeldung.com/rx-relay) - [Combining RxJava Completables](https://www.baeldung.com/rxjava-completable) +- [Converting Synchronous and Asynchronous APIs to Observables using RxJava2](https://www.baeldung.com/rxjava-apis-to-observables) From 291abe3dee5284140df5a2c0ede606c2737d2b8a Mon Sep 17 00:00:00 2001 From: Ger Roza Date: Fri, 14 Dec 2018 09:02:17 -0200 Subject: [PATCH 046/359] change in README just to kick off a Travis build --- spring-mvc-forms-thymeleaf/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-mvc-forms-thymeleaf/README.md b/spring-mvc-forms-thymeleaf/README.md index f0f7e35a98..22f12afbca 100644 --- a/spring-mvc-forms-thymeleaf/README.md +++ b/spring-mvc-forms-thymeleaf/README.md @@ -2,3 +2,4 @@ - [Session Attributes in Spring MVC](http://www.baeldung.com/spring-mvc-session-attributes) - [Binding a List in Thymeleaf](http://www.baeldung.com/thymeleaf-list) + From 78096d4712cc03256324557606137b0528ad854b Mon Sep 17 00:00:00 2001 From: Javier Date: Fri, 14 Dec 2018 20:21:50 +0100 Subject: [PATCH 047/359] BAEL-2412 Change test for min and max values by negative and positive infinity. --- .../gson/primitives/models/InfinityValuesExample.java | 6 ++++++ .../gson/primitives/models/LimitValuesExample.java | 6 ------ .../java/org/baeldung/gson/primitives/UnitTest.java | 11 +++++------ 3 files changed, 11 insertions(+), 12 deletions(-) create mode 100644 gson/src/main/java/org/baeldung/gson/primitives/models/InfinityValuesExample.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/models/LimitValuesExample.java diff --git a/gson/src/main/java/org/baeldung/gson/primitives/models/InfinityValuesExample.java b/gson/src/main/java/org/baeldung/gson/primitives/models/InfinityValuesExample.java new file mode 100644 index 0000000000..163b0a3d95 --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/InfinityValuesExample.java @@ -0,0 +1,6 @@ +package org.baeldung.gson.primitives.models; + +public class InfinityValuesExample { + public float negativeInfinity; + public float positiveInfinity; +} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/models/LimitValuesExample.java b/gson/src/main/java/org/baeldung/gson/primitives/models/LimitValuesExample.java deleted file mode 100644 index 4960a98834..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/models/LimitValuesExample.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.baeldung.gson.primitives.models; - -public class LimitValuesExample { - public float minValue; - public float maxValue; -} diff --git a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java index 95314d4d43..d77476517d 100644 --- a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java +++ b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java @@ -32,15 +32,14 @@ public class UnitTest { assertEquals(expected, gson.toJson(primitiveBundle)); } - @Test public void toJsonLimitValues() { - LimitValuesExample model = new LimitValuesExample(); - model.minValue = Float.MIN_VALUE; - model.maxValue = Float.MAX_VALUE; + @Test(expected = IllegalArgumentException.class) public void toJsonInfinity() { + InfinityValuesExample model = new InfinityValuesExample(); + model.negativeInfinity = Float.NEGATIVE_INFINITY; + model.positiveInfinity = Float.POSITIVE_INFINITY; Gson gson = new Gson(); - String expected = "{\"minValue\":1.4E-45,\"maxValue\":3.4028235E38}"; - assertEquals(expected, gson.toJson(model)); + gson.toJson(model); } @Test(expected = IllegalArgumentException.class) public void toJsonNaN() { From bdc8b066a5f6d4ab53a4c5a1665cf9ffe8d2d026 Mon Sep 17 00:00:00 2001 From: Javier Date: Fri, 14 Dec 2018 20:29:48 +0100 Subject: [PATCH 048/359] BAEL-2412 Remove boolean and char fields from some of the examples. --- .../primitives/models/PrimitiveBundleInitialized.java | 5 +---- .../test/java/org/baeldung/gson/primitives/UnitTest.java | 8 ++------ 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundleInitialized.java b/gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundleInitialized.java index 6fa99f4e3d..2780f7fd18 100644 --- a/gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundleInitialized.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundleInitialized.java @@ -8,14 +8,11 @@ public class PrimitiveBundleInitialized { public long longValue = 1L; public float floatValue = 1.0f; public double doubleValue = 1; - public boolean booleanValue = true; - public char charValue = 'a'; // @formatter:on public String toString() { return "{" + "byte: " + byteValue + ", " + "short: " + shortValue + ", " + "int: " + intValue + ", " + "long: " + longValue + ", " - + "float: " + floatValue + ", " + "double: " + doubleValue + ", " - + "boolean: " + booleanValue + ", " + "char: " + charValue + "}"; + + "float: " + floatValue + ", " + "double: " + doubleValue + "}"; } } diff --git a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java index d77476517d..f952ae5b92 100644 --- a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java +++ b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java @@ -141,7 +141,7 @@ public class UnitTest { // @formatter:off String json = "{\"byteValue\": null, \"shortValue\": null, " + "\"intValue\": null, " + "\"longValue\": null, \"floatValue\": null" - + ", \"doubleValue\": null" + ", \"booleanValue\": null, \"charValue\": null}"; + + ", \"doubleValue\": null}"; // @formatter:on PrimitiveBundleInitialized model = gson.fromJson(json, PrimitiveBundleInitialized.class); @@ -152,8 +152,6 @@ public class UnitTest { assertEquals(1, model.longValue); assertEquals(1, model.floatValue, 0.0001); assertEquals(1, model.doubleValue, 0.0001); - assertTrue(model.booleanValue); - assertEquals('a', model.charValue); } @Test(expected = JsonSyntaxException.class) public void fromJsonEmptyString() { @@ -181,7 +179,7 @@ public class UnitTest { // @formatter:off String json = "{\"byteValue\": \"15\", \"shortValue\": \"15\", " + "\"intValue\": \"15\", " + "\"longValue\": \"15\", \"floatValue\": \"15.0\"" - + ", \"doubleValue\": \"15.0\"" + ", \"booleanValue\": \"false\", \"charValue\": \"z\"}"; + + ", \"doubleValue\": \"15.0\"}"; // @formatter:on PrimitiveBundleInitialized model = gson.fromJson(json, PrimitiveBundleInitialized.class); @@ -192,8 +190,6 @@ public class UnitTest { assertEquals(15, model.longValue); assertEquals(15, model.floatValue, 0.0001); assertEquals(15, model.doubleValue, 0.0001); - assertFalse(model.booleanValue); - assertEquals('z', model.charValue); } @Test public void fromJsonBooleanFrom2ValueInteger() { From dc46da61064f8bde322f1210790aee48875c0312 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Sat, 15 Dec 2018 05:04:19 +0800 Subject: [PATCH 049/359] Update README.md --- spring-mvc-xml/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-mvc-xml/README.md b/spring-mvc-xml/README.md index 442a533d1b..3199118281 100644 --- a/spring-mvc-xml/README.md +++ b/spring-mvc-xml/README.md @@ -8,7 +8,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: -- [Spring MVC Tutorial](http://www.baeldung.com/spring-mvc-tutorial) - [Servlet Session Timeout](http://www.baeldung.com/servlet-session-timeout) - [Returning Image/Media Data with Spring MVC](http://www.baeldung.com/spring-mvc-image-media-data) - [Geolocation by IP in Java](http://www.baeldung.com/geolocation-by-ip-with-maxmind) From 4b388e986ad0d76a440937bc4adc67dce0bde839 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Sat, 15 Dec 2018 05:05:17 +0800 Subject: [PATCH 050/359] Update README.md --- deeplearning4j/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deeplearning4j/README.md b/deeplearning4j/README.md index 7f9c92ec73..14e585cd97 100644 --- a/deeplearning4j/README.md +++ b/deeplearning4j/README.md @@ -2,4 +2,4 @@ This is a sample project for the [deeplearning4j](https://deeplearning4j.org) library. ### Relevant Articles: -- [A Guide to deeplearning4j](http://www.baeldung.com/deeplearning4j) +- [A Guide to Deeplearning4j](http://www.baeldung.com/deeplearning4j) From a7d6bb8e09738c5b11d3c2902e814d1243af1500 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Sat, 15 Dec 2018 05:06:10 +0800 Subject: [PATCH 051/359] Update README.md --- persistence-modules/spring-hibernate-5/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence-modules/spring-hibernate-5/README.md b/persistence-modules/spring-hibernate-5/README.md index b4d73708c3..75d23f7532 100644 --- a/persistence-modules/spring-hibernate-5/README.md +++ b/persistence-modules/spring-hibernate-5/README.md @@ -1,6 +1,6 @@ ### Relevant articles -- [Guide to @Immutable Annotation in Hibernate](http://www.baeldung.com/hibernate-immutable) +- [@Immutable in Hibernate](http://www.baeldung.com/hibernate-immutable) - [Hibernate Many to Many Annotation Tutorial](http://www.baeldung.com/hibernate-many-to-many) - [Programmatic Transactions in the Spring TestContext Framework](http://www.baeldung.com/spring-test-programmatic-transactions) - [Hibernate Criteria Queries](http://www.baeldung.com/hibernate-criteria-queries) From 4ecc955bd44fc4da4a10d1fbe1c50ebf57503248 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Sat, 15 Dec 2018 05:08:04 +0800 Subject: [PATCH 052/359] Update README.md --- spring-4/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-4/README.md b/spring-4/README.md index 4600a603ef..402557eb41 100644 --- a/spring-4/README.md +++ b/spring-4/README.md @@ -1,4 +1,3 @@ ### Relevant Articles: -- [Guide to Flips For Spring](http://www.baeldung.com/guide-to-flips-for-spring/) - [A Guide to Flips for Spring](http://www.baeldung.com/flips-spring) - [Configuring a Hikari Connection Pool with Spring Boot](https://www.baeldung.com/spring-boot-hikari) From 5ec6c03d94d4400de44aad85e7f14d35be0b7134 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Sat, 15 Dec 2018 05:08:41 +0800 Subject: [PATCH 053/359] Update README.md --- flips/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/flips/README.md b/flips/README.md index 0c62173b6a..7d843af9ea 100644 --- a/flips/README.md +++ b/flips/README.md @@ -1,2 +1 @@ ### Relevant Articles: -- [Guide to Flips For Spring](http://www.baeldung.com/guide-to-flips-for-spring/) From ac7af751a63529de7ede59a8bcfa3d535929100e Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Sat, 15 Dec 2018 05:11:31 +0800 Subject: [PATCH 054/359] Update README.md --- spring-security-rest/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-security-rest/README.md b/spring-security-rest/README.md index d9b6a760b2..e3124516ae 100644 --- a/spring-security-rest/README.md +++ b/spring-security-rest/README.md @@ -15,6 +15,5 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com - [Spring Security Context Propagation with @Async](http://www.baeldung.com/spring-security-async-principal-propagation) - [Servlet 3 Async Support with Spring MVC and Spring Security](http://www.baeldung.com/spring-mvc-async-security) - [Intro to Spring Security Expressions](http://www.baeldung.com/spring-security-expressions) -- [Spring Security Expressions - hasRole Example](http://www.baeldung.com/spring-security-expressions-basic) - [Error Handling for REST with Spring 3](http://www.baeldung.com/2013/01/31/exception-handling-for-rest-with-spring-3-2/) - [Spring Security for a REST API](http://www.baeldung.com/securing-a-restful-web-service-with-spring-security) From cb055db7f6902a8153a1fd8cb6205c04ef39def2 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Sat, 15 Dec 2018 05:12:54 +0800 Subject: [PATCH 055/359] Update README.md --- spring-rest-full/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-rest-full/README.md b/spring-rest-full/README.md index a5d72372f7..d429e17671 100644 --- a/spring-rest-full/README.md +++ b/spring-rest-full/README.md @@ -19,7 +19,7 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com - [Bootstrap a Web Application with Spring 4](http://www.baeldung.com/bootstraping-a-web-application-with-spring-and-java-based-configuration) - [Build a REST API with Spring and Java Config](http://www.baeldung.com/building-a-restful-web-service-with-spring-and-java-based-configuration) - [Error Handling for REST with Spring](http://www.baeldung.com/exception-handling-for-rest-with-spring) - +- [Spring Security Expressions - hasRole Example](https://www.baeldung.com/spring-security-expressions-basic) ### Build the Project From ac2ad2256ab6706dc8e1b1aa2dc676bbcc0af043 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Sat, 15 Dec 2018 05:15:30 +0800 Subject: [PATCH 056/359] Update README.md --- spring-security-rest/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-security-rest/README.md b/spring-security-rest/README.md index e3124516ae..c396948a59 100644 --- a/spring-security-rest/README.md +++ b/spring-security-rest/README.md @@ -15,5 +15,5 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com - [Spring Security Context Propagation with @Async](http://www.baeldung.com/spring-security-async-principal-propagation) - [Servlet 3 Async Support with Spring MVC and Spring Security](http://www.baeldung.com/spring-mvc-async-security) - [Intro to Spring Security Expressions](http://www.baeldung.com/spring-security-expressions) -- [Error Handling for REST with Spring 3](http://www.baeldung.com/2013/01/31/exception-handling-for-rest-with-spring-3-2/) +- [Error Handling for REST with Spring](https://www.baeldung.com/exception-handling-for-rest-with-spring) - [Spring Security for a REST API](http://www.baeldung.com/securing-a-restful-web-service-with-spring-security) From c9539281107a0944aa553a3297dba93540f9a9f2 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Sat, 15 Dec 2018 05:16:47 +0800 Subject: [PATCH 057/359] Update README.md --- spring-session/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-session/README.md b/spring-session/README.md index 30f70996cf..505d043e75 100644 --- a/spring-session/README.md +++ b/spring-session/README.md @@ -3,5 +3,5 @@ ## Spring Session Examples ### Relevant Articles: -- [Introduction to Spring Session](http://www.baeldung.com/spring-session) -- [Spring Session with JDBC](http://www.baeldung.com/spring-session-jdbc) +- [Guide to Spring Session](https://www.baeldung.com/spring-session) +- [Spring Session with JDBC](https://www.baeldung.com/spring-session-jdbc) From f74383407b6f3f332816a2c7da920f42b887a721 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Sat, 15 Dec 2018 05:17:36 +0800 Subject: [PATCH 058/359] Update README.md --- core-java-concurrency/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-concurrency/README.md b/core-java-concurrency/README.md index 682c9b8ef0..2db7b91cde 100644 --- a/core-java-concurrency/README.md +++ b/core-java-concurrency/README.md @@ -26,7 +26,6 @@ - [ExecutorService - Waiting for Threads to Finish](http://www.baeldung.com/java-executor-wait-for-threads) - [wait and notify() Methods in Java](http://www.baeldung.com/java-wait-notify) - [Priority-based Job Scheduling in Java](http://www.baeldung.com/java-priority-job-schedule) -- [A Custom Spring SecurityConfigurer](http://www.baeldung.com/spring-security-custom-configurer) - [Life Cycle of a Thread in Java](http://www.baeldung.com/java-thread-lifecycle) - [Runnable vs. Callable in Java](http://www.baeldung.com/java-runnable-callable) - [Brief Introduction to Java Thread.yield()](https://www.baeldung.com/java-thread-yield) From e117d81aa06a89b830bf10ab6f334ce1fdf7f759 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Sat, 15 Dec 2018 05:18:38 +0800 Subject: [PATCH 059/359] Update README.md --- jhipster/jhipster-monolithic/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/jhipster/jhipster-monolithic/README.md b/jhipster/jhipster-monolithic/README.md index d321e9e81e..a2c267b74d 100644 --- a/jhipster/jhipster-monolithic/README.md +++ b/jhipster/jhipster-monolithic/README.md @@ -1,7 +1,5 @@ ### Relevant articles -- [Intro to JHipster](http://www.baeldung.com/jhipster) - # baeldung This application was generated using JHipster 4.0.8, you can find documentation and help at [https://jhipster.github.io/documentation-archive/v4.0.8](https://jhipster.github.io/documentation-archive/v4.0.8). From d8290433f871749a6b086375b0c249e4c236d7f0 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Sat, 15 Dec 2018 05:23:51 +0800 Subject: [PATCH 060/359] Update README.md --- persistence-modules/java-jdbi/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/persistence-modules/java-jdbi/README.md b/persistence-modules/java-jdbi/README.md index 3bab6faa29..7d843af9ea 100644 --- a/persistence-modules/java-jdbi/README.md +++ b/persistence-modules/java-jdbi/README.md @@ -1,2 +1 @@ ### Relevant Articles: -- [Guide to CockroachDB in Java](http://www.baeldung.com/cockroachdb-java) From 78d4c3d618776bb48f9bc122a6f7ef3fb0a913a1 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Sat, 15 Dec 2018 05:25:09 +0800 Subject: [PATCH 061/359] Update README.md --- persistence-modules/redis/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/persistence-modules/redis/README.md b/persistence-modules/redis/README.md index dd655ca7aa..21cd048693 100644 --- a/persistence-modules/redis/README.md +++ b/persistence-modules/redis/README.md @@ -1,5 +1,4 @@ ### Relevant Articles: - [Intro to Jedis – the Java Redis Client Library](http://www.baeldung.com/jedis-java-redis-client-library) - [A Guide to Redis with Redisson](http://www.baeldung.com/redis-redisson) -- [Intro to Lettuce – the Java Redis Client Library](http://www.baeldung.com/lettuce-java-redis-client-library) - +- [Introduction to Lettuce – the Java Redis Client](https://www.baeldung.com/java-redis-lettuce) From 0ab513eb1d634a1c34d4cf0821b1fd073a6da53d Mon Sep 17 00:00:00 2001 From: Loredana Date: Sat, 15 Dec 2018 18:45:17 +0200 Subject: [PATCH 062/359] small fixes for BAEL-10845 --- spring-rest-template/.gitignore | 14 ---- spring-rest-template/README.md | 8 -- spring-rest-template/checkstyle.xml | 11 --- spring-rest-template/pom.xml | 83 ------------------- .../client/MultipartFileUploadClient.java | 62 -------------- .../src/main/resources/logback.xml | 13 --- spring-rest/README.md | 1 + spring-resttemplate/README.md | 3 +- ...pringDataWithSecurityIntegrationTest.java} | 2 +- 9 files changed, 4 insertions(+), 193 deletions(-) delete mode 100644 spring-rest-template/.gitignore delete mode 100644 spring-rest-template/README.md delete mode 100644 spring-rest-template/checkstyle.xml delete mode 100644 spring-rest-template/pom.xml delete mode 100644 spring-rest-template/src/main/java/com/baeldung/web/upload/client/MultipartFileUploadClient.java delete mode 100644 spring-rest-template/src/main/resources/logback.xml rename spring-security-mvc-boot/src/test/java/com/baeldung/relationships/{SpringDataWithSecurityUnitTest.java => SpringDataWithSecurityIntegrationTest.java} (98%) diff --git a/spring-rest-template/.gitignore b/spring-rest-template/.gitignore deleted file mode 100644 index afdfaa6ded..0000000000 --- a/spring-rest-template/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -*.class - -#folders# -/target -/neoDb* -/data -/src/main/webapp/WEB-INF/classes -*/META-INF/* -*/.idea/* - -# Packaged files # -*.jar -*.war -*.ear \ No newline at end of file diff --git a/spring-rest-template/README.md b/spring-rest-template/README.md deleted file mode 100644 index 2c31796080..0000000000 --- a/spring-rest-template/README.md +++ /dev/null @@ -1,8 +0,0 @@ -## Spring REST Template Example Project - -### The Course -The "REST With Spring" Classes: http://bit.ly/restwithspring - -### Relevant Articles: -- [Uploading MultipartFile with Spring RestTemplate](http://www.baeldung.com/spring-rest-template-multipart-upload) -- [Mocking a RestTemplate in Spring](https://www.baeldung.com/spring-mock-rest-template) diff --git a/spring-rest-template/checkstyle.xml b/spring-rest-template/checkstyle.xml deleted file mode 100644 index 85063a7570..0000000000 --- a/spring-rest-template/checkstyle.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/spring-rest-template/pom.xml b/spring-rest-template/pom.xml deleted file mode 100644 index fa93308cf5..0000000000 --- a/spring-rest-template/pom.xml +++ /dev/null @@ -1,83 +0,0 @@ - - 4.0.0 - com.baeldung - spring-rest-template - 0.1-SNAPSHOT - spring-rest-template - jar - - - parent-boot-2 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-2 - - - - - - - org.springframework - spring-web - - - commons-logging - commons-logging - - - - - - - spring-rest-template - - - org.apache.maven.plugins - maven-checkstyle-plugin - ${checkstyle-maven-plugin.version} - - checkstyle.xml - - - - - check - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - 3 - true - - **/*IntegrationTest.java - **/*LongRunningUnitTest.java - **/*ManualTest.java - **/*LiveTest.java - - - - - - - - - org.apache.maven.plugins - maven-checkstyle-plugin - ${checkstyle-maven-plugin.version} - - checkstyle.xml - - - - - - - - 3.0.0 - - diff --git a/spring-rest-template/src/main/java/com/baeldung/web/upload/client/MultipartFileUploadClient.java b/spring-rest-template/src/main/java/com/baeldung/web/upload/client/MultipartFileUploadClient.java deleted file mode 100644 index 804013d4dc..0000000000 --- a/spring-rest-template/src/main/java/com/baeldung/web/upload/client/MultipartFileUploadClient.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.baeldung.web.upload.client; - -import org.springframework.core.io.FileSystemResource; -import org.springframework.core.io.Resource; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; -import org.springframework.web.client.RestTemplate; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; - -public class MultipartFileUploadClient { - - public static void main(String[] args) throws IOException { - uploadSingleFile(); - uploadMultipleFile(); - } - - private static void uploadSingleFile() throws IOException { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.MULTIPART_FORM_DATA); - - MultiValueMap body = new LinkedMultiValueMap<>(); - body.add("file", getTestFile()); - - - HttpEntity> requestEntity = new HttpEntity<>(body, headers); - String serverUrl = "http://localhost:8082/spring-rest/fileserver/singlefileupload/"; - RestTemplate restTemplate = new RestTemplate(); - ResponseEntity response = restTemplate.postForEntity(serverUrl, requestEntity, String.class); - System.out.println("Response code: " + response.getStatusCode()); - } - - private static void uploadMultipleFile() throws IOException { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.MULTIPART_FORM_DATA); - - MultiValueMap body = new LinkedMultiValueMap<>(); - body.add("files", getTestFile()); - body.add("files", getTestFile()); - body.add("files", getTestFile()); - - HttpEntity> requestEntity = new HttpEntity<>(body, headers); - String serverUrl = "http://localhost:8082/spring-rest/fileserver/multiplefileupload/"; - RestTemplate restTemplate = new RestTemplate(); - ResponseEntity response = restTemplate.postForEntity(serverUrl, requestEntity, String.class); - System.out.println("Response code: " + response.getStatusCode()); - } - - public static Resource getTestFile() throws IOException { - Path testFile = Files.createTempFile("test-file", ".txt"); - System.out.println("Creating and Uploading Test File: " + testFile); - Files.write(testFile, "Hello World !!, This is a test file.".getBytes()); - return new FileSystemResource(testFile.toFile()); - } - -} diff --git a/spring-rest-template/src/main/resources/logback.xml b/spring-rest-template/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/spring-rest-template/src/main/resources/logback.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - \ No newline at end of file diff --git a/spring-rest/README.md b/spring-rest/README.md index 5b8a35a4a5..efa0dbab60 100644 --- a/spring-rest/README.md +++ b/spring-rest/README.md @@ -24,3 +24,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Get and Post Lists of Objects with RestTemplate](http://www.baeldung.com/spring-rest-template-list) - [How to Set a Header on a Response with Spring 5](http://www.baeldung.com/spring-response-header) - [Spring’s RequestBody and ResponseBody Annotations](https://www.baeldung.com/spring-request-response-body) +- [Uploading MultipartFile with Spring RestTemplate](http://www.baeldung.com/spring-rest-template-multipart-upload) diff --git a/spring-resttemplate/README.md b/spring-resttemplate/README.md index bf8c56e6ec..1c8ddf73f9 100644 --- a/spring-resttemplate/README.md +++ b/spring-resttemplate/README.md @@ -7,4 +7,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Spring RestTemplate Tutorial](http://www.baeldung.com/rest-template) - [Exploring the Spring Boot TestRestTemplate](http://www.baeldung.com/spring-boot-testresttemplate) - [Spring RestTemplate Error Handling](http://www.baeldung.com/spring-rest-template-error-handling) -- [Configure a RestTemplate with RestTemplateBuilder](http://www.baeldung.com/spring-rest-template-builder) \ No newline at end of file +- [Configure a RestTemplate with RestTemplateBuilder](http://www.baeldung.com/spring-rest-template-builder) +- [Mocking a RestTemplate in Spring](https://www.baeldung.com/spring-mock-rest-template) diff --git a/spring-security-mvc-boot/src/test/java/com/baeldung/relationships/SpringDataWithSecurityUnitTest.java b/spring-security-mvc-boot/src/test/java/com/baeldung/relationships/SpringDataWithSecurityIntegrationTest.java similarity index 98% rename from spring-security-mvc-boot/src/test/java/com/baeldung/relationships/SpringDataWithSecurityUnitTest.java rename to spring-security-mvc-boot/src/test/java/com/baeldung/relationships/SpringDataWithSecurityIntegrationTest.java index 8207363a70..bd0c14ca1f 100644 --- a/spring-security-mvc-boot/src/test/java/com/baeldung/relationships/SpringDataWithSecurityUnitTest.java +++ b/spring-security-mvc-boot/src/test/java/com/baeldung/relationships/SpringDataWithSecurityIntegrationTest.java @@ -36,7 +36,7 @@ import com.baeldung.util.DummyContentUtil; @WebAppConfiguration @ContextConfiguration @DirtiesContext -public class SpringDataWithSecurityUnitTest { +public class SpringDataWithSecurityIntegrationTest { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); @Autowired private ServletContext servletContext; From 7ae533c5eea6eef7860ee3cb358554e6f53c0d90 Mon Sep 17 00:00:00 2001 From: Loredana Date: Sat, 15 Dec 2018 18:49:49 +0200 Subject: [PATCH 063/359] fix main pom --- pom.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/pom.xml b/pom.xml index bab3fc2317..8705321be1 100644 --- a/pom.xml +++ b/pom.xml @@ -700,7 +700,6 @@ spring-rest-query-language spring-rest-shell spring-rest-simple - spring-rest-template spring-resttemplate spring-roo @@ -1407,7 +1406,6 @@ spring-rest-query-language spring-rest-shell spring-rest-simple - spring-rest-template spring-resttemplate spring-roo From 432643f115a4682c290ecd07b125e7b5c6045779 Mon Sep 17 00:00:00 2001 From: Loredana Date: Sat, 15 Dec 2018 18:59:23 +0200 Subject: [PATCH 064/359] remove flips module --- flips/README.md | 1 - flips/pom.xml | 65 ---------------- .../com/baeldung/flips/ApplicationConfig.java | 15 ---- .../flips/controller/FlipController.java | 65 ---------------- .../java/com/baeldung/flips/model/Foo.java | 12 --- .../baeldung/flips/service/FlipService.java | 50 ------------- .../flips/service/NewFlipService.java | 13 ---- .../src/main/resources/application.properties | 5 -- flips/src/main/resources/logback.xml | 13 ---- .../FlipControllerIntegrationTest.java | 74 ------------------- pom.xml | 2 - 11 files changed, 315 deletions(-) delete mode 100644 flips/README.md delete mode 100644 flips/pom.xml delete mode 100644 flips/src/main/java/com/baeldung/flips/ApplicationConfig.java delete mode 100644 flips/src/main/java/com/baeldung/flips/controller/FlipController.java delete mode 100644 flips/src/main/java/com/baeldung/flips/model/Foo.java delete mode 100644 flips/src/main/java/com/baeldung/flips/service/FlipService.java delete mode 100644 flips/src/main/java/com/baeldung/flips/service/NewFlipService.java delete mode 100644 flips/src/main/resources/application.properties delete mode 100644 flips/src/main/resources/logback.xml delete mode 100644 flips/src/test/java/com/baeldung/flips/controller/FlipControllerIntegrationTest.java diff --git a/flips/README.md b/flips/README.md deleted file mode 100644 index 7d843af9ea..0000000000 --- a/flips/README.md +++ /dev/null @@ -1 +0,0 @@ -### Relevant Articles: diff --git a/flips/pom.xml b/flips/pom.xml deleted file mode 100644 index 75dc8bb579..0000000000 --- a/flips/pom.xml +++ /dev/null @@ -1,65 +0,0 @@ - - 4.0.0 - flips - flips - 0.0.1-SNAPSHOT - jar - flips - - - parent-boot-1 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-1 - - - - - org.springframework.boot - spring-boot-starter-web - ${spring-boot-starter-web.version} - - - org.springframework.boot - spring-boot-starter-test - ${spring-boot-starter-test.version} - - - com.github.feature-flip - flips-web - ${flips-web.version} - - - org.projectlombok - lombok - - ${lombok.version} - provided - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - - - - 1.5.10.RELEASE - 1.5.9.RELEASE - 1.0.1 - 1.16.18 - - - diff --git a/flips/src/main/java/com/baeldung/flips/ApplicationConfig.java b/flips/src/main/java/com/baeldung/flips/ApplicationConfig.java deleted file mode 100644 index 7001aeb991..0000000000 --- a/flips/src/main/java/com/baeldung/flips/ApplicationConfig.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.baeldung.flips; - -import org.flips.describe.config.FlipWebContextConfiguration; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Import; - -@SpringBootApplication -@Import(FlipWebContextConfiguration.class) -public class ApplicationConfig { - - public static void main(String[] args) { - SpringApplication.run(ApplicationConfig.class, args); - } -} \ No newline at end of file diff --git a/flips/src/main/java/com/baeldung/flips/controller/FlipController.java b/flips/src/main/java/com/baeldung/flips/controller/FlipController.java deleted file mode 100644 index 50458023b3..0000000000 --- a/flips/src/main/java/com/baeldung/flips/controller/FlipController.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.baeldung.flips.controller; - -import com.baeldung.flips.model.Foo; -import com.baeldung.flips.service.FlipService; -import org.flips.annotation.FlipOnDateTime; -import org.flips.annotation.FlipOnDaysOfWeek; -import org.flips.annotation.FlipOnEnvironmentProperty; -import org.flips.annotation.FlipOnProfiles; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -import java.time.DayOfWeek; -import java.util.List; - -@RestController -public class FlipController { - - private FlipService flipService; - - @Autowired - public FlipController(FlipService flipService) { - this.flipService = flipService; - } - - @RequestMapping(value = "/foos", method = RequestMethod.GET) - @FlipOnProfiles(activeProfiles = "dev") - public List getAllFoos() { - return flipService.getAllFoos(); - } - - @RequestMapping(value = "/foo/{id}", method = RequestMethod.GET) - @FlipOnDaysOfWeek(daysOfWeek = { - DayOfWeek.MONDAY, DayOfWeek.TUESDAY, DayOfWeek.WEDNESDAY, DayOfWeek.THURSDAY, - DayOfWeek.FRIDAY, DayOfWeek.SATURDAY, DayOfWeek.SUNDAY - }) - public Foo getFooByNewId(@PathVariable int id) { - return flipService.getFooById(id).orElse(new Foo("Not Found", -1)); - } - - @RequestMapping(value = "/foo/last", method = RequestMethod.GET) - @FlipOnDateTime(cutoffDateTimeProperty = "last.active.after") - public Foo getLastFoo() { - return flipService.getLastFoo(); - } - - @RequestMapping(value = "/foo/first", method = RequestMethod.GET) - @FlipOnDateTime(cutoffDateTimeProperty = "first.active.after") - public Foo getFirstFoo() { - return flipService.getLastFoo(); - } - - @RequestMapping(value = "/foos/{id}", method = RequestMethod.GET) - @FlipOnEnvironmentProperty(property = "feature.foo.by.id", expectedValue = "Y") - public Foo getFooById(@PathVariable int id) { - return flipService.getFooById(id).orElse(new Foo("Not Found", -1)); - } - - @RequestMapping(value = "/foo/new", method = RequestMethod.GET) - public Foo getNewThing() { - return flipService.getNewFoo(); - } -} \ No newline at end of file diff --git a/flips/src/main/java/com/baeldung/flips/model/Foo.java b/flips/src/main/java/com/baeldung/flips/model/Foo.java deleted file mode 100644 index be15bee15c..0000000000 --- a/flips/src/main/java/com/baeldung/flips/model/Foo.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.baeldung.flips.model; - -import lombok.Data; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; - -@Data -@RequiredArgsConstructor -public class Foo { - @NonNull private final String name; - @NonNull private final int id; -} diff --git a/flips/src/main/java/com/baeldung/flips/service/FlipService.java b/flips/src/main/java/com/baeldung/flips/service/FlipService.java deleted file mode 100644 index 9f7fb325a5..0000000000 --- a/flips/src/main/java/com/baeldung/flips/service/FlipService.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.baeldung.flips.service; - -import com.baeldung.flips.model.Foo; -import org.flips.annotation.FlipBean; -import org.flips.annotation.FlipOnSpringExpression; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; - -@Service -public class FlipService { - - private final List foos; - - public FlipService() { - foos = new ArrayList<>(); - foos.add(new Foo("Foo1", 1)); - foos.add(new Foo("Foo2", 2)); - foos.add(new Foo("Foo3", 3)); - foos.add(new Foo("Foo4", 4)); - foos.add(new Foo("Foo5", 5)); - foos.add(new Foo("Foo6", 6)); - - } - - public List getAllFoos() { - return foos; - } - - public Optional getFooById(int id) { - return foos.stream().filter(foo -> (foo.getId() == id)).findFirst(); - } - - @FlipBean(with = NewFlipService.class) - @FlipOnSpringExpression(expression = "(2 + 2) == 4") - public Foo getNewFoo() { - return new Foo("New Foo!", 99); - } - - public Foo getLastFoo() { - return foos.get(foos.size() - 1); - } - - public Foo getFirstFoo() { - return foos.get(0); - } - -} \ No newline at end of file diff --git a/flips/src/main/java/com/baeldung/flips/service/NewFlipService.java b/flips/src/main/java/com/baeldung/flips/service/NewFlipService.java deleted file mode 100644 index 1dcda9b6ca..0000000000 --- a/flips/src/main/java/com/baeldung/flips/service/NewFlipService.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.flips.service; - -import com.baeldung.flips.model.Foo; -import org.springframework.stereotype.Service; - -@Service -public class NewFlipService { - - public Foo getNewFoo() { - return new Foo("Shiny New Foo!", 100); - } - -} \ No newline at end of file diff --git a/flips/src/main/resources/application.properties b/flips/src/main/resources/application.properties deleted file mode 100644 index 274896be15..0000000000 --- a/flips/src/main/resources/application.properties +++ /dev/null @@ -1,5 +0,0 @@ -feature.foo.by.id=Y -feature.new.foo=Y -last.active.after=2018-03-14T00:00:00Z -first.active.after=2999-03-15T00:00:00Z -logging.level.org.flips=info \ No newline at end of file diff --git a/flips/src/main/resources/logback.xml b/flips/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/flips/src/main/resources/logback.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - \ No newline at end of file diff --git a/flips/src/test/java/com/baeldung/flips/controller/FlipControllerIntegrationTest.java b/flips/src/test/java/com/baeldung/flips/controller/FlipControllerIntegrationTest.java deleted file mode 100644 index 9dd4ef064a..0000000000 --- a/flips/src/test/java/com/baeldung/flips/controller/FlipControllerIntegrationTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.baeldung.flips.controller; - -import org.hamcrest.Matchers; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.springframework.test.web.servlet.result.MockMvcResultMatchers; - -@RunWith(SpringRunner.class) -@SpringBootTest(properties = { - "feature.foo.by.id=Y", - "feature.new.foo=Y", - "last.active.after=2018-03-14T00:00:00Z", - "first.active.after=2999-03-15T00:00:00Z", - "logging.level.org.flips=info" - -}, webEnvironment = SpringBootTest.WebEnvironment.MOCK) -@AutoConfigureMockMvc -@ActiveProfiles("dev") -public class FlipControllerIntegrationTest { - - @Autowired private MockMvc mvc; - - @Test - public void givenValidDayOfWeek_APIAvailable() throws Exception { - mvc.perform(MockMvcRequestBuilders.get("/foo/1")) - .andExpect(MockMvcResultMatchers.status().is(200)) - .andExpect(MockMvcResultMatchers.jsonPath("$.name", Matchers.equalTo("Foo1"))) - .andExpect(MockMvcResultMatchers.jsonPath("$.id", Matchers.equalTo(1))); - } - - @Test - public void givenValidDate_APIAvailable() throws Exception { - mvc.perform(MockMvcRequestBuilders.get("/foo/last")) - .andExpect(MockMvcResultMatchers.status().is(200)) - .andExpect(MockMvcResultMatchers.jsonPath("$.name", Matchers.equalTo("Foo6"))) - .andExpect(MockMvcResultMatchers.jsonPath("$.id", Matchers.equalTo(6))); - } - - @Test - public void givenInvalidDate_APINotAvailable() throws Exception { - mvc.perform(MockMvcRequestBuilders.get("/foo/first")) - .andExpect(MockMvcResultMatchers.status().is(501)); - } - - @Test - public void givenCorrectProfile_APIAvailable() throws Exception { - mvc.perform(MockMvcRequestBuilders.get("/foos")) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andExpect(MockMvcResultMatchers.jsonPath("$", Matchers.hasSize(6))); - } - - @Test - public void givenPropertySet_APIAvailable() throws Exception { - mvc.perform(MockMvcRequestBuilders.get("/foos/1")) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andExpect(MockMvcResultMatchers.jsonPath("$.name", Matchers.equalTo("Foo1"))) - .andExpect(MockMvcResultMatchers.jsonPath("$.id", Matchers.equalTo(1))); - } - - @Test - public void getValidExpression_FlipBean() throws Exception { - mvc.perform(MockMvcRequestBuilders.get("/foo/new")) - .andExpect(MockMvcResultMatchers.status().is(200)) - .andExpect(MockMvcResultMatchers.jsonPath("$.name", Matchers.equalTo("Shiny New Foo!"))) - .andExpect(MockMvcResultMatchers.jsonPath("$.id", Matchers.equalTo(100))); - } -} \ No newline at end of file diff --git a/pom.xml b/pom.xml index bab3fc2317..643496e482 100644 --- a/pom.xml +++ b/pom.xml @@ -397,7 +397,6 @@ ethereum feign - flips flyway-cdi-extension @@ -1108,7 +1107,6 @@ ethereum feign - flips flyway-cdi-extension From 9271f1094181278deb536dbbf6e01fabd220acfc Mon Sep 17 00:00:00 2001 From: Kumar Chandrakant Date: Sat, 15 Dec 2018 22:40:55 +0530 Subject: [PATCH 065/359] Adding files for the tutorial BAEL-1877: A Guide to Hibernate OGM (#5909) * Adding files for the tutorial BAEL-1877: A Guide to Hibernate OGM * Removing test for MongoDB as there may not be MongoDB running on integration platform. * Reapplied the standard Java formatter. * Incorporatd the review comments on the tutorial. * Commented out the integration test for MongoDB. * Removed implicit dependencies from pom.xml --- persistence-modules/hibernate-ogm/README.md | 4 + persistence-modules/hibernate-ogm/pom.xml | 60 ++++++++++++ .../com/baeldung/hibernate/ogm/Article.java | 54 +++++++++++ .../com/baeldung/hibernate/ogm/Author.java | 70 ++++++++++++++ .../com/baeldung/hibernate/ogm/Editor.java | 58 ++++++++++++ .../main/resources/META-INF/persistence.xml | 24 +++++ .../hibernate/ogm/EditorUnitTest.java | 92 +++++++++++++++++++ pom.xml | 2 + 8 files changed, 364 insertions(+) create mode 100644 persistence-modules/hibernate-ogm/README.md create mode 100644 persistence-modules/hibernate-ogm/pom.xml create mode 100644 persistence-modules/hibernate-ogm/src/main/java/com/baeldung/hibernate/ogm/Article.java create mode 100644 persistence-modules/hibernate-ogm/src/main/java/com/baeldung/hibernate/ogm/Author.java create mode 100644 persistence-modules/hibernate-ogm/src/main/java/com/baeldung/hibernate/ogm/Editor.java create mode 100644 persistence-modules/hibernate-ogm/src/main/resources/META-INF/persistence.xml create mode 100644 persistence-modules/hibernate-ogm/src/test/java/com/baeldung/hibernate/ogm/EditorUnitTest.java diff --git a/persistence-modules/hibernate-ogm/README.md b/persistence-modules/hibernate-ogm/README.md new file mode 100644 index 0000000000..f4a5bb6c3b --- /dev/null +++ b/persistence-modules/hibernate-ogm/README.md @@ -0,0 +1,4 @@ +## Relevant articles: + +- [Guide to Hibernate OGM](http://www.baeldung.com/xxxx) + diff --git a/persistence-modules/hibernate-ogm/pom.xml b/persistence-modules/hibernate-ogm/pom.xml new file mode 100644 index 0000000000..2ccac03bd3 --- /dev/null +++ b/persistence-modules/hibernate-ogm/pom.xml @@ -0,0 +1,60 @@ + + + 4.0.0 + com.baeldung + hibernate-ogm + 0.0.1-SNAPSHOT + hibernate-ogm + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + ../../ + + + + + + org.hibernate.ogm + hibernate-ogm-mongodb + 5.4.0.Final + + + + org.hibernate.ogm + hibernate-ogm-neo4j + 5.4.0.Final + + + + org.jboss.narayana.jta + narayana-jta + 5.5.23.Final + + + + junit + junit + 4.12 + test + + + org.easytesting + fest-assert + 1.4 + test + + + + + hibernate-ogm + + + src/main/resources + true + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate-ogm/src/main/java/com/baeldung/hibernate/ogm/Article.java b/persistence-modules/hibernate-ogm/src/main/java/com/baeldung/hibernate/ogm/Article.java new file mode 100644 index 0000000000..29f01ecde7 --- /dev/null +++ b/persistence-modules/hibernate-ogm/src/main/java/com/baeldung/hibernate/ogm/Article.java @@ -0,0 +1,54 @@ +package com.baeldung.hibernate.ogm; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.ManyToOne; + +import org.hibernate.annotations.GenericGenerator; + +@Entity +public class Article { + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + private String articleId; + + private String articleTitle; + + @ManyToOne + private Author author; + + // constructors, getters and setters... + + Article() { + } + + public Article(String articleTitle) { + this.articleTitle = articleTitle; + } + + public String getArticleId() { + return articleId; + } + + public void setArticleId(String articleId) { + this.articleId = articleId; + } + + public String getArticleTitle() { + return articleTitle; + } + + public void setArticleTitle(String articleTitle) { + this.articleTitle = articleTitle; + } + + public Author getAuthor() { + return author; + } + + public void setAuthor(Author author) { + this.author = author; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate-ogm/src/main/java/com/baeldung/hibernate/ogm/Author.java b/persistence-modules/hibernate-ogm/src/main/java/com/baeldung/hibernate/ogm/Author.java new file mode 100644 index 0000000000..9e60c9f934 --- /dev/null +++ b/persistence-modules/hibernate-ogm/src/main/java/com/baeldung/hibernate/ogm/Author.java @@ -0,0 +1,70 @@ +package com.baeldung.hibernate.ogm; + +import java.util.HashSet; +import java.util.Set; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; + +import org.hibernate.annotations.GenericGenerator; + +@Entity +public class Author { + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + private String authorId; + + private String authorName; + + @ManyToOne + private Editor editor; + + @OneToMany(mappedBy = "author", cascade = CascadeType.PERSIST) + private Set
authoredArticles = new HashSet<>(); + + // constructors, getters and setters... + + Author() { + } + + public Author(String authorName) { + this.authorName = authorName; + } + + public String getAuthorId() { + return authorId; + } + + public void setAuthorId(String authorId) { + this.authorId = authorId; + } + + public String getAuthorName() { + return authorName; + } + + public void setAuthorName(String authorName) { + this.authorName = authorName; + } + + public Editor getEditor() { + return editor; + } + + public void setEditor(Editor editor) { + this.editor = editor; + } + + public Set
getAuthoredArticles() { + return authoredArticles; + } + + public void setAuthoredArticles(Set
authoredArticles) { + this.authoredArticles = authoredArticles; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate-ogm/src/main/java/com/baeldung/hibernate/ogm/Editor.java b/persistence-modules/hibernate-ogm/src/main/java/com/baeldung/hibernate/ogm/Editor.java new file mode 100644 index 0000000000..2c3f720e91 --- /dev/null +++ b/persistence-modules/hibernate-ogm/src/main/java/com/baeldung/hibernate/ogm/Editor.java @@ -0,0 +1,58 @@ +package com.baeldung.hibernate.ogm; + +import java.util.HashSet; +import java.util.Set; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.OneToMany; + +import org.hibernate.annotations.GenericGenerator; + +@Entity +public class Editor { + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + private String editorId; + + private String editorName; + + @OneToMany(mappedBy = "editor", cascade = CascadeType.PERSIST) + private Set assignedAuthors = new HashSet<>(); + + // constructors, getters and setters... + + Editor() { + } + + public Editor(String editorName) { + this.editorName = editorName; + } + + public String getEditorId() { + return editorId; + } + + public void setEditorId(String editorId) { + this.editorId = editorId; + } + + public String getEditorName() { + return editorName; + } + + public void setEditorName(String editorName) { + this.editorName = editorName; + } + + public Set getAssignedAuthors() { + return assignedAuthors; + } + + public void setAssignedAuthors(Set assignedAuthors) { + this.assignedAuthors = assignedAuthors; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate-ogm/src/main/resources/META-INF/persistence.xml b/persistence-modules/hibernate-ogm/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000000..43c86fb55b --- /dev/null +++ b/persistence-modules/hibernate-ogm/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,24 @@ + + + + + org.hibernate.ogm.jpa.HibernateOgmPersistence + + + + + + + + + org.hibernate.ogm.jpa.HibernateOgmPersistence + + + + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate-ogm/src/test/java/com/baeldung/hibernate/ogm/EditorUnitTest.java b/persistence-modules/hibernate-ogm/src/test/java/com/baeldung/hibernate/ogm/EditorUnitTest.java new file mode 100644 index 0000000000..d7fd49d917 --- /dev/null +++ b/persistence-modules/hibernate-ogm/src/test/java/com/baeldung/hibernate/ogm/EditorUnitTest.java @@ -0,0 +1,92 @@ +package com.baeldung.hibernate.ogm; + +import static org.fest.assertions.Assertions.assertThat; + +import java.util.Map; +import java.util.stream.Collectors; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import javax.transaction.TransactionManager; + +import org.junit.Test; + +public class EditorUnitTest { + /* + @Test + public void givenMongoDB_WhenEntitiesCreated_thenCanBeRetrieved() throws Exception { + EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("ogm-mongodb"); + Editor editor = generateTestData(); + persistTestData(entityManagerFactory, editor); + loadAndVerifyTestData(entityManagerFactory, editor); + } + */ + @Test + public void givenNeo4j_WhenEntitiesCreated_thenCanBeRetrieved() throws Exception { + EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("ogm-neo4j"); + Editor editor = generateTestData(); + persistTestData(entityManagerFactory, editor); + loadAndVerifyTestData(entityManagerFactory, editor); + } + + private void persistTestData(EntityManagerFactory entityManagerFactory, Editor editor) throws Exception { + TransactionManager transactionManager = com.arjuna.ats.jta.TransactionManager.transactionManager(); + EntityManager entityManager; + + transactionManager.begin(); + entityManager = entityManagerFactory.createEntityManager(); + entityManager.persist(editor); + entityManager.close(); + transactionManager.commit(); + } + + private void loadAndVerifyTestData(EntityManagerFactory entityManagerFactory, Editor editor) throws Exception { + TransactionManager transactionManager = com.arjuna.ats.jta.TransactionManager.transactionManager(); + EntityManager entityManager; + + transactionManager.begin(); + entityManager = entityManagerFactory.createEntityManager(); + Editor loadedEditor = entityManager.find(Editor.class, editor.getEditorId()); + assertThat(loadedEditor).isNotNull(); + assertThat(loadedEditor.getEditorName()).isEqualTo("Tom"); + assertThat(loadedEditor.getAssignedAuthors()).onProperty("authorName") + .containsOnly("Maria", "Mike"); + Map loadedAuthors = loadedEditor.getAssignedAuthors() + .stream() + .collect(Collectors.toMap(Author::getAuthorName, e -> e)); + assertThat(loadedAuthors.get("Maria") + .getAuthoredArticles()).onProperty("articleTitle") + .containsOnly("Basic of Hibernate OGM"); + assertThat(loadedAuthors.get("Mike") + .getAuthoredArticles()).onProperty("articleTitle") + .containsOnly("Intermediate of Hibernate OGM", "Advanced of Hibernate OGM"); + entityManager.close(); + transactionManager.commit(); + } + + private Editor generateTestData() { + Editor tom = new Editor("Tom"); + Author maria = new Author("Maria"); + Author mike = new Author("Mike"); + Article basic = new Article("Basic of Hibernate OGM"); + Article intermediate = new Article("Intermediate of Hibernate OGM"); + Article advanced = new Article("Advanced of Hibernate OGM"); + maria.getAuthoredArticles() + .add(basic); + basic.setAuthor(maria); + mike.getAuthoredArticles() + .add(intermediate); + intermediate.setAuthor(mike); + mike.getAuthoredArticles() + .add(advanced); + advanced.setAuthor(mike); + tom.getAssignedAuthors() + .add(maria); + maria.setEditor(tom); + tom.getAssignedAuthors() + .add(mike); + mike.setEditor(tom); + return tom; + } +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index bab3fc2317..f1005c7053 100644 --- a/pom.xml +++ b/pom.xml @@ -509,6 +509,7 @@ persistence-modules/flyway persistence-modules/hbase persistence-modules/hibernate5 + persistence-modules/hibernate-ogm persistence-modules/influxdb persistence-modules/java-cassandra persistence-modules/java-cockroachdb @@ -1220,6 +1221,7 @@ persistence-modules/flyway persistence-modules/hbase persistence-modules/hibernate5 + persistence-modules/hibernate-ogm persistence-modules/influxdb persistence-modules/java-cassandra persistence-modules/java-cockroachdb From 94f40923141cf6481e810a38483f6b83bfee43f7 Mon Sep 17 00:00:00 2001 From: kyleandari <44148335+kyleandari@users.noreply.github.com> Date: Sat, 15 Dec 2018 17:35:09 -0500 Subject: [PATCH 066/359] BAEL-2431 Implementing multi-inheritance and Polymorphism using interfaces (#5924) * Implementing Hexagonal Architecture in java * Implementing multi-inheritance and Polymorphism using interfaces * Removing hexagonal code * Deleting hexagonal architecture code * fix for unit test names --- .../interfaces/multiinheritance/Fly.java | 5 ++++ .../multiinheritance/Transform.java | 5 ++++ .../interfaces/multiinheritance/Vehicle.java | 13 ++++++++++ .../interfaces/polymorphysim/Circle.java | 21 +++++++++++++++ .../polymorphysim/DisplayShape.java | 22 ++++++++++++++++ .../polymorphysim/MainPolymorphic.java | 15 +++++++++++ .../interfaces/polymorphysim/Shape.java | 6 +++++ .../interfaces/polymorphysim/Square.java | 20 ++++++++++++++ .../interfaces/PolymorphysimUnitTest.java | 26 +++++++++++++++++++ 9 files changed, 133 insertions(+) create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/DisplayShape.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/MainPolymorphic.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java create mode 100644 core-java-8/src/test/java/com/baeldung/interfaces/PolymorphysimUnitTest.java diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java b/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java new file mode 100644 index 0000000000..d84182aec6 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java @@ -0,0 +1,5 @@ +package com.baeldung.interfaces.multiinheritance; + +public abstract interface Fly{ + void fly(); +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java b/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java new file mode 100644 index 0000000000..a18bbafdc1 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java @@ -0,0 +1,5 @@ +package com.baeldung.interfaces.multiinheritance; + +public interface Transform { + void transform(); +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java b/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java new file mode 100644 index 0000000000..fb0d36e3e0 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java @@ -0,0 +1,13 @@ +package com.baeldung.interfaces.multiinheritance; + +public class Vehicle implements Fly, Transform { + @Override + public void fly() { + System.out.println("I can Fly!!"); + } + + @Override + public void transform() { + System.out.println("I can Transform!!"); + } +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java new file mode 100644 index 0000000000..bf0e613567 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java @@ -0,0 +1,21 @@ +package com.baeldung.interfaces.polymorphysim; + +public class Circle implements Shape { + + private double radius; + + public Circle(double radius){ + this.radius = radius; + } + + @Override + public String name() { + return "Circle"; + } + + @Override + public double area() { + return Math.PI * (radius * radius); + } + +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/DisplayShape.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/DisplayShape.java new file mode 100644 index 0000000000..2cf4fafee1 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/DisplayShape.java @@ -0,0 +1,22 @@ +package com.baeldung.interfaces.polymorphysim; + +import java.util.ArrayList; + +public class DisplayShape { + + private ArrayList shapes; + + public DisplayShape() { + shapes = new ArrayList<>(); + } + + public void add(Shape shape) { + shapes.add(shape); + } + + public void display() { + for (Shape shape : shapes) { + System.out.println(shape.name() + " area: " + shape.area()); + } + } +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/MainPolymorphic.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/MainPolymorphic.java new file mode 100644 index 0000000000..cc43c1300b --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/MainPolymorphic.java @@ -0,0 +1,15 @@ +package com.baeldung.interfaces.polymorphysim; + +public class MainPolymorphic { + public static void main(String[] args){ + + Shape circleShape = new Circle(2); + Shape squareShape = new Square(2); + + DisplayShape displayShape = new DisplayShape(); + displayShape.add(circleShape); + displayShape.add(squareShape); + + displayShape.display(); + } +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java new file mode 100644 index 0000000000..fcb0c65e7b --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java @@ -0,0 +1,6 @@ +package com.baeldung.interfaces.polymorphysim; + +public interface Shape { + public abstract String name(); + public abstract double area(); +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java new file mode 100644 index 0000000000..9c440150b5 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java @@ -0,0 +1,20 @@ +package com.baeldung.interfaces.polymorphysim; + +public class Square implements Shape { + + private double width; + + public Square(double width) { + this.width = width; + } + + @Override + public String name() { + return "Square"; + } + + @Override + public double area() { + return width * width; + } +} diff --git a/core-java-8/src/test/java/com/baeldung/interfaces/PolymorphysimUnitTest.java b/core-java-8/src/test/java/com/baeldung/interfaces/PolymorphysimUnitTest.java new file mode 100644 index 0000000000..7ded5e6621 --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/interfaces/PolymorphysimUnitTest.java @@ -0,0 +1,26 @@ +package com.baeldung.interfaces; + +import com.baeldung.interfaces.polymorphysim.Circle; +import com.baeldung.interfaces.polymorphysim.Shape; +import com.baeldung.interfaces.polymorphysim.Square; +import org.assertj.core.api.Assertions; +import org.junit.Test; + +public class PolymorphysimUnitTest { + + @Test + public void whenInterfacePointsToCircle_CircleAreaMethodisBeingCalled(){ + double expectedArea = 12.566370614359172; + Shape circle = new Circle(2); + double actualArea = circle.area(); + Assertions.assertThat(actualArea).isEqualTo(expectedArea); + } + + @Test + public void whenInterfacePointsToSquare_SquareAreaMethodisBeingCalled(){ + double expectedArea = 4; + Shape square = new Square(2); + double actualArea = square.area(); + Assertions.assertThat(actualArea).isEqualTo(expectedArea); + } +} From 6ede1b74407483df1d29034de3fefef86a5b81a9 Mon Sep 17 00:00:00 2001 From: Graham Cox Date: Sun, 16 Dec 2018 07:21:41 +0000 Subject: [PATCH 067/359] Kovert examples (#5831) --- core-kotlin/pom.xml | 11 +++ .../com/baeldung/kovert/AnnotatedServer.kt | 73 ++++++++++++++++++ .../kotlin/com/baeldung/kovert/ErrorServer.kt | 75 ++++++++++++++++++ .../kotlin/com/baeldung/kovert/JsonServer.kt | 76 +++++++++++++++++++ .../kotlin/com/baeldung/kovert/NoopServer.kt | 57 ++++++++++++++ .../com/baeldung/kovert/SecuredServer.kt | 68 +++++++++++++++++ .../com/baeldung/kovert/SimpleServer.kt | 65 ++++++++++++++++ core-kotlin/src/main/resources/kovert.conf | 15 ++++ 8 files changed, 440 insertions(+) create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/kovert/AnnotatedServer.kt create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/kovert/ErrorServer.kt create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/kovert/JsonServer.kt create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/kovert/NoopServer.kt create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/kovert/SecuredServer.kt create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/kovert/SimpleServer.kt create mode 100644 core-kotlin/src/main/resources/kovert.conf diff --git a/core-kotlin/pom.xml b/core-kotlin/pom.xml index ed79ebc01b..8b871f28ee 100644 --- a/core-kotlin/pom.xml +++ b/core-kotlin/pom.xml @@ -72,6 +72,17 @@ injekt-core 1.16.1 + + uy.kohesive.kovert + kovert-vertx + [1.5.0,1.6.0) + + + nl.komponents.kovenant + kovenant + + + diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kovert/AnnotatedServer.kt b/core-kotlin/src/main/kotlin/com/baeldung/kovert/AnnotatedServer.kt new file mode 100644 index 0000000000..da2bbe4208 --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/kovert/AnnotatedServer.kt @@ -0,0 +1,73 @@ +package com.baeldung.kovert + +import io.vertx.ext.web.Router +import io.vertx.ext.web.RoutingContext +import nl.komponents.kovenant.functional.bind +import org.kodein.di.Kodein +import org.kodein.di.conf.global +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import uy.klutter.config.typesafe.ClassResourceConfig +import uy.klutter.config.typesafe.ReferenceConfig +import uy.klutter.config.typesafe.kodein.importConfig +import uy.klutter.config.typesafe.loadConfig +import uy.klutter.vertx.kodein.KodeinVertx +import uy.kohesive.kovert.core.HttpVerb +import uy.kohesive.kovert.core.Location +import uy.kohesive.kovert.core.Verb +import uy.kohesive.kovert.core.VerbAlias +import uy.kohesive.kovert.vertx.bindController +import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx +import uy.kohesive.kovert.vertx.boot.KovertVerticle +import uy.kohesive.kovert.vertx.boot.KovertVerticleModule +import uy.kohesive.kovert.vertx.boot.KovertVertx + + +class AnnotatedServer { + companion object { + private val LOG: Logger = LoggerFactory.getLogger(AnnotatedServer::class.java) + + @JvmStatic + fun main(args: Array) { + AnnotatedServer().start() + } + } + + @VerbAlias("show", HttpVerb.GET) + class AnnotatedController { + fun RoutingContext.showStringById(id: String) = id + + @Verb(HttpVerb.GET) + @Location("/ping/:id") + fun RoutingContext.ping(id: String) = id + } + + fun start() { + Kodein.global.addImport(Kodein.Module { + importConfig(loadConfig(ClassResourceConfig("/kovert.conf", AnnotatedServer::class.java), ReferenceConfig())) { + import("kovert.vertx", KodeinKovertVertx.configModule) + import("kovert.server", KovertVerticleModule.configModule) + } + + // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j + import(KodeinVertx.moduleWithLoggingToSlf4j) + // Kovert boot + import(KodeinKovertVertx.module) + import(KovertVerticleModule.module) + }) + + val initControllers = fun Router.() { + bindController(AnnotatedController(), "api") + } + + // startup asynchronously... + KovertVertx.start() bind { vertx -> + KovertVerticle.deploy(vertx, routerInit = initControllers) + } success { deploymentId -> + LOG.warn("Deployment complete.") + } fail { error -> + LOG.error("Deployment failed!", error) + } + + } +} diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kovert/ErrorServer.kt b/core-kotlin/src/main/kotlin/com/baeldung/kovert/ErrorServer.kt new file mode 100644 index 0000000000..a596391ed8 --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/kovert/ErrorServer.kt @@ -0,0 +1,75 @@ +package com.baeldung.kovert + +import io.vertx.ext.web.Router +import io.vertx.ext.web.RoutingContext +import nl.komponents.kovenant.functional.bind +import org.kodein.di.Kodein +import org.kodein.di.conf.global +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import uy.klutter.config.typesafe.ClassResourceConfig +import uy.klutter.config.typesafe.ReferenceConfig +import uy.klutter.config.typesafe.kodein.importConfig +import uy.klutter.config.typesafe.loadConfig +import uy.klutter.vertx.kodein.KodeinVertx +import uy.kohesive.kovert.core.HttpErrorCode +import uy.kohesive.kovert.core.HttpErrorCodeWithBody +import uy.kohesive.kovert.core.HttpErrorForbidden +import uy.kohesive.kovert.vertx.bindController +import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx +import uy.kohesive.kovert.vertx.boot.KovertVerticle +import uy.kohesive.kovert.vertx.boot.KovertVerticleModule +import uy.kohesive.kovert.vertx.boot.KovertVertx + + +class ErrorServer { + companion object { + private val LOG: Logger = LoggerFactory.getLogger(ErrorServer::class.java) + + @JvmStatic + fun main(args: Array) { + ErrorServer().start() + } + } + + class ErrorController { + fun RoutingContext.getForbidden() { + throw HttpErrorForbidden() + } + fun RoutingContext.getError() { + throw HttpErrorCode("Something went wrong", 590) + } + fun RoutingContext.getErrorbody() { + throw HttpErrorCodeWithBody("Something went wrong", 591, "Body here") + } + } + + fun start() { + Kodein.global.addImport(Kodein.Module { + importConfig(loadConfig(ClassResourceConfig("/kovert.conf", ErrorServer::class.java), ReferenceConfig())) { + import("kovert.vertx", KodeinKovertVertx.configModule) + import("kovert.server", KovertVerticleModule.configModule) + } + + // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j + import(KodeinVertx.moduleWithLoggingToSlf4j) + // Kovert boot + import(KodeinKovertVertx.module) + import(KovertVerticleModule.module) + }) + + val initControllers = fun Router.() { + bindController(ErrorController(), "api") + } + + // startup asynchronously... + KovertVertx.start() bind { vertx -> + KovertVerticle.deploy(vertx, routerInit = initControllers) + } success { deploymentId -> + LOG.warn("Deployment complete.") + } fail { error -> + LOG.error("Deployment failed!", error) + } + + } +} diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kovert/JsonServer.kt b/core-kotlin/src/main/kotlin/com/baeldung/kovert/JsonServer.kt new file mode 100644 index 0000000000..310fe2a7a0 --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/kovert/JsonServer.kt @@ -0,0 +1,76 @@ +package com.baeldung.kovert + +import com.fasterxml.jackson.annotation.JsonProperty +import io.vertx.ext.web.Router +import io.vertx.ext.web.RoutingContext +import nl.komponents.kovenant.functional.bind +import org.kodein.di.Kodein +import org.kodein.di.conf.global +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import uy.klutter.config.typesafe.ClassResourceConfig +import uy.klutter.config.typesafe.ReferenceConfig +import uy.klutter.config.typesafe.kodein.importConfig +import uy.klutter.config.typesafe.loadConfig +import uy.klutter.vertx.kodein.KodeinVertx +import uy.kohesive.kovert.vertx.bindController +import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx +import uy.kohesive.kovert.vertx.boot.KovertVerticle +import uy.kohesive.kovert.vertx.boot.KovertVerticleModule +import uy.kohesive.kovert.vertx.boot.KovertVertx + +class JsonServer { + companion object { + private val LOG: Logger = LoggerFactory.getLogger(JsonServer::class.java) + + @JvmStatic + fun main(args: Array) { + JsonServer().start() + } + } + + data class Person( + @JsonProperty("_id") + val id: String, + val name: String, + val job: String + ) + + class JsonController { + fun RoutingContext.getPersonById(id: String) = Person( + id = id, + name = "Tony Stark", + job = "Iron Man" + ) + fun RoutingContext.putPersonById(id: String, person: Person) = person + } + + fun start() { + Kodein.global.addImport(Kodein.Module { + importConfig(loadConfig(ClassResourceConfig("/kovert.conf", JsonServer::class.java), ReferenceConfig())) { + import("kovert.vertx", KodeinKovertVertx.configModule) + import("kovert.server", KovertVerticleModule.configModule) + } + + // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j + import(KodeinVertx.moduleWithLoggingToSlf4j) + // Kovert boot + import(KodeinKovertVertx.module) + import(KovertVerticleModule.module) + }) + + val initControllers = fun Router.() { + bindController(JsonController(), "api") + } + + // startup asynchronously... + KovertVertx.start() bind { vertx -> + KovertVerticle.deploy(vertx, routerInit = initControllers) + } success { deploymentId -> + LOG.warn("Deployment complete.") + } fail { error -> + LOG.error("Deployment failed!", error) + } + + } +} diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kovert/NoopServer.kt b/core-kotlin/src/main/kotlin/com/baeldung/kovert/NoopServer.kt new file mode 100644 index 0000000000..98ce775e66 --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/kovert/NoopServer.kt @@ -0,0 +1,57 @@ +package com.baeldung.kovert + +import io.vertx.ext.web.Router +import nl.komponents.kovenant.functional.bind +import org.kodein.di.Kodein +import org.kodein.di.conf.global +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import uy.klutter.config.typesafe.ClassResourceConfig +import uy.klutter.config.typesafe.ReferenceConfig +import uy.klutter.config.typesafe.kodein.importConfig +import uy.klutter.config.typesafe.loadConfig +import uy.klutter.vertx.kodein.KodeinVertx +import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx +import uy.kohesive.kovert.vertx.boot.KovertVerticle +import uy.kohesive.kovert.vertx.boot.KovertVerticleModule +import uy.kohesive.kovert.vertx.boot.KovertVertx + +class NoopServer { + companion object { + private val LOG: Logger = LoggerFactory.getLogger(NoopServer::class.java) + + @JvmStatic + fun main(args: Array) { + NoopServer().start() + } + } + + + fun start() { + Kodein.global.addImport(Kodein.Module { + importConfig(loadConfig(ClassResourceConfig("/kovert.conf", NoopServer::class.java), ReferenceConfig())) { + import("kovert.vertx", KodeinKovertVertx.configModule) + import("kovert.server", KovertVerticleModule.configModule) + } + + // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j + import(KodeinVertx.moduleWithLoggingToSlf4j) + // Kovert boot + import(KodeinKovertVertx.module) + import(KovertVerticleModule.module) + }) + + val initControllers = fun Router.() { + } + + // startup asynchronously... + KovertVertx.start() bind { vertx -> + KovertVerticle.deploy(vertx, routerInit = initControllers) + } success { deploymentId -> + LOG.warn("Deployment complete.") + } fail { error -> + LOG.error("Deployment failed!", error) + } + + } +} diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kovert/SecuredServer.kt b/core-kotlin/src/main/kotlin/com/baeldung/kovert/SecuredServer.kt new file mode 100644 index 0000000000..86ca482808 --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/kovert/SecuredServer.kt @@ -0,0 +1,68 @@ +package com.baeldung.kovert + +import io.vertx.ext.web.Router +import io.vertx.ext.web.RoutingContext +import nl.komponents.kovenant.functional.bind +import org.kodein.di.Kodein +import org.kodein.di.conf.global +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import uy.klutter.config.typesafe.ClassResourceConfig +import uy.klutter.config.typesafe.ReferenceConfig +import uy.klutter.config.typesafe.kodein.importConfig +import uy.klutter.config.typesafe.loadConfig +import uy.klutter.vertx.kodein.KodeinVertx +import uy.kohesive.kovert.vertx.bindController +import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx +import uy.kohesive.kovert.vertx.boot.KovertVerticle +import uy.kohesive.kovert.vertx.boot.KovertVerticleModule +import uy.kohesive.kovert.vertx.boot.KovertVertx + + +class SecuredServer { + companion object { + private val LOG: Logger = LoggerFactory.getLogger(SecuredServer::class.java) + + @JvmStatic + fun main(args: Array) { + SecuredServer().start() + } + } + + class SecuredContext(private val routingContext: RoutingContext) { + val authenticated = routingContext.request().getHeader("Authorization") == "Secure" + } + + class SecuredController { + fun SecuredContext.getSecured() = this.authenticated + } + + fun start() { + Kodein.global.addImport(Kodein.Module { + importConfig(loadConfig(ClassResourceConfig("/kovert.conf", SecuredServer::class.java), ReferenceConfig())) { + import("kovert.vertx", KodeinKovertVertx.configModule) + import("kovert.server", KovertVerticleModule.configModule) + } + + // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j + import(KodeinVertx.moduleWithLoggingToSlf4j) + // Kovert boot + import(KodeinKovertVertx.module) + import(KovertVerticleModule.module) + }) + + val initControllers = fun Router.() { + bindController(SecuredController(), "api") + } + + // startup asynchronously... + KovertVertx.start() bind { vertx -> + KovertVerticle.deploy(vertx, routerInit = initControllers) + } success { deploymentId -> + LOG.warn("Deployment complete.") + } fail { error -> + LOG.error("Deployment failed!", error) + } + + } +} diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kovert/SimpleServer.kt b/core-kotlin/src/main/kotlin/com/baeldung/kovert/SimpleServer.kt new file mode 100644 index 0000000000..172469ab46 --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/kovert/SimpleServer.kt @@ -0,0 +1,65 @@ +package com.baeldung.kovert + +import io.vertx.ext.web.Router +import io.vertx.ext.web.RoutingContext +import nl.komponents.kovenant.functional.bind +import org.kodein.di.Kodein +import org.kodein.di.conf.global +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import uy.klutter.config.typesafe.ClassResourceConfig +import uy.klutter.config.typesafe.ReferenceConfig +import uy.klutter.config.typesafe.kodein.importConfig +import uy.klutter.config.typesafe.loadConfig +import uy.klutter.vertx.kodein.KodeinVertx +import uy.kohesive.kovert.vertx.bindController +import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx +import uy.kohesive.kovert.vertx.boot.KovertVerticle +import uy.kohesive.kovert.vertx.boot.KovertVerticleModule +import uy.kohesive.kovert.vertx.boot.KovertVertx + + +class SimpleServer { + companion object { + private val LOG: Logger = LoggerFactory.getLogger(SimpleServer::class.java) + + @JvmStatic + fun main(args: Array) { + SimpleServer().start() + } + } + + class SimpleController { + fun RoutingContext.getStringById(id: String) = id + fun RoutingContext.get_truncatedString_by_id(id: String, length: Int = 1) = id.subSequence(0, length) + } + + fun start() { + Kodein.global.addImport(Kodein.Module { + importConfig(loadConfig(ClassResourceConfig("/kovert.conf", SimpleServer::class.java), ReferenceConfig())) { + import("kovert.vertx", KodeinKovertVertx.configModule) + import("kovert.server", KovertVerticleModule.configModule) + } + + // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j + import(KodeinVertx.moduleWithLoggingToSlf4j) + // Kovert boot + import(KodeinKovertVertx.module) + import(KovertVerticleModule.module) + }) + + val initControllers = fun Router.() { + bindController(SimpleController(), "api") + } + + // startup asynchronously... + KovertVertx.start() bind { vertx -> + KovertVerticle.deploy(vertx, routerInit = initControllers) + } success { deploymentId -> + LOG.warn("Deployment complete.") + } fail { error -> + LOG.error("Deployment failed!", error) + } + + } +} diff --git a/core-kotlin/src/main/resources/kovert.conf b/core-kotlin/src/main/resources/kovert.conf new file mode 100644 index 0000000000..3b08641693 --- /dev/null +++ b/core-kotlin/src/main/resources/kovert.conf @@ -0,0 +1,15 @@ +{ + kovert: { + vertx: { + clustered: false + } + server: { + listeners: [ + { + host: "0.0.0.0" + port: "8000" + } + ] + } + } +} From 0f443d300683b64f9ca3c749a3bc6b02f2aaf8b8 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Sun, 16 Dec 2018 14:54:35 +0530 Subject: [PATCH 068/359] Task/bael 10829 4 (#5925) * BAEL-10829 Commented out spring-data-elasticsearc * BAEL-10829 commented out spring-data-elasticsearch project * Revert "BAEL-10829 Commented out spring-data-elasticsearc" This reverts commit 84b7b4086435ac25a14841199145cc5d9e5c4beb. --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index fce724b907..f22aeea5e6 100644 --- a/pom.xml +++ b/pom.xml @@ -528,7 +528,7 @@ persistence-modules/spring-data-couchbase-2 persistence-modules/spring-data-dynamodb persistence-modules/spring-data-eclipselink - persistence-modules/spring-data-elasticsearch + persistence-modules/spring-data-gemfire persistence-modules/spring-data-jpa persistence-modules/spring-data-keyvalue @@ -1238,7 +1238,7 @@ persistence-modules/spring-data-couchbase-2 persistence-modules/spring-data-dynamodb persistence-modules/spring-data-eclipselink - persistence-modules/spring-data-elasticsearch + persistence-modules/spring-data-gemfire persistence-modules/spring-data-jpa persistence-modules/spring-data-keyvalue From b4e1d7779f29a46472034250a9929f1a203569c0 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sun, 16 Dec 2018 12:48:55 +0200 Subject: [PATCH 069/359] Create README.md --- rsocket/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 rsocket/README.md diff --git a/rsocket/README.md b/rsocket/README.md new file mode 100644 index 0000000000..fa232bc515 --- /dev/null +++ b/rsocket/README.md @@ -0,0 +1,3 @@ +Relevant articles + +- [Introduction to RSocket](https://www.baeldung.com/rsocket) From d9ac59cd132f72af339fb0ff0036743e66378383 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 16 Dec 2018 16:37:45 +0530 Subject: [PATCH 070/359] [BAEL-10127] - Added code for modelmapper article --- spring-boot/pom.xml | 7 ++ .../baeldung/modelmapper/PostApplication.java | 20 ++++ .../controller/PostRestController.java | 91 +++++++++++++++++ .../com/baeldung/modelmapper/dto/PostDto.java | 71 ++++++++++++++ .../com/baeldung/modelmapper/dto/UserDto.java | 14 +++ .../com/baeldung/modelmapper/model/Post.java | 98 +++++++++++++++++++ .../modelmapper/model/Preference.java | 32 ++++++ .../com/baeldung/modelmapper/model/User.java | 44 +++++++++ .../repository/PostRepository.java | 21 ++++ .../modelmapper/service/IPostService.java | 17 ++++ .../modelmapper/service/IUserService.java | 9 ++ .../modelmapper/service/PostService.java | 47 +++++++++ .../modelmapper/service/UserService.java | 25 +++++ .../baeldung/modelmapper/PostDtoUnitTest.java | 40 ++++++++ 14 files changed, 536 insertions(+) create mode 100644 spring-boot/src/main/java/com/baeldung/modelmapper/PostApplication.java create mode 100644 spring-boot/src/main/java/com/baeldung/modelmapper/controller/PostRestController.java create mode 100644 spring-boot/src/main/java/com/baeldung/modelmapper/dto/PostDto.java create mode 100644 spring-boot/src/main/java/com/baeldung/modelmapper/dto/UserDto.java create mode 100644 spring-boot/src/main/java/com/baeldung/modelmapper/model/Post.java create mode 100644 spring-boot/src/main/java/com/baeldung/modelmapper/model/Preference.java create mode 100644 spring-boot/src/main/java/com/baeldung/modelmapper/model/User.java create mode 100644 spring-boot/src/main/java/com/baeldung/modelmapper/repository/PostRepository.java create mode 100644 spring-boot/src/main/java/com/baeldung/modelmapper/service/IPostService.java create mode 100644 spring-boot/src/main/java/com/baeldung/modelmapper/service/IUserService.java create mode 100644 spring-boot/src/main/java/com/baeldung/modelmapper/service/PostService.java create mode 100644 spring-boot/src/main/java/com/baeldung/modelmapper/service/UserService.java create mode 100644 spring-boot/src/test/java/com/baeldung/modelmapper/PostDtoUnitTest.java diff --git a/spring-boot/pom.xml b/spring-boot/pom.xml index 87c782b044..e6866b5a8f 100644 --- a/spring-boot/pom.xml +++ b/spring-boot/pom.xml @@ -162,6 +162,12 @@ javax.validation validation-api + + + org.modelmapper + modelmapper + ${modelmapper.version} + @@ -259,6 +265,7 @@ 5.2.4 18.0 2.2.4 + 2.3.2 diff --git a/spring-boot/src/main/java/com/baeldung/modelmapper/PostApplication.java b/spring-boot/src/main/java/com/baeldung/modelmapper/PostApplication.java new file mode 100644 index 0000000000..7684c43648 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/modelmapper/PostApplication.java @@ -0,0 +1,20 @@ +package com.baeldung.modelmapper; + +import org.modelmapper.ModelMapper; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; + +@SpringBootApplication +public class PostApplication { + + public static void main(String[] args) { + SpringApplication.run(PostApplication.class, args); + } + + @Bean + public ModelMapper modelMapper() { + return new ModelMapper(); + } + +} diff --git a/spring-boot/src/main/java/com/baeldung/modelmapper/controller/PostRestController.java b/spring-boot/src/main/java/com/baeldung/modelmapper/controller/PostRestController.java new file mode 100644 index 0000000000..c0cbca5220 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/modelmapper/controller/PostRestController.java @@ -0,0 +1,91 @@ +package com.baeldung.modelmapper.controller; + +import java.text.ParseException; +import java.util.List; +import java.util.stream.Collectors; + +import org.modelmapper.ModelMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.baeldung.modelmapper.dto.PostDto; +import com.baeldung.modelmapper.model.Post; +import com.baeldung.modelmapper.service.IPostService; +import com.baeldung.modelmapper.service.IUserService; + +@Controller +public class PostRestController { + + @Autowired + private IPostService postService; + + @Autowired + private IUserService userService; + + @Autowired + private ModelMapper modelMapper; + + @RequestMapping(method = RequestMethod.GET) + @ResponseBody + public List getPosts( + @PathVariable("page") int page, + @PathVariable("size") int size, + @PathVariable("sortDir") String sortDir, + @PathVariable("sort") String sort) { + + List posts = postService.getPostsList(page, size, sortDir, sort); + return posts.stream() + .map(post -> convertToDto(post)) + .collect(Collectors.toList()); + } + + @RequestMapping(method = RequestMethod.POST) + @ResponseStatus(HttpStatus.CREATED) + @ResponseBody + public PostDto createPost(@RequestBody PostDto postDto) throws ParseException { + Post post = convertToEntity(postDto); + Post postCreated = postService.createPost(post); + return convertToDto(postCreated); + } + + @RequestMapping(value = "/{id}", method = RequestMethod.GET) + @ResponseBody + public PostDto getPost(@PathVariable("id") Long id) { + return convertToDto(postService.getPostById(id)); + } + + @RequestMapping(value = "/{id}", method = RequestMethod.PUT) + @ResponseStatus(HttpStatus.OK) + public void updatePost(@RequestBody PostDto postDto) throws ParseException { + Post post = convertToEntity(postDto); + postService.updatePost(post); + } + + + private PostDto convertToDto(Post post) { + PostDto postDto = modelMapper.map(post, PostDto.class); + postDto.setSubmissionDate(post.getSubmissionDate(), + userService.getCurrentUser().getPreference().getTimezone()); + return postDto; + } + + private Post convertToEntity(PostDto postDto) throws ParseException { + Post post = modelMapper.map(postDto, Post.class); + post.setSubmissionDate(postDto.getSubmissionDateConverted( + userService.getCurrentUser().getPreference().getTimezone())); + + if (postDto.getId() != null) { + Post oldPost = postService.getPostById(postDto.getId()); + post.setRedditID(oldPost.getRedditID()); + post.setSent(oldPost.isSent()); + } + return post; + } +} diff --git a/spring-boot/src/main/java/com/baeldung/modelmapper/dto/PostDto.java b/spring-boot/src/main/java/com/baeldung/modelmapper/dto/PostDto.java new file mode 100644 index 0000000000..6fe2b23888 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/modelmapper/dto/PostDto.java @@ -0,0 +1,71 @@ +package com.baeldung.modelmapper.dto; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; + +public class PostDto { + + private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + + private Long id; + + private String title; + + private String url; + + private String date; + + private UserDto user; + + public Date getSubmissionDateConverted(String timezone) throws ParseException { + dateFormat.setTimeZone(TimeZone.getTimeZone(timezone)); + return dateFormat.parse(this.date); + } + + public void setSubmissionDate(Date date, String timezone) { + dateFormat.setTimeZone(TimeZone.getTimeZone(timezone)); + this.date = dateFormat.format(date); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public UserDto getUser() { + return user; + } + + public void setUser(UserDto user) { + this.user = user; + } +} diff --git a/spring-boot/src/main/java/com/baeldung/modelmapper/dto/UserDto.java b/spring-boot/src/main/java/com/baeldung/modelmapper/dto/UserDto.java new file mode 100644 index 0000000000..23110ecbaa --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/modelmapper/dto/UserDto.java @@ -0,0 +1,14 @@ +package com.baeldung.modelmapper.dto; + +public class UserDto { + + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/spring-boot/src/main/java/com/baeldung/modelmapper/model/Post.java b/spring-boot/src/main/java/com/baeldung/modelmapper/model/Post.java new file mode 100644 index 0000000000..be65ce34a2 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/modelmapper/model/Post.java @@ -0,0 +1,98 @@ +package com.baeldung.modelmapper.model; + +import java.util.Date; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Post { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String title; + + private String url; + + private String date; + + private String redditID; + + private Date submissionDate; + + private boolean sent; + + private String userName; + + public Post() { + + } + + public boolean isSent() { + return sent; + } + + public void setSent(boolean sent) { + this.sent = sent; + } + + public String getRedditID() { + return redditID; + } + + public void setRedditID(String redditID) { + this.redditID = redditID; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public Date getSubmissionDate() { + return submissionDate; + } + + public void setSubmissionDate(Date submissionDate) { + this.submissionDate = submissionDate; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } +} diff --git a/spring-boot/src/main/java/com/baeldung/modelmapper/model/Preference.java b/spring-boot/src/main/java/com/baeldung/modelmapper/model/Preference.java new file mode 100644 index 0000000000..0ab5b1eddf --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/modelmapper/model/Preference.java @@ -0,0 +1,32 @@ +package com.baeldung.modelmapper.model; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Preference { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String timezone; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTimezone() { + return timezone; + } + + public void setTimezone(String timezone) { + this.timezone = timezone; + } +} diff --git a/spring-boot/src/main/java/com/baeldung/modelmapper/model/User.java b/spring-boot/src/main/java/com/baeldung/modelmapper/model/User.java new file mode 100644 index 0000000000..a458b26f4a --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/modelmapper/model/User.java @@ -0,0 +1,44 @@ +package com.baeldung.modelmapper.model; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToOne; + +@Entity +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String name; + + @OneToOne + Preference preference; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Preference getPreference() { + return preference; + } + + public void setPreference(Preference preference) { + this.preference = preference; + } +} diff --git a/spring-boot/src/main/java/com/baeldung/modelmapper/repository/PostRepository.java b/spring-boot/src/main/java/com/baeldung/modelmapper/repository/PostRepository.java new file mode 100644 index 0000000000..fc3f5733c3 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/modelmapper/repository/PostRepository.java @@ -0,0 +1,21 @@ +package com.baeldung.modelmapper.repository; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.PagingAndSortingRepository; +import org.springframework.data.repository.query.Param; + +import com.baeldung.modelmapper.model.Post; +import com.baeldung.modelmapper.model.User; + +public interface PostRepository extends JpaRepository, PagingAndSortingRepository { + + @Query("select u from Post u where u.userName=:userName") + Page findByUser(@Param("userName") String userName, Pageable pageReq); + + default Page findByUser(User user, Pageable pageReq) { + return findByUser(user.getName(), pageReq); + } +} diff --git a/spring-boot/src/main/java/com/baeldung/modelmapper/service/IPostService.java b/spring-boot/src/main/java/com/baeldung/modelmapper/service/IPostService.java new file mode 100644 index 0000000000..0182a0da41 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/modelmapper/service/IPostService.java @@ -0,0 +1,17 @@ +package com.baeldung.modelmapper.service; + +import java.util.List; + +import com.baeldung.modelmapper.model.Post; + +public interface IPostService { + + List getPostsList(int page, int size, String sortDir, String sort); + + void updatePost(Post post); + + Post createPost(Post post); + + Post getPostById(Long id); + +} diff --git a/spring-boot/src/main/java/com/baeldung/modelmapper/service/IUserService.java b/spring-boot/src/main/java/com/baeldung/modelmapper/service/IUserService.java new file mode 100644 index 0000000000..79934114c1 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/modelmapper/service/IUserService.java @@ -0,0 +1,9 @@ +package com.baeldung.modelmapper.service; + +import com.baeldung.modelmapper.model.User; + +public interface IUserService { + + User getCurrentUser(); + +} diff --git a/spring-boot/src/main/java/com/baeldung/modelmapper/service/PostService.java b/spring-boot/src/main/java/com/baeldung/modelmapper/service/PostService.java new file mode 100644 index 0000000000..5980c30837 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/modelmapper/service/PostService.java @@ -0,0 +1,47 @@ +package com.baeldung.modelmapper.service; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; + +import com.baeldung.modelmapper.model.Post; +import com.baeldung.modelmapper.repository.PostRepository; + +@Service +public class PostService implements IPostService { + + @Autowired + private PostRepository postRepository; + + @Autowired + private IUserService userService; + + @Override + public List getPostsList(int page, int size, String sortDir, String sort) { + + PageRequest pageReq + = PageRequest.of(page, size, Sort.Direction.fromString(sortDir), sort); + + Page posts = postRepository.findByUser(userService.getCurrentUser(), pageReq); + return posts.getContent(); + } + + @Override + public void updatePost(Post post) { + postRepository.save(post); + } + + @Override + public Post createPost(Post post) { + return postRepository.save(post); + } + + @Override + public Post getPostById(Long id) { + return postRepository.getOne(id); + } +} diff --git a/spring-boot/src/main/java/com/baeldung/modelmapper/service/UserService.java b/spring-boot/src/main/java/com/baeldung/modelmapper/service/UserService.java new file mode 100644 index 0000000000..e445f836a4 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/modelmapper/service/UserService.java @@ -0,0 +1,25 @@ +package com.baeldung.modelmapper.service; + +import org.springframework.stereotype.Service; + +import com.baeldung.modelmapper.model.Preference; +import com.baeldung.modelmapper.model.User; + +@Service +public class UserService implements IUserService { + + @Override + public User getCurrentUser() { + + Preference preference = new Preference(); + preference.setId(1L); + preference.setTimezone("Asia/Calcutta"); + + User user = new User(); + user.setId(1L); + user.setName("Micheal"); + user.setPreference(preference); + + return user; + } +} \ No newline at end of file diff --git a/spring-boot/src/test/java/com/baeldung/modelmapper/PostDtoUnitTest.java b/spring-boot/src/test/java/com/baeldung/modelmapper/PostDtoUnitTest.java new file mode 100644 index 0000000000..34ec4db783 --- /dev/null +++ b/spring-boot/src/test/java/com/baeldung/modelmapper/PostDtoUnitTest.java @@ -0,0 +1,40 @@ +package com.baeldung.modelmapper; + +import static org.junit.Assert.assertEquals; +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; +import org.junit.Test; +import org.modelmapper.ModelMapper; + +import com.baeldung.modelmapper.dto.PostDto; +import com.baeldung.modelmapper.model.Post; + +public class PostDtoUnitTest { + + private ModelMapper modelMapper = new ModelMapper(); + + @Test + public void whenConvertPostEntityToPostDto_thenCorrect() { + Post post = new Post(); + post.setId(Long.valueOf(1)); + post.setTitle(randomAlphabetic(6)); + post.setUrl("www.test.com"); + + PostDto postDto = modelMapper.map(post, PostDto.class); + assertEquals(post.getId(), postDto.getId()); + assertEquals(post.getTitle(), postDto.getTitle()); + assertEquals(post.getUrl(), postDto.getUrl()); + } + + @Test + public void whenConvertPostDtoToPostEntity_thenCorrect() { + PostDto postDto = new PostDto(); + postDto.setId(Long.valueOf(1)); + postDto.setTitle(randomAlphabetic(6)); + postDto.setUrl("www.test.com"); + + Post post = modelMapper.map(postDto, Post.class); + assertEquals(postDto.getId(), post.getId()); + assertEquals(postDto.getTitle(), post.getTitle()); + assertEquals(postDto.getUrl(), post.getUrl()); + } +} \ No newline at end of file From 5174d9495bfd515ee2af9bbfb10eac9a2c79bfec Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 16 Dec 2018 17:11:21 +0530 Subject: [PATCH 071/359] [BAEL-10840] - Moved FTP related code back to libraries module --- libraries-apache-commons/README.md | 3 +-- libraries-apache-commons/pom.xml | 7 ------- libraries/README.md | 1 + libraries/pom.xml | 13 +++++++++++++ .../src/main/java/com/baeldung/ftp/FtpClient.java | 0 .../com/baeldung/ftp/FtpClientIntegrationTest.java | 0 .../baeldung/ftp/JdkFtpClientIntegrationTest.java | 0 7 files changed, 15 insertions(+), 9 deletions(-) rename {libraries-apache-commons => libraries}/src/main/java/com/baeldung/ftp/FtpClient.java (100%) rename {libraries-apache-commons => libraries}/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java (100%) rename {libraries-apache-commons => libraries}/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java (100%) diff --git a/libraries-apache-commons/README.md b/libraries-apache-commons/README.md index 66090e3709..01f2379588 100644 --- a/libraries-apache-commons/README.md +++ b/libraries-apache-commons/README.md @@ -17,5 +17,4 @@ - [Apache Commons Collections BidiMap](http://www.baeldung.com/commons-collections-bidi-map) - [Apache Commons Collections MapUtils](http://www.baeldung.com/apache-commons-map-utils) - [Histograms with Apache Commons Frequency](http://www.baeldung.com/apache-commons-frequency) -- [An Introduction to Apache Commons Lang 3](https://www.baeldung.com/java-commons-lang-3) -- [Implementing a FTP-Client in Java](http://www.baeldung.com/java-ftp-client) \ No newline at end of file +- [An Introduction to Apache Commons Lang 3](https://www.baeldung.com/java-commons-lang-3) \ No newline at end of file diff --git a/libraries-apache-commons/pom.xml b/libraries-apache-commons/pom.xml index f61a7a4a9a..c7ff918af9 100644 --- a/libraries-apache-commons/pom.xml +++ b/libraries-apache-commons/pom.xml @@ -83,12 +83,6 @@ ${org.hamcrest.java-hamcrest.version} test - - org.mockftpserver - MockFtpServer - ${mockftpserver.version} - test - @@ -110,7 +104,6 @@ 3.6 1.3 3.6.1 - 2.7.1 diff --git a/libraries/README.md b/libraries/README.md index 28184c161b..ce2445f3e0 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -65,6 +65,7 @@ - [Guide to JMapper](http://www.baeldung.com/jmapper) - [Exactly Once Processing in Kafka](https://www.baeldung.com/kafka-exactly-once) - [An Introduction to SuanShu](https://www.baeldung.com/suanshu) +- [Implementing a FTP-Client in Java](http://www.baeldung.com/java-ftp-client) The libraries module contains examples related to small libraries that are relatively easy to use and does not require any separate module of its own. diff --git a/libraries/pom.xml b/libraries/pom.xml index 16d79a59b1..2ad4871e3f 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -55,6 +55,11 @@ commons-lang3 ${commons-lang.version} + + commons-net + commons-net + ${commons-net.version} + tec.units unit-ri @@ -664,6 +669,12 @@ ${derive4j.version} true + + org.mockftpserver + MockFtpServer + ${mockftpserver.version} + test + @@ -888,6 +899,8 @@ 3.3.0 3.0.2 1.1.0 + 2.7.1 + 3.6 diff --git a/libraries-apache-commons/src/main/java/com/baeldung/ftp/FtpClient.java b/libraries/src/main/java/com/baeldung/ftp/FtpClient.java similarity index 100% rename from libraries-apache-commons/src/main/java/com/baeldung/ftp/FtpClient.java rename to libraries/src/main/java/com/baeldung/ftp/FtpClient.java diff --git a/libraries-apache-commons/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java b/libraries/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java similarity index 100% rename from libraries-apache-commons/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java rename to libraries/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java diff --git a/libraries-apache-commons/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java b/libraries/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java similarity index 100% rename from libraries-apache-commons/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java rename to libraries/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java From 1e29af79ffaf70c65fad2652d4f5da1dec7a95e5 Mon Sep 17 00:00:00 2001 From: amdegregorio Date: Sun, 16 Dec 2018 06:58:45 -0500 Subject: [PATCH 072/359] Example code for Guide to Packages --- .../java/com/baeldung/packages/TodoApp.java | 22 +++++++++++ .../java/com/baeldung/packages/TodoList.java | 27 +++++++++++++ .../baeldung/packages/domain/TodoItem.java | 39 +++++++++++++++++++ .../baeldung/packages/PackagesUnitTest.java | 23 +++++++++++ 4 files changed, 111 insertions(+) create mode 100644 core-java-lang/src/main/java/com/baeldung/packages/TodoApp.java create mode 100644 core-java-lang/src/main/java/com/baeldung/packages/TodoList.java create mode 100644 core-java-lang/src/main/java/com/baeldung/packages/domain/TodoItem.java create mode 100644 core-java-lang/src/test/java/com/baeldung/packages/PackagesUnitTest.java diff --git a/core-java-lang/src/main/java/com/baeldung/packages/TodoApp.java b/core-java-lang/src/main/java/com/baeldung/packages/TodoApp.java new file mode 100644 index 0000000000..0f4a56f708 --- /dev/null +++ b/core-java-lang/src/main/java/com/baeldung/packages/TodoApp.java @@ -0,0 +1,22 @@ +package com.baeldung.packages; + +import java.time.LocalDate; + +import com.baeldung.packages.domain.TodoItem; + +public class TodoApp { + + public static void main(String[] args) { + TodoList todoList = new TodoList(); + for (int i = 0; i < 3; i++) { + TodoItem item = new TodoItem(); + item.setId(Long.valueOf((long)i)); + item.setDescription("Todo item " + (i + 1)); + item.setDueDate(LocalDate.now().plusDays((long)(i + 1))); + todoList.addTodoItem(item); + } + + todoList.getTodoItems().forEach((TodoItem todoItem) -> System.out.println(todoItem.toString())); + } + +} diff --git a/core-java-lang/src/main/java/com/baeldung/packages/TodoList.java b/core-java-lang/src/main/java/com/baeldung/packages/TodoList.java new file mode 100644 index 0000000000..6ed6cd4ec1 --- /dev/null +++ b/core-java-lang/src/main/java/com/baeldung/packages/TodoList.java @@ -0,0 +1,27 @@ +package com.baeldung.packages; + +import java.util.ArrayList; +import java.util.List; + +import com.baeldung.packages.domain.TodoItem; + +public class TodoList { + private List todoItems; + + public void addTodoItem(TodoItem todoItem) { + if (todoItems == null) { + todoItems = new ArrayList(); + } + + todoItems.add(todoItem); + } + + public List getTodoItems() { + return todoItems; + } + + public void setTodoItems(List todoItems) { + this.todoItems = todoItems; + } + +} diff --git a/core-java-lang/src/main/java/com/baeldung/packages/domain/TodoItem.java b/core-java-lang/src/main/java/com/baeldung/packages/domain/TodoItem.java new file mode 100644 index 0000000000..972e574a7f --- /dev/null +++ b/core-java-lang/src/main/java/com/baeldung/packages/domain/TodoItem.java @@ -0,0 +1,39 @@ +package com.baeldung.packages.domain; + +import java.time.LocalDate; + +public class TodoItem { + private Long id; + private String description; + private LocalDate dueDate; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public LocalDate getDueDate() { + return dueDate; + } + + public void setDueDate(LocalDate dueDate) { + this.dueDate = dueDate; + } + + @Override + public String toString() { + return "TodoItem [id=" + id + ", description=" + description + ", dueDate=" + dueDate + "]"; + } + +} diff --git a/core-java-lang/src/test/java/com/baeldung/packages/PackagesUnitTest.java b/core-java-lang/src/test/java/com/baeldung/packages/PackagesUnitTest.java new file mode 100644 index 0000000000..212fb7b3c7 --- /dev/null +++ b/core-java-lang/src/test/java/com/baeldung/packages/PackagesUnitTest.java @@ -0,0 +1,23 @@ +package com.baeldung.packages; + +import static org.junit.Assert.assertEquals; + +import java.time.LocalDate; + +import org.junit.Test; + +import com.baeldung.packages.domain.TodoItem; + +public class PackagesUnitTest { + + @Test + public void whenTodoItemAdded_ThenSizeIncreases() { + TodoItem todoItem = new TodoItem(); + todoItem.setId(1L); + todoItem.setDescription("Test the Todo List"); + todoItem.setDueDate(LocalDate.now()); + TodoList todoList = new TodoList(); + todoList.addTodoItem(todoItem); + assertEquals(1, todoList.getTodoItems().size()); + } +} From c97e97d175ef89e9bd93b3738a840f77113a174d Mon Sep 17 00:00:00 2001 From: Loredana Date: Sun, 16 Dec 2018 16:25:49 +0200 Subject: [PATCH 073/359] add readmes, remove extra modules --- core-java-11/README.md | 5 + mvn-wrapper/.gitignore | 24 -- mvn-wrapper/.mvn/wrapper/maven-wrapper.jar | Bin 48336 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 1 - mvn-wrapper/README.md | 22 -- mvn-wrapper/mvnw | 227 ------------------ mvn-wrapper/mvnw.cmd | 145 ----------- mvn-wrapper/pom.xml | 38 --- .../com/baeldung/MvnWrapperApplication.java | 11 - mvn-wrapper/src/main/resources/logback.xml | 13 - parent-boot-1/README.md | 2 + parent-boot-2/README.md | 3 +- parent-kotlin/README.md | 2 + .../spring-boot-persistence-mongodb/README.md | 3 + .../spring-data-cassandra-reactive/README.md | 3 + pom.xml | 11 - spring-cloud/README.md | 13 +- spring-cloud/spring-cloud-archaius/README.md | 7 +- .../spring-cloud-aws/.attach_pid23938 | 0 spring-cloud/spring-cloud-aws/README.md | 8 +- .../src/test/resources/test-file-upload.txt | 1 + .../spring-cloud-connectors-heroku/README.md | 2 + spring-cloud/spring-cloud-consul/README.md | 3 + spring-cloud/spring-cloud-contract/README.md | 2 + .../spring-cloud-kubernetes/README.md | 3 + spring-cloud/spring-cloud-rest/README.md | 2 + .../spring-cloud-ribbon-client/README.md | 2 + spring-cloud/spring-cloud-security/README.md | 2 + spring-cloud/spring-cloud-task/README.md | 2 + spring-cloud/spring-cloud-vault/README.md | 3 + spring-cloud/spring-cloud-zookeeper/README.md | 2 + .../README.md | 2 + spring-cloud/spring-cloud-zuul/README.md | 2 + spring-mustache/.gitignore | 24 -- spring-mustache/README.md | 1 - spring-mustache/pom.xml | 55 ----- .../SpringMustacheApplication.java | 32 --- .../controller/ArticleController.java | 43 ---- .../springmustache/model/Article.java | 41 ---- .../src/main/resources/application.properties | 0 .../src/main/resources/logback.xml | 13 - .../main/resources/templates/error/error.html | 9 - .../src/main/resources/templates/index.html | 9 - .../resources/templates/layout/article.html | 8 - .../resources/templates/layout/footer.html | 2 - .../resources/templates/layout/header.html | 11 - ...ingMustacheApplicationIntegrationTest.java | 30 --- spring-mybatis/README.md | 1 - spring-mybatis/pom.xml | 73 ------ .../application/SpringMyBatisApplication.java | 48 ---- .../mybatis/controller/StudentController.java | 60 ----- .../spring/mybatis/mappers/StudentMapper.java | 19 -- .../spring/mybatis/model/Student.java | 55 ----- .../spring/mybatis/model/StudentLogin.java | 18 -- .../mybatis/service/StudentService.java | 9 - .../mybatis/service/StudentServiceImpl.java | 40 --- spring-mybatis/src/main/resources/logback.xml | 13 - .../src/main/resources/mybatis-spring.xml | 54 ----- .../webapp/WEB-INF/conf/mybatis-spring.xml | 51 ---- .../src/main/webapp/WEB-INF/jsp/failure.jsp | 36 --- .../src/main/webapp/WEB-INF/jsp/login.jsp | 81 ------- .../src/main/webapp/WEB-INF/jsp/signup.jsp | 130 ---------- .../src/main/webapp/WEB-INF/jsp/success.jsp | 35 --- .../lib/mysql-connector-java-5.1.40-bin.jar | Bin 990927 -> 0 bytes .../src/main/webapp/WEB-INF/web.xml | 21 -- spring-mybatis/src/main/webapp/index.jsp | 34 --- spring-rest-embedded-tomcat/pom.xml | 79 ------ .../configuration/AppInitializer.java | 22 -- .../configuration/UserConfiguration.java | 12 - .../embedded/controller/UserController.java | 28 --- .../org/baeldung/embedded/domain/User.java | 23 -- .../embedded/service/UserService.java | 38 --- .../src/main/resources/logback.xml | 13 - .../src/main/webapp/emptyFile | 0 .../SpringContextIntegrationTest.java | 18 -- .../baeldung/embedded/EmbeddedTomcatApp.java | 70 ------ .../embedded/EmbeddedTomcatRunner.java | 45 ---- .../embedded/UserIntegrationTest.java | 60 ----- sse-jaxrs/pom.xml | 22 -- sse-jaxrs/sse-jaxrs-client/pom.xml | 62 ----- .../sse/jaxrs/client/SseClientApp.java | 48 ---- .../jaxrs/client/SseClientBroadcastApp.java | 52 ---- .../src/main/resources/logback.xml | 13 - sse-jaxrs/sse-jaxrs-server/pom.xml | 85 ------- .../com/baeldung/sse/jaxrs/AppConfig.java | 8 - .../com/baeldung/sse/jaxrs/SseResource.java | 119 --------- .../java/com/baeldung/sse/jaxrs/Stock.java | 50 ---- .../com/baeldung/sse/jaxrs/StockService.java | 78 ------ .../src/main/liberty/config/server.xml | 7 - .../src/main/resources/META-INF/beans.xml | 6 - .../src/main/resources/logback.xml | 13 - .../src/main/webapp/WEB-INF/web.xml | 11 - .../src/main/webapp/index.html | 1 - .../src/main/webapp/sse-broadcast.html | 38 --- .../sse-jaxrs-server/src/main/webapp/sse.html | 38 --- 95 files changed, 59 insertions(+), 2622 deletions(-) create mode 100644 core-java-11/README.md delete mode 100644 mvn-wrapper/.gitignore delete mode 100755 mvn-wrapper/.mvn/wrapper/maven-wrapper.jar delete mode 100755 mvn-wrapper/.mvn/wrapper/maven-wrapper.properties delete mode 100644 mvn-wrapper/README.md delete mode 100755 mvn-wrapper/mvnw delete mode 100755 mvn-wrapper/mvnw.cmd delete mode 100644 mvn-wrapper/pom.xml delete mode 100644 mvn-wrapper/src/main/java/com/baeldung/MvnWrapperApplication.java delete mode 100644 mvn-wrapper/src/main/resources/logback.xml create mode 100644 parent-boot-1/README.md create mode 100644 parent-kotlin/README.md create mode 100644 persistence-modules/spring-boot-persistence-mongodb/README.md create mode 100644 persistence-modules/spring-data-cassandra-reactive/README.md rename mvn-wrapper/src/main/resources/application.properties => spring-cloud/spring-cloud-aws/.attach_pid23938 (100%) create mode 100644 spring-cloud/spring-cloud-aws/src/test/resources/test-file-upload.txt create mode 100644 spring-cloud/spring-cloud-connectors-heroku/README.md create mode 100644 spring-cloud/spring-cloud-consul/README.md create mode 100644 spring-cloud/spring-cloud-contract/README.md create mode 100644 spring-cloud/spring-cloud-kubernetes/README.md create mode 100644 spring-cloud/spring-cloud-rest/README.md create mode 100644 spring-cloud/spring-cloud-ribbon-client/README.md create mode 100644 spring-cloud/spring-cloud-security/README.md create mode 100644 spring-cloud/spring-cloud-task/README.md create mode 100644 spring-cloud/spring-cloud-vault/README.md create mode 100644 spring-cloud/spring-cloud-zookeeper/README.md create mode 100644 spring-cloud/spring-cloud-zuul-eureka-integration/README.md create mode 100644 spring-cloud/spring-cloud-zuul/README.md delete mode 100644 spring-mustache/.gitignore delete mode 100644 spring-mustache/README.md delete mode 100644 spring-mustache/pom.xml delete mode 100644 spring-mustache/src/main/java/com/baeldung/springmustache/SpringMustacheApplication.java delete mode 100644 spring-mustache/src/main/java/com/baeldung/springmustache/controller/ArticleController.java delete mode 100644 spring-mustache/src/main/java/com/baeldung/springmustache/model/Article.java delete mode 100644 spring-mustache/src/main/resources/application.properties delete mode 100644 spring-mustache/src/main/resources/logback.xml delete mode 100644 spring-mustache/src/main/resources/templates/error/error.html delete mode 100644 spring-mustache/src/main/resources/templates/index.html delete mode 100644 spring-mustache/src/main/resources/templates/layout/article.html delete mode 100644 spring-mustache/src/main/resources/templates/layout/footer.html delete mode 100644 spring-mustache/src/main/resources/templates/layout/header.html delete mode 100644 spring-mustache/src/test/java/com/baeldung/springmustache/SpringMustacheApplicationIntegrationTest.java delete mode 100644 spring-mybatis/README.md delete mode 100644 spring-mybatis/pom.xml delete mode 100644 spring-mybatis/src/main/java/com/baeldung/spring/mybatis/application/SpringMyBatisApplication.java delete mode 100644 spring-mybatis/src/main/java/com/baeldung/spring/mybatis/controller/StudentController.java delete mode 100644 spring-mybatis/src/main/java/com/baeldung/spring/mybatis/mappers/StudentMapper.java delete mode 100644 spring-mybatis/src/main/java/com/baeldung/spring/mybatis/model/Student.java delete mode 100644 spring-mybatis/src/main/java/com/baeldung/spring/mybatis/model/StudentLogin.java delete mode 100644 spring-mybatis/src/main/java/com/baeldung/spring/mybatis/service/StudentService.java delete mode 100644 spring-mybatis/src/main/java/com/baeldung/spring/mybatis/service/StudentServiceImpl.java delete mode 100644 spring-mybatis/src/main/resources/logback.xml delete mode 100644 spring-mybatis/src/main/resources/mybatis-spring.xml delete mode 100644 spring-mybatis/src/main/webapp/WEB-INF/conf/mybatis-spring.xml delete mode 100644 spring-mybatis/src/main/webapp/WEB-INF/jsp/failure.jsp delete mode 100644 spring-mybatis/src/main/webapp/WEB-INF/jsp/login.jsp delete mode 100644 spring-mybatis/src/main/webapp/WEB-INF/jsp/signup.jsp delete mode 100644 spring-mybatis/src/main/webapp/WEB-INF/jsp/success.jsp delete mode 100644 spring-mybatis/src/main/webapp/WEB-INF/lib/mysql-connector-java-5.1.40-bin.jar delete mode 100644 spring-mybatis/src/main/webapp/WEB-INF/web.xml delete mode 100644 spring-mybatis/src/main/webapp/index.jsp delete mode 100644 spring-rest-embedded-tomcat/pom.xml delete mode 100644 spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/configuration/AppInitializer.java delete mode 100644 spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/configuration/UserConfiguration.java delete mode 100644 spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/controller/UserController.java delete mode 100644 spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/domain/User.java delete mode 100644 spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/service/UserService.java delete mode 100644 spring-rest-embedded-tomcat/src/main/resources/logback.xml delete mode 100644 spring-rest-embedded-tomcat/src/main/webapp/emptyFile delete mode 100644 spring-rest-embedded-tomcat/src/test/java/org/baeldung/SpringContextIntegrationTest.java delete mode 100644 spring-rest-embedded-tomcat/src/test/java/org/baeldung/embedded/EmbeddedTomcatApp.java delete mode 100644 spring-rest-embedded-tomcat/src/test/java/org/baeldung/embedded/EmbeddedTomcatRunner.java delete mode 100644 spring-rest-embedded-tomcat/src/test/java/org/baeldung/embedded/UserIntegrationTest.java delete mode 100644 sse-jaxrs/pom.xml delete mode 100644 sse-jaxrs/sse-jaxrs-client/pom.xml delete mode 100644 sse-jaxrs/sse-jaxrs-client/src/main/java/com/baeldung/sse/jaxrs/client/SseClientApp.java delete mode 100644 sse-jaxrs/sse-jaxrs-client/src/main/java/com/baeldung/sse/jaxrs/client/SseClientBroadcastApp.java delete mode 100644 sse-jaxrs/sse-jaxrs-client/src/main/resources/logback.xml delete mode 100644 sse-jaxrs/sse-jaxrs-server/pom.xml delete mode 100644 sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/AppConfig.java delete mode 100644 sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/SseResource.java delete mode 100644 sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/Stock.java delete mode 100644 sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/StockService.java delete mode 100644 sse-jaxrs/sse-jaxrs-server/src/main/liberty/config/server.xml delete mode 100644 sse-jaxrs/sse-jaxrs-server/src/main/resources/META-INF/beans.xml delete mode 100644 sse-jaxrs/sse-jaxrs-server/src/main/resources/logback.xml delete mode 100644 sse-jaxrs/sse-jaxrs-server/src/main/webapp/WEB-INF/web.xml delete mode 100644 sse-jaxrs/sse-jaxrs-server/src/main/webapp/index.html delete mode 100644 sse-jaxrs/sse-jaxrs-server/src/main/webapp/sse-broadcast.html delete mode 100644 sse-jaxrs/sse-jaxrs-server/src/main/webapp/sse.html diff --git a/core-java-11/README.md b/core-java-11/README.md new file mode 100644 index 0000000000..181ada3f45 --- /dev/null +++ b/core-java-11/README.md @@ -0,0 +1,5 @@ +### Relevant articles + +- [Java 11 Single File Source Code](https://www.baeldung.com/java-single-file-source-code) +- [Java 11 Local Variable Syntax for Lambda Parameters](https://www.baeldung.com/java-var-lambda-params) + diff --git a/mvn-wrapper/.gitignore b/mvn-wrapper/.gitignore deleted file mode 100644 index 2af7cefb0a..0000000000 --- a/mvn-wrapper/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -target/ -!.mvn/wrapper/maven-wrapper.jar - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -nbproject/private/ -build/ -nbbuild/ -dist/ -nbdist/ -.nb-gradle/ \ No newline at end of file diff --git a/mvn-wrapper/.mvn/wrapper/maven-wrapper.jar b/mvn-wrapper/.mvn/wrapper/maven-wrapper.jar deleted file mode 100755 index f775b1c04cf89b25c7814d3a8a7c810301092e57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48336 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 \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi - -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" - # TODO classpath? -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="`which java`" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi - - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` - fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" - fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -if [ -z "$BASE_DIR" ]; then - exit 1; -fi - -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR -fi -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` -fi - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -exec "$JAVACMD" \ - $MAVEN_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvn-wrapper/mvnw.cmd b/mvn-wrapper/mvnw.cmd deleted file mode 100755 index 4f0b068a03..0000000000 --- a/mvn-wrapper/mvnw.cmd +++ /dev/null @@ -1,145 +0,0 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM http://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Maven2 Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM set title of command window -title %0 -@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" - -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% diff --git a/mvn-wrapper/pom.xml b/mvn-wrapper/pom.xml deleted file mode 100644 index 7f45fe218d..0000000000 --- a/mvn-wrapper/pom.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - 4.0.0 - mvn-wrapper - 0.0.1-SNAPSHOT - jar - mvn-wrapper - Setting up the Maven Wrapper - - - parent-boot-1 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-1 - - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-web - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/mvn-wrapper/src/main/java/com/baeldung/MvnWrapperApplication.java b/mvn-wrapper/src/main/java/com/baeldung/MvnWrapperApplication.java deleted file mode 100644 index 3007d24ed0..0000000000 --- a/mvn-wrapper/src/main/java/com/baeldung/MvnWrapperApplication.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class MvnWrapperApplication { - public static void main(String[] args) { - SpringApplication.run(MvnWrapperApplication.class, args); - } -} diff --git a/mvn-wrapper/src/main/resources/logback.xml b/mvn-wrapper/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/mvn-wrapper/src/main/resources/logback.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - \ No newline at end of file diff --git a/parent-boot-1/README.md b/parent-boot-1/README.md new file mode 100644 index 0000000000..8b312c348a --- /dev/null +++ b/parent-boot-1/README.md @@ -0,0 +1,2 @@ + +This is a parent module for all projects using Spring Boot 1. diff --git a/parent-boot-2/README.md b/parent-boot-2/README.md index ff12555376..3f18bdf38e 100644 --- a/parent-boot-2/README.md +++ b/parent-boot-2/README.md @@ -1 +1,2 @@ -## Relevant articles: + +This is a parent module for all projects using Spring Boot 2. diff --git a/parent-kotlin/README.md b/parent-kotlin/README.md new file mode 100644 index 0000000000..6c17a6ac29 --- /dev/null +++ b/parent-kotlin/README.md @@ -0,0 +1,2 @@ + +Parent module for Kotlin projects. diff --git a/persistence-modules/spring-boot-persistence-mongodb/README.md b/persistence-modules/spring-boot-persistence-mongodb/README.md new file mode 100644 index 0000000000..f093d4baf0 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/README.md @@ -0,0 +1,3 @@ +# Relevant Articles + +- [Auto-Generated Field for MongoDB using Spring Boot](https://www.baeldung.com/spring-boot-mongodb-auto-generated-field) diff --git a/persistence-modules/spring-data-cassandra-reactive/README.md b/persistence-modules/spring-data-cassandra-reactive/README.md new file mode 100644 index 0000000000..87a61d46b3 --- /dev/null +++ b/persistence-modules/spring-data-cassandra-reactive/README.md @@ -0,0 +1,3 @@ +#Relevant Articles + +- [Spring Data with Reactive Cassandra](https://www.baeldung.com/spring-data-cassandra-reactive) diff --git a/pom.xml b/pom.xml index f22aeea5e6..2a3102880a 100644 --- a/pom.xml +++ b/pom.xml @@ -486,7 +486,6 @@ msf4j mustache - mvn-wrapper mybatis noexception @@ -674,7 +673,6 @@ spring-mobile spring-mockito - spring-mustache spring-mvc-forms-jsp spring-mvc-forms-thymeleaf spring-mvc-java @@ -683,7 +681,6 @@ spring-mvc-velocity spring-mvc-webflow spring-mvc-xml - spring-mybatis spring-protobuf @@ -694,7 +691,6 @@ spring-remoting spring-rest spring-rest-angular - spring-rest-embedded-tomcat spring-rest-full spring-rest-hal-browser spring-rest-query-language @@ -752,7 +748,6 @@ spring-zuul - sse-jaxrs static-analysis stripe structurizr @@ -903,7 +898,6 @@ spring-remoting/remoting-rmi/remoting-rmi-server spring-rest spring-rest-angular - spring-rest-embedded-tomcat spring-rest-full spring-rest-simple spring-resttemplate @@ -1196,7 +1190,6 @@ msf4j mustache - mvn-wrapper mybatis noexception @@ -1380,7 +1373,6 @@ spring-mobile spring-mockito - spring-mustache spring-mvc-forms-jsp spring-mvc-forms-thymeleaf spring-mvc-java @@ -1389,7 +1381,6 @@ spring-mvc-velocity spring-mvc-webflow spring-mvc-xml - spring-mybatis spring-protobuf @@ -1400,7 +1391,6 @@ spring-remoting spring-rest spring-rest-angular - spring-rest-embedded-tomcat spring-rest-full spring-rest-hal-browser spring-rest-query-language @@ -1458,7 +1448,6 @@ spring-zuul - sse-jaxrs static-analysis stripe structurizr diff --git a/spring-cloud/README.md b/spring-cloud/README.md index dc43bd1a66..eb2e46c3d0 100644 --- a/spring-cloud/README.md +++ b/spring-cloud/README.md @@ -15,19 +15,8 @@ ### Relevant Articles: - [Intro to Spring Cloud Netflix - Hystrix](http://www.baeldung.com/spring-cloud-netflix-hystrix) - [Dockerizing a Spring Boot Application](http://www.baeldung.com/dockerizing-spring-boot-application) -- [Introduction to Spring Cloud Rest Client with Netflix Ribbon](http://www.baeldung.com/spring-cloud-rest-client-with-netflix-ribbon) -- [A Quick Guide to Spring Cloud Consul](http://www.baeldung.com/spring-cloud-consul) -- [An Introduction to Spring Cloud Zookeeper](http://www.baeldung.com/spring-cloud-zookeeper) - [Using a Spring Cloud App Starter](http://www.baeldung.com/using-a-spring-cloud-app-starter) -- [Spring Cloud Connectors and Heroku](http://www.baeldung.com/spring-cloud-heroku) -- [An Example of Load Balancing with Zuul and Eureka](http://www.baeldung.com/zuul-load-balancing) -- [An Intro to Spring Cloud Contract](http://www.baeldung.com/spring-cloud-contract) - [Using a Spring Cloud App Starter](http://www.baeldung.com/spring-cloud-app-starter) - [Instance Profile Credentials using Spring Cloud](http://www.baeldung.com/spring-cloud-instance-profiles) -- [An Intro to Spring Cloud Security](http://www.baeldung.com/spring-cloud-security) -- [An Intro to Spring Cloud Task](http://www.baeldung.com/spring-cloud-task) - [Running Spring Boot Applications With Minikube](http://www.baeldung.com/spring-boot-minikube) -- [Introduction to Netflix Archaius with Spring Cloud](https://www.baeldung.com/netflix-archaius-spring-cloud-integration) -- [An Intro to Spring Cloud Vault](https://www.baeldung.com/spring-cloud-vault) -- [Netflix Archaius with Various Database Configurations](https://www.baeldung.com/netflix-archaius-database-configurations) -- [Rate Limiting in Spring Cloud Netflix Zuul](https://www.baeldung.com/spring-cloud-zuul-rate-limit) + diff --git a/spring-cloud/spring-cloud-archaius/README.md b/spring-cloud/spring-cloud-archaius/README.md index 9de26352e1..ae853c6ef0 100644 --- a/spring-cloud/spring-cloud-archaius/README.md +++ b/spring-cloud/spring-cloud-archaius/README.md @@ -1,3 +1,8 @@ +# Relevant Articles + +- [Introduction to Netflix Archaius with Spring Cloud](https://www.baeldung.com/netflix-archaius-spring-cloud-integration) +- [Netflix Archaius with Various Database Configurations](https://www.baeldung.com/netflix-archaius-database-configurations) + # Spring Cloud Archaius #### Basic Config @@ -11,4 +16,4 @@ These properties are set up on the main method, since Archaius uses System prope #### Additional Sources In this service we create a new AbstractConfiguration bean, setting up a new Configuration Properties source. -These properties have precedence over all the other properties in the Archaius Composite Configuration. \ No newline at end of file +These properties have precedence over all the other properties in the Archaius Composite Configuration. diff --git a/mvn-wrapper/src/main/resources/application.properties b/spring-cloud/spring-cloud-aws/.attach_pid23938 similarity index 100% rename from mvn-wrapper/src/main/resources/application.properties rename to spring-cloud/spring-cloud-aws/.attach_pid23938 diff --git a/spring-cloud/spring-cloud-aws/README.md b/spring-cloud/spring-cloud-aws/README.md index 1340712c7a..36d0c7080e 100644 --- a/spring-cloud/spring-cloud-aws/README.md +++ b/spring-cloud/spring-cloud-aws/README.md @@ -1,5 +1,11 @@ # Spring Cloud AWS +# Relevant Articles +- [Spring Cloud AWS – S3](https://www.baeldung.com/spring-cloud-aws-s3) +- [Spring Cloud AWS – EC2](https://www.baeldung.com/spring-cloud-aws-ec2) +- [Spring Cloud AWS – RDS](https://www.baeldung.com/spring-cloud-aws-rds) +- [Spring Cloud AWS – Messaging Support](https://www.baeldung.com/spring-cloud-aws-messaging) + #### Running the Integration Tests To run the Integration Tests, we need to have an AWS account and have API keys generated for programmatic access. Edit @@ -23,4 +29,4 @@ Multiple application classes are available under this project. To launch Instan ``` com.baeldung.spring.cloud.aws.InstanceProfileAwsApplication -``` \ No newline at end of file +``` diff --git a/spring-cloud/spring-cloud-aws/src/test/resources/test-file-upload.txt b/spring-cloud/spring-cloud-aws/src/test/resources/test-file-upload.txt new file mode 100644 index 0000000000..7c4a013e52 --- /dev/null +++ b/spring-cloud/spring-cloud-aws/src/test/resources/test-file-upload.txt @@ -0,0 +1 @@ +aaa \ No newline at end of file diff --git a/spring-cloud/spring-cloud-connectors-heroku/README.md b/spring-cloud/spring-cloud-connectors-heroku/README.md new file mode 100644 index 0000000000..7c58d2526f --- /dev/null +++ b/spring-cloud/spring-cloud-connectors-heroku/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Spring Cloud Connectors and Heroku](http://www.baeldung.com/spring-cloud-heroku) diff --git a/spring-cloud/spring-cloud-consul/README.md b/spring-cloud/spring-cloud-consul/README.md new file mode 100644 index 0000000000..47dc39f0d5 --- /dev/null +++ b/spring-cloud/spring-cloud-consul/README.md @@ -0,0 +1,3 @@ + +### Relevant Articles: +- [A Quick Guide to Spring Cloud Consul](http://www.baeldung.com/spring-cloud-consul) diff --git a/spring-cloud/spring-cloud-contract/README.md b/spring-cloud/spring-cloud-contract/README.md new file mode 100644 index 0000000000..70e056757b --- /dev/null +++ b/spring-cloud/spring-cloud-contract/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [An Intro to Spring Cloud Contract](http://www.baeldung.com/spring-cloud-contract) diff --git a/spring-cloud/spring-cloud-kubernetes/README.md b/spring-cloud/spring-cloud-kubernetes/README.md new file mode 100644 index 0000000000..295ead1c2f --- /dev/null +++ b/spring-cloud/spring-cloud-kubernetes/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Running Spring Boot Applications With Minikube](https://www.baeldung.com/spring-boot-minikube) diff --git a/spring-cloud/spring-cloud-rest/README.md b/spring-cloud/spring-cloud-rest/README.md new file mode 100644 index 0000000000..a650004708 --- /dev/null +++ b/spring-cloud/spring-cloud-rest/README.md @@ -0,0 +1,2 @@ + +Code for an ebook - "A REST API with Spring Boot and Spring Cloud" diff --git a/spring-cloud/spring-cloud-ribbon-client/README.md b/spring-cloud/spring-cloud-ribbon-client/README.md new file mode 100644 index 0000000000..596b3226c8 --- /dev/null +++ b/spring-cloud/spring-cloud-ribbon-client/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Introduction to Spring Cloud Rest Client with Netflix Ribbon](http://www.baeldung.com/spring-cloud-rest-client-with-netflix-ribbon) diff --git a/spring-cloud/spring-cloud-security/README.md b/spring-cloud/spring-cloud-security/README.md new file mode 100644 index 0000000000..7099406614 --- /dev/null +++ b/spring-cloud/spring-cloud-security/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [An Intro to Spring Cloud Security](http://www.baeldung.com/spring-cloud-security) diff --git a/spring-cloud/spring-cloud-task/README.md b/spring-cloud/spring-cloud-task/README.md new file mode 100644 index 0000000000..cabc1ac854 --- /dev/null +++ b/spring-cloud/spring-cloud-task/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [An Intro to Spring Cloud Task](http://www.baeldung.com/spring-cloud-task) diff --git a/spring-cloud/spring-cloud-vault/README.md b/spring-cloud/spring-cloud-vault/README.md new file mode 100644 index 0000000000..b7529b4a5c --- /dev/null +++ b/spring-cloud/spring-cloud-vault/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: +- [An Intro to Spring Cloud Vault](https://www.baeldung.com/spring-cloud-vault) + diff --git a/spring-cloud/spring-cloud-zookeeper/README.md b/spring-cloud/spring-cloud-zookeeper/README.md new file mode 100644 index 0000000000..a639833452 --- /dev/null +++ b/spring-cloud/spring-cloud-zookeeper/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [An Introduction to Spring Cloud Zookeeper](http://www.baeldung.com/spring-cloud-zookeeper) diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/README.md b/spring-cloud/spring-cloud-zuul-eureka-integration/README.md new file mode 100644 index 0000000000..32074f3699 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [An Example of Load Balancing with Zuul and Eureka](http://www.baeldung.com/zuul-load-balancing) diff --git a/spring-cloud/spring-cloud-zuul/README.md b/spring-cloud/spring-cloud-zuul/README.md new file mode 100644 index 0000000000..834917f159 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Rate Limiting in Spring Cloud Netflix Zuul](https://www.baeldung.com/spring-cloud-zuul-rate-limit) diff --git a/spring-mustache/.gitignore b/spring-mustache/.gitignore deleted file mode 100644 index 2af7cefb0a..0000000000 --- a/spring-mustache/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -target/ -!.mvn/wrapper/maven-wrapper.jar - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -nbproject/private/ -build/ -nbbuild/ -dist/ -nbdist/ -.nb-gradle/ \ No newline at end of file diff --git a/spring-mustache/README.md b/spring-mustache/README.md deleted file mode 100644 index ff12555376..0000000000 --- a/spring-mustache/README.md +++ /dev/null @@ -1 +0,0 @@ -## Relevant articles: diff --git a/spring-mustache/pom.xml b/spring-mustache/pom.xml deleted file mode 100644 index 9e4c528ee0..0000000000 --- a/spring-mustache/pom.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - 4.0.0 - - spring-mustache - jar - spring-mustache - Demo project for Spring Boot - - - parent-boot-1 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-1 - - - - - org.springframework.boot - spring-boot-starter-mustache - - - - org.springframework.boot - spring-boot-starter-test - test - - - org.webjars - bootstrap - ${bootstrap.version} - - - org.fluttercode.datafactory - datafactory - ${datafactory.version} - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - 3.3.7 - 0.8 - - - diff --git a/spring-mustache/src/main/java/com/baeldung/springmustache/SpringMustacheApplication.java b/spring-mustache/src/main/java/com/baeldung/springmustache/SpringMustacheApplication.java deleted file mode 100644 index 8cdf89d08a..0000000000 --- a/spring-mustache/src/main/java/com/baeldung/springmustache/SpringMustacheApplication.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.springmustache; - -import com.samskivert.mustache.Mustache; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.mustache.MustacheEnvironmentCollector; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.core.env.Environment; - -@SpringBootApplication -@ComponentScan(basePackages = {"com.baeldung"}) -public class SpringMustacheApplication { - - public static void main(String[] args) { - SpringApplication.run(SpringMustacheApplication.class, args); - } - - @Bean - public Mustache.Compiler mustacheCompiler(Mustache.TemplateLoader templateLoader, Environment environment) { - - MustacheEnvironmentCollector collector = new MustacheEnvironmentCollector(); - collector.setEnvironment(environment); - - return Mustache.compiler() - .defaultValue("Some Default Value") - .withLoader(templateLoader) - .withCollector(collector); - - } -} - diff --git a/spring-mustache/src/main/java/com/baeldung/springmustache/controller/ArticleController.java b/spring-mustache/src/main/java/com/baeldung/springmustache/controller/ArticleController.java deleted file mode 100644 index 5fc34c9f07..0000000000 --- a/spring-mustache/src/main/java/com/baeldung/springmustache/controller/ArticleController.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.baeldung.springmustache.controller; - -import com.baeldung.springmustache.model.Article; -import org.fluttercode.datafactory.impl.DataFactory; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.servlet.ModelAndView; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -@Controller -public class ArticleController { - - @GetMapping("/article") - public ModelAndView displayArticle(Map model) { - - List
articles = IntStream.range(0, 10) - .mapToObj(i -> generateArticle("Article Title " + i)) - .collect(Collectors.toList()); - - Map modelMap = new HashMap<>(); - modelMap.put("articles", articles); - - return new ModelAndView("index", modelMap); - } - - private Article generateArticle(String title) { - Article article = new Article(); - DataFactory factory = new DataFactory(); - article.setTitle(title); - article.setBody( - "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur faucibus tempor diam. In molestie arcu eget ante facilisis sodales. Maecenas porta tellus sapien, eget rutrum nisi blandit in. Mauris tempor auctor ante, ut blandit velit venenatis id. Ut varius, augue aliquet feugiat congue, arcu ipsum finibus purus, dapibus semper velit sapien venenatis magna. Nunc quam ex, aliquet at rutrum sed, vestibulum quis libero. In laoreet libero cursus maximus vulputate. Nullam in fermentum sem. Duis aliquam ullamcorper dui, et dictum justo placerat id. Aliquam pretium orci quis sapien convallis, non blandit est tempus."); - article.setPublishDate(factory.getBirthDate().toString()); - article.setAuthor(factory.getName()); - return article; - } -} - - diff --git a/spring-mustache/src/main/java/com/baeldung/springmustache/model/Article.java b/spring-mustache/src/main/java/com/baeldung/springmustache/model/Article.java deleted file mode 100644 index 78b08f877f..0000000000 --- a/spring-mustache/src/main/java/com/baeldung/springmustache/model/Article.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.baeldung.springmustache.model; - -public class Article { - private String title; - private String body; - private String author; - private String publishDate; - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getBody() { - return body; - } - - public void setBody(String body) { - this.body = body; - } - - public String getAuthor() { - return author; - } - - public void setAuthor(String author) { - this.author = author; - } - - public String getPublishDate() { - return publishDate; - } - - public void setPublishDate(String publishDate) { - this.publishDate = publishDate; - } - -} diff --git a/spring-mustache/src/main/resources/application.properties b/spring-mustache/src/main/resources/application.properties deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/spring-mustache/src/main/resources/logback.xml b/spring-mustache/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/spring-mustache/src/main/resources/logback.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - \ No newline at end of file diff --git a/spring-mustache/src/main/resources/templates/error/error.html b/spring-mustache/src/main/resources/templates/error/error.html deleted file mode 100644 index fa29db41c4..0000000000 --- a/spring-mustache/src/main/resources/templates/error/error.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - Something went wrong: {{status}} {{error}} - - - \ No newline at end of file diff --git a/spring-mustache/src/main/resources/templates/index.html b/spring-mustache/src/main/resources/templates/index.html deleted file mode 100644 index bda60f9d8f..0000000000 --- a/spring-mustache/src/main/resources/templates/index.html +++ /dev/null @@ -1,9 +0,0 @@ -{{>layout/header}} - -
{{>layout/article}}
- - - - -{{>layout/footer}} diff --git a/spring-mustache/src/main/resources/templates/layout/article.html b/spring-mustache/src/main/resources/templates/layout/article.html deleted file mode 100644 index 9d573580d3..0000000000 --- a/spring-mustache/src/main/resources/templates/layout/article.html +++ /dev/null @@ -1,8 +0,0 @@ -
- {{#articles}} -

{{title}}

-

{{publishDate}}

-

{{author}}

-

{{body}}

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

Student Enrollment Login failure

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

Welcome to Online Student Enrollment Application

-

Login to explore the complete features!

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

Welcome to Online Student Enrollment Application

-

Login to explore the complete features!

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

Student Enrollment Login success

-
-
-
- - Well done! You successfully logged-into the system. - Now you can explore the complete features! -
-
-
-
-
- ">Login - as different user? - - \ No newline at end of file diff --git a/spring-mybatis/src/main/webapp/WEB-INF/lib/mysql-connector-java-5.1.40-bin.jar b/spring-mybatis/src/main/webapp/WEB-INF/lib/mysql-connector-java-5.1.40-bin.jar deleted file mode 100644 index 60bef5cfbfbecf98b7371ba19389fe792be305e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 990927 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

p?9?j-;qd_@Iq|IAN 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�|x-gHa$IbyvGKSEgJtrf{vp> zoL$Ja49S#)L@cYv zI850>;ddd~7ls+@1~TbUNQq<&yPrJt&@ewBn&)ibtWh*P*kUAeecRarX zP8HYnb|{y1fNlzIhk6LBNIyDhCUkIG85x{x;eIz5a;L+qC{q;7nuKp}fTy)>)I=nQ ziiSK@3(k(1mO<<>TEI!8G{ZuI+^B)M&<|}6|y+?LoK_P__tVFD2pv6)@`2Zzv)zMl{277AP=T%Lur^~wI zRl`;a4#aw?@WyPO24~(&@`&+n4z!+@ASv-k&ZZ1R1X$8^5fxnDEIq|Swp_idtiIk> zk%_K->ZHnJrI|$9MkG##UQv{R`$SY0cj>52CzECQwqb`n~5i3yS|a;swzz1*6$29|zBn{TgcgUeuEdrUp))dz9xh+-Pdg5`VkIh$}_ zwfP%Q2~Qe1e!qt;X^&vvcalx7x!T^+;h$t`rqWgy_8&UUR$tw!{jc3`?wk1RF!eqt z^p$KPo7&Jb8cGC#(6{=!6Xg+|F)NmyJJ$>de4JF)Q+-qkPQN(9qJ{qOHZK?JQyF_^cAlJwUv!xTgb zh%|&oQgIrSsTs7o&affgx1cMiAmqY`;*RdIj7r+#LLKRX}_LO zuP#d{XJ?F2(d~s;xxnwTwWNr*<1afvmKi(d#8N*%wHe{n5k=|CGW#Hr zvgIjt#Ur~l&U3=+i^l0Nrs&@pX3&+Y;s=mM>9{Ox;qjV+k@aa{jlgf3xb5l8M1mI2 z9pMb6R2!4M%n!GS>MIoVnFKx;{z;xa7i~CjjJuDfunn%3zHBAcDol1jlfN7d(6018 zzW|HEi0EwE-*uLn8L<9L7W>LOfGwbNK{n^5uHMrT|MMC>C^`ti=Zb0_OV&BH_@pXDjF3rE z&eb)E+c`ZiKc(0+l?lFJ=#b6j@fgnys`X53Y1+Iw&h+V0lo8oi({E+<^ z;pLz~U%B|coy=Z!CGg7v&T}y~#2M5J%aXu2;SZwl7D>y|7$zJ1JOE)aKCgg+H*)f} zMI+jLg!@yfW(=kXg&|7TL(^u|enhQ@yl(X00eBCQ-QR2@jvaLOgZKl&9W;b}zB`yt zQQkm=;pW$H4}5~i^xH@eQIiM`kuncy6H8?WiER4&-x$<-wunGC!akX;82kBjm*HWe z$#<_*g<>bS%f5US(Hs z!XL#)5SzzAU$=A|(Sv6+VT?%# zV?a#E!owCR5loo!i}{oQ1scFS;pm|Y6BW@zO~cSQ^k=w{9c1%rs7i1cvW$^L@DOqwAY~Ioy5>y0dP|`qt7ZMxPC4io9lPmo%biltkq?!YF@{r!^a=Y*bYPN0Xmy6) z>?o2$4C|ORj`A>K&?u1-L1q-hsjCvzJZv*xW<$Qa}qM$t6f$$Djv^!yg$TbN7a8EQM4Ov^H31kXP00c4zL zIU32xU{v?@VqmtF2JO6HOU2kPo}mr-@Dbt(WvC~Wq3%PJfzcemXef3Lw?H5^S}eJ8 zEi#aIuI7O+{UyI+3o@xL=gh`?fbB8DZW3+Hq@ZKIYQsAR&b9!|mJoNJoAOHTKxOR2 zpulW@g9eCfFaNVHNy&i>kcT=p4{@424RGqTH6HupczJ;)HByI4*$riiP`D*Z=?!JN z`@0!xD?aw8aPSe_6ktoG0FMax3b`jNOBMh_nif# zPdbpUNT@f+cvl77sbm@;g=10*rlh2Ph@GlVeJ6~*3omMGyt0Vainm%ts1W&MLUnDV zhF$i#Fx~fuDI;-sFW#|tWRFhmHG>u_XGP(?BXg7{J$;nKeVJe8m$3I@!a}MpzXpTRD0HN#eLRD z*&#G9#VkpKh)+YPR|~MIg#^=L3bPbOhHV0z6#id>eVlreu-YcLrU|a;ce39mh+f7t zo^2cdfy|kc3)q)%;*7$LBMLX3FvQ}b{fXl031xt7-l{pwp?$04fNP_^ws5vnM6|Fq zgQ8kZ(egj6>F3m~x{-p9DmH&!A`xam{)ha~Nj<_keO}>k+!Y>Jq`JYH<$+e!YPDp=mQg-Es$>f< zw|a6QQwv|+;sx3YF4FSGDX$$c?c=6X%XScst6xs1ER-)zWNY@+6&+8$!$?edh+^w5#n;bFZ;)4T;hB<=>f@M{BSY2sM1LkFM0@4U zIh_hvR!ds6FNlAZ%_(4eQi&VJ5?4@BOL5$sOZlv<4U~oP3%n(6WCqz&FG$DHEOpfxbX2-0$rDEn<*un6^?Tg3?lqkPk$cL z>nlw5|2h}z{;JNZn=-0iS~Q-!Y4FQ)%;>-AfHyO*0X(;;q2b-KaxUE%d`U$gGGIO_ zuXR%i1a!gU&%F@uG7ae#@=)h^%CWU8e{E#spVHFhrIhFQPcz4lcy{$UdWPl&7oXaT zhv^kQOv%dOdv~0cFM1yRw}GBDB^tw=UXbsG6=tDs(9wp*e?={0CLr4l?%YCP7}$mv z-D2G+(hV=W@w8U39dKjC(4a zpc_-)jirBM;L{s@=UP7vb<_C7w;WfmtO~k}N=8y4tjK(F5mPFh63Bxk{gArYoy^(! zGkI{-q9S)qLh&&%A?S2Z$mN-l!+YP!$>pJw!&~4tlb+KfR-PvCSN&yFQY(MpLCTW@t^wm zQ}xli`_cQ0zT>DrXuQ@>D^p@GbPf5tCm+-p?6^IRNf?@stO;;@rE2^S%>NYMm>Qfp zbAH3V+_8Vn!~X~I&C|tH(8#Q7cC`QizYe^StcjY;D;PUO*B&Z#mC)p8kA%`JcMuetm$ z0pihxIy*kf5PD0S2eYro%h3PTM5~uDqHc1hs_8=)P!Dli^hcCAm!rv&Z#kQ*M|Acd zaNgh`{C_`TCfu33lnvaYFM0b@8voWrt`k-MSr}P#wEi1!V9Jv>TX5vkT47m#Rs{jx znUVQxu#{)Av8ITL!`$@st`J41%9m-#$5vpTe7|k?cp{#}6$tMB8W-8q$d$cJAyK7U zut5n-;jmhy0Y%GYam2$?`B%g1k31UWzvvP530&U^m%p6Ega^PxY@8Samhga1@HgYT zLHNv~n}lTrVqs9MZial>G6ZOw*b#5BCt)vZDR}~$R;|r#+;;iLtLyWrlEu*mP-}fQ z|A;@8iTE?5Qw6Fc@4Z8?gbrh|K`ga~ED+XaUlUt#LewL7s0RIiWSLiU0cW1z+o^>J zHBiO)lJGJZqwJ?gA`U^HR3yHP0!DCKqwZ$1v9<0|>Sl$*bX*{pR}&KVsWnd&V=+2< z1UNS<&bW>?VkJWSnO0XzSX_nXn|QWP1K%T^sV$iy0Gyf9s&fMJZ&OfR=;zkQBMLVrmIvh-Cp2 zn+epKr$1cn8ey&6Q|FBv-C(TCc2W9udUUPk;ZLz9P0tPdS`w`^cxxOfQ^`)p4%Epk zZgDu4S(9^PYe$ii>FUl3;>@+?6bI*bLOT~|9l1nwvPqe0;_}_Cs9tbERqQmKcEV<2oMz_#Ai*K{*8jnjj`2{#qFyt22d)afu(pqad`Zz^l)sU5 z@HI;f_`9%sWN^72n!+427Hd)Jtd9rU*zb;NLqIc@Ytia#ydn11Yw@d~7v@`KLOeDU z#lO*aP(Dh8I>TuzMsv4#J{$q7Y(0UJTt`6zxzUZiK&&-F&OjJ!I)6>!><_%L#ctEW z6nkokLTRu^P3fZBK`-i@n`UlQmCc`5P<2az8`p~JK{kzk-Xb~Ikm51;(9*lXweY;p zR&sb3J-NrODB>#)?>pjl51L2inNQ;ERJ+Wn?=k^xnb7U$6h`fN4VCz(wJuZR|DYZg z6nM_!mU3B@pgielR_v}^buYe^@MyTxryGmBpFicvvbA1@7vt7zdVtm7oHceb{>|z} zGwM2y(R%iN65om2d}cfB>6lM%*EECC zyq%K&{n6T@JVu{op7KJCrM)@Yv`ZQIjm3AKRE;=UR#&(u*Ozv{m?Se><-5JBSB~&s zz5Ye6<`+XT4b)6D{H<{$Ig$7l7lO%W_TkAV^8wG=6_ecVnxt;o#ckSw?VNfS357L) z69m)Je7W~z@V9Q9f$xk3B@I<#F_GS-{cTJ;^^3E2SD;gMl)ma{awFJyZACHU<2N9| zCF3E;e?mY1=rz3YzKxumrnCO5C%?wS2R3U%t{MZxJD!pKX5RvWcE* z41P_RXvHTW*GCvrOLoQ~;li>V0AVkd(;kJ6p7)0Im>v3;=`ztdO=KPlTt`WKDu(v1 z%5MssT{E{?JJwCvPQ6&Z{~+VV&fX%EFDfiOTBpAEAeVO=@o@9AGe`z- z3CPU}+t!%r7Up|KwESO;y<>1@QM72AbZpzU?T&5Rwr$(a7k6yiwrwZ<#T|9h$;-L# zoT_)uySM6A?X`dGKf7wyTC3(4>#spzEJ{J4|bF{unJ3|W>i!*sU|&>7Wjqy zxo7e#7BP0t`{vUs0%WmFUV~--P9QR4k%*xIg!0_%RT@#N;_O!=nB%0$`|H&B^QG#& zkhi69)Y65@KjL|UY|xbuc1eQ4>op1BA_}CBas6)io8SvfUq!i~`!R?b)p^ImNi0hz z+gyq98-RM299~1gml+%!dksv$f{^`dpd`;LHsBw3yxR`=b?Xq#0wtc>+7Y{PwDvo- zkKB;_MgoCFDdqCDU~^k)>bYeebhG2J7+?6Uc!7LxB8pjy&aasi*;&rtG~kS#Ej-fp z`Nf>&_**NqIjx-XRBA&1I*`>iN3|=KVi_weVV>}d47Au+K(1Sm(XUGjLmWhVr7D)g ze5@Chd{<$!k;H9jDw4MKEMeRel zc=5ArEoSY{=MLx}&mUoAZQY5r!=otG$AN<#TtJ7!CE-gJvuAJ-JyqiY0 z8K)a}M72S6aOoJ;vr%QM>$>iu)3&v5Sf#(~Kzr)$cG0Nmk1kE~Rh>Ar0l?>j7D z+iwwk0|%sVaXYFt=Xu})ro;lr^e@hV{~&w=C(Xa;Zoc}@8b9&ewKyMRN#Ije!``)i zL}bh69_?B@J~#VeL+O_fL38bWS@gqoGd%Dieu6PPNa~y@a+&wzjh5S8mA{4;%uD2U zF#%nbU*xA{C(tvxt-rEGzeKhIDX#moTex(J(61%LyBEndOxDO*617t+y>Ncbm0skE zvWyO|88S2RmJ&U+u7eDFg*3oe4=l`lp@^YjogM zXI`blF@g^n~QZK+2Su%yAys(9bvsB!J1i5tQTBQzxrfL+L)rbiV$8NrR?kTdp~_7vhh_YbGJ^;rQQEI}h4o zJJ@gZ`N#M8-=ub;#->*0!e+)!ZvWMnW1lqp9{~FBc_pi&m=EeMr+V|_ky>{0kr4z+ zMwu?6Eopl;^cq!E!&wNV15q5u*h)y=*z9)z&&$lLpMT&D$jD2nu~(=k7l z30()O^@w3cH2fbkKYA9o9&VZNIkw3K56s6&uftS3I~SSGTItHkCz>*=UvtH6$8L0L z_^|TXC0)W3W*Lski~n5b(@d~GIZt>sc2a#`R)a589$R`?@=QE;--hq`0^&Jq-@&(a z&$WpQOvKTU2*vMcEsHj+vUf2YB7Ph79#tp4aE+!q;oN;;MtmBVP7W;mY}Ap@L6JYg zR0gAL4EGo%Fu|k3C_wde)^M&r3DCYx2aP!O{`?<;2-{q?Gw|;qetnPsZs+`84Eg_W zASH}Vzfo)d$&v3(Qj{HL#vUt}>FSyd#2Rd->c#HKVMTUU(onkG5Res>zf8#~JL=m) z3;+>I%W@zcj+O)?xqTAlt6dx#$(^E50{@fab z*XS(rj*tj5sdt{$H42KnA)ypcX33Y?U6hC|zWRth1!#EDasCTOXipB5w!x)4kxCc* zds#Lf1!oC7Y9b)zekYq5{ajJ~DS(z2lAInT?<=j+=wUl5fQQ*jIwhuYo3KwYpTc;`HhiA3AFJW_w+YMW6go4v&b+>x)ZGXzo?6t2upLaR^-w+wSD{odt)*Klg z?ey>?oKK?q*xT68^8)vkRu%_z2;eGK8|?}c@V?y{>BhG{oUApU0?*TnTHLsNZj#k* z;j({FIiyhjVKj(I!5QVB%H?~YX3$8+Ks&1Z$+MYR;WZrO1;W8X#uTI!J%yD@ZIp^L z6mO48G!f$rGT1F;+Kpnm zAanLA>>(G3P%Yz*ai@Yq&|%RC^$1CLTlhqrH6HttFdrC24tQVEjO055UwhB<4k~sl zc?1X?uOq49Lio1#$=rq1+tMiZ3swh6^rmqV76NN(PX#upkiJ_!`^)K*tPmYsS^+AT zE?tF8g>g>4IjHexfYH7KMKb*JIu9{wU7Wd;I$Y!LS9C3fiY;jcXHiJjO4|lo%jR5P z-&xn5Sq)d?Odb0$LUruDwBU^^&u!8z=dHdgvQl3UfYgJa>(yj%9ETh`zQ#eU#u0fj zUC0Ro+=3B%=ua_({b*BRXWLwdjn?k*`y$8YfOomQkGFKGCPHd!@5{v?*OahxQ9`r9 zr{N&PFAOpxA35ECfCtsYevg1NTZcaRra8LRJ8Pvcyn#B zaE4exXe4Sm@4i~YvRX5V$>T^Rb1vqHmwB{r)LyPAo5>~Bm=<3ox`O>YghVtFz4e51_fA3-Jk{1ADr zdwqzUko!wDIb|N9D#-ZMpqfFx7Pkj_<Fzd&fSd^2tF_eDYSCLRWoA@D#%R( z)8Na8vj!#2o(pFLX`3U>yts!>$#4nNN5@GkM#s&cVGt6<8y0l^nlKB7j#>S5hAoGz zM$lTlPzx}oR9j#11(}EqlQyx;Utge+{zcB@XB^71`e{ehi+Md)<9@P*tY#q|+M@Uo z>?e(KnZIg4e_;%@oBx%Ao`=2gBz0#Gc|#8Ipa07m&<{H``7W?Ldv@oA+VP`!;>MfSF2=c-hO_qHaE55 zFTpF{U>x3He^R46d%~c{)bI%9ftTPsFq5s2@eZ>@Igk9e)=q)sisal?qf3-}1c9p7 zx%h;@phqhyKDi}(28ZV{$ogFGCu~-O{qm(O-e!&T1;CtH;9uoTZ~|Clb9*VD10jL5 zyV^lbWx`HxHtK~q2~?bPcsRuYdD7wE&a`})$Gqi#vNb@$W$az^awMvF7T5Mv>Fkm^ z0TWlxzmzj8bTi7~Mh-($b=u_(e`~PNgf>h!H5{6Unyy61fsJuPQq!A_1~oY@qAy#v z=pX*s%Bpg9n`cI!15uaoFzsP_l;)-NEcmi(5GF=TkDn1(_68C~qq?Jdu(@;6evpq^ zf&j)wEq@)eJpn2&n>y1Kt~5xse(S_@%8T%s4Xw2kybWd|(QXtVxNiRK zScC5|vEl+qMlW3f-b9>^X~ty-P4I8hd}cE=k4awgtLT=zv)6m0q11%zrY7_l#<``i z($y{R#^Cfem&nT&@lNNn#vH$seo!RI zSlSJ7wbd|qw{%N5aH@7X$cI}mIyb9@5)S2ywm{I|?geK|;X5;S1Z=nJ)u?H4;rU?3 zN3W>6wCy{MWm8~wWFle^{Oo_yX*yYzN7Vd<6%$JsGZ<-8=av5z< ziZVT6{j+_vRE?$ExZPWLtHqBcJ5oQfza?zR)O z%j+=WAisJgGhUcb%~JuvikD=Jg`)=0sc5iTJJ!V?=cX43Nf3}ig>_tD3F~zmq+doP z;~P|~HN{@Hrmd>>SuLybF+3 zvW`@<8K?k0RPlw`#o+u&Pft&M|ou1$Jtjz~w;hTp{W?x7o07UN_0%#S zw^nKUHRoLJv)elhf_ikJf9de`sO^0^7WK)8tzLkHmjgq0_wX(iRb98$YFzi#@(Q^} zxNt`IUEA2QYL{&Fz3rrIkry5}a5?8wlzGf*EeXr!;%v6IrhbbYMhD9J8zvM7`AT4o zW@xq^s}N7Nv&)$k3?3UJ-Ck95^o&flbB#0QYs+@#`mcusQJ;eKQaz4z^}u?jKd#n2TGndH z;AwA;Iwjs8VALFHpYn;n!JU=#oTye!MZ{zfu#B@Jx@M3?1#I(=C~CoGyt50;g}n~c znxMHAY1VEmxT#&jpbig5)2@gu**j#U!EpT?jCXzmbu(W5ES7;nPKz;HM!SCGRi0qr z-_Wc5m9>j_%4(^WzpabmXdnWH9-2wXLXa(M-Ba~%M_dX zz4V-g7)*)@(RAM>E$nXsgS8awv)|ZtxVn3apl4GxZlTq5$CWCf;pR_+_Kawp2-dQ{ zj}=)Y5BT-M0ZJE=*hytS9wPn2-+Q|nEQk&RHpP=(aOZ3q3dnLJkN)~3aG}rbQtw-- z>EP7izRmxP$twxsg%uJh<;Qabgv1nx$nS7L6u^Ia{gwtVLr$yb3|H#8CLdCTZqJu6 zYxsA_*pIB|5b)3CKzQZmTu&$*Lbc-9#n>1JAmX1_o@fLkVLF)gC2(P%2*D&6A{(w>);J)4QzW_Ap^TRIOXuG2pUO44iHH_(xNke; zYQq(2G~5zW7QL)+|9orI?Yc4Sc(>(#TPd>L6eXb;=639@=DOC4Y3-1(W}M~Efq~uV zyVdoJDfqbYp{O0)jcMu~h$6rYjdgUDhCgii72jI%xWp@>nx*(QXsq`XdmP--anvJU zfs{I9Y}PCMccx|XSxv;tZX#I2;c+dINQ7U&UL#U!9)zCbt_b5j=5bhH@Ve%`#x}e` zaYN^j^`A8rUi&u`yQoylY+Lws)%(u;7%TztHp+0XZ5nnWvJgeY4niH|eMQPIdDodv zf+u_;2A1>j2Ka&j8~zAx!D!h#?yfs)y=W@zDaEA^Mdj>y)i)-U#&Tz9!=c}I80&V` zR^U~d?2Eq-iKl%t7X5f48j-wJ{=x6*N}C_+Fwd+PnSy%eKiJy<23^9*ylT=L8;T)A zYm0DdYJ@dOT5@hjNEPvRZ&4G91kRA~-7^EU>!RNN>HUSB4rl52KsQe8t7@fXtOUOwklx6}`h4#%<1>=is=1pf_@R@6NWgix8{r z9i+EK%z72BSUQqsrIEDX4Lxi(TA)12sdgWHpehM{U_E-+HF3BT^xdq1U$K|GQj|>* zT&*uW#049(<58xNOpjf>L4NgNyTVY}r5q#uxbDdj!!vhm@!BCnT}8;t8m-rpA2)&e zeFi_$-v07<@!GbNukb9>UD!#-@8g!gUBPV;bKer9GiuBhjvh4&Pb`;@v$lw*U$!sy zZ5(<&xcc;9i%yz9K^SA-OoLAaofo9_1Va&GqCJjl+~}}vmE@tTPPKk%6sPtZu2(-c zO4klzx+l{;St#ZgudK6uj=&19O$L^JaJX3`eNM_V0A@ZN&u8ZOcS1ZnHa*t>u(u-w z5CZKOJ2cUyH_qUGr9Se#kNc~!!RJE*N26Ik=%V-e z96tgDb3ZgQruzY}d}r}rOqRp@Dhd0FAA{b<`~I9CdoCXWBSbk|pURxfgr6AUlC_<$ zeJ&feFnoGHsxgdPVYMc{JkX8Su}lPy!hH%vyz@I6$w$Z_)avp4nZ|uzeblsB&3FY3 zAX!x?aA-g9rsL)X{OqNtO!oG=>Ny1C?L&^}l$S)LeicyJ?@nhZGzI}W#i@z1O4_LY zIL`@9M9g%*$cMY2Wxlr+U~{XQdo(1pD3B@t%0qX9ZsL5EVHL@T`K@6Q9y%IR-1zjt zJWG=@7Mn6gM~*S&uTI`u@I~lkNo7q`X~1FkXt^PB^&!kMe75>!`QHyYoUBA3lmtOQ zrprJ;DE}|2y8pLyYxRdRQd58a)@1EwzfgM9$VnLy|16C__mQ`fhDMeeBzMDzFbi5V zqclT}=`}Lc?+&RpiHCrLC4q*GiRr!8(cE>vw$=B%4!_NN-;*n&6#WRiIoo-;>AubX z59yZcJcFax^GhTVL{Q@q0bc2&Wi)>#i0SL2n1Rw;EN&nTDE)^yX}!`}wcFEobLH%p z#7Qf7*~9u}FIQBL^a+E{9jE?3zyu%6hyG{&)K_v4*H>xYi~46h_$TNWb27oWQ1Lj? zadq<8>Lp+Ori4XlHGq)U{p<{ui z?**uD^B-8G{Z$`a@m~t_i3ey94IberhhpfYKg5;jCnOuIVyb9z$~I67e@YidMnj7% zUK)SnDpKrUiNmF6lMO21N9$;;VPqUB01m9|zY@#-P>=}9DB;Tp`Sc5|rd85_v6~aK z;E6q%Qw)8jnW~vLl)*~}>6llP!7ryB=CF#WHgTAjmYrD1)RmoB%k-7SEu}5yutw10 zR?{3yW!zV>1}{ZdvC@F9(Rif07Zy&LK^#mZgPX^&s;k4I4wRrT9b3apxtT+%GpCYg zi(`d-3nR|q&RLvCSb*dfnchQn1J#v_Xrqd{@(Wc3es#i57sfY#8Pin|>tRYuY zEMhL|#zxbVywP3`s`xa-)n%CK($TS>av!<$l;suD(7`-ZfsaIK!hc>Bq1Rc=JGG+c@<89|H_byLiYEjcwhPvk_6 zv>b&8Fo7dBNA7}|+#H=JY6h3=8l5M3;zx>w+?g~XF2=Z)CS*NDk>f&Bc{-otl3k{! zAmI{TrdLU$i857v`H4&G&yf5(%8sH*UcF8+=sdk2xigryLs`{fDec=GD!DsqNB)G6lrL&W_C%2M1QTS=9W)T%oQNV%kN z-4KcGNlxpV9vKZJJ9y_fMUnST!v%t9PYjBkvYa}r^N6Jj3UiGwyep!5$4nTLDx!Hu zOf-w-lRfY!V@35yolv-8Pfh1M#FX{OV0@{of0ohKQ?OQx)QNkGs_v23IVO|z$~%4l z>hdWb5R*NldnCn3i4{veQYX5__NX41NQso}iBR97Uj5`w(3->_cqL{FP~Nzb=cE0E zzfnepC~r9vTxO$RBo6ya*MZR=i4&e;eN+!%$wbi~VkefQ{m5_W6OLj5R4(ArAn1n7 zqpU*QgYV#PIOUv7fUr#yH#a5lK)zDYgR#`Ate2ASxo?k$gTV7vS ztmi;#>Q7&w){n0*?dYr@*)y6MRXf)|aqH^j>cc~N>ig)-#SJ+*poMfI)YMezYqwT- z92Re-!^Kv`(#qJ%R%>Rc&oR=`q(ErlgpzBQEH5{0Y%avey}M`BjI>x7D@$Kag|Gf{ zoyuTsfFh}~w)XH{BMte(s|Nm!`J>eQm#3kqAG`f~a4XZ)-gai&25aghnZHWEZ!H3I z`F*&Wiy~WayZ87qNs5e zyr_)RbIK-XWF=oCdKJOW#%Zl{%^UAZf3|fmoWw+pI~Ti@!^D-nuvD+LnRDJWXt8zon)s9E!*Ej`3`5h9+_;)+2@icFHVwb8X zMl$DB5=&^!%}*97>Rq*Sn_|2gK4%6ThNluM4>@>XYKv%x|{l_UG7LJ~@2cSc3&(Diejizl3j%Lg@%PW}gt;RqXtxWg2?%ajs5`QiT0S_tUqPcQx42?uu^eFR2 zA}ZKJ7fxQyZoD0a+{Udg$joM*j#i*;9+i6z=%tzl$uG>>Iu$d{9i^CUKA+_A^{tf? zdk5#$OrNWsr;37~^<>+Q&kkZ;CgLo-X&erkV1t*^qINupk z<=U|OtRvK&WpvhM1nJ21Ak@Ya8rH50U3lV>v|4zuKczHQ)XCR%tzl-mkzw0x{1|3z z;wT{4zOs>^o0%ZQ=}kth)B~|gd0Q(k^C{P6ih%6Z&(+BRxC4R^;I04!?(F97ubLqj z{GZCq7(^VLT~}ZL=w}QCQHQA5+@330j%IY8Qp>v*5LPl({ z;@7d`2b2mI*^V+#(!!y6HVQFo}4X%mB>Wt1G~v(5kN2I6 zhZufBCfZGG09y$8Z$Bv8sb~gQa@}-t`@1>`BFtjbDY63GWVTY<_?%y;6*~1;|4PU2 zepyXlF7D|$h-}EUNkc3eHy&Y!$0C$419Bl`Qv;`?G|~u_Mk$od=%SNq$r(3iRMf8R zHZw)4fAuWb%;p_#nhOh}c7u3;Te=#bRLcT(*iSw#H4C(s(~4rL7BO+#*;= z!3G{FsUm-|v)(V5L;flARt~vk%wTkSSbp<4KQS?KQbN7&S#SbhWsD>C34c|XDMn%A zH+5PUoTnDcudpB(TaH++5H43n8@67-CfMnSzc>i?itJIU?PeJoRyC-IPM=Q{_rFrC-|+3%20)dn;rnA3&O$inu_b@hr*6_$F(Pr| zC03iWTe#=QTS{PAENfH45jbgaK^uyz=Kj;{&DFPcCOj+_CRNglAa=>AAl=is6syT1 zYgT$PS5{hJ&)SJ+0gB<(%(R#ACn*+R@*MLE1K{E+_lQAfj51@y<6_NK z1`f2sT=K?39HbaH7~&a7ATfHRQVy7;o2Lv0>$8`$!Z>a$3IZXB%>m7VZo=%7S_Cj1 zl~vS1q?EbNOt?u%iqD7a!u*>>XI`iG*;OH6H6e zsapG=QJ93_D@xZcOEDE{$P%({Xj%F0f}F^>MQ$z8I$BXO>GGF-T59zn^;>>`dwX{O zndjfbaW*CC*`nsGe(c1Mf7Q~<$5wlUVX?FBATW)94vOkxk;`kTm($+t_qrFU1k@%J zp2p3w8n0KO-KxdgXe+9?@D|#*BctNu(bnH&Jz_P;5g{r=Fy;Q<#c2 z&Ya8Czh9!sj(yeps^86=j&46QI9doJ)&B}aUM4=xecyerT!aTLrYRiT|NIQ@$7>Ar zqpqBVhUjWj;`#J&ENarChgi>^s>=~K1f09%<;FTJxI)jpcE3W>tP`TaNufCq=G&y}TDQHa$b3sGgn zO#f}navVMW{NW{YG@yDko+?4WF|@10iEXQg<071ct>!I~VVv548q*kib)_e$^VeP^ z1qVG&@}Baa2yL}g(+VMA=oA; zzqEt2jfeysHVN8>Z2?ScalhrPInD8<>fs}AcOIW`Yj=dR2t8JeT;g((2qZ$}9Zcws z&D|y*FPyim!t?aKoV70Zu^p-oxjT(E<<@p{#JB1L5g3lWwKLvz{C0d#(x8N5TDP?s zKVH62K#ePsuRPZ9C^S&;aLvSloz-bZ~n^PLGTNJC~QOStenCaG-mDU$Fp|ZkXb*2M+OI~A9$C!2#j0K3>$58I_HBD#% zQ8I9W*jgUpj0tGtzmLF=I#P64w&2iC;3!PTE`SE8USzhbqqHImd|Q-ge>1{Y)hT{8 zfB&wIo~DYT(y6LoDO+2WwZ7#CpSC3;py}tjj*5C;MKLR|&SO)gr+JpKis8Xf)g+^d zp@xxxrkbX@N-UL{sWwlSFY%z5;XqW@ebJ7$sYsoXmWheBjJ~z2rMSXJIDXE+($Oed zyw&xg`~t`&Ot^lV)V<}hEDrdIv&<_wHo%Cf!_1@-4%dysWU?S6$A^AA*|fSBUz*0z zrA1ez)~JBx;9NYHZ^?9VL~e5pxmW>vazYVx2|)W*XwRU|ereKcwHBVZXN9ssi8msl zZ&y4w7;$OR%&m=4esQGc6M)O%pi>?Xb!Dvd3gyu!9k=Y>7V0y?V}{3s+RV1_Qwt6? zfd902$YAwt*sp+b4&Ab7-;e{__iXbBe?`!Jlim)!gvs*K1kP6!%&^d`q70>!RdY5!nTEg{HHOOEyq?09KmJwhUgo(pz`@DzrN*d zbKvC%ry9XKl;FU2qWd$=d)x$;*k?(z<7QyAUwQNGCX!gd%BCXlyQ(XGYub;-U*vI; z5L@g#z$B$j1}BZ?UH3*!MhBEX7>F&o?ct#iPcC>9?PW^!SKtz0ad`Tz?7&>~kAy1| z$;ajJNn>HLs09c|FS8X>*v4FSz5hgo#b)@xTVqBb5bgEVmeQ2MnzN(Ri z^A?Piqh&|WVMnSP%*aNip=OJk)y#J7>xp{!RO@d9g1 z=;l0+^fp#UIh}jw6ww10J2iI-AHNSA=p9zPV>_hJ@kTrVj;LI}Kh&Jzl6Bn!B0A*H zEu**H`x12YR?^mrp$?Xv8+t`slt*xA(4ce!ny6J@#rHK(!^8;Lb4D| z&sb40Lb3;LnhO|G#jB5id-PTuB~XzBj)%IMK<`wO=@^&FGz!$rBSvOm-(1; zrva3CHm7U{^zrEQZ{<8K4NYz3WR9x7dh)4+=k5-*XQ<|1<|IeA1e-DLg=^=xri>Z7 zTED4D~rgGuiXV>@F|imdYb>{T?yn;c56)fS$e%dv^r3C5owj&rpCE zU3E<{Js|bRo9IcEWH^V(t8k3CAn<^_X+;XT%L@Y!MElLrp(1shD*FGDAKYE5R zJG_p&*wD=0t-WTNH6al4%|*XQA{{}Jxr97R8QkLA!3khyEJn=}7Nf()Ifz+@NLZ&a zRu&8m)-Q-!8qGao(C?X*G@e-)We1}&0w~S`KIa<1)BkuvhIVB~7;#-WpdMM0S!O49 zHLM-#HBapD(+v7v<+q%r5Um?e&n+i%8veE^z_GDqFbG_+e=Ll5aKe%NIfLeJo-Zz# zhdBFBh(}i<^=z&g^US!@?Q82r?=i{X-;Z?*yRH`Ih*;)>VXx8aTtzgoygm;NA}u5J z)17V`1O`S1q_rUJ;svcMXlgxP^{z5BOR^@iw$)+``ZP2LMgP$1rPjvBg;VK4d*o}U zrFF-=Gg+#sb&HV#JC3%rd@r033`Bf39#MGFY{JIxm3CjG?RDo8wMk-e`l3~htCPE z-0MrR*^6y4eEx>7vFy#Z4rQN?^|l^G?=bmShk4|E76LH|_@`;5i@E=xbl!8gPkcz% z2%$lhY1~(iyY!G~OQhXU&RUMvVFh=hyBQ>f4 zPZx8L?r4=po?7zPIHg&un=A>tknX?czERUMXnsybj~!*hdO3FlwuE}4%Gx<4-aq=$ z_JaZzw&RPW8k=v(i6kg~%lNy`QD!PuacJ|lZ;n3gVVbhE)kGRF<|xW;2j!F$ zO`O`?t9J<8jIBw0wekDpn#B#~C?f=?_PXIxerzy?qJ7SPIK*kROP&>LK6G%lPLS=^ zAvieF9cAH;t9Y_Qx||nn210fqNx%{E62{DRj&Rq|D^jY?a21Rdk;iQ3$n?akk@P8T zE<+A}6$d7Yo`;KK*8JeZznI_cqxikUz-XA-tUxG8Uz9O5QVN%-i^9Qs{k9H<+5R^B zvv>M@Oq+T%bnMw&=Rm6Po&{T5_GEz|$^}UH)~mdlb6^TreQZ50^jBJGg-o%f@|qJ# z2AlvFNodhHaYh{OJFQfgNtL_6zq)*fa;1iuArYA?hPq|mBy;T+;6&e%7X!3gv%S5S z@Z_$|6E%zT)uVV}Uzb8eL`=`B<@^0?H^vW^LaJhYbrQ`H5;{p6ii+CNdas+XYRks8 zguBAsS*aUSkxH5ybE|E(>h@jJm>;v?HN$Nx-yFRcsovh1JEhCO%k|*?cz!BCuKa^5 z*t0|@iNqUxBNVGIKR)k2v1%QMR(W_U1$ydXB_YL6;MP~D*a9`?{3E9@$3YhH^RP_m zxJ(funuG_VATJ3!{89|R_uBA}q?H@9aQ-^;baDLDyjTvFR}Y?lEdLGf+v&lma~Pfe zUHr867}kIiS>dw{X)D&ss3?%x3Da0i%z>T{h-c9BXeDg$N3zkT>HS;XiPd0HpT)%G zO2E=(AvGV@R!c-`WOUo-Y1SUMs7po%W7knWotX1O_kaSOWBH?9(JElUpgZCyr;k}X zAH@2~84qfRHZM2MvF8GR5?@nxw+ojiSC-?< zd2rd{FFzSFs623xHcm}Y1NAg6$fE97-0;0={5t;w`nA^R1ay7a6?+ES$21=Nm}ULN zlDGKRfgbjI49TK3gMY1f2~|j>DKVgOKudsJnDScs_$eA>U{l&_AK7I;k%JX!&-ap0 zaO9n`P0-14ly!E7YPzjKBin)bmTSsa*!TJ&fQ?UkuV6?a{iVEd+1w{$MhFVkiU`J5 z5bxFj5)`(Kf+uoth)}8Qv?bJqtn`HXnpnls9x67g4T*jls4-J+S^XTOlPuZ3mC}>< zd2N)cd7X3@WafgnbZ7)Na0Riaz3E-p2sbdu81@NNOqyp5h5@Q%4KkYQHrQnh<^y7f zepo3@%#m^Y6f|piycbCL$z+CQJPZEv46?J+qn{KN_?J*>O4$R9EJco-g36Jr^y~x} zvZB8bn-Bcah9S$a4dKyf!?oc$;vlt+6O;=E1MNvg-bgn%R~Ie_gtP-h9$>e@J!tX8 zS^66B`eMgy_90JTm2eZ+GYSW1^^gKwpDmY!&g?)4MtgR^14-J72i$C+{(QrY-iiHj zVpxoj%=qt!|0oj$_f4ne<(QMUTVzwzTV%WcgyObwc`l~-3H3(^`VxSvKnV?$Ub#_) ze#3#G8?Vp{0rhr=z)9-qLap!U>4J?Hg8}nug>fR#GOOf=VV(r(fMP}21Cd4UsblVq z$TEmjd(Ie1GhV?ONTb3S33+wp#WKFL>@N;My`QYNvI2VRrDGT!5X={J!}YK_5S= zhr6&OSh7mXsz*L3mC~ehSSK?aWHlXwlM!vZ?3v=uoRG&h#@mLu!O#`g+pOq!HCji< zwi0^seJc=9VNqR>cu*06VhmSFh+nB&?}>6>P(o8`$vy@M{>qwPBN@I#OB?+S1%5xk zHqV*k{6RN?wplZM!KBX&c>{f+yw3tPmO?`k&uDrx0m0MC zkhc%uukiK#XT1kl4w?3z_|He!w}6!F=`Pst+K2dj)RxKj zC3<7ZWg2}m;g{Bz!#9W92MhUa_V2feStK{X(6)Zge!uS>Rq#sRnM{3xagstZLxshe z3QMG)MVOKXBSk2Q5Jg|1CyvRCf6Rx|_@U37m==a5hIjh$<4;o!nh0uF*@b{|9N=Vt z^ADqL;&k>D&s9v&UB!`#-EDsWKw()T_gYAJ2CH^NB02ieKq0Ss1o&qK_LC4)hvegvA2aU{?@zd^eTL!}WFuE}^nn;9BS@|`r` zC;c^8wnZ) z$9v(^pVAp~)Po__M`GTDq`u*DN7jeOzVQN?5Ecdn?x0^F{jUA)8ab`^tBoPL(V(;+ z`W3-(zhFEv@fSk3j~qM_H+u}&A!&uEYZz3N!7#ipkXxpDMBgqDxnr_H5$Ugjk_ zarL^AWEVhzy+R0=aWN15!3Mmuz7=jXIiiPmJPSC{Khy@u_?%z$Dh(efENmBQjsm{p zpp-rAA^M~rb4Ud7S29=$ymSaTj)i(|BDoSV)rdCU!3s%Lv;_H+N^OB6X^JUS@WW-| zNYli!4>#hmx`E9QtogN7m=s<7QsAZW9RVc`@{cPv^&ZqIH4m2LIXDV|5e^nLoE?AmV+4GWR$7ZvX$QV^@sF7QO4`9kHmrLFRSzsd zR&qm6-Ryzd!YR$UZvb{7G)9HU_kPSLr6|xZ;O7k4;O7vVIBO;8EUzMRPx|59s-w76 z|GFZ1snmFHDdbz-TL6t0#?kSLkca72l#+*@m1+sw`yGX#eyx4BF!B5n)J~9-VJDoO zC^zA$6`%4OZUsNG3o7TaRDWxMVDqHoAKS7vY>jZN?8&4R&E$?kC6B{CRA-han_w>l z@PiY3#xc_Q1Cjd7UTOALY~K}&{jq!Td9!0a3%s{wpx!5Z zcZAUN)~l->QeeKotf86XL*}OMhx#*--xt&;uI4M=&e;CR1(;)>8Rt2{I=YWSXm-+#eh2=GO3(Sfr?DjCPlL!mEpqVd=Tbm2S{{Hy$ zG2TY##~e&O;UG!UTM20MM+wOyNcnNI1ks7_LUgGK(ky}pSxrb>%aXwbk%u2U@DFF5 z^I8{{4o*vOIIL1=(Y5=)n4fRaFnxb?$mT4B+Q3!AM9^Fl0V@IKC{ed^-`&0%qz$7I z%a-fH$^~QtY!7*C!7m!E@yQ=7rKPsIrw3lJO`clXeg9T^opK;(nMG!{W0O%cq=#bJ zu<21!?X)V0Np{;Xz_R$+nef3}z#&;ZMO^UW7^Qm9Y7$1kAb9DdrhH+2j(shY_1Z$r zBwd72tDVRN!YNV^cYfg^vOy47z~Yv{`WwNHq2V#-`6BFvu`R|1BJ3B3^oJ8so5MD< z=qo@rZ6Nm$4M`~3;NB20qpE));@)&$ys%uHe2G~8C6N#*5GMJ8E_+m5j1r0z|A5mP z>kskyj?S^0=rOjqWHq8JM13>#TO*hW->EIn6A-$*aVJ$M1i8$;HpIe;5Cfh@Qb;E{SOgzRGIdud zWn@K+icRa>l!WqE{5d81l!1*{8-1rW?Q)~F?O?yt0^KK{=lx33wf50-7$Qrr0gF)# ztZeYFAH7R5N_=&8XQao$LT?Ex*5b64J!k|T$f**=a<~%Na^amWPP|B5u$ejjMmkJV zkz827lo@uZT==03Xq*bHaSSU$868`Z6itY?3`-iFt5Fdv7qJto!m{Dm80jLGIE=J` zaedAYLkrkEEX)+U*nzR_A{j~93T4} z=**%mYDAu6Gn|sC?AtC#`Oyd_tg&NdOkSoO{Pw8wvd^vH3>VaD}_osE&P=zf2%(pFpBsN!%b6GL8L+`Ri<<5p?SYcL+}KKyY^r5S+!` zVQ~!(!CeA@5Zq;Pf-N2h?(R;4E>3V+Z1?it_g=laRkv!Url!6#JymCVy8Be0^L@Ue zh|^MALHNFs$oa87Xp|@yiU}dp!CzlN_e>&WajLNMuXs=mWC`rBM5!%$d|yt)>2DZ+ zNMnY&?IeflE`JAL2Z|#Wg!VAKzhFV9M3U0KIAhdgfB=5hjvb#hzZ@S$4BU8l^U3Xac0cLA?;Q?0{!p2Ub> z=q^N&&!o4U@S*LQJz_gEP}ft%SF~=prxU#cBTR_?f&{q>AK< zz?VC~d0Pj)RiDv>|Msti+r52mtbiYA!nulI=JGGy9z>7ufsj<%IGA@nQAtR%)6?dp zh2sy{QxWW(3%rja`?Urxq#4<&0S{4l>HhWzM>~cW@Z1(q#=M+}mnv_)kDlMK+A5&E zP{)UM<3mZ&pV^RMx0-Jf`EzwP*n$%qWBOBRw}Re6gDwr9@6n&pkYR*~aFj53bWcbk z#vkgKA#FdSXVd25@*WP784f+LF+Z8LQfLwhmAql{cSPTkp@8cfs6bb1IYMTs5Td%m zYg@mN!tNEevUvIt)G5i&C;47o+5Zt$0yzv%ZmS>PR}k^_L$v+3n}d8ep`BwAxG52# zcC;4(yT`fd?&$yNLSK8B=r1bKJ7~))g?DCrX*Rfm>l(U;d%nH( zyT3GoM3;!t`Qm%i`e310w2T|8`w-*9?B)B-gQgP&byP+_UGwV5M^UkLgwB|~`rpX! zU|e-*RS0i~3!F?jhwO<=;3(Kvy$lYF<;5{-Y0&|W>qwg`6Js|o^x2QoWm*_wmZsax z*o#mL8tL_kr0cpRmQqtU{Q`E|P>EZ)_vfS&ZqxX_Bn|fKC~E_qCEoP!#g(E6_Spo6 zx=%zhJQ*i5%&YUwtiFhmAGUqnrD~^z8_w@0i z7*&Le+5RPqKw;L=ZXSC`Ji4K3Dq5Id3z3`kv&7SCK5A3Cljg4za9#@t?E%aG2gPi} zAENmP?AU%gyUScoV@C19pxOftPqc8?{`591<9%x9tblr(vv2Qai1)2UD(!sfQsmdLO^aJk|8Fvu0L!2a&n@}%i+0nkU>K@eebP{QAH zGcSTU;X7XhA0g3>=-pg*i3bL9G;`c{X#eUWPd&6Qdp0O>SVXpDzqf$_Woi`}4l~L?J(3mZ_gQY4DfS5ATCNb>CC;i6RzPznwoPepUQY z-Hy5xJMF$D`lXBV_h;DO>^BkBqVY|P^cShcZ>W#J<(EgVLu7OQ6mIo9^bS14FSHjh z^uRZWG-QO(cwv5tgz0$m-MV`+C^xbMWtbiP1toHROwV=Ve?|qn%Oa=%Og>T72J!#@ z&2PihzlqQo)5Hwfq2LM*fG&jsuwN&HY56VBw@`6p37Rl2Va%;0a;|-b*B94NBh|@o z37`k!BbtZzWW2xF<59Kop?pP46`IALd=fLzYSfUs$>*wXxmVgzuWC+!xrtGLl3TYjF>?V?f@*TrH7T{?W@Yfpc<$(qGv+!vMwYi(l9o%gC zHUufW8~?VO>NW)H7%sQ~|HpGH39ooH;7Z(t!Dp>r&ZY3rxT!WG{SV|%E-q?qb{U50QV!vqmS(89W7df>4=o06~o!-`#m4SF!DY~}QI zdGw8@s9m$9N!PE?qy%vTiGp$*;BEm2qFV}|XySq>ZK!@o%wxx$6ZzR^cX3QbGG^7r z=w*?MlEqB-KJpxI5gt0d5b@R&^z$rnS!CWijWh-$?bg7fq))zRIKNP;@?Eo zQCFDbL8Ig;VQF{F=|P+u6W$@n0h0Zh9U;dD|8u|KiX=w_A%;86M?%= z^{*!n=Rs}O99@GoxmUc|KdkoSPzgs#vZ6b@$3J3Fvd+zQ>{ohykdZ}^QJkOrlMfxn zav#r1ON3QZO~E(nnQ&^|?cuEF^sMLP=jW^S?MAogRpyNm+Gr(&|99X!9^9<|L6w2w zvod0cJt%D#IJNdG&wKJ7$(-V)zC+@5O*&zq!3KvIG|O3hR_M~SwcZ$s9xovN6^Qrz zTk5M4iB0mN@9j0>BIqoN%f4Wnp#3qq_Y-sB^svvTOT86Z>ruSJyO}rD;JDf@QSAN% z?b!&*>`mRkgsx8{GUj0tmO_CH-+X#-P+Gjk1t0Sl)UaU6Ydt?z8ibwiT-UZG*J)?p zYuU|eddIkp6bRXi?Wnf8M5P#njbZXz(L;FAhjvqUP+PiSqVJ@Th{x(L>vjdC=$Ij6J16+EeN%@~1|xm-E(OrAn`#(2;{u zFQbR;Sj$)06ydyTxIg9?09EnsBRzJ68hQ6lACs3=IvGYE+eR!B8rJ#~P!tO`Tps%i zD&2y$7ROl^ZGEbbt-dYlwW$2wq_dYpb0Gf5;h^DxYr*EVnPb zKjcnQ6IIdUjyGmo&N|cTRP#ZzK3T@n);Fxbi@XjX8WepSV=!uAnKwB79n=B(7a!&6 zN6;otj7A!OPO1j?itd%O$c%Ak51pD!G%?J2Ql z`z>t#y+kG<$xABuLMod^{QG`Re?=jI2eyvhYlKCuakLKRFPi}$foBK-^O+q$lq*8V zM_+aeu0}WEk!lB(zvKMvI!7#x_{EpTy=UM!{`8qCg7vHoRIYu+H|(*ff6EK|K@!xNJIS4+tm6i5{IdSW|t{kHIaCX3Ew?Tg+fhBA}Q?C|&{LV`k>+Il%rYD3<4x zX$M@u9P^U18e}c(%;c1TDht0DSN4SyJh7GTgF{%bKcPZr-g5lXd=dLo-Gzp>5Yp#){B+Us_#XF&X7>jSgG~oM zxnE%p_PAy9345gat@4s@S_vDd)eo@{`q^E-E--X9EBsr%u^}(J57#lAYKi}@I=#ni zIlfI+z`mODr?pOHZ_EYRX84(E6k|(d0b7P!E0`dd8h3>x)k9daz&y17#=r-sTO%Kz zY{X}zH@^!UMDLs_nBUglz9|=0`Ke^r&cWiZ`Uy&G_D9?dO6p_t2{=)InssyI#$||LF!HVk;5@+g8a=Jvb%HpfN(W+Fhw76}`S{&yq<*nAansuPg z$}z5cVT!>liLb{T$4x)ZL|DiR#3cUqHLa&(WB`kG2<(m4LZu{-TM@0M!)FU)Pp~O0 z<28^3M1*K6=Y%Cl67n_~a!a#?*BfC>EC4{#IY>^;y!LY>q3TtkDa`<3eK8Ww8OJTh z8WNX9l3vp_%M}nu*b|RyYYQUv()WnOrbTu`&w8^pBS9&?F1akG5Ix%A=Q}8(aK1T% z-3L{-;@oZYi{9I3N52&(_Kxv7o^Fy@X|j_frFTW3-A?nSRyFjG)Y?Njon zakxWcS9$tpC>~Vn2gwPh&gqCwc7zAAX&9Fh0s}}bad7NBMdG~WC@m)wS(YZB(^o8U zunxXZ#Wgn@*SqXt^$)ajToe-v^N$HVMf-K7zHVp6r?57y*~Rd)r=Y%j4adwEU8G}M zWwL!dXGT-IG}X%fOigZTM7RT=*>lq8r=q`r@$vH}Ip~&??qCf%DYpKbJ$GDNFQc@ipg3+m9Pjk1mP*@#OtCL3G`0KzR}o z7nF&^OrLbZDO)a9@6B0uJm5reWQ~H?dp#Fn$=nhLv;f+rN6x{q*Krno(EkcA)?28X zsm0)7`#E2}K0l$~3dW^U{rk7pMui(E7i~sH`(6XRwBMI6l^wI&&Sr9ZFEz${{|=@7 za-f~B{vw<@$00hYaT!cLp|LPIJCUxg-*(>kRKFpXZIg~(e|CU3K;mQ~+5h?KI@GXrDd^Q)aI!c6O(=W(S1#SoZ!(1 z&o10VD5`e13T@p9fZXrU6r z%%!VF`%gtEF{>S%IXNOH)=@_ts#VNfqA))EZ9vqWavpFITvaI-)``C&#Nt=snIKJB z5VHWDfxNtj^M1^twxLMZHenx`IE)5hIuF&A@9h#7WlnE#`fcd)R1JCoE)e4zkUq=W zMXUgw<9nTvOS!`mEN-eCQ`3PkSwXq7DCcw)WH-(3BTa_DUz3$0+0Fx)rg<{Zl+dK9%zu1ysG)H}c6`S*}Vcut6u~EUO2WRcocP-&P zCHrid<6lNM)!9PLCuk6IQ8q`-+nd2hSNbc|{T=SrUxR2vZX6MFM!#J9wB35>rE)u{ z(+=cVL@Rajh#G+tf`25Z6>onNd<$4nw^+4BK~d_Y55fEfTQzT7(x3G8HS-;w;~#v! z?CO0o7~~z}ElW?sz61Y^>xif>%H!Y74ppH9#=1Rr31P@x86OiKb1cID592PpH!4F0Ew&i@d(`c%*X7d&9K>zRSbUS4 zW@#}j(WB=<(F!jx1?n;|$0x&d>7SoPZd#~fc&YFVThi?NtKJXmp%puGlDQgVrF?c_ zZptGQZpz1OJGC)-3Gca=d{6N2ATg7GN8=slTC=Ofhb*_lfvX}L|?=e|HzuqQt?%*q=;}*5;VTVON z@4@$gR*Bb4mp{$SK1S(N`*~;bj})ZeylX){EJ2NFe4p0_jz&~j4u`?t{Lh+n8Y9#} zf3`Poa&6wcq5ofM((NrgJYSg_E!^B3TDK zba%s34%#N3{K~t}#l-l2tHYmq`q4pjpR*~>`masECx^y6eI3lJ1}&I zi6uC0r<^4?ddH3>`1{TQOK{i@DNAtdP6kVG)Q&z&aKg?qOK`-F5KHj4omQ6Mn4Jis zZsp4WqHgs|G@=m2O9i43l}jd~5WuA!QHa_lDN%^hr9M%J>ZK4-i1OtZq7d~@3D6kSgxVuC04AxwSYpcuWRwsYVpBh8CaWl6GKeyu zGE}CPXeO&Ep)zEp`m&4`eaK0s1bDC<$t!&UTrnSg8r4j_DJdakP|%*sNw#7>l2I}T zT(KM}D1`tpncqo`N&zrgSc*zAlL-K*n!K6G?^Cf$t;rbrSy)P~ks0V&-pP&H1BNs_ z*cq%?-YF=(W7uV3DYr&sAY{psRYGA%Vabvn)d8@wR2G$FCp)B4DvWvo9GNRitx*~H zShD0sFHBqv!QHCJZT2ryL&5eH0_Ll6O+CDv37q?#T)3>g|8EDRZ%9wH3-8XgP``kD>- z$vCObB@jnIEeK)+s4a&016&Fr@&G|i4?+eZZ4WGlRxJ+-hE{D4G=?u)9;6I8ENwZ- z0nBX~$sDPF6h`#`Et(B^$xke+pGMUHKAH_V$!N^0GNTcx;e^ zc_qxCuF+7CjFc*_G^(8{t~$z>Dy}^0nJTV6ij~@-II5i5p)$&r+5s4KO6^b^rAX~i z8Z}PsP#qOZr7VG%0yc^vK>&$DhzvlY2x0}0070}{w0=zILOg|XhnHktBb#5|!cX*)sC>|y1>ajv_353aPb2^o>2to=7E`3k z$8q}_Dm3%sR%4(caU{^cu^D6)aX7unzA}>ftCqPovnCGqlRGRa3;Ra8AcS2F8Eug3 z0*=twmhw$h7hxFBepodK5T4-&&n*vKwL2mvaCEr^%-|gw{PwXv$fv5`o~>>_%gb)T zL!S8ocliKdHR^-OhiK^hwYpl#vN{>78v8k{ucKO>qd8Pnmuu?zXWTvGB#6y12e9K-S(dqARYU8Imxe~kQO~_i7 zK1?>U1s`W;X=ch;PEE+OJwJ?J!{}!n#z{tHwky$JrqX2+UteN!&@=~&EWAa>Mk*P; zTAwhG^F`QC<5WpDA*T8y1VL{H)uYYK2*wL7r~Uk; zy!hk2X=QW<(Qtke3Jg`S)sTlDb{9SPc@nfDz`K_WJoQMpmFve;ZqKY8dfZ8-TS~jh zY-ccCICRB{BE|mpH)W`Bv-^Y3>yGK|CwRk30*B*?<%;q%+cAZ->BMF7QV$ro{PS+* z#r`S^iNh57b%vPc({fZdrYR|G{?y6-Vi=dH46{Y>$;eVn#@?NFA<8x@#QyYqBogTT zU{t+w^S9XeN_>vNS6v-ni`gG5W%xfCLo)W-uiVRy`&LZmO(eh8+-iwb)N(gwD57iG^lIt_H}=tys5+=E}59BjnO{L2OR##-xA{=09r$7v82~-}XeQ zCrovF((U$nCPJ>;N5B=GrL&~iZgs~$ajB`iKatSSEiUq^56}uvpOq+gI3(aV zb^3|d#QOqc@o6%_iuAjE{}8ahg`cv_3F2KOcD?CNpA`MNGshbU**klTNChOipvNiX zlC;kLE6aYSYJsB~j&Mfe%0$7uxPi!W*gZ}gTx@ai0WLC+Yo2fW~r6wGEv>tFdgn4 ztX9-4L5oUBGRqn$sR~w03s0LN%Vc!UAB+2;I3V1kWlV93!bYCOd}GU%Fb{=j*g#}F zsn{#PKR{V{=2XAYk7Rvc)(MDYdneW>4j#_@%gMGz*TNFZ^9#Oahe!?$`ICj{VN4Iy zP8mKmSy~$?ZfGtovIz_EV^TgCZfFv4|Cz8FhAIU9n1gR+htAAl`(Em@j8x|#dzJm> zc*{4pfphf<{V-F4XYK2ebu125oX4`B!ib|j1u}p2I6~D2TdUDYs`jZq{zJS=KMToD zD;>(l?2akZQ(=UDE7cyjK@ewE*O-YFon{dykF!nXkMu1gb0kmsQl`CL+8mw`W{4An zp6zJ9`L{lQtH9uybhLTpprCo)GGlfX@-qjPElS@vqxF6PRSDP+RcpBQ zS}u2;5i2jHg)hneC%Do-1lx)$jflEQ^QpMU2o63YL>xvchfK|(4yGBbx8RX6P0P|2U2o$S zFXJ#Kk_aW|!>j82-tG8kvWNM8*uG#@_tI{(?f~(=wQS`$CPT}Jce^TBJXKP{`K9Tp z*1k>Q6nj2AYzau)Aq|=JW17&eU>^ND$oT@p#^{KSpI(+?Mt#f=)$`vO-sDir1g`YTKQoA^2Y7Tefo zO<*e=#-Ne*@KH}%XgocN+ee+V{R1* zK}zhENE9S%sUPn8^Lg%_0E(5<7%OY0slZ0NUj)A0r*x&1FQjY2mx*8dd9#FFFlDY* z_J3yS@PJxeJmhfL43`80H829Cr!0RD92*LtFvz966F5hpOw#^kwIiH01M!>Clqjxt zx#A~bTiTY?ENahQVr;oYznlX5xf{g<9t^nKj^T?ad^IXlIr#RYgJG*M6iET{;q+%k zCAFaQ#YH>aMv!~UhaK74(I<5B&O3Lb@(=|`wR0NhzE!dUQ-%k6ET6iu`~Kh1v=I9e zg7mL;;L!PSIzi3vBc@?#%Z_ef#F$2yK@4`Qz*mB8mZajSc~SSlEFqBz$|QIM0BSH8 z#xd0~fp2uT>0tVCAnS{WNk3eyW;ewO;5`Tym1y19mCf}#mnueMR)8p;Rn$}@#g5>l z-0U3Fm6>i^wcmb2ZOSccBpKGKaQaYK9tVBYVQ70*}4 zn*5ISx-~MQtL)0Bh426k*U#~bk%E`%2IH^E7`AUndO?u2snT5Byrr;3d=cT{tX521 z>SgimrZa*HS?zHfPJ9~5OIbiUN*7_3MOCSw3EQnbz1w#Micx(G`fM9#?nC4E8C#m{ zcg?fUcJV&d+7u_VLk>37pF4((rcRGzM+BM0&rZlm>a~qV%$MJ8;R}a(8v_Lc(`AOD zI%F$$*9VDG_#cf|911JdoNH8V2V)EUOV|@L(Y*509Ba8QwT5FR z4Z5_5auG-Pm8Opdf46p|lQ?4QG+Qn;KFLhO~%Z;xlu6NJsn~^ulE1!+A=$C(W|`xzJ}XWIlUUJFCa)>l1nu~E zJ%>mEkc3rHlO@~sb}@?d0nvke5DDa>}o{z+n?&Qs{~`#w9N;dY4BzMeb{ zk2gmyWw6Ng{$1Pi>eCQ)VT(tl$LLQd%a|}9^CpZ3>{O+3s5clad{z|F4-Al~XIxXDF%%cm75*hG?}h!5cQ*iKHTnjuxVgw6C6rqR*sBsg;fs7ep|j{AN%BW7N{&d_g0&ZDde^ zTuWZB0@F6eWGFaC{^q6LX9L&2Q@GD3q&OE%fT6Bo`n_I5`$Vf7CFO&Tk-#^3(s+BUV@H}#$MlMH0?C97y#0b} z`B$mD6C3LpQ6=_vLCOokSwYNtRT;Q-UZ8|c(Y2U=csz$r7_C2NVAbETS!NnWmLb|n zkH`W~7T@-DewWgz3wYWqBf;FT#8h*9GT1U47l}Td%BQvIR0ix7rs01%-Bc zY}F0h9Mw{omr`W~Y{O|ajmOf7w2vF6eUurEg7|T=ss+ue7bpdaosF9<<3!LGzb3DK zw*M}}V*&Yu-&}YaIvE;0$%y|ndg;Y&UiPn-{w_5F3u{phY}J$Q)l`#J_j)Dzg1eIZ zeP1;hEc1VFcGM7zwf?XGmE*)voR!>TLOEE@$iNJF6S+kHstLdhgLz0TCBOdL8uRth z7D0=H|CkW{2SI#AJYO3Z{3X()hA>`0dKbD^V%6hei)WxFip;J+g_PcidjbQ0M_?OU zMbvw1+~Z;S3N3{0HE;ms3dB&IOA_^ZSQALu1ga3&hJaWGBIp4<9!oqxxxJRqwBM2f zz(L_tgsQa<YH`LCjaOe zw_K;85EmP3GzWMf%d5IJ*BD4nl556rw5xzuTc3I5ha$J zRntOLry)3@ISlr-2vTuKhUE6xxl%K~91B5b><{-W9|(vp{{5v9H^_FEIXXuOrGi`D$YPw&P8= z!1T4fb~6B`Jt&$%>N0t~hXJ2xti68tEGuwrQ3-L)zp5Tz6c0|pR_~LLa>rWhe@>rr zpiWu6z==h9Y}e$@z&xwtx$3d}0ZCYqC7-z&A;e{E22*XLe!avq^Fmh>2<)NKgqm{lxjL3Dx{+I5Q z+;B@V7lD{gkGahSY0$Im1SQ*PYxjBuykO&>&uN-2LWm7M>a(ljYPd}>p61bgj7(ZJ z-{ikZcG^cB9i0m$RSV)}Xau`9gbg`ZY06TRovz*H)7Nf*jl{S)D2~*15i85x&>dDb zHyBUB`#E`PH3a%O!58T@E+w!{B=DdRPthFP*FrTbTCzYlvUrY_BAWd zjuX0hLXwu!a`$}`Df1(Y28mlKNQN?dwr4X1S?{V2F%S#dDh^9o3sMavw%%D`v=yyu z=e>BcVj!EdbQoaJRpxU7g1Ac!7_SzLpvqfaR1n;#$OPvoX!&T6*huK(UFBCE{rUsZ zUjOzHq1}Ajbp?`3{KU*1JEsUwmV3W5+lkVJtoUGw9pDMi_2i2D>1pKtbu#h95n;bV z@o}ar#IA@MjB+M}t}1V~g1P>-$A{74SHbA1($t(8Y)tDpMZq?7qu z_jWTxA?um!v=Q=}6B1dpISoM)?97l1Y+I*JF?}L0H@)J+NW4&T#?5-MV%zVzLo3^@oiaWKsLW?sQhu{&nrH#_Ccw~;! zuz853NNPfMGoLHzXr>|4L~UWC1#BKvDcu^7W)+xL(lYl0n;dmNq>i{PdUTWdikC5@ zYJ`;gK};^c2XapQpv4F;9LeB&P>}0N9+hOd@>78sCQaL2y_b{78|`MkdZz-@O*-Ix z5R%L9hino*5HP|)BdRJe?Icp32QIl<>#NPUK%Nx1CWJ8axsDDkE6^Y*qli78=z)$g zg6=6Rp13V(R5l5X&rlnZl0{iQQqHpq8nNSDb+{(wDx1AU`JH*H2l0jMn@fSc=n!GO z=ufJab5h8sc%Wa;d5Y{hWK50bF`+MRm`}GO*apL>=4DU?GImln?8Ntd9&}B9Y<&;L z_^V+}f7$8%kwsXa&K1h5sTa0S-dL- znSBZ8K4XNbe*tXJILsD6S1e{t6b;xI%^845c}?Qgub^Lv}=V zT6@yRU;%7T=Tg!6n7=iQbP<%xr&(9n{Kd&l!?X2UP7py2w+wVYR<&EfRCj$=rQiPnZD7)rQ|O<9f^d6DAB;J-w6qlslLi zjopN4w@Zl+AUoJ`VfW@M`X#1}FW87`kX z5*2)d$N%DudP4SPIRD{E(@eq%CJNbuYt3w{GCQ!1ZA;gCy{R&e?cfPy1oT&B4(hR) z{Us!AsHI(!#pe{vLC><9KGSa_-rLVX^0`L%jhWf)U3E%RBbt|mW#N)sr9ogeJpm4j z8d+SjHx&3aKxx%N#sNO=^nFW150Iu7&&)VqMH0DSPLiVyiX5&A=BQrjW}z>7rE&& z_I1>e%u|)`P8gY2x2uxr#u=$6r#Z_I=T4GI-T29J6Y^L&q=nrx$<&Hba= zkZtlgcnX&vc&x_{E;wS1D$Ujxqg^mdxGmwIqOgl|pM8hXFiY2wSTmkjO!SPL^QFbE zA8qB2WbD;Nq9szUDBt?NZR+rJ41HzHLW=kELgA&i;jR@jT7r@42%&#~6AY`KE&Da+FCT zila7bd##WuqNJe)cMDt7>qg?~rRX8ayY4DgAY+Y=3I?^N4BQDe=d zTVLiOdr!1F;c8zwUQSZ#e}jaUi`pKM{^$vsiCF3bDHHztjqYxEQ=_C#hWt%!PBX#l zv$WnEgh{I6iu4%FQ6Gx2YHd_XHAbnh$raQCWFY2OVrh2${wohm3F2a!mAud-1mkRXI8T( znTZ6D5^1(yx^eDEjKs7vs|@o=wdJ*HKFhD^om<9x%njfr3ga}vAJ@w$z3Wx!c`}(4 zdj4W+xO{p%h<-6g}1UXe2_G{DCKcH=HMS^pY&)P;0dn-LjfuG_|Mi+3XaEY{N)Bg zqKoWFTu=wSSnV2um&pAavTT^Nr#!Z5*i7y_89pg{J;UtAi90mRuC*PzoDPi(0TRh! zh+KGGGqjD7i{x2c!8)*0)r=1Mu*8bL9f924V}!=Z{{ZY=HoPV>M2tocPFg(kaEsMr80-SkrGm77s|=~y()P@$&|0aer&^3#Kg+be z3`&}SvHo`9q+QhDJ(&;O<>7(EpwwSK?wtVG5Sn zK#xAEl2a4(ioA>GOe6pTW~EJhxxXmKwde6gVTd>jU*t4FQc;g*%&Y_ziXpUdWtjZB zn}l*qm|jINAQ8t~`>^a2oiH`sSqH?tvZ8quQPWQ>_8;v|3vgV1xJBT&q`DR3m~m_` z3i>8QF0X7g6PP(gEGzlu;hZJAW#F8pyS3s-&~76M{!-}sCTtSPwsQob>5;ChTk8Z}pCir{q2F<+Q!ff}y4bdV3qtcF&sVq331GF7B}dwH z7kC)(85%}SXnADFaR4ziBQj+5_}RFx`||}22E4vEgyC8LR;2Ypq!orf>!iYOT6pwW ztOqnPo!g*J4$|cyEPbB{pQu!a5#} zWeeMQ{TM|7 zg~d1bvARL(VgAQ7_Kzrx#|#==FEXmGe6zENR5c+bM>UMc92%}KR;uPsMOMh7@^IPt z<;;pish}HmfzDOgAe7^(kTOHsqwWj9(!O*K3@i4MRQJl=H+Pu?NFG)}!*v7QTPP%MPxLjmG5H zfhQT*XG-DyS6D`K94UAP>Psm5XmRuy>#0tvdTY;e=hN!aP$}wHeqSiQwxXIkFQsEsrBrH!v6}xoE0c z1003=LBX&Xn1EU$yGqwf@~%+9PzoH1AfL)X;#`kVso5e6W zMX|j3`5)x~(^gv!r$;aR44~>ReX#_sKE>}pS#Dg*FHo`4hHrp zE!hgA1Ti1Qpdu4LCY8{dWdJHre2hi-hxwv2r;cOrb7uO(%S5OR=8MVP zG>$>-4A+O3zEEP!7p*xi9D~Z4x(_d7p((_V%_Zg(ZgJAxNjDToYPyH5$-z!N4wx@$ zbLZH?rl3vb$4&%0<{LDn5biCNC>ZlmB5JkPp?WgRy2lXn#c-|w$Dn3LCYhRd%Q*^0 zcf^HSt$A3N40G%e!F*Aj+r&0-(sJ)K_=Ph?jBziR+K4ul(@8kRK>q?YGy19F7ecV;wtF-pyDpVjUmW1PTs~E)fRQiXKlt zy0K6o2Pm3%A=N5+{(E!R)EUR{rROmZY;hj4|Cel%jl6y7{D+gGaYfsUzfc9uJbfp)0a+nFuGEtS?b|C9 zi0Kt^QQCpHs7MRzs7_|Te9xJ=|2}!hG~9WpKkRuZH2g{Lj{YWNSNW!O7wsl-SLmj0 zmpgPGV5tpEuM8wu)X7$VyYB?^hpqN`ymD^4fa} zMScL#q{*q!j=WH11g~xOe zKAJK~bLpdh_o<26sCC*VTh=?=6@3$AiuQieVOJ9;PXAzrtr{!z$#VzS zUMUdMh!9WOc<0_tiy#`PMIM>_C?)KG+{C2YJNJQxT^Y0gs>Bm0Hz#k9j zdAkErxAhDO*$yY7;#4`pIne@a7p1cP5-z3YR5HZOD9c65C^bRLD0hxx)4Jz*=Gw@#-T0_`_kTeucSQUh-XG`gPK%)g+ISJRi(g7ESU^bm|xqf zZxR4={Ui4k|I8+ybob#@Jpd24geshA{_lm3Kec$C1aiJo0p@hsa=+)%`1Zq%_l5N1 zbM=7nQ4Zk^3d*fO7dKgGM|3)>+}U$$LrU$I?)FOwA?<%BQx z#-uOd#yAvrV|rmLVuBsY-S}2wEcXqK-Bgr1Z^VVez7drDS`;eoDHfRYz#o|PfDoAW zz!v!Lwnu2Ac+2>l8#-l-vKc_ygSU}(QG9O+9SvZ6J`H+{>t`Nq-eKNTw-K`4TCD^9 z$VLMj5ha05WMhQb2=s0mR&5nj-(I*beRLB(agT4<82WLGG_;DV(%=bBH;vzIV6srS zi_NqZvefsX@Ug4wxm>LRGd%_7W(F~+jdi_adX;2jSq-R9dSOwUl!%=7Fj>j5+N#bK z&&`~t_%hAX=O>bUF91@kc75C_V*4_RUHuk(R9LUAv^_)RJlneL68N3}tCkX(M7xNG=@Be&kewAOF zJIi!CoqE1Bj(2qF_8$X0tE`D(5)i}+il8Mf!vZK<2Iw|eI3`K~+GXpn{65Etya~#~ zO_`qMM2-XbK*Lsnl}Au)J4yh9Pb5QfrjU%d(+=9V-BQ zm+dsOG2A(q~)3w=_5E4g4W{@ zw8Lj|3mLeCh!7(a(_N)T$kp(ryJFX_vgC#M-0306`|^Dgg{iO!0FQw+Kzta8!)sHa z>B+IJsg@FfwIj-0+ zuT)+;I|xL9@fU+i8_j=I!8Z3+D!sVUZC21o?GT{wC5BKV@F{$I4*l@T_0BHcBF$4> z=#cdw!&j>Ie~d&Sw}?b~kKX!Ft@bRJl01%Js6)6P1bBn|CpcAqz^PF58z>n9000FI z008~pfYZ`O|35c#t3oo-R4EUReJoE-6vU^Xs6X5C8!V7f3WwAX5Ma20=oSKfw2+6%s;PaCpFae7~NM zc|w-$c{-TN^tk^1-v0iK=6rwYzV-m%WBl3`#H^aJGeTF{r$B#lzXidq8bb9V>rL)> zse|RHn!QEFtr~RVczV52*1GP8*vQ!zar3_X-LOxBZv7c z?ud1_=Z%YTi|za9^BWiC0oMIi+s#c(2WROvM9fomIG+P2K7RXo56o}hZq`#RXdU={ zQip4IFka_lCLGu8HUYHLCODOC@+al*Lz{EbVRDF{k!5BjQ$ol9Xq;I|{rFK`u+)@m z30_hiJarfm1I6)i(1rPGEtAWn#?GXmx!O+J*8quD8$ME4vDoxCXfd(;-y~334=#PP zl9RBZipTzT_e!DYRZdgz9@lJk*QC^tvG)2C@yierW?=ipX4oMQ@Eqop>&1pxG&6gS zlYk&}AQf|`I$DfEobio9J?EOOC7eiB=YgOg#V63oH?7Q{RAVhp=2S1G?4(DN5$n2% z5MoDku2t?0i~R*U%9U05KV%f{3`QghCIh8f=S1WFDwcSS{g`cuIXQ_UsM96#h@aZjy z78PVYt(Z{oeMhl=mHTJLQ(2Htl+Iq`OpDv2mc; zAr&EL%fKBYDXh%mQ;Z`n&E%|_6k1tO`PgphA?qX5=5|x_V1*NHY9Z0?e|`eXI!>T- z@*M>5OKU*MdFdpgkf?;^i_Mun8R|RQT#PX(VI}juT7GWM-iIp55(gQ08B3HU;m7={ zXO~T<1-G_HJ}h(GY*cp?Rg(o@$+Nn|h|0vsL&TZg376xLE-B{KQ>Qo-cB!ea=R16D z+wZ6PY?MDGH;OwT9YF`mY*7M&su(;4-2wy6C86FJ^3=){OKE2`-wrQ^{y^h}?=>-{ z_F9UHu#$Q59+M-Zq}JiG*fDuw-@LZAHrF^BbO81CJ%;uKpe>N4X1*cNi7UJWof<*` zB1uuGFCHmrSQ!QN4ox=^;Ny0xL4?8W<`Ht_Kx2&EX8Hb1g5*u{Fv&wzSYo( z>)c8C#zu{O^&jcTN@AzyW*_ary%l-0vU9Hs0B674V7Vdfpcv>h+nILd_q#!<4)i-U z+o63a_iet78W*gOd0>5h6moHnJNe-BFr`5V-5azd0lCVon8$Q?(eR=QysJPd)ANqf zCFu_105_1PDGrlxc`wPZ!dy))J;6(_o*EZYU{Y_9UbeANL|!IQh9`6MIj?tss;G|> zci>Y>f|hFP2@EWN+|+D6BO(h8@RWObKXDlwi--%_5=egb=$IfR$x=&3qN9XsanZIIpAv0;%y-Hf}5UcUP{gy?40jie%{4O}mcI zz4Ui-35pct1aRAAqT4Gr3*-4k2U&oCxJM?Xgdm}rrwh|-ilR)A8Ct5&4XLWTGtnO5 zoXyvE#0}A+lhbZH$WDdjBy+blD|ExK0sRwTEgiS3LY8R3-W4%na*+nr&&zS;W!mb3 zAc>`=Yxpo^>%4|MzL>K7*eCX7BUq5`ljqFT{0Y8}D@V8WgzfF_PLKbPZoxupXJqEe z03_yuo8teS(BF)2RtOTwG={6qx0uQ6?V&{KBB1ZA>qg^O-&)+>%ippbSC#7G`EpCu}0#B z_{LALj6LN~km>PgcW$?^37Tt1(#enlOQO^aqCQ{Yi2sXIMRl~TzH*_)wpj~TL#>46 zS4Ab2L-ofCbFtZg#4TG1mn`SYaxl8&Z;C~sr**~SWhaVv_cdPB4JOkLd&pgXqd}Hf zIO$GmduQQ56D~x_D4X%dz&x^gu@T`8ctS)z1LB&%9psb*I7JTtwzSA`Y%d-@by4vp zaJ_Ff%P%+jzln$u<6k0{gDi(bB3UnZnOqpuFK{L}XQq9@?3APSk=bHV7R9A%^m8os z{k@&Xe5<}#Yj0wj0cK1w{OR2QRwVA&o9QQ!2eQg!7m(ZGgv=3}klkQT`zh?Dol0h5 zMhD7?=jzCnA`9NgRBvht2Bq7z55F3JlM*^1O_>yKZnZ}Pa&pk>>fxYcibe*sp13C{>s@)D07jdnB7Wne~t`}O=i(=-ZunmO>!>-ku?h6?3it|*Fo z12nk@+|7aNiwg_Z6ggEe$yN=bZoOuY> zfw7%FEJvR21IRzAl)dX*YCWt>-pwCXlIJ$ftC6DENv4I# zPKn?#HaGfE7Ea*i{OqG-;nw1b4#*Min84kFthvYIr)y<-r|)S;Ww}`zQB&1v=W|t& z*was@G@kA@iTcJj3Dq6)Dda`8`~GpT`wX3Z72Wb*N(d~$AAg4ysxNp&I9Y5bvU0k0 zFmOd7sxGlX?~7oeCY2T;TQt>^7B-s`P}P0jRKUvXkMcLnd~%jlAV6P?hS%4PS z+D*%#g~jd*quvFtm|)n8m!5W}DSr+|Q5 z6}lwT>Kif<)vI;rPYP=IMKhTjcou=#*s$X=b&RcjoHm-X>N_OV|{)W527n+8) zpU*qydetEO^g{Ps@w{=(c|38=yX_6Y7Kn+%l(Qb`{tzMvKP=7);y!MR;YE`HpXH4@ z<-Q}*9N-|3m2AsD5)%Lj?r+^i z&lus%Z%Pg^UG=(LLSu4*0#RjYWFiQyV6Z~Z7}_F`Uq?;7Eg5FIbd`8h|7M8Efxp&k z%#)&&{FYj;O`Sv65bB)3e;ajE+YL7PZ&)uniz09#gR$Ymz@31?v`pD(1N79w!b3tD zbAYxjM5(_(b=R-0}UjxSBSFG1FxjEG_0~LRKNubU5QRC#!K!XjbSsHvck2w|EbQ@*eWWttXRtQ~SbjgV2qE{5PZAa}ypITYZ)OD69mEAk%@yBsa_PuW(yik5sh5OGrLz7 zuueM4r>c3>^;g%C?sZ}9T-Haau-x_L;W})(b(KF4Ikx>3I|gPB2iW-)Vj_%+EUi=D z?qmVZZ{e6H(Jpx!RKLv@^+hdLHEPVBh_H1VL@yn2@GX$Bh>4=XSbBa@pW6cao$ml% zb7c6^l9}0i3zq`%?rH=-taf=POc^Kq`oPclfZy;$M*g5Te?@e>DP|M7?edg&oB`8B z%t@&PSA)?+>}jc-eS>o(Nh$!iKou5Jx#QeuX59&OT1+^^+deBJZx+^tj>4iCsiIor z!mXxQo5Lu(uS%0f9nWRCF0U7c3Ffh?I}4Pm$l~9dmLL6-lhrMR`8QDJ3j^Y>zxNkP z{|9#72Y1m6nACkV%laGF+%HXVmmN_bS31YlM*qKn{~b0c%9~e9Kd?#ofeqEagN>Dy zleL+_|Avl(u&aTQ?LR@3sWh&D$dAOGNs8{L@52X-%#VkT11Kzt?;DJgO6;OWxgn*G_)r0e_R4!H;Fh?$5k zjSq8($uM@FY;K)yD+nAqJ|&D0ci0h&5h}CFmWZ`Ea9?8Gy{>JbX9?ZXyn9X*V%c_jKQyhNAyr{1arWRghRO4PyUmUc*3;>L&6O$~H5Q z%sSp;M#FqtQbY;&DMJQ6)yiU-iMao}*Cr^CG8&P;-i-|cdYklBndk-^Tp1BnBXPNY zX3HDKskGj2H?lEOP3bQsDDCb;^cVJPZUa7Jc$HD5#C4d$L-w5!99sJ6-fV*TqJZPy*wQM=c^%96GY$Gx?n=3M?zZOf%y-$E z`ePV>R{?Kk_#@LuPs1~NT-&K8;A%Vv9*e1p`(t_BY`Zip(i4BA|Jlisd?Tro4yoiG z_TD}Js;r9T=9H0U5SMx}!KI67T&-`QPS~ONyhO|?_knwxi6R=re(?Lfi{*9NK^`SX z6G-FkJb%W#_W&65D67ly?i0hqlM-d9pABCmO!5SsmKEwHWO%GSQxcqo3ZH+B)`)@M zMm0Ax8*K+QTTUX)Ss(I7Ju687Cxl+6$G;$(C&16dCr=bYv&-OQ*y7ilR>Af8_EPeN zliTdHrxud|EfzQIg8`nuDjP;>F}SPr;CQO9Xx5^`A%qbndHnnG+RQx+DZIpu<#?25F-HqQ2bkb*xDO8I2ajnfx3Dm9PA}z@LCR$9^g;D>%MAbXDv@fuRxtGxcJpw< zVfuB-JzMAd=7t`?WbfEIBNzyo4K+Kt|B<6h4iK7kWD>gmM%Yuls;gpO1e>*WcWBc7 zZ+KL73w^uotqQxR@>r`h%%6C$=63OR!Qo}?mU(DgYv+7ym(!N@NDVC8T^#nmf-ui* zw%Hli*@0j;IUVmYSU5@jKe=mrefcz4j=S`%IKzn6T%mfXS@yeTrMu|tT$I7^*wd}E z5kMSWheg_88!s$fgts?_3z1H7_B2_`w|-HmAQ_#lT|9(@y6tuTf?UKqkk_FX;Y`Dm zM^#E3CRX(fB1Ek^J;<_;!~{u(I&!+B>bFAoi?>YZkfaA`Rz?K!29iS!6D6rL^dxfY zdTHQEt-YkrB*9JEsKH_4x3k#*r00LADE0ETqA8s>Er}1Mc~g^H&3r zmZ}VyYIYi_1G=&)p9lx!bz)X9>7RxrGNO4N&=&FVq3Eemd0-c2@xO&oGwr>(kekxnyvmP1SO6`h$ntCJ9ezQV{WpNVTP9ey8KRm`SJbxzwW~qL^cR*8o6U0dx9s z7mg^zZET(VI!32uSEjA)r5Rane;dJHsv(%nw2?SQ%o#+LTB;#ZI=^=`)Jx7>-?||p z+MkF$mztN{)^c?g$JxHROj^GXv#3&6ue%Fe=LTiSk}NgHuCNQ-Do}PgL5v{CKxRy1 zB+oWzy4rc$FyJP>PkeBe=mG%)Z}%nUV8iH;S~82CjIYCH@Wmuf$khU@>S{~B({yYQv1nw4apA zG?C0jKN+l@_@v){#5XF1Q;-W7=>^E%G4%s~4rnHd4 z=j20pm=qU${Aja4TS7pOAqfaXrBE0}fnJaQ^W!SUrtyDwh{Jsbj}p@AHip ztT!Hfci1x53;u80({Cy)UuH~3bVkG#-X5`}(BzshwKug`-wKLR65l2P4lw;&wX!V; zBIqi~xrCUN+o#AMwj{$$y8%1*nQHIYU z;4n3sR2Vh%F@qj`XXuk^UQsA0- zWwz_!8|DI4C90wEu6lLQF9zcQkh+-Mn>V=WY&g(fj2u~aI)fwY`%nI~p<@B)Ak43TCsp|RijxmcE zt7sn{&@FeBtHM4#!j#iJo@YqMD8TX!YQ)>v%5;&^8KNKdz@R^!!uu&D%{-yl*) zE?1>N-#VseCi5lw7yN3k1} zU=^-#R0t4Kl-wvlSocvyWh%`1vp>Y=NCBkcO8pGqc+t4!qJ2@TAnLhKY>9wzqX zhzz>@WM*7`bc^88141E8gZ5aKaBvtGH!Y7Qzr@0g-_S`eqIcZM2*=^DO#w!Ry+!0_ zMX@3@+#y;%0+7ROFvv-8_NOKKp3zvctfF;%WOdF)7d%W0fSp2s|AJY)$D`dud(Koj z?!X1%&1F>;`tZm8*~tY(Mu$ulQ{!D5sK>#S{E8cx$J&7kZEb5&jaw#h7fK|s2@a$N z7SFJk>A{o}aAU+r-~ItooEqkajqemWH~D~E!nGi8Z_Zehh={`l>(@pVM~+&q;M z``!75>=o{L;L6|~0iabRc(Hi70j`30B79-_w+rEoQ)aBlAvqcd%S_TdRv7Ki%9e?# z#R@lg9Hds@iE0p~t9uXZg2V11QprN%<%^d*q_Kf5alu+kXS@1N44a0Hol(uVFe*rh zRME^>^&5vNtMBx%{!(qzwa8k*NL8eVpj!RB4PbVJ)GgqIEg<iH zI1(L@*L&68*tGA?zh z9a7wbLD51DH|uT*HCmoVprEDkmP4ZSAT_}}4h+0e9u=cHllOJU;&?wen^kNZPEWW& z`R?kjyeJ{xpn0qaToLTlm%v@sJW~hXi}~=yQ*@i8%g{?dQ|;YU@(5h&S1X6WlDFbd z>Z~ql58~WO#`-IGR=r~PR~oiUwGWTe_LsO5EuA3k`gjDHZi^37Xs#bJGDni=yrG9< z+4)~G#)>>cH4v%8t5Sh^klehao(u+b!HWUWnF$8=eb-GOH6>JzCp6D5FgfMp>)3OM zDOiat#!-hQyKh0;6;VI$LzqtG`ou>Y_1CXtTjy|tJP`pWo?t4SQ<`kSw(;YbE_3{b zrnu_0m33cU_@j5rn!h4IUw(`?E)|2kBd<1h-eOtbH>V!}*bOb3H`?&dXaf7JMT)82 zp{ve%v&Cs;b>O0g;ZZT=Tne~zHq z>t66w#!Z5n%(=a@QN|4_E&IZ3uwONz-kC7A^Psao0%g-9bYc#HcY}uXA4AwnkaS*z zkk8ax$_KeBknd}CsQA*=N~A0aecV|hy&y<(6QnF@Q&)5tYCBE!iKp}pVo8!r`tX9n zf;J`7B=bs7O4x?w_tor|{nZdA_A^j6i`Q{{n)XU4g}YP1L8}o7s0nEJn<|VfBiJw-@0;(@Q!}IY4PAjl7#heeuj^h#hGr&hz>$WjAZMv;ZgfodQcnX zrc4kLEcbT@DDPc^>g{V99D^=Pl;FLW%OhPmT}#)na80pmJh{#Q=>C85j;n; zqAT~x**0S`7R}fg{$+R;Fw{lKkX4q3n8ze<;*ER8Uh3n0K|SF&6n2Yy6sjg+ttpYv zyJHmg_NFYISknu+rGODfBLs`eiS&Fng*!%2HyNQ03u5mM(eoH5$D!71fta53i_FmEssp&@gZqFSLK00i z-inZxQ5#mwdqbLvUz$?NSW=Jg&#cE2ym3ujI|1iRsJn15t|I*#juLQ$cQ#5Afmq|) za6pxR{NJr9Ont_RWqikt50_!6uHo;lAX;cof}x*Ns_@Gm`*wi}CbX7Dg8|0Y55{8n zc|!)V_k5__yUcx{MYL8bKn~uG&`0mbAmrvt#RjaN zgi1T~+aBYrYk;V0&JX+*(%SjdPQ6qTXd@lAiNwY4J2Om2<4j(%qa>=nCU30rj9kxC z&!8erCcQHxyKThGzcy~xq^vVp(XuQ$k6qM27C0WrHk0cq12HKA!}y_HdIRg&Q(ic^*y7I?9{7WN zC%?9RpWNdw>FoP-GEvpo^eEZ_6E@~EXd7SSCIDvhbI?FLxIb7{D>Hf^G=?RefmrF^ zQ<88f3_NFNB%2W+S+HOf=e;7IIBB#o3c8;iw5d2&K0~6|4`!G@bc%ty=B5#MGKX>` z_Y!J?u8E`vnda#yrKIA+%#4GX9GGmbJ0zbgv~mXV zqg_tFh~0R621kM)vJ$UFk6}+{i9?9hB0gex>hAVWKG@>SG@9<>Pd?0uc!5;?)xB`$ z4fQLG{_|iN>2n$XJm-I8^F>uT24-ozQY9Uu%1i$dxhog*mfnVP^Ol^hG)nBMzw>z0 z8`&Q&@!%EisGNnQbdV=qGV33c-k=ZhM8|I?<276rIr2|a4PhxEm$MVA7iypfW9C15$FH(Z4xokb9AydlCg2*ch)nr z)YG>#`d67tVO<81AMLBiWQ{;AENplXa!$Z7Jd~b-o*pmMP?9dZGut|tqlL4avwnal zoHiGA=p@i(>*vPnbDLfGs~01JmGRs29{Y>k^ZWIX(uaAYDlg<5d81^<7`=JS7R|U( zj0o0)V3t9JHp_~k#wzGEQq8PC@${Asd2kwcuzk@cofl2wTtWOkWtV>(a&IJ3Q?*u@vpI> z0ss*GPn9HUZ{uY9AKFi)>br}QD)N^#L%cW%D`1}k1e5Qb7zubS(-H<*^$kQ298?Sm zbz$&yQdwc8jTLgEU*#TSUXHFfo^Gz6%Ao3de0RzC;+NcI-S{`($5Sh- zOID5UY+|Cr6!-Ck*HiPe%M*{o+&{@A-2&(=NCRyMcLpUCjqkTXwWTBqd zmjI^hgd@c{F6v1=v#i*oRSB+OS=Bwp7fZP8{$t@`REpalc_@umbuP;e=>Z|Q!yY4wDdBCX`5nLlD{LuCj9Ig*p@3q7>#DwrSLn8X&bc^SL|MJ z^`0;mBXJrR%$C3>+q5Kv&8TCpn z)kv^d8j^$X$u|jzaCF#!`W@^^gv|`9g0TgM9&F7423x&0>}?$E(y(k^qKHXqRAJko zsKr(GYGO>FCogYI!g-)F!Dyg@bOO-ts@Raom~;}*X$pqZXrK*DG)`q8+NvmUZye^f3c=Q7OhtpsB{3-VF))ewVs6Kx8B7Y$cyO}n!MD>`Ke(2) zNWf%1Nn4~Z&cgn`1`c(RTxTZV z*j(|bY_i0L%z3rQHd&H88Nq>swTy7>Qf-1gGdm2BebC& zbMjh!s4MGFq$cO3Da|OOJ+SimPd0QHhmGj2mtAv$TKGvc6%qD9ZfqT5Lo1aY$vnL^ zg({K0_ekfWjKpdhr^7ILfiuDk@ToUSGi#d`5KKhX0>vIOe#-+XHZ*-;pv-u0GV?( z|1SXV+fqXmD)Q8O$DG?CybbK&?4D^yDCu&m15m1?~&&V7!}I?hNM8`>R`P#ILW&acwRlO(7iT#9lB2XBJ3;z3!b6Hv74X$R-OZ#rO-v z?Kte0imlh`9ID~x2N4TvDL+K4x=F>ZkRs??NE7K{kTWJjZ3-($c-P%GxeS174LOE* zxbk%VL|jCZNME7`K|`n7@%%~)=gxsB+DIp?9!j{BqUT8MSmQJuYPVE5$P|AoPI&0- zov*-!e5teEy$-~aAiB3zA~2JFthAmM0)_q=mj-*8{y6li-r-eD#i+J_u6Fh~Vp^;o zU*(PT;#_ht1`;Ke8&l6A^n}r9(T5_QO9-OvTXuo@qEE0x+o|z{Lf)OD2R7d=J{pI=Vtt6-6S}|HEwL>A{t{Jk7F5W4ZT9OMS$rhK7+UKbJ!6(T0M~Yn!O>po2SZDP}K_jLV=1!vCN$WNR z<+n(RI52et$)$I*9N-RX52ekX+blvno6Cg2-&TeY7TL>|2EMM9b0i^Oy`BM37t~pgw!h zTx|lYzjg^`r~C56)1lty3%rwR_+xl~gru}A-6mn-3IsBuKCMeOCId1uYK;Y+IbD5BtT7B~;EKh-uT zuHma*qD&>$(ZaG$-ACrr{JEA)_^WG0&{KCa!#;GO~AO>`ara%b!!Gb2Jq>SQj3 zP z2^hCAkLv@5QgYrso0$k!n=vAJmIJc+CArjt!2aE?DoSfHOyUA%88KV~v2^q#-Sp~L z^AQ)fE&7+K4fVI*M#a%F+58q)*qvWb=mL*=JZ=*ape~}K6y^XI|rG5!nLqd=V#aRj< zfiMXH6A1K?Mhw@zP#es{h=_&D5F<0TpV0ZH0T!kZeXtlKym zzT|hU{eyEAQ_pGiY7KY1TLsXCIv}udIsEKj(#NygT8!|#$D@7)8+Qwq=n4RrCr#ot=g^ZUrdcmctsxTI(LCl zF!g|vPs%SLO@z#hpc(0?m1UJjx{f++s^$p+G{iq~%3LoTd^swm;$y+qUA4gcSbPWl zxk;H$lm91|Dwc1V926Q-hPs@=%0ujxw8fgt9A?CAC>pCUId7RRQmAp#5o6U9SJ~W@ z%wp7)qM;B0T=KV*Ir{DMi(YdovbjY6gh2K+I@SZo>|a-nv(k_98g{dhXVnu z&duOtOiUHNRWtceLm_B=tLT;GYdRuWxqgK3W*ZEM}&donwW9KN51ab zg{=CQ0cDC3Ly63MF^!UD^Kkx;nMh1a-R@~%R8#G|_z-?QUVYx2QzNftphDzw?7{SR zqL?}-n(V*=v&)d7FRN6Hwvjk`tLA0(qY} z2aN=tUvFOj886wGs7kk$Q$c3ZHXE*8NduPTR8sv4t4sLt7ug?IWVLX+vuQy*97PtS zDNq#S{wZpk$gOa<%0rP=;6_3zH8`ALxKg~gh3KD|I*Zh-Oh58qxILF9Zq%-{oLanF ziWM`ONSRbrp3(m;@@hTLoLAD>WeEf|5Wia4CtR&+(1fS24F z;$I8bA)a9;=SC~#Rb zP4uzIF=C_xNzT{o)f&EcK0J+)*7P;E+=WK1s`0YAwK+^3Y+M}8vRd#YZd%82k8}0> z(4M37ORFl9&nU_rM7)d8ZwmtYJ!%~Usxh|*?bcs>Oy}@&@E4Zdc>xZSY+DiwGBh_d zZ7o65%k#+qOy14x@RwF#HTf1Xi~FiqCa3geS1%@w{gUF+VuDv7Hd1(9d;$d8Nv(W$ zforMJ#I9dgy?ibzA<`3L8rDgc?MQq-6{S=^={Gjcpe6J)hl-kdBR1e(CBYnrzBa#< z{^%=LIU!2zfd6TO1eF~nCbi_RiNTUELF9Vvo9N+Qj&ODpPVw@cmhPdZ1Mo4VP07v5 zL(7zOll~3O!H}5RZl|B0ezf(b1^Z&>w7QdSSsLELqbMQl9!$&)NO}ysAGII#pN>M6m9^X(~6@%aOC_x zhV{rOVr?3GJPQ^hyv`)5EQjh4mSLYTMJ!26 zsM_(^D8{L2o;{p=906n&?o*OdCAoT+{gs)E_h53@(SW(1zMBn$Rqjsb?OJ4EkHpxz|&~ZK7H6-P^p?AMKhbs=Z5pqLkL(O~-BG zS?;}a!5)`>OBM^(b1((WHj}%9rYX3!8~*~Q_v6;ZH-`W>hadJZ(xiJn?bF#}3b*_N zqIS^xE4MahV#ZbNYsZk&D?o66cAB1PZfa&E!`}2@f4YuKnM|AKkYq=(9X(^z*jB}k zQS5*jXc2M%WnAgchzX-M0q0<2&EPiLU9^5|IBX-euiTFGNfvy@CIZ?}f*fA(U{>Z? ztYvNw+1bXNlt_^5mIu@$@XU;|;%F0NSj|xMf=HSCTS8j6kxBV2Gk98&l{9|#TdGEK zf1H(cq+h_8gDFX+jw$nTgKLm%*G58r>pm?GCz{0${o9G1`wKWr5$S47R$g#cQFC_g za+Xo~->fc<5fR%I>7C!!{qh^qqtCa9Z)75D-lDe{Is@QX`_FrlA5@;`**Ev9`mW&^ zIgOskE0cy-`gal?AD&*DC3&a$P1Ke#s^vwliStPF&Wc=PmNA$-M}vi7B*gcn^JKhs z7>C1_L4pzAn+L1?D(56!l(*D(Zb~Fnc!P6~R$KMfSB}=+qK&hdD>oH)Um??R^Vk>; z`uW&#V$wz?f_fSY$c2M*C^jwfzu=R?Z1UzggJr$ZXl~qq&Y>StP^%T+F;l|!sg_w! z)0NNH9VngOH4>mzrrzCm@F9z@)TJotQe_Ov1c37Hg7sjGMUe!obWueIb$h5B#1$+%!ekg zIU=|b(_dr{6Fzv!ef?7zpGO(joXM%%V7%VH)OryyQE&|DL*fEo@eAaeYGR0OXZzv; zje>j)X+w@Fe)=rcYt|mTUubQW#{Dkk5)!+lzHyJvq*}zwjeMY^9R2fi$Xz<&fA_3e z!3CPLLPAI>G%~l1N0gKm>7YD(k*eD-gF?3MM8rlyial|x@5yGqMRi4re~PhK=0TqM zz>ey7YNwXBb)mp&k-L)8SDq9aMDgJh=Qj~0>PvN|a`__yz5#-!Hffb*<#Bk_QWSLy z)KXNK`Np)oJ8jwXY9TkE(+vWQx|cgY^#RTsi&mbpd=o8vAHM@_5~U4ST* zq*w6)2xs5+v!Hx(LZWqcnB$8mdtZ-1(TPcZA_n29g7*OnA`RjvI{}iBDLDIhXY-9%xkR}B znj6T|>k+z+c>!|5ghkO;-jS%>=oM-y#9n%*D-ii@o;+`v_NV6Y0k2C+P??ZvRbAZp zwS?=5?}7#t=>zPEv`?C&iJ$4$;Slk7oYc_4f0;SC*znhV`DrrB{WKZ>A1d?z`%-RN z%*!EtZ$1)grnOB`Z)Qv_u9+=|)$XM4NtVimgjqv9r4%JI6aO#9&a$fxAX&7yyK90w z!6mr6!@=EM4=zCu?ykY*;O_2(;1WDoaEIXVm^F9qS~Ks%o&T_FcXd^FRlDaV4c~C> z`^Z5MpURBqJKfc~oeEq7tZTCG`Ni&DPV)EOo&fln!D?9THe0h#+1xexCfiwIrLkBw zde%C>8k|E4a+C^nPS6HRKTmwD2m6^fx(O6O>h8e_4!5BiX8js-fq5H1Rd@?2-sq3! z;TvD@E8T3W?oc{dcq$1~tFxc3bWG9+B-({vE^~2XtXkF&0cRzn2L24+NLVIwV_&IR zE1ij}L1XP;XC!4?`Nrvm>6O)Zv+$WD>_r6|!RBI2A?(GZSTSAMZexjR!i#J`dy2y4 zGNKIoYm4)|DDfJay#@(yIsak))bF?DP?L?JT@ezmY4$`Z#CPBFBLmQg_tucgGwroG zXNfq&I=#VFnKQAK99v3oqDIA0W`UIrj&A{uNhuC~1rP6zNt&F6k0#ge0-1I!$i$B! zg;(pjbdPG;SU9Lz)!xTTP}P=8XGvf)?Hn-BU!|L{j& z^N)^tMq@mOH&dfk2um^;&f0EoH-Jo6P&;W;n5KB8A=c(TVx8k&cKUa#ZC`&+H~+92 z#eZit_W#dnDUuTw$Ql^M0AEba%PeCr@(fOT3i92oZ_*XdU<+1gAariI1?voU38X4^_)MHW{dsUNSUI_uEOTb z5^Fd~n89OA+%}!C;`SmodgITsSA$cX5CkB6YJOIHSgn->Af2D%+ZM3O1AJ08vn%h6Flei zo^j3+@&?(>xxXmVUM_T;DA4<(7_(NUP-wJbYOK!;?qnbaABIMEE_auAHR-0t7 zSDaRkrpvJ!1E?TD`b1zgy@N++1 z0aF(9JfEaTlm1sYM&(bGs(JiU4SvB31yWWvr{tVftpr8w6@PGq5wn@==^PN2g2d#SE_JDKpFAfSU$4#N6c%d_8Siy<`Eo2bd$;KzhI7=^iA*gq! z_Y#uS-`Vf4^w;z5g=?LsgwsFk8-kryZtpLzkH~#kODI6{?9d=W(srDkjMTB5xJRlL zSkkmONjPRc*FhUsnu)k_o#y$=WGhlF#y9{*&vfn>Za{_R{SrNJ@FN>cCjWkhp(oTL zyrxO%Dp-kg)fXpGC)7BaKo`Mab;#T)^fAYTLEynyOF)d>V*A%-9%vk!r~`KSbgrm&0%Y`0vNafW1YEof z)WZ4F2yUS(rhS})BM-=?=wC|UrWgWj(=z-jZZtmdq}yU zvdqtX7H?c0h?RLi^T#$Z5(N!zb*Lr1Rjz)KFdW>v%sFd8j!%E z$EGo4pKLWyTM_&{Rk3@Oq--GjC_y%VL!((Y!8%tXh;8O2(rX)j#}Tu^CRhO;N)GSj z-(PyOHuGF6K^8gS;xUb|+Q$Mlp1ry8ZCM?nQK|}$%F@BL#LIU0z-=g}Dan_NMbDcR z60_YVw2Es|RIHy8YCE3un;HRBSh~475NEDsl7%ILa6m#R5EH~2zv>u9v&Im}@5hxf z*yYj|?64e?Q*qfFdokaGU=vQ-T$)l4__Ov9V84Uj2fZx8G%_LQgHxGquT!3uf7asTzeB_r z$595=^K#}S&w0}u$mGN0o3#yL4twPU=sadeY`dZ)vnjAq`ETohy2%8#Tyq}>IH5bo zXOi4Vg;{fq`|Io|8lD~(dk&0xdW|FC7}K^qLEGB1Kt>;n!Ecr)mHX7{WeCz4kQVeB zV2?C?TBcDX8bY7>_eQVM;+Ev7TvgvNJsIqhyuzEVQQqt!AAe3{gI zN+9~PNFf>Z`F&a=sl;o%+PgHPo~kB!0HO)%0ZYRyGt&}|62DO^E zya3f3mE&;98HJWpe-ss@{ytg(f?_9f+(`pb92&Rskl>Q;f6E~NEf{@@O4#Xs%rU8n zAh4`xhm&9fo@MH+3W{2LifVZuJ%r93TNW?E%4)>ibyc65+Zy8C{TQD~JKqw7xUTa{ zEmIJ`lT4sYD<{eyTWP?anF6iKZq0CJene&y z^_N^1J2Qy6PT^QEYm=c&{5C!b`+*dgv|a#(%^QQ0U;G7_{Dlc#zEa_D>JmbAQKlzC zm=Pt`>Lf~+^n>d$wGW&S*}x^?Y=KmgR7E9D0kpw!h>e|*5D^w&*AyKpNT+VMZ^=-KaWn76YW zmN_sO-Ig+LSE}EvbA#!&_^Mgg$67%eq*%o&aZ@u+2q%{|n7(|1doDQ7$St`;y*zV< zyU{r0%SeFBP0*K*BRlb9t>eNiN&%?El}l}=x*biv)~{L9RO)nibl2A~A1~P2-`%$p zFkdc82bw1x)8G%%tY#Rz>=#3EHJSg73VBbhZGA`yjh4)TY!JGd zo;E4%d&(+DJDMd{xC%iBz2+}-g0DE_=^O6X&RbZ5pVv1gbVLhb8F@ixPigA@VV3NNEYl&RU|M?yZGM>m5<*XG*I17jKIu zh<>suoRK$o1t{D}Urnc^^L3*-|=#5 zki;oc%|RM27s(+X(YB77y^rz0-Oe6SBj15o;o*O&Yx$0-&=P@GASuV(99y%MffMfq zB;NSUmh%GjmsD`49`y*`htl}_>J#{P#RY45&uGk(Nw|NtgV7*P>EODqcEp&wkVZy- zSRDo`B1%}d>B8&f{eK)p_dzjet{-6m^IwGp*T3@nHMNhsp+Q-7F+Jp}E3Sk{Wf~qr zc|OV*FS~mw2X1)(c2Fy)pa|>F3fbcsqbn9a5$Vq)-(O+fU$960mF(J62E-dYmsWhM z{l_1#?oW6i8$bo6o^sWfP@Z&KEQybDMU&rGt322>cB0fPs&1n| zQ;+WI-PvY7J5@Ev%XCoL|JZ2ulMZO@%V3IyM3G87d{taVf>IirT)fV-VBmID5JWZ5 zL>L_NZk9Uh-PxhOI>8@C8YRDnn$uk)tC86L^@od|)LPqg=5Lr$-N(bQ@i_WiOR$ME zF88KjlnL)z)mU>E^o{#tM3zSTky3`}mJ6ByW7YG*__5@YCI3s<$9kjX<|fMHo}Wg1 zu2dlhR-I(-HX*Rn9+JPk;A_3S=opAT5qX7xr{f(H%9^=k9-3Q}1TkG@liIAq|Fs~F0qDA*?kw1H#9jV!~h5!E+u>w@YYDgM@Z;N1NmH26NyIN175PkYNb8hcCE?@th+Vh7ZY3cE z&WH55pD_?QrcK(5S0M`{4h2*`KMZ337Jm>ZJFbKm0*@rMY6 z$nv6de}fjH>AC}S~Pn&0+Oa>Ex;w$RV9T7GNlLDP3qTE zmbcs$N+rtQsY~u-Cb~j8CoG+nb2mnzQIgX0%iAXYv(|RIv{3f_1KQyK3R>=ex%?yB z|8O}mg^he5Q9fBjgeLPg+qQ(eZyPqR%(EtShbq`Q!iwLkx7B#?M%Q2}teR^@|*4^%x?%csNO$jse z&Gz^`@y@K0y3Zac%7ST8cfMjWhM3vYReXxYmCt$YK*|?wHU?}UU5X>T`KZL@P&0B< zoQDqqw2SmBOb55QWJztk2J+7$@~!!OQIZc*_#hd9r{K^&2Us|9Vz?ruy5m z$8k*!qKu<@F1Hr>h~zST|G8=(-g_H*a|BM~mJoD)VAPUhU#K_>-YX$ydWxeJTi)^? zEE24*Hjy1w7nq-o|F}QRxTBc<18Bw64bpQGzE3QV8d(b}Fzlmlq_9=2G47SBqs$7k zC`N41DA?&TB6E3@htIChSVya0e*Q>62t5GUXPR;@JIur@^U+@1j%Q{t`wW>-*(w^% zr3N`{a|>SM_@ku&b#0LnsDluX3bx4RRGf1?vdsYvHg10rCUb;?O{ZQ(rk8)s=QpPt zV#bi8%nFHb?nRr#KwUYa@E{PEb$@v^H4je6Zqh=`q>?Xe{Uwx;O32>$EkA23|7C~^ z)+m8>k@8kfiTV#o0)S{xhM1CoO-k9tYIU9P*d>c#RpAJK2v|1Uv}!7sB~jupy+if* z2ueCDmSuQ9KPqmr+#U06`@9A}Hf+VgN>4<^F8G}n??0Oxe8;UEnID7;{8xnY{7cJv z|G3Y-DMf^)L2!wPVqjM54wU>xtsl$JWuMOk7x4;Qrh&u}OTTi-5qRAKEASdr1D;}<~zi!-0GQyRZ23}Sl7(xs&PI3y$PGMgpi!`^liOY79 zhZ&HUue5S!lHV1JzSx;TgyQFG6RXTERLj(G;# zo?BQ%XKBuWe8JZTEDSm*CDK81$UV%K5~*@-w^G1P}M! zN$$Ze9tdpWoWOm`${3`?HaO&-Mf_NG@rST%V(eP5vr* zc)4dyWOV`g>9?HT$t+K-5OfY0T4UT29rUj$78y)hvdiP_Vo4A7h21pt9L2Of;;q7B z&%yFUn?-|5_cLGExWZPLE1Lo+EMCQW?+!3LI>K^GKaC<3gr(?G6cZ~J(<&B+Dyodo z0!gTZS5yj9IYsxk1aeZQVxqdj*5o!tH8)}hORX`+n+O^3-XZ=y6DQ+563zW!+vmSx zoA*EMT|g~TqS7NFQJHp$d5O)$8k5WCQF?4m`pHXvP%YS|g@zvb+wiyTn8U-6-A3Vw zD@VGL8L`hDA4@|wea{6yvherUCsbotVzwbxmh>>*9qom>1$5j}i8QXNp>d(POYK2y z(3|)V#WhXq_QC;HeStbO=K1EXC>JK{N-k74KWb@kN_HM=>v@Vq#^W2BF zWsf3t3@0?DF5A&D*(g(5`eG&M5Z((6d#%uur&hgpc$-K}qGGY_r1G{2_WnpjMBMxb z2mR|Sw=?4ov=`X|MM+;j)NK-Lay21~n=9z}dF=~}*FV(#z&?shs#C=gV+1IQTgxaQ zUf)M!RWP80lqII8LzlmZ{z*RftLCTtF^s@uu3!W5jZOQZS*8+?avm_|mk9xam@5Ar zRYcI)Z#2PkUVpe02{DEbcYFWC-56LZ&dDBYAMQppdxM$O76>wBdiikom|Mn@p^vzX z5}E8X&IjL8tZ)*YE(#djvc3jSl4CgJt=6?z?22hrPIdldj2y*(-bJ{2L?0uGk$Uo{ zRg`BKzotgGsc2^ANKkwYo81Eh%Zj78*cCPZOo5&Ivp?TDVeHncQ2Pb`-}&~F!USo3@V)zAHKxD*%iRV} zSRajP=rOzwT`~IV>gMV~HS5lYOwNUol$lWTMb3<@hZZJvZG8_HPqxcOKb0c%5vy-8 zPslNzr7{lmmvtPT)9b!duNjY52OkOb{S_}9?EOxLsAm5krhzf~u~EczwYqBKaB?C} zW?^+>?Rmx4>gMM+em%QIyHZV8((vq{eZEwW(Jx6SdHdS^LW9YtI7ZzTT|7;W#w)ti zzwWd__UbP!GsCA^==M0_-?w5_1+zAx^LJ=`n@UYc?g%~USSh+t_Lbs^s7sE zg9$gGrgR4ok3PGu!MV0c4JNZN$D@>Sjw%JZ93qBi8njC3CubmMRb&@RWFH5~ zR>Byh6Of)N2RB)JGOqI!_y%`!yJUID+#n&=1gc{7Z&bk?05rr|r^|eK$7E`~BP>9l zJ0hx9?Rb)T9U@t=am5KjoP?f}GYP8WTmfGuk5Q1zn@c0KEAijilW9;$uf~U=kB2x4d%ore$aP-E??*gO&`L~4NHa#D%9^EItbTL? zYkrKOt|vV^nD4ESu1l(w%3jEi?6CYhnOV94UY#Fg{`er1^Z)Eoi#s_uJGncWi<_8P zTgY2@{}a^Il#e2$D#qx0Stsy^$448hJfbl877lr{WCosCA*(P$MCR6Etp=EV=D6a> zm$-+#n+CY@p?o{?y~oocW&j#|QdAo5}G* zu_|nnp>`P=nF$O`Wb)xV82n^*4TY=ArcgIO7sCNqxDsnEyOt8Y^THC2+beVSol3aG`U57+1sg+BUvmwMPc4~@ly1Bk-%SI|jcGfg!%e}1y!(w4Aa-&Y_V9OOp z9Z!Oe3j(E$ZrRkEE)blUN&gp(zshs9B`Qox*vaXqAoYb>!miH4fH7Ia60)dhqz+8g znGl4*-~DWc4g{8w*dqPZ`kKzL99VNmXeKeyhKP+Q$?rVqu%j-)aQ+zUyQOx>w#`|N zsRT4{uJc#i>C-X};rgBXrianZw59jCkNj>A-!BOY%GM>Pjq+JgkzVF^?T)wNC1&9} zWE#%rvwSVF_>Cj?xS=8!xI>4qBU(LX61_tE?8fvR3X6Dtg-W!DfFo6~bJr3+tGPo! zQ^C)OUc*clnA?u$c4FfwPWj)lO9kXC29?*aT0Gd4$tA9#sr-tq zt|M86=L?KjLAAHFSEyh8?h~*>^Nr(X!pj?oZE}irH>CnvV+EAVQt}DEnFw_qS8t;# zzq#4ZxV>GrXzC)qaYN=@?eWGXrP1S!=#YpW{>P8W-Z-~>iH|@){CM>)_ zbp%?tntcqIb8;28HnI7iNsYOh@=nA60zn=n_DI3v$YdH$MfxWCJ4O#Vqyk=;^6cOW z+0Qo6p$9{ssIk9tm{Nx3(~e;2Y=|~3bxCsV z>Sfp;hCo3#whjArlA*2qcT%8jMvWu>9oKRLY0&0C)Zdmg9nVh``y6EVBxHC)ig8Bx}U*z z-}@)`UbmBddLInhPy4alACp{ou0OI&k}?D;SKAx@@bVc2e*}Y<>ae_* z&M=gr>Loa8`LZL5=d!f#%KuPB62%2K-dJqdMu36!QJ6noxluRTKwsY^rmsJ30E@T5 z4wFIs6A5}@Z~p~R1^ywuUJ~JVyAJ=$t^L^-0c(>Lt#=;A606QI-9I5=P%-<+u{hrB zXY4P35`?anx``ZG8uZe*tTeZryB&3mTQfF)_GufF7wvxGbMn0!B=HrP_MDBq zCwLY@yKzjgiy1+PgW5b5EwmnFn_AO(<*hB^-PYnCMVT{FTo<*X(+R>7WB&F_?>XU6 z82qCet{or{lRT;OgSoij>%=-wMrZCaV&=1F%(y(P0aT+IE)ZFNl$F*bXbVHuRaGM& zq|)YnF}=qO3KKvGIsE;=hT|vpBvf+75kRVc|C=hKCw@(y>Czv11l{Nj?KH4Q8#NGQTg?{exUxKkvs)-(I7GypHHwYsAun{&+2&vE zq5UkpP|uB3mxiV-@2ijK^p}99wVr#YQS;kE{BBG<&+axnAJvRrPynCcZoHvR^YL%| z%D;WsFIL?vIG-+WNARJ0|Hg^D{Kwvd3Q-0E+?tPZetwV;l>e8W{&_T?zIyv~7P$ zxXMriQ01<#VYXfDZ~|1iS1kD(ftT*Rr`qqQa;cH4d#5kr@57X*)*HXyhhXPXm@n*lV552K+%VwUNj(tIxgZE56d1k*~ zP;(CmSI&JQbMa>%`6-kASxidPGcP{(Xq8_8q(&YM&3cyo-_3_Ee8um&W&PjP{GCi5 z))wyLj(yV~H*dOYpM+HWKbvNLHo^T|*`utnRhG4P;}4P*F6&{LxuL#!UAxDnO!hP4 z*y8DVFYj?8kC!8hXJE4lI}S1iXaXd)y20on0GfBDk{Nb@*>!4Eu?yQ zc~}h7b$1Lo0%L*Y0HR4* zLGgv>b71C*&t~ok-sxST`zO!Ri(4V_?H?*gS`qQh&sK<7!SQj-W|n{(3E3of(ZsFL z_`-`g@N>NnC#4S%fOz?h7`c?QI-yglha|C6reMvT3oIabrb4O=R3X1;pcm!V5Ofj_VjWV=$`;HQf%PsuE5VL~TZZ5~nZ@LCA9jFp!SQ{$4+B8C==exOFa&G` zB~)nz8CPj#=GI#aJ}~YVHa3sHu#jkW1Kfqjtk=9Dh%MY?+=e}wG2PK>ywaQQO>5j8 zfPI80pBIre?!;bRVQJo}{|G7rSWNd=j#)JBOecYeeCei-y|+slvmp6?ksomPMM_BHLTXx&H}ZV3 z?-ASbk%LbNd|r0!uf6lC;Scfcy%3DfejR&34;Bi23$G_d=eVmqrqm`K%^A(GqVxFU zLi4yl%laS-%nN?36^eD~EPwhq0|DQQj1t#8u=Y1P)O#Bm1zI929D%&;N`k7kWLp{ z`e69H9FoMKsgd|ZDA7Wx92I03WAP=Eho)^W;{YdSMcKv6Du8^2`wj|7b4Wl-2p3f+ z^&^GUDN{B0-0Hc(44fbtK6r}$uOy6F@<#$0v_K)BxIWD<`I|0>Ix8c$$bGmX`Dji94d~zrB4*5;0C5kCEP*g=f1Cuxd zshd0S=ikD}g`~8Yh#=&$me7=(rFf{U z%G!j^#ilqGaz-T@q>K>6&N~9RIkNI)rPQ0k=a>&yqNcc|e2*dt{ICYj%~AMayUSFb z1XJ_mj%*N;=II4P<~ZmDqvsmyPcMqx(D;P=W`*(T2ww~2z6}+31{Q!JeLj^4|7Fe- ze-Pf9{T_ind5H}Sh?<(7dHl+EP~-;5hhKPu4D-fPFN$A)Ux6eE7Gse-&^jao6vzM$ zoo3o685t6`%x_(v^imB)k1hya1-p~xDyz1)YUV04Zy7K!j{wCkwR3he?P;>LGbeQ2 zd2_^cuh3~8lqEc>J{&WS9ni0>Dn6BRo=~)9GMa~ua`!47_%ifiuJK&g~i#OwKF2oN4n64pH-z4wLZ$(puB#s7C-T)=>Do^Ed zp9eYPD{m3WhNwVi^8`026gQ2BDMcK(gLy@_PFWo(Leq!Hw~|utN=5^} z(`O&yx%Y8jd~kD@>HKr&zU>?kGx#UZecL|JJM4;`;*SWr2g^e_q{u8Vs<^fLqa)MX|NEUxin3r9VUY^#T}~t3 zR%)D(ZX={9$pSk7wmD=40)Z$%q=bq7Hva-t(K3wOfc~7!Gs;hUkV*#F#0KV0^Nw3onVcOlL%<^aIo%Y(Rm`(WewZ6ERiKd_+M7HpS}&Cy zY_xw!Hq>l$n6F&~_`Qq*{yDUzqmdok8(zQ>ZYyKj)P6W=w(56=0A|i#6$6vXa^V;^ z6|o*$gPBK+sJ^UXWhOYO3N3ti-BLHUCB^nfc?*e@RON6Vu7+M@ulwNwB?(da62f3H zm#PEqViub~V4Xw%*rJ9wo0MKO8WQ^|A8@ItG01jQ?Ti;ps@$xJ!W(2OYG5}nrh%;f z6DFXn*~|+*Z6VSK6UeRRfIT8v0UC(L8yp$FswB?+$&M5bPBYHSZlZ!B-N&yEx77;_ zw$pQW$X=3f#)iypN-p!}Y;R$*7e4qt+8dxuuPn63`5QiDAz{&>qhl z-+ZER=A+;T%_k$#L_FJ$Xj$XIp+evQ&q{ZO_tF7?wxS)OV4L+&cZdg{EjFz+`A^=o zdvw;ks&)<*TFudFbYiQMi_VH@c*}H3FP|@-2N9ONBF^4T=PO!2*RMa<=@&DvLLa`s zCJP{_)&9lsDKPq0vP!Apn_?TUdgc;(kFDXGWUH)tW&;)!Z?@W>&zA!WN;mhao_T}2 zMVj#|{(6GDC7RPK{-T4s#hSG+X${3w{7HXEJ{5EaO=Tax$S-c1UgPMBa#2yN@*j4| zH{WZV`O{3#2<5Macl=HK%cf*`xL&659AitDX>9~iHrrF&vpaL+1ng03uFdo-2BnBU zqc8Tr3P!L;vZGr|D%6-F8Kd8*{V7s_Ew;iC4zWq;4_C@8Xn>+wZX_qrm03}_wEq0T zFS4eB4x+^%>z4C`6vS#nVoGcwN*FeGRs&l~Y>7RI#V$R61iP>WT|ymV3TbdAjhY9Y zg$&6r^N9(Fb^EA^iOjC?`|_#M2Ae|#Egjh8U3)km%R&xhkx|Q{5HOlJAe__@m4`l5 zcIwX)9y+#R?)r~E74|~O$_2O#{K4a8b4UqXzo1f?7xp=RC8jVJp3+Ukfv(J>O+GpS z!uE(}fU2wpqEu#!Yj0gOs~-elp(;%a#*7z^7Bvg^h1U4-18DF2Gl|%J)zn3fM~cfv zxCtV9yFz=hb0-i1gX`@V>4hcEzd4myc#4B-_KOb zT8Wrd?MVd<$&m5l%oG`$pDhV1xlu!A&GjjneHUJZU=D&v(evWW2$&+fNeQeStz}Jl z30?BUV6YccCenzSUGVIudH%<4+AZzZpJUvSF-QwdP23AjRSx!sE30aHM)PeQCCwG3 z?Vk#dx#3!2tf+XTtza}4xiTYbWU!D8=rA?gi|bdE4vbX0i^0t`_27n@W?OFyHw%Eg zq8nq{nm)F+!7^5YO#MfnKgN9$p%^Ps8y;upOlhc9^y0<6z-u|C#<0rTtc{tos0aTz z1a5RvMQ)*tdeXQ_mP&X5pgCY4FIGs{T+e)^f`QF~J~E)n0qIR+qF09th()!t&8k;K zjb*M*wPUb5VMt$CY+BOduC20}ve!3TlcGcSB{)W*NwNeB{bEiOODv?tjhqUEuva0Q z!$dCi!77!IV>gRuVi87CL#eFM(M9Zr?_<(~bJtn~z(J){r_0P{|rgA_y_{Sgz*mav3E!l+hwRxih}4OLlu9tpFxRCj(c>CqF#g{L(a901m`>! zwv(b@Rr}Za5>{=LwB#C@tL(+Gga*YZN`uKG7UwOnS(L-Akz_bq=u4%mRaX^w`4t_o zMs{3zUSE)B&akO3wG&)w|gVdmp#CTYToBLnJU05U5B`X0IfYUxsW6sZxpMsbcJ=%o;>h+lN@q z6C(2GR)rOhy@((oP^nXQC?vloL<|kGBDyKNU{hrQm?%%@R?etpKo!{-psP8PxROw@ zlE!Y9gJAki%6WnZo?by*5g_kiCT<6ir&K5oxt^g@3c?m7FDGeGIussG%mKwT*+h^P z=ajZo*?}Q-$$Oa-ue=Kj=mC}4*>*(WB@^&H^$v6cW}N3&V4P=7W;l5+^50_P9S?U& zV_vF!rCl-JhwakP71Vt6U2~q!No_EF27(9VLKBU|@v643KE)_0-Hti+bcK1LI&b&| zE7d?h1`b}}kwt0nwlM=;BHQ_IOO6$6MQUO*$he0<5xjjk>)_8=E^6)%L1fj#utN%- zGv!Db7;mmjF%m_XfuO{=8dUjEQ|Pr|*$kjuTQ#!SNO7ihGj2F(zY|?It9=W6!K3!x zlh>rg)Az^;f~c2~b*SHn5~kTyYKf>)zl+W=jeQ`LuT(=K=X2`H1<|yPaARqIIyVw3 zjF>>7db+okaA0l`!4QQ3dpI)wu(_+);rM(-fzrAgQnzg5MxmBorKC|JE8)n4siKcW zVAqakZm>4&WvUQ9Mw*KS=;M|ZWQL`Aw09|C71v;0N$hy@5=R4eP)(V`(lW{hC1DLxcBEh=c5F3uolO`Abc zUioS^>Iet1fAo?J+5pbx>`>d}0l*lDKk#QHRG`phipDCpRRyWcRB6*lSOAUKP#-9D% zt6s4L`KS?aaWW!hTfv)5Q_|#XHoz0B*oH?RA>Z(hm*J0)!nhRn-xWIj2*P3s`lYyW zCBp<;;=>&%!_Q~LKBeUqrEC37fM{x5&lq-Q`a_*o)jxKD;kyI62#ph7E!&Gb=wyUd^cGzTF!=Jk@f39C5 zQ`!2W7wcu{K7sU`h=HK$E0{ocU~8uJ1#;nFBZb2u&LvFjS!|>XJQyFzGy`L!liVk? z@?OL*KLH1YeIixGi{Qx1A4?^=u$B!E_Q+pi;FEK9p57}l0}Or+2`$u5J4j6py5J=k z(V~7AArXf2LVD_Pr5r*XY-ekRJR~WOU{IOL7@BKv9?C5+8j%{4YjMrNRf_#WB&!d= zy|@1>A~>&D2XO$ptXM{f?^2Mu8*^ zMCPP6Z^qajqX%7_x-vtGk_J||i6NQ0p$$}H&BG(Z-1f;gw=}ik{1qg#4MdT^!Im6R6}g5C zKX$dIMafI%Q=j2CC9C+7K)aQ-;x{8jGx<{xvpfM?E>dqZ1?t#)i!fah2$7%Aa2(m0TGH^PocE$-0sX z23F~Q$%azT7@*Vhc_z1jK6+GN5&@yn4#FHx1*QchCiHyygu;R-rAmnav!=+%U&-Bx zZ7Fk^qGo(ZpRsF4F^&LiWXB7sn5JzPAL5;v^UgorR`C$Ts6_CX2e`VxOB+;T-u1n- zSU_*pQ^p{9Kz~EjYb>BXM=6xxn_x#_Qd0Ot#7(D>F(>W98dA_7xLcseOvYXGvO*{g zN|1)dbjdOO^MhSr(WX?KF}W}sVxSmX8yoiqm;QTEW=SMDjvx&!n^mG_+<E6b)^2mA~xYzu>6`5%!@eEL`Ma~UR-U$ zIDHD)w3GwY9*byOv%fTo!RchC^TlWR4?ZQ_;D(!w1e`nF>7=D)*v3kXLZq`n3sp{h z`naHVoyim(L~tDFoHJuh?Pr`Q$~ZI+EadFee5XCfAP$BiJvWNK3>OiRvC9Fw7M0IAwoCaq96~wXt+sXPF!RA}JXf`!YXUVg@tLIDka%P`D6R8vAmok0uQ^6NqL|CnaVEpwPuM zf+R>YeQJFJ;-|jr_4z9(qljiID~OC+*g-}5@rL*wu<{p+In+?udDG;$s=WTN3I(6$O>vSgX4E9>!Sz^WYl-5RL>!-q=+c8Z#{HGW zfW^6Iofb6;J3}2TzG718B2itZwi!pGQYo@IeBP0@$E>Fs9ZUFQ-kjl}#(Z!s0k^IC zctbx452uJGO)ijir#WDQ4vL=k+Bj5tY|1H-ZlfVSGPCrm!B*WeEiRB;l-xMZU6D{e z#&wzmwjJj!aA_x{|7&^CW^e+-LXWu=l=S_mr4+mUQ6Q0QjZeETdPt&)_GnKVvk3A{ zkZ}Sd5|&PC*}e1|I<;x$>tW?9%=Z-Y8hB-!jQH! zF9U%d#4OSnsa-ucRQXlQg=iORlk28kD)6A3$~j~+o4LnGk^TkIA4ex5qBdiACLq^x z1^oDl%9aSVz5?vWCJzVKN$R3?Da$F-V^#e+q<^RBT7p7dDM0__ByO+D3N_Gd&6x+^d^NfJM)yPL#fv|6c)^Jqd3Od{v%U!CSB)|3JiITQ%G)-NvLP@ zSC?vIjr8}Br~Nyj)j_3w{wfkl2!=1eC>wD=PcRw*bJRRF zG;|ZpdXm8YE$l;3R^F%KeG$zNheT_tumK4K8)Rvh2iV0nwjaECl!zV3cM>#(ghUc| z=Uz-9VyN5u?WGekt!IPuP-Vp|=FCzIm_pC4c(t%j-02b@{#2>h)=ZjRT2{V>OmmYC ze*k+c570!}_`^LQXT`(%^_%f6pab5mc@@`3ijlX?3nxB)W~*DABub`Jambj;=SbrX z`Kra9=?5s7_V3pu?#~I1Hb{9Ea-NZ{Cfk1BTI3$JXtL~Et5S*ZWXVNrsJIPnOG@8E z7Uq?sXjw^Hv|iT%kYdSl2TElcTBbt6#N|@Mb@fjO41xz5k_!U~YzODU%aT8q<1U2G zI;_l&rR7*pgQ$P0C7(D8lD|}pRWA%@oIV-U5#q(^mAcLPOpQZQwN+Zf;-r4+c5$pR zA{=&)-em9v+h&6+`y`jShff~v<12ailJjjdvlBG zZ|XD{A1C-PZ*Hi>BYrjlv-Y}n>#VKSEGgqzF7*hsBZm!lkBSi5WHl{-4i5sHAmQw_ z-4`1Vya<8^aBu~g5l^a}t;pNu!jiczyvgc$F8+MSse6Z>D&OextdQ-jn$FG5BOcy`LM zG)NV*S+-F5z$UeG!*dO(a|NP0sPiq#`j3TmF$EGbG@Y`PE|Znw=2z;zwykl@VmN63K)#xBQ40dMq&tqbYR6?b) z{^e<#$k8H#(f(*ZU}|8WeGeLz-~x++=CXvT-lm_M23i>*LJ&O`F~LTklg9T4^lm$I z$}qU{+L4{9-gLbMGm<1XeVa7GCG0N090`k7x;DQtln+=WkAZvr7y-m)h3K$8dLI07 z9p7aVIjG5g8f;+7*I3UczB4?0dVFdSLFu{#SM48xP@C1Y#t#CTpCq-N;{P#g6BFs? zCK*;DGmCc`M)mrQe-l>bAfdxPoz&YMG(DRB#D87t>Yy~IVjP8#mn~=)c6@*tu z{x4Nho8n3B0!%@NvCYQt%4En{Y0{BNe3pmRnf7>j1Q% zL#8UVQi?CORwA}-EdUzHv0i9cyEr=)fckyfUBvjIh1V__tI$|zjhsxTt2@_oBIHCl z!iD*7O?4qkD4rE>+!z{vV7Gomv>!b6c@HMHRSrbuMrQ?v@SNsgqDAI2M-@Twa&Esl z1jKd=cg*y5{JB5-iHniTw`&C!7x4Jj=Sk7LxMNp{aqB=xN{T(|A>jZL+j7(C>( zU#34z&mOst9!rE)8Xhghjkl6B_&?F-rk+%c@jJl!06hmn#~~bGdlv8lgUXLjBOS1I z&Q-|QnBW1}oLxfojjQJmZ?OfU({ql1>Z8+4QFW6^?jf8F_gNvg3a zy8VVNB;K@VT%K2cIqtikNlzo^@KPyC43tXFB|5CaH7Cg=ad>{&UmmKfFzGjEKd`cB z&_pu;HtzyHGo*YnSoUW5;0MjPM(57XPA%Bgf zkE4PmDy=89RDuB(p59S7vWBQ-%|9#Ts%0SHf%EJgv%{9y*3HL{5Y=WrnQZjwz#GTi zQ#o77iSi}|^5vpp>waYZG@*rhL%qZXdY@d3s6c?oVHW8^y1fFAiZO`T8pBpCDre6+ z4LX?`4t^VXkHmKB;0{JHp7F1>5*=^y-DeOH1|tlXvYek#;2Z9D(hzKfqn+_1RrpD1 zd*mo0rOEXxv45T`_TfDjWs}+fHcat(hMrtozNP6l827}cv@CwUt1F-x#ZFn2v#sg}AmM7RhqfgYtE1;8m4; zxrTP+?Xs8w@@6GOA`$cvRS1IHAwlMHE4^5a+fP)zbZZWy( zJZn+P4i+ZUV4`DY=H?bBo-d|BA5vVgb{Xh3vGItvmvy=hRq#DX8Jmp`a+Q#O>%at8 ziaz%Z6eRcwAnP25M5K-4P)-xCrX{{C5$x_nh7{b^V29#H_DDyknY49o25ijPWjZ{g z#57wPE5dCFFZ+CvQpSl~k#j^R9R+YtIx2+NB1;nvz83OrK#lF3)6F{kFd#2oxNXl1 zQcWz5J+zWqW(qBt9=@S=Ttl3%^&}l3E_bPZq;+;eEE**(1$}9Z?_tO=HVoxQq<~eW z<(VPrGn3+&0!z9~3Usq|Qcje$G#G(7+9)z6vvlMFuB@j|o{i;;jwr$gqR_GG9wafB7ZQ(QpSBT=D{)1p`H+EwkcM5RMb?GeIp+Yl9O_OnAL^zieQe>-=T(A_27(?u^q_wb$c(^7jY+}wH!@N7O zMkf2xHVcxS@t$ZH)dpUmH!7C15E&f3v$!lv?L=V6T^O~X?7!4Lv54_dNl&*xNDv}g zge?!{5DW7eO8voD*jm^XLTW&0E_}Z}%xBRtF+ppEL_H+g*^@#xVdMG;Yh5*&y=qr# zN8~veI?Rr9K@KIxo>(42J<5G7DzlstOZuxfL3gYd2O5EYaYO%lG|ZsM0)NpCfxGT| z+N{qaZsfDA(ZWJ=RqnE zpwFIY&gKt^9Ee4{#J!`}k;tu+B3Yqo$o?u6tYTH#Twc({h1teLLokMW21kGb*%lW| zi_zY?c&x)B63Fb=;|7IPIBag=CynhPaCUCwW6r5zE|LM1+U*s?+~qAad!^EAg+*zLm~;5ID481u z#AO@uMToIXh`yxtp>?DKy?nbIr`~BQ3#a>E3WT2MR3Xz!GgX1X0a4f>z3E`xGPj-<92{TyE znfUZ+l$p8XI?!qQgOURkIx7bu`!5swC3WIm3|vZ@ICJJqz6{j=3B3HID}AenXB(74 zj|@evBOK%MjEH+>m<70rVrc{|v?ZC9RbW;_epG(UkiV91F_abZEihgBSlBU?i;yyJCGR$rpmMCCYygJ^ zp&ZtRPRM(e!NTAu7x~t!%rsa#!(CX|vOUI3}LPGu(= z>?GwF+!4_qI^vjLV#qJbe>d34>=c82kDZE^t-kW8>@ETR z-(c*w;3xzgN%0tp3=xWgju#ytIx1kNLh(z(qV~)8845#32d`paL;-#c!E{6Ms|aU6 zF-DYN*f9JWju9i!8Hvs)bjB&84Q0GC7PxF)%9ihv07E%Q@f*rSEb~yTr(Bt8DAUk8 z9i18Sr-m{UJ2V@sI81)ZQ08F7Japz`jw9qZfaq6s&zgPsY(rUsLDd*pgI{&>-75Qm z!Or#WlL#@CqcLzXcB2x(UEoOIXc7ndVXqRa?1$E@65Ut^l3W}lYUhZ#p&Y3!GL)l~ zMZf}<)wihZM+Q5O{a9r`G1yPp&kXi+r3v^BM?%AQjqh5OoezQR0+n58uwN*T8|;_t zB18ENyI5tH80=Ez7=!%^ke&V73n=`5>^H!{qR2OKFOk76^TrJCyWX(DE?16G*>4T+ zE_Q_>e*yqvzr(!0N78U5#=-A)cD13DL1(=Wcpo&B>wrLcS9uzt&*avFi}IyZV7CBWVz;uL z2HS-we2`d@j#n%R<~^@xu-$AAT6p^qN@bvnVb~Z9 zD}^xjN0^QBgFv&qFCojmk=_!SVgf_j7~YiBrtQ09q0zYSo7K zVee_60R@&fuJut>U%0M3H%$LEQ!YCJi6{atPJ&jc686;EBvgZu; zH)uV3o}CS^Fg-A9=FB4u z?+69RaQ8>b>%{6 zK%l0srV1M7tA>x38u+Mf2-GxV$m*u*N(@n(YntjRtKdtT0DqGqs;;)aw#9F-f3i0W z_9i<2Vs9DjZT61J-Zj{J?0tiMz}^SicT6QD`w*)#s+wz{Jbw#bz6j!Jbt6P`pcHUO zt*vZssBKslFqF3teO_T7L8oWW2VvOoPV!DRd?!M%@B2uu)Axe40xVm_c^rd%tUT^M zw!SI8FZp6lryAQ!KtUmR7N|R-ruokvfn-u4McPdQcCb|iG)q)R|1zd{ayAEQt!-J z0n{?&U>jiWw>pu?#K9c$k_gDhra#Qr?ERr&jFWaKmJ{dXxM#c&}hnR=?mk)`K<#e_O9V80Mu+ z0AN|yAuR%7#+(3E27o1P1Q`gYT3|;rFH*^CW z`ET;`d?$5(%YL%}z4Zb^AA(aantcF;=%9>ox30+i@Y{`O!b ziV{wko8_%S%RmTnnK}Il6NZ>CSOMPhDQ(k`d4@g$8#V`zocP0WQ^-ZuWaAS^NP_vN zk!La#0>|$)W_oZDR`#JQ2vSBMs?0tF<@nWyy+Q0Mc8M(VcfbJ0aJ=&EQR0e+KaH3I zjcufaksI4z%MATc1i%=c#y;-vV%(5K)h8LOQ=e?;W%?9VFE{k5`ZQIaj=xa6=bkH( zM9nbtnL0oiV0M^32Lw(1a6_pD)mNXZ&jVif${E*4WZHq89Rr$`)^U!(wl|o90>xNzDPd`w8?=_kQw^X zTm=Ck#;(|5ekKa4e24%}i}gxFUxM^3>1{H+jo|22AO-5x;CMrzHv10oO*HfxFNoY9 z$k!R(?Z_*I_p>zVlc>LDB@e zLO{{ETE}&OOx2fzFs#>FL~>THa@OYs2rl~EpH687~YL2dn-+iDCR1M9X4~W!G5jR8{RH2zv3{0=bW>ZAbt%}6GUYg<_*08 zN3#)Ur_xl}vK-Gy*(sZXsZK+0(pTXrzP!7d4ZRt&2XJ6o^fju!*3ggP#!P*kp|58j z8Ttl3-UA$gf)p0UxJ6jbR`@k0NT^5mJsgI9EVke{)Xp}co-<+K4Q40~9FGKLfYVFR zG*`tyR8mVL);1vLxYY1&Tjt0N_q$On->IkE!tpM+z6;5FD$3AXk*sHnAQ|^-4k&#b zhGTYup)6DmF}$aGPe*Ui(A%)&BbPVURkv2H4m3A52U;8PmcXjUdeopmbdASATuqbC z&h+*GKVMKb^pGA_b)XyV-m_J`!_Yf%tRjf%8`0UMLz*s}>A&*+S|YO<b(y7N%FsKHSg~deUIW>v(a?jB<{t{z%wwcy9wD#5U+XFk?~g3T;{d zJV)`D&j8-A1(n#dyw@1sXTedb(6qZp-i!B^4EEFoqUu(|dn+0MK7)C#m+IRjGC5b{ zN((kfMceVr5YC*DeTX<9O*`A~xF}~UlaBi6nvI6{Uhkg`z1JI4^%Jp0Cn27kX6Pp) zz)nG_`g=fa^;6M%8hE{rA*FsCohQ(F1}Vkq+!8O8cK_nV)-|6MnHtAbu1~M2Y_3IB zJK(RYU0LIwoL3E*%*k{Q^wZJfT(Yc_j6*?id7vjSW?b#z_z6&0kS-y?iTW0^k79TZ zHw+EsaI_1(;eFH4&j6;RpNZsdUjK8g&*v|2(w$`}^-6=GpN(_l`^qt@ehxzW2ZsEa z{JG)nLFMXPgyIGv;FyBH$Kut%SCFTQg_A&UEX0ke!1e9p41W9Uw&+Z^vt`|HTRegC zbG~foKg8;Pgrs}|Pz3!v^!^yf_b2%EQ;evwbp~BPZY|2l68Q!nG-x$j6%EhXFfuUdMI}`X6-^$*K$0S?vP^{S+ z6PHhT5V0iS&eCi{SqhWTyBG^E?h0;ewa~s*?5{WUUmyzq5;6KB?Cizft5p3GL%&r2 zl|)WVHy)>33Tad-9`{2DLUifM+HgO)!oLL~QgBbRIT>O9mZS4Z(#L$1EUj{_4vLR60x@vV}OHDu`!x|b}msD1*4AfNy zmbcafsw$gm0*3cn1li^KZw>v5Jf>FxBr6pMH;DSK`-IUXXJ;eBr?&3P)mYgzLTmpmbKwq)wdh^)%rDfTRLcVwtUXz z_AF|Y*02rzS{+2oJH2-q`t=}M>Nj9(|G4PAhp1ejTxhV%*qMfYBT~(qxD3@lQJI6p<7PwOq2FTohVn%rQCh3D38^(H zR#f#{^=njpr=j!30N(~&(l`#;*KUw9fvtfHoJ%5${aGN%HwXQd0e@d{pv6yvBJ$Zf zF8PM)N-rOc06+&F|uGjXayB*B{! z_*zG+wIyDp%n1e}hZ#`D>j`$4n9BYJlE$MVAv2Z~G2&Aqb9h8vddJiCK?$c}wp`MI zS#m=`M8M=Zv;tG-1iBJ$#YJIvuX6$=Qih4Mr!=O`4$G4ii9&W#K`1yRZNh~~>~E`- zY<-p|$qEBy1CwT?aYb?jaEmNFK0}1zNwx+7CtNUa`wi~{`W{u^Yv{Kjx7p|2VXp`| za*yFNk^SFp=zrAj04kTg9>))eG>KcJ@R}3EXhXkKzQxe*!u9gA^t%oH9xVM{bpGVM zDpRLLVH$Tsr-SU{8HWC6eZS$G;+tyt#`_Ked_J(l5xAM+Rf#P89}YZV^Y1hC`+YO{ zDz!-Fcdk9jFg=Q8j=-!cG_GaamvgExd~>`$bR6pNPorQertD{=u#KRB3vlxiA{$bxWzsZK>+Y~ zWk3$%j}%Ogay=tWn3KHe7Ca)L(j-%n4j79}O+OwLk`$Jo+4l;=I}$~br_gyCg}rAC zeJ*;QRX{|04!{0}Z25WUo39B+Z?AHjp}&9z&lmN-8@@VUy+jT!FZa8SCitx*0enC#KGyLVS7!CA@|~tfAP24Qdr-fOgKsnF-w)(cD;9hmy6wrO_X#TvOB3 zSliIzSM}En{dE)v|A}TknV&Avor4Cb;trjhUY0Sp;hqui81Gm^e?x!M@P(1;g>eaP zfOgEocKplG-$HquuLQV&G%GgklS&;=QAk6p!v~@nV^=(6c2W43atuCtrHGnYh>hBr81a@E)8bvHIHbbiy2id~h zfCZ?>zqy2xyHzmrKnPX|lqTuhf~zLZ_+aq+hW-I>$uz+837{{0sDA{$#fHw;_7#L2 zOey>c)CBOI4QT5ph-~v(`Y|{(G&a;^GCX8A9Oe?4>n^RO8FaKt{*;@)Hqa=xmiX&x z*3{Jbn`He#}x0_*Y;IG2|QNn+8rl z8z_WP2=v{(Su_1CZ7x9YQW(6nvM%1yfr@7#PNC`cM8tVGG$Vuu4dFqqfWq_~oG#{| zkvX@(x3AB@i&I)UBgx97^}f#3JhuSZ z#{)9DyRFx{&&fHjig&I+FRg>6hJ9O+czDHUtJx#7XU?iRYx{k%byuBh7qCP^gSt&T z=Yp~We56MO(OTSxlkX9cDcNTM7iOHlupeXLI~v4Q=IQe&8MmQ}%o{QW$9b&?Uth9r zG%P90SEVMdBjS$%Egs;iW0A*QO3o`oqxy=2!2(q$zRAREdU9L3AvY**e-wNz)q49T z{Y(uW?;l)4Gv91gTAJ}X^l|;BLvRnac_rD*1tvPbA#Mfu=HNXTXo_uY$Md-v1D3uF zy-4uB2KRVxDjT3HdD?d%$eY=TA(`iB@g)dub5djGwiLff22X?6!ibuidxH3!=3%!hr3=Z(M%7J|w8 zc)~vLmE;6*Tgvi^v9&7c6=Re3%^%#;5&33yGV`~m>ZM5z?D;AfKtwtVL8QuaieS%*^o^MF8GQ23No$tcn zH-U2cSBa0*3DP^Ij|UU-T{*}>83ctP9)X-~-z7@+#V9p?os_tyciO;Bb-!+0h?ih) za?3#dU$lmY^*i`Ad1d(-Cf-xG8aD<?6Zda;2C)o-M*{*x|5HwflI1sl-h& z#4BQJtXuN(XBdKaHaSO5AmF_II+}m-eb-~@e&h+S9a}TINze?mh1$qBJy%%iSA;0* z=O$Tq6V`CLGq?f4#AEC!Y+ab>UJlN>__{w9U&^o7OyRv^;^`uLgJaU>6iN48#r&FC zZpR$lJsBBKD5YQOi1W)Q%Caw?$d|8{AFD3TjlrFuKs3b_hk{WeBVU2YxWe66jI%^T zTcnq}ae-=n9v}@8YiJo4OvlD$Wgs-UBab;Bde@A6MdCS2Pl{@3BLH+4`K=VO{W-d1Y%=*7I8#!niHR zWw1l6)wHdHg*~yZcsSCYzLCwJ zb1g~E?UC$QNBJvG67eprtP9le2N1HRAa>W{N|X5c zz$9)Dt?h{6h4w+b93%`vM`g6TGuVJkJ`&*G_#h-n%bXTQp3cfrAf&4i=kp#g}g}3KzsIp%P<~RKI_a$Q4BTe_Cns;OI7t!-d~Trw*ibg95-%=Mfv{*{YH5pp2KR z<_>hxMm}c2kuV$w1Q72BRK7Ye4ogg>ul2Hj6@ zXS8nXfim#4X8S)9i1Z!pX+y;jF%i=Nqbw?7b_7Gc_GW2eSRWZl)^v5JdK(jIVMW|U zI83}cp8crR%KwqbWzH@BdO$Uh0dre7K3kV`ud-CQ$$+%?1Ib~nzJ$nU|HHX-OgM-o7i7D(A?_pq8uS* zb0x~Ubp3??>4o(HWHF)Y>)|+FJeKSX;_AxC%r`<@G2{AH>crjoZYeYK$W?e?TT|x6 z%6(1I{%<%d6%;A^d>|Lb4;e_R{{qLQRNDTDbDBcf{)dHI<@;V%jhBDl;AYK~e+Jxs^^gGJB72P34sF{F@j)uUb z^`=iXzujIUHy`lRO9Nw?^A^+pkKU}}RT7Go_EqK$HBntHG#@ z*;He+Xu^suUD@N6be?R%{l)=&J|Op^j@+9g9fI35;20e6HJ1plhCGMjT$aI{t>H<* zHFCmTTmz>iKdZ%ebXfCQ$Q3+Q#(pgE5?5(Q-*LlS&m*~NDY66xv7iNNHnhh$2U`9gEec6nE#AbOH`hq#^$BZlRJ7MIwvNeI zl7Sonb8`{dqaCR=uxBzhQrMO z^z~*Uo^MqxzdD9pj>PzxU=Gt#N5#x#6ez`u{Q}NwF=NZB`eU2p%knLCxmd*LzGLlO zKhd79nDw$jI-oAtX6D%;mvtlvqy_Pc4BscbEDyI{KQP(Nv$)05Z_}XoXFtao2kF&* zPDUb;@5Hp4%V_hxTQZTOPqe+-6kCKEV@=p1ad;*D=FEh=$+8}yDda%rch6g3*ON$m zM36+*=3QpVFHhzXCTnv#WM z0u;k7rnstGJOYGI;-Gh1=-eB-_$IQT*ilnoTUS>b zXsw+!zd<5BWlILrjuo}FD^`40t87SorX7e>gAZgv2Y{{d(0m&L^5++Cz-;b8`@9-P z?2q^6iUav?jvpe%IlVj27vk40^JmIXM-x{~>+wXSBLYefCkjZ6YuhW^lHy&fAg+vs z;@!Pjd#5alQky4;tG8pzs{13a$j$_+j_3Tu{n86|0m!<&XAY$gu{zigkF{*G-?>}y z->jXu%#ayxgcRq7Tc#h|E382U)(#226`$YKWAE8r3co$r#8kk!!7!~TmX`Hx0iE~X zbc8SYpcI#DE?oZK111~AQ4dMKiosvWa2_7yPtBww2fGNoKCi5`;J-G?uCX8g%zmB4 zo9vF_q}lLau1)vdboX8&mR=RN9*B!>4fZCjmswm-wxH&MTWj&WZ8QROEd6duep6+h z5vdhQLf^#<(y9T1UmMOuz9{BwaUGG?MX@_+MW={M?AGZM3&}=w$GbUu$$sf1_w}y6 z9s}W2B3-BRl8LJ@CAm4lHzZU~sfHg++`k6g$8IvLsvwzp?4%g?0iXcXYh_2KGqAY2 zK5Ls;pC<7%tt;mEneh&V>&;$~CFhxn(mo@RRpWqU96zz253`caNJsL{k4u9kl>5Ae z^@w~=%C$e3*WBC_i#adCEgaCS+1LBYQ`V4!$qe~QBFR^g&1AHEt$ZDPUrz|}$Txuh zM)@ZA9*xI);I~xXA>U%hOP52MTjiZR?JjvYPq#0qLXZY_K_{0MD|4n}0$@c=3`=b1J$Nv)eUv~BH zAK-t*<$o3YugS0T?|;f~@ZUFG?RX3R-UfK!_dC|_yRLS>2Y>Hd?fk&{{m@GHk^C|L z{Y3th|9&Qa&VRpclki;xr~LoG*S8sd55AV*8jmyZ;RO7~w-flU zV*PrpU!V1>Lcj5sT7HeU_Y8bXf%|pQetc1Z{}x#OAy&RZ%RkimEfW32hZgv6iIr}c z-l{nM;`)A_H0*E@0l3^6|VXoFMVEclykwev86cle3}|2^E5ZZ7=I zv%=?F^&VmQ7g*&lw0@6N7V+Pstly)p^ouRHRa*Wf)^C+nPPO%0V}&oZ{L9jKuPleZ zS}S}7Pd8dwnV!dUIT;z#GZ@z^4zRisf);Kc=5=0#TK66nkj(WfEXiJGsd(_KZCSVi&c3q?^L9nuv**goi1Q3E)|3lwlm z=6Vrlrtc!dro!I|yUFkczEU6feQQg7Q^gP9PN_27J8cgcu|Sm;P-%fCEnvkX_mEKw z^io~9ovoAQ#yzBT7a6_4C?R8t#{zd6w~LHlK+$)Q0={)}sS&^+t(5L3hn8yliNBPV zLqh*9a_|CHs+Fpc&JXDrq&s-+c2c;2ZYK;K?*dw?-UOJjm|R1yClmPZ&EydNyNis0 zu|rU_kx>A^mBcI65nZY$MN%U4Yzh)RGgF2#5fTG?8`6Mr9MxNsug8qVQ#qKLDC^DKW?a#6pQH-SD*szBU7MqBt~4 zLP>J`-lwFHknpb_ARQi<4ZD;r5GF&3Hz`};OCd$%T4fs$7%#x#Vx?C(5r%j%IY~JQ zN>P=Qt$8C_a*ETEQxHj%?+|<%P5zfDIGZ)!hR)cIbViL0(isCVBa|m5|AS zb;=G>2E#I?p?tcRk5X|t51a~t)9xaZc9KJtMcauFGLF5J6qfHJlh!G_$#e+E5~tpK z(*kAcy`{>X&;zCy+4z6@xez@l@JERB0<2B5fl>rIX2I>3gJ7Iu!=* z3>duA$TI147{Iegy>vENC!I@9kbcMqrX0XBnT%CV19?Oy%V36_4#344Yn3yARwEhd zu;%T_)_mdVl`|ogp`4|h4S8_t{Q_EtU|G0_R9s4m_K_Lu%EwHbUJ8AhdD9Lui*g_! z494ssvjgkA(*o;!(*x_&QY9emA&1>X=A@@6r)knJiBGzS43jS9O`Ri(SH90#2Y#J{ zLK6S_0kBUG|2mhCIez^R$6Wal(i%v$9VqsB%8#waCLy%~zeQ8`lEWpkXa|`)b{Cm< z)VS*%sEQ^4@sO?|h0=8nv>+2Nn((imAb*3NGv%ky7!N6g3VsG(vI8xiO8L3N1@W#IeI5qT(0dTl^DJRovL!+DAnlHpx49G?j}ojl4a;$j!rE)D=^JUEV&N9>d|Q^ z_wFQ(_|=4^t}5R_ns<@_ez#!gYW!ML?%7G!mJcJx>?G^4qzxE#Y=6kCaIFl2OtFWSsOU znJPU&W=hWi*1bR$NNknekjk{^3Ukn=sI7cvg^iJoV&5&sy?@XFd7GbDZSyoFJ*5cFFKW zq$1BIX_Ti+8t3VjCU|t}cd&rM3AxFW_Pf*&~MSi+KEmilDpGo8rG7-OiE`eBaK1dzDQjnf6SfEWWrKKQ5 zU$}Prx6f`T?Lgbg%Zq;@MlVO^9xDXyohXwp#2$I3V)!pTmy?MDrROp-44;fZpd1KG z%1gaChSQ5Lg0>(yrx#z$zao$}iDVUiicjLCRVyz(36tDPBKKLINcnUevgy0YB?yX3 z_mE%hB)`Ube!YwQA8aJ5yerDfWqCLG z9is9s^80dm7r7EXuG&tngE1-f?Iu^3`tGzpvA;#+G?Xk=NOkR{q^(pfzK)BQss#o3 z;(!n#sIOqi^;XOc*6$yz-y5ypo2=iPt=}E^3lN0QTSO25wfI&s?mJ;HDUS87wWah< zK)c;H6Ip7Pz6YYjA)c?~VtF{(&VT(NQ*x#WwCEgg_y50$`rR+pd;TIddmfb5cpj5B zcpjHd@H`>4d!CkhJ3+|<(j%VtrRO{!NUwW7l-~1vEPd|zMEbYqQ|TMe=N`%Pg-7*#=_&Jk<(cmJ#xu|J zAI~u|@th!gJ*KRBHp$epS=Kx!$;@-MYCo6;-*CwB8XL>|ZziF7l_{IZV$=18+8Tk;un`7<~d6C5Olq*(8U{?PReW zAJ;YrrryM{oCSlMbuLnR*C8s)oyv_pTC~|>v1B(3)AVtUv zS%Cb5a-)SWZo}2yEIWj}HP@tJX$m*N-_4*g3Qgf2NUx)|2b{F9eA)=#2)dg*yq%QE zbJ=hY^0P~NufI0zHXZd8{TBneq@~LFB zd>T1KKAlXH&m=Rzf4F=OZ&5R(D>*Dx*1Y<|;eo>$u`I zSJ}l?Z2Z~{VLtw~2fiq@V6SqU)t_!C6|t)v#KONKay(sY}SZ9pveC3%vKh4+K23 zmpqFT=()Nb*r8(#MOJ zcxFM4zhB}hmlk-X1-^acC5V2x-b&VB{qlzWV}ZBSTl~si@~Ve`j6!8z02wl^)aUc= zA+K#GAh+x#ucIvJ$H2YhpB}P@yiw}&?j>(}$X@a<8D{RcFKj2HQEuEtN{ZC6mlFns zzjX=mm8y46+e_Y-AmKX_5t8M*SXwWBy(dAR-bZ0%FZlq!Kiow=nyaDrWAsj5z@`q@ z_K?}7OjI;nDNigmHLXm+)MuL!Imo6LMY=BQi|UY_0?YTHTHhCUEBkG_gaklDn9C} zJ?c~K_VF>FX8ZVvPq%%1ys@3=EmiqwgBW*jseb3xWcqf}gf-qNs{K##w~{T+sg^jm zz_=P(VBEQ&pwtKAFmz7hWXro?NU0YCyn7|d3b>|VJ84$tdWU;CT*plv4x>JsI{;hJ zgtNRzWki1_Wn!__9}6W55hV-nET6hZ0-1f;^!*^ePv_suOO^e^0QsH!YHx;lHj->0 zXe~Y-L`nR;n!FDR_IBxV>2>K%5Ize$wVpbdmUW(0_)E_9w16{E26t{HbTD{F$dk{?fBnDg1v} zdk?^fzf|KfhJ=^4lpbQ$zetHOvpF5&k%($JHo* zQO)A7tF`#2YHj|rnx`+Al1RH%f(iNl{-5r67tEYLuHRp*>%K| zAEmMYzde~FC8D8vlvHSqaHO94nEE($ez(o-G(nkdO3szK>JwrwjWD5(Dt3!G;X^I; zNy;gN6{ae7j8!QLbR&V)>c!L43k%}oFzhz|NVcIq|B{BmX_j_iuXE10W5 z6}9Po_jc5kFJ`Hv{oads8T5OZr<{35WvTRbp_Vw3tyRfNLI`StLd+H>Rm_s;cY@v z;V%%ogo|kOOlH#PnJijpCy5(h&($X!SSI)A96j#aWmLgZAIi-k_RF~KaKPBC_iaNDKZW{^t1uh}iDMWD} zF8lM!ELRe$u4NcW-_EUMc_pM2(a-+$vtISjQ|M>?>Ypv?XM^gWb?IkA`7;!Ag$zw{ zd5vWHYP0k8XiB5sA0Bl8eCi+s)FKR0N71B?#&C5E#;Rj6OFa|ktK+ajoq$#9L~K>3 z;C6K?cBnJ3Tb+gd>TDcR=i_D4|6ZfT_^x^mK2Xoa$LcbCrk;l{Nw@ok7S!+R3g%HS zWI=T$%T_O9_0)@53-uC~udZU9)YYtudMP_yUBiZ}>m(8_AOtvsw(3jj%Ou=w#ZdJX zK}1l5J?g7c1RIV!)z>JeVk~Y|UzbaL7B;DG5VGkwpP+qH5EiVUrTZ3@xdcKb5s-2c z0TE#R)wjjgNDXQK9ray%!JbNGV!^JL`$NSK(~4_EYu6XI?M-^*g29PnA}O-0j->m= z#kO>>a@LsSd6KzYAwA@m!(ZEEO|sQ;L~K))*iPAztyT%;ad9jmOjWi(M-SBs)^t>? zf;FRm&GU~4i=UP+mhxWed~U;LK-Fo$X%JCYj`vY3t$z2k~(lTfq+sA3B&Nf*KTiR`2 z&RUj`P-2zFYLsT&fmf?ic1cpTnhzx`TwF$Pe|L=SG*DltC&x%q2}SSs9I!MM`=|E+ zo~c$1r+NBBI~+_5rjI zCBMs?QkmETYe?N_T|%Q&&e|M>y4S*kwn;n~OzN^}m9=xqSP>yoBN9Q|7ZKSj&aak{ z)oe9iipaFYs9mDQiKD0!OO&$?f}sXTn`0ft&w{aB)SX?3MUCBC?pgytQQ;PEy zyQK4o*da6@lV8CK>3w>&m2Js3*{S7_z5*ueBL8-!zvb|lteZW4RVM46sAN4x$#2Q8 z68SE68t5e)Rj9|Zc5nH&kNn#=*;2n`OM7WpJJaO%B!T!vd_;OyPkSORM*$yqiix)@l7ylcp|ud;6cRRq>gVbgl)DQ zaYy1L-bx5Qi=n(CYd@ z{ZU#EdM8N(da6IkZZxH}@pD=?nEHzVS3s!0(~af!?r{^#j96DBpsfiOJH{_?womZ^WxXjzU*9c(hI%N@1qdGm<6+Qrbc zOH!zw{x{xAe>yWDy!OP~thzbLWV9<%nqnstPz@Tho9IDhT$1H@Sot)pd|A$hrWpyf z>rx1$&*`M^B#~IO%k6e&+g9rA7>)Mn#rcQXuv~SU%@fPn@ccA)3+*Q8+GfJottq|^ z+0MtZZSjY4nj%f2I$^k~(QKyypxXePPM9FtaL3}gc|^g^Nbl9oln=R`54oKWxi!PK zy}C7*bgHQNA-64YwWBiO4|JsvwS-a=q09)u6R77Ssk?D$#L{WMk=7`A)W8&dxl@#wql@X!RS}MkO0xNCJ5ztyZ?4Th1nA>m<%k z%+{-WTSx;8Z8ubH4|247X>si*qHq8mwF)8#l{ihi5974^iIzTy1zHtWY7gU5?FiA( zM;*G@5vOP#qPd3Xr!!VpI%9REGgenxVX_t3PsGoccyP<#;LTGsJ;$kI&!$Xgo&#c@17e;QQgi78ZbT&z>C+kh{{zHJ z1jH)@#B2WuL_{-{|b3!E=#B%H9lF(p(U$q%GuFzEMt?7 zqV^#+c}z^?53(r?6>Mrbn-)`5g%J&nlaTK!iXTZxE^i=#))4y*?PO|!TUTf!+Sf!( zzae7!EgEURBBuR@4%+W2G^*ptL|xqYWrJ2ufQgQtBALs~ayGpvVcTdMCM**zn;}Td zOohg376BzBsljD`z9u}G;#Gpg=b;%|IwW2)OI-uk4dm%=G}C=(se2IDy=X=Gwt5g9 z^$vRTv|DiH%6Cg6f` z+t8^NG0BNkYSQn3DF;u_f~wbsN3RRNUIzg^7a_f#!+`=R94PEyLRi|Dhy!VP&W_qM z@JiM2ndA%;y|QMx*&#N&#w?#zM1tQO`Zu=}?j5)+end#Ng(b+MO7lt)FxlBs!ejHR z=)uAgbfE_eNE31l^rppg7s>|uiw2m<7I9{A8AXsSMr&#Ds2ylohIU1f{fVTa88+ED zCObDNLMEz;cREs>xjiNU4koRD#`_O6y+ja zf@@@Y9S+FUps9UKK0jBcOYo>nAH$O}wYKvnpf=4zD;Rofc=dLO=J$67buTbpN+1NSkA5;Yj^UNw`l)F@ISmg`qgV`WuOAUE#b`UE$=4!Z=_cirSb@aKkcITt1ehy8<0$RTdX(AS( zi@q4$^(E-1FU1^vIp*stuuQ)g7w8vaxxNy&>8l;S<|U%o*p}Iol7CA_@}F-%RY=rr zp*4~6eje6p;#dVIQFepW0R;WJJp=t}rZu-F#5;n%<0D*aE(c!emNc5^*=jdSrK@1) zTa&UMXC0LS^;ssnpd1^C0^7Uuc0nauet@kIW&7C*u?NB~6mv!@fiToWOHr5*>On%z zY_-a_(mGloDwPYn;YG=bxHvfxjwL5zvP-BfX~Bq`Td10BmHb(XCMH{LXR}RqshuTS zu*QDhWwN!jO2sew`h-ID{}GllG!mVv5`U^uQzMy3mAI+dxao-ztU^N-N;sd8ILcNf z2m}e1pK|L2R17hfOPCXdEwx1GQkPc`-$AxsY@gY7RgD_jP>QQ^Nb{zquc%;G(s+nk z`|0OZ^s^Lq#+cKSs|oTfO&Vgal7`qTtgd9Ba<U36;=MW?>80dtk9t07y5`bN$X^mG#oKWMwyt+ zTdIq;h@x<|o`QE$%c*80+r>obk|Eq`O;_a49u%lSvlK5%cGL* zEY#@lox<0`WOtRbT|^w|19ubu78)es zAwI*G>@tzEII&Zaw!!bpaOEat3(8bQ%~9)7I#InrEk&6&UR$c2Pw7{>M;G!lNopjg zL2svbl4)=KuzrN?*B{k?)BjA07W_hNrDxYc(>GC#8xht?Zq;uh(PA@l^(|V2xayA@V0(GKG3W1nf@%k)E~mv`os8Me+0kl zM_CK~Sr*s-!}9efSsVQ+)=qz#b=Qxx{`xa)pnig#uD`%W>#wqj`fF^e{x(~xzsD}p z-)FbzAF>_#N9~5DX*n}#yjX=^1=Goe4PFbpR0e*7wSLobMzni#RlhV43%#* zH2#2L@Fxuyf7J-^w~Qcv*9h@Xj0peAi1HteEdHBOhyQ70D{&)7X=CIn?TtL8(5R>M zG#V+xjV8(pqnWb7Xs+C3B$O>i3uT+pQn}ZNDF=+!%6&#>QZB@y4E;Ty}_8I zmKx*Kn~m}6ZexPF*O;PK7*o~zjOpq##tii(W2XA9F-!f_I7|K6Sg8JCEYcbqOSD2` zsW!w|rj0i)(3Tn(Yv&s)wB^Qy+Lgvi?HXg1w#`_h-D#}V_86CI`;7J4!^TzGb;G-^dZJBeS~qh zex`AcKF!#p&oTDuON@KrvGLMfh5a3-b!Q1W+^)ti#zZY&w4!XYeG_#4 z6`rul_@6kWwG!{C4U$jQo0BB<9qrq)(|_b{KPwG-dahhU-BUh6=b>j=!zI%)+}b|$84owQS+(<+Hmt}`@) zv>C0CglJ8F6qB@5wJySRVl+?cu|{*PE49by%|==`DRvu11FbuiDK&)c9**|2!Ztj9 zY*Frt)UB9&tE|!~GugqoQywI zDaK@-r0@T{8ovKSh1p;dW@9cpY->yd5uu@b4I$$VM2$Dm#CRL6jCat@_yE0)k1)dc z1e1)8m_zqVYKcmd}1^+Srz(+1P_N;jbYCW}H(sJ>!Jv|}3 zto4@KQ*Yd%^-16H(E4iqY@3JJ@o-bxsg`JY5mo@Qfcd?4N&fq8g?h`G|CCD$mZHWMH|NYjLx5T_?C?Y6!&)HfjAR-|#X zMm()UIWSxes8fxoQ;m`5YKjJ~7HH;biFU+2ljeaCYH3B5|2Wz^9cr%?izQNHx-Za@;$&)08aE+9TqjY+_vqXw*G~-7R^Z_~(PUJ&( zwSwE#20m9i!if%q=p7MvokED-nGn4Py19DdG*>SayZYh`S3it(^~Yq_0L*j^#3I)q zT;wXoYS&O)<{E}8U1wmEYXoj`jm9mmF(`A5!=0`PxZ5=m_qZlupKCJ8UDI&LH60JS zX5onIEIjF&hvTj}c$U8ZU)Mss=30#3TuYehTE-051uV<8oYi%$VD()WvBs{|EaAGG zwRUY_on2S3zOJiSk?U$U%ykVr({&x2>bjoIaNWq}xJuY!S1G&LwMF9fE`)Ig#%QNY zkC(9+t__oZGm|k`8%|{&%tSx!45BSwq9TSiLfua9Jqu_fwNaD{;xTPB)iCfIyxJJ) z%-0w7w6R(pxLE=tv@@mSUTX}~#%bfFSIs4kSIs5X+L5^;d5TwO%e4ta0u-u!o;Fc1 zGx*pNZIU?OkvyeswX02b+MPl)DRuo#)u!3(=vC^0F3xR-eV=rVY$}eM>|=34P3ny2 zo9q)?;cXbBC!f-j3iesC$bW9KFUr}M73{07WjNPlU)wLXAieFIa`tUG`;OlFUbLkN zr&-}T_5;cF;>;WR{%vc`MfizI_M;Th+ZD(1#ar2$+D>}FQYv1v&a>rmz?z$PDml1^1k%NHS+(EJvt zuI)trZX@z{2eMo{iS*rxgzGLs?_Gr6cVoEg9*lGCCDgtbb6muyNzFUoRe=qzLxj@z zqtx{vwz&=yNu19fz*5G}v$5G|_58iS;g>PL?<9F9H%;kDcqTB#NmT|<+rpryK zO~}z^Xr}b$aCTCdTcQIa`AXAf%AFL0ac!0~28QsnHrqMgt<$qI-i#*wENza>?gk4_ z9>E}`*Q68|^vI??@w9Ct*9-8vUPQq4a>@p4$RX?@ZLZ}Lq|MXLwt3Nwwsg}$pcA#c zTsYD>##YW8&yMIxme$-|a(}@MAFr`F<9eND;7uYl?-HST3x3zz#B|r%@%CxyvntHt)~ZuxqZ$$2GLQrHHq zj(pqPDCcturV^=6#odpLVkk*LBi#zdxiw628<^^LW4hamOWb~}a))raJB(}GQC#P)g`3^AvE5x4``x)X zn?Nnks`h%~J(Hn~T$xi!~@k5NtT6%5_pj0m!4l-g4)M^K+zK8( zz*Ndd#>D7{d4NZ2?ky4dCwAP0yJb3)`(%18571b=iFar;-XVtlPR+d{cVigtCh)mi zBI-^c&)o{0-TlzT-4Xwr zFCK6Yz$5O{@Qiy9UU$#L$L?7U7DQ=XE>Y*mEs0!hskV&fYrM0G(G@Z6JnejXdYMx; zOO{%z2MBx zT@&4_p}N=5z^_HN`!dvXR|gxZcJQN|+#;9GKXQv)bknCE)hfUm6^keGL};QcJqQG#}2n_QXNN& zkvFacd0C!P)Ug#R5!pe|mtagS$L%7JLPthFq#LPQm_!SMmQQwekmXemRXJ}^7}|l) zvb{&LLwn>KjAg57Zv=PX3Gqg7k7$xNEWv591dVv0oHr^A2{9o%RE}tToUYqZz%CIG{-BH|s>@^joIl_hKna?U(6& zY?(}5*u=KW@(P*W$I4`CVdqh_CG30>F88zWx=$eBegUTYMbve_jE3%4(9Hch;_f#w z*!?z!x!=Vo_Xim3evdf)`#zE7rBVHfG zY_!%yw4NZI#;KZ!))OMm7Ly^W!mK{6xTUh}eq12WF9q2w+aeiaolz){z6V(;bnOP^ zE+V2{c7t{!<$MUR>$DPDg~9-Frz2b6nOw_MX0K%`v)3}^?6piedo5GWUdxoT*D~eo zwM;p=mSwI~sEjpM^-bE%wk+C}+7eV?9V=8xFz;*~NaC^E5Em;WE+hx~FJ8eDLiRIx zK4Ga`45U?g3e_@_t%V$M4E^&8G^Ie#vugW9QlO~?dZL`SauMN~R>@lzs^S1no-LZo zeMzT9*<7|-P5Pw8&J%~?$%o--g@~s$nt0lvji)U-dD@}S(;i(tozTluh`ydK7~tuK zp`Pv->FI$np5B=0>5I9Zepurf==e4?fvIh#Db&yxJ+&=zCO#cs|h(hzyua^7wf6||QHv}Eny z9pvxoZcF{cGXyTrP=r0FBil0!4L!rr(la83b;TV(!jt zDzSOpvl)KR76d)F5K7;QI-c8TCEtOBr;Jwfohb0^qSd?`Jv@8R$FmnBJo_-&a}d)! z2Qb4^j&nSfSmHT^OFR!ao`*9K(sqkY5?a&4w0o3;Qq)=PEQ{6J9=U$QSS(K})Nt6> z_Ga}8SS~8;^BiXrYn&9PmG-b)@PTRV+Pe`WKEoO2_*Y?vltQjn}jpe1R$oBpa zGR>YGz7?xzxcl2@+jB%dN1ju+HeBScG4CcOE-1>a-`$JK(4*SC(Sztmj_?`cJx}r( z`U@vEYA+=B)06w^G_M>c`ePuwOr{I)yFCuY^c$WNr02c>x93H|*Oy^>UPXP+Yea?L z#HpUQ(BJb3272DbAkTYP;Q0UxJs)C)=Oe84e2lf8&#~U~1vYw!y?efMHX;U*`Xn~> z6s&L*uZ5168I6@Q+NIWL6NEQv2hxvTXysbPNs&g&QCcEx8aJ20P%3d#`n3L*amiI? zjBC3jt+E#q>6ql5hpFC~nC_j0S>D+=%X=1j^tGm@3f=pkJ3J8?e%L|YD?BS&a(IV1u?zU8Q@E`eN=b(Rm@1-e`YEtxi^%L6$nWa6Meymx0%CRe*Z?mpeBrWwD96!kWi@iBd zTsg=GaERnIN)GaYPVpf6T@8!1qSw)UuBQdH0a@OwXi;55tNB_ayqi*xxs?r@hL)BO zeGQ17cI3{~Wi~#2b=;hhY#k?}ds5VDc76Ip+?HXDW@5U}I5fP%KEyRsP!QqA%Za!Y z$PzGFlj|b+;Mty-rSRRsyu*`I5n^8YoF2=F5HC18M#F9Vu5G!PhHD%F-NVus)qjXJJxNG>JOy!U zJBzBe_M&a!`>%r{X}wE7gTLO5c+%Tb(f$3r?ZKg$a9B*^;e}LNF50UNtgc#CiXz2X{O}t;BmG^73 z_kM%U-tW-O`#pMkf5JfTFBtCq7300XV~Y0=Ec5|Od<>WRG~DHLAw|#Z-uCE?G^fks8z9tUiT8OATHf&%#iscbuoglnX+Lcuj zs5WV@NNdA$M6!f&$cuNKTx~of$*MTi`?U6|`nY5W-)9g-UejK;spWi|-!yg5hmSgj zfD?$9j}j#{RMGmxX&_JaHgJYfZVvd`!0@$2z}F7hzK&?%D@eiJrs-f(loZ(p~JmEX>|2ro^q+$&?{ceHoYWp$QbbI3o)>hEdqJN65U zOo@<@XA!#{%}~zAq)|%W@D!>PaHvv1eM$R3Ql$^Ik1}-VtaPwOW$e($>gbc0=zc6s zhhf~mWTKxqaWIAvddR&D%hFssHfBF2dM1mw%aofea+9lfS>(=+ZxSKXWQ2XwkmF0e zS|is1_fx0+K6d*Nt9`#{b&_axQd$@c-)w62ENXRbN{bPv#n1k>#VMl2Dd{cFrxq7b zi;FU}$hFTMZ@cpR+clMnDI)){CcR>7yzJJU)~M|fCDJ!pE0rvg2jA&yat4O+_2 z6nnIM7UgCOa{@^>XHkAm${Ta#8}lf4w$QCiKEIrOS3L&OKI2;s&37R@zKc-XcQKmy zRwLnCgRZ{IFvzzKBYhh%-ggBi`>w`(-!)j_+l1A=>#@;Sf>K{8w)!^X4&N3W@ZEy@ zecN%wcUy`;`-p?(kH`qG3?AI4eQ}aUvUGB)&E5?`?rYoEqAly&hf2=V$bCq=NM*$a(c3+c%X-}Lbb#r_7Kg( zVtTCEFVeW3qgL>958%8q>9mjY=#3>p6shD(r3}cIIbkX2?eh}SqqVll&$n`ZlV6ZX ziG3sDo2NcJuf{{ZoSI)@wR@o*$M9-;|3Xecbj#ygQCC>lSKcDG(^hVVHy_3FL$Oz;PiS+wAx_Ry27q?rt>qY;#Tr2 z1?J~hvgO8wTb!Xiou34P>r;c&57RM-k08*_KL{S1Q88i9=Eytns<7`ZN_O{9>ooFJdvaFC^(t z9xK#jRP|HKV2Y7zFM{?{%`URYD-H&?5yAYcSAn61JaTGkS%f1<>_KVkV6n{!YSgXBIcppBP4?&qshv9cZ*HwH?^2j#3L|l#H z+fB4)57C-?NzmAbM!pI(^F4qzz6a6K_Yivcj^cFRF`_w-<1F73L~owM1-=tl>3ad| zd@tfg-%Hr+dlk3%UdImKo2c}?jW>Po;x`|OyuJ@v(DxCm*+IX-9`L)_F~5iX$M0v)`Gf3j ze~5kU53`?WdHVfP9`9>dJnaX0_#q2*wI78`A^!{`wVz~rMBkI<1ZAftBxT0Cu?5;MX{HXY{p#G~ zHOV&96qvl!S{paj2rE|KQu#A>>SZEC0>4cy=eG;HJdw#lwM)(}0=Ye=V-|ru3-e^U1k16Ks;$8lxY`N% zARP<+SAzSmreV7l&HWqE%D)M1{MVzszXYBAH=&PzGm89MFxtNrllIj`TS3$G*>%A>^UtXRO!|#|I-uiv1E6qoZnY>;M6R2SDAGt zJ58c7O@601XsRX;n##r9w#MR4vFsS>mK}o??G$kf=I){nx4`KTv7TGt46LTEjH1OO z($!ce(`#`fk=C8KRbGIX^ct2I-UT!?3Fv4RFwi34MSj4KPJsY=1cDe9sD-hCFvbNU zI6GkC!ayBd97tewARE^Pa&Tjy9&QTcVsoGYwgwvG)<9G2479+mKr`$P#Bgt*b&7|3 zBVCtUjhk)biy^PHvvSR_!8XIRz~zn^roy4c6}pjjsEDb0Ml4FVvj*B{#3EPHhQRKl zj|%6$qxNyC_%Rqt;>a$wTl_Fu@5k~&)yiC0s9Bj_g?hGNKFcflU8Kh--OA8Tkly@k zHIyjlyGRRYMAccNVdC5Iu!*V0!#*RjZB66nMe=eL77(J2&w~6 zT1e0dM&J~91Dz2JbU`@K4Rr(E(Kyfpi9j!$66lStfj$@==!dz1)36{g5SIl8;qt%` zTp1Wj$Z!TB!U)_F7=^n6qp>eA78QXraVRhmRe?#44^SApb+!tjA?Oz zPmq2de8OQqPIzkGTZRjY{@&rdI6omYr2ML)zjq=3pWmzLN3PRkOu|&|mg#!#lj%O` zM;^jk5O<`!F4MR0o=h!&@);ufVPF=a%WMP!XA!C_Kz3j;8V1fqVPGlx1TMp%z&e}} zSdU48?U)+40@DIlVpZT8tP58>v+yhDXh?FH@GDo)2f2D!Ehgky1(y^I6ih>N>0!=sms7SumR&$)C!DhV zvTV6D27Z+0S8jc4MeN*RpkLiQLr6}d~qNpTi6*wv28*sGahm)CyWULD7uvRI2qUhn|vm?pOBgxF8$;{DY=2$ZGSTgf?GV??-^Pgnq z$z35w@k~Z=+<|Zz+7#zk6}p79;i@9$L8?T;kv2SpyMeePYj}3L1;zN2FW`%* zU=lCq_sjGkCq}~W=a0zrDSm>#h%){fe}}(M&#fCIdSNKU70pKAUScr&kxTf|AW%V) z#zCAGxDUmF`!OU?MN-BQOb9$eRO1+?2Oh`#z<;nJ@FcDXJdKjTabhmdVn^UPq888N zekyx7@Dd&iyo&Dvuj9|aTg)AJo7D}x!x{(PWr@IhtYhGP)-CV>>mT@#4Gnz6#sofQ zQv;u{xq;8vxq;8wg@G^F+Q66W>cCg5B=9xc9{7gc75J9z4}8ZS2z<|u27X}213$8t z0zb3&0>7}&1HZEG1HW-K@H?+hY11Hhiy-5Df}9rx6+SCy@Uw$1z98u5i-T@{ZqUQm z2EF|9V31!E4Ds885ndk5;s=9G`TdkW5Uj+{!w4f#94 z#{B(YBmN%V*6Ew`{{q<~VB>0X!tk)H+nLj{!?s?Ma@REI3gol5a z%n9mebJ7WXgB{;*62DyDAHkjIa1u_nZB5xt&&lYwa9$eQ4#qPoV!n(#e?)ra4jBc% zTy2i6KAdN7<2AROJB6e032SfQ`J%)_XkG$WLhN=Y4)YiG^B2?HgoAyc2Kzz}4uBaP zh`PZ+s2?m&vB5h*BPeGX5==z(Jmp|bLxNsUua9J0Ng2c&eQJQBbYq2T;vr6pyS5Dq z{g#>klH}=4NF$}vO@?0;Vrj3uO8!zcwDRJ#;4t`uXCN3HfkOmD0=u^W5Z7VgGX`v>utFYQHtUn$TUy06=UP$kYMFndmK zc->}1v$QQ}oTXVL^wnEQQ!nSQnf&!it~l30O6RyxfH8&Tmh(48?M)l+g@hf8;0m6L zKyV47!DTolcmcWuS731PVw@SgBxStEIpaM}Z)&?AjnkXSb5{Wr>&@k5Vo?mxTZqM7 zqn9o982&19GJi8|3p03m%1-FtMoy-7)~v5KYyQI zbICvrZc1fLEYXDUneZmBP4b9qlRQ<~Dh>Sy*=k-n|1ewKWAcwo{&8}CAa329i}?`y z_2IH8@v*7LM5G+Hl;GO6nybB|OcVk@e z9!v@D!R+8(EDi3%s^9@!6RgAy!GqWwJcMn*YU@=84AB#MK8<`Y^weAFZKOx~M!l`x zPTH(?JLA9G36s0q36s0~qosB7uU3|N^3lI|E{)5ZhxsQ$UPwEV z7+3!)ldp?2__lrxY2b4YIjzz*rnH_5}eU_-29d8&+H%L>KG zo0CFriv#56$XML`bMYYCsNi47i*u;-dvP@9D{D7;C*gZkEC!KM$G$ww-m$z%!`T|; zm2&{83o(<*U92DLFRs`o9jU)F&D+sJgeib4 zq{A2TA{g=`5(=V8D2#TY2ns`4=ohMmqEKy&2-U%qP+iOnKHIvO?WiZm0*#5A|YgsH}acKkFG9$ohu{IZjJ^NLCXXsheey{3dVdLXe#z!*FYe zu#S31c`&L8YphwO5JEKP%-WD7va%t`l}WjiNk#`Jg!e_ZaM9?WNXDmW$Av?~V1$Ol zA36hdLt|3dRwHNWG;)?sBZp2ja_B^(ljD37T$zHb+pG8=pE&@T*;Y&tp95u<`59`2#ERr2!s`6Ju?smdM67AB|+our+Hi>Jj~@i5$axHLt?G+ zN^w|3rYJ=;w?rP+`mPLa;bBN`R`BmF&zAFZO3~irKS-`SNpXHnSk6Qc7)lN*q>D-u z`J`&+M|s9h;nqik)>n$GTRxb$PnZd}ph`tao|~pOnp&qFnwBeSwpS80pE$AWtCF{G z?DPmqt4j-+L4te}G^bg*2m44kFT)W$fv2z&VV1`l&`dR8O=UWk&0%L#dNx}uQX5O2 zqjiGN3MiqK@PsacH?#`j&>Ccg)}ldZ9Z{tXXdb#8Eko;(AG!){L)YMx(6#6i+K8T^ zO_&=h!IIETSQ)w*t3z9GPv|!63zeZfbUP|Tci{feP8>MoG8-)qD=R(aOe=L8+w4{g`Q>&LJzXGp(=Jt=rHRZdWiK29bu=19%03y zN7=B@F*Y{z7@Hh=oXraThb;*`#a4u#VV8uSWtWDYmzchqu(TzuXBnvvJrUPWkw)9q zcFu(*=&W~^x7}7c?;R&W|2%mq^}D1HmD%TK*Ekeyjb3PnK3b!nDz>9#u8UMPM6Rpy zGp!kgt+HYd)>uQ`^zQaT-fiCx*ee+uP4ZM))rwYv#*(!bTby;jqQ?b)v(DJ5`64`; z6)MfT@K1!t%0(QlsI^vTCsPBRPzZ5wt(#0!eECEFB`Wz6&F#y`4ZT8h`YJkxUZ;6{ zBSo_5BZfWS^zz3^rEHJi$-a^AQ9moIuS!YHI|RIGBr>j;(5`( zt};#S#M{(~cc>HZQYYR+i_rV%5c&{3LLa4cqNme|o*6pPTkqo>g|dA2`iYCY&LAbr z7ps2&XT&NLBUWFnP+X#XJ`tQqtiC)VZN-_Y+V5chK+?x**a7ZEePpWZ*shg1?18e;dTG;K4i z!yPtK+VeQ=dE~tdqP+q7X^!d&`BwTRIN?A_6U=FX=>zpaHN)lUgY_aCxHky|vGp;L zfSV@n?utJsE<>9ZOFSrUL7N&EF?^>f@dqmvPeSCUDhZK~B^uV!D)5wytS6!vHi*ev z^`>SStwoJ2qm_K&S!tkrvl>)+6Gb=zBWxlVj-qzBHX4Vs(K?)iPT@TC4A;YGN+*OH zI4VOSnph?#0jSfliF&bpG4@1#hSzQ+?fa>@P06KKVPu>ca{8POFUH8J7Hxw$k>g zJS6>Lm2zPM4vX92vj)da#V5_oNjtmZx1!LWQO?_$O29G?*L)*ry)pl<-w0W6ETDgr zFP~qog#Y5bi1prNYU!kBruA$}re{&>*`!R*vaDwltDlLs579t4oQv>Ed!y(JK*W^_ftlwIqf&i;W=()Tp>!ZiOU}fZ1hcvMf7Uc06PX;Kay2 ze^lJ=s?__dkv&m8vM2s>WFJc#+4|NPJYPL34XlzA|2VSGr;Th%8x1qHQDbCJ{JW7I z>9m_Vu$@GyHLxSo2ln|41N(gSz&1*jov0qz;qik?V-jjblozFmv-DX#ke(TCON6l< zBH<3G8}5iM;Q}Irov+k^9K71PM7#_^Jhl^RC@DR2vd^$TA9>E?8k7Cb-$FSGJW7&I@ei9zfehW`v ze})HhEj)!s!&7-~cp7gJp3d8ZXYelJnY>SU79Sd(%SVOh@rmKH`IPW{J|n!4F9 z_zGoo_yT1@_!?zi_*&)M@J8k0@O8?%@Frzb_AEM!Bh5A7aO3D5V|7su|E1pp)2y)$+}AGWL?sV5>{P) zEuOTV@+qvpRhQ3Ty{)>4C_D5~G8zXFT$>oH`e=vf54YW}@~p!Nb)@2>G?^YNSDIc* z(uwex{yyzIMfeVy?lRN~??7(&t`usY=a{U==ws~Mcf%9D2chu2gkJm5AbbE#!j*`J52lC?35UZb^fTq@ ze5Q|c4CkZmZZ@+vbnWxqbz_DSvQDuD1;dk3G0T+}>74BmWQQL`({SqXz-Ae2>*Jm9 z)-TwW$U_+}aZ*~QUgD(0YF^^B*tx{1j&+F>ajSUE)8`9C$f^n@QHH!Cny35{m`;7ybbg!(U=j_-iZ-e}kpr?{HrDCoGRJtfcg!@Xy!~{spDsKX7w|w4Vsa zeG$d6M^xY6Gzr=Ety~wS+~joVU)Vcqh^o-$lCN$4F16 zMtZSGq#w(Q3}DS816eFGnB_+Xu|APvHXt&Toe??RF@YA^=&4{Y+UgTzX!Pyqp-+_N z&W*T4pCru$8?eq&`Y{sE>XTIwMsg7jB)xxAZzb2KNM$OC(1kWa*L35V>QKx1w6Fz@ z>uB8;SI61n3dEAP#i`<=IHhxjJ5#EOr`%JCoI!fi2;@XY(qNB8hsc>JMD*kf1(`n0 z*&&%>tIAE%w+)2*PcR`2aMsr=`8U;8NU5AgrqEZXrEEJlao9r>+X5MeDJ{r6?d!>X zluh>Kj-ArKE}Vjb`8B>SmSBxdmei-f0P= znFLWGjEzVWxS9rR@*34;Hn5FO+F?=c4R8WiZb_sM)cJ@+mjBP@>j**;vUGU5i9pJ6j@h5w{Zl_GzvNkvmR~G*F|Z8Oe(m*we6XoPDd>EN64N zCWn+RDV#2+Lg|{q>GXtjBdsq^d#UA0H%qb^rFIjZ<-(p%Qc%t|%aPbjUgA*BZ_6p? zw|9%>96(`S37W=Oj<}Fb=`Jp0Q+i~)#HnFUX^J$}GgX=r%}9QfQ>Y4lq*jSt1`8;K zfZC}Ml!XMU2uP%%yYvDBB`YuS;qPQAK&c=Zr4~-McqS1>FhI#rJSF8EL{<8ik zVDd@hF=Qjm;7v#A@@uQe8vd0g$!-eMRfQQ4SgP&1&>>FqY__!w1FV<0aW<1;Ju<3Wod^WNkyY7o&GK1oRkNhz+E zT6>G4FMw>)-6UCfy7cUfPH4grbhf2lIaK^-lt0` z<~eElJ3{(7OUikb$yG_;4irUajE1SrQI>1Rq9@7?b2j>}oX4hR`kx*bl5xeNPizsGtAF0$JuS`i1#zcx7;?tkvG=T= zK+8+W5Cd0QM;DCPyAcZ%*ThGA{%Xi@8kvzH9}zXN5)i806TW4IMGWzT{5e9>5j4e_ zDs0>G0VX?QO3sMe#lNRAm#*M{JH;3k7R6(nZNM&IVmp~gQMV*DZc}N!LYF`!hs;JK z>7|&$Cf;6VkQsPF(QMz%biCqHC8rQh697P_|jMCCo&bv%}%_tlN}Qx{6cui0D8mfomde1 zATvTr2cYcr3Lp>qN4WHe!0ezcu;~l)-n;&0+AgBMxE7}YhKCFoP>hQ-zOds+Zl->es^gXb@Okp zN=2nasyPT_DiCSv4?|{{)~pxR0XG?AW{;M~4L2r*^g@tIKvlRr7gXsRw)y2UQi4MH zhnP@(IoZldHmM#)CDw-U1&dszN(r|kSI4+B-eGuZ-zeRXLew1qG5K%qLc|2h+3rUh z>8FUug-Z#U_0c!j-=7Rk4a=v!g`TN0)7(usUaWv9Mua4!FlLr<4fV2MYL;aUIJl50 zI&zqaFSGB#!g?~QWhm3ayDHADuXz@D1Ce(zW3>OIrZz>TizxLZO%kmRujKrkRvu|1 zUC^;}gXzAi)DxM8N1w~KGi1JnIJ;#co_$5dY#H)PKRG;V-zlP^+es+scgEO$!<-nw zWt2e^WP$~M`s|klGG4fb3nTKZ)%G{}lOYSzGP^du0~+0-Igq2TnEflCCAHPVL-f`i z4zt=-mY%1`@VL53RTpFTU3zp%?T7SnMB`izMS=2etlT@qaYQAq0rTL4-otglUvYEf z#3>;{E^aUrioQC(W%~R z3Fl1YTHwbR+m{wwp3`D+*~Agi4rq?sPD)Ecw{cViv*xwI2f^Ur|= zXBY-QE>5Gq=0%2&fF`ZeF=Q?IA#MWi^Y{6MmT@6xVC#xl zNUFL(9-#)(Mn#tDZ=`(?Nl+94Lc++qiY~$Y$R-0M#N;(P-!>sZpZ5_AOnfHfLMTiU zivMmSF>LpoijS3HRweV#6&ftY z{D1djt{PJ0ir1n`Dxoog|Jt5DVBL-!lUnr>e!UU_b1osId4l9`ZJe_px^;LJFCmec z)-);U56NZI?OS`6e5vf|c=GqKWLNL6p^ zK13RDWqB>s15BEG@9lRk-^@cWObI_8{6${mh1!x3djg0h&*VcDsE5AAS8y?kvZKNH z4oMq9O7HD%y#)5(eH#Rhz}dD?7Fetwo^8O`w$9(O&v66!FZTLf;HEw@B0drBhnhz( z{lghzTkg%_;_c=wV_uw1LQWP$v+Yg=m+ud(kV{FYnIweK+B9=HcTMF@#vnT;XcP&( z_pv?Ez(<9WCy3oYItyz(guBW|{51lQ8UVf+ECTPt-#JeyzEClKC*)Be&Gv=oQr2!V z%T$(GnH_nmGaAj~;oe=pr7!aG+Z1bgSfwv9?>un8n{G_|)ylRRYlk+lYq}tckuG{qWjVtY;P}o-e4c+RQ zn~v6p|HB+-@!Tc?W>8r^JDeuJKoQ4&i$>Qq{1nUYKg+F`xJQFBtJYJIQ_IFPw{)~J zVmO`wIYCkOqbiivC}}lG7E!;_7^QgxFO*?{W~)Hqof__T+aljoJjf02RC-|`J&4;Z z%CQ!phUVx>AG||xa8HZ#VgnylPp(=Yj@IiislKtg-b@M_6>37vhtVA7c%qF^q`lO^V$HAQeu??GiR?s%2`*mzZMB95DVQ+^YA zy-!c`PoodS3`PI_Y%7=Gq@H>XA(WPW4&s|!>YI(ABQpEdpsOm?NAc0oQ*0h`Awls= zrHH#Q^5I$A3;aijvrkrNPEiCT^ZckA_&XDFIpKLV4b-aM3)nJqpdT#`h$g)lW5jJ0 zhEWxw@`|iSGTfjJ8{~v0CtD-*g;DVAbZ9{^TSr?aCCgO!Pq zF@vzZot>$%i>1AtjHQ{Wv8S<(sid8Ysgtp(gNwZry|Im!WRZGU@xnNw~yDIc1 z@jWMm$uODgD{YlsWeJI$)7h8yTHRZeBd)`~r$sFZ0^al0#SuX>Wc3kC-Lh#CNm41? zZTXZez}5EQWXGAfvKsVFngu6pOEzCk_A&XcV~l>p%}SY9(S@W0!{ivR`oPCLGK|`X zv874%&|mgOEZR}e`&8=CE-=W!#Ux1$z;R8wBLg?qF{-};k;OCE_3u4!${f@VC->*g zl?LPj7rqHQ!5YHE0x$OS1TuSF;Qf(fNqW*8KA`@u0n~mB;HiQf_zxKfXp;{Ji0c2# z018g_4yH~nmZr}C_1jalAUtqKTzgV1XOU$iiXeeWCF;gOO|@a^FjgCk3E+XCkYhLk zk`FrC@NiQ%)_JeiK^&c8yj%CTyyNgN+Q+-e9lfr*pSMsbuBSda)mwn(o+J46R?F?T zezAX|6N8!}}Yjgc@xsjsAH^ZdT8#S+lL6-Y&1Ohy(_ts%aGK8d;0>w-M8C zJZ*Tt1cNB#s`Wr$O3+b9TCtT|(Ya(Hof*9cRe<%>TFsguPD2EWmkb%})zPx5s%d{6 zR?sJOvY4hk)z=#>tEmn>@p!K)FNRCoQ}P$k@B5Txx|LW9-cO+cB8+DeOU53IouvM+)>qe=JqGe|8 zhdN=TY2y7Ex4YROA11;~VxaiY+Npzp{=Gj$R|%@e1HsK5D%zSKq-H`K?3!@ix{!{y zsCN7j!3Znll2#eBz~SznQEF;s$`($(q`P-*XLR1CRo~8<6v@w$le~*_Jcr&cn|7Qz ze*6SpU01@`v|lZTGCTA*$P_uZ#^+u?Y&@!L6^5As1#tD~bH!8%5*tXFzQzzP#A=r9 zLvatFAk~7sQZqC#vMre1v!jUsP{#iY1o&QV%t6> z+%8+WABcx&*?qcNqkjk%Pm5ytS#;^;yb%s&%I(~<%!ZcRQmBeHUFkpuiPNI5j4PY3 zy>A~||0uJ=nXZ6E^V)^NiO=9PUsK*e5Msr4gRzWJ{6`~Qxd-P~NXks9^9>gY7yc@< z!h;^e7~C_%b1&M=c?}_bmj3C+We)iW?UetClIsz?83X1cx7ooMRhD-k*=np z?g%r=V*ArV&<0O>c%#t4nuMrCRZ>|Wc7LhfWtm2@No~8#7g(gO_B4K6I(5*najEQG*X!P1ovaM5OKPu@Nvy-8V; zdVL?Fie6c2$HH4Cg_Bc-f3ct@Ie;wl4BEroT|rF@zXQW|&16=7;)ED+Ikc!SOU=;P z_K1AEC~)MKs4kA!()rIr+(>#UJ-Rgn?OH^yPkN{p08tY%6FXS9aFCZADcXGUW{Y2^ zOdr#JlejRdEsqG++{Y4_F`4DGVjDSZGGjw}L8jCoBs|ZA@>Z2~5V(`b`66*#B3Q_W zqA;lZo1nuQm&DZ)g0@Ri8b0w*_Yl*1B|`Li7n1`ooP56CblN!;ox+|#x$-HK#{1u| z6VCpO*=6q`Sbyu~ebs3<$)H2kFY|Hx@w!V^t9wa`BiEyDs1};snoeX6r5V>5DUnNu zu@9>DNCAca;ffq4woR~QOeXV%BGRUwIRYT9e6VIq-pxs2`|&i zw#9Yh?g^X#=5t|_Q|nbtXDR{0t>O!ZNYcyE7Q10pH{$ADbeCcK_&bl4)Y(pXotH3ROAlHk~`pH^FC_eW&~)8 zT+{_FDgviv@pFny#p}#mWU}kRo0E1vHfB2i0^Ztppp=kMihRf=JZ0jU z(+Llm1*uJfl7~Q_t!)R<0+Nc6pQc+Bsl-` z1{$*H8m?lIO@V}E0cByz6l8fglF~1dB6=|i&FFY$Od?Yjp>ea2WV4WkDM+d;Bqe&1 zB4RO#q3HNKETTt7p)m#v#cgkmd16O5`L(v|je-12x%C2;2=nInlmlL^r2B*hsdhfLy9EdOUv8^tE~ z<5FdDD$zR^=^RP4PbN5}li2qC=hCnLd=Kx4LkMS9rz^#(yj!@!lW?Q&DVY|+W*P5p?RY~1>!{(mSJfWF$(Ns_ z2tm`nAxmck=&yNh#mq0f{3(vZv<0m4phPdtR=HF{k{n6ABAy8%mJ;)k5$YUSgr&2J z&VK`b;cPAuwN$PRnQ1f3NXw!DEHXzQ1dNCIP!+4PD1Acl+_#o)Ax3`<=fmb>MvKT{ zBQM+~j9!<5+mfQ(r#XotszU)6c5@=1f@`A#IzX6DY=?uVy(9?M@2at6!ZhBiuZ(D# zaR=Lqj^d=6@e#3bIZuWq%h>;t;1WSP>5dNF3cmc+}e{&noG`ag2afnOVu0oW(})gx~Y zNVK2|rgAj@j@3Bwh+XAwEkiY@c;;g& z1y9mR{*iCMqotTRo#YoJMo;t?D5VMkilU9;3g6}`MTahVrLu0hG!)RabQEH5F{vnp z**%K#ATJ#_dTKLkrLgx729VZUWpPVld_!HOU&^{s+jB|Jm?I!W-3l!eO?zDPoLMMa zLU!O3V)5NSa>rmyN02HkJ{lj^jpeA)NRv0>$Qnq;Ux3Tcoaj?4(h;1!&NkX43N~ge z!#oAr=2Kb1F1dFGeJi>jUm`;Qh;L<>&MpHu_cjgiW++zE+9GdqqD%eY^xlaWB+h({ zHMgcBse+~C>$BREqU>7LY?oTuqjOd|8pCOLX8Op~x$z6M^8yWAqDRS1!`VMtGSf5L zw6@ThZ!N~-6tQ-Ea?&&cDfBCP(oPxKyKMWd;s6~do_)i8gfm+f>J0FRf+4LWgj1gx zn=H!nRQumg&Qh$L(lxt-%axvWx0+?uw~E=KXJ|3aXWW}h8XKlnK8aepuGI*Rp#!DK zZ9}<-jomY4Pyo9`ClkLUXQ>if{UewVw?%{{bGTn)uB*&mYBgA44=5mQ30n_`YBKto zaEdihl7`s``>Yv_WWD7XAc;a!49zm@hPw4N_L~xPoF%~}=^efS+xP0_V{ zJh07|P95JaKHvwEyDX1q<;Iw&TS!QGMpD==y}Ei;e2H{RrfpHo)n$p|o-s1dsbC~Z zQpSnsSLyhoN>+cj%uLMVkZ$uo5rIS9a)HkCZk> z_Q(iS0Dhky%WY>Y9Pr;9l8fnk5fPYV#h%u7r8t_w8CIfCz1};KSxquyCroROSSZ_x zGfQXHFaK<{x(W;i*zfl1?f#Wo|`Uy^xWUP9K-YM^oU-l<9!#LAlUiqFy z?gM!D98vd7z0S8kE|BBm_j02Xlg?Au?G815?z?LPd7{o-vyO*~n7qt#(D0a8R*eS* z!>!_nN$NfxIb);Di=c9>B`CjHc>4n9@_pI60q@UOMoCy8vi;~)W7|8}56oFG=Doc~ zGz!?Uy1SF@y)~}gClho~h#d!xKF(A-Et!Ek=RbcWLbSa`E?qF2GR=liSKo;#u-?Zj z_I9C^6Owjk#Gj_+&mEI7Y7FQKLz)KY%8?VbDyk1NZ))g|RV=}#gMGW_Lq0AhbI60u zwPPQ(4#a!}S%X;DxvOipIQ=1FCG)c!&aLf^p~#?G=z$m65r?J`R_hMHRMpQf+6>Db z23Zd)62qu-5|6vpHXo_lHzt|Ks4O?gu=pte#Xb2^pipv1n)u|C(0G&1Iu?4=4`^~u zBc^_xDVEFtksR}HKI`sLubGD*-hn%zO%vkFK~Jt8O}d8}e!oTj#~B9YL=$f7;vDF~OV#tdRmIOTp({MA(f@4_eI_q?yIAJP@0?YHq3+&S}a%63YU zfon=4UvfP*hgp7vnO@qmCQ4}RF#z`7cKXo@xc7=7=ia7mJK9jM46Adu0v(_=wf(f~ zuRJ+_@mS+!lsVyS7H<+uprKE@7^mC>fWU=%ssKs3$8RbH&x*y5+i_Q#$Kl*|OyVU% zr?+Oro)1#lPYgpm>_@W8xZVD>ii8$=?>Yi@}pvu8t-zSO0!1IQv8@g!g(U?0gwaUB-L}i z?n2we|UbNp@v$6Ss5WQ;7weLJ|JpcjR4q^+a3#qNJNqL`s zl>L`G2tbm@k{~KD0NEecU_G9y=%j{IKsR zMEp=1p?qM7eVF+xHnxljl+{Pm zhbYkpxdL4Cs}^`!`mzVj1A!I*$_Mjev*RoUxP0I9towkxdDSV|feBy;`4WxShxL)H zC`$WxZ`zku%A@ydf+nyQxCi?Md&fGEAKC}+=CO}G56(X1gM23|(Ee8s+DnUy^cMUC zcfhqw%t5EZNN3=6;IVh$wRFnsSMm`E)f9wsCPID}0ti3whsF54aoq>z%|2D!PxBo= z{I)zW|DP=%uESR>j}4d)oAG_;Iv@NOupNv*ec-LMx4Vh5N1DFc5}qFLiDl(f`@98v z;9jr~wj1ugYv5jp52zh^V1MWr-yL}nfAE*azP}(}JU18ty^tSdI}9NHU@w(@`XFCi zUJp2^cEwJxAuV_g9TGpZTy4z46+ zDW+s`34WBD==!HT_h2&~g77+!2NG*?Xbr}b;0#C1_nn9!0QSfTFT@9On_&1^JU~1j z!nxiqls`Sn759$v&6k*!xV7(YCK=3T*o$Ml4ed^H)PQA)YBWwj+fH~LAL_l(!2kC} zT;QkM3IWXfKH>JS*ISEK6eT*4+WOq|1|FzXr*Y=cIT}jejm#Mi%bcrwo?th*{2T+$ zB~BksxObUvJ)^0A&hWWA+)JLxpgqQ_M8Ve@(l-#>_4GpE+x1sLusz1SSj;c6k1C@- z&&(6?gFLR5*<(4u{j3%5AoLh7{>K~i2hy0E6Xmmy29`y%eB(eE4Vm%%f2t6f+v36K zO`7xcg|%x7F3-!#b1F`AlaDfPd{ZB7VgQ1g08veVFy4;H(*5o?@QFU;t7v(mK5Sgt z&O}&zrAA~tG^-sFA(-0NMzbSj!m;4B$DR`iDdZy2ZTx5I@pjh{TCb- zqc|Z2!i36us(fD7%%_c{1E~cTR-+RQIY%9>g0x_#BU`GdY?hcg8SWRQzboZHr2CHK z7wJ(5hC!SzI^9lj%$L~Z+tmeZVbC5ziyo;#YZQ@h(}pg%u)79H#_)j-!fljpLv5KT zK%PS=<+-JesW$Lzn44cmQzY?(*?{v1FI-dZm2KETN6Ig`PrrOD$WB~5r$&?lSH>|! z!j!fFIRFGcl9qUGhKe~LxoQulJnUKA`jj5sC{{@%-54P#~U#2Wp)mB~?L;YGxr869y(t$phYibXa z-6QWVCMx~~hOG>N4EsAYk$63dL@YI$6h*@Pjem|mK8>e|CD4sIN$&64%&GjT{mH|H z787bVmf0QQ!>B8UbZxG3?lbXWmrA7Qm$YumY#(&RQm{4 zmvds*`OzxDJIZX9T$cGbH9Sx9wu|S0njj!? zn#E@RnKJ{sJyCl~#r>0xyHS%qm3hR6_R74H_5GhV(+HNARX&fo+G|19aUh`wEeSL2 zJzS$5`xypy16qZ9#yc6H0%}8Hb6;C7A`B1GRcj2^W9X4Gj((ZOnc*B$7H&dm1{#6f zcHNiwj3`(k_LHQrl5Q-%zA58j-~h9Lq)?>vx&Cy5pTGWEYgg&93 z&-jC9hSYJ`*xXMMJ0!5}x)HZ=7Mjy^r)yAV{UBZH^uATvGPxO*|F8tlZ*lWd^ z`q(DuB*VKLh*WHMrD(P3F|~2NjI=|uySu%*TsC-`0SBQ4AU`!Rw_gA>kUshsQ z8j59q{VI34W+pM%BL+O8`lrpdcY97(>~O=uKfdK1F%!iqR}5aw9L7ed=Q(YFx;fo8 zeJbUIl#jgpGYLrjjDodOV6>~XpX-kBSFBLt)D;cz>Jjl>@PJ&;qpeDhr91q;;U`aFy8 zU;o{Ext`-?js18o0ra2wzwloFliSKsw{}rcNBfd)@YUYe}V#_NeiDjuvz z)_ZHokZO=G%~nSf4**f8q9JZ=_s5+adDZ7 zd_Wkq&$5U{HeZyNc^w4hUZ6*AFW)Q5hBP{^;QA-1a;=wRj#A2w59&MlQlVY*Dc_}s>je))<0wUX3b zJt(Q5NObwMgtf*7d-JpHwtRr8YC!s(zOX;FAFrJoH{m*u>RE}9S>m$(= zuCNQ~tgx5!h*vNJmtsJoGA7Op*wF__C@zBW(&Zrvw_DjKo@|Ag|o&-f`JHW)X7LvS&IV!-kl>{ucq;9tfXJ-@9+P zK{tZCaXUh_jG93)f_275M5m9&5V5VyQvC)tx}{-5rYG;p;V>G3-mofxU#z;%$w;u> z$G6=8 z-?_owaJ9;w6q0DBj@EzCqs@>}alJ8vT=}{J*};w$!D2*w^c7;5i>mXgQqX>T1xe0b zFin1?5~kG4<>e)?)#Mq1pB6Szjiwg=_J2PQ>Ohmh9LvjvygSDxrDRX=Io=bEx^mh_ z;QK(bZ@;CmYWe;aoEp2<2vd(#(tMgV8UN+*!C5XwJ7EhnricwYG)acf>n&2nOZfE@ zR-Ov5AETcWhDT3_0PlrUP%=DEQM$CL+;Ou&?%PR{OIgxEwWkR+$Bz(2R0lfGh$8LC zeYq|Ey@_gorI;zW!;j7BRD4RRjxFt^Yg=3W^os3m+xTj2>xr%B)VV75a3y}-rNSfLJxlO__djX5B zl83~+boP@@Qoev9v{V@pn0gu0A7b(=1r9Lz(b^&f+`CStn+6L>${o3W3}_D}O1Rf3 z<#aZD0QDUd?sVialgb_>Fh`^okKDH|Z=e^hFiNbl*WaRKKG9|WOnR>%dS9jCt)y56 z6mRYprHYUZ+d@+GQC*Bv^zlu%hP=^D2+QNdPP`&TQg?34Rg!hI*r`keu`<`PAyp(rbl%wfqpG8GY_XnN$>sM9r!_Akn zU?;<#yXJ^-&~Xl`dwqUn(oK5zKgiXAp)-);(o4_$inFj7gss;Fwq;)I_uFrGlzXK6XiDe6~hRw<~U2}z48+v-2uyGEMq3h0A0JAC&TnM ztQa-F0oOiD5dlugvk*VnBu^n8K4aw_p9_RK3AW{#OtA^)uvEiZ6ND1%JQU(7pbD-zEnCwlHRb00Oc?{NE+H z|4}DpZtCS(tUwvJ$^Ai4V`2?uR8 zrLE0TEY(+a$s8l4wWaa}gxgvKhz{9&C@+(-_Dt4J50$y+3Hn;U!oGs!0G{sM38rLi zNw+VX_qn`j$2#iYZ`XgnpbZ%KWDMAQdZ9XRflZA+%u!X4PefGzOv#76vZ9%*w)s4(yg)5D#!h7)?*mKI-a0145mb0&f~Bc`NDQ&a zd}$2HYuuGW`<3i)f&pMidFPv>#~tS%X-D|fI0y;hp=>f7Yyj*w-))NJS(o~9`d427 z{pkfz~ncF;5?JvJy4C*|#*(_qzq1_zJ=bfqD9BX|U8T_`XAG1m4 zf1v+pQ*R|JpYYQo{&g5H5m29Pm^$@x-ExV;zDL_Dij<4kW2WTl2%Bv4AHM@-23u#x zkWC9}ff0NZOvK^wT2LC&E}%|4TG9pl!<;?&J$h^d;dm#I~#R(0E4 zI4bK~(vpzJQN1r?v3`Sf&=n!oV8ehNuaohH>1T`r-V`g|%RVkED#IAJvrf<-hmXj- zYEy2V$k$QtR@0u4OqH!Y&|($CZ)ovK)ny)7g7mZ+%VWe#V_rOLGo7bfK|wMv5rsju ztL%zvY4E^#Qi>|!Z((x=KGpG`XtE{RHA?0T)Trr2bchpOg}IuWOBbgTAmcFgxT6;z zWu;wzF1ktr&f%f?ZMP)qJm*>g{H_Hjt2~0&rNC^e**2h4g6EzbtXS>9H`diHaJ&gO z9Aud8vQe=sj!s!7cMlv${c6Uka>=H>g0a#~gxQ2h+*7&(mPs(-9sQBDA8M}TrUK9z zTKP+3!_hRWQ%P;F;yuxxhaZSM#y9m-T-h$xKh7l`r7mA^~Y z(=$23P#*`r58mW(#yV*r)la78B|2c*Rj~`DFm(ME83}1)AM4y@r#f!qgjqXV!{s%; zAdO_=>zZ`pi>)_;gS|DV4gAWtSx+O~p=i{ZYX?^6k^yP2VNQ~`^j_BF>or#Ax_)b{+1&Wc%U^z zKz)+}k^VXKiuNS>i`PoWSE4isZaj@h$nTLa#`N!WwPh-A&azvcR9($ZD>NS>X6NOU z%zdjOPIajv-vcu_c1Q^+u9LTJ2iaAGKRo( zT%}u$oDf9?Wc)R@+0=TvKQsG}{~##SN$ibnrF7=>dDBi| zb2b$Jfk@ni{}b0%I9E=~+Qn+HkWTyKeu2Ri=3)dMDR=I4_o!}199lt8Xr=n?;;*$yulE^WoH zc$xS{Z|Nd&MpS?*8G}?TWtDxvh9sKB5%PimY9hzRU$@U?RKSi0kXW&NG|P*UKsmu@ zq7wvwogtmrfO1Lag^`|AgXGtWMn?RQ-xpbdsjw(y(=VV&lGjg6c?#>x5z`+=o_5O z7Ke2r+Gainv(FGWL6!+)h$U>~-%-W@ZERwivB*e-b9Qc=xF>coJM9qD!;JqEbn;7S zc&+q0H=N}akA$Ib$mO1K`ks4PBw#0Ud*AXF0?UdI=toTaXGABd{AH7L zoT(4ZTQ4)aIQ0GvDG*tv>ycVfGZ*BK&L3C#4f5Zka_*$Q<8N>vplmoGAd&wCcq3zP zXZ}Bj6$az7>}tA$a5U5Nd5_tN!cEvpx&>vr>L-eY&a z;|=fQb$`C@Uj{T=aKzEVf;Ix~h|L_dp(I8e)S>uH58yKxAwhm%^5L(N`8*{%Z5r7M z4odyXLOxpkEJl3A0tiMx5kFF{k%3W$i~&SQHXM*3Bu1FuGNPMp=w$mX~MDlHDuQlbX1=6JsxH zDfTceZ=H3?H32P@7|b$vg1kxNPRCfO#Z``W?iyGuoP}dW^Y^TW zl2@cQBy@XT70@G$C>xcrrOL=16JfMjiL{Luq^*T!=5hlCun_ktNBGc%96VVt!ot2b zLfijjp1|oo=-E>jw&=#Li54*|x8q&cRY903!M%L9*f5(ocg?4=tD_dh z2AUVF0Mgk z$A7e3%wmym5;mT(L>t_b%_8)XZ1YcAIg!V=L6P?!35MD^W*OyBvht7zvE-4}Sji8F zt*nxD!qQV@`fQ?mnXF|IpA1N7T8(0=7KsGKmP?PM!lpUoTz@F=WV5d?meA2KL`Dm8 ztF>D$pm$8sFm59w)g2{=tUYvxa8_iyrb@`h%ZwO0fIXBI?$Cv&bi>Upy1m8dw61AQ zxZqs1gxFc?#1w@ni$_(*0oY$6&{$vF<(Ed>jV$W zgSm>dzd6tV_C{RHZ~Fq(Uu*;NESqIT5%CZBK?;`e;@HjS236zk<>UTTRUuIW{o{$2 zs6MoU;YE4LZiehqq@!#I2b@8a7c`J2j*crB^w94#AoG+ukXO#hjX1~~#*pD~oDOLJ zHIT#QrGO<8l0gxBf99?!0zSF-FH$kKe|ixMbw^Y$=)>R8zn+?-Yx5OW4)p@(nXX~q=Tvowi^1qrtmH*{KXAU6=|DQ zMLbq_$ZEUXT7x%h-8TsA3GUDh#d?)4y6)Pb@tSGcZl2~Pc#@siGh_0QJ7dBf`8{G* zh$>>z_nw(QfWCH=n=-SGAwoxVF%44Qa7vsL((g9nlTx@`vr(r^ynIFT&JM*jsH< zH?cg3QwEKYevBhrEmN3u@t+V3(TYGL+~NN#S6snPJxKjI5XJgAR*?E%L?u~MTYD!@ zWlJy9|0y1K1jsT$&ciqg2ycn;_r{3hHnQ_Rd5u{GjD2$pi|;gpq}zspTB=} z@#noC7_jdFb3ipj_N~*Jjbd?1KS-A{!e+s3#5L!fcARuPNJ<|G($P5J0NlclfW=1P zUOVYn31aVf#O?dWB5?2>)N!V2$tePj=}90v3Wm+pSM4(kb0PK^r(ygd;K=PXh+(Q@ zfwe8n#R+M_p?ymRZ?tTew z!7aGEOM<(*bMfE~K?1>DgX_iJgS!TT!|=WLXJ)FVYF<@$?e0@8b-GUP-o4M-Ygtla z?%*?EX4e;9jsQ^E1)(LT8q2-jnmSz#Rg9_`!oHvCZdIa)b`B-hj~pbVol{`#35#f6 zF|~~~{gLNyQ8QrL^Eh*sG|{ZsKO~n?upH5#7Bbf!=u9W1T!}GTsZKq0kF$dmg^g{> z^pRhGb>OUTUaDA-VLdKFLg`jdH6?Nj-X)OyVPvrjFNjAg0C4sSP<==fY`0yZPNnQU zhU|80n*zR4&HRJO>DI$ys@RX{OJDw*pzx`6mtb&VWq*{FuM3`@A*Yq-$%7J4DwRVb z(xz|F$w`|Mn4JAjEK;Hn23s0(-Sm{hCRJKRcMbs9EtZaUYEz#$%QVYh2LANZxlk-5 zhh-!gKxO>(2VmP=Vg4zct2_)myQGzFlkvU(BubK6U>#3LL%kJdEKyE|DPAi{WX`2r zcG#8(kej61)R@ezJW@!rL?^B01uG#?&OH2m7!Jo%!%?M2;6au50(BofMrCvLJFQdPSe|zkegUcKtlz85Bm>B=`*S)Lw2K5XN z{Ku^L)UB}I;~2QvKeMXHD5G69%hEpB_7}$ZbbWC<>-@myLe3sIlbho zEQy=IKSs`xTw>k77>#yk7FY+AD`vb@iq>)LIhRMVOsV5-Bs)H_MEaekm^g zytqQKwnnkGMB!WUd9h^VpJkkb)Z#UJ{V(q$wttR4IpWbY_dEwy$Ytvhm-~4*hTaBf zo>5)TDA{U%J4=|i{z zBvQyry}`qCw?XmV-c9U)tW} zB`{P3<&y$c#(3w`aA1>WbbYoo-M#)pS+;nwuw30eGD@#MjA(1fbitHpBZ1232is|J z8{8Y_{~43Z!3=*#|L}g|AKp*;f8hPp-CS({-%)v$ma00jCf?h{L~Zf z4Rn!aWg1HO_wS8KS}>4uP<-~DeEP~+X$LWi|IO(8pIFT9+d;%!#&a+xY5r3|;Hb0E z{e{P1q5z~3^Gx{JdD8Ru<+^Y3%k{nE6jWzq2jh<`RTS8V*8C!6oK~hKDP-f6nX;QY z8uD@EUo^E@J?Igp%B`iQ=SWK+Qr`}7td2nr9hd)PwgQK11&S^`UZ=?4R$qQjVEwjQ zE&V-kb!X>3wagonW_n5Rt^3<*M{Eu1&pi)7WAYpxT4sf9Y@AXh+d6Bp19p*iE&?Nu zEN@q2!NC?tIHCa>_GgP!KfR2nVHvBzdm^PFC4^Ns;t+Yvpo%9)tIqvsqb0_7!l&4) zXb8`!WTBa@8|;!~`h#?cSX#l3|I@aDH~ou>nY!OMw_gRhraMmRUg%493X@nw*NPpK zef>yv7X4R))w{{z;9Z_@{W=BgJ|?t#Wp^CouEl;Jh-KWHLcfN@yKr%atRr#85F228 z4Fmq*QSRcBxdi5oX)H~BQd}!5j+r>w)1PzFinQxCQAyOv6w7qf^OX+zO-33}(w^rI#Y^2W+l>UgIJzbtJ8@HFGbVH;&>9F>?sB3(4vN{`-XkDzN`8yz=HZJ-D$pEepftxLrTUqu*v&C~ zK;IbMZTG^sT*Jh#Fojq3Ck3#h4k)|7qad}80xOrpW}?)2w(}h_8+i=9%YY-NIe_Z6nondV~#7qwPft zGj9F%0tcLDQ{TR?waVFo*+1`&%UycV0YM7o9PWP56+0e z`xe$&84%FP!B3dAM^9o;;yOURIqoI;YrT}T?W^)$ak`gb9&k&Nye8>^6?|=|8zosy3Jbjfnh7qSQ;wU*vQRI;jF!kh_bO;l9 zj`d@JhYt)Al^04uQI)4esXzN*qVPKur?INjjt~?-vJ?VlU$v)61QI0mR6YFR7BUUEtEAN7ybesI$w-lw4QDvln z1piXvSe6vv_FO*A^Pv^XE#KL(L43)_3fPlAb}l0?k;}-jAm4G~B9h(?Z~+minS&87D0MO_z?iv8Hhh6G=HsL8d7lNr{(Ku7jaue_WUA z`+*9Y`9Fw>0^$3|1sttyU*lZrI?%;PNqzgXWJ(>Div_1XmA;0+Et10J#=q;j$uRB#oR$IV zQhd$WSk<+fJxpu8j{o$qmN{#cUY49fr?P)_ZI8g@-~HQFS9wMY|EG<&mD|fNWm{P7 zm)Edv<{d|^BCo<|J1@`Z&@h$Xu;`3kJAzgs!#(OiuM10Z2b42=D@NwDBw}9?jzgHvfifdnYAzWE_@|OpWJhXB=v#Z}wnchxn&x?O-jeadloww5OM7rkAwvFAMu?d0867-kc#HH- zmp%LiQr~k<9YX%XM|4~41spuacy|v?^FI6~mnJjGGlcwQjp#PFp#STaut^T^PV^3t zyi^7Y4G4*Xrq}^b_<;fa`CCBmFz+{$JWRu)q<+9CSQP@uEp8OZ0h{hw zT7fNx_|W34_wcP0O@<`V&Lc!quB^GJYe42Gpi(m%B5Fqta{-XY@H82?a}*4OWQ>A! z0i4-MEg77VKvz!ggrt_tI(pE7xedGYrs>cogrR>LMtajyn%{>R;GFmPB1@DX$k zbMAUs}|O+;XL-Yu5T`zXV0 zd1U4_QUsZ0V+JsRbJrP7I9ODfORo=HHvP;ljmWXPb>yEl6ATH$cwmXhGk3!R<;h&4 zg2fU2u)EkfQAn|UmY4xPsWXKTFZ8Y&klq-Wclw#GxIZJ9Y0@iuW*g##*mcPz5CXg` zy!V$b91jTE!~}*{qq4r4qxtt8*;t7+yrD_tg9IXg<-2G$?b8;jy})VNLdy&B%NB4v zFZePexP9UwSoLVHd<~or$Q?nmG5gpu25!Uwr!xYEr^&%eW(Z8YyX+69D8=dkiMt_g z=`t>9fCgijn{*lH!RK%U%BY-4Km|`)sAwDbqBmnuhb-a-nA@vEeoMe1kWwdp>jTUk z%)spO2j))bVEe=ZbNh8fhg7EOaHJ2pc!KJJ0Yn2wLPH239ykdJ;6@6khL;_n_%Bc* zd{~;JozR?mMlfck3rHNd$q7#5Q>}Y+oIZ^5=XF4Kg_Q6$_AD3QBn8631Cv3Wd zt1Zr;Zl8dLgUdd*Je=)Wbyh^+7T+w#SSbV} z00hyxB0;Nt%h*T4$un9*@#2>=Ukz%ALhO=8{dw69PxF;FnL4wusnr?}^E^hh{- z2FrZfN|lyNCE6aGJGl%5h^LN-(Mkg({$rX!9&A2S=C>3>lQNfD(t>~vs4haTuOJU> zA9kz86wdirv|BSm^K!zKeXwEgaw@n`#G(L`7v%BrP%(i={jC3KSlXRJ2a`dTf}L}$E;*S_)p;Gbaw-?*2JAsQJ!4>C*+fpily-4c4n83J!!J!7BHqd=`i z|0)mRtqwxI6(w080IdSz{}E>NS>=-yWx==o$k!cFWC!`%tXDwJ#vxRYW`W0 zaM9vS{)kNTFS0`MnY)?%!I`+&?!0@hI3W6B!SGCV&QWeFCF_HWqm9r^PzFCpMsOx) z5V8Wv>4&sIa)u$onf&>gzMQU(lAn71d>Zfh$Kl>DDf}%hv@U}4ISc z7=>s;3??9-ObD{Sp}QI@wv*FskOwYqPeG3qk#jClHzDj5L}yOu)Ilpwhlo}^G(ZQ2 zJTzbjVhrSCy)|wt0|KcY=Hf*^dXM4>3rROQ$I8&)pS=$`F;}j_T_DqGO*RXUj3#mad>uYD7ESC zndS$vj%u69V^Kv(?Bc@065Fo|X=9SCj#d`R@7n4MDtTBJ`r5j`Yn!`E?QFd*#obIL zEFW*4Dux!2oka>Te(pMJrlMnYXbo8!vDmw7N)%V%@kh4{gcgokl9Ik%oD^&zA44Kc zzAbO9EMTjoGS+kd#VPlM(-Wt-8AS~ZR{6XB7_`|^h`pz!Wn5R??lDs|_T;WG{*_77 z@-}PiY1JLS$I@K$%YHk2YV5d{#=>F^taA-i>EfrwYW?=kc0EmbLmaJYrkY>vaI6h|N04@zmr!N?t^1W1y z$PNn2#%LMa*40Vd0Vyn9+Di@UU++2-jMCJ{2k%h~QUv8@7ie9;Y2wNAcrGTPE>qj3 zt|{FLJ8nnGe5CoUAlh{7Ni3y5nn8=DlVesD@n>)_8&p9QQ!+}r!A>_PD)K&3t*WED*}c8{EbJ} z9Vo}6{2`RPn?zCYPiz@sWg&vOeO02D?&<>f$Y>KI6%)N7wgufdC;CQ~p#mdf$h=tYJ@>3`8~k@Zu--&4fheAtDHK-DS5{jLHyG72;el)yV#mRW#Lv`te|z*82)~QY z!k;;bY3p}PhbLYV>?Nfa6|@PW^?eQ5gb`jzuzQA~#A28i2cC4u>g!|4rNgbR3U)}n zho-?~dh$pw!U<4K3&YwQQlvqhsFoeQNF z78KLY&KzL!!WZ0oz-3e1O=}f05r<4e2W4W|EQzsgUMldw>GOWKhbely>s6_35G)+V zT*E^C6uTH6GGwA)E7!T z(MGaA&G;2oCgNuySlr=Q-1h*_LF8!x8%NHbRyZg?_~){8=?+u-R?~*x8^?eGV%*uG zIhKx~K$5R+^Oy8~UwsY4Jpsu}6@SUtMhvpI!QD6^n0@z-*Wov<5 z!B$6*&n#-b9Gyr*veQ`lVpzoO_5fswYolVO{x#}zgJSLQ-t}X+QEF9HC=t>ACkN%G zUpQaQqEN32RNS$MSU>)?zyTbk^u($`fL@}C#$G(=U>?NjuRTf1U>|=<=+z6-)a;-W zGn)j;Gk<<6A{SXCmeAu^b~0I;L;&+IDu8%D4+arO6v%!UL9u zx?d_|Jb<2Ocj*qB0-#gn4ymn5I%!X|iTMv`I4qsbRwpgij1-kd_)qQ}79Q@+15~T4 zrnl1B6+pD->Sm{qkS_|l_#R&}F?EZa=eHY~Rl#m8VeOvY08J4auP6f~e z^vD~^IN=_3Yl-x^^P>>{GI!_|OK^l;^W>0Z|EZ%w#`_?-WxI@JckDL(kR=zYZcUPe{R{>0Yp~HBU;as+wS49IiXuhe6LeyPHe)1pni(3ys^~a%9T^F^jm3 z0Du&lPuLxufiIEaC=G9vl06<XXRRPjZOkna~UQpjY)zV;WDN%n~E!jtSlF2+@Zng3Z>-$tfuID$t3ok^x24j zTD9+-S`2U33*~!4cfeTX`+!o8Zo>|$g`j~oaT>$zLr!7O3v9EB2S4vr1y5%9+X+_M z|LZ%#A*p7+l8SaoRQSQ#EE@u4eO2YiP`ldxPAhsR*)3~l7XBy4FUTC=+`fR(Jf_xvYr;g^7q#=2H z1%zom@>eq)Oxhx@Szes`q=DEUTw-W{+Up}Gw5})iO7Mw9lIDCpD59@*GYgjE;vUvp zOP+wsWFD9;Et7_2gN9^hi}+j#sfLP+SNI&Sxs65$8m2o#8EDAY|D<##NO9*TNudy$ zBUVR3j-I6Q12@c&{EsGT1%0=yX~v=WYun#JRIDNS=ILbzu*S`g3a*-^((m(Ns?VZW zz`WW+Rs0ajNphD14^9NEtQu2Y67#tIfAE@R_x+I`b-JY8JrhC3637Z*41;OxynoQ#AmbR@9N*9ftg5E5pt)#y<)Yebcjg%k?QtYn`0gl z89iy5Eb3ivuB{z4d*~C2m@W#*``V) z^u@V8Iha$1A$sYV;qKG4O3~F` zTyLL^Ti>S1yN$uqKNDocQBS0ven+2#!s?BizFCF34ieW#J@klQaj3`+Rrflz53 z_HKhg^GTb2A4N$*pY{0jND+#Ij0N~30dF0P%M!a9#~ElQ=K*6J6G z{y~p2m8g-)Ft-pK;228Fu#K6f_rUU~}b(V_YuZl(*d#aLvw~#Prea8BSDzM4urHfsX)_cI%b1*tN)F-t zVA49lmN7bZ-teE-u8R&Zc%<|%ZxqM1AC*G9c8@M4M+oX9P3IQtZi=qW7{{6WL`5Dt38|5{G;owy(9>HUMWjGu!s7DKu>bnqbw_DcuICs|rQ9`TN3 zwRdDM>@&Z>4&9`Ot$Hi1rPY}mPu+4_#$un{PCw78v5RX~ykTgG$;>GBNKab!qDQ;! z7k%+Jt#07nSJO2hi=Doe=~^c18I0gyA42dC>EM}Mjw&a}iBw^-oX={HJM1y zq($~xrk$%`sJ(-A?QVL2F3urCU92Al{9$-6&S^dxIWO#gIy+i(|ChO+Y;D;e>dJLkFGkzf z>dYODX#we6dxYRSD*WzU-EtOY3| zo!ue_pYu@G&e6kpJcacrp(!n)bh?|Vl!!@6V^?2lBEmz~htXYbiSZ87_-yjF) znu?n!d>rm4&M`1)^}6l)kQ?_9IjHJsC}^!jgIiNxP^6l`5#*6fvf7Kc0e zdA3&KuDm~2*S>HviQp>=hys|&3=M;w(Q+(q9w<|otobm?O9A6%uuUS1TD9i+R&Hr62+p2nkK@_%F(4h)01=vbdvg-N-3 zCZQzBPU`byn|zbX9g};34cyPo^2N?9;EKw@mmqw$B-&voLC}U97*oB@wURrhz6d`Q zujH%QOm&P}x?R!r@!Y76kFKBT4jPDPDT{1L)OKt+&Bp1@(H;H{|DX0(w@U8zK)sU; z)uFSDmOvsGv;o5J8<@7PzVoC)G|lA)E*5rCxwO5q-Im|)Ak(rP+N1IyRovlNE>#>v z2uO8%xFEucs!tvKC$?Y(gDbAqH|47hf?mijnp+N@1lRN*G|W-45PATC;cti&lw(G& z@Pyc8^xEiLum_!us$U7;F_cx(IS%{32(=n3yprI*9TmsEmBEx4}S;0^vvyOhqWGnge=qyB=w>IBGPK{(OU$IS3 z%dP{el|bP)Pp`X?PovJCwA>~9#TqmXywk2xLO`sYcV~mwA23}jwZ>9xC4kTN>`S|u zQE@V{-e5Co&n!@vbtc2WTF436eguI*RE(YN2OeS)EyfK7yM8PA7wu={f}`RxM1y z-ZwvL1s|W^zt2%{D(KEtT2(&TUS}vYy(E(z?7$G6>?LnYzN!f7$6U)6w+vqluf0o| zRl>6O4LZ+pjX8Z46)skcehdyW+B_n0d?$>qJ7$yZ+Km6g%ZkHV7=E#|IfF9>HA$#m zx?J+)CrAr39Nl_-=JM0Kbt6_%i-U2Qy?ZXtMW!(3?Ok6I(HUV=ervVt=QrIHd6O2nZeEkS*ottQ5@`7{|E?6!>M z%rSI_v4xZ(t^xb4Qm*eUtX6+VX^7sIU}PCT_x{yzY7dd2VWj zEFX_Z>4)%wsol4llz6$4lc!((85%{^jDs-cXBde(JgLD>Jeo<52-uUO^)$T)21&9UjgbrM zj?eOsOp-&DR-t;he~$mmF8;!M_=%eS{Pm^P9YH5_+`SoRjg*H%&$@oi0rm_{EN4*r zc87(R%jsBz5_Mqmq%| z7OeO*(ao3X2FPB*!?}OE$%f?+630C7{OuHKW*-r2+6W6~u!%vIJLyG&r>4Ia%Z=ET zRu#{ZG*N=xs&>{JF=^>wOTk(xI-L2dS#lN_K!iz$!u3P$AqFkaduOQKG|xKoFk4?! zDqqBQ?8h-dTap1fO9r9N9$P(Wgd!vQXo_!;sQau&?0TFI^?F@e8f$o)(ZXyvj3s8Q z0j6%UFP7sk!8|?z1|@owy$#lS*lW7hKciFlF7ufLZP0(a2(O37ug!^LJ$8nQBGcWn zq%I^hY$p`QZsiNCF?;e69*rX(w-O}j+HjLjJ(SF!SYn0#Ool#(h7znq+Z=mV7L_RR zIol>7g7857pB35mR|wh&6dtiw9FhW)BR7aF$3Wp>yd^SR+Hre7=%#Rqu8T7^%rguJ z-v@ES9X2S=zet|(6YA|b-@t*tRD*{XO>TvAcwT4-ZucV4ld4r*8JFcsCJpD*%AnJ4 zB01#=HI~?F6<$4l>QFIlRLwhJa$nyisFZg!g49rkMuJNM0?vvW+rIg8%vz>P=gTpj z|B)~+Xmj)Do$7C^G+f0wW-!z+?&z#`>pfAMj^XHD^L1VWZf#r)? z{IOu}oUxUr*T4Scyvd+9to9hEz-6VVz4!2VBHZ_ z!pjWK@h@NUTt`o7^)m+{#&*U6FY{=-+!!~gv`rPfFp*o2(!V!c7$|b6btl*_HlhC@ z4Qv@f)L}>uIB{Xxq#~!9Wnff0880cvU~3wY86gxgP4O6$+5}rLwvk1kye@A{r-+7q zO;YA6kj325-!b-*nN|{M{@B_0(uHY;jf)`ntp?7s;>y;%+4kTptS zHPht|(C(cnXtycdCR{e)nlWXhHMqTKEcK#xpa-@|FDnR zinno%57*z5f%xU&l`SdHyU>YUzlJp)SQMq&_ogIps}~B1QZu%3T}%kJ5Ihcc*_U<& zebilV92Sf^?&|IF&Z~s?-hu+yGE3+hM=momJF^TnXPQRHRem2>-de`KM5nSiZq4#~ zu-*_Vu?dlKM8`L_-HDBYJ|sifTgpSa%;b4~%x`eTRxr@FF}eHxUi$fZOt66E8Njm+ zc@`v~y_i$E9}Z-duj`pp1C!X8l=o$W91bl~)tF+W?u_Jk-M5B|$Ock8*NnPF?Ns|W zFur#w+NnmsWL^D*9aSfl6=)NfjX`zR*5TgT zcu@#QTPgCdMcB}K#8EodZR{}&EEQg}n-N!0o{!BMMW@|Q%aZcffpyVJ&hu`zF;-+` zH$H)#_G8F5ouQHh?#bsk7Im<+gcXrz1?R+$DiEB@Ja-T<-)-hdDR3Ox&dvk3vYL;e zdNkIY7OL>_$4{Xs*diKbTA1Y5iu(g?>5Yc=Pl3m$Shxy>Fpu?-i6#YYcw6aAtoApN z!)|F$kGe;2^{0=zHa$>xOYMbjUi~|(sU`b&sg`l6CGK}k`>FWjr_7P*;#M9|>1_(s z+iEf(s<>G-LHnQdfM!8cJ2rPZgc1&BB%VQS>miu&>-s|f4zjX+hTTL&2aPbWA{o~U(;3POgE1qt zmLnBU_5OWU=h!r>KQrf6Wm1uC*&DO>!>j@%zA>G~C0&XRGuX1m?buw5PgZSGGFGy9 z9g1URJ?bn1V;g6aPn-OXJO%4A)Nz?EM7jw}dTwa>f{kUyu};_uU&UkNr6>uS#xJE? zH6mH+q=v6gWR0Q0bLG{>WcvNCmA0cs9a6))P@gu!GZj65vIs!aatjXvz7fj6&~Hn9 z?c8D%ree6HKTmEX$USmEX&SzO*M<{wYrP2_LaW~XvawOrL3uC@&KR#?6+lKD8RZij z8;+opvp5_3DOJ{5liV&UHbwlz9ji2$mAaMz%r8F-WnBI?x30~nMqbx)Jzp`-FR zCb25`FP`Qz{AKXU$O`0YzDvs53j2y)3{+EdHLj$5&(*D7@{2{v{4ps(5?$h|b8 zYq@`8Z6`$05SbczqJ@gRh+B5)%G)P~CSa8abqszs6T4}FVbQzjw)p;p4;`!3>S@+; ziK^3>tQ`K{!j9aU3B{Jr))W1nN?<5UI4DAmHTO)d&KEryt6t49cK$@8M__m+;wbmp z8Eg)H?vV8Ds`fL!_a?`?X{L6eWnLT+?(cT8q1GgNZTGM6%!IwpQxtzlpvmc~n+s#XAJ`FY)0R)dcBsAb0PDOpyJjLH~| zR@lD9)wr_6`=UJpGZ@Ds`0`+D^WY zoT#zY&clgZ3+8^b=h$Q8=@eYYhEIj z_DO%Fvt+}$h9l@G=YAJK6(S6~2)P<_(m%+9Y8hYCJg&cK^6d_^Fqym^BQ6K`dUVWV za-MHY9!EMAq~u#Tk+s(LDT%I} zVDkFl@*PoEQ&>(sjpvT#{i_CwPB-oi+h?mQ^cqL~9ad?*{|*#Q0I_HD#OrLJu=fsJ zwM*|QSXPrcD;rxhSyoRrpF0d3s&w2WhIqaQq>mJR_C!l(&*y`syv>Qb5KJ|k{T59i zJiXC#G3GXytL$Nlhhk}m^?-q19s}2SJgH|uJc-oDN9}Ze#OAo5!<}3=NGED)KI3s8 zEw4Rx`iVdo33puEti#TFY`T{||3c1yJz9T$lHps6wF}E?wAYPuJ@cDSyi^BA?n3JA zzc9Z)N=p4xc|8SnjOK==U7foOb{WNXljYun<3a=*A?};!BB+Yq#luC2)P0mu6iZ8^ zTiJC-TZxz;tU$~fio1!A)U}rqLk(lQXgqsL8zamLq8*D*`LpVGw#R200%4Zon?#Wp zvzh*li6F)N{<OSI@8&bq8!dTUe&WMLGL&Sx^~#~AdeWs!j4VFfJLA@#x}x3Y zGv-+OM(c|C`*lZkQLV#);ee?-zI&@bH;m-5WS0RiMa+-l`BKVG#;)$KF9}l0Zu$PD z0f3Pr`nIWW1|q;cyWz>^qftK@jZGeq;X~aKV-!Eg@{x_dL+%rj?#VFeO?gjoi~n8~ zs6Rc1#izpedE^D1`Y@5WeCT&aHn1wwF`kdcWJHj)pOY$mjT(au>DkTGpe2EpUmDux z5VW5CbNv20i%;n@j)!A+viU*R$2l`J8n} zw6|*GohzM#T#la{VFfAI5aZU}h)+TTt2BqII=Q^ zheYx=>apBZ#40l(TN!YWlJiTwxcn8(3?XNx315nTMmD-D$I%@zoGNmBIy7whygaV?-xx+8CBo;9>1-+ft zmv1SOzu&95tDJ7@b$w137)@kz?AkF62*Gh5?jQ$&svoEq?`TA6ch8GHES+19&z(wwJIM z9_k+uA83vH;abWQF7a^d9q2D73FD)tr7dWPTNv8=7oXx_Xv@Z7`&qP7?faT!46mg* zn5JE3T!y^7oMxl_6(0B7dVx}m+!Wfm$a6%K@!0c5`R6i2PjBj*twD-L4zMA}9p@6| z7L}i6zp>u_Y~#~aqHg2%1bS!yh8!@fFg-jjbBWFnwgMTTbB?Z4`p(xe#NGe?EFnjS zJ0h1o!Tupc=ucm8$x}}1&pn^gjT`Dq@drxrh3)C($QRRpV!HS!l0xlO{OZ_$#*_0Y zMg@}Z&6LK?Qlc+U8xu-k@sc>Lb9&D_csl|)oN>Oe51ky}v6|*Fwl;Ce{zad#=stPDyJX zIOuQ@wFL~j$+Y3kU76q8FP1BukHzJW?Qv!XaSrGM?WHvjI{c7IwT-={wy!UVGCK|dubE~v-hWQmB=GA|rejHKE?0!I_$m2%qmA{>7 zzB$Mc*G|f6yzj3%7gRt_@DFDVgx>!BgJPq;SY(bPde=J|sOx&$VSg8*G`7j5wUzC% z(~Efc!59TiPU6`;p_j96vYT&x-fw(`e*i<6H#uR)a7B0hVE$egZJaSUh!XkOCfCsC zB@|F0>t~7&Qj%19xT)Y3P7^(}Vn??-9o01+i<}#9b!GgtT~WUCiIYJW>8DAo zGRweEV;la7X!4{_0x;*4Z&}t-X4N(tyil<(%*qbeYWtalj$4{DQ{SVV8qc`|u~?Z< zBZ@aeCISSX+E~}wpx3($f2%KiyGvTjT2{U-#R`nrm3JN`f8-*jaQ+RXE~c!`WW&^_z{X}p1c{y zj%Xqt46niE9etimyUhZ<9X4BSi2`>^`PsQqvF+hKV_A-g;SVFlM*fwHcCl2#1c5@Yo9iI$ z^K^QkaG`IdB0sl4a#TRdhuY2yyOIm?C0v=bU1weQ4eO9-y+^qh+1_MdM-1ywZ^cBp zr`&!^5rS;UNIs};i_qxw8sf%}2dQ-40+}uL*l@a{7&Z5g68?u=iet6iB~*8U7r~u$4gdlHwFdaKYa9s@eJ* zIUta5TQuyMzD(j;jV$8YhtyM(Uf9Tgm(6*0*Pi?0r0))C35yN)STQ)AddF328E0E4 z$+#Qo9@`7Pj}@@UA2#tb)B=1lzBD*_rmK#QwT;xHOv$Df(Bbu_q$_ER6f&H8S;bM_66JQ zIb|P6vOSYZNa4>E!L_U8i^29J?nPc-F8g|y zWmtz~&poz7Q&bK1Z5m3;huUACA>F!9@Djzk^fud}Q_SHXFRv0OZDh|Tr=_TuMHEkC z?BDrL_k`D{k`GYZPvIR#tzY`=2^_>)S^MnqFA%m7!aG!35m9())_Jxgq=cm@o>cB@BX8vvIusc8V1EtyVHm~^46U~YCs>H7~pL7N-B$dhaoo7vzGc9hHE((jdHUPi7`%{ z_&_WI_Yx@#+-V4;b&?iLNn4?3V;HTqwSeN|8;!O|w~u7kTA zbZ~cfIJo-&gADHO?(Xh3xVs$OhQZz42Z!bEANz1)_hFy&I(>Wu8}iptFTz&5;^ zTPHjH(SEg)^25Pv+NjbI{R#Qg2}c&Sr>(&gPc_sT*UCF>8iU!L>~4)&be4T=KBODx zj4zG?X5~ye5#a_csxd-VMF{%2t50#tfuM~T@1yDUcn5fWq&@3`C0$0{hB#v~f9EV2 z6S1M*^p7{f`VCE5Q`Jp?05;OqPfJhw6tk8LNz{b)&_YH^cqF*Hzf|jqDk=>t{B358 zxXw;XgmI^xWjmJuv?1sSei^9jOgIn zk^P1^DBg6hi|~k)sLoSK7!&~k!A--%O@ny_faBqay>o*-Vqf&~jOGaoVIu@(R6a7O z^jbs}=In)^>IEk9q6Qp6*7xlfuAZ8?fIk?}@|v<&MG=CAhrA*zWmP~WDE$-RkGDgT zuEU%Mvam-aLtfaTwXu78d&0F;n`b87a{+o+!gi#a1YaB7oRe9Eps69RuUOsIsjwZz z<{GpjmSY%Xdy;1>SuxFYzdni?-_2&uz?uMx8SKL*y?d1Cr4#8R<`pEM>%y576?i2E z_iT|J6h;K17}wo))k{ua z*vWGPV@A7*f^!E<-%Tus8#?sWVO&`Qc6~Pjx$(ya zB;7<+B_-jBkBfLrO8)zG3WK!Z0-&j5rs(J7NuD9MmLbNKW+B})j+P-`{IBvyp~5Z| z&(4v!Ue%SwBJWOx=jl18EnHUUtb0_I5;FFUxY%^R+mC8bKbh)m!&X2qkKX(A>i|h% z)h&a6jS$hcA>4fhg0N2|K4caC(Nr16uBsKr?0V@bziQs8ice(%lwPlbIfUiQA42~l z>VChCQXPm~*uFQleL)BbhqV8=)W6}Hic1bqHwvzx>!Cm3Sa=;}Z{|>Rme!ttD z=P|Z_0?Ip}l&mc~h<=-kX=MCnmD8m_y0zR0f98jSbF%Z#3R(X&te;ixg0GZZdd)gm zjWFW%f6D%jWSQsqGeAoFG&rgfKvkm~O<+oq`q!YOAr^#qtNk5mtNtal0Mg(O5@ z)qPV_qS-&}$h%p%2PVD_dzh7<@PSvQ@T@?bOZ?0|nRY%V@KOPKO7P)O{K8?F^8rWX zUW3$=V6;nMdX5Ofod&Gc!AQv_Ui}KA??Tzb&1qY}Ve(7PY_v%e$ud4C^N2VL3AUOs zuTO$iEvWWASZ+Jd;e_w!u5rRPx|FdHzN)0?iV*d79N#q!a7QU}G7rO4X5e1xJq>NQ zS0r3XiY+!4YX)w+5zL$EZ%zA6g&;GlPrQ2G(=H*Tnvc~R%7eM|H3Cv>og^d1 zvBatM+Mgxp9WL+FtgfUkDw{uz?Ne1fjN4bjBUg^Ko1OYTd5+7l1P@_25a_=|3TgyvdP%q#S3@VfZnMKOifAC{+SisQkA?5Bx?0wnhVl z;I`xZpH*dBKeYRNZz_82H2uz0{2nX(xXD$vaIHSDtUe;k=92f>Gf%PP7rgOTYE>9= zN@+@0+7#}>*(F8sQxiw9tQ^HNMGu(sQnM04j^E~Q%a!(8qW;ookk<%3n}TyQankQ~ixDt`6u}xWht(t|d)SRTER8xWlZI*O z<zo1Uqh1kbyfIP9==Lv2DRv9yf`OUW7zXohsHnxo}woM0Y3Cx}m_L2bh5*9MP zrC0hl%B=vYgq5`~xE^X>>HbRjUj`#^|7N&Gs>mfeBLdPjBeheQymc!A=yPHJ5TK`U zmVZdV56b42;FZFFl|q+d2wU)TC?j0v<5F(>Mld_@h7Ce@dqVecun%PaFgx4{3hx~m zKBQ>#3wv-O2wD<=yqel#`ZjIy_8fUXi}3bxvYl76DI$o6-{7wT@Khtj}l*n zF~_xoV~`Tx@SZ#r5R4o57&nX2sw`6P0|j0w3gvjNgIgbL25dWH>_weVu5TJAmJ1CRTv)SJOGJR>ph=O3&fJcOF zAHfUXynn)U?qx>*L})=`gikYV13p?{B;cg2=1rr!5*~VBdHyDXV*yIT0RvideOhyE zzY7I0nU5PG?s)pV1>xb+nc=phz`P?M4P&`#G@-85jgFg-n`jWQN+bWl>_7j&vdsUD z>d`~>eG6vNtq`9v@|kIir4*MIVWqqaX6?y#k>eP72 zs_pp3YR)*~s{Xhpse@Rj5>e@env^wag_l)adDR!g@p}`^Vo<@ch4oA&mnCy0s#RUZ zub;mvg??UHLa&Ccnq8>Y$i9kN&-MI`oprU+ZN6%jYa(f;Z_aCeZQ5$mY!Yhz6(P$Y zI%a7S-yI?ISGYXsp3DM`xjg_YK}y>176nh$X6Fcc+u7D$B6BClp!b$4zpb=^pymCCTaGOSvJ*!t*CxG4}f@Xik!VXPP@E z+j3o4ktLV1438v>6Fi(w(z|?4p1OMHHg1^; zRc~7sPCS_B@H{$?&%K#*(u5)|Q+kt`KwHxEcS;3Ocfayq_k|?W4*jIl9#pJM^ZK3D z^H@86<$($0&qOq}&nP&HP#BCl5q;H-G#BCmQhi_hVXKkMOL?UdJep@diGvZdbU~veOH&1dXK$m-#f0L?>l?ej^ljtihA$gLq80X z)itdi`{<T6= z(Q}I7rlMUzR&x`_2WX;`tRb}cZ6170j~ZJg-9o-basNc<5)io)OlZiu0}U!@*B?<= zNxroqw5s%X>lC<`Op;YkLk&<1pWk45HlhAn5ixspCEd!~F z*D0rh*Mr!~+ofKe%l@qp77cydD)Q-3eKkSJx-L)D{2JnEg7~5eqZ_0;;Mr71P^%Jo z)Q99hW8S0>w^{4++Q<klAa;H1`X-w2UrhT=s%MCHh&GL}Jc@u0v4w_kFu;K~LGd z;g%d;?NyEZ;zWvvXGueAkFs{5CLqQ$rU7VJSpD}=g;O-swL2EKS7J=%5b%D|e9s#K zs7ev_6zB%`R!v#Cm-I|Bp@mF2xc`9`0UO0=79)t2KJG*N9r>Hg(xPf*88&uYSHF4VqfNCTE=PzaJ0e9X8q z^PE=`$)UR}e;nN={I{pyLkmUke~R9_Zt;h?V4_V7ZznSNAA- ziUs_>8r)ppQUsJEfmP9g7^5ksPeZMBHm>exw zPNc!%ekzIbOAT46Q6B&{U+j>ODA^ro!CW0YmE?{Y9j4p4<*o&v9S ziA4au2;R|U5l1p>YZQ88Wg<#czgx}JZ*GZ#$BfI02y*F3UhEaxCZZ)GKqZC~lwJLp z{=m-gx*_MpBs?Aoo>{CGlelqoTe4P4u2r0B3>}k)_#PI6+wWTJ6uq=tXPxpVhKX)8 zfKXaX@>H=Kd~+2Q!SC#4r~@y__vq#Chgiv2{G~|ItXiafRM02}G9nlmrjEjqHQC+$ zn&o+Xh0_^0dlYVgardKincHA(OH#74jAPK_Zb{&kj$C-c>~c z=*Q%wlMEA?=lKH#?W@dw)uBO`qb2>wVCU1|M+Y9u;q|{I` zYU)OOh^wzt5_~?jqfe=5w7Z1^GYHGVCPj%FqX0du}ak zh2E9T<9*v$Wrctl#Uv$a{+;4ND)6Uev^2+M^hYNav}q?6bX+GE^r$CCbV?^jfVxxN z6#W;8@w%7c$^yee&j-0h^cV9}_jd%BO5c(WFd zE%JWSx>Z7j94B!pr6Y)qhm~EB**< zk@Hh|mGFx|dpA$4>J<$=sY`HpAuy}_pw6i36&rtW>tFYdV_4dvc|9SC*LWA3FYpsZ z`TL7P>ew*8=wSx*+sHS!#7~0hPp`;(C5kc(z%*q?@7L+imhDy6Q6tE z5@C+yqITaY_3m+;+Au~JD9c6IV?`<@qB=rh5~y|W1Fr*eMJg#i%?xo8a!q<@odQSL z(c_|z(zmFOB*E(aDnmfsf|S2w?n~q?QCwq_{w-+c9c*z8@>icvd8q+Ds(^1j z7;l7t4{PAt2ZnbZ)~5^L!wCL^6!1X+d;?&-sQ}-&OrMgVdr+R(fC)5Iq-QMqt;Ha( z67rd3@}S?$J6#Q7lZwMzy5rBC^NC!tvIbPce$1gla@$9cAC<(c7Bm@aMIX7cC4vF6 zzR}~atmyF`6(H*p@+V=PU>q6r%o2$wWx4@KFHmm9lP&NquJ~Ds^7&Wdt{>8&F|V&1 zYDOOG$_*jY@TYjBUpdsLCE%m%o-M!-<|i@@ka~BJyG_$Z1iFa~jDM7V(n)k6dLml8 zkNTYubqlh9xp6;M>Q-Y7U&m(^=WP8v`lA(!X4suQ4D`7M*1Z|eX0XK9)WMVR8Lnj zH-7QETV(y8dXb++Sf5PrA8x?6yyB-v>1)5V-A{($US^`L*^;MT=^HoM>$@*7@}jhB z|0iSKBia|J|CYsmH%gh2Cd>AzANd&#<(G~1i3<3*!+5j8@Rt2djvcNmCZCDN`Czs> ztdnEik{ju&mA(;5*=A1Nt(wpMl<=J4N|m|cu=+5RyEUX3rs*E}vYYDH+~IwtBkLx{ z>tYpKL!y}gJyM*G<((yQgd@g4@1murQMsFp>bJ@v1dd{gGP`m7I$kzxkE-gMQy$>X zR02EkNqxnU?9F5Hwp^HkcZAfy+ko0WU&-W=3|n2I850rPgLlO~0cB!ZY=$QZ-~$}P z`y{;rSNbN4@@bw$l{q=JR|4q!CGskH4x@aQ8fb8;iInQg=0ivzhC_0g*H)X?5b==Q6fu?LFx z$_&VD;f_kUps0z29>C`Z3^OD76?C2gz7PQLre}2+R6J?OXxt+jDWsM8>5}+nUHl|g z{Dd))Fg7|<0DL3D@P2;MrW@`x3}hw|3X{1ZN#33qo!J3C3o#`0dcP5pebw?wzFYJp0KE{HKj^>eE){V?LuyP%^W3=)>fe%(=ShgYqA05^BL-@sp7BbqSl2 zPZyFQef;)>)Eqp}I}gfGFj6sjH%4Mp~;hGTi%Ab;PzYcaMKhMKb=hccUrr}?yUpGt(6eopQQ$F1$ zIEAu*YQXn+?`H#sw`lv*rufx;QVBm58%VJY1>L7pcje^2tA2rm-L)?T+dP_)z1o4j zU*=JY^b3db%fa$fvf2~i$My(nx|vQRC&`KQj>qy~1{@_qE8Q6Zj=Uy9i7x)!8;>T} zYyrFF4M`Ozy$jHM2TZl+Poh}U7I5F7qAs(I$PVmanOtM9$go>QQX!L1#-o=rqOAHt zO>%3$9cIY(c%-uS@oVCl=hj8DwbCt2MWx^!hKw`Zk(-nCRZUGK^WHg5znKgxO9Gxf z+qtdL1&mpQGiVjH(q%o)gNGZIUv62uMeCrLkj!OP;SnR5C87ptEx?E&K`68v8<^gw z5dy^xKX!{Ep+8h<{>6v1^>$j8{o9z|@HTTmt~JOR)ulN3DL7P!G~X=5N^hm3IwTtZ?nD6BC6)1Wvt*L9mEQbtLpH@Du3@rE zQ`>g4jy(gF_To@%oa}IL{P*GBIQ${SxXfYEcn#PYOCIo&<#USO+z{>SKaNs|CB`Fz zH$^`T#`NznWj6rJI{QMm{9o3?@cvH;)lh)$1Dz)ooOko?QHrR_^>4bh9l}VN%5tiE z@3O)sh16S8sn;>9wB|js!^CA*3Up9ISuw z=J`jqeJd3?TFA|Un^LFN)QZcB_!!CaCg-%!5n%KV$1W$0CQ{UEr^E7~U%DYUF zW1wTEBegc;>X?cwpegAnh42pAy!^R=b=X@W!>Xr%;ro{A&q>sLeeY@pE+Lh_nTE8l zS$TA4lQYSThkjq;s_Y*h`Po*!W!dJwb$XT`)q1uch3h{)D*25*O8KomYP-xn3cPJT zD$ZFyfxa^;Y7|oH-8`AR++pQKj?OM7u?31#EFNB~M5nIpyK|2_7iKxYLd`RdZ9c@q zb-4$fbzWduge$PfyLf5mugY#{OOJeA+PTaDQn0MdO42w$O)FNjho*!pK1`+LGzRGS z%<2f~zuw2NpDH)@kdiL;bsn7k#kH@t6 z5lCU4-c@B<02+$iC-*kVX1P5~HDbi12hA!YXVlv+PB;edK*uVxeH2(nDKoNG105x6 zSn9LuKc2kcw0Uq3&cIa9pNXt%Azsv0aikh^KzFylLUFqavNjYOc}@2T*gIRnlcZvBR;Xti?0|yk`VDE=_>2!P*BHB(72uJ7pwmp+LwW(MuyhyRP|u zC}cajHi(Fv$}KE<9g38T1+l$XW^99sqLnXxjRLV;N74%=do==;`A)N)0tB?1qnXG^c+~hK(tWhi7&o(AH^qw_EE;sYyK(0?hxh z;5D8Fn5p9Yh)YcLl9ap@CdC~Wy|e_hADQp-2Iy%@I;sgt{>+|?z^5^}O{W`Y6mBOF z_pry=+t&g#)=i`fAV?GEl$?*sjQP+}xUt6bQOQvV8C3r4wO46wx1iU!$5s)Lbh8sNZ(Rs@YKe-vWzefEBS$1Or zxtR*oB_pCZ$^}|05LM0ZkoWIMN(?V+gS%cvZ%>)W&TOniD%TNi5zVfvbgdOBd}Eus z*`-&bN&u7O+N%@oKu1^*=m3J}%fWa>F8KlN)OhVZ!nL%B?RO=KHVz5J99qAt$+~kt zY*TLW6K{C&-HDPUs0>J{mY68G@IVS1$r|@jB}1q#6b3Lu zxNT^?lrc{wKx}6nHRy%8-)i;C+qZubm8^kaEgC*W`*$N}(2!wwaOv`er&;;NuYa;cq=IG}_#ev;G z>Sa4p5Bt=AUMXrAnw>JcwDCi8Oo?s03K&b$9^Hx~^jZcQoD*j{0G<`Sab5yYPEv`2 zJ`Gi?m?Vk~iNq!eyP*tQwanQn#w6W9D}3cWBy|sBXL6Rv8Z; z-I24bzB66zNZ-z6&DODy2lVR~hq|g06sx4fDVXZIfTdpz&ZB%K`@ZoBukfJv?2vU% zJf0e1Q6?o7t=!C#{zvJtXS02I(zK+Ib$y^C6|18G>CuF!U1#$8H@x-$VLN4W1U^I2LMc zE5xEF_1K^qde${8+%9`_z&OT=-Dx;pZ8%~h5N`t-IEMr}PO&;#2dwvKgD%b=#_bH) z;wM`4AM=wtHSpRwNpYt|FUbJyF|3YR{@H6V`b~Hrs7evmzWvb$b6aHd#;jc#@S&2{@1y~6go>&QNh7h*~MOi1Wbh@~&jG=^m{i`-60 zmn^zp>)0zHUQ&*!U~#yNQ7`}}aUw<{LB5g9#LInRpPQlGXj-$icAEDu{e0=sXVaql zY{RmhVJm4>jKqI$&`Os1$k*F(YlAM_Nn!@PxWVGQAdN z*Z|NztkTF))pmp+|-M%Un?El!+zp#R_Kg<{=(dJ`TMWs zKKXIHwUtA_+DkWR|6fb$*oE!$7}Ft5Yin~Lgs9l(@h0ecv~AEHwugk60nsn^YAZrU zWa(~TYmAooK_>FiA@4^tF@|iuxTpmLCk@PMP^bFw?cG+T)3U{<6IQNW^Hzah}QY|oXyO#P^mzYXV z6g53%P!ZcsmZc_pc-TnF3qN;Yh@%bjjNkZ!cj!PMdV(vRV*$YAMae|+JOn*a1r-W* z1m@T?Y>Y3OT^Di}gL=dl={#_GV0RWQ{z56myYg4%+ikEbjLt4$n|(mh_T0jY;lk<*FJUdTN>G8 z2bn(f{1ogh;#Yczm?!zZ+AZBNPyFjfycZN}AK1;N!YlST3+1_p-8`i93rP}8rwm01 z`zdOYB863W7CX9(Mf$ye7Q4PQTY7OyRxzZs=d8j&Bmw?J4HU1Z#Vv!kp4J+7l3Q>F z|Cu@VxX#BbTl>fx+$Npdhsl}J_IWr=OY0+Ih%4|In6dbSL zFz%@LaDo-pd+zzD{*VImdfbfODEF113KT+bdu>fIMVH+sTt!$CMVI|1FciVjYHQLm zXa_soX(B;FCO9YXeMQ6lKSQVyxXPF7%-JH7b4NVwNih}D1ke)(Z7Qt)qt<2l;H>xOqog+G!YL0NJF z-2SDA=!(qdb@%HA+4~7J=$MNe9KD`()LNVj4eP9eUosBqhqt*>uXFa>a;?8T+DQL- zV5#FA5cUmkgGtvUup)gN6TW=JlV&=fN98sorNO6#BV&u0W}byFClz^ z@dk*ohAf|k>gFEmvEPZK+nd1x&LL3?&^$}0XNkWNQnx@%d=HmX72%6wc0jHObvLo< z+SWXm;YwsC_qYM?5Ep-E!7nuLy{KxkIB_&MkId~nWpw;PTE>W?&xYUeF>upfRJyif zbRIk14YG>kfQTg^mW@P7Eg&$_;b0=ty(pU)vDTl1aI0qCtIFQSdnPk$VJSD&G8iN2!7|=zc3n})@=+o zA*8?T`_3a&m%jMb+5;IEY+Cy93&h+?UT5EbDZCQ=IOJ+{e?Q zveiNDm`Zp_;f<2q*2vk!C}lK?K@-OHe<{jvzkpT!CeE~EUVjH750SrWWcDWLL^#`a zVC8b~Bq&?4ub(^*pFUA5C%jRPo8-m*Wyd@msKs?DGQHuBSNNyN?oCUvJn!3I(RYEf z5ihh>Z2LTNJFwlBO#3h>i}ITSSWo-MUE#wo2aafawI_A5B8>wH`<}7IKT?!2+V@CJ zlkPWBO|$HzUxuqW!t6y0U~|*N4^kPt?M-Kz8S?aQzRqgOz%ibvf=E0n;p$qihoV%(jtmm}T@$f&Y8NXjnnSaAnx}Kk} znY!foaVVH;{?(o@vUg~R;dO{`E<|@5_?WZ0RMDfiy<<`|@ou$cH%QmA8t?rvzb1$5 z^z=>XBWAdYnx5>FNot+DE3*|01IBIdCxZcomhkhMtjR{EDUr?j{uR`IG1w9BzPz|1 zf`c8JqAuj9D|eE;K7Qa=8BF%*7buiJrz9NQQ|`}Ciio42f#mkKNV1MKLo2JY@4)-w z{jy+nZ18s?a4aRIiQ*OrHZ3Q^`h#LY=V;P*5|eEOia&M6gQ+ z*BlPY3Th+lixFAZn~c&)#>F%vrN)OL-x!OcVNtLa$rOyu_Gqi+m-b*$=U(vEK)Q3t z@Isq+rgp6F3+I*3ZXfWN4{HSD2@ANxa>Ut%_`!kvmwbnT6X`GJw2?qe+MC9p(G5zk z1V~#hyJUbxO$JWUl{+e-5r?~N&`>BS8+ph>f?EP6R+UOtC@LGd4w4omcR=l>`}^y2R*8VbchqN?9X>C)f|d5 zi8o6yK5`S?ggXr44BUa&8vsHKwAfb;Yz}HMUnkO>&&tWP<9^?8)Uw@vwJ?f)SNH{X zY{9oG-{BoBvNAIJe-uaR`|Om{B0Gev_8$lKkq$S%iMYGAf~_rVXr{RacuYXu8Yr;V z7FxRH?M3t11z2GQC+ul`YMT(M;!ag^?oALKeHv>2E-lk zw>~{@Q;qzdyYxyYtK2^+qSRd1iM4Mo;2pfwh97D8@ynlXp{$SE*>tPV*GP6#W#iUP z1KTv(Z~ip$=BAyy8`y^)jqKnf^)vl~`wH!rRf9rW5j!#d9XoY?A6X31KZ@0sz-28# z)SeG%b1tYXKxCU3xy)wj3Xu5?n@DaT7P1>k&(g202&^6qKMx4MPDy`ox8sMRDRPgs zN76J2e4ZY&gv=#C^>AV^faUo`t$AFNjqTad^;vc9@8&^VS2w?lJbhbCBXH7Bz&~-< zYVYxp@+F@UTUq;N`82)B{R?b&07uQ2V^bXBq7~c{lX&u#bhZoJl8tHZ-&`9PZmjXI z7ABVwA4JI`F!8X~x2~W$9^pAF#%ya}E?%;34(__bc40#q|AyXXD!Vuzg_7j*6$dZ9 z71V$r2QTmEUzsBp@CQPFqSi1c{KAJXWWI3ZT3pI!Jid(2pl9_glSU&VLeOwP5OfG& zxY9tRfJvhQI;3K_QbWYJT#JK|HX2lC0!{VzgyY{{NYy!wZ1tdnm!s&00fr@7YZ>Kv zh3y5-O8Z%EQpF%|V%7$?v69^K!cmp|Z8Xxed8h{J;^b+Gj!yR?X;mJ+ zF|yiTP1qkZ>-0=pWKFqh^q(PbdL}Wd@YcyX<^q*}b&D3Mt*hypN7AIYH4C}a7wPN7 z(3O+aeYzEXrES%vee12-O4_OcqIZj3F%VF^`#$>#)zhPF#S_(+E#K`QUEaPVBUDuF zy96LWyH1>mrj)*b&KBs*h!U10`r{k+U4FkkH{Q-6y_5Vm5!mXJ>t6d8=L*3WHxKLA z)%2Gwv#p1dgAMafGZRzh|BK_$%G^oK(b&%E$1g|Q{~=)UQIta%5JvK;Sbfoj+lAHx zga=ut71E28805zmH8rvE+Dg3<&DMP=>hnlPGx^+X~= zRm-jcMp@dj!XB@0IsOaK5{{O-1cnDW6)v0~P8+8-nn6VlaNih7q9c0@dtW4LLA56; z>SjDWo!!XR*x38|_6EHT$BeD^TQ?+nlr@*uJ`8z5pKAn2hW2G*7>^3&|t>cjV#lR39}8Esr%>uQLFUH(e&Wzdrri^ zp5@2;AgG4wFDT)>>{`F@%pWa8)S)JFPjzw2RR}yU$Ni3@yis`({e_f({2 zxeP4GAIXm$phZ~dQ`)tn+X;z;bXG5KD=Uo6jD*p=c&npTxZ6q>R6GpGW3kx+#s#uJ z`~Z)rY9yr(9h<$_$hqFxK;yl4Q-3i5XWV4X(dp_YJhSdiFpc2+I?Ge!b`y!Ya`lN-z(r2y0 z($))FWjyFYA>NY3g3=)4ASKJA2Swbu;)eL&9L*1!tLg{b|8@l%4@>w{I54n!bTBZQ z|JxPBjh&56jGfFC%$<$@gDF}5$0u?$z1-D?u|KCaa=P8PaKjP7HKE9h8$9rY;l819 zfID-bN<(1PGje@x@ESLAoo|K=>AW;u0c|fJt(%nsOA6JrFwg?kt@Bfjr&wG^gb@e`>r#L1HZ;kJEVb1Jn&1+X5m^FHRG|~Y>kQ8M|`-5&ea{%vsK|P zKdcDz=t+@iisypfzs+c9TFn(nF4o{@buOX28B{(ivKx1 z49_6gMbZYu24lx!ZD2*=)g0`!nK@|3?6^;}hgOXT{ZLg=txEn)t%l2>V>Ejpsiy`v z5pO-l&rFD{d#8SG@{Oooe6oIW`L=#h3kO}2eQq)zwonC~KI+>|TfXkq11i9UHZ+_4 zagyjb))__G+VPSV#v%icye^gwRZ7CVutIU@XXm>OObm#X0w?vAsaUlm92`kCRLzyw zL&l2CZMuW9^V`V3#r)=W-Kf42xNNRjmAey+nSs=N%a(y3$>+ecsbx`$Woe#W5|CYI z)SJw27u`c0bmT2E6Qn(_XU<{mH3iD&OX{K$J#hjCjB$u$uH>MJXt*HL#Y!L`Zjv00 z##MGc9xgO1I$X`X#IsZ9e@>Sv4$g=7 z=>DB7$0=gNI`ao?ow;KusW^9L6aCsvk4)m-9AF_TD<=LmQ8oG)rEXP4 zb$+R0Yd3p?@JcCng^!0YvZ>K4i?a6=jN2a_P=$r(b zh@-rul;5luuiXA>-=ysyMhDDbF`1%D3_Dzv+7RQdEUEYuryfbFVx9bgXlM|8^`wHK zvr}j`sTDy*wcIILDV1md8kO>FbYfQH>qMnxNq!1?OeE(b2DL9gtQZVlk5(`eD~~kb zVn%<=UZPhFP?QSP0dnD)SIw=-EFn+GY!ILD-Rny_HHIh3gq&nPj5f(mv8vKW<_OhT zUiG2NLh3h#8x3H{nF;;4M)kG+1bM)k0MJzCMEevJ&;K5t8smvVj1DnU{1`S*heTFk zqaLS4{8oxGk;N*XrauHznEJ(-1GPIVA zvTQ;vy1?!39D*1*A$xB{(Ab#_Rn1EHu!QiB!GjZdebQ6&%(Y{kJB`GY%pJOJK}=En zv+$YnqB*h4;}Z{7FqU>s)A`)>kCcqq1csT%1w<3AuKAZaD`NlR7<2?=)+x=>(=6Fd zCh*$?t+e_)YCRMk<535^hLaov(O%{3j0{H*1eDeEYP@6(vK0hoSkT9WJsZ}#XcccD zQ=sPI!4<>={W>(&%+WfuRBqf=AX}Xg*AvRCntu3~yf<#Ls8ao`w+SyJuSP81JR^}M z(?k}pKpIgcyY9u}5i)a;(?GyOMJ(kII+HX+!)dCQ+TFn$QNjNQ#m_-ls+r-WeW<+yQEsV;qE)LIpxOag!3F3LP~QurZXBf-MNvMuJaeZR z+$RKhT!54c{Ry{a3xEV1a#QmfkK9scom0-{R=8Z1jn)bf*sy zEr^F2@>YY@vR6n53(Ycdj-KF*{{hYT;D*|uG|G@l`1SXXlMxS-h z(S(L$uicidKA89hw@fXb!_Eo&@7|hrx3B24^HkVB3KIK;l)c}oStC9*GbTTa_OI_E z^Zd-xHmReFxz21DN<`iExNqx`CUy#N57fLd=!JW?v?(-9usv)LJMmgE^AOjx0D=-~ z*lR1uPwX}9={6LCVrn$bt{7Fuef`r(_q~zGY;gW`GGYirBl3yvr3aVJl>;oxx{dY_bzi}Ygy+-=Z}S|q;uBb zoz;hH7z{AxZ-|y9b>zQ4`u+EE=^7jC@H-+H7&ZMmYrJ&y#RXiH|hSk4dr_M5fm;2`;>IOlI@>d@cI(>Qx-mXzIF?QKuSy*rDF^1bejQ4T+pGyLDhuyOR z*RbDY~l29%$Rd+?x!~-f_W#-_A9`mc zMw3JBu)K{Y=p7ssy`V68@!EMR3iO(b3qnn}S3HAm~r{lKjfO6!Z}(3~r4q(jVy7&efA>fa@m+aB9*kQ9wxS@bg|xQBJ&Z*dv^ zi@l;`^Aj(ldAJAj0u!kT*kF??FJEh-Q6ewg44cs3{%?^=t_6+VGcnhrDs7guz^Jis zzCY-TYYG$@`9Wh-V`|b-Ex`C>WNch_o(FLomqc;x^a9!>YTss@jXy@>T=0j`SXK(2 zQ3>^C=MJJN#?I^|3ldt>M`|osktLz~)B?tO)n(tPk=hEf z@B|iRT;(CmGIC=RNsznE#x2Xl*wk_{@{`=c{Y&??%7*c52sqV}Tqk5*N;3jbMGARM zhfGsV$Ny>wl<1ns(si%T?y>N;TJ#xvCQXRc2J?O!K@OkhXntRgQl8^`aaw5Lu%9EM zD%%^wX;5lSo?pml%Mb*toG}=5Gex(z&Nmxcwo{Wom|28I1SK(ft1n0jWXhpkDRXW} zb@fIKW5r}PT~bCN zEAEOJ^yG$Lp?b451^pT1#F>T!1fA*_x&|ncR^5?7guNDSF@&~*vBsH!Q`Vfg^!wz; zCr13w5Tn_8R?N7CxfRRtaO6e0y9O3If(dU{dTNFh?*5yq=qSusTx-l_@eBpvirF`a z^G9{g5CzJ77#`&ftJA+zi&U+Z41J{t6jWF~9(M_`&Ldqf;~sQ;G5Hn?P=X7?=5b?5 zdCAv7VhR$C;hBl5ToDDiD3c_i&m={E*yMSJnZ8n5I@%SLO2$4j&G;9n$Ng+`3xzPI zC*RC1`vJPXn?}ntXesM9Pb}X)6HmlLe_%+a7wchys(k)*2#8u`QPfb>`T}bP7K5&0jam5KxfAzD)weAn{*91TE0Ec z!eN_cVH(VT?9C9N5Cgu=#0wauB1$9Q?ij`wl*UF=7~MOB9=4~i=A zc3U)}x5P+7oK6Io2gYxh5r|0@6=ssxCIL*-ATvJ ziqWxc+qP}n>|n*VZQHhOyJI_@d^zKseX+l*J>I|YyrX7S&6?G~TQl)gzv+7`JxS6) z!&4){T~z6)X7`87w0GLRe^ILv7KbND;&ds|!gg7ysY^{6W1&Da15MAg5o4c(H9C5J z2XU}CF;~Qhst5-UOr2MNk*gvyJDVsTup8Ezt7xVIa!b1-ofLuN5XzPi4f4-7ayG`H zV}wXo5+v$Dy)alc*!p*Qm?&8k%7ob^I2E4{U7@4x4vZFu+eL6! zXFhiHMx{IU&wyjmW6N>(idV=lDokoxWOGa#4wPE5e#mV96|FJ^~XCP`zU48U-U9CrOu zMb=6R$p*=>;V+R110{?cT0tPAjE(lyA2q?kduw1KTjT z&Sp}uAJ-KM(Tt(@?9|pa)H}VxdT_>t3ixK0ld&RNLWOb;rA~+fF~d;$dO37x14@dd zN^p0;<;}CyyYjn;23R?C$1c+TKPNqcv6{3-T!9=Xi15}euB1-ei+}~yqe6|aR0l4% z2;A;|YS{^f&IL!qp-l$;Du@LVX4fqBMHfTv7BhweEL2BMGm3#G=@xoQlv>U8 zZMsID)UjHGqh!z$H&xqAmQF+u9q9l7hk$`y<8PYAEM^YO8=(Z(-Vt2D_JS9^*7uQO z@m1gbqJO2@bk1t-Cz>D7*W6YY!yma93Ri=e0>Mgg@eAIDc)NOwG>)-W(!54)4;uk*71O7_La)vzKj2#Jb2G92(UYR+=*#`@272dzz zV^bti+|!i%CyEqx38qdOiY#?0mTo=fO?`pRm^JaPx8U;uiE5W`^Hgw2;ZJl{WT_!Y@=VPu;&qJ~`m*{?<9WA}dKx`R3#-_% z^?!ZUkD6$ePizkVWtT)-Kn)qYV8@>OY zx|#3(>XUwJ)eArW$Eo}Osgy|xc5(~ysKYrOep{k0PT{hd0rUna8dvcQY(fXf4m9xD#93sZ$P~d*ch|5?1``fNG~~NuD7$DY^U4)ecqol_%l*U zYz|8Qkl2)r9f#_q*^BnqFgOlsqnhjt0*8u#P3rVDhl|n;ygq?*i^a!zwY&80*Gl9%;;CSUqjk`s0HFBHz`M2@c{TA=Kj(0{ZEld^s=?hRjS1@SyH7s9^6G z0VIFJ3ET5OmXaLPKw%xX9HeVZop#uKfDeVT4GU~h1Ope~X&B+?OPox91~GBDcAvzR zX#n9|>wIK+pQ2hzDe2?2A9@P$=PooM8{ge*gu?4Ck8n-=JIh*@M$gPAixk<`#f_#_ z<(KpQrcM>@O;H@}B}&eA8k|%>V$}WCNYq#6IfNhy(3&29Tt6va!M_FW{W(Zs%sWJP zl)V@R&H=~<)&UNJ76DNG?*90QB0pB_1HI8;)QNk9mHY&K0V-&iH#T&l0Fm*oEXY3_BUu8F)@8AMC=Wu z!mjBtX&Yl3is==(`HE&!k(EgkU4^X*rDUUvmIZ;ozxhhQ#Cml{g_WLdljfzXmCed> z)zT2pPFDiN*l&va_o-+06YrDE>&|W`xh&r^3lOJOwCE{!LD;X~K)Z-NE<<-k*!O_d zfNRSaT|~~ObN1Xkwoto$eaH}d^${gQUcy+hp|ezANg#W)88bJP{|>?){%t0PZ|+`D zbb>(S$bBZphZ1DT%?zh5Vl4jIOB~2&1V}f=V9)-J^G8Q?igPE9Fyt3Os4mpr$V(V7 z=a&Md@~Z}7#qB+!?vS75OR)SIOJ4sumT%erQ5}CVK=kZ0cLD}CUYhhD^bFsz89rK~ zch20!My{PZD-NE2yhGrA6&&#NJp&j%6c9fpD!0)qz5oL`LpOh-d;Y%2kBD)8%9VO) zj*M^;q17-JGf0@#PopY^l?kBfV`Uk%!>gHTn+aqEJDZwQ(}h~Cmi}gK@QwnQSH>Dl zKAIZVTQ!qZ{%V-eG-VF&`M!0V(STgMz)&$JvnD%22ow~^h<4G`G3DDM2aO;> z`3JH^*A^z3$`iC#pA&` zK;lwoyi!?>8!+N>+q_z7LP}v(T;(~zGNg$}*NnTNlV3+a@R!`epnYu7bK|m7R=qgk z)RaCy+Nh`;#gx+~Zc&Kj|0xvZ@ImpRm65)eZ3dzLiZ!ph6$DBeHudzmdLRAZ^k^uT zDUpNJZB^+^y2q+P$T|Y&xO&#!M<&)}h8#Am+{u}SNH|9EgTF&MrGe9^$W_^79g}cC zxoUhhtThR1u+MdJu$=g`Hy<{0p2`3kGm%TjMyENU)_ly8{9gh^M}eL;xk;K&2?gNS zSQuyZ(w+pQ{C*XRd0SIc_)FViiHRzwXnjV*MBvz5@ z$m7|Y*Rdi-IbVR6M_#t>=g1T|l=_%KIi;S)&C9FgSvwajY3Y!cHM$m!wc^UBnm ziM>7jcGZNfy;NILk(G3&MbOWt%5q`G=0|I&`NYXWL)9u8#v1d|5z}xc<0CAxWbxut zSOU%jho~slRSZ?*-eH$t(v6s*VFa|lU@m`g&RXbGVM{qA9UT8)iT36U&eJc|{DnP3 zh?SvV3$rS$Sld=#UTx|mWa1OmM{A6Zd10t(T`M*CI>*7NXq19wjZ6fAel*Dy7^GWV zSN4m_03|q5QF5-q7z5mVA$<68sF0S|q?VCY#%KYKHE@bp`f|OUQ_&c$04r5(OTDGJ zJFl$ORmO-1^duH{Rhw18=pNRUBSX&Mv|uow*3$)!CJ6dypAu#jfTd+#3r)H`32IeE zzmTOHThY{<6pC%l(4lA~1?vjXl4RJ_G^v#o6=EqE%zRxr!dvnL%`N*w8EQYm7ziy~ zHJl6+tO{AJ5Lku!+=|sfK3xtG9zL(#ke3$U%&|VZPZ#*eGLdg}{x2#%tmp)*GI}ZD z470^YwvBIwNdKo5^D5;9s-P;iHJmGErG#}xT|#{m=Nid2Q+~}YOkne*B^$+`A*tqk z$Edz##@lk0C6@WDpDJ^}aTc0iS~IK<8n*Vw4B9$2oI|qnG`1~S?hca`l|#)+)Z?Z* ztOB>{7o-sfXeKZKsftw@lgfSTGK#C>R`eA#TDx>6uP5ukrrIbhE0$H33(Y_qLF^?# zrUO#84OwcF*S8587Ma5WplH2z$dS8+xX48Sfo}Qwo~Ev1rNs8{%-XeHnHSV1h7)g} zkbA7m3)uVV12~h`7o3vO1>EHG9(iRYwj+1Z83e`j_sh=x%q+F(V?kx9HsMHP?-q`C zUOQen8!fR)TX*)vfTcXK=>@ZbnwXiuy?SjK@oHX8)`QyyZkRzuKv5c_#~GrOisF4b za-5cxqC?CxIzQ#f>9jE^lAU-v)#R1!9Cjq#*xDu}%$e(Q?_yn2;;}E&z(8JNdzNW? zU&mW&{JgeY3bGU@aff?p#JQV%S2Zb4+-ualNRG4sLf@k*rA&qAgyX{F;|K}A9J|Vo zjx977^Sw|(J0sa^h*EGyaIGzwr{M2+|0Nl2XwRqI&$raNX05tND-T=}p|Ld?dge@) zx0`YGsLTHQxp|x{I391a2O-q*EzA|E4TH~Vq|UYgLD?A_lsiZA)5n}ca0TWu94gTp z71sE1B13N3#ZRx%QtJ~0!ZYb&?Km$P4!G*X#3#2QUn|T9y(H3i(RK5OGxd#NP$yq| zVG&o3D^3HG8h*rH^NGe5tuoGuQ~NH2By-t54+kn!x3n-5*ASX^t${J;DoKqx7Sqk* zX12rGpJvT#P#YvE=%!1duIyupDmI==hQde`%<){pfDUT4$FZYc2jOi!0pZ-jK~2=4 zGSo&P?&Jvh8;o?F#hxO?0I^hE_3(>6I9#EPQRsJZV}$V_0(>h0uB}~673T2;$-h?S z#;_}S7#Vfo{JFXOjpHCwbr(1@(~C@AOifeU(mpI%v8O!%3Gu(hNkR>>P7-U4KlM$R z;Q1*d$RU2Gh%Ek;A1D0tQ+|SQ9TaT57(b|a=Ac$ayqM1OhC+PKliGm*Pn_tdd&RlK z&%Wk`bwp=8V+aA;!Y09324*F-eXG6_lomn$u4l-H2Tv=iJyl zh(2hVeB6HX za*0pwOO!CucP4_Q8&ndQlnEBqJg-`PI@%6=u_Q+uevWJ*j%<}^v!sKZQk)se5k3Kq zA7x0}5oI9?g2ki&T=xC9Az_fn0`jczjNy~6BfM_5kNPo)@oKq-XZc?J-fpaz9mHdoAkBc*hzvK9eY{1a4V*+k(zwJ#p!s<5Y!+A zelT00&J1UmGEC9KMMRhQ8ca0eXB_toYXB#XF3MB&cEquex>x3Guurl^3X6(*kZzy3 z9nL|N$TqtwB5=h^Ia|d$4V6~y(O~QZ`vd#$UNTCERWA49}4Eh}~_f{_T++ z`F}akSt*1$azX?-VPoE`rZ*hwy(flHIU$n19LcvN-x|9Sjh?@%?jM;CXzM)~gWI9n zSC#K*xxG7!?Ey<`!pc5gHx9xLV0Efsbs(cQrDo7qH>AX!DEihD=LF6@x@P#^8&~%P z`-aqRsN+L(_=R-1Z4BB2J7dVm8Z@TC)V9vbolEMbih2x%dI;B*Nv?k8#^ypc+Z4eu zPJH5()`Fx* z%JSGvs_G*`5#lR8aaS+N^~S4k=GLo7?DgNg@2CF*j-R;apX+4ZV+5(1Tb_CB4!gw!JP#~CY1)&R37A)u`hgyzo$;JR{NwjS-A|oYR6fG5O#GysJ-G?|yX%RPS0?C} zhVW^>+{h!cB#93X6IQ+==R14~%+GvB6hDc!;GRnFw4QwKQNK#=KELvd13snfqZ&%O zJ3Y#pdp!!f`<6tvmyL0+kCkzV54Q4QzY5^%^`gUvjtlQs*ZSa&Qp+7*Is8{bdsL39 z&S$qL_E&=^#8*UngkSFV5T9aCKc8w3TF_stRWRwnALgi_Hj60Mf5J0vE!NQuf7Y^9J>k zs^tb>Jl_;xggp|NBq29QBBRH2Geo~DRBiL0-V`yzPm+AC>y>k-1kO5>itJt0Afcew|_061gN3f8CdD^`jF=c zhPcW7+rQ}b{zjt7BdmV5xztgY(azH2lwVCrwTE5U6657=kDyYU=vm6MCVM5BE`mNh zQOrZcnI@C3k}y4Ae*38!rDXI3xd(y81Rmo__N)kpcyHvsIpC8Jc`*s$H;w)UR-419F5OnnajSw^aUqalZ2Ia0bg!K8WF`uA1lT1A#f!C-n zDTy;gia1^rgu1c%`zB79)FK}3jhbge(wSXOjv!zA2zs^{E-#ofNHDJoMKUk14mrVI zX#Pjhro1`1nk0F!?gMRJgIv5EX31$tw_HaD>=aO)a7#nhJ*5CVADV_UJmJFWTK#R$ z7H&|0&9>JO@Mg+p+xMK=sxsNaaqAPE_VNdX&pBVtKf~DCb>B6b@vCAGP6hTKW4+*a8gc`C&mZL(Qk4sAO*Y!gAxC|i?g=mUHa8W2pB)du zi90|nn6Sh6;`jyAcltCwX3SlC7zK7(MblbyJTe0|Aw9*aqEVwPsZN7HiRrO5oBo8} z9bCk0ezrg-%(aTBnCZnak%4ATr0{#gOC|T5A>UzY6!k9<*Jf6lCi%jU93Kc9-0|3& zOg5Q=E0HRO2KgOYJIzkbHY}Yii(@UQ({KUinWPs`Cw14%iDjv18@{W+ekf9)w!w4y`iU5DO$OBFj05M>HrCu;eM9}HrqJGU#FeWTH zoB+!RZdZVIRSZ&z=Ow5<*~VCfo%ZHT7RU+A=f#Z@aSp^t!S*b%{ToJafE{1w%-yHo z5|EK+yjJgtTog>xW?XC{upU`>a0|QU9-K{pb3GTChzCW=nZW2vVGL!pNJ0p6@BJtq zO*1EplW>5C783*pd`N7$~BCU7L zKhYA6zh8uCXHn&Elp|0W$Rp%tVNv3^C)-0w?M8*2~Sq656;HAr@ zSx9+0T62>!lTe7Qjktg<> zP@wPn7JkT#IZj-Z6SXts8FMqQ;bg{6YZZ^P<&+va7pM(F@$z#!UyRYVR>64&Y5YT> zFQ-8P?y)IPqcI~;j@aJ`oDcv9$k?S` zi>27GBaJCp+|&2w2{qml1}4d~8D-OJt;jX^E8nnXNk{Ef3NRauN9*AlOG55FE^1>+ za@{qGuqgsGowuZ$YYXFOqcQ=AO1qk7c{FweWj*fGAD4L0z%I6D}9XK+0O_bmps{R&R~R%_`!|6%L;5* z!(dI;bPHqi;$0U(Pk98h1gcRLq3)QMu=jOZqtx`$mJQ4F)dDhe5)>M{G$=K>%j<{e z6ed4W`-`?T%Y$FgB)g?XThIYKNy?+Uso)68B?^XV7%Nph6}QHmspr#~XKL>N1B-jeK+RRm z2ze2`$9s_0PTjcyP-Z1;vnjaO*T#>{)SQgF`_tDnEH0~J(OCAR*&fV$0s~Nil-Y}7 zj@_I!gyWjakV7?_f8@6nPrj=k<0r8HkqfZ;Wet zX$i0i-q_39&*A|Y0_wVh+mcS?Hx?m~UGc9W=a^x4Ry8p>4IaHR{miws93f}JPa%*) zTAI?Oe!w+JIJSS|Upd~fTEHdWB%I_UmS{a-_Ct0lZ78m5*DxEc_9Xctd2^m*u)La@ z7kih4tW~8OAO@$;xnwBPyTs9|tn!OqhG%KwNG2I z8u;UPZ1rXi&f<^kP|lH?4xw3CJC&Pom*rX1PSSKZKKNB?Jh~x8nxBno&8jACDo`|s zah->o(NX*-qqrqaLMa@oO@NmfRUX%fJpL2e0 zo1N(PeJ1nJ9Tq|RTl=i$6- zoQZbKx;`M}|7gBA&~`^6s}4;EiF%Yq%9z3Z<;TFYpj;#Ufva20M8;{cBD<5ik{9tC z{i(iUHVUx2I#SIK>o6{dUki&YF6iwxG$$la;i?#083ank+OQ=)r-7ML_pFb6$gh4! zC?gN$S%_RoI7(VY#&Kf6aw_Ig6q^P)K1=JfEP-v$+Z{inKV(wW_m3 zvALc8yGJZfXjccoLo0^y;{~%8qqUcf;#Eh+V}9 z7!z_8w9o7}L;Wo;{{oSUk6Lyk9?Yj)M5&_uD))&z-#`YX!Kp#3w>0(e>7zGZx`nY{eA0MgTeYXrBINiwlGmk*XF9J1a~WHjjy`7Z`y z4M67%C1Wcg_Yb z)Jbk=x%_*K9mulEY|>wM?TDF-zH*;!z{<=O&AM&SIxjkk&A3@kg+Y5Yd#NpCt8H7) zv{A#hSr}(A1+dt&h)?dvhMl-!rF4(n+e{?GnQF+=9l*9^2{t_v!&po-fht*A)K;6V z_9{njYER`?3G+#p95V6+k;H2=&Be1#R@#qR+N(zPhU%VIvErmxLU9ui;5tLQ~L7rvvgnOBP?GH83bBa z$pOR9G;|8iKisrYK1}Q330YGvK?7JZy${c*-582?$^00v%_}xq zCR?P);?o$6agQVOylx{lYf`}9$mLqSgp}xCM!D)PYM}8OQhCH0+MZJCrO@9FNn`2` zHY=}E)7I}3=Q(1y8A+M~U&?z+Ia%Hs76Z9#B`c1~houP1NgNv!3GG!uulz8(co@jj zF`A#Rsx$BG?Q2!oOg$Ww{XD3uF^XA^zU^W=nXHiOd5nG_H8Xmxw3${X8Cy@jpsYCd z^k89VsHV%bwU{e1Mt7x9kNY_0dx6n5A3_fB3$P!GJuV)*a+V4o{r3-{|8R1NsMAHx zEmCXd?rrMK<oWGHoBAk5{o6`Li!I8V!M#*_N43jHYq+o z?8(&A{kyJu18&koa%FLf9X(ot&(GX6%@97N=NmIiN@9iMo|qZ|5We5#Imd`o=)_hr z0VL-!gt5|KG5OSK8Zi(;~PaRE0oG%v3Xr5^4gwqUFh(8Jlg9B@w-l5;`?i`Pq5?JlYY~ z6XEgv+Sbt1LRBqsCROOW`87?UFF{xL;}Lw2w2m2Mhy33Jbg0|1%)Yj$s@uv?ij1KL zNK~Kj4SS_9eRsZp(!0FCqKELMh@KAjUIePWuaQUo2Rmz5m=4S156A764}`-s*fJ{+fiMxWX91&(EBfeg zjRY1YlvNaEj!k}OK7>$=d>zy~FafnD;iZPpZ(>|Mln~?Qo<1Cg;=5?G7r_AB4`B6T zReBN}J;vhgA0-OJYx<@-bLKIYc$ z6Y6t-Z;0(fkA3Vb+U}K49rG(7_{EHRlFtnAkz-BqH9qqWk{?t`tm%OA>hXhWPLy4# z6um}_%a%0qVuWT@xYO~@35+5?VD=Wn;aq;We{d%fzFx2`M-)N9LbGUvIU)~5r$GUw zBTl}-1iA*<0NE|h__9M?tG5U_^AC70W*VqjP;P6|a!-gM;#RlmFP_g%xQ%~Jx*v#Y zC;+l;&bM|-jKYeeuTO;k22pO+>V)H8ARu)ABZ#v6XRG4W2~`C3>(R8Kp~K?0^`SaE zl;e@+PjWoaIAaNY6ShCrg2dSgTe6JCZlsfw$2a`)eee7V@Cw}iAo+p-umY8Rvda4L z7~h8RuU^WE%KC7G{qr^AAY&nN#iY}ft!tN_XRn^CmG^T$z7H^c0PTx>0PfuaC7;~r zOoDIXJ_Ww!jWcL=UxRPFGPsQ{@y89pX>hDf$Ku~utSn#i)l-oabPA3HT7UQgkge6D zU<$1Xn2ngDQTMq6ks8!@)CaHIOnjKz&X3ODe01You2K;xs28_Jbh@fH;W?R}Dt)}* z@0i{^mX>8z%|&2BzuT2A6{wWTw-qp3WMr<@Cw7ydle3yJug0gfIux0!)(L5xy@Ust zJ!ya%8c~r|MU)jXN|!N~$;!8@S?NvABm?{A{o-oH??+f%2{vKlQIs~-nuMg*D&vYC zS;baQp5QeMs3O(|<;@1o=B{S!B+5JsQ@up(w3GIdP1FJ%c+_c*OJ%6Z$E#+S!t9Qq zu}p{am#|m0am31I!Yn$AX7e`v)>wUO;-zJmCC(0@yyGKMrqvZW zEpUy^Yj%fcU*u30O`8p=^szClrHr!TsRr}PuM`CuJ-w? z3YSqlRmJc@cCf}`VWjYi@yl>jWE!GNy7Xq{ZCJb7I^w(Kqwsj`D3FvhsxV-MW4kv4 zhpH~T0QLw60O_z9AsM~o9&upPS+J`U{d~ha0_x2VA`=e}P2Js=SJYb8PO7PeV^?l# z8I3-n((fD|agK#;xcH6;!ND8{?7Su3?2y?j0Ss`zU#^0SlDRcIYnFE$SUYsg>}MdHDHP7_T9&;2 z#V&h*ID(0Dz#dVOFCbJI#a|E%v8CRJ7fF{6O-dQ^XVVsv}Tnq}Cjo zO42u^mgv-Wpi#sz!pSQt=1K1wsnaAe*65_d+I%d}#?{WD1)i8sQw9a;T1JdhjgvANkYF^9D-tKY%q| zTglG@n<I;l z$rS`kr02TC)g#>-KAL|Qfx`?{N2b>k;&PgBNP}e-&NhxqT3McMZXfqYv~pG{H5oQu ziPzmqh-JaY**!!e)nSR92_3@Etff-2zD19wptstq3v>Yv)D>jxek)}Mawb6wI6iC> zhO1|Zk|tHMT};6XVID_6o{45rZABY;q9o6wEbFL~Tm9gtNdhk^8sBYHrWYrQ`BXaq zZN2#|VYBF2sw1!J3sp(&3{_p9`;L4!9`Ks7OIy(z`2iEXB=qn&d;Y5v0wIArgL({J zMIC~Do=9EJC?%7X1jd@SBL6vd|yvm8sob92z~UuThwU^Z62^8 z8SrB9=%j@a7Dzj55E;Jy7NXsr$bdI_e*{BKsZwq$R-aW*NG6PKu{q||F^1Ve!& zuD{*kH!^>X^1+z&c^R_OS%q;8si~I;}Y~B=p-e z6EB7d`#aESyRjQyb*WEk^hx{x2zNfA_bapGdLhF*!gPH8JRd(h`w;fozaURu2())Y z9D?zO=sr+BhWUoBKbSuHVh-p&IX;icZV>pw{9fH!hvgXP_@;{QYu2QFfq>fvYuYa$ z&F%>rJg2Ed?Q;C0_m{IZ=*m!g}Z!si1Dno}`eoHnB z2Owd^p%!R(;x)XMiVdj0q1yg_v&JR8B3hLE@isp0H+&~h8B6UV)33NgF6Cp~8g*=E zKOZGJ!Wd0jVl(V&Rt+9w1SbKC)e+H_5j3V2C|Uw@#OpE}jjUVGEL&C?*HV06r+n*9JN_`RhDY!2C$uM-Uej$oPSaT_ zv^kzgy@H)s{BTdS!zqF%L>Nm2@HM6i>3LZ=;h>POhP!X#x6}2O(w2# zfnlWqJ1SC(k8Gw8qtuy9FbX^BkvTB3=hV%fqtA$bnlMGVELuXCOr&a5d? z0669#*1|GUp8;3WKwD*H+MFQ}l~HWFQq&|ZTB3xIEK}-22%P6Wsl>o8@^-KoJHPM5 zh27?)5{XM+)KB$PYOauJX^9%#k+eL;O}7bsy~$S_{N}Dsq>Zi=!4hXh?zC+*BN*X! zjkz^mgW)figK8^Kp z@`(xb8&&Tvn$ROd&Vw>;WuE)`k?}|#!Xq0#O>3^ezZhax4WgVy8~bk$+ZC_-jM~@g z^b%+Dst`~Lht@m^GF)lcca9Yu$+IH5+laF=HeL^f2fvsZUDNjC={cpR#@10&f(!ml zY*p!IG{+-EyOlvvS&=;I;_ zhPu=%^3hxL%a*1n>=N zwAXJnQThhqqr_y;Q2G**_K{9lPbG-}_=aYLDK~xubi2}I5tJj+YsyqfrQA9hjL`+{ z(n0w{b(Jj9Yw6%13!YaxH%~ZooMxLRF9+!uo?yAEd_eak-(mxLhBN>@1J_Vf%1~$@ zJ@P8I5FZLdRQ*$YdozUDeg>%wk}@_q1vO1JRWZ<=;XV6y0oT`zpLzQ^t)=^VFKjBO z+~mbn*gk2LuDNNRy+KPhm6$6(6Ab2T7RiAcDB^R$&VOaS3(4u3k0_K|>gVSf>HP9( zb7~ciXjTYQ%F5LjHTNk5)#e!~I!Ov#Se}s5&&^|ydDKKrw=)C%Md0n0mC{c!Bq$3_ z?n}$$@JSM#EV-K4%J~ztnf56xy+u0+kngj#py$PfZM_{|nyzfOh*K!<%a4U zrIb-7?#iPhFBhGAJZrKiIp5F}@-WAT`CJ~Rpo|ywtmIJ3+-W^g<)1+uMX$#!2}M07 z93~z~b(W-4EY7-wxzo;A&&FS2k*8$x5`;lm&zK#{8Uq&nV{uQGxJ zqnGqA3tF;|(G>IY6Smb4Fw*V!*yprrNf=a_2^_7O^icq<&);vEmb9 zYAcA=#A)pV$YiJQor&q4&2U@PBmXGi=^vfn^3HiX(Qo}hego77_{zNW8_c!}Txe9AyKs^H}5q(et5C>xCCVcxjoilYMg*Tqij$x%!^jCv=1vNPM97mD zG~$!A>QuP?O-lDDQXDEU_d6V+Aa_*l@75RChr)H*D#tPayI&b7L=B*I2VDpXE!pS( zk$sZn8#G7(2n;37*QG0np+igK4Z=LMq;?!Zyh{8lmUD3#veK}K{`eN*9l{_nDr_1r z&!_ChO;y5Ank1a4UPxTh-;-z!`5y5>#^8nMHm9o|EpmLwY9W|eq(=5f{m_MoY=+UBz+>OZ_S2`MKrw~c znE3Qvg>au6X&G`?c!O}>F1WY73I&aWggm35WKwQ_Rl&$XU89u0BMT%?dIBU8iiL>D zNI)<=IRoB32S#FD*d#d-@Eo8eo(M|MPlTH`^CLIG1E#q#Gop!;T>{;3u~%;H;Ry$S zwOtClfrd`x5)T0FO>paI#Vvj}WXh}I@C&kPZ%RF;Hzw7=#2T{h!19esWmt_VRCjWb zJ57TJ?)lN<1>{a|_OZhg&d#XrvCIYG&ZO><)~Z!!u+F{~Ntj&%YPS&d?IrRFSCL@% z##G+FM2f6bVAd))KJ%m?jBCO(ggVpfmnW8vKGW^5aZ`Mw2YRa^>^(E98`#@s0aG!1 z{P>Wfksh_{%R^dOZva8@DN!NmrB38z$>_F;$=5$$-Bi?kI8_%-XqfbhU z?12A&*#2ktgrCB<@~(&QzbWr*|54uG-B3mVpTnM&co}`6YKgIf%!#Y@xMcE@hNC|@ zNEK?~)WJsh38*Zr>BKvpEWs5Q8fE6y(z{1tAZ123`0?PtCm3qv=M%CQ5^}s`-`NiF zN9k;?E2)Q?ml+`NJxrgbyWFle-?zL@a=yCk!F#)2yb!Cz#|UUbBERDiHW-TZIKASK zzJCR{gMT`*V~C=)A;P9Q8ZrAbaA+AE8c>l3)nbJ7vqu_&kZ^pl`NEa6Tp-gE!F*)~+9A zMm=8HJNcg{X}L1EcTB>1xG2QfhIR|ml2m4?@MT!gbVxNgzw*dDNTM_N?@fb8ZSm_` zlE-tc?96syB+oSGGHW&wIuJp#EpeR*a1t--NJl7Wu|;(Ts9`1&ESxRR6M-chdqSNu zdPog=B<|GrvJIW^(W`VWT1=LF3_9F^4%F1-+nlbg~FC=wZtaV}K znT$n3UN#2(CcJcNqhnk;U!1+HRVkaF$yXm}a+1GPy$iQ+lvu_o9tc|)pBazyjiWQZ zER2OhtZ3;QvU0XLZ7q!;$tZp{ZL`%n^A}g^MJppyawK~+5Nd!yYrEWTi>oq6yRA&) zW!D2sFzu6!plOF4uWyrY)fz|a?uc?;o=kwXiA===uPI{>H=e@XbFekEKsb{ zt}x_@W~xjjvo555U2XnTT(uQAR!sA6!!x6>w}4VNMN)Qm26|immQD9+OS6_RGBGXh|`^2&AGBN-`#XBe=sIV%(ap$*t*$YMvqH*&xnJ3#bLiq~} zFA3^AnTU&=_K?O$(l-~}or}xGN<=k!cM0^xR8V$+KT(m+t<+Z>GD}so7Z?)p7_V~r zz@uC1r$GI8Y+x};0!VQXNq=e!sG$4=T2XfQV*aRx`HO*d!YMa|#w}Uo(pRovHz5s6 zU)k|zlT6!N3&rhWvi3e2yioxf9>%Mq=!CgKI4<|_)S(P!MaaTIuKgYD0;c*%p%?{# zsiYbL3pj4Hm~}}%K0BkC^XV{;aja5=v;DG#7mV$!9W@75l|boD(R5(irV%N(&7%Zq zI*t;KL<$4nB6$lZz}mjrwHrHzs*>KD<`fKOlh(J+uH6>r{cTjmm3Pv0RK(7(iHbtW z!=3xkxQzQu&9lE2+v12;F4D^yo5l9%h2x5Ux7AxNq@TCLm)W2ifzxEj!D1Jav_nGN zHxfcekoB;N_{`g=J(13s_ql?os=4TlH)vTrEfkdf#;0Rb!#zW#q-0pb%1&;dqrmd4 zGNZ{M;V!TeIV)4%5pDF&Ip|tbsKjgv$kd$J4H5`&q!GC${KLWTVnmEvHMLk)9iawv z51Tj$>#Q(gyl>=$j*@G}{zK|H+&qV}xv@%~0n5+yh-p@=dN8^8Cv-sQ>)e44YgVEH zb;>tgZCI16*YFa>JXE9$SUXjMN$O{C~IPnjk%es5xUXR*)NY&z5 z)c#1%P|abPpO;8i(pC2jh+_-7!}%154j?BIG$&d~Fdw}z;dmuthb1+& z4wu7aNzR@pqDmDFR1U?ojEfqy2*5Laa_;w{;`uRK;3B{10FTKI@2FS$(I!gf@ypc& zrq?2sSc!?(4BA6kik*>52`|2wR^m5$CA}kaiX0?}6%=0$ah8Q6=OoN_s z5HpG|Sn8PyAnI&hn`sHwv6mwE&iXk-Ab)y-etlvo`=VBTU@YH#cZ`zNru2aJ$@TBr z<&Ez2F@5OZ>|O6+_~GZ=AlOGw_YBJ&Q2GA)I>z6(`b6s9!)HSHN_>6gK-)vHCZTHx zc|nc1x2nw0)0glKgS(@$rt6t}x~=%G8nfqT2||qC`;8|Q(E9{n-F5iU5J0FqsH*vz zTkrB$fNqWE2LHhTyOUZlb|)J5rp~9Z0AFHWu(w<=L6u7)S(i?F0A-a0P7!K1Jo-<1 zG}&nomNqs%X)C-e+4xUpsa^=9Dz!O9QE5|=0d5VXN)wS-M}4+Szl@){7Y@YF`(o3b z2=7^4CAoXNnj)c3LT~H4kBYKfeqRv(txsSq`EZteqjK#3h|28$(I;N*u)k4RRNGO) z!A6EyiWL|CTs_)CBgF|L8lH=@G_{#Ffzz_cww+K6Iccf7UVB|}y-_x^*&@E(_8d^uK`cw=&lQ|M?GZJn!hhq1i2slyPLWUY0w<8?DzbgRH7lG5dqfl zKq`MRY6t`7a0LAkJqd(V`Kn{8>TUd@BQY0t5VkOFWW{KCtE%Lusq$pGdz!(F%0Q)S zP=-^b?}%)e^E8siFV=qfI?}Uo4GK0Rtu??EbJ-J?QvQy;&Yn8#(N@B+N`A6xao>GGp1_os3(X(0ssn)9E=ql?u0&Rw*@Jr079SG|9}d_U`RAo^6?$KGki^ zDqSq51gE1YXbI{@m{4VF%wDfhuwWmhKt$ykWHs8RY&)io`CJ)ZgLuVGz@oi@Io*na zTTEZM$sCB*LcQmlD#}XL;=|Qmu#|;b-g2|R%~;RDi!CH?JV6G;NQCG5{}_A6_fF$x zc`(Vuwr$(ClZkEH*2K1LV`4ks*q+$7jm_EL*=w(J_QgK0?th@}>Q7f!SJPpRcd(?M zOv%MSoA+U|g}`>^Fi#Qz#zwEvN{K~&l>Q=~Kt2&g>Wl&h{!fK>qjIe{1Gf%;;x9&U zZT7I!>dBZDS!vl?(tK_+9wrjDeg&+}YI?vSMP5DDcwv_Yv83LaUb7Im2s)YlhBVB) zk)!l4>3gV=p43SOS~(>C1$>Gu)Z7P3s_Iflb|K8CYEAiYn`xIM;iDUTnQ)gDz$E0v z<#>9NK%gkoIJ9!{2K`9xSq2$t!)!RCDEqGcjOk>P!|3uATbz`8q}5Sh=8T_&EKaN> zg)RV1`JmcUgz-(BVyplo`fkc*?GH1H9hSqhXnoBW`v}AEgEKx2UuA1kZb@8^s5xyx ztG*vlXef?{E`Z}k4sLq@hq|X`SFWpM*S72L9uKzNUMIHQt~Yj19Dzk!41v`PlAo;M z2D2vH2dF#i-6>*<)`ZV5xablq%bRg8DXqQH-e6D*EQh z+c2MZO;wNyar3+wf^Dsk`(I1_qV*JzLtW^*q4-B5;o7J=Yj=!d*!L)rLc0_+J0e)s zxtC=*eX^3RY)hs0xZ(Z8q6n;n@%B9>dCo>B(}exa-#9(gxbA&Df}I+29G+Ax58_dJ zo9CAw1RPyq)D6?xL|OOK^V-?VfVZ_HE=8fQ#)BpaNRD-p-^CRhsANH908K+*Q;qbOn^mREd2ologwM{mZ||^T<3>H3_lVVVwrr zy1-&Zs?9jcT)gL`8?-EG7tV%MJoEHK?ZJQq(0fsSKAIq$tIE^#O5EH@K(f7(eBI59 z1&3K*6&%1*N4y->Wwm7Wur%YuH{g1Aw%ML0GbBKJgSgfhkfwV3< z5{=lZ?grsNSZzGONHOC4Le)rVTN@sXo=Y{VR(U?q^=v$|3 zX2Xo4(h~!v>368slm56`sBaf&oHK#EBiL~p!HgrCFK;kS7c6+mJ?kG(F1-MCPqMAO zcZa0w5nO@rynB%svVXVMexT2uY^kqIJ_GAFRB?MOejs`G+`}GxFn8i={lDu0A5d=D z0z+D_Sj%I1h8UhKID2$9$*m1iezDyHJS(n#8Jjyf7wFeUt*@T!BMc4hp4r_a40ZZ9 zdTwdYjnAHmzM~BF-n{*O6JaX^uZ-{M%by`}9%6UQDFfyn5Hp1_^Pl8j0d6jWrq_x> zlDXm$is_reB;1zhsbY$hG?_!?O{Zj&U(xiLDT0R2x46^FQk547;mW@h`c~~7fH6*S z|JE_N6opBST|SaZ)53@zRpvz`=CE=E%spn~0;}jI$s~Q}MK`7(a#uB~-QSNPy=UlGmZ08xi8J-#6hm(CE zvmIlcafb{{dJF(NlaCPW`ek|;O?BIREZ2(RkgD2+ieob#ypFL5jvJQ)-QUK&C^a7` z!d}|=e=rAjJa&ER)opW;wUH^cTn;Et$9aFC2XV3iC!kYtyE<){15Cyjiq9}O+QA54 zBsX93Bu2=%0-rhcRCH`1S%_~#wzyufE#t(7TvvNBoF!T>DTesp1`VIQ zG8qc++Wg?Z6Gh@lsV2}pumvn~ug?Sp%W}DsruvFG{SHwIxra7IV^SAjn7!8k2f})V zA>*c63d6w%QPLLbc#8^HY%fkM(^=l#I;1Mtv)eWWdR5Ni#R5p^h6@&ktXJ?%qA1e_ zEyFWu@Dk>E6UOKV@PXlZlk&OnB^Uun2+ZOdxLAX&i1&&jh&`!o(WQnlsOF8oa(_EDdPNsc`5l&|M*|l`?b4xP(ZaYc{3vE3# zrJZLni2VmF{hUe%R;HxsupxZAnhMR@eiE1B>4gi_Ld;%ct9&D~JQO56olFc&h+;x40%VPZLo zmtxE_nW})2d@c6}j$ud*e~7yZdaPxfw%mgvV3kl`Ac*e`ionn%kfX&}|L6hOsrk|X zAKKYE#3)u;@%B(?6|3@LlwwCh*bGLh54+_q|goVQpis@e5eOq zvT`(u0R~A(C`x(D4!9I5yhXd3K52Uc?uM6@A8&Wi_9+a#9e-QM^BQIcRcmj&-svnn z;AgB~aupuHy2|&+;I>C5P@iA*W`NA^jDqp<&}j* zC_Am%W}FzNG>1p>M`V)4QwuE9E~`PXVLHbXxxIO-H$YyNtWqW@pwv38C~RvLfB&FYz-iYcYn=E;thrtb%HWii>$~+K_1=|SiqYVP}2WFEVCcLMwm;vzt zEYHN%63+7atcLvYsDua=4xF-3jGBdZ92+-pn9hoH85Qzeh(*AHLpAOhQ;3SyHh=zU z?>dNxGkW6Pa;f7&eZ0Quc8q-oN*M~pAvn=Vde@)DjHGx04P)NaUZcrqWKPo$e3X99 zWT3j?S0bg1mT4!S=3w)%Apht4R8gM3j9zZrBoOO@?{N01wDGh{6_a_#En%^FRQssuX|U44_-Sy7#TwB8E~95R>(ML$)QiU=B5&wR z1ddESEMvi8IZ1Y$f!u6Hy4OH8p$1WOl$llY>8C0jyMtD^Q*#^4^7_s}3v0e(C(v2} zH5KI@NK4ZRVKKmg6*o|vkS82TZFN3IC&VwQ#>WI2J@;RT;?SwsmdHZP9BkYUtk$kP zHYD9WlQi~1Nc|?K^1wW*jw!UjM2XAp1%0%&M63)~$8UZ|K{uL)b>dEElUC}^n!%cE ze-YWZq=ras#SQeKoT4_>AzQg!=~Y|jwaLTIgp)oGU~XHMP6v4&8`0bWGQ9NofaYR_ zxquH?8+qsjZbqhGRi%ujK_5#HGM(D)YZ_GF~m@&S`d-CYb5E*A&K|+jDXN?LU5#!2lUx> zscVSfLP)btlb>D5R2lh=x#w&mvDIA3%I9R2-)F6TF*nX7S2v?|r|PE%8(m+~Gc zk)lFgA~%u9nSqk{f}zG$1>hkq(KBDDcn7R(E!JF)3I#$sgHx8OGdtOWN0urHTsnhQ zmg=x9dP85Zv;YD{fllY~Tl&@Ei~pcBUZ35G!1Q*s$kdaJB3`24(kvfakv)>GTi_Z< zwR>zO7SEx+xjH4pGPc3?0=n||Plk_@#O=@JWg4>*c}>&l^AtE~puCcCG1d6XKCjBa zV*}#6@Uagao8yK0APhqahT#~WpBAp9EoEl#^26uiu+ae{FUGqKhl(FU*N48t6D#({ zlXLudU#bUa=1$Bbg<*KT3-|g)+NUp#aky%g(hnGCg3kuJH$26GLA%d-#i%D-^`84^ zm;dOHW<|>n%6b>BIt7PzQoWHvh&&EBxn)Bkc8XZ5oyi) zc}nC06QOaRcOdsz@rikRP;Z~po=P&e@9KC8@;ra}&H=FZFenAiT+a%pH_NiokQM_r}L<|Ss zhcK@>cW!>QT}j&%*GE*ZoPQ+!BCgdW<1 z#8KnCph)`@C~LhcO9$sM^2|DO{^B|928CPH&mA$wq0KVELE380vz~ z2j7}WICF5TkNafQ^jg|@P7+Vq*tq%DPZeGImJ_VRBwJus*wmWZjN zE->w>W_BHD1R*h(Ntly!VX*>hu{Wxc>qkVo7B~TIUU-DrXx{U0p#LexE&4}|CxZe3 zIs7bWbNmN+)FSq_4u(#KMmDDEPKFK+rcVF;U{}>vCQ(KFnm%Ah0SR`{O<9jbMkb7^ zs!GH(4RB?uI~gzot4%TqHW;l-8cR(+%=+%*@biBk2&zJsZk7H=QT4&Z?@@8r-*Ax& zn-p)7CagdGaJq1OUi*HY{c$(*EC7_=-vWa5@3YOHtYvG5?6AyqH7teQ!x0ds%I}x- zd+TnuG@4Cdt?mjyC%|1tN;0**-ql5CEHX@2f?UUM+_A+O{m~6xwC#ywkg~zh^zPqqPhR zB%s7dk>v) zgo4+Qic(ppgPOQgL!8X|aCX@>fW};Uwy-aP3}j)-_DcOu0Em-}DPFx(Sq*0KY|8=0 z(y~Rz%Pj1y?oJbJV%^HJv$B=z&&cbtG_TIuGX1)40UeX#XCjyt1Z0j7bZX$ z==aVTP^d?HFxHs{jWlqVKUYA8GYZU(=_EK~pkhD(_T9! zfAtIP70JRRFov4XNasajgbkhQQl-svJQHH(2+uxT0N6*?$2^Df19dKGK#sX7dtr<% zN$)I?tsx7u#QX~+oN(hIOc*-p6IBx#+!C*H9RUJD1CJ2%AcHVZ*xcA7bUL?W^Z3Cu zI`_xSO6&wn#q0^HZgK{B^?u-Pn7xcR626@uzCB0uCD{6cVt5xf%e6TKN)9|>M4xEN z1cOm3FDA#M7$m>Qn4{J{9F8?rK4lZ@7TA+J+UnqYsBqh${9#&xpz`bDLAi`KyAt{x z_m#di*p*}8%NKs-cubKd{dq{RR5kwJ-Jcbt0bi7j7}^&*@5 zEqV3lf4L&jLbK_leu(bRk28|}KOj0OI}=ln|L1CvjH&1U;kgvmb7dS=)Nj0oG4fNT z0h+*h5Hzw?3uWsHVuXnzRoaj>1=Q*|xrPwa)Xj#@)8tyeJFe-IlcpCjbDvnBI_jn( z7Jh!NeS$-eD>+D_9mdU!&Hsws|Cqkc_P*Nu^Y!`Y4)nVKGbnV9bM3|l_n48qbl*|d zKuPj==s57Di%?A;6-L>yD>#a}bicZXbopn9AnwQ&OWswzCymQBS7Q~ocLqsGbo2oZJ&^kpNfDV;luzL3{kK|Pb zb7ke`x~bpTNHgR^#A696zI8JtV`c!Eu}cC-H3lmR?q4iej%xn|b+-H)!Mux}@n@mw zFrB4jsq1tKil3OI)nMg5)I7pdtOC+6IC#qFMNHUb^(Jk?6sAP9>lc&8wnLOVGq+A1&HLc8&aK9@mQ!^8LH&30 zXDnML)R?x4-%CFX6E!y1acWnfXFsy{KfP;bCDHlW7<{;HOqJWnQ1$wJqKGgR+Q>0$ zZ0^~LT|?f&0vSmx9hAJE@OGkM4yZExK?GpF6G zGOI6rmL{soHn9r}asziWybI(9l=&oa^(i z{W7Q1Uv@DjXFz}EC~PZymxXi61?pXM)VPMf*8}do+s2BpuoQI+<@H1Y+*CvWadnS>Y+d&U!c;%d>vYxi13&5HJ|s7Q`_wL zIWMml$fvIp>Y#qNZ@?PI-o}O*)m6Q;`59JKAo^YJoBb2pvwMQ@0lw`B`1er6?8d?S z;zqpm8M(;RPiSecL7moZi9z~p333_0k1!D)fmrzHgY#ex>}Npo9gvC@Qs7iAHsG4= zliIN!391eN7CF_RN@ya^Ee*_c8#(=#Yd{1Mg%Dy7@jdjME3$Ip@{~2G1zE&Nme^&j z!xP3)fN6nMwJ09be|7huvT<_pj&WDfV6;{9&gVDP9bQFqO?widfbvgNTaW5*7}PD= z1~(OBTg>#<{??K5NRAt?tgs_#Oht$y3eS-!6d0;ZonrlM>h3;EG)uBXvlLwr?CML8o`@fT@))JO zsV49uSx_es;x$Dgxl|xCW>75*gwb!EKs5)LD>g|y#5Cb)ik~^OhqTcDG37We*o&bl zr@HRz=N#4v7wESor#jEnW>Yhow2Ejh`o)gt=)egV9Zfo zw_Er*z_?B-pVV;x0u?N?kjh$oHH4b0P$fwT2}Ok(Avk_$xlh}l&GFI!S8B zqEn}H3W48h>M#irNVI)%kFep=c9Buj*JyejPjudf?vDMJ1y{1y@*Oxt+!N5}CW}^3 ztuk>Xg%8VTrJSM3|JG@nBkh#yLBdN!H)ng}&tn%?z=)Q$#pI0sXP5`xwh+wTwpW;% zJu{Vu5u)tNd*s5MC-v1o)3uEOKgyp*R@+jdr74ITFtWCBp=ta5R5nD5ylTfXh+~(Q zZl2kKIsy=q@Gz!(EyZ@s@@}~s>2E_GRft@^nz&k69b-I+D@N4=?DjB>@@1FR+->Wz zlK8#}uoPSF_2#I!D2a!WYNdbFnmP^pME!~6^yNUht7sYZ)ZjhlE&AQMQD7bs)I!=7Q>wFEUaYoBeY``(%_RX-FE`9rG&3d(_2odX(?;xS}OE}cV4R>a0@SZw%irV*p$qR;Ze$7-^|0Ju}erW}&Ke|?f z*-d0Hx*O542o)iLQCbUfijqv2R6yAbR(DDco);?? zcjC$j+s^+w`v_FOk0$Yh(4wCw70Z8sPz5LZA5^+JnW}g?nEv-$O8NS~!qxfg>6*^D z{h|q=<&nfTL#zGoEQ1AyCC$i5U?s!zwmL>=Pq{C-k-umHM5Dz4=HHb2zRgTo$Wvxs0eRDawAsbZOplRp>9V|7cAh$fZ@+*xlpWu17yfkeBx9h^+r0 z#n-xyI0wRoo@&2Ltda;r*yG*d)pE(jL5L3Jo0tgcw{AjqEd|keZZ5z14{%6EC|bMw zYF}_F-7V(%cabtCBr3BR&X?C%dGyz@BF05@dRXr9aT= zOqzI4s-Bk(z)N0k{0YZe_7bq*>xMo4DbC~(zSHlhemy3Q#716PljknW%P9$bJ^j*NKzYjVEv zwF>Sz9{&8H-y#Qord^mL{}6rQA7;-BgbpBkF*eL_hSz1Dhk(jcO#UF{8|0C*gzDdH zEg}Mn2wc+OtonGe40ez4BXYzV+RBioD0CLE82Pr}fs*&D_G z)HCjg!e9%3aM}68od1cQp=9dpYU848>LT^uCH24SsIu*E6d^>vmTsp9&Jwys_k*Fz z5<)N`u&8h$xgVE%P5&T5=A|p0dK^#JI`+qJzgbbnmwtksIOb_RnW5C;IT<%|cfDM5 zH?ynb+G_zI+8rTea5Gp~L$w^ca$7q{vB@f1AzKbOTB9*S03DvY3oQ%mT936STm48M zZKw(1Kq(E4FmrS&&c`o?(Cf{;dlK6SLqR(pL%UqV2Ag-Dp`5t!0>!Gep)j30YJ?#a zqIPbYW7QGo18jhFPwlgm%kl$yP|NN=P=Leg?Vy=+8Fe5=*I6RD@{{eA-EE)ZbBmJl zD^oEKVJa$cnqQxRRxU*#Tv}KGVcL)%)u9*TiB!G6Fp7MY8Pxit2yx7@YT@Bp^hGTt8$(C*QJJ>AYr8swn#qpGqf+aeWiyeD>b1#Gg|`m-uR<)Y z@%<8#Rt}y1?j!o3rDr^f;F_n>I&mBEA$#x^kBf38v(A7cmFNi6d2;49>pj*`xpdBw zA`>InG&!CAA`Q_0i1M|RErW|;7U}gP90ui=-k~x zu-IcZhGqoSjQ4Q$0~h>zA@#l%`lE;;eBEWfe}evx%leMU#g#b;8RV+9aPe zTslM_#--`VVu-cLmBi;MeZ)Qxp+W^<#Zi|8k*|qO8V^^+@ykjQ%mNQcOV>PP{_Mjs z`kd{+iK6!+piimdREa8imY|{2T_SqHLSTMufKkN>m39&-pM!cf!)e--rBUJ%uEO2F zVagU#G;;nG`|^~PXz;&R#4vh@T<4U~6Ctg&UbFw7uvfhtK2ZOGJ=_oMx&H$?R<^V= zw=q?Aar*iGZ{*9_|GX7^vsRdxO5tqBIg*9_2dUW5%7qIn<3Uo0Lx@o+ky~Rrf7(sA zdJa`DAbH%jK7w6^VsKLU4EpvPPWVr<^A>fGfV^7!EJ`@8E-Rwf-u-oiVo1l)b@|IinIe@ET-0q?FT4jPMw{ zGNQucu3d@);k5TG-n&J=okdixP@kN6Uq>M26yiPRXv}IW#PIUHdroxJX66VbLtI$b zAxcg6PsY;7(?TOl{;PH)Z7)Ma91UVVZQd716k&_{5y-fixvkh)FNKlfkUaTMFs#5HxVggu48D{;!*!?I>>BQDaH z^oZeKk3wV@I7<)HYD!i&s>r@h@AB4Eie`W-?=$F-J9hmhtPTPI4}xK1U((NeL8U<; z!h5PD+g+1oTd)1>rb?0#apGoNt&CtL^1^LclEdY!2s8|Z%` z#;E+4;Qap)V{%lr?QwoY=i#kKuN*kXoIxpRi-o;Jlbpo@+i|iqc1L7LIpy*q=^78s z^(qq*{k2Ut;&0HqUpqq#I@!eWUIAfFDB&3Kf*`jb-ylrp-REoaiYmm1I!D>BM_Kkq z)xDp`_ufEygRW@Qda=8hdJ%i7^%*FDE==^nI!pkWj#?e+{!~Mq30k#iJ$6ti8(8ho z4firySHTXnkZX+3*v49?Eiy7r=P-|WsfkJp3)jCE>UHPfa(5!@w&3*ENi?@fr=2#- zS0HPXH%_@W z&VAFxitI1Zt><8uGK=)2gF~TQy!FpI)Xub=)6&4whn+dkOV|cHPiW)9A`LH5ARkiD zWr2J9+1#t}SS{7IS;bOzvo6y{=G2!xftyXE3EviR!fTnjVM4~R(^94`<3C!(rhdD; zM&iWKeGfGN8u zrCxBRUU~_SCKLYL7#*xkZeWZgkh-n($H_Rfxk5)~xFe8>6Yrz6O}f0&5#KU-Jp(aMT&l#taxCX7?qBHaSn#RXaAfY&iQ|&k zAIW!ywXJtEOhn_9h28A-=N@N)JnwCsub20K>Ofw%ISA1Fk0eoC3~$|S=MoV7_Y1qn zlXN%73?CK&{Tsx+PPALbXi56duQn0wrf6lV2N}A%00z};WkmxwRWZqsAsa=pl_&^m z{00>zBttDVq{l+yT}f`1R7nO|iV+GH<%o)E(Cwyr4aTy61nJ04$)*`4^?{1?S*B2P zE`QswwRIT;Xb07<=#Gs3MMu_KBu_au8ZmC4t_+W9%$)s%%prubb==) zeW3sat(#}(ruDR{>yg~0rL zy(U;G&B(Vg%?)G=FJWR8a~LiBXQGQa_{-z(ct=}gjY@Kl8k9PX_ruf0l#4>SX!pCB zij==GwiV}arx3YZ733SZt>39T)rFa)OXP{c7Kn*UEa2}4EfzZ=Lb^0_r_@uaTKH0t z1HJiTp~wK0D$R=lI{kL(G=pq#S7X$cH8t?K2Be|oCcSz(G>4Ptp7^1|pW}QNIwAxN zxqfig9tT6}$O8npB7l(>EfHKOzZ&Zk;nq-l2N4kjBkbuSbwI16Wt)E#wjDFZkS1J` zD|b30GFA4R(v=V5wqhd^=5`(r?g`7NEze4Ufcg#Dgcn0kTBy z@Vou(;3l|NHXR&NsWw@Agg;3Yxd&(@SU#G`saRfE>5Y!p~$ zY~8D3Aa>O7H)4f!oAb^dx!mv{qD1Z@Dc-?JHD=Hm;?@h+upB3S1tR@~z984=GqBwBP?y3z0R%00ah5RM_!5i}Su; ztx+W0oNI`=#U=GbqOwJCZp{y}h#$b-mIcu^3TL4|bA&U=6H-a#jc`#8`X#>iOu~(m z0mMvx;=p8gUVJr z$%t`_-g@%^)+i$n)eRB*Ud!DPW_;(XgHn9wo1&e$suga&F!RdhFnC8Bhb)rg<_SfI z4bJb^2I8}t*+^MIeo0Jm(+R2nd+eqbB~|?X!`NSFKtQbj32XnzL!ze6#!i+FKl=86 zH{nfIku3Jl)2U=gk`KOKJoaW=0{3P| zQ{K-z7_FO72Jo68obUpW`#793O6D*h3Om`1?0XW1*-->A*%UWPjMF1vPHhVC7*G$P zx5^)~J4OLA!fmY4%-LjN6QJy4*E29!yLZGNAnK@lX>CgM=P>)!AJSUwTJTw9gKQxG zq*rT2+T?fM7%LrvaP5)-a!O9ln4g%C`{=Oasy~sN>{Q*lI~+>8@LU^IXjjN>+B^6G zbRfNGZR(l5zoD-%JOs7ga}GZAc7y`L4n7b-{-Anj>>ve5fPInPr1#~4;bV9R???rd zf##xni0^0y9E0X!cnIx?p{=yY?U1DieE4eet$z0q-&FSL4|u@U$}nsrdMLj=sdK$% z;cg*&XzyGTb)gJ&f)Ippi#gn;4~b`xzcbdSUB{+5_e#xTQy-`PA~y; zh7`_9bK9T?r*!gdPjcycyhzQuKR+%>E@15Fe_72uN$kM$w<^U85=AFqX;_%=S(c5++)|UAb+~y6 zF{h5L(B^%rDyDa^^lj*z6xo?aw(^pS0hi5&LC@=LjLje6-QUK#)HFM1WI1-|@F2N{ zLAK-H`Ov2qrPo{NZd~1FCuc$J^5wRcG@Q0|uOtZ35?me0VhR1)bbu?q=?P#9Mb zwYI8E{o=mRZO*!@WLeG4Rat99VS(~m&t7eOM%exJi(rp{$j4;I_#+AEDW5#}57rB) zHrxkJ9`*}t-u-eT7lz2oKp(qW&^Xqv#dcbuXgFx)1R-#=FpFp*viX)6`Cn3;;3-O2>s4%{gKEM{X=<=Enz+BPt!Fur z!Bb>J&{VJrbzv(DZ;3JuW<}SQ1aYB$>GICnsf;JWe}c`UB=#$=5Fy~ozp&O)EEH@qCS=oDHw zq+iVBYQ~*}Z4DwlpQx-yk#AWqQ~d+WB}8&N<@!pSGs5?5#xd_kJGL-wLQT%*91}t{ z9gyR;*F~N%{uV~(B20^SQ84S=aT$$~Wd6H_TzeWzHqj~UOLi0wv=bJB9tPUr|v@3yS5t zl|_o#9y%x$rW)^io1%SgWO6O5ZR*rgh?}g&|3om(J4C#!K$Ou(#!de^3Z#C}^$Rrg1e^ zR=%^49J>bZ(r-R}hehD8nab(QZv73|#7m#kKe`D|#7ie-OK)Hb;m}v>O^yp)q3W`* zPQC&=)@O-2C%)0^jS3&wCXew$R276cyL+$LZIDz)MKIuv%U){-|28M|K`&f})Pt{u z+|D!>zf-)F-~QVbALk0W<6?AStYYh_HoY%ll7~arC8@XY3qm@jOVNv1Y=JBXw?#Km@MeM7MAC$v>64=;Y15z!0?>1Ru%R~4?i`$~RrXp{OYj@Y{ zO)RI+nBz`2^xu~3aSI&0O?j#`F`j4Xqe(~RnAnSijs7$l2q?Cq9Z`u^em#&9W4lt8 zl%v=Q$vIhL>Xas9+=j}zJI-yn>YZ-YXf;H|tJaX{64%(XE7pxnp5*RpKC`N; zyaK0j`*}oy>EG=IB44ftJw5?%`aQ*;_Ud-id|Tgtr%!9fe3KIOwW#%};^Sa%luIC> zmqGTxPAI`2{*kb}2_1<9jI2ueje)>|AU91T!DFypCTMX5HQHg(Qn6=$ zQDXbgySsub2mC`s(tN z4Ocn+Og{l!u0@ro?c|tVvHMHS_q5?H(NqOgVRcY{-V5A)Kv$+C!pF{}B zRv|pwdb23u;}1UgEsB;CH2bb;ZR-zjrURB@zo8E#eHA_DN*KohhhkcLFPBH~lUOX+ z(bRy06RqxaOa<3&##Jo9bFlhD0VhXFlI=6Bv$XFPGX=z0ItJF>^1-DP)}U;KEm&9f zgor7uQvoOpBAs*Up~@)t<$Sr4k@Y7@(BdqSX&h3dEVdRewf2E^M68WNMvvSG%( z&+37sXE{cp%7YLC9GrTVbq2(%RfIP+c*bX*IZHxgVAF5+t

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

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

e9Yy+$?WBotD+=cy;Bf$CS|h@$$g-WwRw$pCp>R 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%0AuT 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%0AZz6}`@}C(k{P*>q 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%0A$oqtWZ(TPN1 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%0ASlEEB^J_* z)_CX0ZHpn^CKIU;ss|k@u5jXk01Y)iDz;vtFQxX)lRpt!zZn>@{WDNzoEjd)A|fZ+ z=X4OzttKa_l)xPRWCCen7xE$sC2`tr_y${v3sjvF%RlCC6X7KizS9114Yr1qtdI9E zaTT1_ZcMYWk>z*ov@!^>!6ISgOcj|bBQICzrYi5Ly+nSZdz#`DmYMY0Qbbtuk@y#& zQ*ZWYU{l@vx9b_4J;i56Zs3=~oCy0Jy$mCTm2;a{nae)O3Ykzg(tH5ih#QHRFH7Pt z*$Q+CHfg(jT4xA{!f9wsUE-Z8l3ZKj)(etjJk{U>@>hcv8MR81O723)%Vpsy*I~XR zmYhP3r8^9Tt3tx_L%)3CY*1><5l4{0f%GsqD;Q|LDmyooXlr# zzB)Zwi}d_WkUB?|C1FeX2{CN>iL{g?ytcYX964c7uYdf{yKiqaC}V7-dEz@}vu9{{ zQ>?>h>K~VcTcpskCQQ@l`f5zibli+VG3;J81x9DSOLp8A;x;20$Jm$l!7OV91<_h? z)c+VTY6|7YJt`8*mDp0t<&vmHYe4+@DR9HMYveHGG(#0vq#CHeeM2l;0HNp#O2tc` z!wP?*VTu%J!}J<>Qhn(c+xC54Bja__s6Jf1PGmeUKxf9$tiajLs= zogY3ql@_+hR0x?XCKeaMQ1EgYx7q2)>`Ep}!>KEl*y7{HC>8#_HZO;zB9-Ugw=%M**PrX9|WW<4GKEOe4z}~#QX4^>@%?)kv zuBip!pfFHl(mn}<>7p0jwcrY9wL34=O$=hg{uW5%n*DGvEw_i+$OXq90pV>;S_NP0 z2jNA1BtZL9wQjE0kQ>?P3#ab@e8Bh#Um1YZw)NL(3CXJK6-{JTQYu+M;`TiZcgXOJ z?+z*bu&i17BdIlN_SEK%Tc4^Y4C4b2>lFov#qmT&b6TddFuEX-C#}}GKmsXSmQKsg zq6-wOnnE=`!(1J=a|SF8Gp?4P4enXd47=u0Y5*pxORr;1QZd zbS`Lzw$LVVK*2IC4PN;>Owk^GH71;gF6xBUMAt>jfol=Jew0o^fHe!CV`dYf;Eil> zO@cLr@8yR0J_0H9`l0i5|KMuwS#UBI%c{RCHX93W!>+d1EGQp$5M-f zHR6fDp3;s1vuL|!eyj=r0rox6xdkMrl&9CBZi*$F7tj66H!Ud5M>~=)(mKua;c7Qj zyw+wVw#_K<-8!aN+q2`l3XC1yV=}#+V_8o>PlA7#->T@O#!S%~Ck)ca#*xS4i$gSq z#gxQPnA50FvR0;;T9K@zPDnS)#gX;mE9SWT(5I$aplB4SFd}OVwK=D%MOm%f_bHu# z)Mrklbn&WOC@6iszbP$py3`>`OGL4`(6lQ#v=zKceq)985zx!;RvxANaxz zLxqfU9O5HxQB@TfaIv?;RMCs5R_=2-2>DY%xYIf0R8if%0AZs5CI&tw4O3&3Y`YeS7Cwtx$@!w+n4Q>Cj0loFIKT}n; zQw2b7%NNN2D4nV=3d0~iB=FQ;AU!Vm#l%1AArCxt&-L}|$WDJoeXyuT(^jOhNvAbg z{mvF8JJiFaI+<6~mR&R>L)TVhI}*{M$C~$cVF^D%J@5OA>y2oic(O3U!rDw8CyOX z-Yb6l6Ws|3-N})*--`LKX3_7;_*-uvYO^C0#yg*4xirzP!$$nN@rGSF6#A12MOaz@iI;^(ci-)UhPmNC#%`d@s!pI*eb zr&>PMS%&{3m?;q%je2GuUez-)clYy#N-Ze7z1*JxC5J)*7q+8ux{AE6Ovnk_aw!8z zihG|-V#i`_7drOwEUV})oLYBT+8d~p2>3k}%cvV#Z6vXlTaX3G>r6SU-BC?Ec9MU- z$c9%kE8Dze6*(ux9sqP&_O@zi$CgQETQlCWRSF9i6A^{lR|k#(zcmi~SWd zo45CsmubdOI}>_vu@yL3&=F?JSU9&87-tJ|4*MtL9f253vsdJ!f2R4>UzKndNbj^@ z&kiUTrh`nusvh~>`}A$ISjQrLJmt=ack>&p%g`%Vm$-2aIA?dM_e|@OJ<_bg>FGPt z@Lh=19>JFy;uR90RNl%XWX0H;>SPj-ffJ`x(cNPc+)FpIpYLRfER9So7J>v382r7F zw1I!qoussRSsCl|bw!c6jnR)UTbLf%lp zHQ@5+g=uZ7gkwZz%}u}i{MwbHgu!ko;vI>JD?3jy@Y|ANJd*5rJKljFD%TE)eC`9v zdatJsU77iLM1sd#Kc_YVVnS*R-R5ndijb7Q=5q~yVAW$gKqGqM#$J~hf?luso(2az z0#S%g-s}Ws@jzB*z<~VCf)K8Ml%-mc6A6Pm^RZ`GVLTHGG6>2+qDucDR!F4szzJWu z3C)PAtHZs%ttm%V{s4tipU1Wt+6iCV7CUmIJg*-9`770ERC~>tLu5h)med|*FL}8+ zn^E{%u(ff@xCQ#MH~C^k!7ppfBZlIW%X6C6oV!yBcgp{c=`W2nkD^V{cqlWk7%>Fx zEnHbjP?32rKQwLA2^@z$5n#wwGCpxT7ug;`sP=wL=gO}>wbyz~qIJEFv{{E%RN*Tb zDO0X=btezLV(yN93wMcXU&?s;|0rwzT7}JXf`NcgLW6*C{I4Po4Hh>?4OUe*V>feq za|btR2RCyUQ*$RbM;Bo;W2f&Q|6OL&t#+Y+CXD_WfoWrG+d=jRLbyIzwt%?s4@7i2 zCB~9SAo7=8Cz@8{<SpQWZvnWxyj0RW0jBZ9f;219OC6bk6gB09PH^YnW7ns? zJ`)R93??V(&npAr#kLANPHlGM_%Cehz^BAXd*gQY;K_kjZ{^GZgE2dYcbaA6Yxiew zaTYbIBKJYIFls6GvIsuWGH*2w&L8LS{#a?lbCme5lg04DG7*z=){Kx4tdCy>K9E=4 z*K0#=+Q}FUsRapZq^5XXje9Pkd|Aa{x?RWvTzmGO@u!dorl%eGNn+G%?I?UC7}8~@l|n}$(QyP3*Ao~3M9HW)~S{97cqi>{l=d)=++fO1lBIAnvFIP zqNdSXf?YPhj~hp!f2sra zK4nGu#`C@UPdPicl#QnCGPc99clm9RMa$fGqw7U;^&I)ZcgrQ z-%>YoWBdPG<)$M4A1XKhtm0q4DwZps{-Vuuh=-oa)09&~izCVSDl9^f*%ys#T+O1Q z&xcAPeNsDf*#Cp{UCUTs&)~d4`1}6+2ya9HfZWGUvfvBGrhI3KrXg75vA}+`m29`< zGt#0325i^14NPYG8`QKvJFDvb9FB%=S7mCeYQ^5)G#EsKfMn02W3loLNMS3EF$g7M zzrY~O=1IXdUl8AQx1pfAJ?u_e8p^<8rT@am=$}liW3$$ps(JgK4*lh1>_yJqg?67> z;6E(fqUcGy3hyAd&3>KkJA%qRWPLlCYjHi9U`YrvHc`SQ@aH*}n=%ddSb}qmz=1LG z?dje`^`rVO1@!W=cl~$oE|NK7_)DER-Pmn6$+v>_Fu?lDH>Cp=CTboF1RI?uhBO5c zrbJFqoWol}z=A($TP44b94|icK`N1b69QX^_D3Ova*7>eVwxk4jYc(ZIg^x(CBKO3 zZFFjc1c&TOVGo}~!#f1`qA+1$kus&cB{msB2*iLAIT>9b(i7TZR3qMyE!)6Ea}|#k zYobd@`+Pao1LA)Uw0axct>1T`f!}II^8cSeYr0tfPr~{uPbv&3A@jHK(Uw4yA`wAj zV~Ip_NO&-Ve7DU;E0nZySyGpu46^?Tn7< zpXZ*>;R|G1hLIiG^#LU7&5Q0%=4(3^rY2Iq9nM??3>Ioyl^Q$pM&eeN_23I z2UJCVd9j;0KPz&#DeV-@2z4mPNx#n7I6^a|pbPp+JJkAx>&>yNA}466R5xF^vi`q3 z3jQNaFF~|rPQRn(`yE02{~~%W#!lZ>lK(w1?G^iF{v$C}7l%fcH0ItRLZ0SIG*w+t zd}*V|i62|_(-MDEI&&)jwIzH94M=W>5idT&kMO>k=G*c6^1A|&bKd*2)gNS}xgNO> zv3Kl|aO*jvl3TMbI??hx`juX$PAYzewl%6q0$`nCyE2kG4Zq_#FfSoD<^f!9atcp+ zV~Pj-iI=DHY6xHfg{?U5Ak`y`ZXnld6FMNb<>GMtzI0Z+&Ml zAHR^P@0P(Pj3C!zSL?3_6^{%>tl8hjI}AV5Gc;Xpw6{Yu8bA9F&hJdrS3%rbakEX}G5-9FGYi=mfj^s2!Qy(S<7LLPm)A3*_v`Hm3FP3F zGR{EnYy_{pGQtj?==l%Xp${{Fn_Uk;LNxq@?J%U=H_ZiPAsVj1c93+YitE&hGG>X3 zzl+v+S3`JNaxz4Sh*6I%L>Jd4HfUs!P32o`1xGxT@nF!`bth6=q&qU9$+2cqfEhZE zxDaS0@S$*_8xbYbXRnq4{^2fF-}5=lw$9k`4t8>RO$|zIm{iH5=2JyQ%({X)@GKf9w)KKJ8rVjAm_BbVhEE8seNt*oi(4Jk~BtN9-qvHp_yT;457wK58atn8~=k?1gL@RO^cg{*j;^Qy3{>({C9JYv5Duqj}Xku2-UsDsZ-t5oTy{W2`Dw({34RfEIyBq zmaKC}$u@3`O|@0<1MYU|ev%P+h@99Gq_iSY0M1Iv2_ z1qURAXI`=D1bGK=1ctO{bbbuXZ(lryf2{gg=BOE}0*DG(Y4v99Cu~<&a8c`L8~b|f z>rjHX`BE86v}yP~Q?V3lln)@%r!1N(mqO2JtqP{-n^a}(mNGorE|J6>I8OOU>N89q za}1uyhYx4oeVjA%lK_jA{ZKy&EK4qMF)*sLoU;gjSn_}yOhMRkEx+x+hEQe2nI_eX zjVDA&a#NBdVL(D>oe3;tacOzB^9N`z`+E3mw_bRB)8i@KG zat}p$Ma<3iT%nX4z{86UQtuQNb22!ik8;6v{W@q?Qm%DDbd8J6_KI*~7QxlWejvkl z&}kv1wvJj0W1{F#g(gd8w^6v|+>qd&7r{A;y44@aTMJ`ekVqdG*9b$mY{68p5^UKf z>p5SdTy@%HmmiZ~olmuu`pfc%yJehh=^1}F_#`|o_l6k*h1jiGbO49a&l*pJO6!mk zrgAH$^@UlQP67k#bal9es_5c$pY9!QprOag(2M{DK`>vFW(5VqE2dWLvicbhc%y># z{#^?&X<_8WnrZF<|9wjppSy~}!@9TV#i9L5+bg(d=wcrNHLz60cC9;t-zIZOWsm)_ z?4AAU6Zg3?p1-KV9X`w{>+n{=L`3rzH@NaA6;1Fi$|oFG82;-0N2WNY>+kk{%>odt zhps%w1Kq8DPp!Tetw)-UiAd9^ioAWrqEX`6R~#9+PWeT&Z1cM?rkugQ#b>CVJc|11 z&QRL9NT<#X`lROU-A8T~ABlQ}d$wdd{vf*TI+63o@b-#j` z{H<0iqgv89iQbEV?>XbhqEbLDefq}P%cd8B-OpzM-<)s$UMYeMz6t~@=-CQm)lTM} zaXB=T{>lKia8@1G`$5Zkf1*L>aG>z*tfPoKRn=Z+LK4iO2RH}?7Z{SfH~pq?$Bb=@a?MM@H(X=f@poEu0s#FGY;nidI>k`0s^oV*R*e1ogO4ZHyv%IrpAVTz6?c853Wo zPpdK3Wd6cCtm@|KqHcUGSe)0NtT-na$MLCg@~6VH8i4#WcDuz-D>+ zGJ(WPm}vc|uLohhDw^3@=YX+Cs+SrX(?N7%NDsl`ufMXg0~M4G8*be!(e*U4k8V73 zeUTZ-gpIm|sgvj;v9-*8k=CUP9wVHvSOD*=yzms*8aGv|9eobYt0nu%Cs~TkJ28g^ z)=PZX3JwK&?q?YZt}51sc1uTwO2HILyDEk8;>S%I$-iPMm^Mq}h9Qr*LC=26 zYm(@n$DPfr!qIV0?kG||K6b;{XuX>5ul`jymt!w9iSJU58J_Y2+pm;fXg)j8-Zcs% zdD_8{H52im(2wUr9ezp$n~ei0If5Blt@F#4lD;`aWA#ta-W4_uW%!8)yYcx{cDS?1 zs%!QSf@P8kcW7WQ<^aMT(8s{3x&`^KM%=bL$Pz)-v`+;&eJ*D^U3|Ul=tL12pB)q( zecr)ZwbBCdUGAE}?B(@X1&j_1vv~u#i#@L{h^=qLt;7X>qf+F2jz-tMzMpPA7V;iZ z86*)t3bzRL!IEp??F)79j7psn<$JEknQAWay{wV1+&Oiyzz}m(TgSpg>gkBH%#7#b zf`~+i3{HvN^+jNam3RkbCO{yN)w|w5P~w@EkkpzlxCuzZA>jeeT9Z zHjRt70R352E&`t(a<_bifwc5nGcb`^B~41ro z5?mWTv8--lyM=5m?ZBo5O>SJvALe%t6j2lfM}*&&aV~a+;HHaae=F5TYjkikzryQ) zdlH%Q{lm9^P;8)D?}_fllcF?am_)dg^`OpL`_klj)44=)n~|hbX3g^A-y#=gZNQn@ zOA+$n5}IQ@S`0qMMa#6fDShk9F}LB=o`=&M?He-%i4d7NYclPxy$tP8`I~T2p+qA&&|b#)^!sm5Q{` zd%eAPoBGUmtp7~wJydu17H|-dYZwp^p8qpiE83a;*QmDF#1lskpzQP}v4bn=N>*vn zNkN82sj-3+mk#5w$5jz2i29K=jf~0JY3!*AEjTRr2TO3xb)&g_H2&Y8_!12 ziwAqmY`!Nwd@mg@h#&uEZvsKnMJQqerabp(QB9;HZuL1a>#;}t`JhQLB#@DY@1>*` zw!LEIuw}<0?!YJaNvTpX8u&0KE13=9_O+2Og#BibSLhcHGplqd2c>kHWbRa!*E#on z!@DpQIhZW5Ma-9-5$QYo=F)al^QxRh*#URiwigx&*I-S+icVK}6*IdOVFewCnYpAD z`P_=+`z-_I2S}`u)Kc84${N5;gp!A+d!#XtAXvxQv*YYMlU8Yn2#`fl^xIx&95v=w_P4xYFe60Jv&Dil@jO}B@{>^zfQqkqP?Mlg9YQQ!9LyYQ) z#n9fh9~_eQGUW|p8_cEEpt`Q@e4UwUWjZD&hx zkzrO?x13{(`E7F}njhV!x+VB+c>rortk>@sDK%&%J07!Yp?nP@M#cBS!fJ&jnw3XM z0XViz+1=kesyZ$w&cs#S={VLYc3DON|GbaJwJ~%L06@*$8F_9ReA@On6o^&kY9nOP zrH|Z622#fhv+R&p;r@7R7!%cg%+`two)OHRF=Iky2;8w)x;5dSQH3G;r^1&suP_lI zsI3_3_2|hBb$ysrP$oQ|vrft>3Z2$8y^@1NPF2&Yy1pFnP<)~V$-apWafpLQ8nqRt znf>aW6e``0XX-4t1QMab{KxTj6S@O*CawDR8O`oI!6Zml>^G-N+XO>8{jvM)^JM+w zmgFD%Ih6jOq~Ox}J!bt71LENb7M zhsIsrFDR>-E#@A@8kz~oD$NQ>Y}8QL<^?&FC@D8G%e^K7${8rWmhSnEo%j2>%q>-# zRi-zAa$*x9IXDiwZ0zgA5*acRdKB7wTQt_gnd)i0mwg&6_jHo2RAtc(9}QtKI-)}H zy=D4-21nL#k=0{I#i6Zhb>0Q_F5-x$0F3}Ow=4_|3;7)fqeCHtx-H*6W-K90)8kh$ zD3CXkDMQAvn+Z2nl?(L{PL2W#S`5{EnSIeszxGDZ*xn zhKYorC~FTPnX{d|*`xuNadnQY)jCkFvVfE0Pgp6(}=%jN6@Z!8H_-_Jpr(Ux;L=Wcn&DF#Qo< zp1El7Dfv2KdyULr?y^lh8&Ip z)0%#-HXwl8FuUBxy?i7^2qmgfz#ThLE@D3D>O?=A%IxaVEneeWDblRW)9(GjW&q#G zsON{50q|A7(B*Yk{9X zQyba{;82n(jl{42m@C4DL?T){_hicYZF15kU|fe z!dN9s%%z~NsuSJyt3Pp4BVPP3)ZDgjCu zF>17`3UR8`s#B-6t&|%io@e?p1U|%u73VAV2VbLNQnZc+XVpINZT(-vV+{Ajb4$s` zi+9r0K46*PrkFMwEP~1p2P^h5y3Pmd)IT5}Pufl&_dID01}}a{Dw2z4m{81m(l4^a zKW@~@H=hjR(FVi|GHWGJJUu-LbXDwsm*t5OJP^kS?AN9JjOnd-?Y#UaO344KhW0c1 zv|#F|RQOlnz&qN-MOyhQ=V#Hreb)>bbCgK=0L7L-LHPh#SLH2?Ae{^eU33bysyIjv zec27N5o(oEwUM|D^(lAtN9sc4LQ~lAXd@QS1D5ZgZ?7>#94#s>Fe+PLouVm0+j$Ijkli37BXcHZ zDb-)qtkL>@ja634#F@b+&RF;Q3B{8U!62uLgKrrx>(Krr&f{T9Jsg5_aCYiR{9qc~ zo#W=jxnt1bLC3o$*`NRmh!Ndf-K^4O?pCGP6MH-X6%@K1Bd{~eVlcbTSC~Vpj&rj5 z5JWE;Fu^g7OQXc!u&IannlZd%or-alA~QkWh{!{gqSW31PDx=%GpxYYT58PLO@y21pM$dl`tg=lnYS=oxq?#$Frm$|O zRKsHOES?^2#i7nIaxl```T~^3SJREMw^W4&tsWLhz|{tiJOgGzzhyJWd*_tyCk1nL{_}F}Vyi z*Kq%QQg(XVbhKIw7+DjK7`9NEuxd5|=7tAgo@8ao-Vfr*Q?`Jc+fogce*mNe{0W|p zJQ7&WY81pbDN`NaGTi-38{`FIzjn#Z*g5DCByXwi;deC41_7*ZZhMYiX?{y4PuJ}%`^dhkKw#s_ z=1bCJ(U=ja3UiulBw&_nLc63^5AbEA!8Z3w!JWLU<_)|=k@`F1k)WDa2*t#u5N##@ zFd19oY$m;deW7n~VMG?px1vp)x?GO!KoaV#b-xsa;?go>oZRO-*d106v>@Hygm!?{ zxgheDoYs5)O=2HbkVly1e80=gvXA5f&2j6WwPvbgakTDq(-ct+Yp34b1f2K--?odr-;>-xr3 z8aAMGqjYztG}0Xk!X~A=Te`cuySux)5osi(8wG*?!gKGr=Xh?MKQn6vXIL}ay?^`p z-uHc;?^~S%P65Wvp@pr~{&ko*r_b%nKM7R9v@VI1mLYHs4+N$qxxt=@9ST|E_b7eG z7W|I%4TIO$={D1z0_F$4`E?Um%DA*}*?*AE6blV83O+njhcFKo1l~is7;07E>Q0pK zdLb1p=*>Y?qNG9@t}W`%U5|y`IWnZK1KBybxcF*>pbPK2deKaiKSO<;g!~w87Y}Db zbafB}Cm%si)I`>+5psO^gT=k?JJ_9I-5v zUR;KitQ|MI$3?+0EL zbI&Yv)fPy!6qU>2D&lEt!}DZIPPR>)9xL7(D{7Pmd}wE@REVxbz`KU*@=;=<`z3z& zIxGexZ!IgEU2$%mFVx)xo%3cNkElUYw654$PlsJftJgWZ&6eoca*uO8gfxjF?&hTV zPC@v&04}#W@}`V>eCwGC}gRJ{T&5Hi=P)w+wAq?@> z8=m=~AuN|~-Yfy*V!o-^m6*dFR+1gmb|*2x?}Ivb;KLSB+?_VTcVak;G*S#Qj40JG z$Zq0^kxV!U%5FQ;qax~)JVdh7zk=aa4^$NG*5_VFj0^RH5ZHPdhD0UAVfWmodn-1S ziO>*g*v6&XSPs9HTdq1-Jm#D&;BA3slEeyc-xzy< z#y726g2+#B4E0mS$^DD5dc!xK^%>J0H-LaeX4=cZ$4}$_NZs6xQj{EOuzr#6@2nU`4>kK^RJb?u7$aQk)h4+H^KhAX+d?Y zL=fr**eJ#uyg3-KU!ZL#2+xBhL7EhIKX1EE8EI0-nxL7ihTfEW8TlQK7ZuDB z7p%3u_v7q`M}P*E+G1YH!EPP%gxp&m$Okfn7Zj$aV(j}|G_zsegRpjE)Inz7km1Lr zaqK-DJ}+?7kiYyap1rG<_nn|hN2~=>ND_*?%QA=Kd%@O{x4`z!JIJZFz?Yx$9bus6 zwfzL^wNE{7n0MZ=S#_u7u9-(3h+>X>!pX zp{FL#FF$j@#hMKBwE{c8kbfLIRCS|VPgL;=n1A!FklH~0`oN=biB7(b|F72U@dNZ^ zf%aRf5QiC&x)?yB>%95ja%uD_HL()4bs(*t%v*P6RTlT5UtH-q zI#0(d_6ZTqyhmTB$ibl1Sd!v!9+sP0=)6GPYEWM5?M(8Jn_u$Fii zTU;i+dUspn`^_fpL)jV3pIJmDiE&oi9m<2Vv^nUY2{LJ1a<)4V!h^5bZIP({Q5@_}agP zNT%WlzX)aeFm&n7F4wMf52QBG>PuTc@m`wD$f79paTEOcB}y}#&f@@V_x^XjbuCQw zMD1(p^C*lv*l`lhNimre4lX%Qf>R(2X1)#3U3E9dDl;x zg562>ss0b5xm@(4hx~2uR}#NVZzHrwrcKER z2UoKT zJj*k1>v=bg?k6-2v(~-?kS!#x_qrgZ!HTD_I49nQWke)Wn`e8Qi__B-wCeJfhEK-V zI}|kx2L=5jkgAKM9|>;l0^G4v?&OWfz&iyeXlH1`j8xqC&!oO$=04OOOY#fFdrz_r zgUNjbgA}XaGnb8_W(rmM&_81GVMd_?weHB%R$9nyXVz^Z-bki5RVO)ORzZzbJM2a@ z8fi&+6gl*Pc`7X@@(Ovm_V4xiX5zi;rnvdLO8a{UE%dC*zh{N33k3^Z21}wrLvbs` zHW^ZlBqksv?|nfveT(-2qCm7Cg|U57u=fK#UO_p!tg+WRI`U0QRNkq@7y*Oi49u6( zB@_uPta$U`No74=6C9BTv{>V2Ib(!u5e!ZfrJ5A91C34q+?YNJV)8Xtjo1S68 z*p_`yhIMfc^?6)5x^v{M<{b24p6|aoR}8%=j|WkZD;OG@-6al7WI~?Q9<-O&AMcKz z`)KI4e)1w3v{%dws{pWH%tJf2=$n15oru zR9}67zt07(f8(M5;XYw~u%4-fu8ES7nZAXct%8NAsSa4zL>g>u^4F*rkn>Wphi3aF zxJ4R2(-V{Ov zMaQjW5gW*PLGSL6Z0GLZlI!P^#XmVT)YI1Sd?E^M@N%%Hgd^1pCL1egu4Z6L;6#szDwVKYm9GHz zX16UszeE;mC^R1edWQuc&Tp0>Zo`#{AgE;AAI@&Bn}tYSW6TFfH^y;~kDcT?N7 zl#je~>jM_lh9n7}(V1%J=lzxDlMs{pGl%l-i4Q*UKZ0Q3;xPqe4J%uAY3!Q}Ua_NU z9RiVzSOH)={@m>;{T5={HM?{90Jmg7Xlf zY&9d9PIFrQ*ol1DgBOiqtV70}a1IsbB42X^Gi34nb!tBuAIr!m&2zlGC0EH#Jcmb& zUhejrE!ByxiW;r^uwG@iK!?|)6i?~=g+at=Wi8^!RL$F2CK=n28KRtlp^Dr00B+V` z#jGyRa$EVGt?B0?^X-zvqIU&MJQd8yzs}Yy&71VoqxdQ{jf^UfH zqV>@7tPMKSlt!aZ@B&0gFnFFEcbdFBS|AHXgNs;L;!piP)*9D-_w5Y51NGp>5;)sM z2)E9xz-8g|Bmhi`9{9ydmZWfIkB3KJyBsS{rbYr$HLrg&u)x**)BU}QM~jYSx+Li+ zqfn#Ogs!E`g&YHom_p!{-V)}U_-oyy5>e;ZYBH94!I`=%gE8wgIJ;I1X?cVjYdQ;r zkQ>G?S8&f{z2~RLk|~r#Lr{$JK4HMc*Z9vc)<VMTVx{>>kO z@ZDQPR+>+ipZySV*|23E`Z4t!uVAF!6`OY{Q~5HT8!ia=y1(*VC*V<{T+JwhBt)96 zq3ca%ags=sFJm#(PG=fq5=m#Oklx@@DJa?^TIw=}&Q(Ns9nXTaWn697z$#=ESt)tt zf}NeX5ARocq)of2QYoWMS$s6rwKW3HwuCLDSG*bk`<-QV@-2TF0PQuJny-x_wsdvq zup=BWUS73+HXU7~QFv#202b98SGFm7Cx?AxXhHA;@}DyNo8F9iDx+@$EHwfwiT)jy z?7^l+dICVq)WX`x`6ok)mioHCaFqLJj^Z%hQb<$&gQFtPXHk)bJ}Cx|B9uCmNLhy} z-y>NWq}_>g3gUs0?7{!67fB=^IC?jnc)Vn?bz4ra^^~V04gq(cY>5%v?UUy%4dZ}~ zp%5ufa4j4qQ5yDR2Xuhmz2v20)TcbRc`81$62|}V?c3oFpZA>_RieDS+2I9N2?XzR z(7Bh=h9%2EaL({8qcjEt{);%&lpE_0`s7Udju^tuyNKh{4wVjEyJBgMgn`u|KNOEI zoxYKs%qH|(pV-Ev?h3oFZRejz3De*2USYj0U5g2C#I&(H@Kq<8JzePyw1}%g?Nlrs zQNV-**)f5b(cUNFK`H*o)c>;q;~6u4+# zZLHC*L{53I7`Mif)j^FG-*vAz2H!d%gUh5s+M&+c+u&6)4u>K{J`2M_ElRU&tCK}N zH>z6o3=)2GvZ5;dY>aWdlHa@U$)DSQaR_T3RtgpXlBxlcg#R~5G8X1a)?jlRBOtB} z2$Q+K?!VEa-#L=T<5r`j_5CA9K~(4w3W*XFuYd=oQ7LljR-^{CK_YjBDL?9w%X=6r zL(?j8b+pPx56<&cm(m~KE)Tgq^A|4Hb%uTX$xM?cE-E(HUw}!Y3sFwx@)9L3npY&B zr9O`fLrvWh+!1;qtADr?A3ZJ>JwV<-AEV+FFK2d$3^!)Q6z8)gXXM0{8luPbJUfBB z7>vTG!jN)nz5C@@S(F1lTMtEwt~%Vxl8->d>j&B(GUu&fXY%m<=M$DmZ>3$SH>u}D zZ$-EJRXvpaeN?Dw+u!brUcrQ@Vns4EeujsO&>(MuHv>%buJ(Ar|9`EU$0MpWC~PoTEvoSCG!93|0UvC8ue@y{9* z<6=WR2asbAkn?YXHv0dpZ*1s));xbC=NH{cjT{HoujhU3057!)3h=Zwa#I+!Idn4{ z;SFe)3a{arV&w#na1CdhtnJ^qDAvk$c;&C71wtTu_E5hvm?!f`Bk9pMus<6;PPS@$ z_;G{Sp~!Qwt~2TbLslcDc3rU!jt0NNRPUN@8#ogl3{Ra09pHEW$c$>-R=9TJ!l;!U zB^;OGtG9-}RwhDq>yR@$zQ9fqVnqXuQbcZi;K2zf>4%}T!yraS1%zise|nM}j`6){ zC5~@)@edwES$}U1wD?Mn=`ZR2$K_3gS;V9+*zrz8Iqv7T^=^Ll++16jJW`E3NX=Z5 zUrz5YW%_Bh4L`^jwt%_z^!G(+@(v%?aTU@vB8SJ?~M-}o%w z(VJ`hQE9ZFUG+*Np}7sc4Dgnwk$a>iPy``&S@Lx_uw*$`+&Y?l9HP+;KB%W9rm!XL zR;sVmYqX~PUKD$Io_cyz%5SRENwVi+ndvsIMA|%M!J||t2z*Zh z%fZ3V9ZaJ|f}T`zUa#AXH#&Tw=jU^SK6y@y$;Jj+Vy!UB_^LhJ$?LZzTo54!kr~Ah z*ME-yeU$|M`Z6wXTLIZICTQsPW?t;at-l56>RisxIX!c!jbFP0X`@oR045X7|EnH_ zQaUp6UJ2xBfF5U{q9zNi8x9$0{G&Y2DcSTFvoEQk{=~8^xPdm(_kq_2i`?*G3YmFr zGlGQ|8o{T-TC3Msi-&6=T9))1XFdBy=tI%1!}zN-hSZ(WYDxNZFR+UAW~Mc!-yiu# zY^rV5Go*ue(xpQB_bd|fj;}V9LVJoQmX>eMm61aPfqDnK!CZU!wfFkhhc>kC==KnT zzN+#DDZy8luAp}X6UR>(Sk^KmPT`eF8!9OB(c#J!b{IuOE2k2@+(szu1mlS+-h3g8 zqb%Mc(dd>Slh{Fj=C+}RR-Aft)CbBH3B~wiVThBOqWU4>09u84nQD%LTK|*uk|3vz z8a?oEsbMr=mC9`SP$A?{$Lwt&lZ?w@1CbBZ&Y^<#>Bh_!4o%Ez!9|)}_Uww9!|FE5 z&2st;siRBZ;r^^O&*REqP62wx0D4~kZ+d>;Y%KIR#4$DfH~c(S%+K%HtTwfCYarh$ zWX$Ad!!moDXIrIxnK|`pEQTh44dJ zudw*?Cew2(ny&fkP~M?L*fc659y(v0g7I&lvBHQGqfe|T_VC!k_O_+1boGA2bUHQ5S>7&r%wnggxOYyYR;381)FpQ=SmU#>>08wRyTF>{VAdfH zU##vs*Yi%TKjRc*%qOq};1mVm#Q8UHax%9CJBnCaTUh@^hcsn@P3yeV<_`OLuvr-y zuV0`VODCjIo~ z`WeYC7XEN_YjSGc^6>1(e2GO~^XFJabKRCg)ZYySkz&TiwaxqvJ(wy9B-_D@ZL9Lc z_<`(|yiRxFFuc{>tTPOT>t(*^2*sf0hf_Wf{XLUij-IMbVxM5rS1dO9%!jAij!%%4 zgX#;YI{k$>&BPp&xth_idnIh1*(b_x!?^`@Ku7MYWt7B4Tfzh-{Hh=iS>!RCaFncf4HG)=+Cx>#LNXd zHHBX6tS9gg)Xi@Pjug#ymJLjv8LHHZ^dIRJ4Re|l?O_ywkgF5L_L5oZ{Dn&b&)u=l#vR~mGM z=2!8V;wUc~XK~4!FW_t7WxAYwvc7 zCa;(%v95Jwr66TGrgG^P(K>(jUca9M9Y}K43QlHXF65bE7RMkKaW1{aq^M4A5J8JB zm7k-iwp$XdR@$9~CoW39Sj=G%+N|oJ`{XJI-!QwN(UFF*Q0v)gKC?hvH0o}`kdowiTm&|oD^ zY`L?W6^S1Dw6r%AQ3*r%_QIJ~KGB6z;=FNPu;I5p;=Go*>K`B1dUCK)=FepQPOV<9 zwqkuFELa-z9q7DJoFtr^=uNIl`8ycU0cZC?n@ZvOkgX#RTJFg{%<<>za45es-NKwt zx&^Zzb=|w}5{ilWSpt>BM$c2{?vT8z%UwQ#=^`Xru#lRFjLyxaQhi^GeHk@^C_2y6 zT^Wd3fAjpS7e9yeYVW;OIqvrjHb>1@IyZlX z0&_wyI>Io93QY+U%flummOVWatuIsiD9_F9h}T-Hn%G?(9xN}5p`Sm`*I-Coib=x0 zwJ8Twbd9Xt$#k_2eU6xECm)*`BgI3xk{MiX6XFV4Y?HK!Y}k@$QFK+x;&3Om4%U~$ zWxA0{rgg&VuZGPdv>0vF#_-=NVNy1IVGsl_YDZ%%4}pqw7kfHVu^Jk^Vl@Z#uM6tV zx14o-Hfr|Rcwf^hYT{Ir6>VwE8kcUrMXtu7m=&|k%f+$1mLX$hCfiZ~)iZ4`{=txV z9IXRKs=GgS@cI7_rv7{TuFxriDv!ono@&3B1N%{1Ad(2uSTf~#yfRzCo6!$~Z=0;o zx!gL%@+>U3V>{;f*A&%Qn;6ROUOaR;t|nIo>ktJdpC7dXtC|h@-Rb^5`;*&+Gr7Jd zuYPDY(2S;OlVev!M3C@V0ezHG-(JIckXNgI0(XdVQR9>wL8!>rjp5nx@l}32#uzPe z(#xkp*)LMgY>vbFeS9Ex*$=KzetNFg+5C=>49ZfIQQYcvPADVdTe% zxUzh2idT}CGK2{*mi~qYx~*SMJJLoay@`GTVr?jxaPe1hcDBRV|@>TwL;+;|5 z)f~C@d>pIn?j(Zgggrij5-T&o5%@*LEXq-IP+?pl)q*h;vRn;P?NX+YTjcwAJTi(A z98>ubGZVS-4~h^D#%tTqqV}xuycsJ8@yVrdLDfagw(i|UWqKur#+<6GZ%rEKY(7Ke zZbOchCFw!3GuJb1cAv6w<$leeQ>lg9ay=Sg)0NIci z4za2>jYn4&+ z&p{#V%k~;@c8!=Ypp?*ktfIHAzwR+7GUJI_alwntf7eGzLx!=U;OpNIR2<-O^;o{c zx@0P|ri=mlcz@!cc(}CuA@S9rF1dU|P2hb8N9fuFFzjfRVajhRFYuisT#Tby-t4eL>-V8V1@eq=OyslFOiQw zF!Fee0m~nR>GAIML^KExKo=48|ML8PyBmlcnc12D;}8U!UpPxu`lRq!X-mg>F?v>I zdwRZu9e$EUBcMS<0b2mMK50xw%OYi9nFq6_ctM>ru{hrX-DBiJHQ-vFOelHN~S(Xeqj^R|T zO+*^fY!5K2k+B!>gzWk%d3()jyJ)p~ruYeGTP{|l6Ma7sQ)i&f93E z3CO}J;JQdOL8%YZBNN(Ivb>wyadPV5V*Nx+1mP9ynD;1o5!^%$4a&!#IoIDd>&Zn% zWmX=n8$DAOp+Iou=F#A<6?2I~b zm5j_1XJSwv=V~(v!p3%7un%H~cq;kqQk;w-ED(||gU*YE3_B^@Nu+1GY`+0i*;#q8 z_FQO>Wg>)huvx(j=ZJ*Cw;7aem_j5?Z%gulgpviyP^`f#kd$<}pOx^8o=c)F3g)_S zb2Z+R?5%+_q%hE7$?FtV7lL9t$t?!6ETohH1*fE_A!Lyc zKQk3yhSV!RG@I>}7Fy$s9Lo1vY!5-LsJ@zV5ocAbmt6Sm=4xjC+s*VBn#@`MxLKDBi;N!)hQfSY@OzfveI`XTh|*pf6VsxDXJq7ALbxokt!x#fjNPY2 zrG(=Bjy@=LqYp7@^wxfq@pgyEQQIRXBJ3iDvfcn&6XnR_p`q;#*67%HWO6EC@~=3z z=ddc6wtDGh+JzK(^YSX^A7)3nexfGYT@N%EJa0rnYYmt}Rmr>mgZKRSHJeZWRzC&^ zxjFDv`!{=h{_-XLUk)_8)q!@d?9EGGK|(5E2CMLut{@phE5nIv#}ZW^l$%xJ!T!@Lqn~WvR`Gi6)!K!fz+k9i)>N7ztE0zA*AJww3VN7$E-+rYhlrR z?9Ch*9Pjad5g64sps;s^`!=04JK+=tUzz4-&sQl@RtbM)HGuWu3U;uGJQqC*Rq`gG zEz3Y!ALLK`5I)<^V7Gcmmdz4VPULoab3p3vT;v74&9XE*F;gMHar1C2_#uh*V&nq1 zPJYt^5g64Aq;BGuQCWhm#&8+NY<4)sHq_4hGRpm`I(DrggVh!~i3~$O`jFD#%CEGc zaTtd6RvzK=EaPP}l~(p&g@^j7o=703mTJ%L&Q+~1y=z^9_MFre?!QBGV=d&pnuL|{T|*tIzFwh5opmCvjq19Y3Z7?%!fqEq)1~> zfak|$GsH4OyC|^AcGO(;~XlE9Of&=gy8WtZgJ_2duwpZL$pNuw~vxUWAcx&ucE|cy=)kUfgg`RAsW8Q)e?Olh)9TTisVY#{D zjVnB?P!jEyHBN{W4O$VN`H>~sv&`2NdXOpc4-fCF^_;9JkoD<)r+e2;C z*2AySVEBQyhQY9l^{02papSQXxn8-vSV4CSo%~^<9TG4N{mB5+aCWUbGl?w^Fb!pa zQGV#pQT{gNO^m>En0IO!Man@H0i+1ICe$5pMtDP`+SlthkhSW4Y@b%^Lo#NRL5iCF zRa>t*f?9@u}i1zk>j`I0TfN3l+%FmAZZIq9Vb@0{~s3=?hG0G=?9ObJ@ z0Hb^rz%#rWJzV|Q^z0F)IqIg6H2|i^B%RdXhv{!w(0`3Gpe+);wEIB&v^h(nKn|=I zK^1R0*@IoH$hoP*{X(P#tr!-gTFV7=rC6vZ zAkx}8t6y<7-KL#@oQq=N=bbhX=18A8sFTp=vjv&ohV!;Ja0L6kpB2{$%+B}Q9{$5? z9WB>@UUh-{#;@t$%Ez<28RUr52JWlDR#66L#Pc6_rF!V^iyW{Q4^Lvk8`3T94#Y&r zW>1fL-(;xPGIyRUeVwI)#Y)n{LT|~SU5=EyW1*(kecJ7vC{@!x#UJB*B>I&hxYui@ zd?N9%318Yc)0Y#!Y_B4#o2t9>!HM6`th#i2B=i>MYhN&36<#)`p6LJZZ}J zd4sw`A=cfv-fnDBPC<0~&wIMaFba%gi8MO1yryE&*8*5Dw({nk8rVe5lB~iHj&c1| z_o)2J%D{t`$!d8;21WZdmdhL^N=Q#H?S_yzL*&!h7P207>HW}8T`B~z*w=O)$(Og+ zw~k@WvDhVtEi=w+DX?ZPqQ|c1eczrV{4+^fBUqS^bJ#k7r2ig?`K?0yi;?&rE$Gsy z@y8yvuYFp^5NKk7$t;ETj6Ic9*3ruzND@lyH&T+<_0za`Os(0>iqGiRy&G(1dwh}C zR^}PgTnu-!5(c_PzsFm+uW|w>iCzOIiN0SiM8GxS;+b0yMA}DU!!t#}U`iAvIvQpP zMzNdXd^zy~Y|byQPN%ejd8#(&?#6p_W{=hc>B6oc-zHYT_Rj5NZ90e)%oh;DLl6$l zbQmZw65aa}4x1Wl%#E|=EF4(RKwWx3!&*IF>A?mxtSzuV*R$#N(^V~de#rj7y<9>4 zNF`wFlwJYpaaj$wj{!3W>JG59aa}$xZPTgy(P8grWO4^kaxt69Ue0_fOAbzPupQ6E zAv3bVw1cHL*URFKyU&`jsZS1>mLm|oL43>JX!gzqh%(6dH*=NjR!DGsBeW3vkSxu* zwQ6jd(f0s)?f3-7ZmhncxWl)X)nf3JP4>MF*%+(Evl|1Fb3Dy4?EqhCnx8hbw+O@* z0$?n%V(c`{yEn24=*OLg9Hs*d0XB5m5x~&C+IEpn(e2~fRuY4R57^N7_KyjMiH)BO z4dg+O%>Zi~z);VT)gwb!kaIM4!QsnnGh2eJxr?N+CljvcyU2fL= z-&LdkW=8)h1QYWZreY}-_VzX|tjJPkhst?O;*Gj*ge(@OFfK#~@jXRI^ZOZIKq>cW zcwEYq1Wk|9$6R;b5A(ab-6Clda`S1JCY>z!#KFBISR|;!jX_YJ% zG8%G@%dLsYohU4S`4pM1LFIc!IQqV94zzTgQ-Np?^IOdI=HmO?T@q#QkYWw^T&)Lr zJO*2?NvQTO;I3Kqh51A!LzsDT-s-gE$IiCIM!G|eJi2W=iS3-;7bjoc3UQzD;66I= zRP8Q!YUIwHYgFe{G->!9yH<_id-jQrC^!dcHFjWDyY=8f?pL=w)YAIKo6Y!w{s{ET}@m4>S6@!Wc-s$OC4y+oKshC+SacsXRo$IU=XY0=qj_#=1bIX9Hnjz7`7&-7K#Y zUci35oWbo~Exw$sDv*~5P=hqUj*mo@=r{&(o*54!U|Ea}`REt6?E ztiJT=JZZ$#)M;te)cul*MI?x6YI2bT_(%?{LuZd90s~QJCRrK3J4ko5@>VLxb(rTr zSXP3*rIB1^p<+9p-*0lZ@3;xI-Q55wJibMwq6Mb)Hn`7ZHKqp(jvWjVMT`wWeQnjI$54-9c8$*o~aVsHyv`s*AFN5R= z+LE(M^by?a)jh}%kx-m1lbKjxmY+12>zGO=OTj!8dxUpjLuMprO9Anj#2g%3 z_=MpwSf&c)@OO-vlNS(QfuV^d?9cETRU9J4thu2O6jU^8Z<>pQlppK^n9r$`_Vquw9cU%>+9~UpL;LS1BiuE7q&xC5!W~d-g zbuS-`w*FEEh2DKXoChEZ0)&VE?+TCNf3_0;q&xRO30;#@>N%5J3u!7R$DaG>4dv>M z_F$u{j)6i_i#}b2ssRCDh!c{Qr_|3K`pAM~Bmze7rXRz1-#`Bh-}TiYWA2lgCRmR9 z5q+v*Qng=hG&dU7>nfp2=S+kCkM072l5zcrP+?ymtpWIPMO*O z=&%!TjvFyPNDX*R^)i-ppPW4A8P2p~42~RT#rrq(b&ysY&NAH28-O-UssY?p1ZM(_ z-EOHFSq^2kzoMgs*fRiusRl3x?D{+)fc%0M8Wc zRV4bViztpJ#+>qLe~uN!y!W!$J}^MTz8<{y(uedd(@WSRi=(X%LocGLYZ5_FE$ue` zI+58X@d>aIi>jfyZ4I>%lYC8$*MQ=AszZBT;^67!b}R0I%-V>;_3nb3q$Z`3;-l~! zEwDRy{L+UNpQxM=JbUs47C4}Y`|mRI@4dv-sDFf}%_)@R z+g&R4?K{65{0PARF_3Q$M)5N|lneVYscwyO+wbkZdyf3dqkK?LXCMDzx8yu;IaE|5 z@8;ykI)SU)XiPW@Gi7a=5-938|`$D;6 zlQSd@pCb$5zYh;+RPoLJr~|7o1_P&xCCV8tRN9Mae4qyj4{RnNw+IaJ(()9v%_RTm?hoemW5>pO z)>&{3NYz(Bs>J>_c7MZs{AUWwihFW}^-wDjg%s{QJ|57_0;rbqlv-+X zXr|yZa38bvrHs!36>m}uD|X$35r6ec7hyu4Rte69AnQb=BA|G=5!9ruoH~T)s%HP^CigaS2i<-@7@QOtBXWB%!n;@+!Ee4B^F|qh(+(C8;`b z^-hEN!SWCIan}B1vm!xsoFMrGmW4cl;yGT?lq|hN|Jl1A^IY*G3h>ERMpr z`3MV@MZv^#YPBiFIHj=~`;nzy3TCi|3Pbs=gldI_FDT=68jKQ)|L7wwlP#(iXs;h7{=(ASrQ|L2Hybp&+kNKZ9aPUF7o&SPcs$l2GGAtEt{`npChW zyBzZG%C4hzKDF8oKcRna@fZp%6xT3Vbs-oZslM(nFJFDa)0yW_H3wQ^wp{IK3P!|4 z#@c3zlmOD`NrS@pwOULS>>%b+Vf`fPWgv~NG}fkZ-}3GLJ|gqx=S(SS^u#Cq?B(_z z$L_9D(dJ!o^p$;hrx7VcCj+ho=}M@dTco`cf8L;Ag7BA7%BPpT6O)8`eG@>i7z;FB zEo)`Tv@7Pt5!@pt{fhZBKf+3y15&s7kTRL?6q;J#0FTF|e}k-*VrR85b}{uQEMt<1 zNsZ`Y2dbHuZ_aZ{Mo)IrubB5~?|hB6xAFwaqeG^|TjC7rOHG)Mu?xBO5*Q~KDs;4C z*LyuY0JPW&BOCmJ5S4b*o`4V=3MQSrn@}E|NWQLQmahuO6YA$c#=K8Eoz^67A{#YF z=o)0B^qmv=T|8mpPnU33|jn6*)O z)oa<$bbJr}=MGN5_~3L3Am}4N(0|_>_J?ZxKlzcV|JX-`%5B9!=?3_bH)W5_+bN2m z$TC{QM-Ym{z`vR|cZ_0jnwzI3-=W+geg@BjeHKz0uWy!Y#$wwaZtUUK7_VGsD!|&) z9dTY}$lL_>*cjG8^LFvryty5;=xAGDZ-*(ynv~h5lk3XgeeZ5`t+6}D7COvTQXpik zc{_>CzXNnzZx&_~mB{^7$x~t6pszXb;r+ggQ=Pj1mMn&ojsw~`3mLcqdjB%MSkCTX z3K_BWU808+AH!||yde6@Z#k5D=C}Fl&A~_h1@Ts~l9?C#{OQP)dSs4iRJxX=FN9L( znvzV;&c=Ol^3)^4?Xa#MzEauDoUuwVJG_OyGv^w6?A?Or9-=NfU|A+QQoQnh+ScO_ z=Z=2T$wM^nB|DIcE*_rxk@3uYZ57aj;?pRiL|CUyx+rk?S_*UMkBeGS{^(mzBOFX! z5nvR+!xLasLN5H4-HR(M0(@(Sbv1tjpj2APoCiuJs%q$K%I!AR1voyH>@Rw~|*5k<8LC7isrsLV^`ufwI?foN4}F z71UqPJ;43zQU>gj0(MRP+~D%N8~NmkHlS0$-~Rsd68P;GFY}K#>M~n0{C+p=&%3jD z5^5QNGl1pc|83#+m%D#EhW+;q5=#1yd*c6j2K#R(0FRL{yuyCkEh6ylt28PsBxKLW zQXR8& z&;MQ7`Fwl8>~Vj&fBZ!Bq?9nh-55B z8K{iYN=y%7AUJH7!3E$x>(}Z1sJ{>8B0nChH@!B{GvHep+^s~Sh@7`mp3gZVyNbTs zK&Um%e(^zuzC=`U*kr0AAM(fkr!Hf`#Y7^_i#hd#Gx;#G$*Qop(fBIglDkSzam1&-)7R= zHNAp^Nr95V{4SekMVasHM;PJbmvONDNV9QwhRbxa>-{VedrJ?S+`i0!sm=E5MutDq zPN;X6OBii4;;ohWjX{MmYuXP=pcmo6g4n`p!YX`2)R$}rY`d=~CoXqSG?^tnlR?;0 z%#JG0y$)_|-+y__%HVbHVW%lz_k*i}*w$lkK)I+hoi0vFXv_eguoaP+<;!a$4*!VP zcZCM)EJ@&Xt&!;7kbqe*OI1?pFk>gxygYA-U3}_o> znrH|WU*bD6f0NIE#%Ed@&=m7V5TXMqo{7%Y`X9+PSb4(|#KM2Dmc$`_*QA8tgA<_& z!%knSFeWqXZK+)NIy#d2ZA&yCSx!`PnA|tmTT@>a@ja&`dx8no;k#K@*rAVZ0yP|csb|`~*2^323`pJ$(w62AH`t@&YoYx4nV6}rYRWiQ(>2M@ zU&lXD$;hYR-Q0kys1ej9$Vd3r+rPP%a-Z16o97^^p5hTMyrq zy&Wp<Uvy&zHhFHb#C)B5^?P1%DS~?vH9H_V zUo-?DQ-A&D#fHQl9jOZI9;|Dx$gbXhih2kVj~Zvf3rl{n=~A^8%I z%m(pUc7s!kM&KoUdsyp6;dfK}(t6FMwyL_IJf%srqtuOE;`v+Og&pH3={xKxH!r+) z%x7m9U^w2}UHAQ~TKKDuzxwYwZmeTr^T&qVXkq=kpyx&nnxhH;sotxwO_Dwmk_1|V%RClKL8jqXBq#%6KF}dC5DG4N ztVSk0sLqR#=Qwx~j{X`ABq)L!5gaE-JP;P11=z?KA3J=7RP7#=FYW9K+g&{#UUZn% z1PyEozQD99^c)r`$;6;kJ!?qnXZ5qDs6~0NwI>I4f8HOCwSemPJ+uQk^h8?AQ8)4K z=J0Zu{mNe!)aWv#y8TqBX=RsLkL{Tl6ODZ=eSLqn*UWfN2XXEcqG=cW$7#+N%m%8y zAmnCyhK+3Rlh}U$v5xH__Nmz}IT%+C*scf*nUD+ouNPT4qk**7SsCabi0%BFRMw@I zP(&R;v(63_S5V;@bJIsOOGXC_IbVFhTl8=ss3{s^sU?S$FL0|{ag#$1l<#XkR@QCB z1rf;Ks#@&J+rgcy4Qx8Yv0FydwcD|WJHsKeNUC))b>BTW^9zwrm`4@pV_o<85?@hp zKpiPsWjGzL&HLY%yyvq5fo#fHa!9<@ir8gvM7}$O<_QssB%k;)HA9v^sLw8Bh9_ie z!7!9$c`AMhwv_;fVFdSy*hiwtq(zRig?Fy>QtDSVs+Fv>e41i;ik=ea#WI<*ka@uJ z-FP3i@ck__#$xQn3nq)mQ9QPH{R0GJ0qA-Ib%E6~E;2FPjBaKU;=7YaG%5khGxN^8Gjsn{ z_x*G~+`3(BpR@Yxy-uC#u3mffvfnHE#5NVO!_Pgc7hBWEp3|Vy-_L*d8K9c=kxLO) zXgWg2Ts9MS@hhkmC?V8`u7s63Wjd2pqnPX+{ap9Y^=`%sZ3Qm1I44-e0IFF4|h-|r;r*)WJ*kdNroUVFs#eE<{%bGPt6gzp2mF!qN=WrWu{Nun} z)Q|oZ%KA*iV1OfO*UY(Lofbdu!Y`SnIk9@lnhfWaCH}vZJI=Ztn977fjC~9VcKu^m z@G6hVgj8va%Xb7_NAU%}IuDqP*4gpVQ5!k@!upMWgm8Xzk()Iq>vxm4cmVCRRMV+H z$^i7qElv_<)iW3R>AFt|_li$NFyG{@h~9j0VPhb(B^`+d{Y9B^FDrvU!yau${9htB z26#Rtp9gy4A{p_q_K`)vlKQU{g?{{HPA2Wu>-!#w;SsVMkhWyu{)|NXkFq{M~4!{R|+(08}VfBKU8!Y3!W zuuD^)p+0f|qn=1?;UtDBQwfiB?r4!{2yJMM2lb71N$kKp^>asFDA4`3!plq2oFVwQ z%iF^JCzChJD*V0?y^Xu>x)W!BURxLq&keC2 zDBX*Ie2%}cH={RRF&~>|WDb=JtOWh%Z{h#mF63VTUHxM=|1T`a|Ej0|$!gB?E5f~g z*U???ppyT>yZ+xKwQM}SoxFfHUO+30_mX4}#s7Uvx_@YG$YH*sJ53O3;@~Ld z@e@^2#X2kG@j7d9s^)fSS7=QIHeW;nccGYarNoDcF}u&*)a=7aD%l(L<*pe&L$k@Bmt0ndOT@=&u0{mrwW@X z?I0N<0CYr#@ji1$`LPcE#KXtKE$tuxkeabDGU;nIOs1^<)Yfx#5>P`H(@byrrDGQ zhhWRSxb5_#e4?ew)GrQKh3u9Ir9X5t6YkLsU{6fR$qLr=Sf$_Lz4HofsRIWr0q@XUU&Tx(ys9qdp!r&Q1wv+k$sC&$f z$d>(xwifjF5*{SOk@vEdotoY z$S&LNzvAmGRP))MSKTQ8D`kpIUNzfLZ3$ziov?3$rzoo3P_c(i4tatP#4Rcc8Qr>cB?Zx#Bz%>VW#`_QZloS7^pMp7O{RSos6PWS0LR+EFnN!D;nvnqc&B}{plT9yNDd>DPyN?D%^LXmHo3yFJ zFEV3JDWN+^ zskUPlpfLb~Ed+_4aXt}rq-do6z%Sw8{6y&RMGl)Q_?|S&p2eRj(MZFHFguZ!hOOt8 zl%|iWw}3D(5g1Ghkns5>dM$4}$a(bxSLyQrcc#WLpmrB2@i>4j@G3TkMFEF>{7a%t zJ@@GI3G?Uv7Im!;dhUrSsQXwRWoVyv@Qf=ZQW}!QWF9C|Un>d+<05z4~i!wkg8fgQCpi7dkPdkgui$&SQF z&u%725M1#ko?jOW>y)Aal<*8JE)J zFnJr67BQbL*w?UYzA}n+?$5ez3)+26%x+cXB?-!f1Yc^IAIG&MXMcw-S6g*0{jr>S zBxkx~ZW|(m0k|SgVWLG@ry}^5Vy=>9+*MyMxgyN#Wf&&wA_s2NX(=Xi%`MeO5k%Zs zjD<8)cy7UyU}Z@2qPXfob`gY#7QuWWYU)h%mEo;fD_7 z?&Gc={{}BrG_Q7l3y!Td;<5}Cn;;QAMKc?wyL;0^YB$K1>SV67WhD42rzxI3-E%IQ zlr$#>T}K^0`zW}gY?>C??ND=T+4F-nPnXC#Wyk`1d8f!nSyN>|3;xl~Y#@s$AQEBm zeC%WBgxF=`M;^q)CSLtjo9^{H8=FbaEhW}MzG*_;sXNv9DwxPaN3ItgbnHQ&q4tl`rEUto=w+Kjq zmltDfR|vVY{Qk2y%`ljwlT3cNI&zQ=VqNYheCxLZeiM|tFATh9rc`5aNzTI)E2xi; z4*VCSIz(;92g|YKEfl9qfzJZttB+)-x&wwXt3uq6EEfJ%K<*}Kncyu*rj~q%RBndF zuF~Q6hcquN!ioEfDVkib3-O~J+hOy1AQQHh#SBYiiJh*tz%;m~HM5Gfn?0Y+%-HA( z=Ug@c>d9k`3T?5X-UH#q(Jcc=)v%^#uQrJ~6LK2K^|2@@$`xAXT zQdkOpi=KMFFQts$&EAQ!G3sFIMxr?R3)MX=xKHwFw{Qkr=z`T)`amF(5^j-?a0OIhA=O$MoJ0-{sgX2Me5p;q4D{e-pgYyXcr zztNJ_%d=Om_%0OxMtxNtle)_?HQ$*B@&84Io#A>ycrF|q0xE`J^w1)62@1!CqVg02 zu~IDZek^ceC2rfrje&TjJ~JgHbI*B3EFxWr(r@h6%lnUiwiNSl+#r|HlsBqzUz8!` z!;)8(X*5-TgNdKt8`jSyi9MJhq1GoGR2Urm9B1IooKu>s*@_OB<5zLRSn`2yFWI}1 z#eyF0`|k?!`7a1M;@!JhhWal(@c&Ig0&P6NHXi>}*n4}**xTCv7h~%`6r_<4jt=gt zn($c5m}IfB100pHDhgekaoLB6OliOZ{%0+?o)r4Z(?x6gNfl<_N4t)I8&%^81Ow&J zal_}~@ZjO#-CrVU;2hZg=!&*|Pk|7+L6Nwc>@O+8Dk1g(i9JB!uwq;g-j_u6Z=+W@lV^ z1+`74732X&v+RD=mp@EI=SaBDjbs~thgdUXe0@2bly+}RX>>B{`e1NRwleW~-Xy*L z6sN~$EGKuO9ywMK_~V0GnNeVZU>h4s@8K!{?bOsWzuGHM`6B>&6Q&go{B=;D(y$!M z;>vg)KCjM1pZY&KKSZG_npqRi_E`|e~__UzML~*B#y}#e^JEWBiFJ9 z?cENXAy-Z%?yv3cey9@Krz+ii8>-Ty9p^Wo_+ww0lNR43YLi6)4-A%<YS1*3`|N`A zA4ZXKRGTsYt67~=H{qli3DL`XQl?0m@8aGs`i*I(eNMcvV(r#X^(`n49XzL*NG@b2 zZEv0Qg7=2KxN4Qxi^(xmTlH1+ftSQ7_r^AtLeVDrER2<4Adc{B8typvOuaXO@t8IV z`%*qjqtSIy!2=N5$`Aj`N||z8#fq!cd28#M$(o7?blHHTUdNi+;rv1nIqiWj_REuV z8XVEUbwLcVN&U_)gC?B+)5b>2O6SqyZD%0^&dDzF>e3r-$(s;$dtu4G0H|i-WdGYw zsKQ(bDrs1hz+9p@>A`eW?(H4tPFN~$YsUHG6Y$w`Ns3j291#`h{iCVa@V;0g1%>px zrXi|Zox4v$AL_Ot_yu;RBmjev?R<2rgC14xpxGbRNqBGZH3lC|Bc%~Ot z4$IPV_S15FLM(;z%;ry9?3MmzwMfWtM_O-LO?7(1d3r<1hE)rHDy7L9PnBm=%NUqn ziokZ#hUIW+?_ieyk)We@RNUaEPA&u0l;XZMw2CyzmIwGI)zO zVwL2fT;M|46{@>5R+ffUD*sXbx9&66O#hg)kU?Oxm zBly3hfBa+rf?^lIKJWIg#C!1S|LMOp(8lwh#>i5ho~~B*{}xC47Yg1PNTP!qOs;Z9w*%Qk%Y%Nbvm8-Uw+}{I) zx2U&)o6YWt)QE4Oe3h#Wp<|(A(Z|iSKffPm`d|nLY>D$fJAWtIR4OHFAL6XsQ_E31 z8oJry#rBnm^sm$ZX33J7LNE}>#ag3}1>el9t5XZ{{Wfc_Ym$`}nD1Y3n4a}SKCt$u z?PhUwO|CP2A#jB`i=K#=V|G-e!h*-RYL3aNbCXdCnyKwX7vl7!lf{E7u#zKuWuC*D z2Gm{qRY|lL4md|0&jZpXB=zVVO)TZBUg0OG=Egt4jduMow4@+se$71OQaMt!V`y(a z7Hjm}7*gf2%Lu&6>Dd#h&q8VLIrK}iClY5PNE*bI${jiXd_pWr4nbsl?Mwl8^hov9 zY4=G;2rec}cm`zU>J$>>DHTW@J}9kirx{38h{7SDt{{-$WP6U=xWs*CfSs&%UF+0Y zfw---cQC*LRpu=_eB-zPCDL+(IzFDHQFnjpiy~UY@Pq-5LpK5QoJ@RC9Jwj;C+d%A zh1VJ;WND(irc3mx0b>Dc4cDH*6HFgRa2=(|pI0acshO~D=2~wpaZvy>WA5`nH{%*> zEd7Y-pJt+!Q;e4D+Q#Hu@2#AMO;clJhHiZrBe%b`a~gR24Y@fIQt`EpitTt;y=nm~ z$i%<3TxrLC?auTy_*>bVqZwLH6;6(3a0V=0^3TRNb>4tDG_=AW)$p)lcdWT!yeJZmzYphOCTpAY zy+rV8T_wT;^)aS_Y!qUonlU9IXTl0lq+ThhDa()18Y+n?5)k4xpD;eY*vVKr=`T4h zpDad4GU%rUQ+WGm-M{Q`4g1esU1(jrIS#ZELV3emeEo+7&Yl>6<8 zY#zU9(I>{{5lf;;eE}6!O12H2CNhXfD=Gy8wu6-q78T#Jfj9xHpO6lP`D(Vr%<@wn z>qGIMq`})!`WXL&VU`Z!vp%8oBn5t0m>n=v`n76#Q0`8OZqYkGfGsn zA?A1sCc6W#2v#}!x>>b`fW&@ebCeckM45*kXdlBpQ;ae!7gSd)XQ>p|G+uhWeVJh6 z`fa)|O8H+N-DvLa2~NvE%fZqf(qoLl=3J%L!69AAiv*v^g*H4wyijpsRl>>;K#4SI zf+52{e-f?tNk7W`B1+9ZaK)(>bhUaioU%=)DAxMPRbrl(7uqXuNJ^Vl-VN&lB=)Jg zJ5oF+&u7yhjxQ@@n4-H$MsmFCq+L);ohF(7X|J zW7alUDR8_fpCT|hk<29rEx1!c|FMtZjImk_@d$8nSE>=KLW&S&jEi(-HY`ofv>c7} zj1BAX2pZO3r*Bp0(+oU#F#h%wJ|^e+9c_DF|K0YS5u54E`f*rT_%Sm^F8&gU8enZG zqYFb6(TX6`CVN0TYx!w{&kt#l^;c)dH|lrzaX2n|(}YBV{f?6aI4)C_hM3sR2bKD~ z!IBhNtoSk3iUz^>p*7YxgY*VQ8_i)$=6DbMC-y|~?^%x;KhNw1;G^gpf3u{DM=@B{XSKAjoBP)P-I6Pwj+NLz z(16vZF+mn5-WH!7-vytIHM99=!_TIljUXF$tav2EC{l3c<*O;Dc)YGp^lQ8Df{*>pERTsO_J&VyhdB19CNLnDR7*1r& zGjZwS!Ryt+wm90M3aNvPwN;I2o;Uv{okGw0!l@jExn7bllLA@X3Ng5Ycyy62)lJ2d z76>onrt2TJZR8xSimJU{ao~cbO05bwZQGu0*F@WF5ehzJ^RO`cLh*Fv zb!p9ppr@{T*1+&fA$&DjH`3`KCe^^h3uD!&HChTgOa#ck7BoCCHqvy zqYk4^`-WVZU17C5EB@k_G&0Qtv)EMn$CBBMUG89S`-n5Gx*WaU)&0gg?8QFdS3|@| z&HRcm)k`FrS!5|S85zVBV$*YmfervzA*Q*O^8THC1SpwV9wN-IRn4) z&FiX

pW#%YTu~n={0SDXVg@m8*_T7_JfOu3+}%GeI{KkMo6meI5USC45mk8A!xo zS^9{6ITU8v;+wUL7H9eCNGQ1*i&Xm9{<7r>U$Iq2=dkJ+P3Eh@$JT1oI({NPe2+du z%!D#C$eEtQ-)Ddo?N<+-WY~&!8gn@k+emUwaX+&TFxP00iKs^4a{x^KWk+sJW!w??~(0>LHM<_1%go#M+J zn9e5?*RT6QE_ukbdm;7+-N;k#{D;@EUWcJ!U`|CFNg9pr_bE);%qLjD)Kt@iceG$xj3iYph$m{A ztU-n?93>6QlW>kT`w-7a3=<<%uavO>*Q5r(C9@K~{7u#N*k$qgMVceWu}`?ivP>MY zTBaoBJ=98mHtD~9F&^4{g3ZivmyLV+@x>rEGx%E0V~X)wBRdrK$~Cc`keqrZrt89l z!2zZ0QjIM`>3W^hP>HUwQKC5&^c$yE;fH{94qx%PpU)?sQ_!hTDs>>+23aKv5Nu6- zBl|%A_8U*0gN8J^ ztAzRrGZ)vrvIE6o&qa2V=4y!R%YeVMhzE&-REc56E%m+Qzrv z1|RbJr)^ABN_k$MgoVM#ZZZVfU_G+zLElhP1I^QSty-!1AQf%-6t-QSH=E#A4ABsK|ICbY%My)&UX#c$+M-# z-T8%J#yhx6%@f7-npyGnFB&9bLu}}7@phdlOBmQ-aiQlGtZ9+r;7Lxg?YmnaRLp9fg_Z@ zi=c{t0mPU#gq|c4#fpFabP`V#8}zwTAp%V%I7lfBO$OPC68;;!CFT3cJzm>|>$4H+ z_kbY{StpA=mav^eNKn=Ydu1G#-{m`_7rj3$b1Nv_Pi`(8yu6Rq%OZO@@t@kq31AeTnAH zODu{T+&ry2K#T!Ed5nD%6r>jt{d4i))4m7*{jCM+#3*GF2P#Jf#Aw$) z`M!{TztNs8aUnyq;tGtYnf?AC7aeHOSW~=t>h85VF_V!)R9^g%^1geI(D%@?{VmR_ zjFwEh9jWl}$rLgGX_(AyEOv!QniL{GFe*6}p~wHK^_wkj2A?{e zy^>hQ0mJX+J>bETJr*4_@G|n6k+Z3kySCzA5WGo*tG!{?JH9+NM7`$3lJe&Qofng#X_Os~((@jM z>qmts2p}7&@J4cUOa7)Cwv=`^4a9D6BI*rSQz2h-s^lHv>&;p$exnb6A3MTbg6kUm z<|VKv(mvUIRZJeu6f1$Q)xS&SyttrX1W_+ZT}6rf`UosMZqrJ3aJ(`-Yd5;|gR=?I z+ZRHkmEj+i@~7%*ulvR{8wM+-2A*ZyLg%93-_;6?in)>U-vdVT~2E zj-Y9K6nwo1N`q|yY%tE@CT)18jtP(ALXpS*5P|il{K|_+M`KZ;LO6xojQ7nPRTMqk zpfLq?QjVAmiu|1}5soU)e_CHeByEl)_Y(8fWtAmCwtHHq? zYGz7dDkv$HVKEIM_-=HeG-z-G<|Ueh@ep8HH^U)OELX+qaXh50&YrZM3`z_BP z$P=E1+8~{poIl5Jeu;)3{}JFh!VukLW5RP$xla4Te5r?jYCx=v(?O1_}WkiL6G!_n^a1ud^fXk*4CRiO7IDJx*yIWg52LSyzB3c}42bkVrD zPKE>rSA{qou4RJFRfa)os=A?>D)UW{tyvF)Wzyo;Ggn@9=gk`8wzMln+ z)vj5)1p9&2!(V<9L|;Gd1AmSgIP4X7?R9;I`V-4}L;JY{5%?Jur?75d@I4xZrM?g? zh!=AxnFl|pM5%^g*@`~MHcD$9Q+W;$#fZ6=%)=P`AlU;I!%r5o@e?MEs^S!23_nOu z*%h)1Gk7R@cPbeGcdbXX#~B!t1$%=`X^J%1D%pb^vvRV2wNV~(`i$ucz4wuF8-6fR zvWG0j=d5WD{e)+)jS-8fGBL_Wf|@9tP$2w-Fi!YTrAAb${A<Eu%F!YHW^9_0MG4u%1M>zRC3MA3adRCq9DF-TYqsJ3kK2xOlag0b;0P6j7##s~(}#1@P&Fb}9bZ@$7m@|CiZ3`gYBs%Y!O`iN9FL5siS3oYnzNb-gGE57uL z@K>rzG7^zXsabNE%iE$rtQL-t2ToA(pv=n%=DNTso6u#)s=e8VOUI%>*cR9D2i4i$ z59>abC4nLl5BXP5mqd*VK~U=$QZHN}3D`@n*&yWg8LJYs`wfY??x1y%KUnRQ5&U(D z!xOMBg4Y7OV(8n~-~6$ABs4OAz)9~WLvPm>g&1M(vLXJ&4|$xS>bagXqg^JOlf$uW ztDlp>FU^K0X5;N&P2)}wOG&5KsMm}g>k39I{!8+eqtV5dM0L@^#ERP&_)P?}2kbk?Tb6&C4-lWng|nk z9jPcEab2+}A7-6;Rt^5rfNM^iLi&X%kiL>FAs^B=HhO_A3pq`Ki-YNY(>Kr6#CFRF-_?}kfi+VQTSduCGJrY~&B z${gjsD(}26i@ED}dv7uBSv0PLgD>+wuX%r78ukY_0P#9o7BYO8&B6AJQeTU&+t^G^ET-m3bO%Y$ov{ux9N29ELuoed+WpBO+Nmii~5}Rf6#EI_bXwO@*7PRNfi5n z6^OQA7{lTu+2Ujd${#iA6*ua&=OqeXny{qnnV_E$Fj5>`P40D2G`uhQhJL~j`U*R% z4)u5BbHD*bkXP@*S;A{Mr#I|ZV}vdwB*>UbxC%b8{h4BR1-UgJokpl)EYjaX&AC4O zBbTDWQUtP22-AlX*idn}6Nn@Q>RmBcaWD?vUr@VCY{jXRe2K$2)JObT&(H$2JJO=# zzsWAK%ds8xuCYxURnjYLpO6e{?5XK;>E}3sSmn9&z^GH!Q?^f0Tc;zE{nWCxi}xg0 zzz>)#q52;N9Vn?y_?Av2dt?WdvHnry6fr0v9hfovlPPf5s84jjBRuc($ZZfF71<3&X z7=%z?#F$?@(~&gdlpmF`W|jyDl3{M}D0`6yS3;lQF%SFlQRFvSpB1ni@2Gk)1~EdO zurMW{_qZs>gGC6EI%MxMsF%+G|LnM-PhyzrP&c&yONRbg5$oKGDu>OQYXsON6dIL{ zrzG%Lg4+CVPnjGe!?foV7z2?cMI9`b6eWwXmn5x+y&<1_-yq~EEZH${L-e5rxg<$Z z25-7*KQG=V+dn<=>a8T(Puhhye%6{S-_2DTm^w_iFQETBa{7Q;w;@r1HRc;6U8bNK zSRf8uF(+>2ym$Kik-fr$Tt&<*8d8W0TNZQwj7cVGj5;Vs$^K!Fo3hJ`@(KsGJm&U} zsvd5SnbH(ya3aK42vhG|(g`QLEavu}$`oPnJhTHnMgaQ8ma=~39$5*kGc~56a(d-H z9OHJ&ya&PmO#J6ove-S;!{QO)gLVYPLd-p$~quy-@1|MPeRGE%JjJkY@J9z?79eW`CB(pF{oUQYW}aSK5kN=JjT3w1AJ*6xA@>P2$*&7U(Ng$s}|iFPi;dzpPrVJy$W zh%Rgp!H*4Vkox!b=AuA;ogW)c%%vZhF<3RQ%VT*blZ&?AQ4UXinKcWe_904v#GwpS za@AiFHQ)XVBI7?{seEnZ=}cKDs3J`0f7Md^fBIDavzY3?Ia9ypBbbvM{(e)hydBHT zu&^6hO9{onM#KbvbI(i@L~@5m!qu=I(xq0GW3X#{+%82+pKBOrrGe`wXX7bnYrc?P z^T%V`zK$SO5E(5Jlf~9S%C~zpSGW78R`(+Gtc^ zlyMZaJCdH|9G!2t8OYi;968a(L6TgDltM-+B26DP0cPGHGU}G3j~oXN^>s(KZjFOS zmdR7Z8oLSF9->sDE@0OPv=FkjOm&lkE2S%>Dgf^QV7)02#-VJ+ICxsGaBXQ@DOM)r%B<$b1Bw5xz9O6h0tR@*$cvk~N$ZN(l28%cxXJI90S{Ny=dgVHpv2 zbZtnBq#+g3sM0920`@$-qSSl}c(gbLbui4DiY#R*g)gNw#XIFbWq>jokQ73SB!uk2 zdq6nan6ghf0#FOdLli>t;6A_|g`_M{RsyC&@{oj3JopbtM>|t)DUSi{A;yTm`3?k9 z&{E?MTop2sZ2i&8FDLYd9()A(6NS(+Ydejqmbl7c}=AuS#jfchKm7t;aH=y3`MrI~bZ*dLT%d?J2>4 z-tYj7-_XA(Mw3$t6;#l$LrzjC2Sd`OR1^@k&>Kb9<`V$tbv8nR_XoyQY)U?*TO55} zi4YP@JLn2N)QI;7{*)M%TRi<{2~s<#pDpL#SfLLvBcOh+9Jd5|(o!K3kw|HgXzA{Vdoe(oG}ZXNOY!U#w5n_T zhn5_nMz4*CHt*%)F(j7UtP%RfN+86SHCLhX0Tm>M16i80F7dPFUCK)ku;GEO`#3#* za&{77&AY@MicYJ==2bwXTv6xiDT%_00xFK+6U$$dAfAny%n>es-Ob0SFBI^(YI%-C zyFDWBv6kBU^LqiG)VR-WJ1m5s7b7$Fi^6=OMM%b!*I?5r>L->QY&Hm}jRpq;M59#r zRqxWetEh>tz`4k3PCJ2JC`iTql@f=cY~#}a$U~Y&>!@;J%-7R&S{Zk|=`tWD|CoJD zW@BT2G*YwBh2HVwq+;2gr^tHd2oFl>M4EfLtuVeSdy*~ost?A4J&*`*7W`Y*uXtlU z>mY4hR}c@kpp75Douj=9`%$S3du1>i2@)Vf_0>`H-SRU!O>c38-;(V6mfzU)L_BV4{x zk~JYU~WoO=k-&ETn^$t}Vsa%OnC8X9@n10Rw>)aBSvOlgh< zGG%y}grkY=`@(9k1V&V)fC+T_b1KK#+RxfHHf^vGG+rb+$%Gm9na1>rMtNDLSAtkC z$@U=3)GnJnU3u<}gM(b+oObm~#^q0AgFvq8N@$rBOpuC*@S6&)k5Vshqp+F~GN|;x zki}_4%2Eru)o$-{PNhdYr|c`4lAe%S7|%qzb;({TOtTKbWm(VYHS+dB z4SX=8_TtIQq+NHt9B_-2^x^JGMm@KFt+Y_19Y zl$b?Cn#p)b4hL;J1#Ro~-Q)U>qHWB_<1|P$RD3kqrsS&Z#^n{hrqg|9KX{ITyZo4YZN+~>_)bx`da^D9ZRP4Bvt@eLh_p`F zf%}VlAg8cESbVRtrr5Tpy@-q=7tJiC@@7q+nCo1h?rF!W#b^Ax^d9gAEX{F(uLC&1 z1W+y1%fEwwhpM6@%TUs(=R;nj&hUw1;^x|$YXjxb1z33X?W>AXcKD6gE+PL|i8~mk z{1XKBw6?<6mM^iqZVnX<`)0C5n{~@6%V#D`rka?U`+8QIIph9RJK#r?sH+nOo`S)9 zd)=-|AL8XBT)^XU3H5bu!&zn}@KlAQv(Vdf9+LT2c#p^*wJ&WOLl^NYWTb55TJ<77ku zYnS=T6C{66-8iTXTh<7Z?ds%mO4__zG>sagMVU{U+D?=v!^YRKnf@5Lc(eKluJVcVmHm_*VF$ z&mIx;W28F^Nw`&l4ff@l+IE=lq`NsU)?mP=2gr)pN@7M3a+ZLaZd?tO>4h}-L?HG>ji81Q#%rHRRCQ$nsGb|%8(W;31yKs zsK0~b?{82Ineym5o9I6-C-`(7Sd^=IRyYHc^QGCw*ox!$yC#b)8!<#PAjWUSkF#fFgM$EcOoQ4;dw5s**oH7o(EM9>&cAOpSpKVLeO|a zAu^@)3)muYxXl^aPr0P_( zgYi(f&i6K8!v6WhbwLXhdduWG`sY^?{tC=X!*Lfxm-YC2X|wJeW<{N|x*QJEo%swA zm66-%&y{=(P(#p1`EmCQ&wa3A8%FV4NFQ^n;4UU1$z)@uJ=41at$OxCR~oDASBDvr!^4{#A~b*mHWm}7Ie zBvfTxn^Q?-&2TYIIu`~R@@05rs*LC!M$=Vaq~RF+N;Czwb%F{s{i%Q4kya*#yo@oqkx@`3tMjO;s{%dy?A;<#*-cw@uL zqGTdxo2DVk{xKk>QmREhfd#($H&3IqExHP?+Ha$dJ_*cr=-L{OV)<4t@^cQQOrL>2 zNF73xs~*}e5e)6tW3U~{?@db+3LJb|bB?DQsBDs2?{7!6~!FvI->8dE*Vc>Wb{d?(ph8Of-9!a`5!c2Mv5%nr>?f3HXzJVnj~jF68hUF_CaP+5Wx3%T?krA)yww#dkt*X1-NDL7 zR}sisK{LCewNdVRsjn%d1!KX9F&_ke+?!gI#BupOsqTwGuH9C5&PuG0yca;@uGO^# z))Lzxwi*-mio-O8TvlW9^^%k?GRqj<0V}BWua#+h(&p-5vvYl zqtYnFt-5c^l;nD%SLlOhse>srV|%BAM243-cswKIJ@fK5!Yc+(F;)4Svb{S`MK&QT z>*q}0Eq^D@KuvQ6KSb!+Vkp+7k`q-`Jw0Bg-IjNg zbhlM1M|~Do?H#M81j8ME$RHi|eGAOX&+>q+PqOn)1@RiEm=-7;c2azlmei6*zJWYP zs)}44Y?dQ+I_qZ0;`vLCi}4zqD0l9*h`1eyE(miFbb1h0sdyI#Um);oplL-@j|7)vIV$yk z<+Bywg;ld#X!M$AqWls$oO{{=?}*IIm*X)Grn1$HKMBR1u9=ozu5)Us6DxAIss!to zSC#;j^A4Z-spzH~7)lrmWEF|~D~9!ET1pv1*qin~Yq6?`FtF$KZiwb|ryS?b3+~uU zdchCRBrMqGNw+3jyt;T7EPQI*)SMxrI9=5~6XX)CkcEI>lKyV(U$IX6rHu5fc3TVc znWSS0$xjsU-(QKUdGC_dyQ9y5CWI3g$p|=?JHj!_r&WyHwr+W1mkx9ce`&d?=a7BR z;@8}9iWdfum+wZ`P5%ztaLzHrVc8smS2Nf;%DH;aoX=Kk;$d?`o(R;Z*ezTA8+nnJ znb2l*V|$Dh9FxY+v8Lk8?{FBk$8@uNat3#_8`y)RA(TIY&^=<`cH-skKfSFWkkocS zDp78g3S3c|PjQept8qi$xN`D!@ejiBP$>^Jt440V*zO%e5$M?Vm%MSe6Kq)c*l8b4 ze+knN*p~&gqvm2La2RV__ui-K7Gdz}Vs39eAihlXvehve_EU44GE6sgNp8I{e&{+( z>gLLD@S%v*TImtCC_dp-G)Xu4(R$Yg&dIPGU%wDf@|s4`X6U{(S{ge+QGT~O!*v7| zztcnqM*Lbfh)eA5N1+GSd3Aj*2o|Zq`tpnj&VcI?{C|hDI-?NSo+DI z63w3(29z(_ySyKm)B=XIM)a613BLg!@&?$ssg^A>;#&1Zm$g25w-I~FLgKo$2Y*>| z>JnITev+|J7{&&0>yD))lp~M9X{nL=GK-y#G$~~z>axf=v+h(S>QFmaF_rRX;wkDZ#jNX(zb_MZu!5BG>yA|=E@ixr)~dwvq;-7>hIi=_ z{>=ATMNN_#?L|4Yi-dJllT(tF#)FO|x!J_ z=E>!V4}zwXXn*w2z9pBV{?WE<0V${&WKC^#3!+*dMu)O`6OR7EfHf!|kjx~6Z|cH^ zPgNh!wJ@+G9A$nlsa1*&tt}*jZ#v*iDMyDj_+UXYk{1mG{Y>q` zG}4*sG74&sgj<%fSkyHr?}Jg=8c#Ncl}XwIwY6j&cK;5yE^ri9>?bznc_XAJf zN%~L;Fw@m*TuY|XW90oBf7mX_0`;+1?tg6w{UxO4JC%=XebN4$$3eXLGe?+iF=s3L>XTj5y{t)Y9~?x3#e;3^f1-OcW1GF+#w ztO@8N^&vmc3`@)@pWpYpo~&VGc^#_^C9*`b$T4*doZ`QJ5D3`;?H2S1QTb&%_SpEG zuHKB-{;2n2nbn$a^X=>bc)dS7{K5>J|49?ewP|N0E$vco3IwCH#l1fb*hFIpDG-p& zO)V>qlS`jQn#7zqj>xfwEJ8;HEV|j{&{f{6A|vf1hsNK0{bW+nd7R}3soG({apKkzq7REGo`O- zpulKm{)MtPYssYV+2G{Z=}0O#`DHdYJi_HmTlzb3r*nD&!^DsM?6Bw5@{Jzb6-+)w zwv)axEj-2pnsxCx6Xn=K!k%{6EWDTea&&fs@3;BahDo9!{jp99IO1VnARC^{eLm`4bYKA!GaS^Y)))D6Wg}!iEZ1O*fu7% zHSxrpuw&ca&iuc-fA{R}*>hfZ*SoiLQTM*?x?Pn&(th{7o{#JAo{-UUfl!5HiWHuz z#!&Xuz21PPKQu}u=U{}#)M4Q-dZiXg*Q1T@)=saV^f7<9omPctJ@*3LwLM)}I0t}r?9qu!yN@{)Xtzy7eav(O;=zQ6ue6O2X zk+>^0^C=WPn}WlmzQ&PnovPbBPL;WB#n|&GHXo`PG(kypjcV6DwN&Rj`s@rnB>Wi7_3;XFa0!^mvjjz3U zaI>aFZ4V{VYz5b5$gMAQW&I-)cGF_J9qY=vfuQpGYwVs0H!p?U!$wW~?3!JZdw;La zo9A%$@XrNBc5@o?`zR@@$I&nRyQ??M3#c~2WAAi7M4T|?`guBNYN^@NZ2#W)m_2W< zQ*$XS^vhFs+IOFE-OxKDpy?grjyD+xqhGxO|Kf4!W61T;n`$+z#C1Gt;WPn!usudS ztGbd=7Voz*Rnj6=bFT<<@cr%RH{*!EN5@%Z1`OVv>E1+$+~8-oN|WNOZUF@#t9<Tn@Y~<_sPB3@-zhi8&Mqpsu9KAufpC`rL70FB}wU zUpgHyQfRQ#CgZ2blxl6K8{YSmA^Sw?5zLex&k;X6k2F2khx^9(I*WYp(yrI>WngCy zjxfP(R&eQGAdZ)W#Y~!VZ5M_WD-RTu8@?=|)8;Ta93ya_B0w;L!Xp=ls^J2}c-l~YmpPV7TDWq8t zu~xbXsEOaQa@gTbYS$28%>11G8GR^DL@^B5Xvoe|P$UiG{QIpTyZ_ZtrSC`sH1`cb zJ8`5LAqv5&&W{^ETvjII83O4`1y3&`ZVhcCuc!!NiP1()ch1o z$Ub2eGPjxVB(!;=lsf+l^0L*}%-b8q7NutO@IKr<_$5BYP|n9Z?;*dzyp2iN!>9_I`VpK=v(~f_d1amxuxh^jg+zb>P*Aj zg}z%wX!rGL${bT(@I5f)mR;wH<;#>nP6$saKf#QC|GM7LIZd28QH`Kp*elpI#IEcJ zKari_M(Eas!HMpOSKI>;fdF5yH~7=H10T>Qw2s^@+g#ype{bj~m}`cSC5}CutXDeM z5BMj9;qI_k|KJaU6Y&vwQo;Y~2@9v}bF@|!=#P_<0H1}Q#hV42MO6}Ihfy=G#4KVj zLM&oXcq4ox0<+%`Ae|S0*jhFiK{`bcJ!TxSAAuTSi?fO6LScphhH-|d$1B2M#$ZOE zu=`nc75ATxQ(_m2k;yn+!o;{*8WZ-B^V%PXq^A+>IqChlrjlniK6VSnM|Nf{6>^?I^Z0? z>bv)}z$JBm_4KD#fuB;W<*0f(4Aj znf|XXQ-krXIFec~(&pF#TXY@>N7`MEk*hdVLJA?dz$`ep@jsL=S@JVLV?vkgkz-4Mzxw{QB4N z|8vR+=YU(%e7Z@A{Dk}G;>>DaXm>qMyT6P@#ibH52n%`O-8Y zNH_wt5S$e2*dfnAaFTIL;A^X5#JX+VImaTHHm`#ydJ*<4>?}^X578STn7#FXI?|UA z0^ma62I{urkmGFZtx2231jU4h1e$~9g@%NN1e?R6!({wVzx+jJMy^LSF&m+elZ?|P z>JW4dI|ccRT90XBH)1lv7ss`%gqR+=Zn2yp=rf*X!6FjPIo}s8h8v{Lw7-Mqj&2On zoKf3^q#ZTV^eu`=T7guW2$Jwlpr}9f8>Hchfi+$r-6M)IXES3JGcchN#}^vHG;J(s z>#E-vJmE8;iF3=mXwaHEivi;R%IGEuUHP4EhcpNG-yERj;@IM%(Z=zfxYZo^!*adn z5zAcvoaG7t#OUv}E*L;BxrYQV!IGZ8F2@&Ruw5hEmnsLz->smXG!AE~%k9|OO9rsK z8?6ZbCv`3)&9?oE6U*&iwOb6WP@CC|PY`w{!yQ^2+Tl2tCde#SU zhF?+25=9S350ea`F8iQB`wd~3Vh!ong~(YO1RC;0RUHI)f@m{rFH5&VKG$4Pqv#E+ zGxjk~TfsYP?AV-k2L(UakG*g_3G0N8246ABJ%K~#ZYNDSz^%_eqI|#2wqWMm$dQR1 z=9x{2*l|i6y>jpSVfHS7YzadLbj?NPSc9&}^%xj(drF|H!$$^VgkXpZNejI|HfEqq z8Qm6bq#x5y&pr7IIBgWWYqs4sXbIr#KNMk1H`8Pbws@C_oDp93jU%b^Of z;`;If_S;IORJpGLyg5n7BaLlO!Q3V8p?8Af89h|$gTc3HBV8@zimijBV57SMY_GS9 zc9k3FU)FnjORUy_Z(BlMiutaKSVO7wE8C^*{;om#HkarGet(}6BkwL=F-~ZkUFA1R z)$h-eQ>VP%r*1}5yKi)}RBCgsefmGzp1ch?SlT{bj8vAlgp-86sYC}Mg^rw!D@d8{<@i{0=i-^yYw&v`dqD*Zc5l+YT;}Wsb}}Wt(t54!M*x)_V+9EQ>Pq&C5Lu`reb zVU?MJZJe2s0^hFuJ=2oiDxbUQ8j|JBG?P8Gu|rlPFI_89t(b1{U}l3ctYT{EVUESi z3PcmDwk2bPURPgY6$0-_yqRtmv*SLi=EzxPZfGI4OSrNOeyuvhs*=WTiMVN}7OPYD zM2-8=waV*^yy^v_s*|l%^TZ*_Y?QJp(E010MFPg6>zt=$l@~3WghN)+`;R{M%oD^WgLRD%s2zZgcfi zf1Hf`-f*+@IWP4aVAXEyZg-7Qo6+F5ZCL!kFoK^Milcke85cL-bG7-l;#n2u`mGpW z_GowpYuJ3J(YOh(X{XB(uQd4x@(^+bL+co)?=inivs@6P; z&3`D1v&ncg3jpujo$peZ@#pVc>X^dZWL}}!+>FymiBr?Y%GYLipNRQ^CXl^_rMi5; zWZ0qN!z30LPVqdy+d-XnnJh+1h~Pun^*L{xRziucm^l0FRVC#fOqEtg!feg`SRPjm z+_Tq@X?=Y;pS)VQLl1HKpbUT424#qV%n;^0-#o>jxw3o}x z9j+Y`CtGXY3IeNnA<9GFzoG*Ec8Gu$1AwF9^^$y&cXX@8=- zMp66Qx2p)wYlJ!H2fho5=a%eDDUN+tA(~QpzUf9!npVe9ou=lcQlD0+iN{tV@d=6T zmJ|OFM8Aemoz~W^&ST@#QmDFvy}hsMfpcP3qoQbtsY!%}Bj*l{ z#~Ubz6H~y7K6S)0xkGrE6rW>SHC%PWSii)uS?%Y-DzhoHIr;lt1U8;`XC&uJ>xV%g z8)NNv-P$NNW=6?M_|x;htiW&^4pJRz9j@8?2*|6c%~3kr61p9K%NdqxZI0MNLeHc_ zWr+rkM{CnfRD#&38KrS>%x|e}RP>5%E>u_U=Z_-0wlfme{ZueBrcmllu~b)U%ARlq zCJqEF`5>Rza+`j=)X*%viF-{@kh11t)Ekrit&7Z%PsosOAD=Mm^8FTb)}KB6=(^GC z*?xoUd_ZzEDL#|^^K2!1J$-r0q!0Ny-f^SlrUl?!51_3FSl0t^>jAIy2XB;b<`0u} z=h-hV8*Oa<$8P67QC=rGq6_i^P6maGboR-M-|fG$2GBHh2UK>gs_(6L=WgE*ySGev z=rt@Z|B5-w8VfO00kBok)>2K~WWX%e;h%sn!J^$ZJHRm1`Y1wdL5QJG4uU=?LJ;I_ z+!Nk4i;w)|mFqfFw2b>{u>&gaj)j+AVMcY6gN6d2}nWf~%oz zO{;Dz)AA?!CIhP`171n*e6o1_)1lye_xm$oIyeCFP>(L3G+$!RjxHAznLx4fCW|dBg)i*zo&3usXEGM7^QH#a z%-u0&D{PZIzc;wPmi*N&omJa1`Cxf-UK(LrlD!|#96DDyY}g|6Lc=b}y!BSgzndP= zlJ8PFDRg__F`42){5$piSFSI_&4SsnS(})1>%i!AU;?qU>tcD9D-{cbY}s_$yNL|^ zx)BoRcHfGDPnwy`2aj>6=MbDKwv+3qB~FxOrpfaDqiUv{jre8`dFxISwof3NPVS+$ zO|#(rVuW5(_V0=_nK#@ei423)#D(}lv3sUw^Ntiw)071S$`ckR!u8JSKkK7^x<-C? zmH#21gFmtUPJ!xPYehb0SY);@VbG}nGw-sp^h`S<3K z{D7fX$5q&M;|sCtr`RYQNE%to*dUlv4bSLb(TTiO^OWj}S7amG$t=LH;yUX99`%+g zv$N*vCh|6b{z(s&qYI{Ih-Sf*j9Bj9)t;$eM5s%N9$|{`1aeJY^B-kXI%Rf;Qn`Oi z|1izfOl3)!<_MAJNRhc?uV4Q8@W^db=qcOnWlMo*_6cfkDu!gMzzaJ5#gE?m#Ry@B z;R>c+=HTP(BhhK_rD#l-zbYG7M1;wt9!ti&bzc&B|OiWY&2*Uzh|*2_(in$SKfNxF>^MkA8uVW(NB@Gdk#7`bHjeq zU*VwcJQ58FD;=8=UF-s0!i!zfi#{T;r^@xG#x~LK(3)52>fy%MFbwYzKz@u!_T0H%j4@YTu7^Du#<MxACbq0RyFQ0x+|(&fuj%` zN6xT&`0WTbo(LH?vqND>7OQ#bJNVsS$(-Zarps&6!`oa+h2b$Rh@Q>VCLrhnrN=-s zoBlQpooTf=AnF$;PvJdW-al*#{XvqQFF|dQs%-hl2Ilhn;96Xqb&4$U6JPX|Kf8dm z^y9ZMrUF9^6tpSL%RfW^mDi2GXbMSlEZdSMH4L9yhL;o+`chxPcNtS6+q%@I$G}mQpM2{MA;J5l+%~*fuTm_=oRE! z7{%9bLjcCJDRge@t8lXq9_w@@cwW%k1}<(cW?!^O!XZ|P5L*C>Uv-CQd%)SL=Ye47 zpV|WQEL%N*llKwO41>2Zk)%&?UaM`0eu`h&W*;yX< zm{r@si+t@N2X!u?xuJQ2xfW8-C5eN(_J+wrVSO!j&~$G8z0ANwuU8B^2Bx9KOp>)4 zT5i!3@?qu~{9yqC;-pLHB2oP?h=&Hk12tRl`OI2nV|SuY&i=qa_^(LHL{Ay)%mj>V zhU7kr!q%UHK#SXby|?Rqy|7>wUIJtzv|xTInWFq=n-?mFO^q zsv%#os*S#VmdsAhn3Wt+-TKnxQ^`19n$eu*T*IksYx)LJ`HHR+qjOzERnMi4+m5ag z4G=>~fsVHD>3n;*r^U5G_KsN7z;SAluv$N+{cs)`P3R9thOMM@?J-$yvGlf=+n0sl zA6fQ+377sR10Y%UkqMWC@cx46TLOBbX09_gz#l(OwVDuFFNiH&LXvA$k#yJb>(3-Z!;oYd5o?QKk#6lT z)ySbmuhTmxs6)_`EnI2RY5~Br*tN=4!syl9!EY?@h2N=t^sz1$_uZK?@31+}W}4e~ zWe>%1`}G0Z7tHK!&J$KUQr9+ocJI$AS{|nTSX*uHaCCNbadimDobU_#J+fd-Pd?1; z*N^#Is}HvU&n)TpwD8qaGl1uZkEj3Oaimn$E!FgljlOfDQfc?D9(1CX+t<`2ecuVZ z#P2)h@4avJ;j8^H2zXFl`*yxNQt3bPxbuki=ApDEfc20A*o*zg;N#y^)v4dJRlNd#7MfM#xT$@Zj_Fd5*EW+1i%A#p3_rtbzCdv*Y`G2F80xJf@FD%ncm}BJ`XD$_WVw1Jq=dLq;z5% zJ?r_cuxUfgCe;tkSCe`fjzMEkm`e90Qlyr{upr^GLS)3TpOkEiHDbCC+KUppMml&Q zi&0bZF-$~b09rXIn4Pp=OD?UNw37;X(V?G~Y%3SVkeA|*D#}IzRG33QDA|_HQN*#m zoW?KGPLjX&;1smVC>zO8;*R}-QvF^iTaT+_ETlqS0r2(i*O{PqWzq8K2t~8Vv*xemwZeW;mAgvmmk-cZt{Srk-eL{ zW><>hO8hL^lxpLMIxs3sxU`F~XQR-mBK4+79^mA`T%v;Bln!>{+#)C2f-EPU+6mT9 z4*rl}%bJ4DOb#X>>;IZ%pPF!)DAF2-dajII+ZdE_X(i__AqgcBylLN0A{9uF%x2$@ zDkY>qtn(XMo(eitq%{pSM-63+wBL?%%Y&>h2`bgTUs_5?;y5$)y89_3L4p3SJyy$> zELpw~vCbs)1tqj$#3i@fqkv>t5)=-n;8Qnm3Y{WqH6WNFDcBZeOG@rhOY)E&xq3VJ zA}JUjWy@0TQBm@c3c1=am|0h{EP?0jg0oKrrGgBndJp^uQ0xx7R)3%#2HpeQ)@Y}2kQ7( zx9rv+fQ_ViD~FcVrYN$_z$zYE& ze-*|>h3R(y4lIcjNgIVeeiZH!agRp@R+OV`k;y3x6O>4jJuy?1?I6w-uXu+nm2kZ? z3KMsZ0Z|8Js4#1;bbwXxvn}^E4R&YaKsrq&`u9Gk{8;`!DNuIyfk1R|>M(W>P9R!L z0z5DfE)Z}kW_!YD5ybOLqd?x+|CHV>;vR-90|fXZF6lp|!4|c<|NPX0JmQk?UjbP^ zWL91*KW)O;mhh)y7}CK%Ie`jJ@$iedg#N^oF7~~mI>7{LS}Q~BJ@lz52+Eez zCk;Z<*cPlF0KMs-lEi2m~u6LwlsLjs?)anp> zkAHTJ4DoB`r%I*~mw2Co93n1xKR>s%1o=M^r-_l@2R;!iMIQh4VX(+!#3w;AD9GyI zXET#Upgs}flAyRg32jh_Mn3VSh`)X6QbZ<%^;vv|(zpAml0pR1r)oqb$YY#9#cD}~ zzJ69~Mj(B*H(!`o#qm=;En<;>{Xl};?(li9M(q4=M6*Q>`#u}*88Ho9oUXzKf*rmq z3=YczIon4lOng=$E75!Y8$od?w%h&Bp%Is4u!MZBP0g8jX{`0=i7{m0h5YHNH$Rk% zgXHhSc}WDycM8U%27bTOD-QKohMne>jOzy>_~rhfmjdds2=US#nZq9}ml&Y$?N1Tj z8-V-B0+M?Ll0yk<#c}BY+6@5XkpxHB?oEYytVg^wLFPyU(MmK3IikV%2?1ezy>ne5JW+fGP;dvm@=%ZEaX;?SQQwim4Njn9 z-vg)hpO-yTpw>cxJE+0v1t*kyGt^oNSPu!{fv?v|1R#O%8t>2l^koV?pzs@Gk=2&M zG^BeD6z)U-IfyWy?5j62M=00;_^;c#OHjL`ej|V@?sB$2FE}g%tzHz8pQD(-lA|+g zz8Cc2CgUwc-M1k}XMLfE8>*!!5da4Qu0$_(u49+RvkFx$FC+pHK%uXHlPi~c>*pO* z?-edbp#LgVue2`U2eCaUWGpe@P^mlIKQ*cskE1rl-`K~$2Q`4(5#SCgcL`#P7J$lW zPYmLQ;;-J?OCt)9!{vzZ?|7cSRyE>YO9y)(1my6YU0T+mp7#eNLbv`j*kb*K`mXoq zl{7X-=+G0yrz-R5L9UO2+e+f~?;h0ya(AJ2c>WV zID!s&`)7&(_;6bT{pt96S49EcxUC8PmB3O_13btQs5Brd5ooEsL8yO1PB3tZ9=>hMCJ$s zV;}|$^7V#^7?42fN%f9<`y)mPbhm1llYoT$5bo@L6-Vay306Z6VCBPjm&EsM65E47Zbl82*rTLBy*)1l}_Y_VbndMwB7)Fo^RRPY5<%G9=SWQiPy? zh5$(`T#QV%54wZVgK`F39{44b#i-q3=4s zIuT-XWXy>wj#M`=iS1b-<%sf-#&7-gBYRmtEkud-`w~bu%7MHUr#%Kpv4$!Aw|9m* z&qW8Ijlk5&4F2A-V!Aou^aRN-E;FUS*$nR;;IL-`c{57ij7;ax0!sxB&JT!>3FeP% z^AluTAEf+{vJ$hC2crps(SUJiN)gr|{#Mox0;U^r2LKExjN$~~C+!V?L^^*)p*qS6 zMYn}H@#QxJ8RTgo2rdGs!%YJ!xOwZ}4#g7-rjGirSQK!D+nVFgcO^T3bn*g@z?0xF zpy+;!b)n!>f->y(hCxw^i0~T3K)td;@(Bs#J}}1!5?`|8 zK7xbzY>cx&MDhB7LGp?U^)SAz>~J~I01}xaDL-J zdzwDzk}+I?>MK6&!E^WTU-8TNYFp$~8LO6p=XLQ@?8+`t)_JJf886^lmKnFZW| z@}|7fhbWOBxe;E2{e_C=z+y21a5yhvL7zKgETWME)a?OF;I|Q$*sBq}G@O^*pwA+# zFj06Y+ zyPKI8AV+*jj({sDK$LO>;)W662LRg9ZNv}kj_}@0PT)o}o0-~{!z>BD(I2n_{Ye4q zh91!32oM2h4-#<+B1U`vokm)*Ox-A z{RvQpqU^Fu2RkPNy#Vwc0fi`Hdqwqff0|Ipw_^3sL{R_+LY6deoPYr&L;$+Dt^WQ( zCbP>+Ul${sGCMed78Ej4#59<_Iv>^R#bJ;2c?+3EZTh5#z!MIXs);=(0(-I3y9Zox z;)k4<`mtu!UA=jmVD^?qhGYr_-Bou$Y-gpIC84;n8>0V;{`7DvLVUzGA-Ghfxg-?^Y%Bv{28aZ;k4=OI}5h_$m}V3rY&o4W}J)O=4;s zU_MK-R%AR%N|bPzK2MtdTm46+g72I)Et;%nbfzGg7TX;@EhI6mF*FS+kvy8}0whAS!KGB& zS6*w4G0D26n0HL3s-i;yRCcOT_QbOxpvXScupeID+yv86ugS#BYRy$@hHnHmIP~L&5U{42{FeqysG8v zJWc>}gFP^_pL;ONK@DJ4ra5d=6W7@9B+>L^*%-n4B;!0_V^N3zqLWsI=8SChcYvlt z3A}YpSrsm>aL+zaYjezsXQEAIoFPj>HGDOtQ(5!4UW%c4sGgEqzaZ#*p<0Uh&h`8J z0fHfiq0BuPkWsgC=DVGM<4x2Kv&ZZ>q*Vv~nwWWumrg1&7wuw;s&VnQ_23hE{g^Uo z{j7NDu72dgcFMS8@AAH3DvGa0&uE5Aq`JbLm8WAc$uY|zRo3XH2^}(U%TJ_cife;w zY<8?sKKmHyVz}q&G~}S951?5LNj{mt8kQcs24TSXEQMC0|L+J93Gf6CI7z^I3d!J~ zoPuo|Sq}9gkHM&)MWx|B&&nG-mgOGNs2RiMwz(-wwvW+Z6iD{sAnxs}BvVLquUTMj z&n`ru2ws=&} zK;{!U!H>02-6~VV)2qINWnX>hC(x;$d*~B^r)Q-v?9e~g3?}IrpUU3&@)8r{ zyojE_zI$>LqMg*%sdReJe@U$&sye-Y(`cUzoT$|dYt<}AmNP{JZIYVI-(%HMmhK89x!8}~nUBEx zig0uiZIfhR924c#GMp356Z&MivSqlG8IKUFCE2CPlN}N#6*HWp%o9ds+x=zQ6&R1y zmWozM6NT1_;H47TBnkc;?X49_j}%FNO|)frH<(;LeZ$%$-l1-F=((}DcKhZAV;b6) zt{$JR4r^-5bWY8DW4nWo$-Cr3!e~?oX){CfmnLA#s%h-fCFi5aiP!bF;i~on#z%nr z4j(pbQb^y@H@MA1tt!S zaVHD}7&@(!OT=)Sl`N94=bAO!rx1EDXrvp7IKp4Gq^C( zsQgk3PtO6#KG1ZXxIa4gnj2e+*JAhERK>$KkcZv64Gi{>m?hnD#@v_iHa8QshFv>d z%7R2MqGVHRU^O@+Wl;3|nE4E3AB4;GV?LFw{2F@8zHsM|l?McehK)!7G#{#RMW;_) z$F~tG+dCc+G#}vsSLMr4k4k>YUU8C2MMvLTkiF@XXAwG+lKkd+k@#EZpH_U6l}AW( z5$R(X$P&pN6IJ}S^VS|CO;r#KE7eR(C%Tkjt*1*KX5HGAH~)63Z~m~TP30@MD4&tu zY_hQUTlH)!n|ZfxHy3Ty7~gQQ_@JZZ71q7J}F-3`;n?q$>G zcC^}Mr%7s-i%Uy>*v!hf$zp}WroB0eO*pe?V*Y*xyV0jfvnb|v(_^D>fTODaG4+b| zOt!wIJHN{3tjg}J|DFBX&imoNX2kpqyqzsB2S*G{FEfGof6R#azXf`c5)l$+Vg7%I z&@NW9a#B`B(+wk+C7?1t3sUN(R++tx55+*zg1HT$Is#LM4d=17i?xyRv}{~obh~JH(6qYnvAtgJ z$=v{%hOL5u|5hQw8_N5wTntN$#(phmm>NlGv5q=vCm3>znlGB>BREj zNMB~)o(7iV%5>rH|waX9}C#G6=UJp)ujqu51gj4u5Xl_$%EgnV_?9lmz z0V-)}(xL@*LIWL-5}EJxh2wQTTVKzx=<W5&a){yHjRyXvn-`&*4fO9jwv zr4dn7(@siRY1yEZ!DqH(4rt+LQ88Xij+mz;YpUj zvDMqetB;uD`8=G66Uj|P$XX)f{KIfm5mZlEJ-%8>NcON)lVxo?oq|`?bN&q((s34| z;^o!VF(l`;+EGsH>JmY?ACaelh)W7|@ z`>I$rGdZR=+6n0sbe?N6W0a8hIog%y;Xl$lHP0n#J33aQ8r;XCoH!U1a&O2z96&G^ zwm`lLe(i#}r{Mq$7IKsUY6D4NVqtDSa@~>z^pUqt#MSj()MmoFM%sR9&y*zB;H1xB zGHY-)sfk*2J3Bxkxkr9pi%jvrmv2U7UuxvglLEdUB)GES&t~HS=!XKjdeS=}GZY)FH*lmbBz4i;2-7Jvv@eZipk0omzvxn8T zTyMh1rr{IZTh}hjx^(jmK3#0weiDNww z^>sCFtEVr3OF;q}^0-?msZ+!|y<9*4!o^dctY&HCFeV`h4VTi_1>J%5oI!MyZd+UC zjm_s`<^{o{OPcJ$4q%BZq^~8(&x)?#$WgV6pqzTsKv7)epefm91>JP6qqX)zNUV@>%B!bW&Gkd52d^dx$Qs%oGZ8M_n_{cqqjtvcO$=d zs^#416qFYyxZ~7*z<2=vMu%@;+$lFb1BI(oynMvfYWg*$}pC*T(~Oormsnt)!Pu?WQkP-X|Uh5t*AdY}P)syKkfTd{ z&7SUP8fVRL)CABP>M3E}7i0T|*2T?MZzg-He+C4as|46i^3lgqZu_N7rF%85GL;NE z_uU}@=Z)9i&jz~FyDMrszg@qTHu_36uBe2YzT2*qw$~SV6 zH#nxdInJS5U56Ob7_%HzfKaWWI-;(4J*8^itR!N@*6M49JCWB>EjXChPm!};^X;^4 zx(jc02CdVRoTPT@e6NJ*H4h_6MGVZiZ63fQuXvFM)2`;Uyg%UQS&*jw0lLGHF7P!9 z^t-rnRHFvGOO10685DXv`yvw%|;Ogc%6_u@wU{SLRD(**SH7G^E? zuk>5wfONX7J;eQQ^HxwoXDCw)kB!hlc7z#SX_+5*+hlvF64%jJ5ZxgWoLL1)>kk9q z2u#9noh%>M=AajoC!~WOwy><<>kYfB4B}D1+ zu;Tf_f+E_gA&`o{AZ7H&oCoh<|1&Y4CeUs*ckblQkiLAG~Ru^6vhCe{+bKbDzO2((a2R556m z9m<-7iE1o*d4Sn}2&}|5+k=I3X*@_qLgN z^ZHJ3koD0<@YCn+5`-9=f&TmK-Yss_LE;h4Eoc;`@}c}~Lclxi%s7N+NYuL#X@p+# zVU5_Ud(4Tx*%f=lhD5%~b4S1i%e40EGh39K#%s`E2kralHZR6S!y{%CqQ-0HU>Gf* z(G^payvA$TU@7gpRngTgR@4;yEkB8mAO-wwaX>fo^b&+%8IlkR7l|sAPoxA=gjhT& zDLtD6u_g+YSO#Gzj%bC%&aty(8fm;?(WsCeQu^zk?IDs!n_yD0l4-d33F5FpN{lvI zv4(F0Mzm248oPBPW{SPr))*nQks8s)ihl}%MX6xFM=@jU(Nb%u)R!44P85U=x?`Yf z$e1ui406&=CjT~(ltE5nnK*CsGJ|TbE*d>PE<4sZXq#1RYOh+T2)|OTmaAFcYvicF z){!fn7~`jR)#l>1IoC=?n9ymM-g8`Dd45@Bt7_KyQNGOwj}bO7dtBS(PN%0GHgQx% zr%Ozk-?w0jnzUl#wu0g8(zvn~)f!KzoH%ajKwH;(_PVN{2GITS0F_Z4$n2-)Gw?h7 z3Dgq`MNN=3<8Js?4Gks(EtSl`yC!NFg~gMx5=yF(O9$V)lEDxbUO4$K(p0+C2uxB& z^l?(ps)?$h?;Au%X~1d=6<$gq_fU41+Vse~rWU<5jBELzCtA{Wod?#8-BQ9HPjdcu z4PwT)ne!t%BZ06e9V=`mSyM^lk7=p&?Xj(FjF#eo{iZgYY#X*O;bN~_=@=U;>?@!K zEuk?bNmPYodOsYT|3Wz5tHMZ$nVB~>wn-|encL~-&+>ZMgzW?_F4T7A-G*aK$AD;c z+IBSPPKWmrB1AQGjj2~e8%5G$B<0uE1lFq^MjB-nlYsv|uV^1JwGi(8b3ioP4~!X( zklC=_0W*}&AklBmCrsLw4AEWSS!}K{k{2^MNnc~fwmCv||Bmv9poyq6uF55uo8I2SiP)QEwL zStJcLt53wzoBq{8i#HXy*#>3Cn?oj-#Jy)17+&|VxYwf~%(3wdX z;~*kEp)7G!nB!M{kk2(O0w40?p61)|%LwqGio8opX3Glj{KWAwRec#Ie0>_3sc=Y{ zSr6@gcpGz7u?w^AKtl`+oAzO|A!KdS*V5D@?OPkcJy;zN`aJCg_%mQYK7(9K9gD4LTw_jRhEl_IDcd9TXw}Xm! zzivBVR~_9Ii<8+kG+81{aSbEy+B;pv7kHw~&>dOstE5q2O&kKuhxX~BLbio8bx5_4 zd<;7pNim?cINYg^a+@}`>(K8H5+aulmN}_$vemZ)cKbar%rb-0hX+>_Y(=u%J5MI;@eHYlS5kh|IW5*+ z0q=)HG|35NlrgTnxF)6DFy{(F?ct8OSH?f807#A7EBC2OcZzR2nu1Njtv*m(;(Hqo zW3gCo`+ALIXIeYsUbFq#jCquCpk~frXOo5ml=h&{!=%2DxYwl?KWaC*b9eS-N&OWS zI;SWZQEF`Z3M!l)u<2n&4bww25jz__+-OvDvm(S!BUr_RSI;!T$hZzQ(digJs996y z)NGi&+@FGA1}HroIgnJN%;m?~(NWqCQXMT|mM*|2m29TzphZC3q^v9IN7(EYn5iE% z1j7wIMfv^|>-!_%8X0|sAx<3;k;UBcsrnmd{DilvxeoSC3aNR?idk^nVw0k?4zmHK z!>SsWLUhAOlPli#vW0eG=lv$M7Kx)S|9vD>RVMLp%raOZj^@usk?CDZzK9uV$zKhq zrG}z1lF5FnyWq~(9_f`OB=CoxXeRX{7y8d zmQ;~u>rD4KGbd}J+4*LU{+9`+r>cY|X%WIv0rE&O(i)tMM;IqZC-ujMG*`p2@H1Z0 zY*A;@-I*GM1R<7EjSP1n3el9XCLWnGujMgiA~qVhrbYIi_~Gwdk#_Qk>ZFk>xFC2) zzY(ujr_FFdk8|Q1;iOA6_#JTuGME($DQ2uo8V>@jmyAC@cu7y(sAcEO;UFZ#c1wR+ zppgkq4qD$Rd?#R)Wl706veqiIj}e%v1DqFBqV*R91RotpH=2GSLLukh(oGYZTD(Ip zxgu#v4Lvf4EDjYq&)YS1;^golA0OBS>8wi&HfP#JNwcInrWZVOq%J~NkxHcw_b}H! z6rZQsfP0*g*(|DLA|D`E7BZFMHAjU6=oK1GZ(U){gKn$MH|Cp?HJU@-9Y4ZF&dI}YXP8e)!d+tqm=b>c zB)llbZAWzB7e15k^X6AICf&~sKl+mv_vFz~4Sl@?{$$nbms$UAbr|N%E%soQP-xC< zKd^z8NKUddvzr>noj+Qm_@F(14*Fzkew_y)dmgTfx+Z2kP0EcgdoOezM2=W^{>732 zKY+ZZ;M}gv2Y$CkIFWranq1pBvU&zc z$+pWqy{kL_2HSKI@akiJ-IpF&ZF4L>^6gA~WH>Gt0QH3C@*#X?rm*LPOQdf;#&eGU z3iTHS_EqETQa>>`(mKCTC|+a`w3axYI@pJ<*|WfAPTK_+@Ao!9ThP5B^TjQ z2L7`93-;}0EC`=Gw>KNW=}Ru`W5XAIh)ZLT+#0GIg@8>oSnqDvN8;X}VBXMxaS%HQ zZ!7?feCZzhFv`u>m91egUr+!Ah%XFa>g%gXul&Lnzf`S1cHx89W>#UjAdfd+^dTSr z`rCbZrR|;K%ueZn^eEN~;P(%O)7LgV&+k7f?4V*Yq&SZjg{79+@ho$Pjj3Wxrex4W zFHzbPt!B)3aA22&=B5NmmB#0APe)5tOlZxD?iZ>zFLbU;7>c-$L&R(n+}A2<=7*3& zkrfK`VpW)(*{6_bxsz}P)5mIEczd^UpeD=uT}x3eQjmLO7Kv2lisZ-e#JM-ea0rs? zT7W9tknWl;r9lzGx1@sYEzg?#wAn$GPN&cf8#_x-vbF!FQfJMedQQZfnsld>9GfwY zsEqfXgjyd~;Z;VyrHI}0-xzzx;LHMOOSEI#w!Wle+qP}nM#r}8q+@jKMQP-lrShLS7!=32JbFYw2HIn( ztfzU?82%yFW~j95LMzXQnTJoGPUoZ4JxhKp$kpGxe%}fUVBxX{wT5o=4=n}rTfRz^ zQJJ&Bi&_22_4ILv3KLcQxrgbAoTz&E1btx z1^}G~)fS_Q4KSIF@KR@nwDI@`RsW(6Rc~ZtCV$j6!qXnWyX@r+&yO#cK7k+424MbF zI{^^S+m^pHy49|W^#$HHKkIZ#`JY_{eC-()PwRPwNBy>22I(oNnHzGHso|IdcBsg1 ziJysz=w?M;jEOKJ^iOUiZ@@H!Mxkowh&ML(EDC;zuK*eeUwN@Tnfic0kzI1N=sMLpEf9aXaO3*x_h(P4Umm2M(;(NTH>7`- zFFe?iDZJ$oWdg*U^ctjc@2du9a`-p{`+X^x0Ln zfUcsctz7(DsXKO1bp%}+zm`GtmleG_Pk+B2wFtf)9YNS)vA43VY}7)YaNF8%4<5P4 zmZ_>8O0UU{7;~D?N9@PU>cM^fODSF#6ze$e_b147+b*}>M8KWGmdn>LaRdrq+PC3Y zZ-8=az;f6I;rT6?rx&n_fHfB)c@!SIgI5uvGH|nu2zCR;uGuqB{ z20FQM(9KQgS^lG z`r_MB$eF74vys($OY$^6;kprs$M!~HdSG5L5QhK2VR{(P99!dgkVOoFKV$}HG*l5*SWrdqOq_tuf9+?e5=s?ojNm+}&Dr|H(vmr>@xel= zhd&?o0pdn{R`FUh{4@k`U3z<))vp7&1$(0&*oxbQ7B=3QpQm=%O~=1Awv!9GrF|n0 zbq#;Bgb=GC5kUMo^C`g;^BjPI!779uDhu-k^L@6?3u-^{Y)Yw0MaQ`=VDgS5B zfn3d(096f)udPfDujDbZKyp(Ox*yAGH-pONmNSM=DF0U)|La_iw-80>_UoQ++ty>BB_9KQ z|KkCdA8C8rgmgfO!ji7iRPG8|EeyuQt-Fa?)GMfBUhWupU@!<^wm#-3{K@u?C z4gX&O=*YnhhSWod;6eJP})y%H#aK^5m0D*_X4d9V5(BOA|&zWijF3KOeV1Qr|E>A$AEXQEt`-@LeV z6M$j_(`Rkuij4ql#9!Dt-M5mv=ltYunC!fdeVc5tIaJu*Oz(|=if z6#gnjpCQ#CMvt5ov`BUxPw8pHSy{G=1N?F0r7{FBO2cV=ZF%-^eS@gX%KGs63s$CZ zCWT6~wWFh5DQJf%<6W5BE=3>}Xj80oe{)0ut;P_x+ulD z)UsYww{{yrir3~lih$J)gs;^hu^EINu`*XfiNsmon-wLdcYNy4ic zYNYY0_Ozgu{HwQH7$K-PZV~CpcyJyoo`H5-fU(~LA*RZX^+ybjmgk?LZ8i=pV$#gQ z;-ul(?M?)S6ms`T(UE5D(QDaWlv(vA$WYs7Lf=M?rx~~@>4>)~iN3Uo#Jn@Ob<~80 zn6H+h5z2iOwk&Hcm^pQSj8C2t%<#p)Dsm*Os>Q?!d?wRC`EKn_0#1QM8Adg#G2;?O z+|b{8)8At?7G*Jd^NTM$8eTkY?M)1ARJOxtN{tJcCuzLOeo~~q3B(XbSb-XJ%K%Vw z!xh|(%9dE|;C8NTa~DYRqtzE?p1+#BJh*HSZLe?ZJSR_Bsv?AFnvInKW`#j)FB0;BlioCfVC3 z`f4=o3(!1ppPBrPcgmd~N!8Ci$NI!=jdgymS-|V|Pk&Dbb~}U*I4eyfKJCiYN7W7RRkgR0#7C5lL^^N3L@UzXA0w-z;;3?JlDktLrNkGrqHUYw_BfUr}JND_yNr@BA> z6k)1GKw=(M*WZ9JXO(ljnLsoET)X6&3vaP&|5;aDTge&DENq<2j>;LhyV)1Y=KZS5 zj>^lTSo#dXDH_xMRgvPcaYT6BZs#c-7rv5K5h+o|y^@)s^;D1(T+TbR6Q2QKI)__L zk}hKWz?VDN?zm_^k5P_n;+l-nbJbg>?$rC8Z9=Zbwx|w}QHvaHmpy!W`P4TEiA@5` zFYi~2vpMQ5=bg{Z@Cu3D2A^a4gN_GaAm5dQfVJM%5a9;=Xl*TZThfY9$>DM2kwD7t z!#&ZA#>nwX_SKAZrx=M+ z5wy51dyW)(DFEFFDL_s99VR$8jAOcR%L;Nj8<Hf60Dx?4iW-%{^zr7L&5v96RE zts4zf1RqY?c%UF0FxjKXQs}!i(}ic}ya`L?WBz$!nK`N&S`)?*lw48%)0f@9EP}jN zkTA`P1=5t3nW%&l?qOOl$sEL?w`}>^cHQX0Wm`Dg2A5osxMgStm4t3Vw0zna@AKL2 zoutYUb}K2Hlnh65_n#1S6rS9YS{8FomN%8MUl!go;$xpbwwN2HsCd%Hyh(QFFF>7? zKxO`sK#vi>lWjJVoVT7wtTbyY4Yn1`b^-aDny!pD1BoAq`exJhhn(;_T65;mOnz*fm_vx|n{L=?o=bzyxy) zZtX)~WPGe8t5>mTGg)r6e$KYkrK%}U&Aq#5ERJi7X9TLCyol81ABImgc8l&MpL}k` zY6ySt2>a7BtZRQf!7PL^p0YRourRS0woJN5dQukeSO)JH_ye@XiDh>~c)zwWfXfa3 ztiGfo2>3-!Vdfml>@~{%(wm}7`ZbWIN1rOc=Bv_ZC|}@Tn#R1Qc3rugvPi#v2D>*$ z(;X-2Qqv=7H|_jE;jBwKVs_UhS$oU`$6yE|V88Zk_b0^Q=iC`$k!GLYoHZ6#W$GgC z(_eY4?YX8!naho&KYTe9(GG|?Pb-f$qvR#GX!Yg^q z3BzT0#wx38bNJ)3!j%e-nsbQ4Yjb}MPo^|7AKr3rZyBy^nHFptOTAO&rp}Sj?AWc0 zObtv6g?WZp#02w^xWSJ$M-WIOHMKISEpRVKRO=F`m9P0@Dx?qy6=LC?a#rkHn&l2= zi0WuLOve|iYO|We6uRjPwLg*KVvl9=R*{Fk@J$3>EzxR{nh3%ggr=?U;nkkwEWYcz4DE+i$eeS!T;auFy*{loNN^x z9Bj=@MgHGrlitME$i*dB%}xbZ1KppVj(z~upa@k~aGsr}$W%oR7jB8Nz$yvUOGvKi zG91HxA9tm>Uh^JrO<=|#VLH=lge2FB`=3sLM1Yw2+QSB%kYEJMM_;?ocVEdh?bV*% z`|0{L3-hNnpl{}iE7OvB!Y=%94f%_Jw?=qQ`$M%>6AMABsVaC}EYoU3~tCzG6 z*8S=yHT@(in`hr3%LJJwJK>s!Lpm$lPk(-RJYdw?rZ+R+Vs;y3vZn5A9xNoaE=F&e zg*m-AzTVYnZksO2lGOkwZUy|EVZ5yhn2M81-9Ki(FJ?^mH-Rf9c`gRSgY3GXlf^apq0d4uj5s*A7zsj2DUv*eCf}?9?G9tH;-$&1ZWDZ-HdOkAt!$o{R zq-Mh2rnXu!-I8+Gj6BWCoD2%>>A9&;CeM>>^LWz)R;@NExR^n6q<-Vx{$?-er#eM_ z>3bLQ=>!-?i8vN;9Ek{bGz2QyJznBodSclGtf9%d%wIiHK9uh!;WvZ+fyyI4L^!V0 zs2>E7`+^1+aS7!%tX^qQQ}ZBwS4!T|UTB)c!H>)z6&fa|mI^y=J+Dq6y4u@|pU>0L z#Y#oRN?bxH)mu}F=Xk`*tpMY&xB7MyG;`xLLGg}}#`Ov5Qz! zj&@-JY?XZ@J&$1;|8+aDhb7Gxyjk*{sJ{$@?i8K=A&}BC zX9mVeJ&VfEy#FU=&VL~Mr5=k}x8FHK|2t>=H>cA7kux-f{=fNRT^UaTnXh;q)~bE% z7o8yXdIK4_r%4cl5O^?n+$FRTX|23IrWI&(sa~Tt$~(ds(gEE2MP&&!g_;wf>yYOi zqt-bmFOiO%L{`nZ%G=z#Lm~g_H1p$ld;1HVG4vYrq@Mu71I%$(AF9L2z_JJ07!roW zJoH&PqMew~kUs)~JXDfK6TS#d29^-;97Uq*>>7^Meo9A>B#B26p1ncOOS{C2ew?i4;SRg>ESqj?W* zw?2P+%!+1$)oY50j^)>6DXOJhVqq#z0SE!}UXUef;h`ptN}+p_)3suk60EiUhcB=UB@KfE?jkpZtv zeKS655%CXmgcRiLwN)o#l0$5|8sCYQjuof+w`Y_Z#x`-4q1+HRJN54kE zu~L=WpR8f0U-J_1Ya^R$o(~i6!Q_|lg;9ysc^Mr4gVA*{i8H3dB8DY)Uylz6*+|;V5jAfGpOf6u z@kqj=Thtoeli>8D1s7JNWOF$C*I$ahzR%cnpHRB%BaUB?)3jCrnWpJY5x{T-7#n;P z?O640#t0I@sW21@QzpEAj63|&_Hb5>(_+Zlp=_$y`m-n^Al?^79;`2XO@n>nvBkr{ zc3Q(irNqxA8hRjAn~?I(r>s9At_1ke^$mNtuDJFG#NzBhP(ck}gB^;A0`;e2NYoEwBV29BMF)HCz7;n`Zv#VL& zB9Xz}n-aAk{Fk+i{pLty`v-mwGB;~ zRtF)5!GgkPj==`O_Yw=ErS3AgPI;0Bd8NZKZ1V)C2WHR;ko}as;70BOK4nH91h8 z1HWyx@25SdQ&r&lhU3_u2?P#%jKAxl8;RlhMpba@@EfNCdIKHnv59RXg00yM>tge0i96F>uozxA^|&1J}CG-Eh;LH$l*!hC5;$hyyZSo;Y=Fw*Y;#M`$ zA^S5FP?fjCDKAmyvP2VeCA8?QYBE=n7cD}?TqinJa+=*a znOTFBS5cjv+1I{zJ(XZ|toj?bwi{+xCHJE;Fu*tNqK@ExNp@x8)oY&j@~1^C#!3Af z_DBe9JFB_q2s;}9{i!96soCqQqoogJLcKv9Hk1Z8M(#(GDDZO!Hk1!l9#q{?OfIIX z+f#WJwwU!X6@F<%bF8JNMPKl}Fssn&K_(=TWr1^Q#3X7ld? zvx|~-^#J=v;`3S-9&EIF-Nj!-%|yv=dxbCO2@9&KIhjhHS`zF?Z6T$b=iouIaqW%C zE#rz;d$RL&G#x3W0FU{u`PH*8W7?)?4e%OEi45&x6~@S{K4*9E<+CAPqaQ2XoDF59 zOQ89OI##WO#edh#Uc4ZcCmyBf_Fvy}?8J)rWR&;L;%#P&ykT}k{5ZS*BG|7Lbu7S? zl|z;wP$emEW=A#Pf-|M@4)g)c=cNfQm5EoqEWoy@if%tp3)god&wdS2ER*%{KG zS~+eiZI(-zeORAk?3~hzPlIj>Bid!iI9b!tHE^6gRpgLSMpmp@UaYyKh&wW?YEo4` z^)Ci-p<1-KGIqQMi^|^NV+Q*0TY^lXK-C(RpB+G?z0L0A!cFueFzZF#lmbc8YKS6i zoGn$Sz0FWIwOm%^unI-DZU7(y~#(j;U zjUeN7dTr6FV0Znnu|$M!EURi^1+R5VMU*PjHEOUO`o+j6)Lb=UfM7nZ*a&#(@ZnaX9Mcy^`enZ{RuZX-G(?uPeM7!>@z^N>gj)sz@5u&}v7&foOwU6hf(MCXL-HG&=rG|F>5866EiFMR6~SrjL&O&_XHm|L+v7}T{LBU z13&-yK3o+;dWU-v!vj2XTCA1u*ZD;b$iiTGypG<&RksEWU6o|_9ekgZMOb8KdjKHj zu>X|D%e+2yV(_Zf`C#r3p2(QBlh_#!^+;<&P&%`p2z6x!=Skuyr))Rk4csU`X|PKe!NA0irmsvxg8S7_C5 zt26N*C;s}u>d9u@MXn=V%>i+F#T^M}tD)#&u%rB0*leV;vo2Fybk2sn=cto|5FwYn z^Ig{&VMgw#%~EisUhcPsE%8A!9nD3Hm|n)EY5K#MKlBh4GdC`Zi*2Z)9##MTJjYx0 zY(wpAr5S;X+H@ltM~q(rGoOFs7d?NcW4OQe0knY5F?~cs$vn;z{E;bp&Cy(K;6~_5 zIIh~{iK;hmOnc4*FFQ-X&&f^WIkZfn=;k{m0m%=4eG- z%|Z6De$3k9NzH}0lY6>4L1gzyNrGx#!$E9d@&o6TFE0g^qBH8S)3{$IDvT?VcASYJ zf797xHZqbz5OacB+sv;`C=!Qqr;v2#DBCeL_+3e_n9V@G#+k^VEn=R;^#ikP42OA@ z6sJ4zE~k!cjilExp3Fw%QafskDXJnp5xQb~FMQ*)S~=rIPpi{-4PvagB3{aksZ%hI zMPwKPzOE4Q$hP35=9Fp+^m62XRzMl*>szM~4rka^%t{mJ=!08g>0$Y`z&YF81*W`) z?xeMg8fnUA{I@5Wv(plb0&olEmc+R~O8qT$#)PN{`Y7QvV%74L%~_{N*7=Kc;yevQ z^E%9e-Y+Cftj~NbPyvLeFW_HjEJ^dYr z`?sYm8VjsVcA}GaMy~s|xGGNW&z!rQ+XinHh_ia0ugSZkkMH?K?AI_w%u~ITyV-~F2kpO>xj6*y4S?J+L0~=E&4ql9%nYt0 zf0hC_kh@WV_Gj*2Mtxt1u_qMywVi2S1zMENWN-IKS2MD{EKYU;0iv=dMITnyun(oZCF6Aj}J)6ek1 z&GJR|o^b^F2?Bt9ewB9Ms6^a!fpf;!dpEDPuf1DvHMu*));O$K4Bi7wqw_IV@j^M) zLxdHh#a+-}a=tKCr~@lV9jmBin=wPJ`5sluA6_$m^GCMl5s4q8#i2p%f%?Ci-=Zx{ z#FwbRTnUfM5yV^Sp?}fQ|JsM^_yEO#WVe`B>@MoSzB^x_z@BD!nJ}KMaPLTCwfnaq zEsOi1Ih}IQ*2luezZIlA))%OwMSbrSb8|H)B-6UD^VEkfe~5@bX<{?CpD`xjC+xnT zV86h1CGjzLF`ky2(W3h0Tu%_b6@4nV7D3>s$)5H=s3D&umE~?s**$$Xc{RK%$`~GR zKY96LzihE3N@)T4?ZfFmtgIW35_2vbqlVQW#C|W@joy65EUThnnAd>{x2VP`tQWg@ zrkzt(J0k9eHl>lCF_kNaOq!Zv7SXYvE-@cElr$5yHBx#Hg%UX zz`zLXQ}Z%t!20trEu;|~e!xcauPrTL`E>T*GwngTNT}5_%e8gf7s!9z@*<3N>Wh8r zsMNl78C?IpE${zXLY1rWrh~tT<8R?%lxBu%2u5-g^qWKvb4BiEjygm<0ecU%I6>67 ziol$zevG+uHB(MlN5@C0xcSL5a!tlIRl9<%1$Cacrg!o9bUUT|@-4T!{|a}m517fa z{X&23!3XU9x_=4)#U7+0dDzQt%#e#PRL88sky;VTSzy8%>`G83IpHkbca31M;xb4W zf-&M@ZZr+%L=#4|N7hGvA)bQ$mlJnS;%eN0^UW0yc}C1byYq1KRTy~^SqUTxy#duv z*-v-Xow;>}_Ap_J&^UN8G4fY)uRD8=jLWyS#FyuyaS#Q%B!;AFMKI8HSj^q3jA_aI z48E0Jk}<<)At0LIjI$e?xXsD@yVhRl22Oc+AW50rl8muhI7o9}jf0g*GyQM@v3?uo z9d894W0uqsmL@vhfOL#ye!0=al}$;JGpcF+nvp3p=97qhbEHxm_O=}8c#=5V@HXx) z-Nt5_7RLA0+RJK_*w(Z9n#Z!DFYan(S%(FI@NEvgKgSawO4=AGv2-fMQsujJ%YsmN zd!JTQJ@aBXPJs4Vg32l6bcQETSLl-ZNQG*aNRpNvX1@FguFVveh-M7P_^HAQfGypC zjZSoq2H{K?L-8&t;Ird)xov1V?GPDvKP$0H?5sIbt;lxNopuc&$#Lf8p_)8qM_V;Oy-93TMeQOUZt60b}@qWQ?=eGF;n{8+}$#blV>wWgz z_2@TsWPm9H!^vYx)$M8fqXaKQFNOJ{Xms1X8l*tG*gGFj;3 ze8k}l@qmBF?Jd*;#M2xyDG|~F4b2hWF|QfVidZP|4@D4a%#3Fx#M`pa|B$PH1LzZU zN}+VurE|BzWjxc6$-gcZZ)*d$_nGevcaS`%``$E-uc|<6_v3NnHoCr|)g|PXx3qA6 z092url{e9*w3b?sk+S5Oe`a`W0*aZ0dU6JgJA>ZA2m+XINYW7Aafqx|{Qta~pjPSF zvF1xtiMhNfN#ItmPq<=ni@HO82E`-jCZccp;LWRxTpTGkgJuJu%a2_$T|#ReYKFVR zR4tLmk7VSym9kiBHvp+QEZY~UN2JRstveWSHkX{{oEOS7DS%a(iYHa1uUl^0CgheC z-n{OPSGGxUYbrg0@fyvOk0hEpBfRibw^t*oG2F(g@u*;uJBlD@6jxE}@VFRRzo|#q z;tsw!9S2R0HH$m*wN%=q!(r#z^50uC8}*bd_(e^FaFJC2eRJ2?{<+-7hQWluSKye?7tKPDqQlw<}qQ6RTA7KdkcC=5swtpoV2K+mQ z&qZstvR)JgMn7%ygf?}ks9G~h#cx-4F&Gugf7!qlaVk?|KQKd}UhSpZGaN{SQ*t0L z`}fF^^%)RjU!D`S!Ct~X@xwbJ+`{Oqa6gg`>oxU-bGp;=30>@BwU&MRzw!?e41Re2 z@K^TgP9()l@*UTbcmVh+U8+2%&*Ug(_e|GOLx5oGevDt3vpNz`+JVbG<0^>H#C^a9 z6}It2Arq=jJ)?3H&M}oNI5ytIV_D5U(y9Vle2M}@b_`aC<83Tw>hbO2p@?;C5(~tQwRNL598l&4JA~cX6tHo9x zGvuMv$qo>7MV}$%o+&yYLTc_-+!646HH9av6J#v2Vjj^fNK7|b^@Enh$oi6X%dsnq zd9!yVVOybL|5G^o)k4H*HcA8)wzPZ2bySjhziwsWR z4IV^_F(irddH8_v^;JJ(3@Fe5Lb+G4^n@mQF4Jd_H7RqJfMB~V7$MujBZ8jEYuI4B z?)LOTNOUBEZAEpU*Iu;(hIsD@Zcn5}`hE0WU6mM+6D0V9Lh9geDbR>a8T`)Mp(6>z zWn<2pu*DX@UqgBYPb6dOt# z2Exgloi8TC+g}ju;&sI?M}U@kV91;Yg2yxC>KDYLWQTga8^k*3SKlK}!1jXMMTSzd z2Zmn$?vxb8OaQ{BKmPSOR%!CG6G!tV+E#lIq4vhm2yBn?Sj+ewVw>m&#TU!H7PLvs z){pcCi0iupKJ!~Y$P2L7SCadV$*zD92>_g9cnGIiuy?WjqaOLp6jh)#**dgq}ASDr1j>!Dc z1GN3|#6&gN6{PxuPm)$sv3?Ypj;8}Cv*C*QBxM@Y2$Zu=$MI(AeC?@K!!Q2*^VCNw z>?-GWU?Df^8&T1&VY%}xNDZK~ZjXx?yXP~fkywuTMpWoT$g{?DC~6+0!7ngd?zPvL zCuHO5SUl&{1L3m5#{Q(vvA1gcyCk)OWLDQ_s6B5XnQ|)~S!MeDJJVf}q>R-@ zq3=xW@>Uq&N2Nh??evEjl;b$Nk@@*P77cjF0-bceCzL0%(ij8a9{3t>9t=l01Vq~XR`}yOR1|ElPnwvuB zPpRD9-(_u&p4!6_DwR8{4^7=eg+0rgSoj6vfl3Y`hvB@&A72;hZxuF%7|DtWK&r+V z%l4aK2tdn0$^aTQ)o;ORVe=|SjZ&4XG=Uva2)4{IdCP(rIvJ*tzMt=mviStQ)*A`c zYR)=itVdCW3TM$BFTy%oTNDmq(Ib_M1naLA{uFW9|3-IPt~4K%e6;QBa};Znx4Jb* z3VfRD)?@N`D{urVig;tjQR=Rk)~q%Mog)3~XQBA23FosE$7*XG}6`6aU` z+N_`+M)txD8w7UOxI^ANJhvpDWXKs3;E;>^&i@00l?OHx$Luf@duSk2?m%DiHTesH zTLzs=9Z3Sgl`oLDRvd0rXNP9;b|J;KO42{lCJUBG&v4?LPAmE}$RVy6(2r5n1KXP) zS~d4>0q7j;lyUmN^jyv?->0xfYSqS3*T|W{vovQx@olPe{AP%2PP#1p-Sy zz?-4%4Q(s3IH7gwlO8oBt*=_w=0d_WOs%nYcBOj$+8=Cwr3BJp3?M$n0GWS4zfy|( zuf!6%$(v8)#&?i$v2f=IN)*$SN$+Q}qm2B_!heEcHNVl5N88DJdC(s}%)Zam{NIJv z{{w;jU-;{P@Ha$_T#Zy5+?-9!{wI5*R8`JpP7$3i9$cB`XLAIGfOfRni!JOz>~FaK zsRb#X8qG%%Q^wo`Y8d$sqT0>Qc{w-T-!=hJ0t2@_SdhpIOC39#2R$xVd{1P)Z?~r` zzfb{6)NLqY;5M-K;!bd_FEZjn>O%5Dc}D##K56zGfAcKbr~2J<1NqD|s@mg@&*Qci zE_-nNyI(#oC$sOc!bbTf8s4Gcl_}Rv6Kw3)O(Sg5Os*a~fBtz=byz*nTF?z1I783b zf|6eiF!zFgVgp`QZfb17>G0XM!aJp?J+&*Ky6SB1a*+2iAzZDx=yle^z>;Qx## zoMiBOWL=^}7;z;pBK}K%O&s5s-$MIo9aESLN?XwTD@l0C^?|2+_Pw(tJ`P^x7cT@v zSa>FJLk$l>^X?N}xk~P1jv~yxXK=YDJV~7>O|ZC~R@dQaFS|?bNQ4pLEq0Wqg`}J+ z7b!r|WJNF%Yyy7q3!6mb7X8A>*LxvO07?##YHejX%&uIo%ngU=aL!PvEZl$#7=vR@ z^V#yO-4;caIVOiA^KI&bsrF@LLpd=3@VkS>Hb3!zIYy@7k@-R*86=)%k;|WgxchC2 zv+8&Sw&DZArC=e-xm+)4LHC0=5YAL1aZpUy=?-L5(saMwB&6wGLz0N(8hr}^I2nD8 zK$^}N9tG{eR{%c{Dz%PkRg#H96*}RnPtq%!S4FzoEYwJUJ79{|?z@Y4XdnV}L3d772<3D(L|eN{s2v^J)J7s&X3N!Me;} z$lC|^<3|SWj~^`m*DCivg7tq7&s0q>L-a$8uWnNgmdsp7+W{2O7*b^CpGBnP(9YJ3 z=`i6!I;$7*1AFFFSN4p*f7WPr-L%wTD4>%qX$!6tR2U)&UDkB}?AEF2zRstzw4YPgmi>lw6p|%3ODUpp+Je^qbH&=73?L%Oh`gHHiw(jx&MIMypm+V=)$JeF_im3dG=XT!!UEb%=Fvxf1p*r+;ZJ@(VM-&I^JElYB zb1vt-4@Q9EtwiSMSa|D=1<_|vZ`5;kP;c}rk@0Rm>?g&(KZFCVr^HY%8|!{s&=>V{ zU62PxS2;5DKB_n`YD_KLUStH0j!JJ%Y8ABD#H1!EP7K8|WN~-c)9K*sl^&1Bw)~Bo zgOo0c9$~yK`(6kR0?8j9!wS&s0fIuoWE>l|4$??+omjWki8JU>r9U=$yh$kzl&rR} z_K1+A<^`e4SMQ=kMe=s>l%_m`hm2ctg>x7PII;#w zXOsYCexIMcTIOM^S1VzXla^USObqnebq3{#P4yqdbNm+?m zv$7b_1gPfm_2M_oCVaf|P0LS|WJ-uJt0sfVC}jOaF>=^rhgyZ1JD`G=w9psb;+U~q=Et`xvxXBZGF2F{+M@k=WE?sYpB`T{a@q>BIb$9X>?m4@RyNdEIeOVe9 zGSlG!7(9zd)Hs3i;CKN$spAw<1^3E_8H-vneG@vZA?0Z`sQWXm1Gha$c%s_hJwqC@mP0cSY(wE+jX(_MXZh zzE`9gAwCarIK|;UJfuIzGVimzS{W2P$COId#*X6t7ouJQm)8tP_Wer_PD^IoLtf6i zFv`JQbh317q+4bJ_S_&MDk+LBgy?9&n8oOdU37{*OJPh#%FVv(OaNnRK5tKcE}BxV z!tZ6eNCtk=hO_Rr5rpSolSCOx345VvrirjpLkH`%`EJmVM zE^KQyBDsI@SKAsYNk9`7am4MSG5y7Lu0nD|-u6(Ikm7@(@=k0d{lvYB1 zlp6pgfU+$QbYS883hGjVf6Y8N9Mrd5^hfQk3o+}0cGChRDE_YYC)`OJI?(dLO$B^Rw8 z%Vo`q8flomsXL4o=GLFfQMpWoKP1JKd0`6-q)B;O>_5lMk`XUUtDk*tXxk>hv! zRNR23jJ?=fb~4sVFk!VT;2%B|Ir8E79gIG|9|8<=nJc^dcFhDjy zTU0PmhaUo%7e>(*`xJTx44*p?hV)Di*fi!$=>MAau7?iQ9O%_gFUCIpV^QVEjLSsu zliDJ`YIVE);u!R?>KoV9gm#43<3(*{lxm?qnKJS}&{Gl{0@?ca16G-OEqklJ&)dr@ zERl3XvhI-a_S%K1b(N_#_^+2|HSXZ|)%qB_N?url<^WwY*!^WSEti1QN!m&k>K4ADA}V7}P{f7V^_EYuCFj@?hmuMSCTI8>!?y`%F+3SmCBQ*IjMVH`1w#Gqwpo#FOg19;nGXU$Cj&*gAtG4~=XW)IWCE zdKM70cL7NnDA6T$Xa{X4@Q9i01d;vj(%1v;r>F(54os2=E<10f)&YyRK3rvBpL1bC zvQ`$R7sm_IxP4=>x_D*HZzBy?DIh7Oj+HexGPh%@Im5JN765soL3nxq%Lkfr2E|mF zV&1^TBn3uw?WC$|LlL)%5^(()k;L#E(1!i@bfm3JXwvT3*!Aeg6t{A7dahRl(#HNp znw-SXbnTn#E?Y9nTu+3zJ(id0x#1 zDSTJunRS_ha+rjf2+A=&wT!}Zu!xmG?o{{lE#{5s<_J7WJ~+KB9`(0Ru1WoTv$fY{ z<)K@Zw(6;N^OXx&>cDDy0Vd<`H6=ke?t&|Y;BndgGhJdCz4_-r)`WWkVt%9Y`T=12 zF=G~!Fc%wBmbv9ZQs8L1_<;^g<{dlQ`}nJ^lhEBUl!7Q7*sz0FD>8PW2^TsFbA&J?$W69VbaMpT-hf*-&U=aVtJu^d}fVnTh}ua7qK z_omL6;*vBhuFSzWa^rP2|MKAj`8CbOPU}QkTg>+SXGrQlrdK^GCqOIYj~}Jq{J;M@iTHmT2*iy{TpgUf{^!_Qqb}!) zr-AXA7r?qdJ1W1hGBsHGThK-)k|HbYhcj;FioMO*N`KU5iQ+~Bt2-sZ^k{LS30P@U z={vf%c7dR9p<=%+-qOC=gub9CjP_0d zFM?CbVPJHe8b(hTD*zW%mCaI9#Yy@qT{ULRPj9GggF{tz^n(S!U$yJvsZF1+aT_D* zFGN2rou4;!#9w)_ar=GOxFv@sUBNe{xT(3R^a87ro*S>jJu?C_Vzyxz@6- z(etX6%g|b=F*m49_f$p=WJ|K&V6`rENp>-?6@YH}X9>bPn;Pw0jMg)N}XKqXLjm1#WaIbTm;)h`Yp`KT)5aDW3dsQ>VJ(U zSeJ%V9=P1bJ)bG|0rz%2#Zr6(M}(vGW##r4ZYkjF3gtUEBQm|-+QabSXUZ_5j)gI zXfk9l$tKdJ{ZsD4YXo-=W@_ZxHQ2*+9_xC=;*(0A6JvF1OYE~rE8G3fwY%eOGlv70 zHd7O=UGaxL7FO5T2n>dzLCNT@Wi_{Ov{rYWS^ubQW$K-|`63u#VRs{tlx>;;BDwax z}C4joW4?bmmJVnpT2TyFWj|jdjCto6+d=WxS?T(xz_!^Zu^cM@eXh*# z3w?Xu4w*;g77Dv3(QUnj1KiKxXQFUBkL(=IufrKhsmOALY=fRXytGnAC&o5RjYP?&TyZN;2j$W;D3F0}1-EmUIu zc_MDNZ1&Oh@i%!6zD)0Tkvit+)egtgKRr_SC~-YgVlVKam31O}-($djFkD6G&XR9x z7YbFnRhmD0o5>%V*(h|v{qnd%2n@`1k_ni)O2DX$_xzMyr-jt)?3X(Lu8-k1^uV$B zIIai5=>r=+xhw_1W^gUpM_hj`Q!8cpNBhQ}(CE~z{XI*zFvA{J=CUr!^m6#>yvDu|@D1WUU|cju{CF-`e(W@* zNIasZFHR?%(6usVBdak_d8#qQY24t76NCj9p`{Rz1uFJr+1dW;9SC#w4_mY{WO>R2 zF2Qj1pEGSHNq4jK6GsXLN-f5UliWntZVA5-gGOFsy6V8(^hly6Io<=|RRw#DPAP6$ zkgg0e5np<9hSGgIwuF>tML{e1ZZNA>KIeImnt!@}L@BLDc)tjof4 zwGzJ9;z64yt-KRI&n?pm+X0euy<+0@iY~%@>lH&BrrCu(|INqG5&bW`M4L zE}u!3ESx>28W;Nrnyhp0kl4h~=OhoN0f#mrzY~J%4y1{gQc?6= z3SfFo=Y4Uidk+pD89dI|?`s*ny)yR%i>Y|62E)7+WXc|V8N5vlzfmz@m@ap1$I!S1 zqT^HuGvPYzg;V+z9b&8Vlpcyv`Wy_na@8J!BG*>5)8_lg`+9jFagK%wH)D#M-PIZN7D*cuDj z_g~OAeXjf?II4umGGYMF#YQtAOKB#gjVi1JV$*4(g=9oAY84RSl2j;)1fP_8g43E5D>H@uLq z))J-+6q?EmzV1fDjoL=wL?zc2_*ZQst7_2BB_a;~O}V2C*HH20>vNw-Wh{w`k6fI! z_YSE}@5CnhEL-DXS3j3N5K|r#j0b|+*~#hpw`)Ejis8IkTMR>CdBH4I6iIHILt6#r zI33rTcBs~-GTI&O9F?-08Ep3SoRmv|qax-6GbIVHWfVDGE)iqxIB2AEoaniPQmQs6 zA@&r07=Pnf7;nev@=s5LVNnz}NA>OpVTC*lbrS`Xd)zT8J1H^EnXRsh@SBWl?sv5iYe% z5GR(zvUqgJFLl;jV(#Asf~n$vu-(pl-4U=*1(+|^$~-WR(+sw1{t=mb?Ex{)(mkb5 zMPD!e0TJ7nV6RpcKCNj-u%|=dsggWY+~wU7Z)Bc@TZd2n0gy>^R{sLU30`9KmLt;^ zAt{2iRpS=)5;JDx8na*OiYeLv39=&%l_czhoJ3AKJtYk8h!9MH|J0vjRh01H;6DU| zM0A?No#8A@SR;T19fdLwYdi9GLIWGW@UoJo!mR9|1JkFxrj`0K8`CG`jp-}Xwp?w5 zzOxuzM_{1+=~+9Oamp!0# z*DIAqk`b0B--i8l7GA=#e4gQ=wI8@hsR@WVrCVr67Ci^O$+FZa=s(lUaiwjru8Bvv zk$0#p&zbOh-jRKmN^Cc6-tJ;~$;^&UAyZ0rvhZ4bt;+f%yEjxRkVz<=7RtE2bAsf) z_kBli5FqJJy^V09;UAK>2t~#e7sbR3hKTksvy*O&TFj?~|82E$( zpjUD(4fzrRcceS^2*y@8kpI}H zlWB<#L2ESb0i~9k;wi`e*<$Phr2Vulg9=Gr!m>Gp+t2vfvvR5_qvPd{K8_5&sz#k7 zD1J_qh)$o*w(*$hwUY|@TK`&B2X7cykh}rPP2qz=FS7OnfLwCXUG}N3UBoTw$nJkXuE@ zz4UfC$&paNpD@O$MFqjws{LOP?hE`yEyBuUIH;l^LkRmmUR~}A(|k~rqy2NoT#Nw2 z4avR6g%sb|Y5ET|c%MdzOi|?y9=ZTx3ft;kUnPfxooCLf$y`k9KY_X-0QW3OU1tYXrI)(&zf z4&mTO`kIRx=n&P-7&xuzAIAKBD<~a72fGiZ{7(>|O{1MVcO$MVc~#%DEgnJ3;lR!S3imdc+P z8|5BT<8^|Bs4k$UQh+j&4}=qM2pdRuYb=JduutCLh4*EPPN~IsPz`9Qg;klIW*!~! zCNc4y#s}3UNU=-sxsz(J; z)_dTzMt(@%x>kN+TV(FY(0VYX8E{){YMmjzkzG) z!>vR2!7uPJE`Eg?c&#yfwRt@1QPBALS8*d@_Z&ahwMx1*N2NM#u6c4pO;$;LB`2I2 zvdSeaYRAAJlL&vVA6Tpu-yLx`O|*U*iQmo!1#P|O8wC3$6T-cPUY``Yka#wt!VqSG zi@2h;sWk(9Y&3k1MrPwn!x=KYvd13t{DD%dW!P9KDNZ^Mxq=5cz!k?QABR^joA7})}UA$(jWM%a20OOa54 zZO=p$tpH2=?S;eSp;Q5%3B{}BHC0VMwOhv~m}Tljw&*IPX{)Nk+Nr_$s(fkr%f}@+4FEL$nx?1i#k1yt z`-I~p9{2OT%mkn^<>Ttr;xj5*J0=q|fm1iFoK&EUY1phqmOuue`N;$)@ z)PR)~dqdU|=f3$}Ho)%KPgO)My%v=r^%Xjh;(=^NWc6M#a=T2hSDm!RO751;@| z*w=UbZ(Uy5#Z^?SGBh?EZe~rp!k(5I{5DlG)w#v3?wUJWD-8_^OtGtSE1u0c`_>9_ zCt=#2yU-V68zIJh+-lSN=zC4&4j%b}{f1%$%gUM`y${J)FX%L{{AMV>+E^R5k>%qL@Kou6e5*vn?LdfBg zC3O^IV37Odnl6is7sXYUkghZ={J*%1w0(M4u&~dbg4jE|1~Tm!K|eYNvbJM&q7D)s zqz=oPn^vNq-XsARrH)~JdU4mp_D+r)5*!Hxyt7q*estHiQ}}s8-p|U-AA$nrV&`We zRl>@a>%v7xF~L2itdI@1!w-q`M-R%P58Xq222mr0PhqMN-kr5szsi@EWce>Ny7Ky* z05f`tfsU;M!C(#~)J(1kkkZnstJiYodJn{OJ3fCDXAbfi0_j-TJICatu z3kJy>g?CdstTO+Fj&db{`5Irs$Mf+iprJ)W-!FYpUF6_o8>d?-2mD$xSI&J>RKRhF zzu8_j1QlC}hJcKZq^(DU2soms^Jw6lty2T*ZtA5OOG| zn!vO^etHAbm8L zOlOqd-xjF*FHNnAo&BF}G5DNx2PkMo!M9$qgY{%#0bn~myQbUmjSS@vgKn@l?TAPV%WdPt{UQu6!Po}5jg4QX~U2=xlI9l6B( zN6a>h+bG=w^c&h;w6hXXW-B!kmY9<{Uy%ihOAZr!k+9%#Doe5-YH?d`Vop@Fe4N&J zvWD?Eqgj4iRsPFxbD3zAP~~`fnObMB61|3Cx#0#p=imEi`6G_^-~;sRwE4;X?zlPN zn_`I-j{$)?DD}jY;`+;rh~Uq-gR*@Z2{jwoW|5EJbkDdvU7z#pMUQ&pRZLhGFajsO zWQ?*5a+CU7OhtfaXNH^QHznWWnO4W;a)owHgHh==W!XE-Z8cEqff49HUY?n(Y;wo8 z=~(hI=0ag-ba@J=P3jI9=sp|KE=Dx)f2O)fBhYIE9x$6BG~mnH@Ni_-=`0H6P8X`+ z%oy{8Q{l!?7rASnq0G|fzsTS{j!KyX#B)4#Rq!QZGUs!3`F`_ydh+x-v(`GyS?@yo zB}<_~HPfN5Bl>(*c}ZiYA&KC} zJ!^sYBo&lN1QAFg1wG~?Q>zNAD)R~|W<%LvXiu;i%+AheG}f3Bkl^^nqPn{Fa$}kn zEaYu(_7n3A7i0#>@Qs(276cR|9cmETLAUCzg7T^W5{B@XMn*yL2?r}X3oj)O6_k}|x?KFj?o^Nd1efd*)f9LEKmNpLWM=nAbCS;aOb>x?0FOqjRSP3uu?`wnUs4Eq#MO|o;u;LR%O9ikk@ z+x$%iv42eDFmH*T>M0&DZ;_tLwPC~B78o8?^$l;Uwa)Xa7D{lZWOSjDPj+Qud`<#!}R_w24iIrnpsx_1m05w6`&! zVL#p#5S_dya~8`Kg9hEw3knVY$Pl#V2(m|xUZ z5v(TEnsQ#!w2ElIp(isgFh_$j5l^y2KN;c(2s}R-mZ(CN)Udt}8rbGrqA-lprxc;1 zo7P^GtWwjg4o+Jzn|78iekxnxCa9n}G~gCPnjgO>L*_U4yGmu7_&jBBNU+gaL}kxz zCy{fla|VAM#-~eS2HxL7zEH*-SsEb_e}-OqQDhdqaiM(EgJT1bX5 zE1q;;I6g1CE@SRU|8>4>Go#iDn&fG^Ub81>w!Gr`6sC#G5Sr^sVKbCxR6rf1W8a{XYELy1ly_f(U zx`-n=h!cR53o?&lDVJ1E4zDyIMe0;*(pR`8G8rSk8%#=%5hOENqgTcg7*g7h?CebVvrlc0WBK1^OBKbmQ z+sdHDpz?vMf}JOzi_D0gnr0dw0l?D_M|wIWtedjC6rBE;nk4 zvs9*fGQNOK8jn`eP2s;O@qbhOCnaIJ%sF(0$=IA3P@{49BG*@N{4LpmOZHN627LOp z4r4&1>hFIb!=-ii+*sQkcx)-LM)27}I-xWh)Ux@$&F)l(66|n5woYnS6U2C&Avw{f zp+)w9!x>#Gr7wV!!KHVpOOkfwVKf{|m8da)62tZ)9{I9x*g|RG>*)ev_a*}CZF$z;KB$V*5l#DT5XXlFR-<Da3&dVJ;wJShB&!JVE1083KdDKUdi#GoR0bf z25pLlmG|^KrPKtHcQ0On4CUc2ZbQNq%J?C0`f&S*JyIW~_mSAV7_$xaKYIA6<$<0u zTq$u%3knPTz24kfJ5WW}*bm_vqf<>xKLd*Y9)TWy%4_I{@SW=aU z@OJZ`$;i4NW4w_U`TV6g)N}t3czmoWGR>#&vp3>LyqGuL*XZ2TpX`}*Q0}&oq~FoJ zUM)?fQJJK9D-MIrSlr2PLhBsH@Tj4T?pnza)N38!ZRs~X8_g5)Ca6?92&Nmz~0d3m*2c{2(O5=V2a8> z@`SP{eVrkF%|QC3g7gma?}@^AV*~L4le&j$9QQCy(bW7iKCX-BslW7(sw! zO_uHD#Q=#kz_0c_X^S6o`9cD5jfZ3f@MtTLk3y8s?C(slb+0_fuhqUaENrz5wqHA9 zJa#|&lW66|FWn-}zOHX*AxojkyoFY8=yE53Uhj4=itK zn;4!uoHoL+;+Cx*J{qelU(!g-X~|AI_MMt-LRn7#I1RKiG~tmbk!IfmsGNhHhw!MC z>fjy%XgTO$wJNvs*aUF0q_xqC5~du23Z%UJwTMW=fGQ)8HZUp~a!2{VkVr_E{TTwq zsFARul{zbPc=Xa9E8_}_0_l^W(;78sjJf|=nJI{(-t1oK`bQv6aO6EYqUMOT`%298 z{g16%Eow(5dSvl+>+rP|IK`bhUaAeAyla>u<FHHG0XC*{8lIsNYx^(;jVg#})u?`G6|vsTx< zP#0Mz=p}9Jtfq%vDKnbCRXZ-=t1!RMaREa-J1L+{(h$0yr zS>16ra9e$@{fy7jo2dqK4E>FKpzS}-~LT-QJGJ-hT;X2-Ob zViA77hOF7A1QJ7+x66$ax`YTK!#C0)gY+4y(O>9qk}6Ldl^A%kZxW2p zX%d14I%C@(6Z7uyWaEgFO#H#@uu6gzOTs%D`l86}q%Cb@ za!tZQBbsmE(nWfqXPkDM^TcwA>_VAu^80QsDmDV-#yc#~;V$82Z&mU$1#Y|`Ak*-2 zA5vzc2%!aXTCL+e=25C)Rrv>56G#t|>k*tR*ZNnLXk|*W#aE;HC*^NGQxxr(bbVx; zap6FiR;>*Vp}0IT%p*K&Fts`v)89C!gklo_7H~Z9`9cup_*K4t38L5dtzQ1dp|G$X zjK77er4fro9*C{sx2)a~?Y8bpZ#)itl zy0kZ|T16`U;90;1aEAccMO?r(xl_}P6MceQjpdlW!G`TI;OlpVKyC0ZJP&b=isUuI z6VXaINh#rXiT{`c6md^H}HNX-TQA_Lm-0 z{8-cd@!DGv^qH=zCpk&Sxrg?X%o`4!lZ%#^901CFcTf!D1+>0Q#&*ewc{H&^deKor z0EQs9vk5U(F-qD)z&(!6HiFOIyUmiN59mwyfz#p>P&}6b?Cs0YS4=CWD;4J+T0#wc za907^LyM13o7SieXacQ~ZE$xo0sSevtXt}UYL$?V5Q-t};MHQ2g=fnt zyP*SV3z=7$S8atoHz)k@FzTZ(eM-+gU}&hO_LX||nt&83i=FKXiUvcstJvs$DGP~i z&K=j;DkvrVVza%E>>VHjrC_!%9du(1{LS~g{#0#FF)*sr#vq>4@pt^o*XmlZq_Mm* z59|^%sGMMi4egPdh>++`+fSKmBeqgKtO$&I)&f1rbURA3)=0pCK^+u}Qr$G`t|C35 z=cFGQ`e1*}%_jbw4uG18^rfR^8!Eaka^&#yd1BWND$NYNZ(y?!r4KhB@<(?fq*ICI z(}(DNPGLL9LP8_>!&8wK1+0XV3fOo^lQC&o;{}gM&*@ZlK!!;m!N@lt!JUdT2g8SR zFBH2;JfN&+6gn~F0u~Wh1>bP$U3{ygIKjwLQT^w?G*9p@XGG%M7Fc-3iG;asfVpDL zk&Kk=#(V%M?gl`;mHv9<7z)0U-!)#TEncaReS;P`v8!DC_7#qinQH8U=V@s&5+Y3*%NKJC{Rv0SC zO%~=ClP>@3B>uxFE^75Fv)%nw%TfL}C$X8~|D3#0@-s3>CTQN>S-2gP0soxKpqi+f zhPM2i$Vtidt2U4#_%JFE5*h8B(VaskuTQTl#rNkF7I32EU@>SkSxx2V8^PwaIUi?C z=fBada&9s}67}VoJ0HH?w{d4)zQ12+GX6yC;YUehUGZW>Bjt$ONrul64zug+w<3`g zqRH$VB9s6>mTy!-hMM^qS{1o=9DxFc1?BU$H`60Cn_Dw>mFlDB2g^)lK3;e~rty-u z$ZC>GpPZ;3M%d0Fo@U=&Y+F_+-(#q3$@9wmQqG(M*jn}^I<6KA%6E`PrxFL!6*SDY zVKa}0u!OIX`FnZTk;kF|uA zN$EgnMAfq#NdR^H%F`aRkO{b21hEfbG4(eHbf&&Kv2|k8Jt-t>G4O1PY-5(EwFD#1M*(-v{V!C0+5! z$;vAukc~)$?H0|AyDwL+e}z@y$vdSxf_sa1CR4kk_3e_tj)@1WkZ@RI zozN2=a|Z!|azD9lb47|tdzeqttU{mk(2mg;j<{|V$hpYXJN!<4+v4GW#l>OK!O`L2 z3+ASwk(Hq-wH+;ByAKiEI0o=^JwvDa0xfQ$v<_sz;?@NRymJM2wwYEJW8_EFtrnD` zL&ShQjZ)g|HF>7XG1e%XU@gUye;efUUz}_Hb1bV4dP41n`}0SY_Rk;A|KGIz|8@tR zQipKWTypxJi7bpeJh38NOIBH1T{dl$U}jFHGi4Y}Hq48=0w=K(DKIh9Wh96(uH6bo zNNyBU5ETIDU>pQk01k&4OxEwU24ekN&onh3Ov#%b3nGeH|Ho|9X9qJ%n1LWFyW8_? z{N=3kWxDNU^XL0z)8PjF;S;y#7RguLY+@whwHt_MGz5lcvfwoih~}sOn}%Y7;_Y^K zMEpw!_R|pd{%%3DGd&`QY-#4<4(fB>Z$)uuCFu@^$h&CJhvJS${8K%QCFwN^p+{-o zMf_7ctR>M^Bg`f7H2~qKVh}gUHHAMnkW^2hzgjREVNLvybWavvC5)5kJ}I>zuy|0D z=$MR7Ck#ZK(lOKlmRa2IozziOj=SDSj+=R6UsEkVdk9u7JqF4s?OipSg5tie*RoEu zOvShd^CO0HtXz|9ENSU&70&|8K3ia!-7xE2{U%mEr1ic|VjOGVS+q@n9QeYek&)?U zr?#h}qp6~zLXwz$}PB2{i|DF4sp0q!kZ=6-37FFqf`j9q~rTxC-@u~6vu zFpGyvR0hl38a|uXQC9Mhd0>7oe}6&c#Bp0D9gEY0hBnUQb5TK-MycTDu|q90CB?S&XLR=sZj4MuM!0xc+&8Qcg+yNYmg}pN zdGyc2z^EA31w>GM3rF)rw=T*jiTH}t62v!w~8^OxYL zZs#2J?0!e%V+kf(Qu9Ng_(lELMg90juD|!f&`-_+U0Dq{a%=O77>uO5S9!a>d24!% z8+yb`uw45@)HS+A6_$YJE!+q&f}DuYtCt)Fe!lJ;Xs2xSlC%+Qy!_wC_OAgz!=Cm8 zma}7}DrQtgL2N}@UMjY@4A+`r(vnqsgK6c=!;(sv3z?XA!E7WmtnEZ*8qH}L$({{j zcpENJH`8RJqIE2(NG=y(;BZ4^s(FrmTLochSMyrfR9v|4K!749f42tU5Y25KW=ZHTiWH+&4gjr8jrL=JJ7=N#0AF zZl7OR+z7ahMLH(_&5jfzMc2@Ous;s8)08u_YtRar)!j_wyT692mpf_%Ra=!i=(%rf zrp9ayd~K(mFgHo@9{|X*UOU|j*S!d#8xN5c7nkzr64RSZI&_481HWwUw`q9!t;TW6 zWVvCc18v8_J7_@uC=<39CDiiR6W$%FXX)NRyXANDUHkRP`sim2LS>$DBdy_tgOV_f zzXay%<#cb=FmHvIO>dANjo~GwEAD0Pey(M$W4z~Coc37@%ie#l6snsumL;(>C%8*7 zj|$^NDC`h0Lif+`-asb>o^C?dAlUr-%U<}B;tEHrFD^Wcneqyl2alY#mc5>i5$(`z zX+LT#MIB4USv0Txm(eV?3M1G~RsdKICS-9#4{PpL<<&R1XP612ddLaGx;KQ;6AgFn zR_?P4fyL~V)q2?$io0x&d9!*CcC&2Hdb40p`^k-lyJ(M;yI>GV{Fk5C@R}JMa$6fL zVyih&;3_$A@Y;z`!uV^(5w?Jl-J5_hO-iXV_}i4*SIb(1?=vhR+*XVFx zcXq1h`G(n9EL01cRc0@v&r~EM`CYj%;PS|o<}FJz$YX(F7*4s3(C!1Rjhw~SvHi^> zR1EmOD6fYxYyeZhlcgH^Mh>=Xhvm-%RqeT`jp$PF0Bp19t$g^F9$yvQXhhFzGe{s7 z>U|7D#PuTyaW?FJga^xBWL2}g$dc6BgC)hFz`FXreYeYS(@QC99F0n~UW&9yjTtr7 z+A}7XeomC;56?}f@dhXeTuAB9HpMA#A)gvKYclXAA`;TeCQ)H2;G}V79z(NJAwj&V z7a3@yh5?Vv&g+c2`LzYCn3abkhB z+raO0OC?uy(+9XWIQl=RWS&>GOAne^|3YSnythM7M}C!sOIqgymKyupT}hZJC+ks^ zUg+~DWcS&g#=ejFKMa_!?gGSkeN!os(B*jiF@NcYfw|$M*`X;R4!2x=tHcS~409{d zyKqWT$@KqvEf^hlLs;u_ZYg1@*j&ia+9Tr$%amiC?swj_ZH}?ep7R2;uSJBK3wyb* z7<3GK+57UnYsU5A13#aN;C_C*bYk>f%2SFo>* z!sxSV9sqzwBRIq`2)ipDu1B{qr{rkrK|g*`szC+`g}TxZ?=4Rt_R%*SQ@K=u#9(@q{E;`Uzl zxq(D5u}5&L5Ys4x52at)JyCv*IR5)=WGHne%p7iRXS$${z{XRfwnXeo+$rX_q~L>l zdfF-eg`iLBJpti+L8DjXGG^EpF~S#Ia_IL2VZK|;w6F6U8j6~T2h^M$Ibmbxt%-2QD*L*O+_p%gh#80Q#h2jApE+(*h%2y!*?RghEC`9p0|p_Bj~^Zh`!nxo0Ew9D?T)u}7%i;dKz^tK}IBcTBRc*C==gnD&TmxR`#S z%z0&)_Ej3c2W8K`n+)Vjvqe?Ujz&Obv|(ZC;0{5Cbl2U&*u_YEck69)DV zTG>Fqp3xrD3G=lKRO8Uy$d_v5zatfY{F_-!ye+Y-@0V9)>8Z)m}*n05h`lJ5=8>8ekdHv z;Xp<4Fe!(*^7d4D*y8*iU@|#p26=|iL=B-JbD=KOche->fcsjZ^mh5`kW@qcT4Js@ z!(4QoxQCodfgO^aQ2MSTwd%H<@D?2zLcRQK){WG=Qa%8XWD@(XDF|SO5O*jAvdIO4 z%ClqQl_^W0%R-hd?88<4N8x%>gHAV+%3e`VN;)!%MTT{el*;i#_SNnnDqZ9Ksw|lKE`M*O5w`g9X$V%e2-_nB zT{PHE|3?}dRt`6=hHsY;RhnNoDS|3 z4bjO$C7M!=D}S$^1U;zcv_%?ORQWydA+8EKzfBI8t+1&ir1Z+jD4Bwaifb2hM&&6x%N_u(s_OC#F4=jZ4W zWyGDDU;MxNe?PAzK9oBkz;nh?cx5v9^alPmg76)T@ZHG&3qH&{Ot9zPV^dfVD#%-}H z*xrr6d$UT0^_qMh%VoxJSjhx?r6%k`YX65;Er-auLXDRrdpy6 zcL`_Iiqi=NhKaO(Nm^&5*F=SRVb#XajpGS1Gi19Zph=#|BG%#WXiYC$Q-FSkAk9L|_$+el zle`-=Ov^}$odLnl*^(igIi90AF6IDS# z8S{-bjJSX)Cw#xC(wJgDcjaG7E=BHIxvXx*u)GGl|BNURg|g>&{WbrYJF$$ZzH=oEWj+6k?WHGj#S<)G2914+99 zLpgy7Ij4gy08pu4v$3~U=oBR}h8=vmEu98SewIzgT)4I-0uQ5NuUEtheXSEtcht>o z)tKuC_0D=!%MWe+g%3vFPZ!Vsh6|WGS}WH5;sOIS{~b*F|7>PEl;+{7xYRVV!tEwW z&-V9zA09jn7=bt;*7t8U~ zd3_)Pm&+kM6eZl9!z-iPpaAufaL&a6uiK;m^~w?6E62iHmxQHjFvn+fUxe-P0Lwis zqGt6>={+n;`yl!!Tg2*70fool&H<&S;T0s}NB2$w#irIZVW>v+GkwTLwR32{h4MRL z$Y<@;#Z8gV=3(MS?UN;fr`9!OsDtu*bYF(@dvc!(#YeBX$NtQQa@*w21?BfGGAKU- z`#>nT^{+Z8KlQ)st|PNoCIP7kct-4HqoiT&=;XWV&xnm0Wxd*}>S67uk=_ivo3lB5 zy_95q*cfx14Wh!UfS(l7x?o(Ea)f>cX{DJ< zcttkv3#00z)7TcK%d;C5&udd1McKM#B733SKI|vKByJ)!CMN!y+}t3mZCM?G9cSyN zwU)Vx@CFS2FF7C5Q;1tEzR92zCv%qL@e8?ps?>GFNB_%MhATWu_C|-PbXn3|K69@W zVhyRNAyMH8x!1|!Sh&SEtMA--y4e;v2p2bI(A%O~s>3H>>bt5w-!X#mG zd??+FHUdzHgX_!!*qqA11~7pHdA1=XaPBmA>6csBFdqS27*?`X)RL9Rih*?L1llq^ z^~6~BBfeMJRu!M( zy(PaW$OEs%8`s^=mHLFVldwn3nGtYRgw{FbuK;Ng%QewhV zE6?6S8Y4qr+@@7zjJ>^B4$E%+e3xc~(~G*|?l8wQcdwo&9=Sf0*h#CdG$Ccas4HKj zPMAx1sa2)Nl%WNm^mE>InI3vX-ZiugH%~h@*E2ymj;S5PoSKC7x{psH>bL2&rn1c| zr=D~0Ujx|KbRb;8yiHn7jtMLDB8E8z=2!S4ER0^m!UT4WlkR3ZW9PN7h$vx1!Ujq7>;DQyPcSGa@z^y)!yZG-gvHGj5@c?m_g@ zdv0KtOML8ZTn9m+WD-Q!@70DuswsxE^-8NSrS&7lnL$}4ojo`fNvhbH zfu&UESs1lP>)7nBV756TrdStis9q+XF@HaUd^>|_QJ89H!a|prLkK6)F6LSZ3Zg9O zXG^-+k94SRPU)jYc${jdIWw$yIrd0;sB-q|(*)Yas}zHs;i1ITx+V@8&|ejN(PQV1 z7_p0nsA3u40Y{MJHL_9*gwVsxfBB!Y^GD0_fU!$!<*xFYR_r^tGW)H=(;?v$oPzip zM=@DS==ks!i}aZ)WnU?iWRqmZ0o`lINjx;v%1;|L?0EXAlwbCIk? zAWn)bf}?H{Pltmr6{eY+EtF(f;LQ^fYt)w_JNX+&A7uH9i&${%y|Ma;L?JYDO!0WVEC5Eq_|Vc;hs zJ-YjM`_AWCVs|NPUSs_XBOJy!vSIBFAG`h0z z{eui~3*@K4S5>4FA?CwO$fOhNF3bxhTzi$YsoC%H6q;>;6uUXKcdC{@LBm$V%nZDE zHc0(GO-pnAN}bQyEvRv)MgQ*@C;F(g=Z#f*z{3CnvtvkP?bAz zdpsLV7{iX2!W@q(s(B9}j4uSj4?c(+EiW2;mq&~^Lq`4gu=NZ za*`rZF4fVWILF#SZ%$z_cbz<@*gzOPJ_kdNOj)`y*s?L1l^_-NXvX*6#DJPOBixyx z7c-YTX(W#!oyj*r^JEPIXE{saAgw=UU5`B0R`@uh?OD#cqXO1c;JwrVI)6|d z3Y_z67fRz^NUyQZbJS<}ghD*W2I^4x)=Fe+sk94$Q^n6FglLEPG3-ddy!b(@U}J+b z$_9ZaxJ-36Pq2Vu)b%6Qy447+_)k6M^kp^JAxvo-I#bIZPZC}mmPza8vCCs3x{iv< zMdkSJ_3OY+DD#b=cAA1`?NT$AMdzHN^=fI^4Ojsyl?(HVaJh}eLi34Q`E~7o+@a|r zvJc3*KFFy$GUbisgyI6)T-1w*Qy`Df*i+ybMu;+EN?{$dro@GX z9SIQ6KntP?msyKNzNl>OkZc~Kw!{_k%R^W+ZcZaZ?l&HUo|ufAf@7~Lk^S?s?q+Z&XPySQmb=E4lolTtSOkIROiH4GNp%!K7y}gdLG7JNXB+KYq}YJH=Hj zn|LE38LW(DZU9eomVcu&UI6aU1-f#<7N=XYtCsV~F1R(wh7>I_%al;{KfR678kS1a z&w=HA!ZYIJ9~hI3-rI-vF{WL2@bHDp@IE)Q)~Q`op|q>wp(oGdvw??(ymEn?F^ zn#YuhOVl;juOPkk{`_gYhqS4n05gO{4L?&RGo7_ofSRmNVt;}op5?0$X0?GUo%U_Rq2tP*tKMpa$dw|E;1-R8gl$t`e@9L4RJRJ6S4f z7?3{$MDrB&NSe2lIg6c`w_}k%!->3LMl7ES@Pu>vpnd8@38tA-&v#SrpOJ||wE$HC zDNhaP0+>e!q70q4t{B?BLBw2vMa=vjgu1M$?*epTs85KAe&OH5cQk398d6h{Xegm7 zj}730nb+xm4+!Pab}FNx_Ck=31#h_>%mhCNUPh2t1E7o{k0@Xxfoa*|;DXtkD7+z! zj8a1<3unVvR|RllMAM%v&mmkFP6Syw5doBPs1*U4l4bO4JqIQ@Sbka>0;! zclcb46XRUKu-5n0_fbltX)s1BK@g@_YVraVgKoI<7`mKP1A1_h!U zB#>Ls9vn%3mH+}zHeJ6~@HWXeR}V>8p4^;Y zW=AX;YtT30Wp45LD@nzzeSq|J8lLf6VEDIhX>OzfWOVZR=h1ls(p+XPmJ6@#F$o^% z(~7_sMj8CRhz{GI$oXt{x5S*gD#R@n~Fxs!koUKxE+z&q+@?Y;tjlYkBb<03x56KURG zj52!QC)B*|6tMFZd)R0(AM30^q&b_tU?izKE^$A>kbT&}4R*l~>a1=%4YHI7Ks$UM zi%#Obst8<2JK&p_@R6Hcad-4^zrpxh-EpygKy6djvf7J}4T|;jlaN&uHMKpWi1mwT z9Jo4(jjMJ+7*d0iedOjB38e2l?K?Rf6ny=>uFDHOVEXz%>_ z>3N{vbVWiIjC5Wxc{)N)#ZF|q_d&yFp4Hd)E?9bm{L`~*1J1GXc8MowbgWxsQ{=v+ zpKQl$l(gVm9xN)FfcVy-aG7PAni5U(R09{4GP-)HgBM|o3ps7Br`o1n+4&|TXG%sR z1$9r$fb~nWTI7$%q1)|wEiPaxZ4nh*kV}YM6-rw*H>NRTw*sJ{M`6e<4QbQd)&`!b zfRn%r4}g*ZXEuTBpTnVC(%70t*5)z^u)IPe&VyU+c4>Y%`hyxH7DIa?Ckz--3|f5i zOkwXV%%Oc4`GywIug!`fjj$V@#d~)-+%=#B8Df|(eeva^4Zp{seaPKDaS zXtmAx#o>EH;QB(~1~ha1p<#z zw5Lh5e@GD5O7;8pvZXdCm)e_yX7X!gMstrQPE}r;g98F((IZl_IDda=H&j;Y-eT=< zsrQJzRh5#MYF4)9l$ugABOLB9Swcmt@7gz?$Gx|8x!bLZw%b5tXM^X4#rbRnk?QN~ zNuu`At!xz$o9lx`-(aQ}g(XpP3zwD)3r#034T-!t1cZ8r;I=YhAG(sJb0>HqF5xU{hqFwI?9!C(kc7OG zaC+UDZ~Xr}(Ic#Zwu=r40N{iQ0Komfjs__G|9a-DzjAeXxT$BXN*c#7W0A^A1_05bXs*u-Ntt8kg$PJkpe3w25H`vy zp5Bu`U3e7Mu_Ta^;`5(Qc|BZroLs-ebieOp%K=#T`*pd4&5XNGL!mqRTKO1@-KSde3kA>y#mNMz4+%XG2IMJi+qwgP48@?7t>vC*Jpf^O`D zA6@WKv{IPbjlNd9e{tix?!NpOI!tb(3}_j;YuSGVrG3rCkO@p~JE$q@3Vzn;J8O(S z<)n3~MZ9#GkK`JA6C6aQ{nZ!_WBR*4^h-P0L1x$mlf82_Qq9DhFF5{LbUzeQw;2#I}Vq7mLDnd@kz@3lCL;NB?yw06OE-Y5t7ytOxTmj1naD< z9J_;5Ipn}dVo4f1BbfE5`~~FsuD7DE=4&rrd}p+7KzOf4-mC?fm&U*$RBSz(JdpRC z1U~qF=dvzENpL|vk&@MN_{rE_5*BXQsN*VoFi3 zF`>a2PH|93ut{;6RM{Bb>58J~diXrb6e&VI36EN;>@W+l178k~6H)bL>^X8@!~@Wo zvNa3VB=AFwg(^snNN)5cTXR^1M;Ttte0V zQwjMmR$`(ul10}G1y%=b)_p^p9&Kwu4wYNHv`9-dX-T1>9Cs$$>%?1m4TCu3Wt_N& z-q>2&7WQ+5f@@H0g3}so&&3zObmEjkt(rHM$>0e&g*~l-)re|(1w#eCYh!O zpjB=n%dEZ;L&o5cvQ^dH4o*GDrm}NCdp+56acvi-A9zkm9MCM}2WLn=ogWKk4~T8|rEHC{fZXU--KIJf%?-?69a0{bSZ4Q({D3mG7we<>Td@lO zN3|N%#l)w23wbT6uE|4A3Nj%zPwaYc@`|z`^t*@hm77oLwoQLWndrRU6^WdV!X0Es z`4-+gpCCFsP?o1+mm5O?q2G5{V(w9yA({|$C!|7Oe$sFjB|2gaq_y%O2S}J^CNjq9 zwG^WSC2Ir}awpFhH^moMh}CL!ld)7U?DSGgD&s@Sd#FGM0hmUKbfO^8Z*Rw1+C(Uh zm$hXhS2klZl!y5%EH&aIxWwkxF<{IzvjYZ4Rq24YVBOXOzz%=mDHzRZSp2}pGO`u& z@WCgmj0Wp&5wWIO6LVa|PT$lF^inb-gYcLuYTWa?6HPl>UYl@u$(Sbp$@0Xp>#Omb zFSQnVD`c(yBVbqaB-hAiyu(<5y;6k#GFMLP(Vcay1T_ z_nIc~&c6&beR@2?m8_Z!LQ_v#pUWbu$GoXaZcgtSACFF@#H6`SmyH7QA}h^cLEmTw zc?HTOM?J{`(CII-PwM1t65)t4vpG!Vo1u5=*0;ltnGT=G8~@?Dfgn3P$!rPdPRPhZBwmw z;NT4dI&?F@ULOnG?2k|j=;A;TeC5x8|IVR^qBXVv;*6ZH&>gvnJ=rdrT*cX|p=8 z<#0ShE4G1BguI3;Jnx1w-1Zn!w+$ft{A;vx`htjtie?L%E6Bzjkst;$9e*ggM0?~3 z`UMClvl>L9J-2J{yW9%olmG8$wR59BJc#RgHFHs0x6#xmf1RPK<(yjY zvR(SaY9)ey{KgIe{DdLQ{kfKKtr;}hGH5lS_T}MSQP#;IOb#H zvk6lHDIT1&G<1W_EMo4m^0dU(1H7t=Ehj&I)>Nv@>h$@4@V5dc<03^rqen%r>WP|y zTdu5uCq;Y@aQbat>5U@F{yeIHm8m$EWmur)BAz+{`SfKtz{B6&X9HVjfvb z=&j?vP;g>g2wA{leC=`S|Sx$rfyve*l)oeGxltSZF?!d5xASL6R|~s`_lhzT5R{ zi~3K3AxL#8erENFsr6Xp)0Ou|-^+$XTfCudJ%yG;Q~HuGbn_imU7{~%!jlH^!6#&j z+;7RroI~puNCSmJpXJqgXg@Cw$?N2zf<3HV8b=;6uP_|mqjpq%Z2yOiRiNvEU z=8;5>i1k4&3HxTzup+(Hvt>(uBvjH|=|X~Egs-R2wJx-fbUM&aL*TieqI56WjR9l< zD$DnTZr52}(`{ZiUe{xvUpKY%0N&v@UWg;8u#nox4V|GtHDfFEEZt}-+ADd6ibF}E z7Mrv7$jpuu7Of#`6t-5cNNxqK)G;s0o2dqR7HI=3RNV>&5F$1w0Ud@ioIrQ`^>@9a zsxW4Z+^jv;>3=-}!h4KYz~!KfBTKZVRPmS8sMn6}J27EO>usl6bVkaI?Yw?fn|h?i zw380dt;Sx(L265PiE5Mk?`Z&1& z0*#F5j2M8~GVOWPxD7p9o7D-_mk`Ey3{a}k$O+KT&S2MKJhczCW^#vdw>Hq0g&uc= zq)f(_>;o~E%Xa@5W?JP7DLuCz(YGBvytIceT=jx5$GJ*8AgPVrqS5*pZZ!faMnkUf zxP2k!s|0m{z;)w+qnh$0pWg(AQ}R@HtKN;ZH3{krb@q1a$Mp;K-O<|hF;okEVHKlt zJeXnzCZ5T&)M5C{6#4{1>!!q6KwlqZ^*~_4Scv{OU z?_}FXqL>bk#7WF<8}>hbG^g$tuB&pwHJ)_;#xr^s8Of3Hx{2;O#rT^sGP?;E9Iv3$ zG-tZWI@4IQiX?KGT)|72?Ly)pKSG$s^?cwTSszQN&V}};tl=(e-^VWsX}%65vnUY3 z!^zYZMJtLb#ic5*prB$Ppt3Mj1vMv@OPyQ+(>YL(YT22mS2&VD=3>6Y2sg?5{kuCc z;hmcb@8T70M12c?ul;u;XdPmGvzorf|l}npK>Om{@ zA1|q|0;?nwP!jH$ytYBuXE)VeQ}_tZQl%bA$#;pOTxu-sXAU>kE@8F);vpGZwFyA@KY-zkGmu0p;c5Mgh zMJ|!2wg_7?H9N&(5gfLAB&H7O_~OW|_<4B5IfS0x{wV!O8qj`t1B3K|KLHf}I(Wnw zCf5iDa`q~MDXJm5xY!jj8^n&$G@;vSvjdNyE$;-vSUezB5vbG$&*D6m1Sir zU{7Hmj|%R##>|1edM>5B^_mK~=_?D4xpI)+-(K~PpOrfdr(v*c z*JJunW2y-y-DtXm$munyj`y*1fX6IipII{w#N2p03J~wirS8ZjqB1pz3hU(NL7y$) zt$#<hQN+IXBTR85f_YUo@xL7avW$`YfOK)B+nAF|P95r*3)Os??*1Z>)d zN?1-5#F!F{hk)*DOnKoL6*!&7Db#T5R~LF1tL?&X@C3hW%X89!eo(T02FVFy_9bVM ztUUdweed4iC{**>y${E6n(@yYS2AQR%2gM|ZQGWPYKv6mXiO4L5)2>7uLH;wA z6M0pJV1svE;ww~9kyGvxKah{mJ$DkH$XF$cn|z5xAxpD&D~!}UX4$!3AoEPh2clnf zfr#}mKiV5#T!>=EO@ha}-;jm5MM73?nMGWdB#&~ZxwFL$$Yq}IAkwMfrKfy?kHWwX z2-(gxir#1nReMa!lq0{8EeirNAgs)cvmp-1$FLVM-*e|ZAjjqY`78hc{3Al@=l1`< zFXW$Z|Mgk0asL+=xqmDORKbD2{Lw51!2I_X^FIru?F@{C46F@ojZFT7q=-4%x!B7X z*czDqlayquXsP{VD*ly4Vq%C!mq)A=w?<_oD32VSqE-O})(u~2Zcbz%3mSvT#spFI zllT_!DYr^)T9@2t`Z38ZtMN5sYU79=d}r{QUNgI~)0^J@_$XgHdL-6vH15+Y?M}LYiZOw9DOpl~=BqYcMRNk3o;?1G%<5u-{juH_ zH5zlHK045Bec5J2S4(G>w#%GD2`F237Z#T|qgV}MJymB;?+iOVl3taOhTe(2N9aow zPf0@l_&0qbp(mr0Q=xv9qtWpn3P+0m z{dCTNzwP$RbQzOA#8Dj<)6hld884EVwndicqK?g_shK#Ox(8h|x_&adU4Ob*BeDv$ zYPP+LxPA@QfYI5%2i4Oge%g+2R#7g27XZbzhwxdlL-8qx(j)~1#anjOnAOr@UBH5} zo2l`trCzd@>TfccyumkC-62NQ>|wmKcn20j-D5%NU*K*P4}+4e$`SkW$Bg=78Su+^ zW>yX#rGORF3im<7iY9@;i8My^z6wh{+l@CUHGxSdM|iX8g~+mQN*=ATm%A)b7aybN zP%yAo?G^{thZSiqvyn72k+0TtpiGk`p^ z_m`JcW>kE~9LfQ+{e~x3Nxe49yl0+eSl|&lpU|qZ-dIC9HSpP@zQF6~oM$mu4HPuE zVhSSaNJaItX6FsyZNmN;2c3mck{MsD0cPp1J3q@h`q{~Qyt1b#XX1@DTJU!3V|1Qz zXV<&HU!0c7(jKc@F@cl~(Tn9e&l8Fiy3doHy@Xjcz?3cL+}iYq_q)l_ARn+;kKbgf*v|Q&?6ji;J_tF zTw7d*rfIf!%(j~dz z3jf6`A!o#M)(c=_IG@?86q6-5Oh5rG2@P{+Gy?ANn$z8Kx5LV^*%C9oB2SJihSVdt zaStquRDY};N6#U%t>Q>uh^+Ppf5ltum&fv$U9TMW9?*j$YrjBn&wEy7S`XI^QWFV6}fm(ykd&Cz(3u!tpt=WfWpOe7^hOu z$>Pzx=dhsm4IopV`OKO>>}_Za$ngwY25F_V`eeigaKQ#SE&l2E+;aVs_w*lRoGhI& zK{3}#K3hO8F!7P!(Tf4N005C6=`8<$Uv&T18Y&}XV(|aT zz+)07WcvkBLT3mxMU@5QJNG3S$=K*(s0nqIIt8^`vDYPNEzJHXA?Qwp!0!rU%1O0R z49$vuA5VV!olHvibo288?t(Ow_R)4xY8D>q0wF=j-ob!*(m+Y#416R#UE|%b6soYY6uO{L3XC8QE7n%aJ{$TiC4Xw+M^gFUfvBR1y|u-^cjo^u5>~5PIiZZ8 z@^-<;sKe?{2occe*WvzFrLOMd@YiJ<9fr7p(n#>2Krm~>s{XZ|jo3g;h{(Us0gv62 zO@4P!_%&1xr2+}xF)q=4>~-&ykaeAoTdhi+Ur<(kb#~V6bIsXex0B=d^|EmTh|`}6 z$rBqv>kdOtZVz|Ds%<_v1Y($G-5+N!F>v(jlOsUwHW36ydW?)d(_$?R%M?pNT%Vil z=))SBW|DPJ1;s>ZUZ1@`e&M0MjmSoOEs50~ve8J8PCbcO&7^@O(*$;fZP2>(JAco;^r0?}g5WmcUzjfv!VmGQdn@#SJx`pYklDbYYS?j)HK^VN{a2PqFH-9RTg z%?zTbE-OSwa+v`<_ASvPcElQkQC;-en6tCHf;#gY*YTX*zF4YPhnc2Jp`CR^%%YM& z6z6d&#h~a(EaHj`m9!0=hC`YR65)0&RA z0=Nm;PY@zi)Ab4B5(h$ZNV|b`zc$i~&IqkZ39@{wTBQcM+DWSO+?$|vD?nToE zNT+^lDQ4VfoMYpRCgg)sKDHpHMrMt{S__VC63|Q=OBF$=B}nev|^Z zjYWzNnjAry$}I{cAIF6VbkphPCDa^`7GD=NR_{?tG#>&k>vDFwS#!{k9L~8pjc*`x zU2dwpDXb$zr!l2mpu~GaRr<;c_dnI2whYH7G9K*CcIUq|+mx_)OC3X7YT8vlt%iH} z979ucRoFaDCTl(F>RqOkVKmO&oTk6UIk^u;7^^P-^5#XpXJm9bmM=;h@b_%th4mtT ziWyTLyKS*OYoxEa-d|yiXjJ_c-wG8M{SFc-4x2T8M7O*M0J;iE=XyE`J(X&HR zB8v|`hv6oYog%|M%bcuDv-mO_>C-L|*_W`sCvtv`Jr@@>z* zTy{%tPIK3yd+7C(@LMd|b?h%oZi0`n+B;l^17g|r;>(@&FzdXL5742WTenr; zy0`odcMf#i%l4q-4tJ3}_GPq=D73z)EC0(YgjaA)uLCbzf_U3)59p5R5wHathqbqN zzi){hp$$Eu$T-Fj2YlW#}*&NpbCKbX}QWSpq*eE zEagaDg&a+vN(S)=0`WjjC3q`0ovIKo{g`0&5#TD0y62^S8nwPb;WT#$rxZx-fQVp* zG5(d_A9uC1)bsw!+7OQmJO-n2-_P&=40NAZrOuW=#0C0?xcqm1PCw1x{{VFVLRWkg zCuD;JP`Z>V&8wdc^eh)!=Uj;$t|YN@^A)5He4&tm0x&_=7xkR>z+V-Hx&0d!=1^h&M@+^1}%eQA^ zPR3dH34_8xC<7fwP-@*;z6RWiB*_yq<{1nE0WBFbVkSW)q$r;qQ3A0l zo7I)SLbMS!Sf7necJF3k)?fG#kokshwM$iVQFIIs4SD)7?wzh`tDeLQa3>n$DvDmz zu1J02G4S$o31JX$pD z+YMFlB}9fO3%ymoA@+7t8NtD>IG9>gVfyrau$(ahU#PQ_mVp0KnfMz83j_j1Q0o}q zi-qE#J0h_U#v~cLHp!^PSpu@bv74K@4|h4N9$*>WgmOW7El50EBJyay*9CB;_s@&> z7DyUfF|tV8nf>3UzFJMkUP}!1 z@AC4^)RUa@iCF9bnN9Y(r19J=N&!i6EG;Qr#pbxI5Z1aQto~^NG9UGrgAmIh?}|Q?fA&P$!hR& zeL8{n`=ImxxGf3jxHZP`x=RY6?}IYJ@>ruD&7l=lh{U8cJ>nV3OH1r}P;6C1DW;H6 zV3Y6jhCqjLFAJ52HXsZa1(rJ~U~!=gH-izmD?&*nT}(ZStQ|emOLomo-nSC;<_)(4 zxsw6>RzH6&M+Tak%xW?xMYD{}w5Mifmh~WuuS2(afjB90Y>U9zcpP06|JBQ$BO`a~ zM8(dOv44^tudPbJqsEcDC%J)qx|Cne*bf@ZWm5W_*W29p&a$$9Ydm#OMJ!wj$)QQP z3Z#QsYHfxtxzNmRBGa)b!j#;3l+(;3=F6VcyN&8-kofJd7iaeoN5kB>9wJ5@hgA53RQe@q6m75JbTm$E)FcXEy zgA-)F{`mD&n_LW&Gaf5-<4oLFYlGpvz3ocuH!6{bH>7wr&Wcf!DhT{ccTl>lcSaUB za5B9zpCD3X!*_ooR_vDsFJ8+da`#RYJNu^WKMtn+t7j^EU8k^Q(O1_hco=(_U9U|2 z)YbBA)z)1bSDmYP&+dL=p!bxI4n2>~t-2&kt{|mLWJ?{jQGQ#Im%6_i7vs*@4Adu&~}JRO`YRhZ#;Bs3kRce|J0_}u<7Q|pVLrpa*(hTlCN!DRx0<&>KZ`gR0ZjqCovw8X*eW#@ z)mbuQc`Td#-N~bk#K;BkdSgIn#TI-V_v{UmsI3C4=xUjRV_VPvg{@RAr;6RY(Z&~R zFb>k=Xnuf?5TO$m9`UoV`5SC~ty{(hn~!v)6^%pM1Hpi#4prt%dqFy2KQ}s@3$&4M_%YJlr)XpWdP(?YwB=+u>B&m{af;%5FsHF zEkO`ggwiGiF-^f>76dtS!r10O2rB|8&2S_4KY$Kd9!Va|hBv*d^fg8kmL;&Pil!;l zR!r6`%+|Y3?&2n|7z?T+69~0k5pDuOFEDp>)SbLf>G%VQT?ZH{(=it58JZ<(;h&pe z(j$%1GPDbogI*pB(n^{oxSA!kh;L7@X(f%)+>O$H5}j6=rWwmjSBp$vsPQ}7{uY`O zjY<=bFM}TgCFwb{Ojq+vU&!%08~$gIvUFOC;U+JF<`Al;rV7Xm*Dv6OJVR7 ziVjBW#{<_f@QP*SCswSpGdRZXO-6}nsW*I=n@F|MB=n56=4ZZp1NaR;klNukdt*^A zrQd7zZf_8Hy>Pq6^pl3%)tFFVw*+>8_iXk^FT+EdLyGmr1PWWY&ra6=7SaF3^Gu2` zCpeG0=WBn!qVG`=^#=7)9mp=B?+v3V!p~1sh=Je}3Bm6W1rR0*4kC&kFoecK!WI89 z9Qo16qw=~-UJB@5ipV_PhrQXNrWZ*5_^C-t{Z3urlV-#tEV+=)GUVw$9R#9}7mn5k zLAMX(qEzI$@esikf#r2+Pf0*#yP=)^pl-}jwIe=UHTLH_=i^CZMQ1;6oc|ste<1ST507kq_x*$Xh~6w}{(&l9ddAj7m(}iQlF48>>;Hx91}qvZ zozBsS16WQd74}2Xl;H(1SCQwSj)EgJwqP{1S zmr48kK+E)@VkvCvIP{8drH-%N6()ysUAM_O#?qpL;SqmPko=4&_16b=^497TOrpru z>ve-?V(02GBs;zRLlWV;R@q4JY(Up9orjKDQ0W}SX9`})-23SIIHz&wR6qv-9Hg*8 z;C(;`5gbJLh_D~0jrcY<`?vq%gvfRmjvw=L6xaQ8qCosV{(b)?omR^U*#yIvFTr&I z0ZvA$PTd%KC5m)Wt9J!DRy z)9KfBRzPllcI-@x#DcYWd8{ef$JNXAL-)-?PWRT%_xl|>z{jl#2CaA~16qGN!}R_W z!tlUqG$d#u)N}}UWh)83u4-OLd?20>7YK2*QkueV zNW#iq7z4IoPSBJQkG;FNlb2r?XG}@)R9Mw zKW5_gX32Z4#i&pcBe)KcuI+}gvrj1_lU{VQ+Lc6z?MCRE-U^|_KXUHF7|e;;Ep=~D z0dHVPSUu!bO(99o12g0$zM%FIdUJF~ZLUfhvh2Hp9A2ANjgb*1^YxI7@Ly+24LVAR zzb&nMogs0n2Amdk^>In9g(ey(d}*tf157Y6r?^Tke&z25DH7dE+f?jp_L&ziFC+0Ty19?yTV@NT2<$~R1Olag zIFyQ~5|{(|Mu2P>dGBm@fuo=htM{q| z)G&E-VpdF9FII@!!$tv}Yr;;|RLVTw6<8D>oi;7ur$THGb3<*%?DA^I?fQ5V5Il?A z64o#eVub-^T3w0VBJw?tjVLxqmjucYy`tpS^^x0XKrXo`Pt4694Nh`+G_iP5C6cuh zzvAfGcQ0dr1u*LQF2pL_G9@pe!Kf%f7a3y)UD`ES+N!WuwpCP4Ax=)dJ6=gyeU%#~ zs~R#;BN%b|BcW=1Tmv@E4~wWeaS+XZ)0@uARbJCTH7@A6q%k2r3?-SIAKn+ep{%Br z?R8gsk*1s4ZZkQCPGyo6fgu4_cx<6rC`OSok1fJ?V&^CWX0I&tyXyekx#S65|h@Ao4 za#BXUs{Yo)aj2%yGXq{ykTrgoR^c?_>q4dEs>|Gwxo?3J!fWb$wnsmpYGr%e3V7}F z+MKW|B)=5GuZ>3n_`=v-4;H*6j2sV8mBa>!zy5%YKW#VH-=zzDc|R)2??fEy?l70$ z7MkhXm4lGk5>$fjms0Nu9z|jkVZWar`9@-s*wnu@v(ABP%=7SuoD1rECIF>X3h=en z@)LdiFkTaPmeOEcSDmMOOT-G2TJ`Mab*IO)sU_B4_Vd)}F;e;Z2HL74YjnbFPei9D z?>MZnVil!0)yM2;wGE0`yMKqxxnI6C*#VG!ox6TA_n`7xL{m7SAR*1md@u^2m6ws2F`mq z;B?3>>iWT3!;V0LLSPSK$kzeRRU5K7^t9M4;HiC_f#TSnuT ztq(^uagvOhF>s@6k_W_SjVax}qoMl?)lIM)do-f!H)P~SYYIkg6$4&z?aC{S_#@?C zb3=7j%aHCJ)Auy*=)M2u0@vHwTXcnyt|m1y&U zOwyu7HdT>~@kFyZ5)22SsOr(La+lKNhhLq)dvPvD%4%vO7Z(v%;qgq;vcW6*7 z&A&q22d<~Ry;A80p=#UiM=@&K`mfjH^+qFOf0(^)-hONYow}W-x4tg?{JzBi;CEXH zar&hZ$OAbrg`iD^Zujm8WJ3^sPp&Xj?lvx(D>9en73Eb4s4>*$73d2F!m)sZpV$W~Ki4)@dvMDcXeu)q~%|c313Ea`bJ71;2~N$w|I+ za&*`2Bjxl{>T4-VM@Q+z=x=e*fT{(#%O=o83NJ}mvuCoo@;$2J7kx@>~ax&eQ_NYl>xRNBYQX|tDa6a9&{W6qk7(a0F+Gcq2eDAbv zOMlDKoyQfcq=&qW+CowDy^hv(gn!wlDriwDWvb_(pY?%8AdU*vSiaC+EXZ{OeYSJ1 zXm<2A%*NO5nKCx7G0?)a+OARKRU{ChHk$8)0*+a<9%00IXz#jss5>`)`3Z7T%CMNP zOe*J;ou`UByAISrJMH3}-xu2ICWzNYztq&F{VK?89)I&lhYeu!iMckkXI+@BO5m$W zp7xZ5QY-OfesE3#RpipDvLfX@W0Bq6pFftZ;Gr;T^W2)B42_mhjZKma_7`Z9(Ey8 zEaP-GLx0QnF;2|?Ti4|e%A=rIt;OI#4fx#zgKvml*d2B!rTq(T4RB~jor!yZvh&J> zK}C(1V9ZA7Q4Q+(^J)ofz0CmUy}wJbZeu1IkY@F81sX>9mgSl1fmNzR>zSrQd5Krc zA%w6w6uxFTxSWIbZqDi*H)i5Th8EeHlt^J>!J_4q@u>kgDe{zIJW$58_(D2&dP)bB zE~?Dwb`1h(<;%))47P^4wI{n#@>7(@c4_>S{$9CYVVmIy88wrmL}mlWNfpKx;)M17 zk%5JulSlYiMaOjG9^K|}1ahb6<`T~~&S-*gGzJ9lk&OJp#r3eRvSQ{*{I4j!+5l;;&g4f4im>t%+2TDy-zEJ*+7xLHP_td!z>{n~R5kvS^7gN7=fay|s>U0S{3|g8M&|^7d}h2KddNaw!hC|D;Dh)`f5rkN&=&V9HaAb0{uT8G+XL2 za(L=C+4O51d4ZGt2>o<$!LQroU&OK~E+U?PCp0`F{B~&^;TNeby%+mb{+Tx&lzXzE zgb@Kkv5jIUiSK24AFe4R-quFMzfen$3s^zC`hiKq6G;zAHW3|j%n0l+s|ZX{^bu$n z56Dk!Q^y=*$DDpyo)`*)ov@SF9^VK`kAUo3qG5;h-+F}6^m{lx0W$|C+D9+SKyJ~3 zaSfDC)@=Z^S^5Q`kfKRrSmaAogoHY`Tote(xfcc8Ub;=N#8*XM#!Ty~%VzAHcy9Hl{xVPP8MfyTrXK z7VEq?8p&dD%e@#%@;~U!+QN zRoEgiUI*p7qD&TD;ke%+VENg-n`#%vGTAaT{^dpvZ5YYaSD&hzbzqGkWRoxGi3pYL zS%&hND4Xq&to(SSoonfQz`eufMtvfe`xtsEnqmjkA%Fp8*RVPu(C?y!`> zjIPzliBxn|iS?|{JkFzo;;=j6nnAVSo^qi>x91yosX?*ln{vsa-{qNfVLRJKKEW+E z@)e12;9$o~i3!^SqN^~J(Uw%=DH<7-x>GDZCCMaL9Go-JCIlbI$QhZxtvd4<4)M_R z#LM5aIP)mz=eh9AdBMtY;hhQV=dt0P5rdV}nt3Q^kQ1AE&=^>ld+?^5Y{<`2``4+4 ze{BEz9_+fy{v7l$Lj8~1|4P=TERz3v&m||FDIyD^gvgNx2;cxgwbHi=BK-y&LKR&r z&<8;@b}G*ZHpo(DQj!Iu-5KLoZQFy#?+vT(Y#|>Wg-Mhz$FbeH_IkhQ#`XRBdxzXh zp-VO!l?l1of93kPJ53mUKsUjg0-5qb1Mj{?BBn&MK*LPaK%5o>{YaHbNl z+SpYL?R+dPrMF6X;$kK`k?L%rHY-_~VRYY`5#44t87ZJwqo2BTA2z;`pt(7Yt_&of zYH{+mKFlaZErq^Q10>PFRCwYRtr4ZuatcuXSRy^c6??TfpEPP&qgp}AH94NuWV1rA z?$8*h+oLbzRJGn3(|f4uMW@fGw+LO+>2Ka<_&KAIjWP<7v}mHb&GGEDE&krv&eLdK z*h`8R#gmIZo(MTedC2S`;ekazc7h;Iv%xJZIFsT1q2r>)Gnq-j5irD&L#5u&3_4=Z z6KevBZm-Zsn&O)Rn1V6^l|!vQB$2`jdVy2z)Yvx%CYFg~Rz38@h2|x9)$j41{}Ko%w*%1<^cUG#$s34VLT=7H_8#$lBmNC6 z9`iGH6kUX0fhcgHNJ2#71A&ZkVJA25Iqy05@P6MIYwaIO&w5r>&8k_m zzLF#NI{B`>3_b^h&C0+o28Od~ox0u&i1M!6DTnkt&9b zk^>$o!9e4USAUX{W2Jn%aUt($7$4Y7XXJt2fxq^k-}@V|j7e8PD}9SWscf8FWSA`f zx)Yfadp2J-2elnjGPTW@Xsr2~Rav%{^LhR8S@Zkj?X!bN|MNIe9#kiIxxW=p49haU zf`Y1M&kif1B+bi8Y7ie_Hd00zge(@rA-ZK`Udtw9$(i3ft1!1?k*3ImJEVxWk1?#e zfh~sn#1+xe*NXdO)~eng&Un@TcOzdT7V5?T3vm~~e@Q}3pn97Y@tf%z6zb^!BRH<1 znarBn=pvn~4#NZ%s38KgM09j?jD0W@C2DvbGW~KqFDo>P?Z2`d&+gb6VtiptU`b%M9&m7)lOpK7F_zV;_& z80q9FaJSM(p22DH7~WOT=KQLxM_NW6S0or~UPji$yo8A>QC_o?geDgu{3>aGMXoKA z8`4>wA&CcP5+&BCNN{bIMXabd=t{#_w}3LNtURBOo68uegKXVomL%oTO-^!Cy7+ooJvL;WKzL-lzDYQm4=C(4S0?8DjNoUvO*Z0Z zo)6?+fm=>h4X8m`JP>dll;o)*BnC&K8yrld{GMRa@=WRT@(8oFI>$zGitc4hrG}8h za!%}CRJR2A7qlvMl$Y;0LoC!e(K}qc@|As!dkg+R3tJB}r$Qrr?)Z)Q-O2L3;O}|| zLnXv+&4Cq8X4=d&SyH{qzVLb# zz^<3#KlWK8=gy^Pi;+dWgazYD!ewISt;*Vm)2#AE&DtTZHxA|4xNnYt&FgH6r?ZULB+qW_U5ryoSL6@$3!5Tl*QN7_Y?h4Us&MVz zCRn1C8Nd%y{h}+DbvM_dU&ZyX9~UCmTahI#X;aIszpk(sAN(6E*FLa3=iC-ky`Fs1 zhfeBxABnc*u}5$ z961;HXY?cFlwTJET#EuO#wPgp_~zt7wQ0Cz0PgQI$##Nu=%7F{ui8LhzwI4a9ZP8> z)ejOR%aS8rGuSSQpGPpamBR?EL{vRIye-VnC_l2Kvz)VQnJRJ0i1OQnI-r@O+IWCTt1CJV$s%V{+U(Y^%NeW=`v!B_3iFI$%4z$N7=J zY31F?xo78W`qVXtah%me14<#MwF`4N7IxC(J+8`n9i`5=bOMi&%Z{Vj+z1jqVhk3Z zHss#=p2Q=|x~vc^oIUt|nm-$edRQF7&DCOZgu9C~9u?f`B0QUUqckQ4{Sgu6*NYk| z@|H+sE7Pf=3Oe+GmKGhmgBS8_FiF`*NdcuAcZGiH64i*2)_^Re6(DMS z$!OpZ_@7xvrr%N`Ewkp;VOR{>#q&jJ=w-PofT=_D(ag==Kv~?q}A&g>$$}b^Dl~bO`C9cZcy2-j&B+lTbipJ$S69Vf2I&P#W>e(I5%1Yph zD?)UiJ^J$NGypuh@eKoZdr`Ih^HLyEn$H};5;EXNE(uPSFvX_8F;ZTNWvXme?5m`Q z@J;U0yziQ#TBuyH0S7FAp@6ah(&LC@k9{c$&(eQ1W&gW2Xlm8KW+gtw3J&ks(jKXH zXsRa1mLVVKq+yzA*K=0YusUsw?dsxljBenMRmk^&>cQVDV((MzyNJ!{WmYtnhU*$M z>r-o*0aZp@eBGH2JFF>lf0K{i`r9!a{0g-PD}tn36xkP`!%c<#)M{~B_G=V0P}g#m zw;-vM$;Z{7EM68bb&2dPScoZCKf(SDS^alf4Ay^lt9A~yCgxv_wEu-0Q>7LN(Eq|? z_g}3rT>p=&{^5zg`f?Ti`7fd_#x_p>sWmq{aoYw(5N+tUe=uEbQ<&15xOTakfq6&s zj9TDrU$I!?qyE~0bOY_Y^Jsl!2W-6hEkq}K8I#8@__M+gi*`W73=)IORQf2#@B7L0 z>>mQZy`gHO-^?d=Oki5 zcA023w#|k!xKXHP%TPo~P3m8a5>R@HEEA{Ac?A|z$n?mmJ0k#l4%XvMU zvX{hzbwG|Nw0)jvZf_8>Ca{RWyL@P3=4qpAi_Ir|9@0$m6aOld9WlQh#oYxvg<)kP zju02$V&dHmLHPBiYm`R_e`F>9C4Tu)_G1M@mriGt zghPm6g~4J*nA3?wB4{CJ5*U-9iF$!Tg=PTe^q!y0s4Of}XgYz0O z=u(!dI%issS%0#w_?E7Q*Bsk_t$A*LPA4!PG9FKOx_V!CcXU1d{Nm|Ccbag>|E3*9RWa z%x%U$G^@0?pSV%KpM?3x%uQ*?@Ha1=enEJ7GfvW#L^-`zD(sw;U2LeFMaJUYT2yg6 z6^ZSXT`s{`XeXVJ>k&Jl%GYZ6p=(r%?$G1l2X81n!lV$6YDAkW&DB-8ToWO8Y36t- zagA*V(K6%vW3|V94lyBn^U-IxKQr3VDWFdw@a>&%QY8pFjYZ2Dvgotf!Vmh zhNDst3<%9mp~*>XG)>%CHku@8xOqZ~?Q7f~cVjNiOfK%U@d&YSgKl|d%<*BO^S40a zg<E}O0;juznH5`Rh6e;d7l0~2fD}yymu|( z!ia}@Z7*EI)1;Pz9WUkqVPHUD)C_1K4CJJ5m250-8T=YUzn(wZJJcJ$U<@9;{^n5- zE!;o)@%+=O)xHb*+u^~5!c!SNq0BapG?aW^jSRMlJ@e~XB!sv$MFUF8mW)8JV}yz$ zIsXhMt_i@CoCz)bitw9PX2$vS%2tA`4pB-TklOOK{8m$$>x!2~d6MK5D>1t_dv+x* zP6?rN#E1D$^Xu872RM^lkEF?rqg3)fGqd)urIt;65=8dPZA_F!G=a&w4joSM<|P zZWGY4TPV)n*y45+CmEH*av`5adMdRbj{I3|S_<3SPyOI81yfx^?NT}(^N4P+tl)%p zY8ADqIx`DibX81+2m$8)O9C^u$4x@aqDKBci$(!SkQ%r=C97+05;Ak6`*yb0B=*!%vIF}c%Fy~Lvv8~ydI zSrVYFN+;I2<=vhC;-7RUuUvcddEm0Tam{iorbk2g!U6gmVr#7Xy{t;3vu$-C4s#9c zhLCZzIDG2Xr*ex~te%T03(D>FAexaT9x#R9Te1^D&JGtt)KEE&M=uzzN@ zBU@e~ErH^2OyMxRkwagC+!JUfUaK+u(J)s7T~1{ zN)V(Pp-n)fv~6*OqJFRCXv1=PK9N4IJ9#eqAxgewzNbr0z84klY*&9yHH`xe|-M5Jyvg7v}7i8#mL9F1t=h(2q*^^3C z?@JQ*u&I02w5{+C^42Mc)Ga0T4c6Pe{lXsM+Y|J}AQ9`1B<+Cm#d1kqc#*gweaAkE zPI*p{>=zW=F7hvBvGWi=b5_X)rp*^-CRzxOb`#_fkq+YTP%q01XFnqx0a`ASt@B={O6Lt9v&9U~&VfZgsbss}(`X|g6)!Jsz){cXJ0Q{NG zboKfM&L?*N8CxS~X> z6Hygbpeo#umgHhYmc$5AtfoJ zaaGnB&V5WSzi~;~#cRdTN=cd-Ij@hqv#asMf!2zMA)gg>{REHH41t*ylc$WJV>A}GRFKO> zf-O+^V#>#OSP;Ru!r`L7d_cPOa-(8wHNd=8Ik^G8!7h^8l!qhnT!o8=Q?^>+P-iTh zIn26K54%JRY7g#oq?GvTxNoaE0}lZ838kR~Q6pl6!vU3Xl+m5F^nyrYKyDE&vsdAM zZh?Ok${M_^OCua!( zKVd;Rb+>Zo?tnW5kf+my#(qSx|yCQAXm|0vBj zZdnGKjW$%YFv&F=i0{NS*9cAGMCCGTa#2Lrnn>LG%fmh_pHt4;E!og5_VreJEd-G= zCe|G4L--vhpEP;iSVh=8S==(}Bpt$HH%g|Iw_Y)M%n#)%`v=izTrkTq-BgE9%=7mv z<#f~i<840b`wNJd-6Yq{)hpNj^6HeKpPOdTvYAox)mxbC2C2<7Q0;d+Dv;*{(_B>< z9H7xZOK22@)dA#}Lg2bpQBOG1Bt|M%ou>sD8H(W$ z%NLuN>`1B2Jcu1IJ7o~HEg*l;dyX-Bq#<&0ID8S7(N8>*=HYKWG4_QwM5Ia6zmM7q~}i4}(1n)_^_7hdG?289S( z4(QTIm7I83*M?VJ#Czoy@rHexl%1#S7rBPNW}$9SP0bk&5*P4E!`;V8ue)1=9^r(_ zZn|4%MsU>j!legGNsLIZV2Sc3cM^GLDt;>E(mSmBwwWMski8FNqQF+E?6m zd)T-=nTtP1kYjwi0&8I5`p5ACJHpB{Y9gJnSbA;>@l?^iuhsFpxwlVIYbDMWO3Y*% zk%w<&d8j{&_)Sq1YC+7$D11YV?MTc;W~hn!=V9k*7`61Cn%;%8^H$I@I-l-?^OwBs z2vzDq5*;eOU1jN=nWFKV$YE*(^)*%bMOx{*iQ*w{WR7O0+tE`b^>$E~Xp%Jf(b;qa z_4Y(frE;=0YO(-rxtFw}@wv!h?ANzi4--@2rXQw?hYXZu>;JKM_m6&G>G~YxqOWlK z@#|#%{~LDyCzQzZXuHf02?;3-Y2yNk-~uV<0!c3hnRD>oxi`0=vRuE=i6RC`2mkBf zUFYw{*j^vr-^!#y;NO7!_r{5=1>(OTl;D+fS}alV{xqDw8!5RK;VH*P2*Zi5Lj$OPPgnnUT#feMZ`%2b0rX!mwG1||9K#ofcJb@{AC~D~ zuK0)a6+5elv5_s%*nw2i#_6B(EdL5pk`;QT`hOyMXBJ0C&n}g#-m2UvM4BKEMDF!U z5h*<6F5HvrI`y-cWftz3x+C=l{@4)@Pt-z^Cx&gf-?>?z(^t8RRw2P!qg}unwQ8l30WD^XpmV;KROReXTxK8l zqnqOCWB%N6kx#@4Ywmom(3Z$nyAJEp@?^eHw+O#2MoEKM88Brgm0dZwQIprUlIEb5 zy(o@7XVkP(GB_*m3L<#H+=)gdapGWdHF_gKGm9go-mFX-LrKh~m(ry0BVVyejU}y# zFP-{;xXt0zguOmRPfC=%Qih$`IBCM|Lgg^n2LI}_=mEqP>5m%4v^p+z*g5w0pxK;Th%H8D{9Bnw3HM%nDNtOG-W;B1J$hP=w z78byNH_IRFu?-};b6ODhDPN{KDkwlxFMVu6H9$OAjIWH>57*JqVo?rTZ88UP02zd# zxj;U#nbe2s9bw#~3}-1zV9t$$`|=Jdl%vQ#N}wGTX<~|@LNQ0<$np#Gql|^c=ps4- zI%wX*lAtI#OEEm`DY&D00p-G@>ewQ0r+%A}qQBF2SQ@$Qe_X%#<3+Ed!AcXoqOMj5YvAU{P2sr86cxheRQYN-tw(Lw z-*KUrS3_Mka5ZgJwvwS0%tDFC(^Xx_)uk?(O?0O}Kf8|A|JEbP|8#`pmHYjX_TYEC z-t|qdp2G~Kj59`;KRh}^$f7uYVje9Y+iPHI2AW$MlTvW`6z`ByGSexCU;L|n9N*mw z7i$*dQ!xGjrJMKLY*y~Wfh^r~bX)K)(B;mR(Ut7QcdzGLt>mIxJ;c6B=U?@#9zu3D ziRn^!YaFppq07?quwzrt{S7RAS^Sga8jE8A)A?H-lel2Ms-h10jYzrS_xy;qY79~)@lp;J;EFZ^xm zFv;6sa!h|@9eUq@srN_ffNz_Gq_$#A+2dy&|GmNI2fScTvaR|c1(8K@gn~KFvD6^Vafrmns3sujY}DG7?dze&6&XP@u1Dt4)b&Q zncKUzsgvhP?$^BRIzSTk+vwB@;tk^SkN1=3tVA+sqNv1GNA~MO_h0v&*Q)}be;+wO zC=?eMLqyS!S%YdJz>J8fp4J8MS;Wss+b|Y45B7*C< z>4$1*1Jn#P&^4CZYeSxb4!!FtBaMY=e}p+Kt9q60g#<`!)mcM`H)s!8lU#c1NHNS9 z9C?q|vA}S{R6DObp~D&9Pq}!!p(59*jvUTM&JhWj(5>Ie(|o6(So+?&gC+yfr8&-? zO1;iCugm5@rnRR@VVkrBw~X=$ZZy(KQ+qzBUTreHIhlEw>oxE>a)*XzNvC&PrR1@7 zGw~v2ze>wfJ-t(E`no&@)5r~`Y}9Su8aaiZqv%ZYr~LExMc;0^FfsB^TT~N{9KH6-vHw*F(djl~`k7 zp;(S7dA8ge9s~X~aUO9^0f_Q2Ei?BP5}xTzipG(Xm7!ek^XC+6<~E@xSIeMDn7@lf zCzW~!7gE1z(s;410;BVDE*=_TL&?g=RzvB9qU!(EIJo zU3Bz8wJ`GEqgUR~WaMHfi9(m$LKkGMZNX<`;_U*4j>wqDQR)T!0RjP_*SD^)dvL5i z*a@s7b);6gbNDrQ51afSEgE#8n5Wo49f1lmrd}PjpD>9(MUeY{j-y#4UvbmTL(!i8 z#lY*8ZVVzlrqk-%5LZ@px|_Wc#`L--;eL5Wf!7rXA{bM4&I`3fYVQ0cZGD2ruDU@ZDi1LZ9(>*!wI4QQ{yWOIGrPS0%7k5D_ zvG7#&1io`jyrsZ+Q_zrEUT8xqV8YgGW|{#!n`3sBvjAFPme@Nf+2lM~4kDQw;$mJEu0`o@1$21> zJleGfNHVmOigKb9I!V<}Uk=IAB{CIzEp~H(104`||F}IJ97No7Ud2H(nlk~}s^zm% zEkEk5sU0ij^8&9UvY|fT|C`JI2OWgG=Y&M(D^eEyszR~+FY)!iD8tHrX~uq)puQA% zjKqy?j2!?@w*QocO;#NL3YXFNjON9RnwlP~D9?&vaGWZ>?^&Xvhoki_lH#8wb#kXi z_@vMb2LB^g=D1Zv*5zb;n()qYM4T8upJ(xtozP}vv;lx6k{8R!uq3$vNgwHj^Xk@s zjDPl13`)NeaV1?dsAmD5psE&f7x%fN$rE?6`FS2_vQ11Op#+VL^M`YU?6!ZBba{xaxAD+jcxVit8>-`LmZBkm}Yb)t_@FwFtJ} z@n+cKW#QOko2?~Y_M|M*u)fusBZXs>`9Q{|M>CspccRQbj1J5!;(=_6$TiY8UM51qO5ECRTt#zr?1=*>R4FPvS^~C&b=Hm z#jyxroy#RRG@ok$q$dq-uC{lu?p-t84q~DTp!|3T{h-|6?9E`$KjokJ%l$Nwp57tg zoOymh#% zPQvJwDWrnmcm6Jj0f>j(I2pHUUxdqn^&r);Mlufv833r>m%6pOcoKb1c;XvFdiB4xr znBPjaZ)cc06sJZXxSFCABpWLpPq=p|WjY}Ll5|ZaKt-d`r*w00 zAaCcd0GMVxwDLCpdJ^voKle4o5y`x4A5IwFk4wX0In+&{<{G$a^J%|TH@pcF7dC8f z%+le&3XNHDOiVnSuJ+>T&7j=rhDLQqMXVjHef_O&*!qD;2ic5`VS<-LkTbW_M-;KB^gIIXPDaKf7)F^`duhE;Q_xeKRY1Lke(o~ApeK~DFQV?- zPf1xt(^7~PZgKO!d5sEv)Qh$Ww$wTank3gL2`-tO#arCr(ih}5gfGsg7K(!oR++8gYB1ew3E5<|6mBBmDc6Z1d;eA^@i{vSB*7AdSTsG zSJAVdqh_%b0@JZ3&cybVuV*xIP1}c03BdJto<_h)EuyAB!UX`8*ilFgi2P2fwnZN&p#ND2pd_N=fn$ zMdWUO0T;WILjZJ9PAH^MN8WfBmofQ-EzAhbEZGqgQUG@62NlYA`-%o9k!$C{)$BSO=22RW{=1c)r0 z*E_|b+9%8ppZfJsKlq@$5nJkpX8uA+W~vfXqh}Mk(BinR=LC;zc-OA$cO9P<+hmTdxlg7L+B9xmMD=*k949>PAl5}zsBevo&#)| z*?i<{#>>nXk&ym>F-A(p0HC1R*N3EyowJj&lY=q9`k#hL&Du`o5Z&kMXzRkHAqc77 zzlVNxBs5c&&<}~~yA)Vio_?I&9P+0DWk9p&(b>l~fSL=2tl$YB~ zsQl|q93tX)w0Hh(nFDXYUt>2ksP|`9ev&^3uQ!?k{Gr2MZX2N#UeBF~`f-do56ah( zdc23ja2muf37DZ?ZfmjHx5lf!qF36?y!(Ryh8W7URzu^ryT@$4b*<%=mKvRwst%)j zDF~_10DEf_Zp%}1%fOs5Y_gwZXevi@&?JdCQpK)L+StNB6p$`9%C2WK6HOe&Js3^7 z_Q+tQJRH4Yc(t|M$0aD*U)LPcqvD&@PEx83yf#*=*cv2h%!|?8P>)~=I9dX?IPP7> z4lEo@H}K2|u*RYxE^^P7JUqmhgiN_M9VJk8E9z+c9jy#lIU#gVV_xi> znn4|ZcIJp?MA zygf}xiIQ-PE1QwL>Yw;9kLM+4@>64Aiuq~TQaox#WW)<|7m}rW=XTh&g><@RKNkg5 zkt^xEq-A=5`z({P;eBX4RjPN2B>!s^T)!NrdG2lJunMEEl_Ne!)A4mvl{3Y)X`_}7 zn6VV%NxJT4TdyFCQJX!>;=)DsK`wBvJVf=I{o;3Ob~gOe_*$^$+RXMqhvjYSBWC*o zJ}SF~m}GcI(lZeDy)6(7fDK5?cr6m09xrZ>A|C7xJMDJ^@Fl1lWLh=GQ(*@tKiO7w zK}rfuhU^}V_?kB-$ok}RSXtezR@QFSeFOfS#_Mdzf822=K4F0A z#FK}bfLUU^g45$N8h7%!UKVkQDNO?dTD?@|lQQyCiCc2vl(C3AQD1A|;soB?QLy$v@CORoy7mo5_L!g2TBiidx_lM(x2h*$$~CAb$fZZ{j46l}g(!SZ*FBHAlK zczlnU-t|RfD9*)pe38u=&W5^wG2*FPzF^8yHRt@(Ig-5!yhvXhYRk%yk&ST$8{0Y8mC-mh5IyY zQmdl=?bkD;<$MMawXdSOYjx>aZRVwSU{97TD&;8mttad3s+uZ~ z;|MyGu`~29O zi1#Hl8@6VZYDcoM6rl@B>}1iRsXQ*aX~_*4V5-VCnU4Q(zh2u>m1wQN7lOoroGG1o zgi2YG>%*$LMp@1pO3lP*dSDogw2YM>T4rjv3)oOXtE05YVG(3|=k*eNBwetJWEXNU zqAb-NcvvC-;x0fRxsl7?5(IG}AQ7PM*Wt2_+&=&J8bi~G8k);chUV)uK?hKfT(x zHF;NEAe*O(N-Sn}Xu+l|SEp`irDeSMb^Bx6OhrLUEm&`SI_9F^md7a;$TS?G=6Be@pYfMpy<>E-N7IXtn z9tvb$U@p(!q~s0r*NJ0Biysc&wqeU5G}hBS4W=sGkOjd|$eSJ~K2JHLHQ%M^Nqpv#iJklx zrdRXYPuPR)%_K7OFTrRD>h~cPik1z&`7t@t(VWS0;IuXB&4+Mss$3n>2NU0W&_ZXp z#d}iWM^w$0vk5t&wBOZ ze7qQtqhDP2PhO#cmO)y{5qA+V<;tXs(iL7Hsy;;nqhM;fM{69as4$8MDwoK`v(WpK zwNJ(%Sba2TA=7M1aiYDm|16)=J?{4@n*HSVYTMB?J>c6b&?Y)CK@fbVXx)>d5i-r)5`|P+fcAApQ!vazppk zjH285s{gso@H^i7bk1jFnd5 zY$jhuJd+vRGC5t8Y9af$GIN_Fa95s~!&@i0_K2n~kmeG+=V3i3@jq(V{39mxMVDEh z{X!3&UwUui~i6Lhqnsu9rJ=NB%`zu2bh7+g!(6w@<#?e{p)SD?^Y6(-E=;+YoqT?{N|wx{yKw zBIn)%VpOnCe*^n2G>e{pg_18;_d?LWHcGjl{V!sxUD<@r~y^ z=^k9iDybJ);?k_Tqw8A{y3R%2mMQ^kE#!90*)>V1hm&jTdig3Nhp3M|k0_CHRaX$2 z6dJ|skyy?OW(EY_%z20R%PZhA5y5nxJE1oL8}%nE<~GWFqyTk-@)()p$d>V`8l1QOJ5QGz&IgWmhUZ&e_YA91s;7^%B^#S zW=;0Cbqy!)lpjBfa=8z>vS*yuKtJHwJz#C~=7N0bLzn+3`p=fC>M!pJdU`=|?ao!2%+mn_A(|&pS#<{xwq#e%{5_4ayqq zo`mN+v`kQf)CCP?*&hWZw#5~EQjc|6=K+;u4%eBjkV=(l8)3F&`PrA61QnYy!}E_= zDJ8Njay#4~T8iGdL*>Th57s1|7NR_bL`e%W(LJKdfOhhESV_JlR+;{V>)iDSG2jYa zpr5Z+2hl*d%b4-X0%>A3dtsE`zP6KAS4g8Rk(FpHD|iR)3(mdmHMREBc0Io>+X=a0 zlDu$#!$}{Ni)+{XgzZorX!Ox|rpUce)x{X56wA8tLjCkeN}a`rOi zg0RxzX4HhskV{6HcE8E7PxbII`-T`T-tfHqGL+SQMh}dFtxM3?kdFG~;CqI~urxc~ z`q4n&wr*}hGl6%QXy&xv=KJq8{C^emK;nmT8v8i-2PDjPev7(09odT?^E zwfgsoQ_1S?ZaS*ypIxJ*Ea{zvlZDcAV6xIw<``fB3R)NqYyM73lIxA=r3~q*2Th3_ z{S%pUxk`#ibQQ1`6#?J1R)f^iK#UzNkzEDt)$R0=cjvF?rw?7PJl)+jBOYVho^sx% z_|C7hJde|T1zx}T&EHtS9q*qxWQAG+-CE$5hd4XML!QLys6xnAP(^*eEsNTF!!d0j z^+&f#c5l;GJV6h?kv#u|TWrn4`!PVrlof#p{jy8Rk21LRMT-&-{?LH?FQ z*Aezyh~z3_S0d4-<-$+aUlROwM)@bQbNah|s?|3BAfMs}?x1(yhbHz_O%FJyf`8z1 z79673O`ILZV8|^cLCjt}B|-F_0$S|o);<%?eNZhg_Moz&7k>!DP9(AyRRDu!shREh z`I(GP<7Hnp9nK!#dUUp!y=AbzSD-uff{Y^wUI zIhqgmwb_}%qaDZ)(T`)%&hF}LwK20a)dgH{r%&Z-?dZ1d*K%!PwmovmXnSm%$W5P4 zq%jC?kz}Fvs-|_vXyt_%mV%XEn&3(~t&cv$cU&-{;Tf){JLZMI$2Dnhc1R4d6DJq_ zb@ZUooK72skk$r2^m8pq0SFoWKu%%`eQ6z%jU1_@{s3nprY$~vms+IVQUVF7%krA! z4VRKQUN~vl}^29QYV z$$x&YiE>y;yUiPW;7AyvBwIiTTkaxwLxYuaNpq@lD$!;KM1mG+f!nc8PozWK##xiUgEFVAaGkw70hVS{F+z+&0KTn4_2IaiBUq75n>(BZO>Vh zc=&7R06uwe2-7TkrPr}tube)9Pp!#|eLjws_S;4}DodaXOAgtZdkGL4(@^V=fQdIu2A315gJCAmnVpTGFgn2WOLL(({6B|~)Wy5D@ z=I)NMJ$WYYE&}W-g5dVHID0`^bLR}MJM)HK&y|4s+f0(ioZpi`gnq0cd&v*qKX=Fc zAVlp&bbgm``p_7bzfp##=yZWTU7;s>#&$u1X%N&LHa2VuoItCEesy}sV+iy9a>!8C zhD^m(pa4ZS_TJIrl1jPo<=->6((lv(`sdH^KDfQtPVWTjr_bOYBPw#Sp)oCzARnYY zL1(GNf8}Sl1MqTi~1yH+@^C-vB&$8sX@yXYQH>`=d6P^Keu>BXlaUNtKQCrK0SNZme z({s?4Xjht^ON@}296^UNJ)+(4o?|gR>z>cp=?D*7Vt;-fZz5V^<2wD46sRcKpxH<; zolb&(wQ`?K*))am%#9p2y_)MlCi%tcswlFeHouTLDh|+GYYbH-m>h=@;})or^z@pu zprKGK^tj764?f~?nh6tiJjXa;Rj-k9{?Zu#4V}7>fd>Y#ve5Pb3i)|(!ns)~MW^|=Lw8h=p zvsjQT9QytnO($BDgHv=u*Y*3NcE&KWJo^t3S>*dadHJGMM^7ySn5Cl>m}5>zO?09Q z=yhSu?G;=V{dp|X=Y68I{0&Y5QtGLb44aV=gPzEF`TK~J$4~})oYToR+#ny(kvFm0 zY&H}#SGnM>`Pis4MKnYf)y;HJ(C~ zLOw zrjFmGcqP?V?!=ea;_zOv$*Nh7yGl?^l%vJnmukx?*wA+`ThUt-b%yz0>MMeJgD~&W zpBtYss?SjC*8q^g~}~wph4L&6=<@EWh`bo zH^7m>TQ$1Hbt637*~fR@ZPK!-{hc{0`yvClb6ZnhSaM5oar z=uesCiyYK(H3CO-)PAG4#6mFQJ}p(l@@B+R@$>1}+cUO>gD|phS4NO{Da+=~ly$@} zw$a8w-WhBMH8mZ<;9V>B*=(I)O@DTJ)7)=594|zj7)I1V>TYo^ZCm9w zl--$p5>IX%YSzkL#>f?a1Z`1js|-D%uf;9b|6J(%etzKfKyWfW{0!gu`<;Hk z4mmZb6|W!N3u#zYCvvBsvmPtj2yQvJ6?sq`E0qyhSO`ll!dWWp6w8DWw|_V-l8~bI z9tDH66z=vkeKkCx-JzsWMqbic+B27`*d#SM{}{)`J&B0va0Okyp-XkL(jnv~4S>4^ zAM(@0Aeo5s&?=!>m(5DAR10@Qca~j-K8vf}q}rmIC`X?}R@-`>Wau8X@aD>F^SG{T&%g)#A}h9g(MuRTh;m2OuV``4}`wyT{w*kK)L zcHXhuW}<5U2HNG>*fmD#g43qr+7fM!?D)#JRC`2Y=qF>Wm4usMI8+QavmCE%)>_f7 zQ+3(o-3I`5B(AnjNk}1rYBW7+9zv6Hv0C1mf2&t0r3V=YD@K9iryk?ZdjS@L?> zmE0_oXi0px%f}7lHw;-ZUfGA8v3OE=a;VrPOEnB{bm%%;I-KMI5WFKe|o=F z`dw_spReuuD0bC)4gJ|C!k0S)l|HWiY<{t>pLzU()r`*d8)jIIDY$>t?4Gf49AlF0 z+G9Jne%gDRpSpeCCbMUKG~0i$OPtyNNUY%J_o%v|5i`s5XBNba>#@V|j#tiw`k{HX zGg@`N@zna`_kOpk|ExJ-JNB&GI*%h(!A|pU=5PAG%x;Bcut-hAa?$a~UJvZYt_(9; zayTJHw`y)$PugO^XtUCi^DoYCUfx+dBuQ~@NVtW5<{jHtp{mm5thi0|QNvS=Tl0M2bg`bCG57QFj;H1K)9>EY7jZ1&@}eg-exdYE3<{gv|TwCis6TKbYfScfJB!0nP2Yl~s+=yug!{o;3; zhj~wrqWkgo$7q`CG&_&g$g8tTbn9MRy#DMLbKRpyGVdQ1_IcF$@}q4A2P}N8>3Y6< z_8vR-cIMtCr~drd|Gj+J$^%~C4}berUB-V0H%lH)da)^M!f*at)^C}YGNk6}u7u6q+U-sVO3&z>a4vaK$e+1O z+PQyrYHgQGUlL%e*`rUv_5{z%V~Xl6lTLTroL{-3n_r!q{${`W1@n4Y7hldX8_~Z| zPt%9BX7kh$yDJ7K1h2U1{yx?8rhBcWn_aKM7dyI4T{iEpcD`Bj=H?&Hw#2f3|~KAH3Os%IufvvZhdHh%dW<#OI&*6VfCg5%PnOEQ_Boef2-2Q}APrFIVv4^ECK z|1HkU+*Q|6d+?)unei?6zEvwdemZyUk>FOIYqxwmX#C$m1FPj#`!h$cKbN*3Wn-ax zzYCk*9h=ytOHRJJs79yYLDlO3E-mlQhKSFDje{=~o^&vYdMimEK`|tRO2P+S) zoF42nX~4@vEw8W24H*_udtw3ipW;*dX4q^f4&3wPbCSp7)Ax_Ej;3=fZCXz$sh^yb zvC}6vdeVcu>ovj0tq&eNY!bNtshQ!x${(#~Z-L7(cUPt)q*?olZ!KDsdbet##l4{? zPkJV24H>c4JnwFRR$cEyjFwZfs>Y0*ojO4?J3Yn5aP)Z>&C&Pj2mcHy7+B|FcmcGUj4A2lecWo zytek=i$lKKhE3~ek{r#PTy)sVE@s%g)Xob_hIZY!c--SbgU?*a-uL--;^BF7YQFZG zlJjiAJKy;g?SfpVT4Y)=V!C8UlsrFJJg<^peZooTI&|}`o)>R)o+T*V`N~lLT1ZjK zZttkcX17jG4z=Z6?cJr)zO?sgtwfzGI(exVS{%Kd6+5YJ=#=+g%=d&A|6D_nW3^yMy`H*{d@zdw-a7rptsSQ$B6{+1|r6 z@MBz`FZ<5c95ep@L5=IHHbYYj-9u(9B$;qBdeC71hce>5nx zez9Nor4z>N*{<#Li{9}>@~yY@{!eExkId+Nx$}z zdfegh?yy$nSM|ECS!^)**@5BLLb~hUymoNz{1?7H!DDPMt@$=1V2j@P$SVQr5p6kF z)PGMss?p}3otK>p{Gv`7&eToGU=AO9)zG+R)3%S@j!rhJvCtdF)ph%GWu&Ff^hMtu z8X3^H2QBp4W*B2EYI}R(fY46Ime`p(cP(9zVG&0we>U!QN1tg~!&A$T)LGQqzBR~+ z&FEaQw|x$G+v@4uD=pazu9b2xo0qxmX?Oeg&?8QjZwB8MdG9Pamuho-%aUP`j6Avc zbc99ws@-PW4(gQdI_$nd;|*QYQ~&0c^<^5xdOpu4SGgasw@o&zattzV8`|rnUv5XI zhb|V{{(?#iUh6Zn^ro-$ul;cML`q1PQFFR|2^}`%`yZ`Q57T(A^wBe})}~&bVp=$U zP}fm43m3Y7)L(LZvt50gBXET^YfPVla-D&P7x`H0Y89DTrY$#1^p4K$nVS_qI>b2r&lltK0kfjC zJ9sQszm=`KxAol>Jl9!PerwW)n5^m9wVSa~QU6n^@#%4%mc~vF=>~W2pA5RxVP@jl z)oa}90~R0I-0OI3{};1UqF+BL4mS8wALuoEMW>&c+>D>=f2niQ%7&(vKJR=p<6@9` zL=oHwwpOcnug(Sj=$>)34)wGb?LrN@Z!2jN^8SzPK2aKNJgnm&mXbZNoTG7hO>ci9 z{so+Rko-kNlt6Z7kN8(`v54%iVq%*8AzC=f*x)~)?yUJAHoSWsuTkq_^C77Y{>&Gu z8V$+*+?mIMZHI>Cr7+{Vx4I?Vbh=P?vvP(!EG!PN zX>q$ClzCxZtGcbJ$LHo9@+zHqb`yX7?AZfW(<~13*qY8+RIWR7LG{r-p4LVsKXObQ zW5Wv8-AeP?+9Nx0Tlq>)EAulC`>stB51zuE<~wTrir9{mhUu+5(mv7R{g?OF9gg29 zK61*~c{v zf{O)TzgTzMe&x@{`3XGkeXqc*emX;L*xBy$q{=1{H9qZWd8&gO&WhB%CT`zG49_EHPeHuWFQ_PV5HXEy87;Ql|`^q!dd zZeR+X(f?;Q_onp~t&t{iz2=yX)=8-t&SO?SHMLCJy5QmIFPUq^#(VyC2+37nV&$~7 zY@)Dz_=VJVjDs3J{9d&uEmnDM{60);Y4V8ulgHY42#+7qf4^>^?%{ifPDJM&i#e2S zS6N?cbLdTm^>NGjTRD3T+kcPgzBw*ukoD1}BKJgba%RQReyz*i_M7E&(a)p1*MPk~ z!zZ>2c=doi%E`)XLEN`F20dS|KHj4MU6!b(-mwMTRSL#RmovD3XvoIVqf2|^fWBo) z`h5+IO!iYP8q(r_sbB8`9rL(c|eB{5ZBn!?0+A zBaTw3CK_~+4RGk4?}~l_I&FNA_O3SmLON=tg41Z|T{zOeMBiwbH$3Qfb=dF1>7hJU zSTkBJ$otiUQ+=9hr6h1GiE3}`_B0NY8$ zhi|c{br%v)KRPF(L0nlAWdEYH0aY7BCy#-VS;DC8jd6YYR~0Vu7L0uPV+TrjJ_FPq z7-~KIUxHc`cj$0SPOrP5im^Hkvzio7EShLa0@kp#PA=CI^E=#G(AooF%*Ik2_!f&I zzyt|$H9$#TJxz}HW1NAz7<#H7h=+R|Q>YQA!1IDr_~dYT1O80E2yj6JxK@zIp@8$_ zvMJyK%MG7qgJ0+cEykt$X9yV_8U+%AA(yV?^d^5jfcgo_Gr^Si7G7&gl&;yJA_o*Q zmhHF#^1Xs4Bfl+u#3FmR9Z(@)RT7?RU|4abi` zwX%s2F3Di>(4;6m_Sf9=qr++Yt{r|73#RZI`VS>prH@!-=SwATqjD1c$9XoXMP3~Z zmkzFYFu%kJ;Ijc9Ojh=YMZd=V6+CFY@dOh&(S?#Or&9uHv`!Xkw4pK@)YEJI|CT5r zk(^_Cx@}Sdc#WwL+~B$r>{fxpnJ%FFbA`|y)#;BT;-MRUKsVspxqE^N+TGdFX^4tljW{}$&dl!(9{)Ei1@W%lnD_S_(BH&v zAO^IZWO_nFtb0BQQ7n%u;5PFNG#avd+3(;#y376#0`aE?Nr++dV)5~cux<>o)vSjZ zZW-H8bMKC*t^4Wi2r z;2eizgcX-4HP9%$Gb@707c`?K4VMv1NdG;{wZR45g=G-#hWzg;W0CkB4xO!Pi##GY zWr5)Gc)*9p{-?^6amh-Ped!SJ68v&Q>_57`jnfvemTEA~L72)yE0hs5G{T9^f{r2% zU9|G?N?QF^55`v|eDLw*`%N`;MV(HxSaer$!-FjL=ywv1#_pCkoz~CKi)VljOKaEg zVh<^fSoBH(3VGX!a-nQZ!-M3?QCA}d6OD3(!d*_y24%x+;cw*OI}%*f8L$LAihrgI z%7MqDQ@Cyag>DnB0xAQXQ!lA}@GTaF!kb$O(N1##k;^9bI2s&hO~O5Eptnn5+~cBh zwUmIm(jlxMNBzEjnMoRmdH_W2gNeGawGvb>W(-6@ta!7C9qO0P`NOqiwk!4UdWE)2~ywfsRSO* z@Cw5yZ0>4a`Kl^#yUW0-;FkQ%R0(V#oh>8;Geob@v?f4aK^v}lqZ)KfX#xk&ilNqr zcT0YM2U_15A|#XcNoo(uaZ4t5!Zppz~+XMH+^b&>!M>I=vfGh zhsi)t(>r^R!npFdF`itA2e~}c#&5zoe0k4PzIqDB9@e-$LAkhoO~xrBAs0JIIQp!b z0o)c3(HKOTvPUf15k^E5hKEzlJ@4LLE^z1offruoYv|(8UILY-a4h(uMX%ZEU{OI+A zt2F@X4}5S(I(LmiIPCT2@?BdPvwYS&Kn#W%5YH}MTT710kOjmLRMM$Kn1h;^+8%)c zc?XbjkJ@4b2{N0FGC-2dbqoZ;rf7kJ{fmMLcg4H7`022$y$TlKfN8q@=Kq_@jT6o# zx0BdNM@?T?vJ_=E6sk%Y#iE*A<#gnjJ%U?ap3#p++rX4hawWYYVnWi8&lEH!vWb9b z7xqg)IcqX_@V#Kr#!?C48?3LBdb1f)GRrtM0P-zhHQSg6kv9~-Y^@eqkiR#8c^vmw zC0&Vll>RE^%aJgYCddGvg^$;5W<(e`^+hM&8$lz&V0`)8`+&6yuyEV`4`zam5|5^`2_X6}Xo)I}{qX5j6Nf!utOmD8hAs*&zG{%%@qpkC~pxP-fzxgfSkqzIsJl_Vp@^QIle{l!x+F+hY^OW^LvOgObWV0NE`}8RQUh$S;Yq$YJD=Mnh^HHUcDC%bQ`=p3PAPIh-6a z$yG0T0zg(0#${5ELj(Z zmxqJgwjlRF3^vzJC0IpnoRPI%VePlYPX+7Q8CJHMOzA{{2 z2!!^q)Un4%4P8_xRh4c2kjOAgNWMlv1qa?lXCKwsQ18S1sw(NG;;C^%AQ`a%;%{fH ziH`zRC-vlVB2;C3*mZT)YUs%>pjdZ|F%|+|${D1|`Xpuo2~939(VsPgsVc9Vdci6k z;B^FESB#evsyZ*^9bgAlRnCkXG1IQWkkA5N+|fM=SDiB`h7D^4;#fvugN{YuXGqDNOZSa`>30M zeHHu#zLuDKlMJ5^uP_!+Bv;vqk^j7ew*sj&=I9 z>Oqj0(TCxWFWK`RsQ^k5JPvtZGtC^Dd>5i99Cc8&3aAv}WBT@i4#lwPHx)Kna0P6r zQI1Lx>}@oh`ScXbpq*glfP?P+q8yYW+#7VwWFoB=4RP})@#0iSK)zLnMB z#s(5V-~Xc=lp^H&5mUPRG8ol=1fw$4Qw~ZI^tCu!G-n(%e=6jT@#gpHsvMLe?CX4Q z*2o+HT}A*s(^EMpMd0_M<=cZHVEzI^@9*lP9F!vTE1A3W+A8pdv0zqs!qeSaIVcML zVB-eXyx7ZK{pUxV+Yo&@g|0mFC%<{fX@ zslWkwLX^Xuz!F3@=Jd&(FoXHz3cAO;Jp}Z4q32V3xEx^+z8SIjDOhaH*U42LS)pmyb?%k5>U43iOb;j{#Yg(lE38GMPnZa?FMX=(Z@GzH2V;-DQd+~(5AcMz2+-O`xQY%2-=W6kUZ~8 z0CM4n(PNnszrg2H)fhgn>h=q^`Di!b(^rOva(?jx%WZ@5#9K^41Zp1RJT0)~_f!vvQ3vPUeM>_Z}}94PGLa2QZ1?eFjD&kc)a z3KVWaRb|wDpo0&Y307++V?sUH$zLfKvGb6slW**a$OkAW?2%g=oQfoY6fimHpg$1{ z>9=m+BW+ty#dC-c$6(?e2iGb$a?w6Gx8c^hri$K#L{sU%yF*E?q({T)VaT$HWrz(k z-4k}F^Jx2l(NBJJBPd2yQu5|h?_BclEQs<25Dvgjr|c1n3PeO?7L!d;C-8ZLeV8k# zWi(hwPZBt6aAc}>`B2q^t$4mqbFM-`$d^bmJI{{AOcdZC}gyhKY zZ4A>;@pvvobGV@5T@=Vvt`G@2;P-;MCjj>eY6EaVKkcP}^W`xi>|`=z+neNqE*#}2 zS`8j22XZO6$LW5U0$CQ)kRv{_o>m?WverYij4#1IpP)c&IL@J>#CDICk9-Q9<_s$w zyjJAk84CRIu?)0)W}^d24R^j0MMnj{_2>45#{zU`a11a8WRF->c8MHX1#>{a{ienq zGy=B}3N91xzsw>EU`cHzn)YG9l2+$y(Ix_NTiS~jv0!9XpbdNi{!^?fvcE4;9SHlE zN&brxu#F(F4Lr0yb&moYc06Gxy`i{Lx$vv_`Yz94svph}& zJ3tSX!I~PMm^G@&5#s zv;_A9roYH3B!^SRa`^(K_-IU3?k_V&g(;`O*YuGMRWuh|ZqZVHij+8SrLd?2E~egk z&>jYq5oiWq?zL%21q(-2p%O31%hS}K1>3qze|kay7rk?YEGk1JG_KnM%l05U2#!Y| zytYb7$kpBBQjZ1RpbprDliTO7HX?`gb|NjAK=PSdCLTWkKvQ9!#T{XsF*%qD&Km*O zj5ILk!316az?N92MVYAxOf^p;_;=GMoizcQ(*>KubJzX)ki)|PBX;9iTb0biKsaEL zHaM3!aN{Oe1GWsLVxXLJkjR!hjV2BSk-Y&F*T|buz#I*@!BCqJL9wA)DRYpEnUJ zSRL%R9x$;QOuns;e8-4F|Aw9DzEIovKAu7UfhBc-w&C4=G+80K(ou^l(~OJEvR_Z4 z(eg&A$)T4mCP9Y;B&?_z4euL-GAk(lQBDq1z=)yR*yQUVf!qFrw6ADd`gWnRd z(7{kN_sZFVsj7=d7n7H2LRd$6LD+?d3rA|UBIsAz z5T%BJ*6a(o4^E*qwj)f&cm%r8od~VU`Oty|gHL||#5)i)_r$cG3tK4i#*hf1Lt`Z* zdD|TZE((JBEZR>P_q{Q=$3f(9D4-4CL4HtylkIvXlW7LC!eOv6+{}_DQJ^xzDH8DC zbth^^K)uSw1M-DsLV1$z0FVF zo#y5ihQ9-y?uCFJpNcCctH?^O!{1(SM(9Fw_5nD)H0}~g1ZIRbn{8DKR2Ej%rJe;U=RtIg6UjdG-NjZMKkTewmlNMLs(*!eA;epyas;rmD(i zBn$#nIK)Ib6(&VWRGm4fg)e}ilp8+Z%wItUC=2h&HBeQzb0-hv8wZfMVYkmD!1=)5 zjbxUA%5HyQEK0~LJ&zUVXJWV-8eRw=d_udonn=)WgioLgU;~UIt{tf+9hC<26ZHVM1q?%Tth@fKCBcRBnP}#4WN{c^+Z5w) z!0f;gupvO(0BaDKH)W4l6tIDa*}NIy!c4T6_X*uMeou#>%a<7QV1(;3Pp9$!!bL1qI0;nz^UN*BigRN zV<2w<{iCpU9Vq_{eDH%2PxcV;p*sWUya*=6kyG~kF}KHpI?%?Qt*l4UoO%ql0OX=R zLaxNrAvTsNF&Rf> z3Xwfx(ZYOHSUC(|>d?*p-q`X`*f@&-hlVd+?JuYR4&A|r2#V_LSI1TKY>^0V;)7%O zxDTqkuNHyYwQjh^ArEGGT7TGI!i~^@ts1U^15RVNwjF;C+>bd_I^d-} z-GzSvuJEkW%?^*xyTb;q5auns0hV)A<4}-b8ud|g-x1JyDQF$H^Q&tWfh!8PzBo@` zh_29#B4|8+y&_Dd$pf@v3%T*RL*{zW1Vc^kyrYho1iUc~j3PR6^Vqm+tSt(o`+pO%k4&Uy&xoY4>_;4yoWhzid+kwcGRg^>$*peFzJZ3xLMAm@(@ zn3+KZi1zWR@Fqvyx#Pj0QA;JPz&x@A3s!`OG-kn_Q+AcewR#y%Q;TT z2kKKFtI9!+ymNtFt_UPw1sP7eVraY0XZE(PJ9IS z^HPFK-td>V+KfkcAJf3T@r9L#Hz^=rGVx*AI&$PuCkqCk8)06+>TozVYPO6cA~)8& z{dIb2Tk#y*ba0U^U|z%(-8P7lMFr^t(hk=mW4H~D98WA)g_7Y4B)JW8O>8bm*M^;Z z+NU=1mb-yLjU_p0<%F(VVF%Fp(PVWN$RZY7?j4D8>K`FY#pl}BQ7VIz%bh&)a?J=2 z8tuVG`9U$5s~DObFXG+1wf-S5FNFlMpS*S>h9F^DUcdx@BD!SAe7k4{c zL?gGtZYYIEFZSk}`ZLj6l*sS)MV4@+|BsFT!5ngX0c7Q5!lE!{^La(U;9Jq_=9I zx*1(I!}_i@T)LGcU%IQ_n*b}z7Rtg+VzUwG{Ck6*qw13`1RL!-g$N4$Vv3f1&`ofO zR~Wh*f*dxwX!+Olo-mAHp8}ROvPUf1Ka~`g9Og&lg4@Gju$#k50H47HA_7dHrGOh~ zB`cd$bll733Bg8>R#SDg!=v z@G)r@C2|;Bi1y4J;SjI_p}hvxKj;doK#L<>=-&#Uxon23P;wf9eBMCnSQhQ&%>{v1 z!UrZd*#q0gdnknthe{)7W~eYifyiaHy-mJ@xM#t0;@Q)#xs<>$^aR)fK?k)_sHXt^ zNz}ObT_EgN_~7-Nq5CM&`CK-g$Krb_Cm}j6NRKr>$Z<{EPat7RPubwcj9kgU-F<5z z4596S5AI6VD8zAwT2pk)0R&ew=UrO2-6QJ z5?PWNL%A2(J~sKBJ9@=aohoFAfbTBV2z-l0>klc#N0V*@$}GV8lMlBhvN(c37W4@! z8&tx3eeQVuYT!KyysjAUiz6!V#zW~BD)x)y@>nw@eEzY_FeRKv{yg6K5I7G5r!&TB zd0Z){H}68!nkTC-{d|p#sech5k#N-D@G+eIo0bvKLehvz=P*m)}B(z zGfv3lB}(Eao)9h>RCH4(vPj+4`&yyP#o(d_nmwk)2WOOW$>Oz!rJv$^K@r=kC_9HT zU|RufBQQ4eeC2G3905H+l15Xaz^u95cYOewqd)^ex9ov;q+C!+(>R=!P^^5`LG>NS+meQj}WHZt}c0^Nrzs?q(GrT>nbV1aJjhygm> zfA=j^osP0iG|4HNW?G{e$^H-W-`+)vNYFKZL$J^j)m&Gs?bt#a#D!9MIWL~70vg06 zP49nFbZa1@da(KHakNv*0XjTT`*1_K;Hvm?#4>wUKgTD)f<~sVOg+fLI^9;0<^S~P zi2Z)Qyws<_j^YDPjGb{;W%j@J>xg-3apz9RN1*pG;d9u&dnz*jwRcCnwe{*2$h)Tl zuRYe{_YeLLUP|L{I6^k19Naq159;P07{x zeh?-?*eHqGnmJ{fFR*BrHkHUGHQ@0v_yPmH3z9W|^cFQ33=HTwCm9^_$0AsdJo?uAoMgn@&@f`pM}xqh!M`OQ-M%I1ehw~t5h&!o5B}lSdsec$9j;rz{A#lShtH`z^ z5ZT^#!G2djMYe<-lKxl4Vk;mcUzmOW6{)rWOjoQeKX`}!QcTrQ!G|JkA>Wx59^R~7 zH{fBcw zF!s=UeQ>YQiKQAJVYi=>4^3zjD?fR^fr^K_Fq=6@O$WYV%ZjZMpXxn^=z6U3C~OU5 zqIYNc)%(A*Ril&59SWNjdH7)PLr|kLxG;S6K5LOmJQDZoi!LB-=6{J}9kpr4^n2^j zE5oJ$7oL$gn5sHgkVBJ2lJgYtFN<62z-uzhOH3&2DZPj@HR#1lfuKEm%mDxFP>n{&M-{Y{@235(~-scm4 zNkCcGig<4PyJPfm=%JS2*KuRe%vXs=`A|YMX{G8jji6jd-CRCr)S*x%8s!$i9y@*x zy2F$KTEo*)$)ze%DC-pUw(BzZK#>9g0DeMX>thuuWDzFO6(Bv)hPaPKX`!cJ#`s=G zc!g>VERsVt2zlSaPo2)fTo(lU5w_THG<>cMS#|${n4$!nfP=tvaiF}GtUoDZQtnz1 zgVRKVr=4KGkPkr-zWyDq*;YOXYlw?vL5=_4c$L?cBhS&GD_X)(55$zVv#m0sM(2n& zx0;;=lO$MOS(0lFIq~QXLJ$)+7NC=xMER2Hw&%d;(7pViQQ0FFb?f*SGRT7y-vHJ@ z28|-j-kpfxF$q{qh)PZ7jqld(H4Fz4gx>fZIguQoSzTAtyeO#wS6HTPYx-~*Uk&Dc z7##T0Wh1;~Q*O~51%fK&@p6PK$mO-taBG;xE>FGn;706VhJ@iFd&Huc?xbYRPRc27 z%FnJjf+%PTDz?KNRiN45pp!O$xMak;wL>og1)Cdzbt@WSb@xM8!$E&q7bw;-m9-y5 zkIv)(?u=;5A)ed_(szoWW9c`IEqpYg)wS?xTE!wnHq;Eubs!Q6z=*wrWE)z)s7D$M zhO=ODCYWq{;ND?!B!zR}bl?1}&JYlB0I(+pm}pG}C@I7um+wZsZhtEnumXU@<-27| z3fFLV1-a@_gJ)MhP4EU|v4r>jBi?(K!O_^u;4 zqO2;DOiZHD!78BfLB6D~I{_3nmha$@>|b^*Gw$HtG_dl-}*Q3QXp(|d~#rqL!0z=K-)jT2j7HF3sMo7Vmcsd8Dh4^ z2WffUL;}7L%F+lL_UvNoJrG9WJ^0`f9-%-$bJ)-!&de|_T>oSWX$#809~l?tMcL5@ z(0eQhD{n99-An-WnMMujD2xEt3}<-BLCy1POhP~l=w@d; zihsr+2bE0UjRlE(XKvUSCM3hq4bnscWM#|0o$b*B!0*B6HJ0`je8Wqp!^sKYJgnp- zDG?88p~Df*B(!g&4|w>*^fr(g~(0p=Sw4E{oYE_+uF(hw@K$sS~yI;2kS$jfE zVToZDq>y60CWr2-B!Ed4$ouu}Km?{Lx8z1BrjFz{hae2+Bc;YW$P&NC7 zW8*I(q6E#H2k}?nKAZh2ve~a{9K1jgj_zz=HBEH$r8*-0bY(6B_ z!H-aRx1sdc@GTbQll`3P03F&eI633VzAE_XX&9JI!4ZObwW2M}%O${JfSb4LKsRq^ fmmmvIH~#=%4^6OIxWrd2S?%N!_>Wa^$cgqpcdK4g diff --git a/spring-mybatis/src/main/webapp/WEB-INF/web.xml b/spring-mybatis/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index 569b5ef9b1..0000000000 --- a/spring-mybatis/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - myBatisSpringServlet - org.springframework.web.servlet.DispatcherServlet - - contextConfigLocation - /WEB-INF/conf/mybatis-spring.xml - - - - - myBatisSpringServlet - *.html - - - MyBatis-Spring Integration - \ No newline at end of file diff --git a/spring-mybatis/src/main/webapp/index.jsp b/spring-mybatis/src/main/webapp/index.jsp deleted file mode 100644 index b60222e7de..0000000000 --- a/spring-mybatis/src/main/webapp/index.jsp +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - -

- Login     Signup -
- -
-
-
-

Welcome to Online Student Enrollment Application

-

Login to explore the complete features!

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

Stock prices :

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

Stock prices :

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

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

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

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

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

+ * It should be noted that the first three arguments are not strictly necessary but for the purposes or the example + * help really simplify things. + * + */ +public class VerboseGarbageCollectorRunner { + + private static Map stringContainer = new HashMap<>(); + + public static void main(String[] args) { + System.out.println("Start of program!"); + String stringWithPrefix = "stringWithPrefix"; + + // Load Java Heap with 3 M java.lang.String instances + for (int i = 0; i < 3000000; i++) { + String newString = stringWithPrefix + i; + stringContainer.put(newString, newString); + } + System.out.println("MAP size: " + stringContainer.size()); + + // Explicit GC! + System.gc(); + + // Remove 2 M out of 3 M + for (int i = 0; i < 2000000; i++) { + String newString = stringWithPrefix + i; + stringContainer.remove(newString); + } + + System.out.println("MAP size: " + stringContainer.size()); + System.out.println("End of program!"); + } + +} From 9297099abf0f4ad18041619ccef3c72efb41c032 Mon Sep 17 00:00:00 2001 From: Emily Cheyne Date: Sun, 16 Dec 2018 16:28:09 -0800 Subject: [PATCH 084/359] BAEL-1049 update readme (#5941) --- libraries/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/README.md b/libraries/README.md index ce2445f3e0..c1f16df6b4 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -66,6 +66,7 @@ - [Exactly Once Processing in Kafka](https://www.baeldung.com/kafka-exactly-once) - [An Introduction to SuanShu](https://www.baeldung.com/suanshu) - [Implementing a FTP-Client in Java](http://www.baeldung.com/java-ftp-client) +- [Introduction to Functional Java](https://www.baeldung.com/java-functional-library The libraries module contains examples related to small libraries that are relatively easy to use and does not require any separate module of its own. From 64dd23f8f0915d6aaecdcbcb39360e675eb4f8c5 Mon Sep 17 00:00:00 2001 From: Emily Millard Date: Sun, 16 Dec 2018 18:18:13 -0700 Subject: [PATCH 085/359] BAEL-2324 sorting arrays --- .../baeldung/arraycopy/model/Employee.java | 8 ++++ .../com/baeldung/sort/ArraySortUnitTest.java | 44 ++++--------------- 2 files changed, 16 insertions(+), 36 deletions(-) diff --git a/core-java-arrays/src/main/java/com/baeldung/arraycopy/model/Employee.java b/core-java-arrays/src/main/java/com/baeldung/arraycopy/model/Employee.java index 757a8f8ec1..a7592574d9 100644 --- a/core-java-arrays/src/main/java/com/baeldung/arraycopy/model/Employee.java +++ b/core-java-arrays/src/main/java/com/baeldung/arraycopy/model/Employee.java @@ -7,6 +7,14 @@ public class Employee implements Serializable { private int id; private String name; + public Employee() { + } + + public Employee(int id, String name) { + this.id = id; + this.name = name; + } + public int getId() { return id; } diff --git a/core-java-arrays/src/test/java/com/baeldung/sort/ArraySortUnitTest.java b/core-java-arrays/src/test/java/com/baeldung/sort/ArraySortUnitTest.java index 489f1848e9..59035738fe 100644 --- a/core-java-arrays/src/test/java/com/baeldung/sort/ArraySortUnitTest.java +++ b/core-java-arrays/src/test/java/com/baeldung/sort/ArraySortUnitTest.java @@ -5,18 +5,20 @@ import org.junit.Before; import org.junit.Test; import java.util.Arrays; -import java.util.Collections; import java.util.Comparator; import java.util.stream.IntStream; import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; public class ArraySortUnitTest { private Employee[] employees; private int[] numbers; private String[] strings; + private Employee john = new Employee(6, "John"); + private Employee mary = new Employee(3, "Mary"); + private Employee david = new Employee(4, "David"); + @Before public void setup() { createEmployeesArray(); @@ -25,13 +27,7 @@ public class ArraySortUnitTest { } private void createEmployeesArray() { - employees = new Employee[5]; - Employee employee; - for (int i = 1; i <= employees.length; i++) { - employee = new Employee(i, "Emp" + i); - employees[i - 1] = employee; - } - Collections.shuffle(Arrays.asList(employees)); + employees = new Employee[]{john, mary, david}; } private void createNumbersArray() { @@ -74,45 +70,21 @@ public class ArraySortUnitTest { public void givenObjectArray_whenSortingAscending_thenCorrectlySorted() { Arrays.sort(employees, Comparator.comparing(Employee::getName)); - Employee[] sorted = new Employee[]{ - new Employee(1, "Emp1"), - new Employee(2, "Emp2"), - new Employee(3, "Emp3"), - new Employee(4, "Emp4"), - new Employee(5, "Emp5") - }; - - assertEquals(sorted[0].getId(), employees[0].getId()); + assertArrayEquals(new Employee[]{david, john, mary}, employees); } @Test public void givenObjectArray_whenSortingDescending_thenCorrectlySorted() { Arrays.sort(employees, Comparator.comparing(Employee::getName).reversed()); - Employee[] sorted = new Employee[]{ - new Employee(5, "Emp5"), - new Employee(4, "Emp4"), - new Employee(3, "Emp3"), - new Employee(2, "Emp2"), - new Employee(1, "Emp1") - }; - - assertEquals(sorted[0].getId(), employees[0].getId()); + assertArrayEquals(new Employee[]{mary, john, david}, employees); } @Test public void givenObjectArray_whenSortingMultipleAttributesAscending_thenCorrectlySorted() { Arrays.sort(employees, Comparator.comparing(Employee::getName).thenComparing(Employee::getId)); - Employee[] sorted = new Employee[]{ - new Employee(1, "Emp1"), - new Employee(2, "Emp2"), - new Employee(3, "Emp3"), - new Employee(4, "Emp4"), - new Employee(5, "Emp5") - }; - - assertEquals(sorted[0].getId(), employees[0].getId()); + assertArrayEquals(new Employee[]{david, john, mary}, employees); } } From 4a55426727407702435bea9db929eb64dedcaaf8 Mon Sep 17 00:00:00 2001 From: Hai Nguyen Date: Tue, 18 Dec 2018 00:39:41 +0800 Subject: [PATCH 086/359] BAEL-2230 Equivalent of Java static final in Kotlin (#5848) * constant unit test * kotlin const --- .../kotlin/constant/ConstantUnitTest.kt | 17 +++++++++++++++++ .../kotlin/constant/TestKotlinConstantClass.kt | 8 ++++++++ .../kotlin/constant/TestKotlinConstantObject.kt | 15 +++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 core-kotlin/src/test/kotlin/com/baeldung/kotlin/constant/ConstantUnitTest.kt create mode 100644 core-kotlin/src/test/kotlin/com/baeldung/kotlin/constant/TestKotlinConstantClass.kt create mode 100644 core-kotlin/src/test/kotlin/com/baeldung/kotlin/constant/TestKotlinConstantObject.kt diff --git a/core-kotlin/src/test/kotlin/com/baeldung/kotlin/constant/ConstantUnitTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/constant/ConstantUnitTest.kt new file mode 100644 index 0000000000..51d45b8df0 --- /dev/null +++ b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/constant/ConstantUnitTest.kt @@ -0,0 +1,17 @@ +import com.baeldung.kotlin.constant.TestKotlinConstantClass +import com.baeldung.kotlin.constant.TestKotlinConstantObject +import org.junit.jupiter.api.Test +import kotlin.test.assertEquals + +class ConstantUnitTest { + + @Test + fun givenConstant_whenCompareWithActualValue_thenReturnTrue() { + assertEquals(10, TestKotlinConstantObject.COMPILE_TIME_CONST) + assertEquals(30, TestKotlinConstantObject.RUN_TIME_CONST) + assertEquals(20, TestKotlinConstantObject.JAVA_STATIC_FINAL_FIELD) + + assertEquals(40, TestKotlinConstantClass.COMPANION_OBJECT_NUMBER) + } +} + diff --git a/core-kotlin/src/test/kotlin/com/baeldung/kotlin/constant/TestKotlinConstantClass.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/constant/TestKotlinConstantClass.kt new file mode 100644 index 0000000000..8bcc327999 --- /dev/null +++ b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/constant/TestKotlinConstantClass.kt @@ -0,0 +1,8 @@ +package com.baeldung.kotlin.constant + + +class TestKotlinConstantClass { + companion object { + const val COMPANION_OBJECT_NUMBER = 40 + } +} \ No newline at end of file diff --git a/core-kotlin/src/test/kotlin/com/baeldung/kotlin/constant/TestKotlinConstantObject.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/constant/TestKotlinConstantObject.kt new file mode 100644 index 0000000000..815fdeaf14 --- /dev/null +++ b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/constant/TestKotlinConstantObject.kt @@ -0,0 +1,15 @@ +package com.baeldung.kotlin.constant + + +object TestKotlinConstantObject { + const val COMPILE_TIME_CONST = 10 + + val RUN_TIME_CONST: Int + + @JvmField + val JAVA_STATIC_FINAL_FIELD = 20 + + init { + RUN_TIME_CONST = TestKotlinConstantObject.COMPILE_TIME_CONST + 20; + } +} \ No newline at end of file From 2f7c16e00df9eb29b7171245bfce333458735910 Mon Sep 17 00:00:00 2001 From: DOHA Date: Mon, 17 Dec 2018 23:15:06 +0200 Subject: [PATCH 087/359] predicate chain --- .../java8/Java8PredicateChainUnitTest.java | 131 ++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 core-java-8/src/test/java/com/baeldung/java8/Java8PredicateChainUnitTest.java diff --git a/core-java-8/src/test/java/com/baeldung/java8/Java8PredicateChainUnitTest.java b/core-java-8/src/test/java/com/baeldung/java8/Java8PredicateChainUnitTest.java new file mode 100644 index 0000000000..fa579f9a00 --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/java8/Java8PredicateChainUnitTest.java @@ -0,0 +1,131 @@ +package com.baeldung.java8; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import org.junit.Test; + +public class Java8PredicateChainUnitTest { + + private List names = Arrays.asList("Adam", "Alexander", "John", "Tom"); + + @Test + public void whenFilterList_thenSuccess() { + List result = names.stream() + .filter(name -> name.startsWith("A")) + .collect(Collectors.toList()); + + assertEquals(2, result.size()); + assertThat(result, contains("Adam", "Alexander")); + } + + @Test + public void whenFilterListWithMultipleFilters_thenSuccess() { + List result = names.stream() + .filter(name -> name.startsWith("A")) + .filter(name -> name.length() < 5) + .collect(Collectors.toList()); + + assertEquals(1, result.size()); + assertThat(result, contains("Adam")); + } + + @Test + public void whenFilterListWithComplexPredicate_thenSuccess() { + List result = names.stream() + .filter(name -> name.startsWith("A") && name.length() < 5) + .collect(Collectors.toList()); + + assertEquals(1, result.size()); + assertThat(result, contains("Adam")); + } + + @Test + public void whenFilterListWithCombinedPredicatesInline_thenSuccess() { + List result = names.stream() + .filter(((Predicate) name -> name.startsWith("A")).and(name -> name.length() < 5)) + .collect(Collectors.toList()); + + assertEquals(1, result.size()); + assertThat(result, contains("Adam")); + } + + @Test + public void whenFilterListWithCombinedPredicatesUsingAnd_thenSuccess() { + Predicate predicate1 = str -> str.startsWith("A"); + Predicate predicate2 = str -> str.length() < 5; + + List result = names.stream() + .filter(predicate1.and(predicate2)) + .collect(Collectors.toList()); + + assertEquals(1, result.size()); + assertThat(result, contains("Adam")); + } + + @Test + public void whenFilterListWithCombinedPredicatesUsingOr_thenSuccess() { + Predicate predicate1 = str -> str.startsWith("J"); + Predicate predicate2 = str -> str.length() < 4; + + List result = names.stream() + .filter(predicate1.or(predicate2)) + .collect(Collectors.toList()); + + assertEquals(2, result.size()); + assertThat(result, contains("John", "Tom")); + } + + @Test + public void whenFilterListWithCombinedPredicatesUsingOrAndNegate_thenSuccess() { + Predicate predicate1 = str -> str.startsWith("J"); + Predicate predicate2 = str -> str.length() < 4; + + List result = names.stream() + .filter(predicate1.or(predicate2.negate())) + .collect(Collectors.toList()); + + assertEquals(3, result.size()); + assertThat(result, contains("Adam", "Alexander", "John")); + } + + @Test + public void whenFilterListWithCollectionOfPredicatesUsingAnd_thenSuccess() { + List> allPredicates = new ArrayList>(); + allPredicates.add(str -> str.startsWith("A")); + allPredicates.add(str -> str.contains("d")); + allPredicates.add(str -> str.length() > 4); + + List result = names.stream() + .filter(allPredicates.stream() + .reduce(x -> true, Predicate::and)) + .collect(Collectors.toList()); + + assertEquals(1, result.size()); + assertThat(result, contains("Alexander")); + } + + @Test + public void whenFilterListWithCollectionOfPredicatesUsingOr_thenSuccess() { + List> allPredicates = new ArrayList>(); + allPredicates.add(str -> str.startsWith("A")); + allPredicates.add(str -> str.contains("d")); + allPredicates.add(str -> str.length() > 4); + + List result = names.stream() + .filter(allPredicates.stream() + .reduce(x -> false, Predicate::or)) + .collect(Collectors.toList()); + + assertEquals(2, result.size()); + assertThat(result, contains("Adam", "Alexander")); + } + +} From fb210d0499052a5b18cfffa042e714b1d00227c9 Mon Sep 17 00:00:00 2001 From: FrancoCorleone Date: Tue, 18 Dec 2018 02:56:30 +0100 Subject: [PATCH 088/359] BAEL-2090 Insert With JPA * Adding inserts for JPA objects repositories * Refactor tests * Small refactor * Small refactor * Remove redundant @Repository annotation * Refactor tests * Change to simple entity manager implementation * Refactor changes --- .../dao/repositories/InsertRepository.java | 5 + .../PersonEntityManagerInsertRepository.java | 7 ++ .../PersonEntityManagerRepository.java | 10 ++ .../PersonQueryInsertRepository.java | 7 ++ .../repositories/PersonQueryRepository.java | 16 +++ ...rsonEntityManagerInsertRepositoryImpl.java | 21 ++++ .../impl/PersonQueryInsertRepositoryImpl.java | 24 +++++ .../main/java/com/baeldung/domain/Person.java | 47 ++++++++ ...PersonInsertRepositoryIntegrationTest.java | 102 ++++++++++++++++++ 9 files changed, 239 insertions(+) create mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InsertRepository.java create mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerInsertRepository.java create mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerRepository.java create mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryInsertRepository.java create mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryRepository.java create mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonEntityManagerInsertRepositoryImpl.java create mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonQueryInsertRepositoryImpl.java create mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/Person.java create mode 100644 persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/PersonInsertRepositoryIntegrationTest.java diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InsertRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InsertRepository.java new file mode 100644 index 0000000000..6a74e067fe --- /dev/null +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InsertRepository.java @@ -0,0 +1,5 @@ +package com.baeldung.dao.repositories; + +public interface InsertRepository { + void insert(S entity); +} diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerInsertRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerInsertRepository.java new file mode 100644 index 0000000000..6d3cbb07df --- /dev/null +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerInsertRepository.java @@ -0,0 +1,7 @@ +package com.baeldung.dao.repositories; + +import com.baeldung.domain.Person; + +public interface PersonEntityManagerInsertRepository { + void insert(Person person); +} diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerRepository.java new file mode 100644 index 0000000000..cbf3d59620 --- /dev/null +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerRepository.java @@ -0,0 +1,10 @@ +package com.baeldung.dao.repositories; + +import com.baeldung.domain.Person; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface PersonEntityManagerRepository extends JpaRepository, PersonEntityManagerInsertRepository { + +} diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryInsertRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryInsertRepository.java new file mode 100644 index 0000000000..be01e9883a --- /dev/null +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryInsertRepository.java @@ -0,0 +1,7 @@ +package com.baeldung.dao.repositories; + +import com.baeldung.domain.Person; + +public interface PersonQueryInsertRepository { + void insert(Person person); +} diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryRepository.java new file mode 100644 index 0000000000..1516c38443 --- /dev/null +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryRepository.java @@ -0,0 +1,16 @@ +package com.baeldung.dao.repositories; + +import com.baeldung.domain.Person; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +@Repository +public interface PersonQueryRepository extends JpaRepository, PersonQueryInsertRepository { + + @Modifying + @Query(value = "INSERT INTO person (id, first_name, last_name) VALUES (:id,:firstName,:lastName)", nativeQuery = true) + void insertWithAnnotation(@Param("id") Long id, @Param("firstName") String firstName, @Param("lastName") String lastName); +} diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonEntityManagerInsertRepositoryImpl.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonEntityManagerInsertRepositoryImpl.java new file mode 100644 index 0000000000..c14cc44125 --- /dev/null +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonEntityManagerInsertRepositoryImpl.java @@ -0,0 +1,21 @@ +package com.baeldung.dao.repositories.impl; + +import com.baeldung.dao.repositories.PersonEntityManagerInsertRepository; +import com.baeldung.domain.Person; +import org.springframework.transaction.annotation.Transactional; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + +@Transactional +public class PersonEntityManagerInsertRepositoryImpl implements PersonEntityManagerInsertRepository { + + @PersistenceContext + private EntityManager entityManager; + + @Override + public void insert(Person person) { + this.entityManager.persist(person); + } +} + diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonQueryInsertRepositoryImpl.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonQueryInsertRepositoryImpl.java new file mode 100644 index 0000000000..341db1615d --- /dev/null +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonQueryInsertRepositoryImpl.java @@ -0,0 +1,24 @@ +package com.baeldung.dao.repositories.impl; + +import com.baeldung.dao.repositories.PersonQueryInsertRepository; +import com.baeldung.domain.Person; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.transaction.Transactional; + +@Transactional +public class PersonQueryInsertRepositoryImpl implements PersonQueryInsertRepository { + + @PersistenceContext + private EntityManager entityManager; + + @Override + public void insert(Person person) { + entityManager.createNativeQuery("INSERT INTO person (id,first_name, last_name) VALUES (?,?,?)") + .setParameter(1, person.getId()) + .setParameter(2, person.getFirstName()) + .setParameter(3, person.getLastName()) + .executeUpdate(); + } +} diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/Person.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/Person.java new file mode 100644 index 0000000000..30d7370982 --- /dev/null +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/Person.java @@ -0,0 +1,47 @@ +package com.baeldung.domain; + +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class Person { + + @Id + private Long id; + private String firstName; + private String lastName; + + public Person() { + } + + public Person(Long id, String firstName, String lastName) { + this.id = id; + this.firstName = firstName; + this.lastName = lastName; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + +} diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/PersonInsertRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/PersonInsertRepositoryIntegrationTest.java new file mode 100644 index 0000000000..476554f6d6 --- /dev/null +++ b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/PersonInsertRepositoryIntegrationTest.java @@ -0,0 +1,102 @@ +package com.baeldung.dao.repositories; + +import com.baeldung.domain.Person; +import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +@RunWith(SpringRunner.class) +@DataJpaTest +public class PersonInsertRepositoryIntegrationTest { + + private static final Long ID = 1L; + private static final String FIRST_NAME = "firstname"; + private static final String LAST_NAME = "lastname"; + private static final Person PERSON = new Person(ID, FIRST_NAME, LAST_NAME); + + @Autowired + private PersonQueryRepository personQueryRepository; + + @Autowired + private PersonEntityManagerRepository personEntityManagerRepository; + + @BeforeEach + public void clearDB() { + personQueryRepository.deleteAll(); + } + + @Test + public void givenPersonEntity_whenInsertWithNativeQuery_ThenPersonIsPersisted() { + insertPerson(); + + assertPersonPersisted(); + } + + @Test + public void givenPersonEntity_whenInsertedTwiceWithNativeQuery_thenDataIntegrityViolationExceptionIsThrown() { + assertThatExceptionOfType(DataIntegrityViolationException.class).isThrownBy(() -> { + insertPerson(); + insertPerson(); + }); + } + + @Test + public void givenPersonEntity_whenInsertWithQueryAnnotation_thenPersonIsPersisted() { + insertPersonWithQueryAnnotation(); + + assertPersonPersisted(); + } + + @Test + public void givenPersonEntity_whenInsertedTwiceWithQueryAnnotation_thenDataIntegrityViolationExceptionIsThrown() { + assertThatExceptionOfType(DataIntegrityViolationException.class).isThrownBy(() -> { + insertPersonWithQueryAnnotation(); + insertPersonWithQueryAnnotation(); + }); + } + + @Test + public void givenPersonEntity_whenInsertWithEntityManager_thenPersonIsPersisted() { + insertPersonWithEntityManager(); + + assertPersonPersisted(); + } + + @Test + public void givenPersonEntity_whenInsertedTwiceWithEntityManager_thenDataIntegrityViolationExceptionIsThrown() { + assertThatExceptionOfType(DataIntegrityViolationException.class).isThrownBy(() -> { + insertPersonWithEntityManager(); + insertPersonWithEntityManager(); + }); + } + + private void insertPerson() { + personQueryRepository.insert(PERSON); + } + + private void insertPersonWithQueryAnnotation() { + personQueryRepository.insertWithAnnotation(ID, FIRST_NAME, LAST_NAME); + } + + private void insertPersonWithEntityManager() { + personEntityManagerRepository.insert(new Person(ID, FIRST_NAME, LAST_NAME)); + } + + private void assertPersonPersisted() { + Optional personOptional = personQueryRepository.findById(PERSON.getId()); + + assertThat(personOptional.isPresent()).isTrue(); + assertThat(personOptional.get().getId()).isEqualTo(PERSON.getId()); + assertThat(personOptional.get().getFirstName()).isEqualTo(PERSON.getFirstName()); + assertThat(personOptional.get().getLastName()).isEqualTo(PERSON.getLastName()); + } +} From 4ea86703d402933e097a5bfa8d26788c497cdddc Mon Sep 17 00:00:00 2001 From: Javier Date: Tue, 18 Dec 2018 05:27:49 +0100 Subject: [PATCH 089/359] BAEL-2412 Change method names to a BDD-style. --- ...Test.java => PrimitiveValuesUnitTest.java} | 58 +++++++------------ 1 file changed, 21 insertions(+), 37 deletions(-) rename gson/src/test/java/org/baeldung/gson/primitives/{UnitTest.java => PrimitiveValuesUnitTest.java} (83%) diff --git a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java b/gson/src/test/java/org/baeldung/gson/primitives/PrimitiveValuesUnitTest.java similarity index 83% rename from gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java rename to gson/src/test/java/org/baeldung/gson/primitives/PrimitiveValuesUnitTest.java index f952ae5b92..7d249bc55c 100644 --- a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java +++ b/gson/src/test/java/org/baeldung/gson/primitives/PrimitiveValuesUnitTest.java @@ -8,8 +8,8 @@ import java.lang.reflect.Type; import static junit.framework.TestCase.*; -public class UnitTest { - @Test public void toJsonAllPrimitives() { +public class PrimitiveValuesUnitTest { + @Test public void whenSerializingToJSON_thenShouldCreateJSON() { PrimitiveBundle primitiveBundle = new PrimitiveBundle(); // @formatter:off @@ -32,7 +32,8 @@ public class UnitTest { assertEquals(expected, gson.toJson(primitiveBundle)); } - @Test(expected = IllegalArgumentException.class) public void toJsonInfinity() { + @Test(expected = IllegalArgumentException.class) public void + whenSerializingInfinity_thenShouldRaiseAnException() { InfinityValuesExample model = new InfinityValuesExample(); model.negativeInfinity = Float.NEGATIVE_INFINITY; model.positiveInfinity = Float.POSITIVE_INFINITY; @@ -42,7 +43,8 @@ public class UnitTest { gson.toJson(model); } - @Test(expected = IllegalArgumentException.class) public void toJsonNaN() { + @Test(expected = IllegalArgumentException.class) public void + whenSerializingNaN_thenShouldRaiseAnException() { FloatExample model = new FloatExample(); model.value = Float.NaN; @@ -50,7 +52,7 @@ public class UnitTest { gson.toJson(model); } - @Test public void fromJsonAllPrimitives() { + @Test public void whenDeserializingFromJSON_thenShouldParseTheValueInTheString() { String json = "{\"byteValue\": 17, \"shortValue\": 3, \"intValue\": 3, " + "\"longValue\": 3, \"floatValue\": 3.5" + ", \"doubleValue\": 3.5" + ", \"booleanValue\": true, \"charValue\": \"a\"}"; @@ -70,14 +72,14 @@ public class UnitTest { // @formatter:on } - @Test public void fromJsonPrecissionMismatch() { + @Test public void whenDeserializingHighPrecissionNumberIntoFloat_thenShouldPerformRounding() { String json = "{\"value\": 12.123425589123456}"; Gson gson = new Gson(); FloatExample model = gson.fromJson(json, FloatExample.class); assertEquals(12.123426f, model.value, 0.000001); } - @Test public void fromJsonPrecissionMismatchForDouble() { + @Test public void whenDeserializingHighPrecissiongNumberIntoDouble_thenShouldPerformRounding() { String json = "{\"value\": 12.123425589123556}"; Gson gson = new Gson(); DoubleExample model = gson.fromJson(json, DoubleExample.class); @@ -85,7 +87,7 @@ public class UnitTest { } - @Test public void fromJsonOverflow() { + @Test public void whenDeserializingValueThatOverflows_thenShouldOverflowSilently() { Gson gson = new Gson(); String json = "{\"value\": \"300\"}"; ByteExample model = gson.fromJson(json, ByteExample.class); @@ -93,7 +95,7 @@ public class UnitTest { assertEquals(44, model.value); } - @Test public void fromJsonRealToByte() { + @Test public void whenDeserializingRealIntoByte_thenShouldRaiseAnException() { Gson gson = new Gson(); String json = "{\"value\": 2.3}"; try { @@ -107,7 +109,7 @@ public class UnitTest { fail(); } - @Test public void fromJsonRealToLong() { + @Test public void whenDeserializingRealIntoLong_thenShouldRaiseAnException() { Gson gson = new Gson(); String json = "{\"value\": 2.3}"; try { @@ -121,14 +123,14 @@ public class UnitTest { fail(); } - @Test public void fromJsonRealToLongEndingIn0() { + @Test public void whenDeserializingRealWhoseDecimalPartIs0_thenShouldParseItCorrectly() { Gson gson = new Gson(); String json = "{\"value\": 2.0}"; LongExample model = gson.fromJson(json, LongExample.class); assertEquals(2, model.value); } - @Test public void fromJsonUnicodeChar() { + @Test public void whenDeserializingUnicodeChar_thenShouldParseItCorrectly() { Gson gson = new Gson(); String json = "{\"value\": \"\\u00AE\"}"; CharExample model = gson.fromJson(json, CharExample.class); @@ -136,7 +138,7 @@ public class UnitTest { assertEquals('\u00AE', model.value); } - @Test public void fromJsonNull() { + @Test public void whenDeserializingNullValues_thenShouldIgnoreThoseFields() { Gson gson = new Gson(); // @formatter:off String json = "{\"byteValue\": null, \"shortValue\": null, " @@ -154,7 +156,8 @@ public class UnitTest { assertEquals(1, model.doubleValue, 0.0001); } - @Test(expected = JsonSyntaxException.class) public void fromJsonEmptyString() { + @Test(expected = JsonSyntaxException.class) public void + whenDeserializingTheEmptyString_thenShouldRaiseAnException() { Gson gson = new Gson(); // @formatter:off String json = "{\"byteValue\": \"\", \"shortValue\": \"\", " @@ -164,7 +167,7 @@ public class UnitTest { gson.fromJson(json, PrimitiveBundleInitialized.class); } - @Test public void fromJsonEmptyStringToChar() { + @Test public void whenDeserializingTheEmptyStringIntoChar_thenShouldHaveTheEmtpyChar() { Gson gson = new Gson(); // @formatter:off String json = "{\"charValue\": \"\"}"; @@ -174,7 +177,7 @@ public class UnitTest { assertEquals(Character.MIN_VALUE, model.value); } - @Test public void fromJsonValidValueWithinString() { + @Test public void whenDeserializingValidValueAppearingInAString_thenShouldParseTheValue() { Gson gson = new Gson(); // @formatter:off String json = "{\"byteValue\": \"15\", \"shortValue\": \"15\", " @@ -192,7 +195,7 @@ public class UnitTest { assertEquals(15, model.doubleValue, 0.0001); } - @Test public void fromJsonBooleanFrom2ValueInteger() { + @Test public void whenDeserializingABooleanFrom0Or1Integer_thenShouldRaiseAnException() { String json = "{\"value\": 1}"; Gson gson = new Gson(); @@ -207,7 +210,7 @@ public class UnitTest { fail(); } - @Test public void fromJsonBooleanFrom2ValueIntegerSolution() { + @Test public void whenDeserializingWithCustomDeserializerABooleanFrom0Or1Integer_thenShouldWork() { String json = "{\"value\": 1}"; GsonBuilder builder = new GsonBuilder(); builder.registerTypeAdapter(BooleanExample.class, @@ -220,25 +223,6 @@ public class UnitTest { assertTrue(model.value); } - @Test public void fromJsonBooleanFromYes() { - String json = "{\"value\": yes}"; - Gson gson = new Gson(); - - BooleanExample model = gson.fromJson(json, BooleanExample.class); - - // pay attention here that we are deserializing yes. - assertFalse(model.value); - } - - @Test public void fromJsonBooleanFromInvalidValue() { - String json = "{\"value\": \"15x\"}"; - Gson gson = new Gson(); - - BooleanExample model = gson.fromJson(json, BooleanExample.class); - - assertFalse(model.value); - } - // @formatter:off static class BooleanAs2ValueIntegerDeserializer implements JsonDeserializer { @Override public BooleanExample deserialize( From 6f8d130786ab5e0998d91ed9be8883d85358e0a6 Mon Sep 17 00:00:00 2001 From: eelhazati Date: Tue, 18 Dec 2018 12:33:49 +0100 Subject: [PATCH 090/359] Hibernate 5 bootstrap API Test. --- .../bootstrap/Hibernate5BootstrapAPITest.java | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/bootstrap/Hibernate5BootstrapAPITest.java diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/bootstrap/Hibernate5BootstrapAPITest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/bootstrap/Hibernate5BootstrapAPITest.java new file mode 100644 index 0000000000..39111f6256 --- /dev/null +++ b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/bootstrap/Hibernate5BootstrapAPITest.java @@ -0,0 +1,69 @@ +package com.baeldung.hibernate.bootstrap; + +import com.baeldung.hibernate.pojo.Movie; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.BootstrapServiceRegistry; +import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.service.ServiceRegistry; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class Hibernate5BootstrapAPITest { + + SessionFactory sessionFactory = null; + Session session = null; + + @Before + public void setUp() throws IOException { + + BootstrapServiceRegistry bootstrapRegistry = new BootstrapServiceRegistryBuilder() + .build(); + + ServiceRegistry standardRegistry = new StandardServiceRegistryBuilder(bootstrapRegistry) + // No need for hibernate.cfg.xml file, an hibernate.properties is sufficient. + //.configure() + .build(); + + MetadataSources metadataSources = new MetadataSources(standardRegistry); + metadataSources.addAnnotatedClass(Movie.class); + + Metadata metadata = metadataSources.getMetadataBuilder().build(); + + sessionFactory = metadata.buildSessionFactory(); + } + + @Test + public void testBuildSessionFactory() { + assertNotNull(sessionFactory); + session = sessionFactory.openSession(); + assertNotNull(session); + + //Persist Movie + session.getTransaction().begin(); + Movie movie = new Movie(); + movie.setId(100L); + session.persist(movie); + session.getTransaction().commit(); + + List movies = session.createQuery("FROM Movie").list(); + assertNotNull(movies); + assertEquals(movies.size(), 1L); + } + + @After + public void clean() throws IOException { + session.close(); + sessionFactory.close(); + } +} From cf56b33b9bc2890f419e529ffd37dea4ec5c38ae Mon Sep 17 00:00:00 2001 From: Steven van Beelen Date: Tue, 18 Dec 2018 14:43:32 +0100 Subject: [PATCH 091/359] BAEL-2435 Update pom file -Add description -Change parent to parent-boot-2 to leverage a spring boot start up approach -Replace core dependency for axon-spring-boot-autoconfigure excluding axon-server as we cant start that up for this use case -Add spring-boot-autoconfigure dependency -Adjust the axon version to 4.0.3 --- axon/pom.xml | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/axon/pom.xml b/axon/pom.xml index c643ea9e57..bb7839f150 100644 --- a/axon/pom.xml +++ b/axon/pom.xml @@ -4,29 +4,45 @@ 4.0.0 axon axon - + Basic Axon Framework with Spring Boot configuration tutorial + - parent-modules com.baeldung - 1.0.0-SNAPSHOT + parent-boot-2 + 0.0.1-SNAPSHOT + ../parent-boot-2 + + org.axonframework + axon-spring-boot-autoconfigure + ${axon.version} + + + org.axonframework + axon-server-connector + + + + org.axonframework axon-test ${axon.version} test + - org.axonframework - axon-core - ${axon.version} + org.springframework.boot + spring-boot-autoconfigure + 2.1.1.RELEASE + compile - 3.0.2 + 4.0.3 \ No newline at end of file From bd4881d4787cea8ee7f78309e956a7363d14c1b3 Mon Sep 17 00:00:00 2001 From: Steven van Beelen Date: Tue, 18 Dec 2018 14:47:23 +0100 Subject: [PATCH 092/359] BAEL-2435 Update Aggregate in regards to latest axon version -Replace old import statements for the new locations -Mark the aggregate as @Aggregate to make it autowired through the spring boot starter -Move all command handlers/decision making functions to the top of the file -Rename the command handler to `handle` as a best practice for command handlers -Use @EventSourcingHandler i.o. @EventHandler as a best practice for event handlers in Aggregates, as those only are used to 'source' the aggregate -Update test case according to latest standards --- .../axon/aggregates/MessagesAggregate.java | 26 ++++++++++--------- .../MessagesAggregateIntegrationTest.java | 21 +++++++-------- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/axon/src/main/java/com/baeldung/axon/aggregates/MessagesAggregate.java b/axon/src/main/java/com/baeldung/axon/aggregates/MessagesAggregate.java index e762604b74..d95dd81df9 100644 --- a/axon/src/main/java/com/baeldung/axon/aggregates/MessagesAggregate.java +++ b/axon/src/main/java/com/baeldung/axon/aggregates/MessagesAggregate.java @@ -1,16 +1,18 @@ package com.baeldung.axon.aggregates; +import static org.axonframework.modelling.command.AggregateLifecycle.apply; + +import org.axonframework.commandhandling.CommandHandler; +import org.axonframework.eventsourcing.EventSourcingHandler; +import org.axonframework.modelling.command.AggregateIdentifier; +import org.axonframework.spring.stereotype.Aggregate; + import com.baeldung.axon.commands.CreateMessageCommand; import com.baeldung.axon.commands.MarkReadMessageCommand; import com.baeldung.axon.events.MessageCreatedEvent; import com.baeldung.axon.events.MessageReadEvent; -import org.axonframework.commandhandling.CommandHandler; -import org.axonframework.commandhandling.model.AggregateIdentifier; -import org.axonframework.eventhandling.EventHandler; - -import static org.axonframework.commandhandling.model.AggregateLifecycle.apply; - +@Aggregate public class MessagesAggregate { @AggregateIdentifier @@ -24,13 +26,13 @@ public class MessagesAggregate { apply(new MessageCreatedEvent(command.getId(), command.getText())); } - @EventHandler + @CommandHandler + public void handle(MarkReadMessageCommand command) { + apply(new MessageReadEvent(id)); + } + + @EventSourcingHandler public void on(MessageCreatedEvent event) { this.id = event.getId(); } - - @CommandHandler - public void markRead(MarkReadMessageCommand command) { - apply(new MessageReadEvent(id)); - } } \ No newline at end of file diff --git a/axon/src/test/java/com/baeldung/axon/MessagesAggregateIntegrationTest.java b/axon/src/test/java/com/baeldung/axon/MessagesAggregateIntegrationTest.java index ad099d2c2b..dc008dcd78 100644 --- a/axon/src/test/java/com/baeldung/axon/MessagesAggregateIntegrationTest.java +++ b/axon/src/test/java/com/baeldung/axon/MessagesAggregateIntegrationTest.java @@ -1,29 +1,28 @@ package com.baeldung.axon; +import java.util.UUID; + +import org.axonframework.test.aggregate.AggregateTestFixture; +import org.axonframework.test.aggregate.FixtureConfiguration; +import org.junit.*; + import com.baeldung.axon.aggregates.MessagesAggregate; import com.baeldung.axon.commands.CreateMessageCommand; import com.baeldung.axon.commands.MarkReadMessageCommand; import com.baeldung.axon.events.MessageCreatedEvent; import com.baeldung.axon.events.MessageReadEvent; -import org.axonframework.test.aggregate.AggregateTestFixture; -import org.axonframework.test.aggregate.FixtureConfiguration; -import org.junit.Before; -import org.junit.Test; - -import java.util.UUID; public class MessagesAggregateIntegrationTest { private FixtureConfiguration fixture; @Before - public void setUp() throws Exception { - fixture = new AggregateTestFixture(MessagesAggregate.class); - + public void setUp() { + fixture = new AggregateTestFixture<>(MessagesAggregate.class); } @Test - public void giveAggregateRoot_whenCreateMessageCommand_thenShouldProduceMessageCreatedEvent() throws Exception { + public void giveAggregateRoot_whenCreateMessageCommand_thenShouldProduceMessageCreatedEvent() { String eventText = "Hello, how is your day?"; String id = UUID.randomUUID().toString(); fixture.given() @@ -32,7 +31,7 @@ public class MessagesAggregateIntegrationTest { } @Test - public void givenMessageCreatedEvent_whenReadMessageCommand_thenShouldProduceMessageReadEvent() throws Exception { + public void givenMessageCreatedEvent_whenReadMessageCommand_thenShouldProduceMessageReadEvent() { String id = UUID.randomUUID().toString(); fixture.given(new MessageCreatedEvent(id, "Hello :-)")) From 11b1112771d6327560debdf0c06306103c5bf7ac Mon Sep 17 00:00:00 2001 From: Steven van Beelen Date: Tue, 18 Dec 2018 14:48:10 +0100 Subject: [PATCH 093/359] BAEL-2435 Update the event handler Change the event handler to become a spring service, as this way Axon will automatically pick it up as an event handling component --- .../baeldung/axon/eventhandlers/MessagesEventHandler.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/axon/src/main/java/com/baeldung/axon/eventhandlers/MessagesEventHandler.java b/axon/src/main/java/com/baeldung/axon/eventhandlers/MessagesEventHandler.java index 3e51e19c4e..d7ac115a16 100644 --- a/axon/src/main/java/com/baeldung/axon/eventhandlers/MessagesEventHandler.java +++ b/axon/src/main/java/com/baeldung/axon/eventhandlers/MessagesEventHandler.java @@ -1,10 +1,12 @@ package com.baeldung.axon.eventhandlers; -import com.baeldung.axon.events.MessageReadEvent; -import com.baeldung.axon.events.MessageCreatedEvent; import org.axonframework.eventhandling.EventHandler; +import org.springframework.stereotype.Service; +import com.baeldung.axon.events.MessageCreatedEvent; +import com.baeldung.axon.events.MessageReadEvent; +@Service public class MessagesEventHandler { @EventHandler From 3553fb750685f94af4f8dbdeaffb0a140497556a Mon Sep 17 00:00:00 2001 From: Steven van Beelen Date: Tue, 18 Dec 2018 14:49:30 +0100 Subject: [PATCH 094/359] BAEL-2435 Update commands and events -Change TargetAggregateIdentifier import statement to the new location -Add equals/hashcode as best practice for commands and events -Add description -Change parent to parent-boot-2 to leverage a spring boot start up approach --- .../axon/commands/CreateMessageCommand.java | 28 +++++++++++++++---- .../axon/commands/MarkReadMessageCommand.java | 26 ++++++++++++++--- .../axon/events/MessageCreatedEvent.java | 27 +++++++++++++++--- .../axon/events/MessageReadEvent.java | 25 +++++++++++++++-- 4 files changed, 90 insertions(+), 16 deletions(-) diff --git a/axon/src/main/java/com/baeldung/axon/commands/CreateMessageCommand.java b/axon/src/main/java/com/baeldung/axon/commands/CreateMessageCommand.java index d0651bf12e..70d2e46480 100644 --- a/axon/src/main/java/com/baeldung/axon/commands/CreateMessageCommand.java +++ b/axon/src/main/java/com/baeldung/axon/commands/CreateMessageCommand.java @@ -1,24 +1,42 @@ package com.baeldung.axon.commands; +import java.util.Objects; -import org.axonframework.commandhandling.TargetAggregateIdentifier; +import org.axonframework.modelling.command.TargetAggregateIdentifier; public class CreateMessageCommand { - + @TargetAggregateIdentifier private final String id; private final String text; - + public CreateMessageCommand(String id, String text) { this.id = id; this.text = text; } - + public String getId() { return id; } - + public String getText() { return text; } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + CreateMessageCommand that = (CreateMessageCommand) o; + return Objects.equals(id, that.id) && Objects.equals(text, that.text); + } + + @Override + public int hashCode() { + return Objects.hash(id, text); + } } \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/commands/MarkReadMessageCommand.java b/axon/src/main/java/com/baeldung/axon/commands/MarkReadMessageCommand.java index e66582d9ec..f7d911d65b 100644 --- a/axon/src/main/java/com/baeldung/axon/commands/MarkReadMessageCommand.java +++ b/axon/src/main/java/com/baeldung/axon/commands/MarkReadMessageCommand.java @@ -1,18 +1,36 @@ package com.baeldung.axon.commands; +import java.util.Objects; -import org.axonframework.commandhandling.TargetAggregateIdentifier; +import org.axonframework.modelling.command.TargetAggregateIdentifier; public class MarkReadMessageCommand { - + @TargetAggregateIdentifier private final String id; - + public MarkReadMessageCommand(String id) { this.id = id; } - + public String getId() { return id; } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + MarkReadMessageCommand that = (MarkReadMessageCommand) o; + return Objects.equals(id, that.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } } \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/events/MessageCreatedEvent.java b/axon/src/main/java/com/baeldung/axon/events/MessageCreatedEvent.java index 3c9aac5ed8..e638a2a94d 100644 --- a/axon/src/main/java/com/baeldung/axon/events/MessageCreatedEvent.java +++ b/axon/src/main/java/com/baeldung/axon/events/MessageCreatedEvent.java @@ -1,20 +1,39 @@ package com.baeldung.axon.events; +import java.util.Objects; + public class MessageCreatedEvent { - + private final String id; private final String text; - + public MessageCreatedEvent(String id, String text) { this.id = id; this.text = text; } - + public String getId() { return id; } - + public String getText() { return text; } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + MessageCreatedEvent that = (MessageCreatedEvent) o; + return Objects.equals(id, that.id) && Objects.equals(text, that.text); + } + + @Override + public int hashCode() { + return Objects.hash(id, text); + } } \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/events/MessageReadEvent.java b/axon/src/main/java/com/baeldung/axon/events/MessageReadEvent.java index 57bfc8e19e..e362599bb3 100644 --- a/axon/src/main/java/com/baeldung/axon/events/MessageReadEvent.java +++ b/axon/src/main/java/com/baeldung/axon/events/MessageReadEvent.java @@ -1,14 +1,33 @@ package com.baeldung.axon.events; +import java.util.Objects; + public class MessageReadEvent { - + private final String id; - + public MessageReadEvent(String id) { this.id = id; } - + public String getId() { return id; } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + MessageReadEvent that = (MessageReadEvent) o; + return Objects.equals(id, that.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } } \ No newline at end of file From 3e3210a8038b4c9453d1958714119243d0c732d3 Mon Sep 17 00:00:00 2001 From: Steven van Beelen Date: Tue, 18 Dec 2018 14:52:54 +0100 Subject: [PATCH 095/359] BAEL-2435 Change aggregate package -Change aggregate package to commandmodel package per best practice -Move the aggregate test to the same package for the test directory --- .../axon/{aggregates => commandmodel}/MessagesAggregate.java | 2 +- .../{ => commandmodel}/MessagesAggregateIntegrationTest.java | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) rename axon/src/main/java/com/baeldung/axon/{aggregates => commandmodel}/MessagesAggregate.java (96%) rename axon/src/test/java/com/baeldung/axon/{ => commandmodel}/MessagesAggregateIntegrationTest.java (94%) diff --git a/axon/src/main/java/com/baeldung/axon/aggregates/MessagesAggregate.java b/axon/src/main/java/com/baeldung/axon/commandmodel/MessagesAggregate.java similarity index 96% rename from axon/src/main/java/com/baeldung/axon/aggregates/MessagesAggregate.java rename to axon/src/main/java/com/baeldung/axon/commandmodel/MessagesAggregate.java index d95dd81df9..b2c3a0a0b6 100644 --- a/axon/src/main/java/com/baeldung/axon/aggregates/MessagesAggregate.java +++ b/axon/src/main/java/com/baeldung/axon/commandmodel/MessagesAggregate.java @@ -1,4 +1,4 @@ -package com.baeldung.axon.aggregates; +package com.baeldung.axon.commandmodel; import static org.axonframework.modelling.command.AggregateLifecycle.apply; diff --git a/axon/src/test/java/com/baeldung/axon/MessagesAggregateIntegrationTest.java b/axon/src/test/java/com/baeldung/axon/commandmodel/MessagesAggregateIntegrationTest.java similarity index 94% rename from axon/src/test/java/com/baeldung/axon/MessagesAggregateIntegrationTest.java rename to axon/src/test/java/com/baeldung/axon/commandmodel/MessagesAggregateIntegrationTest.java index dc008dcd78..96bb2cf3b7 100644 --- a/axon/src/test/java/com/baeldung/axon/MessagesAggregateIntegrationTest.java +++ b/axon/src/test/java/com/baeldung/axon/commandmodel/MessagesAggregateIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.axon; +package com.baeldung.axon.commandmodel; import java.util.UUID; @@ -6,7 +6,6 @@ import org.axonframework.test.aggregate.AggregateTestFixture; import org.axonframework.test.aggregate.FixtureConfiguration; import org.junit.*; -import com.baeldung.axon.aggregates.MessagesAggregate; import com.baeldung.axon.commands.CreateMessageCommand; import com.baeldung.axon.commands.MarkReadMessageCommand; import com.baeldung.axon.events.MessageCreatedEvent; From 00b297a4d0a21282d13b7c7a41544aa56b782b59 Mon Sep 17 00:00:00 2001 From: Steven van Beelen Date: Tue, 18 Dec 2018 14:53:43 +0100 Subject: [PATCH 096/359] BAEL-2435 Rename aggregate test Rename aggregate test from MessagesAggregateIntegrationTest to MessagesAggregateTest, as it's not an integration test but a regular unit test --- ...AggregateIntegrationTest.java => MessagesAggregateTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename axon/src/test/java/com/baeldung/axon/commandmodel/{MessagesAggregateIntegrationTest.java => MessagesAggregateTest.java} (96%) diff --git a/axon/src/test/java/com/baeldung/axon/commandmodel/MessagesAggregateIntegrationTest.java b/axon/src/test/java/com/baeldung/axon/commandmodel/MessagesAggregateTest.java similarity index 96% rename from axon/src/test/java/com/baeldung/axon/commandmodel/MessagesAggregateIntegrationTest.java rename to axon/src/test/java/com/baeldung/axon/commandmodel/MessagesAggregateTest.java index 96bb2cf3b7..30914e3fd3 100644 --- a/axon/src/test/java/com/baeldung/axon/commandmodel/MessagesAggregateIntegrationTest.java +++ b/axon/src/test/java/com/baeldung/axon/commandmodel/MessagesAggregateTest.java @@ -11,7 +11,7 @@ import com.baeldung.axon.commands.MarkReadMessageCommand; import com.baeldung.axon.events.MessageCreatedEvent; import com.baeldung.axon.events.MessageReadEvent; -public class MessagesAggregateIntegrationTest { +public class MessagesAggregateTest { private FixtureConfiguration fixture; From aaf2ef22276bc1b3f0bc64f3acbf0d3582afb9c9 Mon Sep 17 00:00:00 2001 From: Steven van Beelen Date: Tue, 18 Dec 2018 14:54:07 +0100 Subject: [PATCH 097/359] BAEL-2435 Change eventhandlers package Change eventhandlers package to querymodel package per best practices --- .../{eventhandlers => querymodel}/MessagesEventHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename axon/src/main/java/com/baeldung/axon/{eventhandlers => querymodel}/MessagesEventHandler.java (93%) diff --git a/axon/src/main/java/com/baeldung/axon/eventhandlers/MessagesEventHandler.java b/axon/src/main/java/com/baeldung/axon/querymodel/MessagesEventHandler.java similarity index 93% rename from axon/src/main/java/com/baeldung/axon/eventhandlers/MessagesEventHandler.java rename to axon/src/main/java/com/baeldung/axon/querymodel/MessagesEventHandler.java index d7ac115a16..d93fe03941 100644 --- a/axon/src/main/java/com/baeldung/axon/eventhandlers/MessagesEventHandler.java +++ b/axon/src/main/java/com/baeldung/axon/querymodel/MessagesEventHandler.java @@ -1,4 +1,4 @@ -package com.baeldung.axon.eventhandlers; +package com.baeldung.axon.querymodel; import org.axonframework.eventhandling.EventHandler; import org.springframework.stereotype.Service; From 96945027a14e5bf1a9b72ddfac7e38e1c170af74 Mon Sep 17 00:00:00 2001 From: Steven van Beelen Date: Tue, 18 Dec 2018 14:55:28 +0100 Subject: [PATCH 098/359] BAEL-2435 Change command message package Change the package of the command messages to coreapi.commands to signal that the commands are part of the API you'd share with the outside --- .../com/baeldung/axon/commandmodel/MessagesAggregate.java | 4 ++-- .../axon/{ => coreapi}/commands/CreateMessageCommand.java | 2 +- .../axon/{ => coreapi}/commands/MarkReadMessageCommand.java | 2 +- .../com/baeldung/axon/commandmodel/MessagesAggregateTest.java | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) rename axon/src/main/java/com/baeldung/axon/{ => coreapi}/commands/CreateMessageCommand.java (95%) rename axon/src/main/java/com/baeldung/axon/{ => coreapi}/commands/MarkReadMessageCommand.java (94%) diff --git a/axon/src/main/java/com/baeldung/axon/commandmodel/MessagesAggregate.java b/axon/src/main/java/com/baeldung/axon/commandmodel/MessagesAggregate.java index b2c3a0a0b6..60b5c7c94e 100644 --- a/axon/src/main/java/com/baeldung/axon/commandmodel/MessagesAggregate.java +++ b/axon/src/main/java/com/baeldung/axon/commandmodel/MessagesAggregate.java @@ -7,8 +7,8 @@ import org.axonframework.eventsourcing.EventSourcingHandler; import org.axonframework.modelling.command.AggregateIdentifier; import org.axonframework.spring.stereotype.Aggregate; -import com.baeldung.axon.commands.CreateMessageCommand; -import com.baeldung.axon.commands.MarkReadMessageCommand; +import com.baeldung.axon.coreapi.commands.CreateMessageCommand; +import com.baeldung.axon.coreapi.commands.MarkReadMessageCommand; import com.baeldung.axon.events.MessageCreatedEvent; import com.baeldung.axon.events.MessageReadEvent; diff --git a/axon/src/main/java/com/baeldung/axon/commands/CreateMessageCommand.java b/axon/src/main/java/com/baeldung/axon/coreapi/commands/CreateMessageCommand.java similarity index 95% rename from axon/src/main/java/com/baeldung/axon/commands/CreateMessageCommand.java rename to axon/src/main/java/com/baeldung/axon/coreapi/commands/CreateMessageCommand.java index 70d2e46480..fd03d6b269 100644 --- a/axon/src/main/java/com/baeldung/axon/commands/CreateMessageCommand.java +++ b/axon/src/main/java/com/baeldung/axon/coreapi/commands/CreateMessageCommand.java @@ -1,4 +1,4 @@ -package com.baeldung.axon.commands; +package com.baeldung.axon.coreapi.commands; import java.util.Objects; diff --git a/axon/src/main/java/com/baeldung/axon/commands/MarkReadMessageCommand.java b/axon/src/main/java/com/baeldung/axon/coreapi/commands/MarkReadMessageCommand.java similarity index 94% rename from axon/src/main/java/com/baeldung/axon/commands/MarkReadMessageCommand.java rename to axon/src/main/java/com/baeldung/axon/coreapi/commands/MarkReadMessageCommand.java index f7d911d65b..ec68a380f8 100644 --- a/axon/src/main/java/com/baeldung/axon/commands/MarkReadMessageCommand.java +++ b/axon/src/main/java/com/baeldung/axon/coreapi/commands/MarkReadMessageCommand.java @@ -1,4 +1,4 @@ -package com.baeldung.axon.commands; +package com.baeldung.axon.coreapi.commands; import java.util.Objects; diff --git a/axon/src/test/java/com/baeldung/axon/commandmodel/MessagesAggregateTest.java b/axon/src/test/java/com/baeldung/axon/commandmodel/MessagesAggregateTest.java index 30914e3fd3..3bb7fdc9a2 100644 --- a/axon/src/test/java/com/baeldung/axon/commandmodel/MessagesAggregateTest.java +++ b/axon/src/test/java/com/baeldung/axon/commandmodel/MessagesAggregateTest.java @@ -6,8 +6,8 @@ import org.axonframework.test.aggregate.AggregateTestFixture; import org.axonframework.test.aggregate.FixtureConfiguration; import org.junit.*; -import com.baeldung.axon.commands.CreateMessageCommand; -import com.baeldung.axon.commands.MarkReadMessageCommand; +import com.baeldung.axon.coreapi.commands.CreateMessageCommand; +import com.baeldung.axon.coreapi.commands.MarkReadMessageCommand; import com.baeldung.axon.events.MessageCreatedEvent; import com.baeldung.axon.events.MessageReadEvent; From 2b07c0364d5f7cd1e4d8f178bd99c968e89324c2 Mon Sep 17 00:00:00 2001 From: Steven van Beelen Date: Tue, 18 Dec 2018 14:56:23 +0100 Subject: [PATCH 099/359] BAEL-2435 Change event message package Change the package of the event messages to coreapi.events to signal that the events are part of the API you'd share with the outside --- .../com/baeldung/axon/commandmodel/MessagesAggregate.java | 4 ++-- .../axon/{ => coreapi}/events/MessageCreatedEvent.java | 2 +- .../baeldung/axon/{ => coreapi}/events/MessageReadEvent.java | 2 +- .../com/baeldung/axon/querymodel/MessagesEventHandler.java | 4 ++-- .../com/baeldung/axon/commandmodel/MessagesAggregateTest.java | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) rename axon/src/main/java/com/baeldung/axon/{ => coreapi}/events/MessageCreatedEvent.java (94%) rename axon/src/main/java/com/baeldung/axon/{ => coreapi}/events/MessageReadEvent.java (93%) diff --git a/axon/src/main/java/com/baeldung/axon/commandmodel/MessagesAggregate.java b/axon/src/main/java/com/baeldung/axon/commandmodel/MessagesAggregate.java index 60b5c7c94e..1ab9501617 100644 --- a/axon/src/main/java/com/baeldung/axon/commandmodel/MessagesAggregate.java +++ b/axon/src/main/java/com/baeldung/axon/commandmodel/MessagesAggregate.java @@ -9,8 +9,8 @@ import org.axonframework.spring.stereotype.Aggregate; import com.baeldung.axon.coreapi.commands.CreateMessageCommand; import com.baeldung.axon.coreapi.commands.MarkReadMessageCommand; -import com.baeldung.axon.events.MessageCreatedEvent; -import com.baeldung.axon.events.MessageReadEvent; +import com.baeldung.axon.coreapi.events.MessageCreatedEvent; +import com.baeldung.axon.coreapi.events.MessageReadEvent; @Aggregate public class MessagesAggregate { diff --git a/axon/src/main/java/com/baeldung/axon/events/MessageCreatedEvent.java b/axon/src/main/java/com/baeldung/axon/coreapi/events/MessageCreatedEvent.java similarity index 94% rename from axon/src/main/java/com/baeldung/axon/events/MessageCreatedEvent.java rename to axon/src/main/java/com/baeldung/axon/coreapi/events/MessageCreatedEvent.java index e638a2a94d..debf383771 100644 --- a/axon/src/main/java/com/baeldung/axon/events/MessageCreatedEvent.java +++ b/axon/src/main/java/com/baeldung/axon/coreapi/events/MessageCreatedEvent.java @@ -1,4 +1,4 @@ -package com.baeldung.axon.events; +package com.baeldung.axon.coreapi.events; import java.util.Objects; diff --git a/axon/src/main/java/com/baeldung/axon/events/MessageReadEvent.java b/axon/src/main/java/com/baeldung/axon/coreapi/events/MessageReadEvent.java similarity index 93% rename from axon/src/main/java/com/baeldung/axon/events/MessageReadEvent.java rename to axon/src/main/java/com/baeldung/axon/coreapi/events/MessageReadEvent.java index e362599bb3..f90bfb054e 100644 --- a/axon/src/main/java/com/baeldung/axon/events/MessageReadEvent.java +++ b/axon/src/main/java/com/baeldung/axon/coreapi/events/MessageReadEvent.java @@ -1,4 +1,4 @@ -package com.baeldung.axon.events; +package com.baeldung.axon.coreapi.events; import java.util.Objects; diff --git a/axon/src/main/java/com/baeldung/axon/querymodel/MessagesEventHandler.java b/axon/src/main/java/com/baeldung/axon/querymodel/MessagesEventHandler.java index d93fe03941..6988d40a53 100644 --- a/axon/src/main/java/com/baeldung/axon/querymodel/MessagesEventHandler.java +++ b/axon/src/main/java/com/baeldung/axon/querymodel/MessagesEventHandler.java @@ -3,8 +3,8 @@ package com.baeldung.axon.querymodel; import org.axonframework.eventhandling.EventHandler; import org.springframework.stereotype.Service; -import com.baeldung.axon.events.MessageCreatedEvent; -import com.baeldung.axon.events.MessageReadEvent; +import com.baeldung.axon.coreapi.events.MessageCreatedEvent; +import com.baeldung.axon.coreapi.events.MessageReadEvent; @Service public class MessagesEventHandler { diff --git a/axon/src/test/java/com/baeldung/axon/commandmodel/MessagesAggregateTest.java b/axon/src/test/java/com/baeldung/axon/commandmodel/MessagesAggregateTest.java index 3bb7fdc9a2..1a95726c83 100644 --- a/axon/src/test/java/com/baeldung/axon/commandmodel/MessagesAggregateTest.java +++ b/axon/src/test/java/com/baeldung/axon/commandmodel/MessagesAggregateTest.java @@ -8,8 +8,8 @@ import org.junit.*; import com.baeldung.axon.coreapi.commands.CreateMessageCommand; import com.baeldung.axon.coreapi.commands.MarkReadMessageCommand; -import com.baeldung.axon.events.MessageCreatedEvent; -import com.baeldung.axon.events.MessageReadEvent; +import com.baeldung.axon.coreapi.events.MessageCreatedEvent; +import com.baeldung.axon.coreapi.events.MessageReadEvent; public class MessagesAggregateTest { From e731b95ffbb596d3674bd3e6de724e35dcf4a7df Mon Sep 17 00:00:00 2001 From: Steven van Beelen Date: Tue, 18 Dec 2018 15:01:29 +0100 Subject: [PATCH 100/359] BAEL-2435 Rename unit test class Rename unit test class to actual contain 'UnitTest' per the defined standards --- ...essagesAggregateTest.java => MessagesAggregateUnitTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename axon/src/test/java/com/baeldung/axon/commandmodel/{MessagesAggregateTest.java => MessagesAggregateUnitTest.java} (97%) diff --git a/axon/src/test/java/com/baeldung/axon/commandmodel/MessagesAggregateTest.java b/axon/src/test/java/com/baeldung/axon/commandmodel/MessagesAggregateUnitTest.java similarity index 97% rename from axon/src/test/java/com/baeldung/axon/commandmodel/MessagesAggregateTest.java rename to axon/src/test/java/com/baeldung/axon/commandmodel/MessagesAggregateUnitTest.java index 1a95726c83..46357ddff8 100644 --- a/axon/src/test/java/com/baeldung/axon/commandmodel/MessagesAggregateTest.java +++ b/axon/src/test/java/com/baeldung/axon/commandmodel/MessagesAggregateUnitTest.java @@ -11,7 +11,7 @@ import com.baeldung.axon.coreapi.commands.MarkReadMessageCommand; import com.baeldung.axon.coreapi.events.MessageCreatedEvent; import com.baeldung.axon.coreapi.events.MessageReadEvent; -public class MessagesAggregateTest { +public class MessagesAggregateUnitTest { private FixtureConfiguration fixture; From fe30c44889111ccaa94b4e69d49fc800b21c5d90 Mon Sep 17 00:00:00 2001 From: Steven van Beelen Date: Tue, 18 Dec 2018 15:15:23 +0100 Subject: [PATCH 101/359] BAEL-2435 Add a GUI -Add spring-boot-starter-web to support rest endpoints -Add a rest endpoint to spoof some form of UI to publish a message, as the old main will no longer publish the commands upon start up --- axon/pom.xml | 5 ++++ .../axon/gui/MessagesRestEndpoint.java | 28 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 axon/src/main/java/com/baeldung/axon/gui/MessagesRestEndpoint.java diff --git a/axon/pom.xml b/axon/pom.xml index bb7839f150..639c50d70b 100644 --- a/axon/pom.xml +++ b/axon/pom.xml @@ -39,6 +39,11 @@ 2.1.1.RELEASE compile + + + org.springframework.boot + spring-boot-starter-web + diff --git a/axon/src/main/java/com/baeldung/axon/gui/MessagesRestEndpoint.java b/axon/src/main/java/com/baeldung/axon/gui/MessagesRestEndpoint.java new file mode 100644 index 0000000000..ddbc3e2fc5 --- /dev/null +++ b/axon/src/main/java/com/baeldung/axon/gui/MessagesRestEndpoint.java @@ -0,0 +1,28 @@ +package com.baeldung.axon.gui; + +import java.util.UUID; + +import org.axonframework.commandhandling.gateway.CommandGateway; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.axon.coreapi.commands.CreateMessageCommand; +import com.baeldung.axon.coreapi.commands.MarkReadMessageCommand; + +@RestController +public class MessagesRestEndpoint { + + private final CommandGateway commandGateway; + + public MessagesRestEndpoint(CommandGateway commandGateway) { + this.commandGateway = commandGateway; + } + + @PostMapping("/hello") + public void publishMessages() { + final String itemId = UUID.randomUUID().toString(); + commandGateway.send(new CreateMessageCommand(itemId, "Hello, how is your day? :-)")); + commandGateway.send(new MarkReadMessageCommand(itemId)); + } + +} From d8ef050867fbf473260f51509ed775a719737879 Mon Sep 17 00:00:00 2001 From: Steven van Beelen Date: Tue, 18 Dec 2018 15:16:31 +0100 Subject: [PATCH 102/359] BAEL-2435 Add JPA and H2 dependencies Add JPA and H2 dependencies to allow event sourcing, as for event sourcing and EventStore is mandatory, and to make an EventStore a database needs to be present for Axon's auto-configuration --- axon/pom.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/axon/pom.xml b/axon/pom.xml index 639c50d70b..03d2499a99 100644 --- a/axon/pom.xml +++ b/axon/pom.xml @@ -44,6 +44,17 @@ org.springframework.boot spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + com.h2database + h2 + runtime + From 557ce655522559c849e4a02cdd54955872d700c5 Mon Sep 17 00:00:00 2001 From: Steven van Beelen Date: Tue, 18 Dec 2018 15:17:16 +0100 Subject: [PATCH 103/359] BAEL-2435 Update main application Update the MessagesRunner to be a spring boot application --- .../com/baeldung/axon/MessagesRunner.java | 51 ++----------------- 1 file changed, 5 insertions(+), 46 deletions(-) diff --git a/axon/src/main/java/com/baeldung/axon/MessagesRunner.java b/axon/src/main/java/com/baeldung/axon/MessagesRunner.java index 77b50d09bd..4f83dd86f0 100644 --- a/axon/src/main/java/com/baeldung/axon/MessagesRunner.java +++ b/axon/src/main/java/com/baeldung/axon/MessagesRunner.java @@ -1,54 +1,13 @@ package com.baeldung.axon; -import com.baeldung.axon.aggregates.MessagesAggregate; -import com.baeldung.axon.commands.CreateMessageCommand; -import com.baeldung.axon.commands.MarkReadMessageCommand; -import com.baeldung.axon.eventhandlers.MessagesEventHandler; -import org.axonframework.commandhandling.AggregateAnnotationCommandHandler; -import org.axonframework.commandhandling.CommandBus; -import org.axonframework.commandhandling.SimpleCommandBus; -import org.axonframework.commandhandling.gateway.CommandGateway; -import org.axonframework.commandhandling.gateway.DefaultCommandGateway; -import org.axonframework.eventhandling.AnnotationEventListenerAdapter; -import org.axonframework.eventsourcing.EventSourcingRepository; -import org.axonframework.eventsourcing.eventstore.EmbeddedEventStore; -import org.axonframework.eventsourcing.eventstore.EventStore; -import org.axonframework.eventsourcing.eventstore.inmemory.InMemoryEventStorageEngine; - -import java.util.UUID; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +@SpringBootApplication public class MessagesRunner { public static void main(String[] args) { - CommandBus commandBus = new SimpleCommandBus(); - - CommandGateway commandGateway = new DefaultCommandGateway(commandBus); - - EventStore eventStore = new EmbeddedEventStore(new InMemoryEventStorageEngine()); - - EventSourcingRepository repository = - new EventSourcingRepository<>(MessagesAggregate.class, eventStore); - - - AggregateAnnotationCommandHandler messagesAggregateAggregateAnnotationCommandHandler = - new AggregateAnnotationCommandHandler(MessagesAggregate.class, repository); - messagesAggregateAggregateAnnotationCommandHandler.subscribe(commandBus); - - final AnnotationEventListenerAdapter annotationEventListenerAdapter = - new AnnotationEventListenerAdapter(new MessagesEventHandler()); - eventStore.subscribe(eventMessages -> eventMessages.forEach(e -> { - try { - annotationEventListenerAdapter.handle(e); - } catch (Exception e1) { - throw new RuntimeException(e1); - - } - } - - )); - - final String itemId = UUID.randomUUID().toString(); - commandGateway.send(new CreateMessageCommand(itemId, "Hello, how is your day? :-)")); - commandGateway.send(new MarkReadMessageCommand(itemId)); + SpringApplication.run(MessagesRunner.class, args); } + } \ No newline at end of file From a9f853b24153cd41e137801147b434247cfa8633 Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Tue, 18 Dec 2018 23:02:40 +0200 Subject: [PATCH 104/359] BAEL-10335 - repo cleanup work --- jib/pom.xml | 14 +- metrics/pom.xml | 45 ++---- .../metrics/micrometer/MicrometerApp.java | 3 +- .../spring-data-gemfire/pom.xml | 12 +- .../spring-data-mongodb/pom.xml | 15 +- .../etl/customer-mongodb-sink/pom.xml | 16 +-- .../etl/customer-transform/pom.xml | 18 ++- spring-cloud/spring-cloud-vault/pom.xml | 132 ++++++++---------- spring-mobile/pom.xml | 16 --- spring-reactor/pom.xml | 19 --- spring-security-stormpath/pom.xml | 8 -- spring-sleuth/pom.xml | 17 +-- spring-webflux-amqp/pom.xml | 19 --- 13 files changed, 95 insertions(+), 239 deletions(-) diff --git a/jib/pom.xml b/jib/pom.xml index e71250f157..ad4011c3c4 100644 --- a/jib/pom.xml +++ b/jib/pom.xml @@ -1,5 +1,5 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 jib 0.1-SNAPSHOT @@ -42,16 +42,4 @@ - - - spring-releases - https://repo.spring.io/libs-release - - - - - spring-releases - https://repo.spring.io/libs-release - - diff --git a/metrics/pom.xml b/metrics/pom.xml index 79d340aa49..d7d7a8a911 100644 --- a/metrics/pom.xml +++ b/metrics/pom.xml @@ -3,8 +3,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 metrics - metrics - + metrics + parent-modules com.baeldung @@ -66,7 +66,7 @@ org.springframework.boot spring-boot-starter-web - ${spring.boot.ver} + 2.0.7.RELEASE @@ -85,44 +85,21 @@ spectator-api ${spectator-api.version} - - - org.assertj - assertj-core - test - - + + + org.assertj + assertj-core + 3.11.1 + test + + - - - - org.springframework.boot - spring-boot-dependencies - pom - import - ${spring.boot.ver} - - - - - - - spring-milestones - Spring Milestones - https://repo.spring.io/libs-milestone - - false - - - - 3.1.2 3.1.0 0.12.17 0.12.0.RELEASE - 2.0.0.M5 2.9.1 0.57.1 diff --git a/metrics/src/main/java/com/baeldung/metrics/micrometer/MicrometerApp.java b/metrics/src/main/java/com/baeldung/metrics/micrometer/MicrometerApp.java index cf818f6600..1d738085ce 100644 --- a/metrics/src/main/java/com/baeldung/metrics/micrometer/MicrometerApp.java +++ b/metrics/src/main/java/com/baeldung/metrics/micrometer/MicrometerApp.java @@ -1,10 +1,11 @@ package com.baeldung.metrics.micrometer; -import io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; +import io.micrometer.core.instrument.binder.JvmThreadMetrics; + @SpringBootApplication public class MicrometerApp { diff --git a/persistence-modules/spring-data-gemfire/pom.xml b/persistence-modules/spring-data-gemfire/pom.xml index 292b7387ac..dbb869acf0 100644 --- a/persistence-modules/spring-data-gemfire/pom.xml +++ b/persistence-modules/spring-data-gemfire/pom.xml @@ -2,10 +2,8 @@ 4.0.0 - com.baeldung spring-data-gemfire - 1.0.0-SNAPSHOT - spring-data-gemfire + spring-data-gemfire jar @@ -54,14 +52,6 @@ - - spring-snapshots - Spring Snapshots - http://repo.spring.io/libs-snapshot - - true - - gemstone http://dist.gemstone.com.s3.amazonaws.com/maven/release/ diff --git a/persistence-modules/spring-data-mongodb/pom.xml b/persistence-modules/spring-data-mongodb/pom.xml index 76ec5a96a6..63b9c3c1b0 100644 --- a/persistence-modules/spring-data-mongodb/pom.xml +++ b/persistence-modules/spring-data-mongodb/pom.xml @@ -1,9 +1,7 @@ 4.0.0 - com.baeldung spring-data-mongodb - 0.0.1-SNAPSHOT spring-data-mongodb @@ -23,7 +21,7 @@ org.springframework.data spring-data-releasetrain - Lovelace-M3 + Lovelace-SR3 pom import @@ -76,17 +74,6 @@ - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - - diff --git a/spring-cloud-data-flow/etl/customer-mongodb-sink/pom.xml b/spring-cloud-data-flow/etl/customer-mongodb-sink/pom.xml index 392244dc84..1f16a02a98 100644 --- a/spring-cloud-data-flow/etl/customer-mongodb-sink/pom.xml +++ b/spring-cloud-data-flow/etl/customer-mongodb-sink/pom.xml @@ -1,6 +1,5 @@ - 4.0.0 @@ -17,13 +16,6 @@ ../../../parent-boot-2 - - UTF-8 - UTF-8 - 1.8 - Greenwich.M3 - - org.springframework.cloud @@ -81,5 +73,11 @@ + + UTF-8 + UTF-8 + 1.8 + Greenwich.M3 + diff --git a/spring-cloud-data-flow/etl/customer-transform/pom.xml b/spring-cloud-data-flow/etl/customer-transform/pom.xml index 0e429cb593..ed281b420a 100644 --- a/spring-cloud-data-flow/etl/customer-transform/pom.xml +++ b/spring-cloud-data-flow/etl/customer-transform/pom.xml @@ -1,11 +1,9 @@ - 4.0.0 customer-transform - 0.0.1-SNAPSHOT jar customer-transform @@ -18,13 +16,6 @@ ../../../parent-boot-2 - - UTF-8 - UTF-8 - 1.8 - Greenwich.M3 - - org.springframework.cloud @@ -74,4 +65,11 @@ + + UTF-8 + UTF-8 + 1.8 + Greenwich.M3 + + diff --git a/spring-cloud/spring-cloud-vault/pom.xml b/spring-cloud/spring-cloud-vault/pom.xml index 3a7198ecc3..363de6e107 100644 --- a/spring-cloud/spring-cloud-vault/pom.xml +++ b/spring-cloud/spring-cloud-vault/pom.xml @@ -1,88 +1,72 @@ - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - org.baeldung.spring.cloud - spring-cloud-vault - jar + org.baeldung.spring.cloud + spring-cloud-vault + jar - spring-cloud-vault - Demo project for Spring Boot + spring-cloud-vault + Demo project for Spring Boot - - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../../parent-boot-2 - + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 + - + - - UTF-8 - UTF-8 - 1.8 - Greenwich.M3 - + + org.springframework.cloud + spring-cloud-starter-vault-config + - - - - - - - org.springframework.cloud - spring-cloud-starter-vault-config - + + org.springframework.cloud + spring-cloud-vault-config-databases + - - org.springframework.cloud - spring-cloud-vault-config-databases - + + org.springframework.boot + spring-boot-starter-test + test + - - org.springframework.boot - spring-boot-starter-test - test - + + mysql + mysql-connector-java + + + org.springframework.boot + spring-boot-starter-jdbc + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + - - mysql - mysql-connector-java - + + + + org.springframework.boot + spring-boot-maven-plugin + + + - - - org.springframework.boot - spring-boot-starter-jdbc - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - spring-milestones @@ -94,5 +78,11 @@ + + UTF-8 + UTF-8 + 1.8 + Greenwich.M3 + diff --git a/spring-mobile/pom.xml b/spring-mobile/pom.xml index d65820594f..4b04c3b8d5 100644 --- a/spring-mobile/pom.xml +++ b/spring-mobile/pom.xml @@ -32,20 +32,4 @@ - - - spring-releases - Spring Milestone Repository - https://repo.spring.io/libs-release - - - - - - spring-releases - Spring Milestone Repository - https://repo.spring.io/libs-release - - - diff --git a/spring-reactor/pom.xml b/spring-reactor/pom.xml index f6db404656..e828c44f74 100644 --- a/spring-reactor/pom.xml +++ b/spring-reactor/pom.xml @@ -30,23 +30,4 @@ - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/libs-snapshot - - true - - - - - - - spring-releases - Spring Releases - https://repo.spring.io/libs-release - - - diff --git a/spring-security-stormpath/pom.xml b/spring-security-stormpath/pom.xml index 5c5783eec5..4f19921fbd 100644 --- a/spring-security-stormpath/pom.xml +++ b/spring-security-stormpath/pom.xml @@ -35,14 +35,6 @@ - - - spring-releases - Spring Releases - https://repo.spring.io/libs-release - - - spring-security-stormpath diff --git a/spring-sleuth/pom.xml b/spring-sleuth/pom.xml index 5ce9e07858..dd4477c551 100644 --- a/spring-sleuth/pom.xml +++ b/spring-sleuth/pom.xml @@ -6,8 +6,8 @@ spring-sleuth 1.0.0-SNAPSHOT jar - spring-sleuth - + spring-sleuth + parent-boot-1 com.baeldung @@ -38,19 +38,8 @@ - - - spring-milestones - Spring Milestones - https://repo.spring.io/libs-milestone - - false - - - - - 2.0.0.M7 + 2.0.2.RELEASE diff --git a/spring-webflux-amqp/pom.xml b/spring-webflux-amqp/pom.xml index 4faa165c50..0868e14717 100755 --- a/spring-webflux-amqp/pom.xml +++ b/spring-webflux-amqp/pom.xml @@ -60,23 +60,4 @@ - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/libs-snapshot - - true - - - - - - - spring-releases - Spring Releases - https://repo.spring.io/libs-release - - - From 6bcc78dce273830bb7310a897be706fd357e71e4 Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Tue, 18 Dec 2018 23:10:32 +0200 Subject: [PATCH 105/359] BAEL-10335 - maven work --- libraries-data/pom.xml | 7 ------- spring-mvc-xml/pom.xml | 21 ++++++--------------- xml/pom.xml | 37 ++++--------------------------------- 3 files changed, 10 insertions(+), 55 deletions(-) diff --git a/libraries-data/pom.xml b/libraries-data/pom.xml index 54d24edbf6..f913cf32ca 100644 --- a/libraries-data/pom.xml +++ b/libraries-data/pom.xml @@ -429,13 +429,6 @@ - - - Apache Staging - https://repository.apache.org/content/groups/staging - - - 1.2.2 4.0.1 diff --git a/spring-mvc-xml/pom.xml b/spring-mvc-xml/pom.xml index 7187b5c270..8e4a56c148 100644 --- a/spring-mvc-xml/pom.xml +++ b/spring-mvc-xml/pom.xml @@ -1,7 +1,6 @@ 4.0.0 - com.baeldung 0.1-SNAPSHOT spring-mvc-xml @@ -86,13 +85,13 @@ - + - org.springframework.boot - spring-boot-starter-test - 1.5.10.RELEASE - test - + org.springframework.boot + spring-boot-starter-test + 1.5.10.RELEASE + test + @@ -116,14 +115,6 @@ - - - 1 - jstl - https://mvnrepository.com/artifact/javax.servlet/jstl - - - diff --git a/xml/pom.xml b/xml/pom.xml index 5490f3a89f..dfdec4da16 100644 --- a/xml/pom.xml +++ b/xml/pom.xml @@ -24,7 +24,6 @@ ${jaxen.version} - org.jdom jdom2 @@ -166,7 +165,7 @@ template-binding.xml - src/main/resources + src/main/resources *-binding.xml @@ -174,14 +173,14 @@ - process-classes + process-classes process-classes bind - - process-test-classes + + process-test-classes process-test-classes test-bind @@ -230,34 +229,6 @@ - - - jibx.sf.net - JiBX repository - http://jibx.sf.net/maven2 - - never - - - false - - - - - - - jibx.sf.net - JiBX repository - http://jibx.sf.net/maven2 - - never - - - false - - - - 1.6.1 1.1.6 From 8ed4ac497c8cd96e9250e103b48b44a74a0e3685 Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Tue, 18 Dec 2018 23:15:46 +0200 Subject: [PATCH 106/359] maven cleanup --- libraries/pom.xml | 19 +++++++------------ persistence-modules/java-cockroachdb/pom.xml | 11 +---------- persistence-modules/java-jdbi/pom.xml | 9 --------- spring-integration/pom.xml | 8 -------- 4 files changed, 8 insertions(+), 39 deletions(-) diff --git a/libraries/pom.xml b/libraries/pom.xml index 2ad4871e3f..3a51ff5be0 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -130,10 +130,10 @@ ${serenity.version} test - - org.asciidoctor - asciidoctorj - + + org.asciidoctor + asciidoctorj + @@ -577,7 +577,7 @@ test test - + org.milyn milyn-smooks-all @@ -654,8 +654,8 @@ org.yaml snakeyaml - ${snakeyaml.version} - + ${snakeyaml.version} + com.numericalmethod @@ -678,11 +678,6 @@ - false diff --git a/persistence-modules/java-cockroachdb/pom.xml b/persistence-modules/java-cockroachdb/pom.xml index 2a92934a6e..2738ef85ff 100644 --- a/persistence-modules/java-cockroachdb/pom.xml +++ b/persistence-modules/java-cockroachdb/pom.xml @@ -5,7 +5,7 @@ com.baeldung java-cockroachdb 1.0-SNAPSHOT - java-cockroachdb + java-cockroachdb parent-modules @@ -22,15 +22,6 @@ - - - Central - Central - http://repo1.maven.org/maven2/ - default - - - 42.1.4 diff --git a/persistence-modules/java-jdbi/pom.xml b/persistence-modules/java-jdbi/pom.xml index 9281f4fd9d..dfb31b26e8 100644 --- a/persistence-modules/java-jdbi/pom.xml +++ b/persistence-modules/java-jdbi/pom.xml @@ -27,15 +27,6 @@ - - - Central - Central - http://repo1.maven.org/maven2/ - default - - - 3.1.0 2.4.0 diff --git a/spring-integration/pom.xml b/spring-integration/pom.xml index 457645a144..8a5399ae0b 100644 --- a/spring-integration/pom.xml +++ b/spring-integration/pom.xml @@ -104,14 +104,6 @@ - - - repo.springsource.org.milestone - Spring Framework Maven Milestone Repository - https://repo.springsource.org/milestone - - - UTF-8 5.0.3.RELEASE From e566167d3f2bb75f1bd28a6ed9d396622b0de50b Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Tue, 18 Dec 2018 23:27:19 +0200 Subject: [PATCH 107/359] package cleanup --- .../spring-boot-persistence/pom.xml | 54 +++++++++---------- .../com/baeldung/boot/config/H2JpaConfig.java | 4 +- .../baeldung/boot/domain/GenericEntity.java | 2 +- .../repository/GenericEntityRepository.java | 5 +- .../baeldung/SpringBootH2IntegrationTest.java | 7 ++- .../SpringBootJPAIntegrationTest.java | 5 +- .../SpringBootProfileIntegrationTest.java | 7 +-- .../config/H2TestProfileJPAConfig.java | 6 +-- 8 files changed, 46 insertions(+), 44 deletions(-) rename persistence-modules/spring-boot-persistence/src/main/java/{org => com}/baeldung/boot/domain/GenericEntity.java (95%) rename persistence-modules/spring-boot-persistence/src/main/java/{org => com}/baeldung/boot/repository/GenericEntityRepository.java (63%) rename persistence-modules/spring-boot-persistence/src/test/java/{org => com}/baeldung/config/H2TestProfileJPAConfig.java (91%) diff --git a/persistence-modules/spring-boot-persistence/pom.xml b/persistence-modules/spring-boot-persistence/pom.xml index 0ea42b1cb7..d9d3a9f9b7 100644 --- a/persistence-modules/spring-boot-persistence/pom.xml +++ b/persistence-modules/spring-boot-persistence/pom.xml @@ -1,20 +1,18 @@ - - 4.0.0 - com.baeldung + + 4.0.0 spring-boot-persistence 0.1.0 - spring-boot-persistence - + spring-boot-persistence + parent-boot-2 - com.baeldung - 0.0.1-SNAPSHOT - ../../parent-boot-2 + com.baeldung + 0.0.1-SNAPSHOT + ../../parent-boot-2 - + org.springframework.boot @@ -35,42 +33,30 @@ org.mockito mockito-core - ${mockito.version} test com.h2database h2 - ${h2database.version} runtime - + org.apache.tomcat tomcat-jdbc - ${tomcat-jdbc.version} mysql mysql-connector-java - ${mysql-connector-java.version} - - UTF-8 - 1.8 - 8.0.12 - 9.0.10 - 1.4.197 - 2.23.0 - - + spring-boot-persistence - - src/main/resources - true - + + src/main/resources + true + @@ -79,4 +65,14 @@ + + + UTF-8 + 1.8 + 8.0.12 + 9.0.10 + 1.4.197 + 2.23.0 + + diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/config/H2JpaConfig.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/config/H2JpaConfig.java index ef90714347..547a905d91 100644 --- a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/config/H2JpaConfig.java +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/config/H2JpaConfig.java @@ -18,7 +18,7 @@ import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration -@EnableJpaRepositories(basePackages = { "org.baeldung.boot.repository", "org.baeldung.repository" }) +@EnableJpaRepositories(basePackages = { "com.baeldung.boot.repository", "com.baeldung.repository" }) @PropertySource("classpath:persistence-generic-entity.properties") @EnableTransactionManagement public class H2JpaConfig { @@ -41,7 +41,7 @@ public class H2JpaConfig { public LocalContainerEntityManagerFactoryBean entityManagerFactory() { final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(dataSource()); - em.setPackagesToScan(new String[] { "org.baeldung.boot.domain" }); + em.setPackagesToScan(new String[] { "com.baeldung.boot.domain" }); em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); em.setJpaProperties(additionalProperties()); return em; diff --git a/persistence-modules/spring-boot-persistence/src/main/java/org/baeldung/boot/domain/GenericEntity.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/domain/GenericEntity.java similarity index 95% rename from persistence-modules/spring-boot-persistence/src/main/java/org/baeldung/boot/domain/GenericEntity.java rename to persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/domain/GenericEntity.java index f1c936e432..a2a676200a 100644 --- a/persistence-modules/spring-boot-persistence/src/main/java/org/baeldung/boot/domain/GenericEntity.java +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/domain/GenericEntity.java @@ -1,4 +1,4 @@ -package org.baeldung.boot.domain; +package com.baeldung.boot.domain; import javax.persistence.Entity; import javax.persistence.GeneratedValue; diff --git a/persistence-modules/spring-boot-persistence/src/main/java/org/baeldung/boot/repository/GenericEntityRepository.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/repository/GenericEntityRepository.java similarity index 63% rename from persistence-modules/spring-boot-persistence/src/main/java/org/baeldung/boot/repository/GenericEntityRepository.java rename to persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/repository/GenericEntityRepository.java index d897e17afe..bbc2865856 100644 --- a/persistence-modules/spring-boot-persistence/src/main/java/org/baeldung/boot/repository/GenericEntityRepository.java +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/repository/GenericEntityRepository.java @@ -1,7 +1,8 @@ -package org.baeldung.boot.repository; +package com.baeldung.boot.repository; -import org.baeldung.boot.domain.GenericEntity; import org.springframework.data.jpa.repository.JpaRepository; +import com.baeldung.boot.domain.GenericEntity; + public interface GenericEntityRepository extends JpaRepository { } diff --git a/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootH2IntegrationTest.java b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootH2IntegrationTest.java index 6479e90113..ecacf62285 100644 --- a/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootH2IntegrationTest.java +++ b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootH2IntegrationTest.java @@ -3,8 +3,6 @@ package com.baeldung; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import org.baeldung.boot.domain.GenericEntity; -import org.baeldung.boot.repository.GenericEntityRepository; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -12,10 +10,13 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.baeldung.boot.config.H2JpaConfig; +import com.baeldung.boot.domain.GenericEntity; +import com.baeldung.boot.repository.GenericEntityRepository; @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = { Application.class, H2JpaConfig.class }) public class SpringBootH2IntegrationTest { + @Autowired private GenericEntityRepository genericEntityRepository; @@ -23,7 +24,9 @@ public class SpringBootH2IntegrationTest { public void givenGenericEntityRepository_whenSaveAndRetreiveEntity_thenOK() { GenericEntity genericEntity = genericEntityRepository.save(new GenericEntity("test")); GenericEntity foundEntity = genericEntityRepository.findById(genericEntity.getId()).orElse(null); + assertNotNull(foundEntity); assertEquals(genericEntity.getValue(), foundEntity.getValue()); } + } \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootJPAIntegrationTest.java b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootJPAIntegrationTest.java index eef9ebe953..01fae2fb4d 100644 --- a/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootJPAIntegrationTest.java +++ b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootJPAIntegrationTest.java @@ -3,14 +3,15 @@ package com.baeldung; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import org.baeldung.boot.domain.GenericEntity; -import org.baeldung.boot.repository.GenericEntityRepository; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +import com.baeldung.boot.domain.GenericEntity; +import com.baeldung.boot.repository.GenericEntityRepository; + @RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class) public class SpringBootJPAIntegrationTest { diff --git a/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootProfileIntegrationTest.java b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootProfileIntegrationTest.java index 4c68f1d4a0..65a75d7bfe 100644 --- a/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootProfileIntegrationTest.java +++ b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootProfileIntegrationTest.java @@ -3,9 +3,6 @@ package com.baeldung; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import org.baeldung.boot.domain.GenericEntity; -import org.baeldung.boot.repository.GenericEntityRepository; -import org.baeldung.config.H2TestProfileJPAConfig; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -13,6 +10,10 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit4.SpringRunner; +import com.baeldung.boot.domain.GenericEntity; +import com.baeldung.boot.repository.GenericEntityRepository; +import com.baeldung.config.H2TestProfileJPAConfig; + @RunWith(SpringRunner.class) @SpringBootTest(classes = { Application.class, H2TestProfileJPAConfig.class }) @ActiveProfiles("test") diff --git a/persistence-modules/spring-boot-persistence/src/test/java/org/baeldung/config/H2TestProfileJPAConfig.java b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/config/H2TestProfileJPAConfig.java similarity index 91% rename from persistence-modules/spring-boot-persistence/src/test/java/org/baeldung/config/H2TestProfileJPAConfig.java rename to persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/config/H2TestProfileJPAConfig.java index 7f962e1417..bcbded95fb 100644 --- a/persistence-modules/spring-boot-persistence/src/test/java/org/baeldung/config/H2TestProfileJPAConfig.java +++ b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/config/H2TestProfileJPAConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.config; +package com.baeldung.config; import java.util.Properties; @@ -18,7 +18,7 @@ import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration -@EnableJpaRepositories(basePackages = { "org.baeldung.repository", "org.baeldung.boot.repository" }) +@EnableJpaRepositories(basePackages = { "com.baeldung.repository", "com.baeldung.boot.repository" }) @EnableTransactionManagement public class H2TestProfileJPAConfig { @@ -41,7 +41,7 @@ public class H2TestProfileJPAConfig { public LocalContainerEntityManagerFactoryBean entityManagerFactory() { final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(dataSource()); - em.setPackagesToScan(new String[] { "org.baeldung.domain", "org.baeldung.boot.domain" }); + em.setPackagesToScan(new String[] { "com.baeldung.domain", "com.baeldung.boot.domain" }); em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); em.setJpaProperties(additionalProperties()); return em; From 1bb238b908877bc387569513081e5c6538d8b204 Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Tue, 18 Dec 2018 23:32:30 +0200 Subject: [PATCH 108/359] logging fix --- libraries-data/src/main/resources/logback.xml | 2 +- .../jmapper/JMapperIntegrationTest.java | 158 ++++++++---------- 2 files changed, 74 insertions(+), 86 deletions(-) diff --git a/libraries-data/src/main/resources/logback.xml b/libraries-data/src/main/resources/logback.xml index a57d22fcb2..3d2ec51566 100644 --- a/libraries-data/src/main/resources/logback.xml +++ b/libraries-data/src/main/resources/logback.xml @@ -9,7 +9,7 @@ - + \ No newline at end of file diff --git a/libraries-data/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java b/libraries-data/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java index 96ed090482..9db7bdb4ac 100644 --- a/libraries-data/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java +++ b/libraries-data/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java @@ -15,100 +15,88 @@ import com.googlecode.jmapper.api.JMapperAPI; public class JMapperIntegrationTest { - @Test - public void givenUser_whenUseAnnotation_thenConverted(){ + public void givenUser_whenUseAnnotation_thenConverted() { JMapper userMapper = new JMapper<>(UserDto.class, User.class); - - User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); + + User user = new User(1L, "john@test.com", LocalDate.of(1980, 8, 20)); UserDto result = userMapper.getDestination(user); - System.out.println(result); - assertEquals(user.getId(), result.getId()); - assertEquals(user.getEmail(), result.getUsername()); - } - - @Test - public void givenUser_whenUseGlobalMapAnnotation_thenConverted(){ - JMapper userMapper= new JMapper<>(UserDto1.class, User.class); - - User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); - UserDto1 result = userMapper.getDestination(user); - - System.out.println(result); - assertEquals(user.getId(), result.getId()); - assertEquals(user.getEmail(), result.getEmail()); - } - - @Test - public void givenUser_whenUseAnnotationExplicitConversion_thenConverted(){ - JMapper userMapper = new JMapper<>(UserDto.class, User.class); - - User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); - UserDto result = userMapper.getDestination(user); - - System.out.println(result); - assertEquals(user.getId(), result.getId()); - assertEquals(user.getEmail(), result.getUsername()); - assertTrue(result.getAge() > 0); - } - - //======================= XML - - @Test - public void givenUser_whenUseXml_thenConverted(){ - JMapper userMapper = new JMapper<>(UserDto.class, User.class,"user_jmapper.xml"); - - User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); - UserDto result = userMapper.getDestination(user); - - System.out.println(result); - assertEquals(user.getId(), result.getId()); - assertEquals(user.getEmail(), result.getUsername()); - } - - @Test - public void givenUser_whenUseXmlGlobal_thenConverted(){ - JMapper userMapper = new JMapper<>(UserDto1.class, User.class,"user_jmapper1.xml"); - - User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); - UserDto1 result = userMapper.getDestination(user); - - System.out.println(result); - assertEquals(user.getId(), result.getId()); - assertEquals(user.getEmail(), result.getEmail()); - } - - // ===== API - - @Test - public void givenUser_whenUseApi_thenConverted(){ - JMapperAPI jmapperApi = new JMapperAPI() .add(mappedClass(UserDto.class) - .add(attribute("id").value("id")) - .add(attribute("username").value("email")) - ) ; - JMapper userMapper = new JMapper<>(UserDto.class, User.class, jmapperApi); - - User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); - UserDto result = userMapper.getDestination(user); - - System.out.println(result); assertEquals(user.getId(), result.getId()); assertEquals(user.getEmail(), result.getUsername()); } - - @Test - public void givenUser_whenUseApiGlobal_thenConverted(){ - JMapperAPI jmapperApi = new JMapperAPI() .add(mappedClass(UserDto.class) - .add(global()) - ) ; - JMapper userMapper1 = new JMapper<>(UserDto1.class, User.class,jmapperApi); - - User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); - UserDto1 result = userMapper1.getDestination(user); - System.out.println(result); + @Test + public void givenUser_whenUseGlobalMapAnnotation_thenConverted() { + JMapper userMapper = new JMapper<>(UserDto1.class, User.class); + + User user = new User(1L, "john@test.com", LocalDate.of(1980, 8, 20)); + UserDto1 result = userMapper.getDestination(user); + assertEquals(user.getId(), result.getId()); assertEquals(user.getEmail(), result.getEmail()); } + + @Test + public void givenUser_whenUseAnnotationExplicitConversion_thenConverted() { + JMapper userMapper = new JMapper<>(UserDto.class, User.class); + + User user = new User(1L, "john@test.com", LocalDate.of(1980, 8, 20)); + UserDto result = userMapper.getDestination(user); + + assertEquals(user.getId(), result.getId()); + assertEquals(user.getEmail(), result.getUsername()); + assertTrue(result.getAge() > 0); + } + + // ======================= XML + + @Test + public void givenUser_whenUseXml_thenConverted() { + JMapper userMapper = new JMapper<>(UserDto.class, User.class, "user_jmapper.xml"); + + User user = new User(1L, "john@test.com", LocalDate.of(1980, 8, 20)); + UserDto result = userMapper.getDestination(user); + + assertEquals(user.getId(), result.getId()); + assertEquals(user.getEmail(), result.getUsername()); + } + + @Test + public void givenUser_whenUseXmlGlobal_thenConverted() { + JMapper userMapper = new JMapper<>(UserDto1.class, User.class, "user_jmapper1.xml"); + + User user = new User(1L, "john@test.com", LocalDate.of(1980, 8, 20)); + UserDto1 result = userMapper.getDestination(user); + + assertEquals(user.getId(), result.getId()); + assertEquals(user.getEmail(), result.getEmail()); + } + + // ===== API + + @Test + public void givenUser_whenUseApi_thenConverted() { + JMapperAPI jmapperApi = new JMapperAPI().add(mappedClass(UserDto.class).add(attribute("id").value("id")).add(attribute("username").value("email"))); + JMapper userMapper = new JMapper<>(UserDto.class, User.class, jmapperApi); + + User user = new User(1L, "john@test.com", LocalDate.of(1980, 8, 20)); + UserDto result = userMapper.getDestination(user); + + assertEquals(user.getId(), result.getId()); + assertEquals(user.getEmail(), result.getUsername()); + } + + @Test + public void givenUser_whenUseApiGlobal_thenConverted() { + JMapperAPI jmapperApi = new JMapperAPI().add(mappedClass(UserDto.class).add(global())); + JMapper userMapper1 = new JMapper<>(UserDto1.class, User.class, jmapperApi); + + User user = new User(1L, "john@test.com", LocalDate.of(1980, 8, 20)); + UserDto1 result = userMapper1.getDestination(user); + + assertEquals(user.getId(), result.getId()); + assertEquals(user.getEmail(), result.getEmail()); + } + } From 8411df4e6b1f405348667396722202b5b1710c2d Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Tue, 18 Dec 2018 23:50:20 +0200 Subject: [PATCH 109/359] renaming tests --- .../src/main/resources/mongoConfig.xml | 19 +++++++++---------- ... => MongoTransactionReactiveLiveTest.java} | 2 +- ... => MongoTransactionTemplateLiveTest.java} | 2 +- ...t.java => MongoTransactionalLiveTest.java} | 2 +- .../SpringContextIntegrationTest.java | 18 ------------------ 5 files changed, 12 insertions(+), 31 deletions(-) rename persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/{MongoTransactionReactiveIntegrationTest.java => MongoTransactionReactiveLiveTest.java} (96%) rename persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/{MongoTransactionTemplateIntegrationTest.java => MongoTransactionTemplateLiveTest.java} (97%) rename persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/{MongoTransactionalIntegrationTest.java => MongoTransactionalLiveTest.java} (98%) delete mode 100644 persistence-modules/spring-data-mongodb/src/test/java/org/baeldung/SpringContextIntegrationTest.java diff --git a/persistence-modules/spring-data-mongodb/src/main/resources/mongoConfig.xml b/persistence-modules/spring-data-mongodb/src/main/resources/mongoConfig.xml index 324f7f60c2..d59ebcef6e 100644 --- a/persistence-modules/spring-data-mongodb/src/main/resources/mongoConfig.xml +++ b/persistence-modules/spring-data-mongodb/src/main/resources/mongoConfig.xml @@ -7,33 +7,32 @@ http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context.xsd" -> - - + http://www.springframework.org/schema/context/spring-context.xsd"> + + - + - + - + - + - + - + \ No newline at end of file diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionReactiveIntegrationTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionReactiveLiveTest.java similarity index 96% rename from persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionReactiveIntegrationTest.java rename to persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionReactiveLiveTest.java index 43aa865e91..70908552fe 100644 --- a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionReactiveIntegrationTest.java +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionReactiveLiveTest.java @@ -14,7 +14,7 @@ import com.baeldung.model.User; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoReactiveConfig.class) -public class MongoTransactionReactiveIntegrationTest { +public class MongoTransactionReactiveLiveTest { @Autowired private ReactiveMongoOperations reactiveOps; diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionTemplateIntegrationTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionTemplateLiveTest.java similarity index 97% rename from persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionTemplateIntegrationTest.java rename to persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionTemplateLiveTest.java index 1dbe724d87..20ac6974bc 100644 --- a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionTemplateIntegrationTest.java +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionTemplateLiveTest.java @@ -26,7 +26,7 @@ import com.baeldung.model.User; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) -public class MongoTransactionTemplateIntegrationTest { +public class MongoTransactionTemplateLiveTest { @Autowired private MongoTemplate mongoTemplate; diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionalIntegrationTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionalLiveTest.java similarity index 98% rename from persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionalIntegrationTest.java rename to persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionalLiveTest.java index 4d747789a0..0cf86aa43e 100644 --- a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionalIntegrationTest.java +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionalLiveTest.java @@ -27,7 +27,7 @@ import com.mongodb.MongoCommandException; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) -public class MongoTransactionalIntegrationTest { +public class MongoTransactionalLiveTest { @Autowired private MongoTemplate mongoTemplate; diff --git a/persistence-modules/spring-data-mongodb/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/persistence-modules/spring-data-mongodb/src/test/java/org/baeldung/SpringContextIntegrationTest.java deleted file mode 100644 index 04d549a288..0000000000 --- a/persistence-modules/spring-data-mongodb/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.baeldung; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -import com.baeldung.config.MongoConfig; -import com.baeldung.config.SimpleMongoConfig; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { MongoConfig.class, SimpleMongoConfig.class }) -public class SpringContextIntegrationTest { - - @Test - public void whenSpringContextIsBootstrapped_thenNoExceptions() { - } -} From 3064a22a7aea5b5339fc25abb8475574179f54b2 Mon Sep 17 00:00:00 2001 From: Alejandro Gervasio Date: Wed, 19 Dec 2018 10:32:39 -0300 Subject: [PATCH 110/359] BAEL-2413 - Integrating Spring Boot with HSQLDB (#5891) * Initial Commit * Update source file location * Update CustomerControllerUnitTest.java * Update CustomerControllerUnitTest.java * Update CustomerControllerUnitTest.java * Update source files * Update CustomerController.java * Update CustomerController.java * Update CustomerControllerUnitTest.java * Update CustomerControllerUnitTest.java * Update CustomerControllerUnitTest.java * Update index.html * Update persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/controllers/CustomerController.java Co-Authored-By: alejandrogervasio * Update CustomerController.java * Update CustomerControllerUnitTest.java * Update CustomerController.java * Update CustomerControllerUnitTest.java * Update CustomerControllerUnitTest.java --- .../application/Application.java | 12 ++++ .../controllers/CustomerController.java | 33 ++++++++++ .../application/entities/Customer.java | 55 +++++++++++++++++ .../repositories/CustomerRepository.java | 8 +++ .../src/main/resources/application.properties | 21 ++----- .../src/main/resources/templates/index.html | 2 +- .../tests/CustomerControllerUnitTest.java | 61 +++++++++++++++++++ 7 files changed, 175 insertions(+), 17 deletions(-) create mode 100644 persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/Application.java create mode 100644 persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/controllers/CustomerController.java create mode 100644 persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/entities/Customer.java create mode 100644 persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/repositories/CustomerRepository.java create mode 100644 persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerUnitTest.java diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/Application.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/Application.java new file mode 100644 index 0000000000..c5a5c291c6 --- /dev/null +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/Application.java @@ -0,0 +1,12 @@ +package com.baeldung.springboothsqldb.application; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/controllers/CustomerController.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/controllers/CustomerController.java new file mode 100644 index 0000000000..8229a1d1c0 --- /dev/null +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/controllers/CustomerController.java @@ -0,0 +1,33 @@ +package com.baeldung.springboothsqldb.application.controllers; + +import com.baeldung.springboothsqldb.application.entities.Customer; +import com.baeldung.springboothsqldb.application.repositories.CustomerRepository; +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class CustomerController { + + private final CustomerRepository customerRepository; + + @Autowired + public CustomerController(CustomerRepository customerRepository) { + this.customerRepository = customerRepository; + } + + @PostMapping("/customers") + public Customer addCustomer(@RequestBody Customer customer) { + customerRepository.save(customer); + return customer; + } + + @GetMapping("/customers") + public List getCustomers() { + return (List) customerRepository.findAll(); + } +} diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/entities/Customer.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/entities/Customer.java new file mode 100644 index 0000000000..636a80e272 --- /dev/null +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/entities/Customer.java @@ -0,0 +1,55 @@ +package com.baeldung.springboothsqldb.application.entities; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "customers") +public class Customer { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + + private String name; + private String email; + + public Customer() {} + + public Customer(String name, String email) { + this.name = name; + this.email = email; + } + + public void setId(long id) { + this.id = id; + } + + public long getId() { + return id; + } + + public void setName(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getEmail() { + return email; + } + + @Override + public String toString() { + return "Customer{" + "id=" + id + ", name=" + name + ", email=" + email + '}'; + } +} diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/repositories/CustomerRepository.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/repositories/CustomerRepository.java new file mode 100644 index 0000000000..a81aa62c43 --- /dev/null +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/repositories/CustomerRepository.java @@ -0,0 +1,8 @@ +package com.baeldung.springboothsqldb.application.repositories; + +import com.baeldung.springboothsqldb.application.entities.Customer; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface CustomerRepository extends CrudRepository {} diff --git a/persistence-modules/spring-boot-persistence/src/main/resources/application.properties b/persistence-modules/spring-boot-persistence/src/main/resources/application.properties index 303ce33c25..b0caf4a809 100644 --- a/persistence-modules/spring-boot-persistence/src/main/resources/application.properties +++ b/persistence-modules/spring-boot-persistence/src/main/resources/application.properties @@ -1,16 +1,5 @@ -spring.datasource.tomcat.initial-size=15 -spring.datasource.tomcat.max-wait=20000 -spring.datasource.tomcat.max-active=50 -spring.datasource.tomcat.max-idle=15 -spring.datasource.tomcat.min-idle=8 -spring.datasource.tomcat.default-auto-commit=true -spring.datasource.url=jdbc:h2:mem:test -spring.datasource.username=root -spring.datasource.password= -spring.datasource.driver-class-name=org.h2.Driver - -spring.jpa.show-sql=false -spring.jpa.hibernate.ddl-auto=update -spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect -spring.jpa.properties.hibernate.id.new_generator_mappings=false +spring.datasource.driver-class-name = org.hsqldb.jdbc.JDBCDriver +spring.datasource.url = jdbc:hsqldb:mem:test;DB_CLOSE_DELAY=-1 +spring.datasource.username = sa +spring.datasource.password = +spring.jpa.hibernate.ddl-auto = create diff --git a/persistence-modules/spring-boot-persistence/src/main/resources/templates/index.html b/persistence-modules/spring-boot-persistence/src/main/resources/templates/index.html index 2634e10380..344d4e59f5 100644 --- a/persistence-modules/spring-boot-persistence/src/main/resources/templates/index.html +++ b/persistence-modules/spring-boot-persistence/src/main/resources/templates/index.html @@ -40,4 +40,4 @@ - \ No newline at end of file + diff --git a/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerUnitTest.java b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerUnitTest.java new file mode 100644 index 0000000000..33891e3d43 --- /dev/null +++ b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerUnitTest.java @@ -0,0 +1,61 @@ +package com.baeldung.springboothsqldb.application.tests; + +import com.baeldung.springboothsqldb.application.entities.Customer; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectWriter; +import com.fasterxml.jackson.databind.SerializationFeature; +import java.nio.charset.Charset; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; + +@RunWith(SpringRunner.class) +@SpringBootTest +@AutoConfigureMockMvc +public class CustomerControllerUnitTest { + + private static MediaType MEDIA_TYPE_JSON; + + @Autowired + private MockMvc mockMvc; + + @Before + public void setUpJsonMediaType() { + MEDIA_TYPE_JSON = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8")); + + } + + @Test + public void whenPostHttpRequesttoCustomers_thenStatusOK() throws Exception { + Customer customer = new Customer("John", "john@domain.com"); + ObjectMapper mapper = new ObjectMapper(); + mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false); + ObjectWriter objectWriter = mapper.writer().withDefaultPrettyPrinter(); + String requestJson = objectWriter.writeValueAsString(customer); + + this.mockMvc + .perform(MockMvcRequestBuilders.post("/customers") + .contentType(MEDIA_TYPE_JSON) + .content(requestJson) + ) + + .andExpect(MockMvcResultMatchers.status().isOk()); + } + + @Test + public void whenGetHttpRequesttoCustomers_thenStatusOK() throws Exception { + this.mockMvc + .perform(MockMvcRequestBuilders.get("/customers")) + + .andExpect(MockMvcResultMatchers.content().contentType(MEDIA_TYPE_JSON)) + .andExpect(MockMvcResultMatchers.status().isOk()); + } +} From 5996de6af1a681d8c9a6c9c930a57b498daab92b Mon Sep 17 00:00:00 2001 From: "EZZEDDINE.ELHAZATI" Date: Wed, 19 Dec 2018 16:04:46 +0100 Subject: [PATCH 111/359] rename test class. --- ....java => BootstrapAPIIntegrationTest.java} | 30 +++---------------- 1 file changed, 4 insertions(+), 26 deletions(-) rename persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/bootstrap/{Hibernate5BootstrapAPITest.java => BootstrapAPIIntegrationTest.java} (62%) diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/bootstrap/Hibernate5BootstrapAPITest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/bootstrap/BootstrapAPIIntegrationTest.java similarity index 62% rename from persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/bootstrap/Hibernate5BootstrapAPITest.java rename to persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/bootstrap/BootstrapAPIIntegrationTest.java index 39111f6256..19988b45be 100644 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/bootstrap/Hibernate5BootstrapAPITest.java +++ b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/bootstrap/BootstrapAPIIntegrationTest.java @@ -1,7 +1,6 @@ package com.baeldung.hibernate.bootstrap; import com.baeldung.hibernate.pojo.Movie; -import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.boot.Metadata; import org.hibernate.boot.MetadataSources; @@ -10,22 +9,18 @@ import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.service.ServiceRegistry; import org.junit.After; -import org.junit.Before; import org.junit.Test; import java.io.IOException; -import java.util.List; -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -public class Hibernate5BootstrapAPITest { +public class BootstrapAPIIntegrationTest { SessionFactory sessionFactory = null; - Session session = null; - @Before - public void setUp() throws IOException { + @Test + public void whenServiceRegistryAndMetadata_thenSessionFactory() throws IOException { BootstrapServiceRegistry bootstrapRegistry = new BootstrapServiceRegistryBuilder() .build(); @@ -41,29 +36,12 @@ public class Hibernate5BootstrapAPITest { Metadata metadata = metadataSources.getMetadataBuilder().build(); sessionFactory = metadata.buildSessionFactory(); - } - - @Test - public void testBuildSessionFactory() { assertNotNull(sessionFactory); - session = sessionFactory.openSession(); - assertNotNull(session); - - //Persist Movie - session.getTransaction().begin(); - Movie movie = new Movie(); - movie.setId(100L); - session.persist(movie); - session.getTransaction().commit(); - - List movies = session.createQuery("FROM Movie").list(); - assertNotNull(movies); - assertEquals(movies.size(), 1L); + sessionFactory.close(); } @After public void clean() throws IOException { - session.close(); sessionFactory.close(); } } From c28fa5541d4be07e2e7006dc8465748efe597a82 Mon Sep 17 00:00:00 2001 From: Urvy Agrawal Date: Thu, 20 Dec 2018 00:26:14 +0530 Subject: [PATCH 112/359] BAEL-2323 Adding files for native keyword tutorial (#5913) * BAEL-2323 Adding files for native keyword tutorial * junit test files and native library * update test method name --- core-java/native/nativedatetimeutils.dll | Bin 0 -> 72050 bytes .../baeldung/nativekeyword/DateTimeUtils.java | 10 +++++++ .../baeldung/nativekeyword/NativeMainApp.java | 11 +++++++ .../DateTimeUtilsManualTest.java | 27 ++++++++++++++++++ 4 files changed, 48 insertions(+) create mode 100644 core-java/native/nativedatetimeutils.dll create mode 100644 core-java/src/main/java/com/baeldung/nativekeyword/DateTimeUtils.java create mode 100644 core-java/src/main/java/com/baeldung/nativekeyword/NativeMainApp.java create mode 100644 core-java/src/test/java/com/baeldung/nativekeyword/DateTimeUtilsManualTest.java diff --git a/core-java/native/nativedatetimeutils.dll b/core-java/native/nativedatetimeutils.dll new file mode 100644 index 0000000000000000000000000000000000000000..ecdd3883806f95f1c309debac6fefd2897b77a10 GIT binary patch literal 72050 zcmeFa3w%`7wLg9)GZQ9|aDpTn6=c+)i9$?xC{fTHG6QFD5@Hfwf=)sn5DiJ1%s^BM z!I=?GkArEet!=HP*0$cOZK<`quIMCzB;YH64-g-SR?jdX4=n^x=l@;%oHH|twD*5M zzt8Xf?!(cOwI6G*z4qE`uf6u;9E$F2=ZqZ3neap+9Jd9Keg*9BKmXH)?BQd!4d-4+ zdhN7uQ&uJq^~n2CHp$nRQuXbxlr6%Fs-W zbcvngsvk<_ZkcfDBJLTEOEq)c3GN!}u!Mw*xurl_k0*`eta!LoD)e|g{bk_{fnVC_OlmaLYgAR`h5(Ue0R_Yg%+a9nv31+?D=j$2B?(SKG0H%Sj) z2&NjitP7+sI>mAQVC^6Ma@;koZe;e?;t#P%ZAUxee-&IwMNW04yAp{(%4oww&2GRG z_bcE^f;r79VlL##wc{aLO>syF7H|~>IZY}aYvTqa65et=alZmCw;-oA4sRne32$W_ z5`qkGaZ3xOmW;%oAcemDYvU?{IW;Q1hba3H9%{#fc;bGHUY&}^`s4&MhvMtT?9CtnAPo#A86~iO>#Qh)_$gifpv5Hgs8hy_2eiVm< zAnKidgQg56l$ERDJvtb#Wcm$x`7H6CVE_fdO9uSOV7%1nH%!c9i7cx`qxaMW@Fq=W zi8(;wDm1*OFMv1sCYH$B+oa+BZZKZK^noeg#s0TQpiJ~0wQl907|KW094AU$qST?x z7=obxpeUJ-c2c7G7=U|ZUQq0z$$}HTJFE-4_%Q|C7ScaGYU4Pee9pYNjHrLFD7{uB z?eKhGHvi;L9On=6>u&|NS21j(LXx=+sd>Q@BLC;~UxI$#Y0)1P<RU($UadzL3qs%_!NKwhCSkw~PLAL9cukw|fXlH!A%C-F($ZU@q)QCbtFp+mi4 ziDs@1X7*{=rM0W5yDV@fm%YJ15NF!l@$FDQ50xX3w#eiaU;FQ z{2)pt5ZzaSQHx)W-d;_+vPiq$koGyHol^SLWgO?3A)9mmKyr8Aty~NBbx2AcaLy|C zUjkk0_MSKLKIj{IfcO0#P&(0Lj=+_GFe4Cg)EsMH^nx;<-w;CV1_FLH>`v5P@KkDQ2) zbbS?x5R?9e)V9K2M^SzZeByxjFF+n+b2mfD$2-^34@9VDAGPhm?z8?<_P6vCDt4jp&Mf0xy&{Y z=d(RlKKuK*Ha^>4fImeg_%o*hf9`6+pWhM=;2&tV2K?&=6>i@MC`y4;A|*XWV^s{8 zKVgaXJ_M7XQlezvF9z&~#K0V@D5XN_W-){kizrnfYTrO+?|2%b*dDCWLi> zlCzXA?j}4ZrF1FRutHAYNao!yf=W6P7;PkUP{ON(F6~Fh=PtyQav+j^%LBpXlv^<@~~P zEWU`c05yiUY2za=IDp-DQR?lAw^tO8wWeL=Z;A-{&ZiMm;l$WkO8td_G+&kU&+a0A z(igW95G$0k7a<_K(Fdzpj#wc|?>eLtiWNS#(t@=1n7vR3mu4k__`003;2D&c-hrv~ z@8Z{!y~eyV6^VHVYulZ&XmRGh-i*niBvmf8I1GCbLMAl^xy}^w9S3J;xlgbDl zCH+B%w1fBkjHpx{bO!1(bDe=n3o&aRfmL;Md}?$Wz7VCtRMk;XUPK`QCLmeZk_(ce zq0cEDLB0h%Y(WVW-1#oY&61tD7EJRrZL&$!mRauYH}U=s;=}wHFbygNR{W%fdL`I^ zp&?YyWEe70ItNanL=|Mt)o~J9u!!TL`ocIyr6s5|{D<0hZ-0Ti+Zk|XjuW;N5QE@V zBt6ds($zqU?2FP>cu-QSD{zlOo$gCmNgL9}#R^9DwGZT=3zhJ`8=>S*Ii(BE_u#6E z3@0P$n+}k{=KaITfTUXx!zB9Fav0=Jr5p2)I$rV)hMHhUA-(&F5V*AfZ8^}2Wm~RA zc>c~PALI3Iu}uB%r@!*5TM8W(QlDU2-!PG*R5nHkOVhQ z%*OcdAF}F~_&aRXM4LSNUr@r1Y1zL41#EKqFIjvq?{8=ElpnJAF3-iFE+K4_jdr+z z9{F~Yf0w60F0)`*^L`$q90N8P1D5wrC5sZ6cE#T?zrh@-(>w~uMt)P7MKtt_hO^#t zsZN>WeOI7y{Mv&+@}9HsJ{zKt;J?P?}H*+%&^OeCuf%Zh5EC!Rt4mv{N4Y`a38fPkR|4JSwW6-foP! zu8dnI{{|)a08O*#>-C6;hW&CXOyTF}T$O!3$k13OeseQX@v{2P!7q|mm5C>Nqj3oUYq zMfveLE^_YK$IEgCkqb5YxR|T+7A1(%$ zTP8g9;rO3jk5CT=8W1syb-6DQ&tTCs`ZdDv?kG^rA^ckrrp_8k?|^-G%GDHHkD#Rr~owQoWi+a_w&J>5jNiq z!h|^aePs2RC&I!dnYdt&dAw%p(1r;JqMskAq{8+S2)3!g{z&@aeN=hM@d{%0?}$Xw zZ^PehLnT8E3L@;8x zX+K8L{X5-}fm5d1vuPOiK%o^8zxEMAOu)V(@B0Y_v3?ACUIinxX{B7MF~a+{Bg%}< zDg;<&qz?`5}tZxK%zVSKGk*9#@OHXR-`d>^2mO+CR*1#`yTO z(L`_aw1)wB|1@OjtyTF~?XK2*o92Wn4X7_KNK3uLuwkSIiZO}J-C3bNq_7PLwN-@- zHMA|7$`~H6rap~ST7Jg)SJC|q<)cJ2O4=!#H#|)v)-zW0A9Guw7F!xgsUAWqdW%yW z5F@1JPSb^N)kY)RUkFUT4~Sc7W_AX~9>XLF6Cs`XLVVUKefDQ7AZD7kX&TQy9-fHt zYkmzlLbvI?Bx&k?d3v&xXq;|w1k&Dv-8P8XN2IwHX@*Jkb|;J8^H%pnj2xv~WdSPW zc?tVEyzhGur1UQK6UeyGo~}d{j9>>R9s;@~vym z78cI5^1k)JW2(D+rlxq~&}9Chw<(=z!d*-gc;6>TVeOU8b*PNwF_YF7%sPsZL;Ctf z9RZG)NOJlJ*ifo#&o@Y=qFYtX?_(B8rJ?Eb>FFl;0!zVU_%Is}q~Gp$__bs&m~Ojw zGri{hBm-Tyr$ws>s#Wm5Qe9BMP($q6mH{reva$1r5@G{3waYzC$`Ykk@^%%bt=+E?S7sws5lDHHlu8=? zcLoYmBk2)j$I*NVLX3oe-p;lrWwRf6(krN!XXb=$X11YLA|)~MOBng|r->lEu2FJA z{(etNxY#ChLjHdDwQL(;IvO1G97UmWR_F&Pq!U!_6P&eFQJRIPLusGQ=w~xj7f{3d zL>VL`^Q}~i)E7R0mBZ02TBXixPNyYrg>Ez0lGjH2iMug(q0(B}97G5cg9k1}%9{xH znEw@j=@&`g@G8i6*0#&$pEG>-wTx1ac`c$OT9P*W0jwj`{GTW%VPwLOfYv&szz-k_ zyOo2K`eQa%(Vx6v?V9|eJKaObJpn&r)g4ns!=5$ybdcvcLfQ9a3`^i24eI#<@;ms= zLK+qVh75kQBhkOho#hR|^-Pwqe(KGV#biP1b>#Q0uoy)wxOX=X!@4uencwUABro{I zfc3PtxeRAP`B^cwqTjOOUhq8W00w~zeGKccP^?O?KpeJmGyy{&zqtg}FG@xA1&P4O z$0jt^Fl}OBWmi@>36?WU%s=nGO7()Va3Z5AfIb9$SlzK8qYZhHai$Fn7KQy}`b6vZ zK+2!@gN64ntWW_qj#7S&I9BRn_HKqBI!Pl=*ACs@F@H3W;-Rv%Fv#1B(j&zx^RK9M zAbk-4zqvdi5gr!xSX_Mqm8npQ!nA z|H0Lt$@e6ShQEuL4s|o6+GlK$$C7GQ`vJ4_!mprwC=034QAo7?dAkA&49W~BBISOM z-<0Y-{9)Un1%NT(1$ObFC-;FAvkC3fn2@T&NyO1xLlaU#kk34MzAN+X0 zb`%M(5GABFJdIR9q8cF>ewlj%Oj3yW%r3yF*0c`~?Ha zw==5~mo_*a`WPFrQR~v)9y&NM4*e5p2LT&p`feFk1P*DBDD7rG{Z_7m8j3}LV!aq4 z>@>$!NA`3Iu&J~aMNpO%P`*rOxKrYBi4EY-$NKZ&bqD_Tiw_UIzyI_OgZuK+J50Rq zK`0jnl?Ce!n-Sr>z2WrQc4T>G>&Zw(@>s5o7FSPX0&s$4B=$wx=gY-or5z(1dTAd# zOdENojQ1j`Px%NtDqw$p*XbPv?rU|L2_Ukq>tz_>-_v-Y+D%BxgV!Jad2PFnMkZbA zTyr?Gn&Z|SxwQbjP8y-jchfOL?*mznMJ~rp4|?Y>Ss$K%xH<6C)qm7+-~TA1n&wwm*I^0O7W zFgbtc_g7~tIGQL-UX^&dFv;Y8z<+F2IluYhSXp?l3CakR^#@no%xv{a+Gngb(r3RRn4al)&~#Wyz~QMa%SMa8F?} zawFlj*#A=uU?gS_Sz!=Sx?t?6yh!D5PxgEonu{V)e@T!FFmb;wy@h78)^+Nw;{#Z$ zaC!@~sfC`a)oQ?Blz!D<`T={ye+&~+qQN~S#t;9}aMs>#gOZ05V*WRtqjAkzby>8* z7ik3J8?2sc>COEm$p_=Xzf0&TNF@olp^4B*yFB00jR7*=8MwnBct5t<^L9<=H<^Zd z4}EA$+F!WNG}PhkFgUztjh@dOfl?#c?Ng`^!)3>mE-EgZ=_0qnoyrIjvFnLg_|L-W zt^)U^(NyR^QhyP(mn_2}?GCR~{UzPr>xV)%I7l|^OJhEg-gZc@VCPTZ9YNttCs`j` zK)l2~tk!$K6&CO#)GyCS7VaUIvT|;W+Wlg7 zKRJON=WY`_j@$|_!+QvV!8F~EqsB=nK;xBmCE(ix<{KPmJ^~)Bf$2x0Aqacv?Z|~^ zDXhcT+~fI~O`eg8#;v+Rl=`tpDj0$kyHX(Sm-f#Jlp761ubaz7y9_i(e>p3#2pf3$ z=Xu|9wdp9ZfabdFcMYBL42yrSG&gzGtbYk2*PV#@A5nQO_7M4XIP2iZbd8tiCI@Ck zfLWZp%F4#iDRumGL1>VsI)3J2{D9yyZSKZy<9N2v%>S?@kLeSf2I&<4(lF(RB&p##J809JRR2u3s`;4-r1`5!^PfNm+hkX=J^wwMv>)2PBToBo?q}K$7Y_zB6N~nI z2*EDB?UX(iyq{Xb!yNlU>&hZU@XD{Yk+0KbuwB_3D1pC`zv^Re@FwKjl1?ChU17xY zz9auV-gg=mf*pSST?ja(Ls5n0*VB1oywZM4VV(IO^S;M`CGEFm9}@Dr`1NPdO1t#F zkiFCHKW38}lUHR4-gAxa^wTqwEN)&1*uSC5en_OHoi=$UjTC+z85|+ti7?y|40o7q z-N^1j19e0KXsx;hsW=)Eq`zzZCt$L`5K(pfLx={%4gTQj&uoDPY%O6u?dS#{L>7!L zPh(E8bdL1<&%j2S=O_`rLZj#XJVve^2!RkfyY6hGvm| z^vq;a(Mt$Ngzfkf35~~}sC}fi@%~<9Q~P)yA?k|uJi_u!%UIIwX{u@;LlQNSI+9EV zOh0@byC3F^}0FwF| zof7gg94`JmDc5^n+SiyQ)!jsX^BozrScu#$R?SFrNS{Q_^Uway6x128f7N6E3aS8S za}jxK2bAICmc9!uBwk7j>- z8VR=VpXY zF?$u=541@=w3+d?AJTcnE(^*0`bRL*Z23KW;6~Ea?0&l>Bs0yW^K-aGw)`L;xQykI zwYR|&;n!b+IBEN*C`<#%A7SZ_3_*HrJJ42L=|9H%-l1a1*2=k)u?=&2MKns@9-v%g`CHwcT8i}kp#qnK?9DigxX{j?%W#!iwA_4ZD-;~JqCVfHo z5dNiJIA+kPca`6w&%DP$nQmP$2ajK0i6C_vX@wuYQ>y#wP!-bt0g1&R0VK^qOI@w6 zs_D{JOdmDhMc6_^!yn<-pNF2or%L60w4Sc@J^%yg`xL>z>;yK*FfE)NbLL3)ZaNiQ zPiI&p^7XVYW|M;1eV9GN7e&Vx<@p{4mn2IeKj`_Kq#b$;*v!61-K)QRsrrLa_li2< z37`?icv6-h0weS!QdIWX{H3zD8HrN=nPXBv8~g!NDU`zhYox+GU^{wF=_BRORQ_Qk zqHEZk&HJuLEOascMEM163-2fPAPmfxyzk!-HuU4fJ<4w`abpBEc*(7whkhDgp2?z> z#x3a%^fBZ{Bqnca4bGA{rRxh+-G@B#8_JS(f1mOh{of!z&JkVxX}tD4vJ(Xd^3y`} z_98hd(Mn2bKniPwBIF}$uefI2Lcc!qF5EwsD0Rf#LV6`Kh2?56j4?^nmd?r6I4kJUzKZoh_ zTwrEGe&^~kP5GR3-Qs}2mafV$9O}xqTjauVXb1!h!Arf~kE|)=WqEhmr9z9c_7uA0 zfn*@iy@_lndOKTJVFxL@6T-yB16`hMzho(Sxd*c`{Zsd>dmL>)xH7YZmWocgg_FCL z7Mvok8I;g!5mys%eT1zW+1ipqR%QB0C^#~l*q#;E^mA=+@2hZ;L4=bE_LWldzhVob zRaZy*#|q-gK32RinFI-+N7g4hdw!#LnW>-)X3#i#k zDa3XJm;kKG?I+Y`FN!sr_a(9c-TyWJ@JdjCmBGkf?N-Omdqh(@X#<@p%AA|Yb3(|L z9i$~`D!+~{0-#MGe~QF*InIvb#kMf2zrSWRUqE85*QpX~g~X^%54uFF?{E29eHeYH zjp{)qs7kq-4ULn^Epdfme<5$Q1@fl9q4zOHy!WOW!ri+54D65X$VW>+Ih0S+)EL$h zt#=I2%J37+{PXKCL$;xhOdTx*W8;gi=4orNrA#9a1koqCY&WEKEN8Es#^Ijplh8+g z^UBOA(%Cg1(RK&#zZwi`dnOv58RtX5t6lS1WHs*_iG1q7+}btABe%(AsorzLSL9=p ztksO=(0%8(4rk4zy$x}XlD((nqXfskLrw$6Ll&q2XDg39mLcv_P*B9>qXOP{D{^fZ zk)rgu9TTs#TUhfkXCZ@r*c#45MVRf_;-@TC>`<`n=U(hRo3!d)0j{k*sn519kxgne z4`8nh3$~!(J;Xy{Y*L3ODCU2@VmNN6c#>@Lz3_~Vts2sun8Qk7>wWo%z`O|9mENHf zT7*}ef)BaN^CT5Ri7J%%r1dwbDmVNSHs03Evb3R=&>r*@*>5J2Ji7gc5kS+}%Lzf` zJbVzrZ3YCTcWC1l5;`5~K^h42zI!n)&`_JaFj;t!#t2=XS^paZpz6{o8~^h0>?48X z1RBP@{OmnrnQfx`bvEn>C&D@0Mh5ZB5uxMjF|dKs9$R+EeYLQiQrY|oj$t2<3EmwB z3dbsk~ZSkJXal5={$GNe+_^z`3 zD8|g8Xa#>nG~Q?VG>*Lzr5(98Lsjyc+btw;k$?FOqLF=Ewf``n>YX&Y52@_K{2YF$ zour{nGrTWM9gM~>cVarIg-#&FCM`@3b!%B{ZoZbX=unT4t>|_oolq&WFG~(wk-H`v2`Rl#U(BT0UNKWWI50@%UrJ?{sj%OV8>`Dxl-sX?TXD#6X1_OR zlzf>_0NW;=XnQpQ$~;wF4+UBbv|@W6S>Cf_v07v}#AS>-d){81XMR(m!Jdb6jWf=` zqRf?IVEnx}n1qAB7!JNyv5EngVd|ayL%1;ldine#KZk4u@7G3tZ978Vvp4YT*CGI8 z$orkJ0K#@ikHZ$4J6({C&@)`6Zrv6qV$C_F$8U;yOI2+pjc(|V@6OShuQ`2kpyf&V3};-AKGJv z6y;opcZUT>)7l*&Xh7ox+8n3tWso|lOo67c!Gie_jqnV!2_{~l1qa~#vns&CWmaw|dQ#tYC-cFS?w67h1FpsL-;>-9?&9MFJDprF>z#33*fNc|W=N=$QoMB?!+O zL(d}4)@Ou@DG{}0%??#DO3@Mj{(@q+VAbPK4XH8 zK`v)Oo|=0wOYIHV&jJVqL%cv4hh=nV1(aS}Utg&Ffqzo|D_Zp2^v}zOU_Jg({VUR-L9kUL{O3F0~sQejJ+SfQUTiZxltP_ub zbLv#ycPE7Fs4`^|H3xJOvl0qoBMa$BGdZL;u_i}^?haQlIVriMvI{{~CHAK%u`xsp ztXS-FCZp(-s)^XbC^1~I{y8GvvmW;!>1HvUVsNhfF${`Hpcu8k7n1kzeq!xZ*N`5kWlhSt!nQnmfaWVKpi?HkStXzd3k3A#XU{7EFB z3vJLzeY`z`%kGyz3c~xQ%upHvYJR*TGr{PliM04mRg0xB$+NjrX(Fz|XJJ$0iJsDl z9!Egs_Zn2s_=UK2mhMIxtry~p4nZF>eoP2lfZuEN{LE-Rk&CxSQ*Y#b0SIyGMBd*I z*4kDlOyK>WBLrhcGlNlhJ|Xl0;wpXUTf!FfI9`LXDWPYO?vN*C;>N)*L>elp#Ej!|m5E8bzb=l6&>~h7G>_&E z8rq?WXcJkTSV{v@;!OIw)X*x_r1cP31|v^owgECBY=>~UkO_3Xp4Mv0-nqd**q zT1*SHKTnn=R?k+b4jTngUcN*MdS!Dh422BgsJXJeXxk$VQtKk0C0d)J z(Rql*sVP}PRp_B1Xjn1hiurB)uU>Zx%^A1vw91m~_H>2nhy) zL-4-Eie|X4H$xG`D$|3w;}SXCj$0Ba)s3?XF)#xbWI`IcA-~`AnScXJp?gT~wmc#o zs5Gog6}DRuc0x^-j{yzuiupu{7kUg# z9=Mz^17`D%OQ``pp>uE#FgR6vO9e<+aEkvGNCF$HJqfhiq|;I|w1RZSP#3PAiE?$U zoCVzU;Hoih^e7o>ML#6`z@vG?J;jf}WeHj!J&pAOaaq(*p z!RwVe?9v{L26FI8m>nOb8PK7J!NMNz%FLw~7fG+IxKXU4x4r`Dx1u(>8IlE_)W4?P zpx41a^a5<4w?1>JL8ApyObpsUqiA*~ZOvlv^Xuq+Z3t;89qrz)g$>97w!Zw(<}@gM zF8E5~*Y1UV(qd+Q{Tmc}j^&y1f?7J<*ynI0#E<>+rr6>uHh$-XdKDr}Fo>$OFxjXD0KT zC|m7x%0|x@V9}4=5-3N#+sf8Td=bLlPc1Adg=ysVNTH~2FYh}F<{_N=VGt1S|A1mI zu>N6^2g@{C=!Z_I&dkD{){77_Uj|mu7d!a1&tq${WyL_{TVW}k2x;zi`n2J*E zZx%9X>a2-X(7jaDa*Ds(v>OuK;|Q!UKy^FO5qrIzxx%_j5L1@W5&+|5!Cn= za`vDpo&4H2G0UTJB8wgH{7z^Eh55jX=p+;wJq|^}lVkgV1B*X4uy~(deEs)X@ddA- zkGqIFjjMGR(*z)JW#Oq{>@5edSFQG-kcACmUb+Kw)Gj_6Sx9EtFzE~5W)VmkLfUxGJk_HH0=zA1OJm? zC>!1n{2NWPO?WdPF;4&eb zcQ3#8QnV9vp}Wj7vNMDoU;x8r=`AzU_(wKVL2rWcTbiT2nCupd! zGwCkWb$xwig*?xM%~>4WXNU6lXww}Zs5HfOsIM#*gBi0UCS>;sfdYd~8;bfgiQU9Y zG_5eKO37EpDgW@5C?P+`%qK+A1{T@nc}xn@5#>hApia7l+`;H8iKq$V zf+C`_m99CW3Y@xhV=NQ7>?6GYEogyyY5o}!GhR$l_nT1FML=r@8uh_J#`I3T#n4wG zKtF!{MHmuVsh8m)flGI)Y)^y16(8rfuk>el&y2Z#CEE9BW*f4-$4%bP#u(0F6N^Tw z)DIb4M8kJ8a{#EVluptybRrKY_aWsM$Wxi4aYBC0zkzWZ_Tb32V!NDwq#pr|zXX2$ z5h9^0qvsZSA502ugUWCU4@oew!1v#&2$wOrUdptQR4_#6oN;PNmC&emO5c!HlIao7 zycb#wtf;=7c^69Dgd7gGtqmabG^u0s{EEB)8g*pBQjx>v=uo1nvNmuEi;?{>D+$q( z(CK&P04xQ`IkXa(1Jx=zYC?YnBR2U7P2cgBjscPhq}>Y9@#^@vn{^&E&Zc#|lZK5Q z^N2qOV^);Z^#^Ju!K10vR#C<%6Qz23~<&KOIQj=62px71tCuc z=~l&Q&fpnN6K_446W=#**J!D`&I7^QhN+GMUI0PgR-8`2iO^k0NB$$9LWOMWuFqRV#O(TI$XG5245`317(IeLtYQ$;iVlIkL5k9_1>Q)aBLM zMpdIhC)wVkG8Sh;xYmQXAobV+6}iep5*4I_bG&zPKSgOl+=iDiaK1yfgk1u|wlY&6 z@-vOdr;k?T;x5Z)Y(uOKjBv`cBZ+bk-arZaV)F-X7JP{L2pUdWt92;GN%l?{5bEgf zUn+H8uMW<O(~tC;QR zgCfu2rda6Z*!+pEf1LQnFLV=DhgzIe!G0}**@*x(HRQwwQd}kBe-Wi4#36m31ezjE0EcnC%*KaO3ogl8MJ=BHV|Df= z+T7~l(b4{hL{pDir&i-YW!9##@KxIW6{^;iMBz}2t{$jOV{B*&nhuSCR+2j2q8h8! z-FXpcP(8U|Ef{8)mFnTzK8~Q^U6qFZeG`4dZ<-syi@Jl>m{%c(tua+ggGo-E;+V~$ z7k$|z8OOKktEqElRxeyQ^5C$5xQ?#bG0$xQQWkZvRUiHop?$$6cS z?tcNHS3Q5!%_p4^gxJ|J=p9u8u$abW5!qtQBkp+cZ z&|Ty9;M!U;gr~_Xs{;=Ax{INvgu`rHho>7vQmz0Il-UQ5Pjk4daQFu)qZ{CTy*-Qta4>kja?CtT&06F518Z zEi?WEVw&#$Op_cm`bz|h=wjNU%#!fTc8mfxIzy^m#eh(DVR_@sKaP>4rt!9ZpwMSt z{)8NiBDf(KPD%%yPZ~%L>3#MQj*#*O1{`iXJ}Y>?$}f^aB35T5IQd|F?7;m(D>y@i ztm8;bwBTyRC^3XSM-Nhk)a%N+5%JaBPoo&8;g76_CGiXu+CG8uwIHmut(=A^o4mtj ztOv07vnrwr>x-C%tf$Lmszud$9Tnl#yz5m*B9x1c5M+l%c{mw$!w|IMQ!A+;CRX9K zDQ_n(0-F4o^El=547`6qY|{4P2k;s2_Ic>XH1n$#gNLe9`{^3Tx4MP*{VR&v1NE73 zJK-ZU0oc~D`vXy%VF(?q_I;cLz-J@!4A!TRW%kPunFtN0YgSARu=_^+ej3%HA2Xo)i_ip280()z0bLbraBy>} z2~(67HlyphR|COADPlVT{Q9p^js)+XWe-$DEig0PZ%~%HwERA5i3&3G7S2xuc}51g zomNbmWa73118j!&Bd8*^gDHI z;C4Lkr}uwVA&0&~aNz72>L5c)Gny(8{*imtp_E~;UwTY9^OoTKTWV+?(jW`1XP!ii z)u44Jd=kdea*(3;qu>$Z8eJ_`-Ag?qYjF(1tteeLVhbB2^!}0qt1;KZyaQ&`*!1s}I z^G-XYxAFESzKs+~UxT6!`BniNhf8S#2%}1CfUe2ltKOLn`=bc+1 zNCtz#Is?N9-Ai%cYj^49L#51U2q|na-ac|tZ@g0rZi*p|EYe*j-AMZRQ4lnfXCTE@ zLrQoWtF7+#uoWc+hnV|#UWn|O>y6gI^Fl+tkoa!To!gvY8Bq@>`o93T{v}N3$}}w zUy1jmFeln@be-kM-fsh!RtFaNKVWuU>R8=_i*WcF)A^Pmx_+}ad$pJF=*if|!IoQC$Z6oDH=m}o^ z!E0f+8|=QIZ5`Ax=pG%_fBK4&13tG1rxf2$vahq?a|7reqf^4YMf$W5y&fNHujZ=s z%8sx09hO9VoJ#ykDzSuo;DhvW!1){A14LxqPoJ}^$kSN&74$>QYQl~@$Hqk+n_b^_md%xv9v8tOYw97U> zY6yDra2$tAM{#^yF3q9*;^H5B?>mD15xOaM4SjM$GCPUF{vPuN&?94} z>x5n&-=RSc{lZUB|6~5nlGE=;8d$zaHYcMzm4Pj7BP``|wLZGS&FXtZt1lzc$8<|F zAE-c;={JD{D=3?Lk$|_M!!#iD_GR9K?5dOaK(D(1?W^5rII-5uBN35e90Ia@d9(x6 z@h!hV%2Z^rz_Y}}r+>gEgZaHW_0x^`Y{4dMTAxG|-;BU_M$Eep=2j$Qy~5#LYKHHfR!1pu-?!L> zs+S`TTu55=zmX7)93pwL@z0K&(7qdhM&xmtOJkkMTOOTG*nyM@$Yd?N0|EUb5}-oE zH#UB?_Zy_wacOfSjJ)@oq}8Lqf!l>bRd0*(s6KK>7Kt);Q2Sc{ij@kLAX7!(i71KOv4zrw!@ z7SLVjz0Z=gdOX;n?;DC$_%L6N*Bp8R1I0E`b)7HL-qbuB^{HW zX797)@1?;6IRgtaaHqggwO_2-%ldbwoF>BJ66ra_crFm7LJFL zNT_E;>9{fk(jGuB{6~CW`d_2^BfX+-+($?Z7~4ao`58S0Y1(+E&r3w-vqAPd%UM;K z=B#Q4hp#xKckKCJexJwNhVb-?sy=l{Z#b(?<>zW8yzej6 z>rkmcE524z-=0B}UHn~d3k>dhHN`G;GI z)$wANFC*IxOHE&z!Uk*zVzo3uJ#3T=eg*U^xdrnGCSe>gMYu3MlJ8=Hf z`yZE|>HE-lC7btS{Ba%U6TspfqCEMW>Qs5sLLErobKX7GDJQ}scH5j%_vtQ!`zWS+ z+FE7T5!4=Drgh}4klmj1p4Vgj5w984pK3>*#)?gpbLfL$1=?cgbLH1ql!u=rZ$6N| z41<(5Sss_u9#llNN3hGx`^%v!bPpz`Z;YFhiZQBhqLk=8hu zyqbCgY7AwA;@0oM#wqQ3J=hvGe^Cv0>oJ|o8~S_^_x=Y~Z*NFgNxfy0m!x%kW5#hj zc1#4rmqK7srXjy;RWkf<^}b6N?z>D!W$J+7eSS#Rf7%%kGggg4GYfl6Ymh=JWw7OU zuRe~x#AUp{j-o+h!~St#W`_6h7%|{po8i7|ixsH2vz6Tk`gS=Lo(Wu;4to;rdW^8k z8KjsPv?gI+*qPtG;(Y-}J4oN)zF_?)r&4)A8bKte z{IT$>arW0)H7iXP(rnqip6iPP$pNyB&VT^rFCPlu$C(5-(mj=DPhPd$>{az95;XBHc=nM9y$KQa;KTOwc@=oLSy<(>Rqg5Ft;k}MD zsR@>(FoQ(s#MpCGVUl$JI76(O2P?Dkrx|&B)$u3DmkF|kxld@8n0-LZrca{?61+y$ zp^;vJOXJLcXT_UnZ4tReJ|P7r$nKA*&X|is276h8jdsngO(vSxv*c@rv$`wydSggkS!@FCc$3dLN416Mi=kM zV9Uz__%&1_Q7-E*lJ*HwC+-&ybKfRxfqR78Vta72Fgqyh`$+18KQFA=MfZ;ODMC_* zqvIp1Bmax#iGsZFt9@b0-?Q&f(tc-BZ}>6PibIJL_-@1@D{2n=V)jJa-(cfcy(<8{ zfnlP()hy)$x`{_>5>{$aytH*8;x zjeqf=O**hIjKRYD=yv~BD{IAWTlN8rusul!BryXR!oHB;J&Sk9#Zi~;@^)Zw?Ulqd zk4>z?TUlmdO?Uz=CbpNiqna_^Q)9CCNW&pAw!tFsFYeO%8DyyTzyd2MWv~{xUn~qf zI`TDG3h9z<*jVIj+3!lYBchfi`-zz^{9xR86s6uUhFj3UZ=ySL2H!5MfR29={cI1j z_w;e7`=BI_G^r04?ecs10BJWa+yxfNZ1Dx_f*oD2Be2xsUX4vvujM6byR-+&pPcM2i|IUDH#+jem?`mDspW_9{WZ3%(eM9ttvD{8d23d{HX0tB zMp`3BZzra?H!}*D9>M{2{L#n|19xCd*w$n?^E+FzWJdDn~p*p0f-#3fITT8r1pG z@$c5s6E%3ZR&JFB8#LIxQliM5*>8Jl4I9#JUSHsiGZPMa5YVZRMuF~Me z8oXPBI$o_7e_ew!G&om-YPmV;*MY5~RFsO3MdNaUJ(WJ(EVoTDLmy;HDN3bJ_3yB< ze-8m&PCsZV`>C<`xPf%}yPqb3!Sd<5So`kx1}1 zbw7g0;1n_XgN+$d4|Ct1e>Kc};7{B7iN%W8O zx$BnISZgcm>OIXhH)Dy7pHN-hT+`BG9ouAGTG?W4XtdTXt6WkuzNMzhUDw#aS*>&H zn%$nt`a3)|&G)gwHPzPI#%Al-YU|?r+%+xMO1HH#N=4^3TCSwI(G6O9$rW|(rPeC^ zBZ1c3*0HS|=+9}mx1n)GgSDxp##7yBW&bW)CDl#;(4f1qsyr#K@62?~Ns9gW^ za*ONS)|R^aYvS>BzVv?&PmeF-TJX=|RdLOno6F&t_Z@-pt|Un7xcH>%I8TKGi`I^*(^5k88E zlW<=Jd`=6m+!QOX)A^6WN{z-i4JHG=i026{{+_e@Avo(U!FeJ*O$Zm@iS=jyZIy+MRli@m_qM)aD=)UdzeZMLhY1?<3>D>2! zdGYv1r%t$Y<{XNvWlm@iM`Y}0(cmZzrfHCC;|BZ=Y2`T1)l%bjHG14l9=8jlW?7}1 zb1nH+(tyGjhz#aqK>R^iKZ9+)9D(xtE~;YC_s&lltazgtgz13F za`7gDPd$3sGQfhrJ(2qqVEYw2UVIyH(lvj-H@T2&J9N{1T|yzZVZVRgq~(QNZ}F04 z9nTixv)~n<%>Ssc;Nicvj{Z}+t>pOOw?Db;cH58MDoT9gL>oLi_4lH*|EJIIePZgw z-#_!#)u$c#(|-S@?Q8zG6Mp&Ahu^SlTR66`@ww`(#9n<^>&0SFtN)S)^I!kE<;OGr ze)hJIarTs=38Qn*iYp$xbLz`2tKXlUPS+N>OYy*o8SrztT=i8hGB`~zYpz;PLlrk5 zX#n>Bzz8-tZl_I-jT~13_#2#SS`gj{cq#UWGZ3}{HsZ-bxC!v3biB`pa3A3P*y3$N zxDD`8JnInN0Qd%;cESP7$9?3-5iS5M#Pc-5C4l94oLmjerka!Es+9+y?l-82po)e?}Pa zsw+8e6vDX#uj05&gsp&IUk$BBn9Jn2Wq1k@ZUQ`xrv%{>fRBs?zX-PjUV9DxnO1~z z0T<$FLbw9(X*_O(Hv&$>Mqew!1qAW<5N-q9i05I#0kmd8b_f%kiRTG~O9r-T?T}_t0Mmw*x-b4Ea$y z;1)bn5e@=wYXOfG1~jvbA_qNSdtJlSj?Pdx+&LKk}oasS8i*c;QXqmv$ z=8f^sGtTQD$<0@(a0rEPslY?APmt(A4*@Wr4P4o!=E3Tn^a+G z8d8!NH1#DMGNcSKr#zoz)LIgZ@_r$j)aK^6HV-wMhwe=@8gmmW2JkjmHu1a-meb(4 zE?>QUdRvB=xFHi*O-<20&~XNr`DgX%xH{cV3+{#0X3 z8w?|o%p)eG7&XZU&3(p0OkO1W(m}ExEW7x2Q@c8~zNGMBEu1`rOYXGf4yj0NGMAWw z34P!>9(N>ZQ@XBAC6-`fpXpG-3B%>d+~rG$A@9;}=TTdz?NooMCU?@G(n0z|^*p8V zLGpMiZVV89^B{b}c`yz~mo3qmuF;`BNloHX7i;<-IRNKbW|@v_s?2KSks zPW4T{Kz)PpN!HT`$(s0$uZ!ApmDZMc`4OJU#ObY%j?oLW1E}Bq{)1_q?WlBSJu>5 zdm5IwRLpy8?px8=T#p%S#lExWJ9U9*gmi0pU2|0fctJ`t;SQa}8*Q&^+K zrENjlN~G1FjKez%pZ5#+fk@YXHl*3U)MEo-xt3n9LEj*}4O)DQ2KzMli3ZPUF!k>$ zU8@EsX>f)HD>T@o!G|@tL4#W~*sH-0G}y1f;ipylS7~sn21_*9puy!D{DB4^*We2p z?AGAh8q}q6REwX}pyiC3lcB+DG&n(nQ#B}RutbA*YOq>^4H{go!BrYur@?j&KCZ#1 zG`LZN+cdaCgMAu&SA(Bu@Pr1>Y0w1Si2tPyihtMds&xLh^?NGkn$xhNuA$mhc8~KO zS82_XI#~KX=v6rDBG&k2YxN)>lg|iFpwQr|6s<}OJspU(XYbvXe$ngm%@2qTb+nbvkvG%>1 z;zfZA zW09xcT}Q>r8|T$k*Aya)>rlyJ8Y$~s5URDPOp+@f{?j=)seG7y&x3b<-!@XkqheYsE zEv-_NrL!YkGSyR9b2)C9Sr+kP z%Sv!*^tU9qv?6aLxI7IkcfGN4abvTa`>Cc;&j?@}K2S+Ea zmV0ussRUc5J@s{qmsC}`T98qH&-gs%{iPxAKl8cWURrE-PMp9h2WwfV|3B+l*0Q{+ z*{#+*74#rYwqs~tJwD{jMoI3CvUT=hcKVZY4djfj?cksWL1ccO|!B)U` z*Wf7aUPmscrvLY9&3D}Xhb7PkyNyDr8>}00H%!^kwxN9k?Es`AErX>{rW)rqST>|? z$Uy#gzyB!`7>9-=u*O)}U+Z-L;|mYPp$uH+mF-x zzf{wMoSYk?|HEO&U9px%PcxQPH^2oPKPl&?oZK5!fA9u4sI_%VZm63$<;EMT?puNd zU``olyLr*Fmit;3Ep1#@v#6nN{<6x3MXfhZQcI4hQumbtR+~6U~RI*%Kms7$dAWWx;m^H6D;Of z4ogTF(y|l_3F|;KlbL0jRBSaoWFU%V2;F>h--mPT1e03dKm>y&8rQfoRX2KQahPB- z)z&xSf>J`NiLs-l8!dD(++;{dFsn>a#pXKdGqaH7oas)xM%HHI%&{zD zu}lzWaEY!ReS;Y`38&(Py(u${j_5le7LKtg`airS>S=l>^aAgu>fFNo%d6 zxU4vedDTEnRe6}SuO66FzM#bJw3n5kUr|#TmpL$-xXg7;U*Ia4Kf9D08_QHjyQ|1i zhVI2!RR_^EF$DCobN0+RWHF#GOlP@kW7+l+$G5VxV%cS)V@7!%mmN!?Ava@2soh?} zT^CEGzAJUjDaO!H`|bJ*<`vE^o@*~HgC!~B#>FsZ%$`%~nl-1W#N~7pIm)^5v8=K} z(QcdLv~xMJG-6?TId{Xr6i0EP&0fgm#!^erv!(X(Ii;vAZ(wqnIJ>mmHDgXOGi%(0 zST5|OYfA3KDL1*mETl>HZelE(6|@(-<^uuh#!ZT433F#VY_7TXLiC^utiUR9lVjQX zaMMPkqiBwkyD^qs=A1pxMTz)RG;so%aqgynkUfQ)63ZcZyNdE$a~*;Ux{)8tDV|-9 zE-4Wlr2=d;ck{p;l~EdM+%2&jlC9Q+86_kF^cN&B^@14D>}j#=8APEFU5QD?rA{E+ zt+8y3G?y@Q4tHBDNv+Otr`@F*1}+#k&y~%dQ9e(=*ds$|hlZ09Pq!DtDi&hm;5y=P zg}L+dCQONrz0SBSSmv^_*@Z6XsjGZ8841iab|=?$0UWeD9%V-yiW4T8+liadY=*AH z7Gc~B{jA|n`V=jcVkj0;&uG)LmQX^|i8eLICrz2I&BrWpzJQ5TorYO_df7aoM4NP3 z0%OBW&X4BksNP1Z8N0F#ZpZ*`#t=Om^>g3~8F9wkRA19-)t!-Og6^kSqbc!j3cMDV ziwp zMk(}CgVisq#j7ouSMbpic zZn+rgghWM?34)p9`r3~OaY+gKlF}#{3|C#XWI?Xy_9aVlr#Y{>D#3vIo&iz< z_Y_t7f4~72byzOOuR*#0{|i2jqeW}ZQfhW=?T2OYlEwAotK5yvEyz<>$<(C(Nk3XB z(>s9ZiB@a!5X%PEX}I^JHB#?9eLqMTp88;dFg&Bp*f2abC=9oB{!fy||Gu{5)Z(NX z%_cqgCIXE&;Ajhnq}cly@SCB<44joSYC19i0g*fKl;9y8b+jzhP%w*dMi$0(b#5av z86B3g8h@=Oy;Kf6b7mR9K`BEc@@`ZUw7)sHd{(K2sh$h*ld~8H|Jsk$ZUC7 zA)5D$hTK6Ic<-VqhC>uo987(Kem_J!0}s3>;LzUaKq2XJrv1~XoEPJsLqkl`dfS_r zH2y)mV(c&(|FgE!9=_Uk1P1+dex@K@<%bYF1DQt3FYs)rRa;{;;02GkpW4S9_i_{m z{r)WqYJv9w)OL|>e7mK^C^v9N`9IRj|E#4{|D~W#eXI8Jz~0kaajS--_A=q98cXE~ zN7oj-kfPDCQP#J9RiJYsDlwA(z@M&BMCU?v5w0oC z@qn(o&HUg0y1#y}U%&3Z=b!F=I2hT%^r+Y=3_%%HVd#n+WEG z2=9lu6@3!4bB4Wno8rw4dWj;Mfr8xMrOup-y!Rr?c^MVv(u>um(iSr)ncI{+AWUNC z9e~-+)IY=akY4b1++l0rm6UoTi*NT`{1d%qji#hm$U|3JFS2%+BqA;3t5P2dU0k0= zsa~I|`r2@re}p=4eKJk!LsGP<&YWwVI6j<@v)C~KcT9}J`z}D<#Sxnk%JnzM)&J6T zn|j@UA2KN$+K5DYQ9o%K{cJS$x;JSr8;y^n3~p0uuP{lQjsWI1?ZPLjy-(}5?WU6< z1}L%_y_!X1mf6<5kPJ*OrP4FW(vCIwORPRwuKoRhJeR*upRCLl%H2{1TwVM3?;n5+ zbDtmzDuS16YFh_4X6%H4?CrZB< zGTyRqzsR5*_6>YUCFvI#;N)3N`ODA9{k&PZQHGqQb}M^R*t{u44Is>gY&(#$MO5^XYo7jMWWp>iyT~Jt_X{ZDr!!!6y#Wky; z_^K}mV&F_W8=SKh;u8zZG?jVUj-vY{QkqPe8h4?eI z7q><0NJ28)7I+$s`DNl-qA~7Z?a##bX0palByIQrkn4fPMu3n~-i8OLWW*nj zG=OC8lyW4JFgscGQ7D7W2@*-H+7FCdIdRi|6sum9`gF{aXpqFJtI=+3)vn+^U5Hi5 z@@!R-N%c4zk?wq9clYBy>rS-_ zljuH!;f6gbyiZqBA0l$~X-w4eiTaS-`$-{FpG?#Gkj$qcGb>yK;B9N{nh+p=0fc_z z=6l>VAg+cc*Z%;S4`hA{${oK;a%ua#7AE*PlUM$TZwvvroo_gH`f+V4iEs2f-=IDm zCh?67WY{-ICVcu8J1=*3rZQe1G@9tu{fgVS`(pIEDwc1u6`R!O9#@}gf%ck8HGA|+ zs3F%U({jyWH)KXkogrgPlLc}%K&FAvz9hcgKLlhZKt4^m0^|!oG6-Kj*V90T0_0mj zW&`BM(TTf%I+^RWK<337E@FE-lb<$^EsL?UE4kTIfPLDkI{(>cER_5s{xjtK=P+)k zMi3iY$j4Aw^g)<6m84DkU7KR69*JX+E z(&H#_wv0&DVo#xF9F5VysU#L78M?c)BV0!!ap_Ieu%x70$=SFDo`C;6()$qHHb8pv zxE~;W!yvMVT{~T_O74b0kgK<(N^Yo<>CA|*tsaJj_@gg zBws9#qO!8KKE_YX`ZLUzN>wY<34CeC4*U&eq<@V%8~QJ?q$tsA#OWn>{J$@zUesRH zO59!_!LwQO_QG&#)(E*Rd|l)d*+)jLr5zc-VSAArwJEhEx9J&zf+Y5#SjRqwFE~<9 zNdu+Q{q%Ul_Gvz*Xd6yLb!J{Cl8sAu0ca|ZpAH42!i_rb*B6L6Ibf+KWg?bZ0`p+yvca|aDsYOs|BE8t{ zPHlR-cE7O*-9PGdH$Pwuls5=;IKBwoS>}hM`!kEs{ne=eo_bV~V;LHDbR(4A#S_q$P< zAFS@z7NL9RB6R<9O7|*ntm)eQ40P}O8PX;Ly+Rw))mXK-u5W#Bx0_=d5jt}Gs^l`r zUjpf0ZObvp*MZQEgr;PJ%mbMZ5NwEqJv5UttALE$okU&>WT-2NYz5N)nk4cdkh5!& z$Rv=NpHCu>0-@aieSJOvq;qW&`2>)D46$D32_W+p@!!?5#mEyLz#fXIZX)SkfCryc zlBfQ~%&{r5!EoTZnkvPwc&v7wa1JtW2;|n;r;>h@!%ro%`1FoY#*U2tjypUn7|%B< zS?47rjNd{NW_Bbb`{G<7G)o+*Hsk4dYwdR zWGSEA%mFfNL%3)vNhFzbHZ=3kKuTs!-*NUigyo>h%~AF}g1;6^k@_o+QQlmCQC{IC-YZ0G(^09RsXa%LXUx`Bpei66ew z**QO1tf#GvvY=`IUaNZ(KP2+EK&C1(1Vr}(nG2A8K;|7H7UPo1V%?|*^*x_nh{doi z+ih1EhMdL78etNPbuYqVbhdWES#*1+B&ts)yqzlUV-FL@g8HoSs+Sej2HZNnz>A9;(w*^qoDOcMELP+6+)(vEvW0bGe^ zk_>w$J%xrz>^uS)_DmYls8jkRo=M-X*$B|gF{8hSHHP-Fotw=!sKhIfnZdUV#6b0? zqo<>2HbDLxNawHGa*WIp7^y!%RsuP0ktGrBB~rrXI~lQ<$#pkmX7I_k>FWszWHth+ z?zg^Sa%}@L7a$K%E)1&1e~ipKfSe7GG0OFj$W(jzm5TX5uPMk}hmlQtnR4C(r1N3P zMbI%q;w186AR__t2_Um0NtsUrIi5`-e@rr?f{15w>yWo#qtYltgf59^&HynMTj2Xj zXXlP*V9hXz*PVcx>~&{C0bGgK9fk~hUF*5c1<2q()VW7RJMqj>=b7V8W9AoOjSFH8 zRSH+{X_CpMEylTseT&K`7CVjt*kW8#@~@li{N(N9VLwd47VAtFVLpq+=$u`)SnGbe z0p{}Y@Qtd4{t23P=2_EL{q!beBB`^f0gbL1$z>4of)R&^k8#Olv44hCYK*hR0#XnJz*iZ620d0TvM!LTPib?$T)llK^D1flx7)$iV$APSJ4TQER?^wGFt5xds?Y+LM?QAkj7?<0!+sA6BG z*rP%_y3?F3WWS===~+0C={v62m$$`!Rq0Lv7cA$d8K=I zTkMw^s_GU#-|zAnXTRJu4OaoMInpi~W|e{3WG3t#t?W>3g?g-`5uV8l`)e(tWMceO|GT zw8g$wvC}Li(6pyVu|KESC)#4ap)7w!S^k`|{C>q=ZHxUG#eP(=A5-l2D)z%|vD0)W zuygNa#ZD{jflS|HihZUn_7#f#hGM^|*gvV*A8U*Kin9DM#ePDuZ&2*V+hV8LaA4J5 zdXFkVdTuE8lZyRhTkKtmeYNUwU8=`jQ|z;Cv3D!>9>u;{u`l!OWykl&+hU*dyzDnu7OzFNt>3&hMpKVKbdg2Ovtaqhir|$~_nZB-4NuURPE#>Zin8UJ(0P#XhLmhZXym z6#HCT>}M4FfMOq1?B^8wGi|Xyq}Wf3w}@}_(Aplv{Q5>;=Sv)7`{~uT*e4YGdBuKF zvEQfIueZfMtk_Q|_EU=en)DREYSb3{KE-}Yv7c7#&nfn2+hQ*%_KS-Bl42iGmXF5T zd5S!$*l#NKTZ;V~ihX%o?8g-QGS%Z&s2=w+)#EzbVn43fS19(Civ1qNzN#(u6N-JM zVqdM;H!Jo`TkIzl`)bABrPzlQ`E7QK`(ujzmePHhVt-ck_Z@Aq4=VPfiv5_f{FBP^Lv692R_r~> z@|%_J?^BlF*B1L>#ePNUeog5FaxUq-PXZj1d9#ePk(-%#vND)yPS*v~2UVde7=DWCtx zJDfGFjnMMPld8w_Y5i>8`;hdn)-oHP6yN9w-;$$tk+&?iI^FStWT71VMD<6YyZOOV&`%fhJF*R% z#S`Qib}>5(^*o|-HPU@&V~^NSO70m>%k&PyhC!V-4#>(0?NpPaooeVlK=W<^cCx|8 z?%zFGdj5Gq#(|u-Z3+UUIuL0=Mm`9He;=2z<$MYVCA!Ztp96B$_CZGe9LTAl8CQ;+!Ne=u!hRRtH@f6X<};+QlURYC5Jl!5$jC^B5vqD{!fHjMF;_!#|r00>o!Yj_N~F1r>4 z9GwJmG(bKDMAq3j*Et|$XWu$s0`f?Z>nlLQ8h#VVu|Vb~kbacI^^p_7`U7h`51DI0 zt`#fL?l6aM<<|f?g{pB2${Az)ZV$B=rC)@MtQx^S^dsK;hYdU3XPMoQkvTsj4+D|s zFGearB-$|Y8$c-e`g{n8%mG;DGeAN=oCDJ7`WNN@CY2NT#`8cs$hI!g0yzg(E@9zX=&xrQuw^2jrZ~MI286 z30vojKpKI!Tn5q^^ug;u^^T&Wt^Lh5q0=X2F{4|h>pari3p0ap&6 zEQP#iC2SRP?Ew&TLawj7vu1+|Fa_xbPym`f1WPwofEqFvB z?*nq-CCO2E7Kpr8z~y`f$eEzdp9hjLaYHQj6p%I0-|PMjAo6Aim-8(k^QO*}OHPpO zbO_b;`;ZCeKb?0mhu2~)5K0~y0CFy<;chF#u|>|ZeJrq82{Q5?{gQ~!s>PF(laVuI z_c?@Ek0MtI3USGhF{jU-4P-tEnUTPMo&>TisNo!tP}Bbcl5yq8X}W71LhRp%%rVDK z$SbfFP1q~%1tQ+OW_Oe(WtH|f< z=qS!DldDp(T#(OWHF|FYd)vf0b67A>n|I=n89ZQAafWo9Z8WmEi9#ONb`uIrtoP6! zv{ThcBfNd*&MjMbskJNKziZ>$cJ16=o{raV*i|^Rr-2{2kMAA6Z~M?M=c0x0zAZbQ zjd7etJen<(@>AvU7~9_#rwa!QM-EkL`FH@k{0?J-guRU-o_z2S=a0CyKccz~J^$9= zc0$;*5a%rCa8h*KFvn0Ywo2=A)oR4Q?YD<6W7>P9Y@XBbyWJX0DwniSeBuSYmC znNAUiYdGf{HbZtgl9_68C|fsej~|t9>fS_^s>I`^%4inPmvp#5fSBV3BC0MQ5>9@B z4X~!be#Df52CEz_l7rEP(21K1hrrR{>GH4%9N9RAld}1wF>Fofey$$L?U;W5hPuQ!JdmqO0@-}t6(AMmjJB7i z4M4<4-f94r0IJ`93YT0}dXQ)#jNl2Pod}@);ZoonsO<#|vfx{(x+EJn;k>L($RRh2M1%8~X z(z2WR4Zmqi{<%8ACIsTN_jqy?yPr1->o)YP@7oyR%KW0e-c(@Yrl_9G@TMMc)uv-} zK7Bl}VGAzHscZT{s@YK?j^8;|L9eoMTxIP47FVVkXrGw3?7+ZT88x9|eP2|{)*JD3 zwlwAY2RUMk3>((V$dD`$U6SZ|oz;BWwugH>U!Z58!?Da%83FvDmydHeth9_lIgYn_ z9jh1-Vr-z_KwXQ|upJE%Btoi+c2lJWMI5$Cal>c=w;!vOL%ov_GnduwUTT4jy(p(t zpD2zo9LKrIs+G?d$Hwf((G5~^-jz&~FA=RJOK8*(@ZV)}+CCeXau^%(g(?D6OvhkJ zXHMRT&@?ohl`xMH*$E1ICb&C@v(quLG+S_@6bR#Z_ugGNp%AB_?b*I};O#ioZV-o= z+4Hh+&=*wWg)Qh@97V9k--Cr(xlqDMa#=Kz35R7dAl_TXV2(ITqjyZB zVQjYU$1^6_lBaQT>D=f$>jPW2?HMd&^IMNJ3fm7umZ*0(O21OXlq*|ehGZ$n&uAm1KswXYfD@w z8Xs3EC8p4r%|T6AwwS9MYtosqab=7&${nPc1jR-&bFnhYK7)BkAVZru)-Ym{&}8-i zVrYG86bAt}&|9WaD;n5MJJANeSZMdQB5MxdT;N7w8+v0AR(3-#tlXK$;em;o#<5cxN^z;T=!3?m- zDb0rpz_k-C4E<4G@3gEeMK^m^R*b40C>@B`8~3sOR6132GMKY&Vvub&sNcXQuh#Li z)oN@`D3*q-rgTT|oo?YB2ns$x>@L)&Xf_pME@V*CLbc&y?x3APS;wi`r7F|laNSBh z@L8L$Y1f503$UOb0yDCbS|C_@#IcPx3?i5Ep&e+KUFI1$d>b^0?jI@H%QTqVi}#lx>MMi z(wCUX4tH7Px3-+lzNC;fjk{HeaeDLC1tE(RM~??Bcj%66j(UFn0sTT> zkDQAH!y1*48YQ zjuIa+iLxtDJT;cp0nfrt4F4`;Iu8eD$1BnTK`_jeFr_TiaAa+EoM&MR%;aB?_&7IaPyaN#!1#S15V4?90nuY)2bNz+2<)2|7qDT zIdw>xA5((R{>iA7nEEd?S8O)C-fo7Z=hEIVHX_3c(l^BaFm{E*j2*qqaGvZM(f Date: Wed, 19 Dec 2018 20:04:54 +0100 Subject: [PATCH 113/359] moved shedlock code example to module "spring-boot-libraries" --- pom.xml | 1 + spring-boot-libraries/.gitignore | 5 + .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 49502 bytes spring-boot-libraries/README.MD | 38 +++ spring-boot-libraries/mvnw | 227 ++++++++++++++++++ spring-boot-libraries/mvnw.cmd | 145 +++++++++++ spring-boot-libraries/pom.xml | 144 +++++++++++ .../main/java/com/baeldung/Application.java | 14 ++ .../shedlock/SchedulerConfiguration.java | 0 .../scheduling/shedlock/TaskScheduler.java | 0 10 files changed, 574 insertions(+) create mode 100644 spring-boot-libraries/.gitignore create mode 100644 spring-boot-libraries/.mvn/wrapper/maven-wrapper.jar create mode 100644 spring-boot-libraries/README.MD create mode 100644 spring-boot-libraries/mvnw create mode 100644 spring-boot-libraries/mvnw.cmd create mode 100644 spring-boot-libraries/pom.xml create mode 100644 spring-boot-libraries/src/main/java/com/baeldung/Application.java rename {spring-all/src/main/java/org => spring-boot-libraries/src/main/java/com}/baeldung/scheduling/shedlock/SchedulerConfiguration.java (100%) rename {spring-all/src/main/java/org => spring-boot-libraries/src/main/java/com}/baeldung/scheduling/shedlock/TaskScheduler.java (100%) diff --git a/pom.xml b/pom.xml index 5aa438132e..bc8f8064a6 100644 --- a/pom.xml +++ b/pom.xml @@ -641,6 +641,7 @@ spring-boot-property-exp spring-boot-security spring-boot-vue + spring-boot-libraries spring-cloud spring-cloud-bus diff --git a/spring-boot-libraries/.gitignore b/spring-boot-libraries/.gitignore new file mode 100644 index 0000000000..da7c2c5c0a --- /dev/null +++ b/spring-boot-libraries/.gitignore @@ -0,0 +1,5 @@ +/target/ +.settings/ +.classpath +.project + diff --git a/spring-boot-libraries/.mvn/wrapper/maven-wrapper.jar b/spring-boot-libraries/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..5fd4d5023f1463b5ba3970e33c460c1eb26d748d GIT binary patch literal 49502 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%0A$pwhjXzyA0ZzErH{1@M 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 OJOEd-=rxTO#Qy`$*1Hh^ literal 0 HcmV?d00001 diff --git a/spring-boot-libraries/README.MD b/spring-boot-libraries/README.MD new file mode 100644 index 0000000000..016d2841d7 --- /dev/null +++ b/spring-boot-libraries/README.MD @@ -0,0 +1,38 @@ +### The Course +The "REST With Spring" Classes: http://bit.ly/restwithspring + +### Relevant Articles: + +- [A Guide to Spring in Eclipse STS](http://www.baeldung.com/eclipse-sts-spring) +- [The @ServletComponentScan Annotation in Spring Boot](http://www.baeldung.com/spring-servletcomponentscan) +- [Intro to Building an Application with Spring Boot](http://www.baeldung.com/intro-to-spring-boot) +- [How to Register a Servlet in a Java Web Application](http://www.baeldung.com/register-servlet) +- [Guide to Spring WebUtils and ServletRequestUtils](http://www.baeldung.com/spring-webutils-servletrequestutils) +- [Using Custom Banners in Spring Boot](http://www.baeldung.com/spring-boot-custom-banners) +- [Guide to Internationalization in Spring Boot](http://www.baeldung.com/spring-boot-internationalization) +- [Create a Custom FailureAnalyzer with Spring Boot](http://www.baeldung.com/spring-boot-failure-analyzer) +- [Dynamic DTO Validation Config Retrieved from DB](http://www.baeldung.com/spring-dynamic-dto-validation) +- [Custom Information in Spring Boot Info Endpoint](http://www.baeldung.com/spring-boot-info-actuator-custom) +- [Using @JsonComponent in Spring Boot](http://www.baeldung.com/spring-boot-jsoncomponent) +- [Testing in Spring Boot](http://www.baeldung.com/spring-boot-testing) +- [Guide to @ConfigurationProperties in Spring Boot](http://www.baeldung.com/configuration-properties-in-spring-boot) +- [How to Get All Spring-Managed Beans?](http://www.baeldung.com/spring-show-all-beans) +- [Spring Boot and Togglz Aspect](http://www.baeldung.com/spring-togglz) +- [Getting Started with GraphQL and Spring Boot](http://www.baeldung.com/spring-graphql) +- [Guide to Spring Type Conversions](http://www.baeldung.com/spring-type-conversions) +- [An Introduction to Kong](http://www.baeldung.com/kong) +- [Spring Boot Customize Whitelabel Error Page](http://www.baeldung.com/spring-boot-custom-error-page) +- [Spring Boot: Configuring a Main Class](http://www.baeldung.com/spring-boot-main-class) +- [A Quick Intro to the SpringBootServletInitializer](http://www.baeldung.com/spring-boot-servlet-initializer) +- [How to Define a Spring Boot Filter?](http://www.baeldung.com/spring-boot-add-filter) +- [How to Change the Default Port in Spring Boot](http://www.baeldung.com/spring-boot-change-port) +- [Spring Boot Exit Codes](http://www.baeldung.com/spring-boot-exit-codes) +- [Guide to the Favicon in Spring Boot](http://www.baeldung.com/spring-boot-favicon) +- [Spring Shutdown Callbacks](http://www.baeldung.com/spring-shutdown-callbacks) +- [Spring Boot Integration Testing with Embedded MongoDB](http://www.baeldung.com/spring-boot-embedded-mongodb) +- [Container Configuration in Spring Boot 2](http://www.baeldung.com/embeddedservletcontainercustomizer-configurableembeddedservletcontainer-spring-boot) +- [Introduction to Chaos Monkey](https://www.baeldung.com/spring-boot-chaos-monkey) +- [Spring Component Scanning](https://www.baeldung.com/spring-component-scanning) +- [Load Spring Boot Properties From a JSON File](https://www.baeldung.com/spring-boot-json-properties) +- [Display Auto-Configuration Report in Spring Boot](https://www.baeldung.com/spring-boot-auto-configuration-report) +- [Injecting Git Information Into Spring](https://www.baeldung.com/spring-git-information) diff --git a/spring-boot-libraries/mvnw b/spring-boot-libraries/mvnw new file mode 100644 index 0000000000..e96ccd5fbb --- /dev/null +++ b/spring-boot-libraries/mvnw @@ -0,0 +1,227 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/spring-boot-libraries/mvnw.cmd b/spring-boot-libraries/mvnw.cmd new file mode 100644 index 0000000000..6a6eec39ba --- /dev/null +++ b/spring-boot-libraries/mvnw.cmd @@ -0,0 +1,145 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" + +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/spring-boot-libraries/pom.xml b/spring-boot-libraries/pom.xml new file mode 100644 index 0000000000..083ab443f9 --- /dev/null +++ b/spring-boot-libraries/pom.xml @@ -0,0 +1,144 @@ + + 4.0.0 + spring-boot + war + spring-boot + This is simple boot application for Spring boot actuator test + + + parent-boot-2 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + test + + + + + net.javacrumbs.shedlock + shedlock-spring + 2.1.0 + + + net.javacrumbs.shedlock + shedlock-provider-jdbc-template + 2.1.0 + + + + + + spring-boot + + + src/main/resources + true + + + + + + + org.apache.maven.plugins + maven-war-plugin + + + + pl.project13.maven + git-commit-id-plugin + ${git-commit-id-plugin.version} + + + get-the-git-infos + + revision + + initialize + + + validate-the-git-infos + + validateRevision + + package + + + + true + ${project.build.outputDirectory}/git.properties + + + + + + + + + + autoconfiguration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*LiveTest.java + **/*IntegrationTest.java + **/*IntTest.java + + + **/AutoconfigurationTest.java + + + + + + + json + + + + + + + + + + + com.baeldung.intro.App + 8.5.11 + 2.4.1.Final + 1.9.0 + 2.0.0 + 5.0.2 + 5.0.2 + 5.2.4 + 18.0 + 2.2.4 + 2.3.2 + + + diff --git a/spring-boot-libraries/src/main/java/com/baeldung/Application.java b/spring-boot-libraries/src/main/java/com/baeldung/Application.java new file mode 100644 index 0000000000..c1b6558b26 --- /dev/null +++ b/spring-boot-libraries/src/main/java/com/baeldung/Application.java @@ -0,0 +1,14 @@ +package org.baeldung.boot; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationContext; + +@SpringBootApplication +public class Application { + private static ApplicationContext applicationContext; + + public static void main(String[] args) { + applicationContext = SpringApplication.run(Application.class, args); + } +} diff --git a/spring-all/src/main/java/org/baeldung/scheduling/shedlock/SchedulerConfiguration.java b/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/SchedulerConfiguration.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/scheduling/shedlock/SchedulerConfiguration.java rename to spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/SchedulerConfiguration.java diff --git a/spring-all/src/main/java/org/baeldung/scheduling/shedlock/TaskScheduler.java b/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/TaskScheduler.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/scheduling/shedlock/TaskScheduler.java rename to spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/TaskScheduler.java From 1a955fb01833eb0a61f4589058e393c64532a123 Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Wed, 19 Dec 2018 20:06:17 +0100 Subject: [PATCH 114/359] updated README --- spring-boot-libraries/README.MD | 34 +-------------------------------- 1 file changed, 1 insertion(+), 33 deletions(-) diff --git a/spring-boot-libraries/README.MD b/spring-boot-libraries/README.MD index 016d2841d7..cc32ce8355 100644 --- a/spring-boot-libraries/README.MD +++ b/spring-boot-libraries/README.MD @@ -3,36 +3,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: -- [A Guide to Spring in Eclipse STS](http://www.baeldung.com/eclipse-sts-spring) -- [The @ServletComponentScan Annotation in Spring Boot](http://www.baeldung.com/spring-servletcomponentscan) -- [Intro to Building an Application with Spring Boot](http://www.baeldung.com/intro-to-spring-boot) -- [How to Register a Servlet in a Java Web Application](http://www.baeldung.com/register-servlet) -- [Guide to Spring WebUtils and ServletRequestUtils](http://www.baeldung.com/spring-webutils-servletrequestutils) -- [Using Custom Banners in Spring Boot](http://www.baeldung.com/spring-boot-custom-banners) -- [Guide to Internationalization in Spring Boot](http://www.baeldung.com/spring-boot-internationalization) -- [Create a Custom FailureAnalyzer with Spring Boot](http://www.baeldung.com/spring-boot-failure-analyzer) -- [Dynamic DTO Validation Config Retrieved from DB](http://www.baeldung.com/spring-dynamic-dto-validation) -- [Custom Information in Spring Boot Info Endpoint](http://www.baeldung.com/spring-boot-info-actuator-custom) -- [Using @JsonComponent in Spring Boot](http://www.baeldung.com/spring-boot-jsoncomponent) -- [Testing in Spring Boot](http://www.baeldung.com/spring-boot-testing) -- [Guide to @ConfigurationProperties in Spring Boot](http://www.baeldung.com/configuration-properties-in-spring-boot) -- [How to Get All Spring-Managed Beans?](http://www.baeldung.com/spring-show-all-beans) -- [Spring Boot and Togglz Aspect](http://www.baeldung.com/spring-togglz) -- [Getting Started with GraphQL and Spring Boot](http://www.baeldung.com/spring-graphql) -- [Guide to Spring Type Conversions](http://www.baeldung.com/spring-type-conversions) -- [An Introduction to Kong](http://www.baeldung.com/kong) -- [Spring Boot Customize Whitelabel Error Page](http://www.baeldung.com/spring-boot-custom-error-page) -- [Spring Boot: Configuring a Main Class](http://www.baeldung.com/spring-boot-main-class) -- [A Quick Intro to the SpringBootServletInitializer](http://www.baeldung.com/spring-boot-servlet-initializer) -- [How to Define a Spring Boot Filter?](http://www.baeldung.com/spring-boot-add-filter) -- [How to Change the Default Port in Spring Boot](http://www.baeldung.com/spring-boot-change-port) -- [Spring Boot Exit Codes](http://www.baeldung.com/spring-boot-exit-codes) -- [Guide to the Favicon in Spring Boot](http://www.baeldung.com/spring-boot-favicon) -- [Spring Shutdown Callbacks](http://www.baeldung.com/spring-shutdown-callbacks) -- [Spring Boot Integration Testing with Embedded MongoDB](http://www.baeldung.com/spring-boot-embedded-mongodb) -- [Container Configuration in Spring Boot 2](http://www.baeldung.com/embeddedservletcontainercustomizer-configurableembeddedservletcontainer-spring-boot) -- [Introduction to Chaos Monkey](https://www.baeldung.com/spring-boot-chaos-monkey) -- [Spring Component Scanning](https://www.baeldung.com/spring-component-scanning) -- [Load Spring Boot Properties From a JSON File](https://www.baeldung.com/spring-boot-json-properties) -- [Display Auto-Configuration Report in Spring Boot](https://www.baeldung.com/spring-boot-auto-configuration-report) -- [Injecting Git Information Into Spring](https://www.baeldung.com/spring-git-information) +- [Guide to ShedLock with Spring](https://www.baeldung.com/shedlock-spring) From 5aa5e48146252b2297c2a1bcfae626110574cb0c Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Wed, 19 Dec 2018 20:52:35 +0100 Subject: [PATCH 115/359] fixed module name --- spring-boot-libraries/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-boot-libraries/pom.xml b/spring-boot-libraries/pom.xml index 083ab443f9..c28128c5f0 100644 --- a/spring-boot-libraries/pom.xml +++ b/spring-boot-libraries/pom.xml @@ -2,9 +2,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - spring-boot + spring-boot-libraries war - spring-boot + spring-boot-libraries This is simple boot application for Spring boot actuator test From 6abaf50ab5b90d3dcfec61d8f2c3a29d4fc91f3b Mon Sep 17 00:00:00 2001 From: psevestre Date: Thu, 20 Dec 2018 02:42:16 -0200 Subject: [PATCH 116/359] Code for BAEL-1996 (#5933) * [BAEL-1996] WIP - Initial import * [BAEL-1996] Apply formatting rules * [BAEL-1996] Import UAA modules * [BAEL-1996] New directory structure * Merge upstream and include BAEL-1996 in main build --- jhipster/jhipster-uaa/pom.xml | 22 ++++++++++++++++++++++ jhipster/pom.xml | 1 + 2 files changed, 23 insertions(+) create mode 100644 jhipster/jhipster-uaa/pom.xml diff --git a/jhipster/jhipster-uaa/pom.xml b/jhipster/jhipster-uaa/pom.xml new file mode 100644 index 0000000000..e8ccaabfb0 --- /dev/null +++ b/jhipster/jhipster-uaa/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + com.baeldung.jhipster + jhipster-microservice-uaa + pom + JHipster Microservice with UAA + + + jhipster + com.baeldung.jhipster + 1.0.0-SNAPSHOT + + + + uaa + gateway + quotes + + + diff --git a/jhipster/pom.xml b/jhipster/pom.xml index 2bf7bcb233..5132c6dc95 100644 --- a/jhipster/pom.xml +++ b/jhipster/pom.xml @@ -18,6 +18,7 @@ jhipster-monolithic jhipster-microservice + jhipster-uaa From 547f99925fba49b2cb8515ffe6e8486a35246802 Mon Sep 17 00:00:00 2001 From: Shashank agarwal Date: Thu, 20 Dec 2018 10:19:27 +0530 Subject: [PATCH 117/359] Added the code of Replace char in a string at specific index (#5869) * Added the code of Replace char in a string at specific index * added test cases * Renamed the Test class name end with UnitTest * Renamed the Test class name end with UnitTest * Renamed the Test class name end with UnitTest * Replaced README with the upstream repo --- java-strings/README.md | 2 +- .../string/ReplaceCharacterInString.java | 21 +++++++++++++++++ .../string/ReplaceCharInStringUnitTest.java | 23 +++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 java-strings/src/main/java/com/baeldung/string/ReplaceCharacterInString.java create mode 100644 java-strings/src/test/java/com/baeldung/string/ReplaceCharInStringUnitTest.java diff --git a/java-strings/README.md b/java-strings/README.md index 2713f69d58..7ff1b0ceea 100644 --- a/java-strings/README.md +++ b/java-strings/README.md @@ -2,7 +2,7 @@ ## Java Strings Cookbooks and Examples -### Relevant Articles: +### Relevant Articles: - [String Operations with Java Streams](http://www.baeldung.com/java-stream-operations-on-strings) - [Converting String to Stream of chars](http://www.baeldung.com/java-string-to-stream) - [Java 8 StringJoiner](http://www.baeldung.com/java-string-joiner) diff --git a/java-strings/src/main/java/com/baeldung/string/ReplaceCharacterInString.java b/java-strings/src/main/java/com/baeldung/string/ReplaceCharacterInString.java new file mode 100644 index 0000000000..e8d1ce2d8b --- /dev/null +++ b/java-strings/src/main/java/com/baeldung/string/ReplaceCharacterInString.java @@ -0,0 +1,21 @@ +package com.baeldung.string; + +public class ReplaceCharacterInString { + public String replaceCharSubstring(String str, char ch, int index) { + String myString = str.substring(0, index) + ch + str.substring(index+1); + return myString; + } + + public String replaceCharStringBuilder(String str, char ch, int index) { + StringBuilder myString = new StringBuilder(str); + myString.setCharAt(index, ch); + return myString.toString(); + } + + public String replaceCharStringBuffer(String str, char ch, int index) { + StringBuffer myString = new StringBuffer(str); + myString.setCharAt(index, ch); + return myString.toString(); + } + +} diff --git a/java-strings/src/test/java/com/baeldung/string/ReplaceCharInStringUnitTest.java b/java-strings/src/test/java/com/baeldung/string/ReplaceCharInStringUnitTest.java new file mode 100644 index 0000000000..07e86bb69b --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/ReplaceCharInStringUnitTest.java @@ -0,0 +1,23 @@ +package com.baeldung.string; + +import org.junit.Test; +import static org.junit.Assert.*; + +public class ReplaceCharInStringUnitTest { + private ReplaceCharacterInString characterInString = new ReplaceCharacterInString(); + + @Test + public void whenReplaceCharAtIndexUsingSubstring_thenSuccess(){ + assertEquals("abcme",characterInString.replaceCharSubstring("abcde",'m',3)); + } + + @Test + public void whenReplaceCharAtIndexUsingStringBuilder_thenSuccess(){ + assertEquals("abcme",characterInString.replaceCharStringBuilder("abcde",'m',3)); + } + + @Test + public void whenReplaceCharAtIndexUsingStringBuffer_thenSuccess(){ + assertEquals("abcme",characterInString.replaceCharStringBuffer("abcde",'m',3)); + } +} From b0f62f4eca44689176c126356066694dd02155ef Mon Sep 17 00:00:00 2001 From: Amitabh Mandal Date: Thu, 20 Dec 2018 11:23:53 +0530 Subject: [PATCH 118/359] BAEL-2168 Java EE 7 batch processing (#5861) * review changes * Fixed public static count * review comments --- .../batch/understanding/CustomCheckPoint.java | 12 ++++++++- .../understanding/InjectSimpleBatchLet.java | 20 +++++++++++++- .../understanding/SimpleChunkItemReader.java | 13 ++++++++-- .../SimpleChunkItemReaderError.java | 9 +++++-- .../understanding/SimpleChunkWriter.java | 3 +++ .../batch-jobs/injectionSimpleBatchLet.xml | 26 +++++++++++-------- .../batch-jobs/partitionSimpleBatchLet.xml | 6 +++++ .../batch/understanding/BatchTestHelper.java | 11 ++++++++ .../CustomCheckPointUnitTest.java | 9 ++++--- .../understanding/SimpleBatchLetUnitTest.java | 7 ----- .../SimpleErrorChunkUnitTest.java | 10 +++---- 11 files changed, 93 insertions(+), 33 deletions(-) diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/CustomCheckPoint.java b/jee-7/src/main/java/com/baeldung/batch/understanding/CustomCheckPoint.java index fe6759b365..ba4eeb9da8 100644 --- a/jee-7/src/main/java/com/baeldung/batch/understanding/CustomCheckPoint.java +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/CustomCheckPoint.java @@ -1,12 +1,22 @@ package com.baeldung.batch.understanding; import javax.batch.api.chunk.AbstractCheckpointAlgorithm; +import javax.batch.runtime.context.JobContext; +import javax.inject.Inject; import javax.inject.Named; @Named public class CustomCheckPoint extends AbstractCheckpointAlgorithm { + + @Inject + JobContext jobContext; + + private Integer counterRead = 0; + @Override public boolean isReadyToCheckpoint() throws Exception { - return SimpleChunkItemReader.COUNT % 5 == 0; + counterRead = (Integer)jobContext.getTransientUserData(); + System.out.println("counterRead : " + counterRead); + return counterRead % 5 == 0; } } diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/InjectSimpleBatchLet.java b/jee-7/src/main/java/com/baeldung/batch/understanding/InjectSimpleBatchLet.java index 93eb20708d..ccc052b44b 100644 --- a/jee-7/src/main/java/com/baeldung/batch/understanding/InjectSimpleBatchLet.java +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/InjectSimpleBatchLet.java @@ -1,20 +1,38 @@ package com.baeldung.batch.understanding; +import java.util.Properties; +import java.util.logging.Logger; + import javax.batch.api.AbstractBatchlet; import javax.batch.api.BatchProperty; import javax.batch.runtime.BatchStatus; +import javax.batch.runtime.context.JobContext; +import javax.batch.runtime.context.StepContext; import javax.inject.Inject; import javax.inject.Named; @Named public class InjectSimpleBatchLet extends AbstractBatchlet { + Logger logger = Logger.getLogger(InjectSimpleBatchLet.class.getName()); + @Inject @BatchProperty(name = "name") private String nameString; + @Inject + StepContext stepContext; + private Properties stepProperties; + @Inject + JobContext jobContext; + private Properties jobProperties; + @Override public String process() throws Exception { - System.out.println("Value passed in = " + nameString); + logger.info("BatchProperty : " + nameString); + stepProperties = stepContext.getProperties(); + jobProperties = jobContext.getProperties(); + logger.info("Step property : "+ stepProperties.getProperty("stepProp1")); + logger.info("job property : "+jobProperties.getProperty("jobProp1")); return BatchStatus.COMPLETED.toString(); } } diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReader.java b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReader.java index 10f81d95d0..7d66edc74c 100644 --- a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReader.java +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReader.java @@ -1,20 +1,28 @@ package com.baeldung.batch.understanding; import java.io.Serializable; +import java.util.Properties; import java.util.StringTokenizer; import javax.batch.api.chunk.AbstractItemReader; +import javax.batch.runtime.BatchStatus; +import javax.batch.runtime.context.JobContext; +import javax.inject.Inject; import javax.inject.Named; @Named public class SimpleChunkItemReader extends AbstractItemReader { private StringTokenizer tokens; - public static int COUNT = 0; + private Integer count=0; + + @Inject + JobContext jobContext; @Override public Integer readItem() throws Exception { if (tokens.hasMoreTokens()) { - COUNT++; + this.count++; String tempTokenize = tokens.nextToken(); + jobContext.setTransientUserData(count); return Integer.valueOf(tempTokenize); } return null; @@ -24,4 +32,5 @@ public class SimpleChunkItemReader extends AbstractItemReader { public void open(Serializable checkpoint) throws Exception { tokens = new StringTokenizer("1,2,3,4,5,6,7,8,9,10", ","); } + } diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReaderError.java b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReaderError.java index 92096d0571..f51426339f 100644 --- a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReaderError.java +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReaderError.java @@ -4,17 +4,22 @@ import java.io.Serializable; import java.util.StringTokenizer; import javax.batch.api.chunk.AbstractItemReader; +import javax.batch.runtime.context.JobContext; +import javax.inject.Inject; import javax.inject.Named; @Named public class SimpleChunkItemReaderError extends AbstractItemReader { + @Inject + JobContext jobContext; private StringTokenizer tokens; - public static int COUNT = 0; + private Integer count = 0; @Override public Integer readItem() throws Exception { if (tokens.hasMoreTokens()) { - COUNT++; + count++; + jobContext.setTransientUserData(count); int token = Integer.valueOf(tokens.nextToken()); if (token == 3) { throw new RuntimeException("Something happened"); diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkWriter.java b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkWriter.java index 909596766d..f21dd77b85 100644 --- a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkWriter.java +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkWriter.java @@ -1,5 +1,6 @@ package com.baeldung.batch.understanding; +import java.util.ArrayList; import java.util.List; import javax.batch.api.chunk.AbstractItemWriter; @@ -7,7 +8,9 @@ import javax.inject.Named; @Named public class SimpleChunkWriter extends AbstractItemWriter { + List processed = new ArrayList<>(); @Override public void writeItems(List items) throws Exception { + items.stream().map(Integer.class::cast).forEach(this.processed::add); } } diff --git a/jee-7/src/main/resources/META-INF/batch-jobs/injectionSimpleBatchLet.xml b/jee-7/src/main/resources/META-INF/batch-jobs/injectionSimpleBatchLet.xml index d152f063f6..39cb043dcf 100644 --- a/jee-7/src/main/resources/META-INF/batch-jobs/injectionSimpleBatchLet.xml +++ b/jee-7/src/main/resources/META-INF/batch-jobs/injectionSimpleBatchLet.xml @@ -1,13 +1,17 @@ - - - - - - - - + + + + + + + + + + + \ No newline at end of file diff --git a/jee-7/src/main/resources/META-INF/batch-jobs/partitionSimpleBatchLet.xml b/jee-7/src/main/resources/META-INF/batch-jobs/partitionSimpleBatchLet.xml index 76c64ee899..49495072ea 100644 --- a/jee-7/src/main/resources/META-INF/batch-jobs/partitionSimpleBatchLet.xml +++ b/jee-7/src/main/resources/META-INF/batch-jobs/partitionSimpleBatchLet.xml @@ -4,7 +4,13 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/jobXML_1_0.xsd" version="1.0"> + + + + + + diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/BatchTestHelper.java b/jee-7/src/test/java/com/baeldung/batch/understanding/BatchTestHelper.java index 5060bd9b91..56269809f3 100644 --- a/jee-7/src/test/java/com/baeldung/batch/understanding/BatchTestHelper.java +++ b/jee-7/src/test/java/com/baeldung/batch/understanding/BatchTestHelper.java @@ -7,6 +7,7 @@ import javax.batch.runtime.BatchRuntime; import javax.batch.runtime.BatchStatus; import javax.batch.runtime.JobExecution; import javax.batch.runtime.Metric; +import javax.batch.runtime.StepExecution; public class BatchTestHelper { private static final int MAX_TRIES = 40; @@ -68,6 +69,16 @@ public class BatchTestHelper { return jobExecution; } + public static long getCommitCount(StepExecution stepExecution) { + Map metricsMap = getMetricsMap(stepExecution.getMetrics()); + return metricsMap.get(Metric.MetricType.COMMIT_COUNT); + } + + public static long getProcessSkipCount(StepExecution stepExecution) { + Map metricsMap = getMetricsMap(stepExecution.getMetrics()); + return metricsMap.get(Metric.MetricType.PROCESS_SKIP_COUNT); + } + public static Map getMetricsMap(Metric[] metrics) { Map metricsMap = new HashMap<>(); for (Metric metric : metrics) { diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java index a9488c5c03..dfea878a75 100644 --- a/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java +++ b/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java @@ -15,7 +15,7 @@ import org.junit.jupiter.api.Test; class CustomCheckPointUnitTest { @Test - public void givenChunk_whenCustomCheckPoint_thenCommitCount_3() throws Exception { + public void givenChunk_whenCustomCheckPoint_thenCommitCountIsThree() throws Exception { JobOperator jobOperator = BatchRuntime.getJobOperator(); Long executionId = jobOperator.start("customCheckPoint", new Properties()); JobExecution jobExecution = jobOperator.getJobExecution(executionId); @@ -23,9 +23,10 @@ class CustomCheckPointUnitTest { for (StepExecution stepExecution : jobOperator.getStepExecutions(executionId)) { if (stepExecution.getStepName() .equals("firstChunkStep")) { - Map metricsMap = BatchTestHelper.getMetricsMap(stepExecution.getMetrics()); - assertEquals(3L, metricsMap.get(Metric.MetricType.COMMIT_COUNT) - .longValue()); + jobOperator.getStepExecutions(executionId) + .stream() + .map(BatchTestHelper::getCommitCount) + .forEach(count -> assertEquals(3L, count.longValue())); } } assertEquals(jobExecution.getBatchStatus(), BatchStatus.COMPLETED); diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java index 485c997cc6..ade492b1b9 100644 --- a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java +++ b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java @@ -1,18 +1,11 @@ package com.baeldung.batch.understanding; import static org.junit.jupiter.api.Assertions.*; - -import java.util.List; -import java.util.Map; import java.util.Properties; - import javax.batch.operations.JobOperator; import javax.batch.runtime.BatchRuntime; import javax.batch.runtime.BatchStatus; import javax.batch.runtime.JobExecution; -import javax.batch.runtime.Metric; -import javax.batch.runtime.StepExecution; - import org.junit.jupiter.api.Test; class SimpleBatchLetUnitTest { diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java index 0f6d068888..ded31b6345 100644 --- a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java +++ b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java @@ -1,5 +1,6 @@ package com.baeldung.batch.understanding; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.jupiter.api.Assertions.*; @@ -23,7 +24,6 @@ class SimpleErrorChunkUnitTest { Long executionId = jobOperator.start("simpleErrorChunk", new Properties()); JobExecution jobExecution = jobOperator.getJobExecution(executionId); jobExecution = BatchTestHelper.keepTestFailed(jobExecution); - System.out.println(jobExecution.getBatchStatus()); assertEquals(jobExecution.getBatchStatus(), BatchStatus.FAILED); } @@ -37,10 +37,10 @@ class SimpleErrorChunkUnitTest { for (StepExecution stepExecution : stepExecutions) { if (stepExecution.getStepName() .equals("errorStep")) { - Map metricsMap = BatchTestHelper.getMetricsMap(stepExecution.getMetrics()); - long skipCount = metricsMap.get(MetricType.PROCESS_SKIP_COUNT) - .longValue(); - assertTrue("Skip count=" + skipCount, skipCount == 1l || skipCount == 2l); + jobOperator.getStepExecutions(executionId) + .stream() + .map(BatchTestHelper::getProcessSkipCount) + .forEach(skipCount -> assertEquals(1L, skipCount.longValue())); } } assertEquals(jobExecution.getBatchStatus(), BatchStatus.COMPLETED); From 5550c4d7f3f2b096f5d50112ee395c6dcc2fb5dd Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:11:56 +0800 Subject: [PATCH 119/359] Update README.md --- spring-ldap/README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/spring-ldap/README.md b/spring-ldap/README.md index e2517b9d4b..b8163ab44d 100644 --- a/spring-ldap/README.md +++ b/spring-ldap/README.md @@ -3,8 +3,4 @@ ### Relevant articles - [Spring LDAP Overview](http://www.baeldung.com/spring-ldap) -- [Spring LDAP Example Project](http://www.baeldung.com/spring-ldap-overview/) - [Guide to Spring Data LDAP](http://www.baeldung.com/spring-data-ldap) - - - From 8f116b541105bb02165143a9a7347b5e62a66bb5 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:12:52 +0800 Subject: [PATCH 120/359] Update README.md --- core-java-8/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-8/README.md b/core-java-8/README.md index 6786b29120..e5fa953cc7 100644 --- a/core-java-8/README.md +++ b/core-java-8/README.md @@ -15,7 +15,6 @@ - [Guide to Java 8 Comparator.comparing()](http://www.baeldung.com/java-8-comparator-comparing) - [Guide To Java 8 Optional](http://www.baeldung.com/java-optional) - [Guide to the Java 8 forEach](http://www.baeldung.com/foreach-java) -- [Java Base64 Encoding and Decoding](http://www.baeldung.com/java-base64-encode-and-decode) - [The Difference Between map() and flatMap()](http://www.baeldung.com/java-difference-map-and-flatmap) - [Static and Default Methods in Interfaces in Java](http://www.baeldung.com/java-static-default-methods) - [Efficient Word Frequency Calculator in Java](http://www.baeldung.com/java-word-frequency) From 8c758d8a7b05ffd9ea15ba1709b400c559c03b86 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:14:35 +0800 Subject: [PATCH 121/359] Update README.md --- persistence-modules/spring-hibernate4/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/persistence-modules/spring-hibernate4/README.md b/persistence-modules/spring-hibernate4/README.md index b15b7278f4..57a341ed45 100644 --- a/persistence-modules/spring-hibernate4/README.md +++ b/persistence-modules/spring-hibernate4/README.md @@ -7,12 +7,10 @@ - [The DAO with Spring 3 and Hibernate](http://www.baeldung.com/persistence-layer-with-spring-and-hibernate) - [Hibernate Pagination](http://www.baeldung.com/hibernate-pagination) - [Sorting with Hibernate](http://www.baeldung.com/hibernate-sort) -- [Auditing with JPA, Hibernate, and Spring Data JPA](http://www.baeldung.com/database-auditing-jpa) - [Stored Procedures with Hibernate](http://www.baeldung.com/stored-procedures-with-hibernate-tutorial) - [Hibernate: save, persist, update, merge, saveOrUpdate](http://www.baeldung.com/hibernate-save-persist-update-merge-saveorupdate) - [Eager/Lazy Loading In Hibernate](http://www.baeldung.com/hibernate-lazy-eager-loading) - [Hibernate One to Many Annotation Tutorial](http://www.baeldung.com/hibernate-one-to-many) -- [Guide to @Immutable Annotation in Hibernate](http://www.baeldung.com/hibernate-immutable) - [The DAO with Spring and Hibernate](http://www.baeldung.com/persistence-layer-with-spring-and-hibernate) ### Quick Start From ba2619c9e3d235c15d6b37e1702bf63d71a3b0d5 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:17:23 +0800 Subject: [PATCH 122/359] Update README.md --- testing-modules/mockito/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/testing-modules/mockito/README.md b/testing-modules/mockito/README.md index e1b9c27523..d344704712 100644 --- a/testing-modules/mockito/README.md +++ b/testing-modules/mockito/README.md @@ -14,8 +14,6 @@ - [Mocking Void Methods with Mockito](http://www.baeldung.com/mockito-void-methods) - [Mocking of Private Methods Using PowerMock](http://www.baeldung.com/powermock-private-method) - [Mock Final Classes and Methods with Mockito](http://www.baeldung.com/mockito-final) -- [Hamcrest Text Matchers](http://www.baeldung.com/hamcrest-text-matchers) -- [Hamcrest File Matchers](http://www.baeldung.com/hamcrest-file-matchers) - [Hamcrest Custom Matchers](http://www.baeldung.com/hamcrest-custom-matchers) - [Hamcrest Common Core Matchers](http://www.baeldung.com/hamcrest-core-matchers) - [Testing Callbacks with Mockito](http://www.baeldung.com/mockito-callbacks) From d7f8d7f105babd33e1174d5ecb28d3702cb2f022 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:19:46 +0800 Subject: [PATCH 123/359] Update README.md --- guava/src/test/java/org/baeldung/hamcrest/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/guava/src/test/java/org/baeldung/hamcrest/README.md b/guava/src/test/java/org/baeldung/hamcrest/README.md index 456108d78a..7266ecda3a 100644 --- a/guava/src/test/java/org/baeldung/hamcrest/README.md +++ b/guava/src/test/java/org/baeldung/hamcrest/README.md @@ -1,3 +1,2 @@ ### Relevant Articles: - [Testing with Hamcrest](http://www.baeldung.com/java-junit-hamcrest-guide) -- [Hamcrest File Matchers](http://www.baeldung.com/hamcrest-file-matchers) From 903b405fb8d3e2b7ca37da5e625fe31b4ac3acba Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:22:45 +0800 Subject: [PATCH 124/359] Update README.md --- core-java-sun/src/main/java/com/baeldung/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-sun/src/main/java/com/baeldung/README.md b/core-java-sun/src/main/java/com/baeldung/README.md index 51809b2882..7d843af9ea 100644 --- a/core-java-sun/src/main/java/com/baeldung/README.md +++ b/core-java-sun/src/main/java/com/baeldung/README.md @@ -1,2 +1 @@ ### Relevant Articles: -- [SHA-256 Hashing in Java](http://www.baeldung.com/sha-256-hashing-java) From 0032ec40ebf556a239e8858074388165d44f1867 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:27:02 +0800 Subject: [PATCH 125/359] Update README.md --- core-java/src/main/java/com/baeldung/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java/src/main/java/com/baeldung/README.md b/core-java/src/main/java/com/baeldung/README.md index 51809b2882..7d843af9ea 100644 --- a/core-java/src/main/java/com/baeldung/README.md +++ b/core-java/src/main/java/com/baeldung/README.md @@ -1,2 +1 @@ ### Relevant Articles: -- [SHA-256 Hashing in Java](http://www.baeldung.com/sha-256-hashing-java) From d240caf482cf08542a07b9bea91e614d7a8126f5 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:30:59 +0800 Subject: [PATCH 126/359] Update README.md --- guava/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/guava/README.md b/guava/README.md index 56e6aff50c..0346d34903 100644 --- a/guava/README.md +++ b/guava/README.md @@ -17,3 +17,5 @@ - [Using Guava CountingOutputStream](http://www.baeldung.com/guava-counting-outputstream) - [Hamcrest Text Matchers](http://www.baeldung.com/hamcrest-text-matchers) - [Quick Guide to the Guava RateLimiter](http://www.baeldung.com/guava-rate-limiter) +- [Hamcrest File Matchers](https://www.baeldung.com/hamcrest-file-matchers) +- [SHA-256 Hashing in Java](https://www.baeldung.com/sha-256-hashing-java) From 2e9f02addfaf70ff7fe45c9be1771228181ddc68 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:43:34 +0800 Subject: [PATCH 127/359] Update README.md --- core-java/README.md | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/core-java/README.md b/core-java/README.md index 20f6ef5ea7..30d8bbde49 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -14,25 +14,20 @@ - [Pattern Search with Grep in Java](http://www.baeldung.com/grep-in-java) - [URL Encoding and Decoding in Java](http://www.baeldung.com/java-url-encoding-decoding) - [How to Create an Executable JAR with Maven](http://www.baeldung.com/executable-jar-with-maven) -- [How to Design a Genetic Algorithm in Java](http://www.baeldung.com/java-genetic-algorithm) - [Basic Introduction to JMX](http://www.baeldung.com/java-management-extensions) -- [AWS Lambda With Java](http://www.baeldung.com/java-aws-lambda) - [Introduction to Nashorn](http://www.baeldung.com/java-nashorn) - [Java Money and the Currency API](http://www.baeldung.com/java-money-and-currency) - [JVM Log Forging](http://www.baeldung.com/jvm-log-forging) - [Guide to sun.misc.Unsafe](http://www.baeldung.com/java-unsafe) - [How to Perform a Simple HTTP Request in Java](http://www.baeldung.com/java-http-request) - [How to Add a Single Element to a Stream](http://www.baeldung.com/java-stream-append-prepend) -- [Kotlin Java Interoperability](http://www.baeldung.com/kotlin-java-interoperability) - [How to Find all Getters Returning Null](http://www.baeldung.com/java-getters-returning-null) - [How to Get a Name of a Method Being Executed?](http://www.baeldung.com/java-name-of-executing-method) -- [Converting a Stack Trace to a String in Java](http://www.baeldung.com/java-stacktrace-to-string) - [Introduction to Java Serialization](http://www.baeldung.com/java-serialization) - [Guide to UUID in Java](http://www.baeldung.com/java-uuid) - [Guide to Escaping Characters in Java RegExps](http://www.baeldung.com/java-regexp-escape-char) - [Difference between URL and URI](http://www.baeldung.com/java-url-vs-uri) - [Broadcasting and Multicasting in Java](http://www.baeldung.com/java-broadcast-multicast) -- [Period and Duration in Java](http://www.baeldung.com/java-period-duration) - [OutOfMemoryError: GC Overhead Limit Exceeded](http://www.baeldung.com/java-gc-overhead-limit-exceeded) - [Creating a Java Compiler Plugin](http://www.baeldung.com/java-build-compiler-plugin) - [Quick Guide to Java Stack](http://www.baeldung.com/java-stack) @@ -43,7 +38,7 @@ - [A Guide to Iterator in Java](http://www.baeldung.com/java-iterator) - [The Trie Data Structure in Java](http://www.baeldung.com/trie-java) - [Introduction to Javadoc](http://www.baeldung.com/javadoc) -- [Guide to Externalizable Interface in Java](http://www.baeldung.com/java-externalizable) +- [Guide to the Externalizable Interface in Java](http://www.baeldung.com/java-externalizable) - [A Practical Guide to DecimalFormat](http://www.baeldung.com/java-decimalformat) - [How to Detect the OS Using Java](http://www.baeldung.com/java-detect-os) - [ASCII Art in Java](http://www.baeldung.com/ascii-art-in-java) From 6c9e1a64e57deff51e0a3d4efebc25feab7b1ca5 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:45:33 +0800 Subject: [PATCH 128/359] Update README.md --- spring-rest/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-rest/README.md b/spring-rest/README.md index efa0dbab60..08dd4b22ba 100644 --- a/spring-rest/README.md +++ b/spring-rest/README.md @@ -6,7 +6,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: - [Spring @RequestMapping](http://www.baeldung.com/spring-requestmapping) - [Http Message Converters with the Spring Framework](http://www.baeldung.com/spring-httpmessageconverter-rest) -- [Redirect in Spring](http://www.baeldung.com/spring-redirect-and-forward) - [Returning Custom Status Codes from Spring Controllers](http://www.baeldung.com/spring-mvc-controller-custom-http-status-code) - [A Guide to OkHttp](http://www.baeldung.com/guide-to-okhttp) - [Binary Data Formats in a Spring REST API](http://www.baeldung.com/spring-rest-api-with-binary-data-formats) From e26d75150afa64b1baf8eee87f9a103393d2f213 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:47:46 +0800 Subject: [PATCH 129/359] Update README.md --- spring-rest/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-rest/README.md b/spring-rest/README.md index 08dd4b22ba..4921ab012c 100644 --- a/spring-rest/README.md +++ b/spring-rest/README.md @@ -14,7 +14,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [A Custom Media Type for a Spring REST API](http://www.baeldung.com/spring-rest-custom-media-type) - [HTTP PUT vs HTTP PATCH in a REST API](http://www.baeldung.com/http-put-patch-difference-spring) - [Spring – Log Incoming Requests](http://www.baeldung.com/spring-http-logging) -- [RequestBody and ResponseBody Annotations](http://www.baeldung.com/requestbody-and-responsebody-annotations) - [Introduction to CheckStyle](http://www.baeldung.com/checkstyle-java) - [How to Change the Default Port in Spring Boot](http://www.baeldung.com/spring-boot-change-port) - [Guide to DeferredResult in Spring](http://www.baeldung.com/spring-deferred-result) From 8605ea03af032f0f27102fded90ec1a551ac6f79 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:48:25 +0800 Subject: [PATCH 130/359] Update README.md --- data-structures/README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/data-structures/README.md b/data-structures/README.md index b3b1196ce0..ff12555376 100644 --- a/data-structures/README.md +++ b/data-structures/README.md @@ -1,4 +1 @@ ## Relevant articles: - -- [The Trie Data Structure in Java](http://www.baeldung.com/trie-java) -- [Implementing a Binary Tree in Java](http://www.baeldung.com/java-binary-tree) From 1b31e2fa4396c2a38121af94291bec64b54197eb Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:51:10 +0800 Subject: [PATCH 131/359] Update README.md --- core-java-9/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-9/README.md b/core-java-9/README.md index 38816471aa..c96267dc95 100644 --- a/core-java-9/README.md +++ b/core-java-9/README.md @@ -9,7 +9,6 @@ - [Java 9 Convenience Factory Methods for Collections](http://www.baeldung.com/java-9-collections-factory-methods) - [New Stream Collectors in Java 9](http://www.baeldung.com/java9-stream-collectors) - [Java 9 CompletableFuture API Improvements](http://www.baeldung.com/java-9-completablefuture) -- [Spring Security – Redirect to the Previous URL After Login](http://www.baeldung.com/spring-security-redirect-login) - [Java 9 Process API Improvements](http://www.baeldung.com/java-9-process-api) - [Introduction to Java 9 StackWalking API](http://www.baeldung.com/java-9-stackwalking-api) - [Introduction to Project Jigsaw](http://www.baeldung.com/project-jigsaw-java-modularity) From e4d81a258fceb6778cbbc081a75975ff157a14f5 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:52:22 +0800 Subject: [PATCH 132/359] Update README.md --- resteasy/bin/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/resteasy/bin/README.md b/resteasy/bin/README.md index 722f1dfe93..f4dba1493a 100644 --- a/resteasy/bin/README.md +++ b/resteasy/bin/README.md @@ -4,5 +4,3 @@ ### Relevant Articles: -- [A Guide to RESTEasy](http://www.baeldung.com/resteasy-tutorial) -- [RESTEasy Client API](http://www.baeldung.com/resteasy-client-tutorial) From cdbf8288b93f447334b65256729f9f5f8da864ad Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:57:32 +0800 Subject: [PATCH 133/359] Update README.md --- libraries/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/libraries/README.md b/libraries/README.md index c1f16df6b4..b247caedda 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -18,7 +18,6 @@ - [Guide to the HyperLogLog Algorithm](http://www.baeldung.com/java-hyperloglog) - [Introduction to Neuroph](http://www.baeldung.com/neuroph) - [Quick Guide to RSS with Rome](http://www.baeldung.com/rome-rss) -- [Introduction to NoException](http://www.baeldung.com/introduction-to-noexception) - [Introduction to PCollections](http://www.baeldung.com/java-pcollections) - [Introduction to Hoverfly in Java](http://www.baeldung.com/hoverfly) - [Introduction to Eclipse Collections](http://www.baeldung.com/eclipse-collections) @@ -34,7 +33,6 @@ - [Introduction to Retrofit](http://www.baeldung.com/retrofit) - [Using Pairs in Java](http://www.baeldung.com/java-pairs) - [Introduction to Caffeine](http://www.baeldung.com/java-caching-caffeine) -- [Introduction to Chronicle Queue](http://www.baeldung.com/java-chronicle-queue) - [Introduction To Docx4J](http://www.baeldung.com/docx4j) - [Introduction to StreamEx](http://www.baeldung.com/streamex) - [Introduction to BouncyCastle with Java](http://www.baeldung.com/java-bouncy-castle) From 86adb21009e4ab6f99e27386dd5b1585da0a0487 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:57:50 +0800 Subject: [PATCH 134/359] Update README.md --- vavr/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/vavr/README.md b/vavr/README.md index b7ba72229b..0857765ec6 100644 --- a/vavr/README.md +++ b/vavr/README.md @@ -9,6 +9,5 @@ - [Guide to Collections API in Vavr](http://www.baeldung.com/vavr-collections) - [Collection Factory Methods for Vavr](http://www.baeldung.com/vavr-collection-factory-methods) - [Introduction to Future in Vavr](http://www.baeldung.com/vavr-future) -- [Introduction to VRaptor in Java](http://www.baeldung.com/vraptor) - [Introduction to Vavr’s Either](http://www.baeldung.com/vavr-either) - [Interoperability Between Java and Vavr](http://www.baeldung.com/java-vavr) From c3f1d4dd491bd4ddc6e81c775fb0cdf806901488 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:58:43 +0800 Subject: [PATCH 135/359] Update README.md --- java-dates/src/main/java/com/baeldung/datetime/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/java-dates/src/main/java/com/baeldung/datetime/README.md b/java-dates/src/main/java/com/baeldung/datetime/README.md index 1e4adbb612..7d843af9ea 100644 --- a/java-dates/src/main/java/com/baeldung/datetime/README.md +++ b/java-dates/src/main/java/com/baeldung/datetime/README.md @@ -1,2 +1 @@ ### Relevant Articles: -- [Introduction to the Java 8 Date/Time API](http://www.baeldung.com/java-8-date-time-intro) From 81cda95e71bef4c2fe237fdf17968c872d44344d Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 22:02:28 +0800 Subject: [PATCH 136/359] Update README.md --- java-strings/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/java-strings/README.md b/java-strings/README.md index 7ff1b0ceea..cbc32d0015 100644 --- a/java-strings/README.md +++ b/java-strings/README.md @@ -10,7 +10,7 @@ - [Java – Generate Random String](http://www.baeldung.com/java-random-string) - [Convert char to String in Java](http://www.baeldung.com/java-convert-char-to-string) - [Convert String to int or Integer in Java](http://www.baeldung.com/java-convert-string-to-int-or-integer) -- [How to Convert String to different data types in Java](http://www.baeldung.com/java-string-conversions) +- [Java String Conversions](https://www.baeldung.com/java-string-conversions) - [Converting Strings to Enums in Java](http://www.baeldung.com/java-string-to-enum) - [Quick Guide to the Java StringTokenizer](http://www.baeldung.com/java-stringtokenizer) - [Count Occurrences of a Char in a String](http://www.baeldung.com/java-count-chars) @@ -27,7 +27,6 @@ - [Compact Strings in Java 9](http://www.baeldung.com/java-9-compact-string) - [Java Check a String for Lowercase/Uppercase Letter, Special Character and Digit](https://www.baeldung.com/java-lowercase-uppercase-special-character-digit-regex) - [Convert java.util.Date to String](https://www.baeldung.com/java-util-date-to-string) -- [String Not Empty Test Assertions in Java](https://www.baeldung.com/java-assert-string-not-empty) - [Get Substring from String in Java](https://www.baeldung.com/java-substring) - [Converting a Stack Trace to a String in Java](https://www.baeldung.com/java-stacktrace-to-string) - [Sorting a String Alphabetically in Java](https://www.baeldung.com/java-sort-string-alphabetically) @@ -43,4 +42,4 @@ - [Convert String to Byte Array and Reverse in Java](https://www.baeldung.com/java-string-to-byte-array) - [Pad a String with Zeros or Spaces in Java](https://www.baeldung.com/java-pad-string) - [Adding a Newline Character to a String in Java](https://www.baeldung.com/java-string-newline) -- [Remove or Replace part of a String in Java](https://www.baeldung.com/java-remove-replace-string-part) \ No newline at end of file +- [Remove or Replace part of a String in Java](https://www.baeldung.com/java-remove-replace-string-part) From 20c061130d226b8aeaebf82b8274267bd2fe21a1 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 22:06:51 +0800 Subject: [PATCH 137/359] Update README.md --- spring-security-mvc-persisted-remember-me/README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/spring-security-mvc-persisted-remember-me/README.md b/spring-security-mvc-persisted-remember-me/README.md index f910c3f62b..e505537be1 100644 --- a/spring-security-mvc-persisted-remember-me/README.md +++ b/spring-security-mvc-persisted-remember-me/README.md @@ -7,9 +7,6 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Articles: - [Spring Security Persisted Remember Me](http://www.baeldung.com/spring-security-persistent-remember-me) -- [Spring Security Remember Me](http://www.baeldung.com/spring-security-remember-me) -- [Redirect to different pages after Login with Spring Security](http://www.baeldung.com/spring_redirect_after_login) - ### Build the Project ``` From 7eaf4d50ef95b78246017c5cc56e7c4c146f2f30 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 22:07:22 +0800 Subject: [PATCH 138/359] Update README.md --- kotlin-libraries/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/kotlin-libraries/README.md b/kotlin-libraries/README.md index d1ef77aa46..bef951c363 100644 --- a/kotlin-libraries/README.md +++ b/kotlin-libraries/README.md @@ -5,7 +5,6 @@ - [Kotlin Dependency Injection with Kodein](http://www.baeldung.com/kotlin-kodein-dependency-injection) - [Writing Specifications with Kotlin and Spek](http://www.baeldung.com/kotlin-spek) - [Processing JSON with Kotlin and Klaxson](http://www.baeldung.com/kotlin-json-klaxson) -- [Kotlin with Ktor](http://www.baeldung.com/kotlin-ktor) - [Guide to the Kotlin Exposed Framework](https://www.baeldung.com/kotlin-exposed-persistence) - [Working with Dates in Kotlin](https://www.baeldung.com/kotlin-dates) - [Introduction to Arrow in Kotlin](https://www.baeldung.com/kotlin-arrow) From b390c744f6a47ee92054546e57e84c90a1f67af4 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 22:11:11 +0800 Subject: [PATCH 139/359] Update README.md --- testing-modules/mockito/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/testing-modules/mockito/README.md b/testing-modules/mockito/README.md index d344704712..158a1918e7 100644 --- a/testing-modules/mockito/README.md +++ b/testing-modules/mockito/README.md @@ -17,3 +17,4 @@ - [Hamcrest Custom Matchers](http://www.baeldung.com/hamcrest-custom-matchers) - [Hamcrest Common Core Matchers](http://www.baeldung.com/hamcrest-core-matchers) - [Testing Callbacks with Mockito](http://www.baeldung.com/mockito-callbacks) +- [Using Hamcrest Number Matchers](https://www.baeldung.com/hamcrest-number-matchers) From b07afa2c4e8ecc2a0327d665d1afefa1478c6ca4 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 22:16:26 +0800 Subject: [PATCH 140/359] Update README.MD --- spring-boot/README.MD | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-boot/README.MD b/spring-boot/README.MD index 016d2841d7..2a6a935cc1 100644 --- a/spring-boot/README.MD +++ b/spring-boot/README.MD @@ -25,7 +25,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Spring Boot: Configuring a Main Class](http://www.baeldung.com/spring-boot-main-class) - [A Quick Intro to the SpringBootServletInitializer](http://www.baeldung.com/spring-boot-servlet-initializer) - [How to Define a Spring Boot Filter?](http://www.baeldung.com/spring-boot-add-filter) -- [How to Change the Default Port in Spring Boot](http://www.baeldung.com/spring-boot-change-port) - [Spring Boot Exit Codes](http://www.baeldung.com/spring-boot-exit-codes) - [Guide to the Favicon in Spring Boot](http://www.baeldung.com/spring-boot-favicon) - [Spring Shutdown Callbacks](http://www.baeldung.com/spring-shutdown-callbacks) From 5248c5b68d8237d5f4199e127254ebadeb4bb7ab Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 22:17:44 +0800 Subject: [PATCH 141/359] Update README.MD --- spring-security-thymeleaf/README.MD | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-security-thymeleaf/README.MD b/spring-security-thymeleaf/README.MD index c5deeb9946..36007bce62 100644 --- a/spring-security-thymeleaf/README.MD +++ b/spring-security-thymeleaf/README.MD @@ -4,4 +4,3 @@ Jira BAEL-1556 ### Relevant Articles: - [Spring Security with Thymeleaf](http://www.baeldung.com/spring-security-thymeleaf) -- [Working with Select and Option in Thymeleaf](http://www.baeldung.com/thymeleaf-select-option) From 5a12974a3c3241ddf804edb9561e10cfab64d175 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 22:31:57 +0800 Subject: [PATCH 142/359] Update README.md --- spring-session/spring-session-redis/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-session/spring-session-redis/README.md b/spring-session/spring-session-redis/README.md index 0d802a4715..5e9304d778 100644 --- a/spring-session/spring-session-redis/README.md +++ b/spring-session/spring-session-redis/README.md @@ -3,4 +3,4 @@ ## Spring Session Examples ### Relevant Articles: -- [Introduction to Spring Session](http://www.baeldung.com/spring-session) +- [Guide to Spring Session](http://www.baeldung.com/spring-session) From 0654ec855748e6892b7bee23b17103ac48146e36 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 22:43:14 +0800 Subject: [PATCH 143/359] Update README.md --- persistence-modules/spring-hibernate-5/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/persistence-modules/spring-hibernate-5/README.md b/persistence-modules/spring-hibernate-5/README.md index 75d23f7532..5e287919f1 100644 --- a/persistence-modules/spring-hibernate-5/README.md +++ b/persistence-modules/spring-hibernate-5/README.md @@ -1,6 +1,5 @@ ### Relevant articles -- [@Immutable in Hibernate](http://www.baeldung.com/hibernate-immutable) - [Hibernate Many to Many Annotation Tutorial](http://www.baeldung.com/hibernate-many-to-many) - [Programmatic Transactions in the Spring TestContext Framework](http://www.baeldung.com/spring-test-programmatic-transactions) - [Hibernate Criteria Queries](http://www.baeldung.com/hibernate-criteria-queries) From c2ac3c36e33315aa19409b2400a44f51fbb5f4ee Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 22:48:08 +0800 Subject: [PATCH 144/359] Update README.md --- spring-security-rest/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-security-rest/README.md b/spring-security-rest/README.md index c396948a59..f71eead9ae 100644 --- a/spring-security-rest/README.md +++ b/spring-security-rest/README.md @@ -15,5 +15,4 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com - [Spring Security Context Propagation with @Async](http://www.baeldung.com/spring-security-async-principal-propagation) - [Servlet 3 Async Support with Spring MVC and Spring Security](http://www.baeldung.com/spring-mvc-async-security) - [Intro to Spring Security Expressions](http://www.baeldung.com/spring-security-expressions) -- [Error Handling for REST with Spring](https://www.baeldung.com/exception-handling-for-rest-with-spring) - [Spring Security for a REST API](http://www.baeldung.com/securing-a-restful-web-service-with-spring-security) From 87b23b4d44ba4d8153c67fb67a5109a8b6d69e0b Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Thu, 20 Dec 2018 21:54:20 +0100 Subject: [PATCH 145/359] Spock (#5952) * BAEL-2364: Adds Spring Boot IntegrationTests with Spock Framework * Adds o.b.boot.controller.rest.WebController as example controller * Adds one Load Application Context Test * Adds one WebMvcTest * updated pom.xml's and README * fixed module name --- pom.xml | 1 + spring-boot-testing/.gitignore | 5 + .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 47610 bytes .../.mvn/wrapper/maven-wrapper.properties | 1 + spring-boot-testing/README.MD | 6 + spring-boot-testing/mvnw | 227 ++++++++++++++++++ spring-boot-testing/mvnw.cmd | 145 +++++++++++ spring-boot-testing/pom.xml | 150 ++++++++++++ .../java/com/baeldung/boot/Application.java | 14 ++ .../boot/controller/rest/WebController.java | 36 +++ .../org/baeldung/boot/LoadContextTest.groovy | 23 ++ .../baeldung/boot/WebControllerTest.groovy | 43 ++++ 12 files changed, 651 insertions(+) create mode 100644 spring-boot-testing/.gitignore create mode 100644 spring-boot-testing/.mvn/wrapper/maven-wrapper.jar create mode 100644 spring-boot-testing/.mvn/wrapper/maven-wrapper.properties create mode 100644 spring-boot-testing/README.MD create mode 100644 spring-boot-testing/mvnw create mode 100644 spring-boot-testing/mvnw.cmd create mode 100644 spring-boot-testing/pom.xml create mode 100644 spring-boot-testing/src/main/java/com/baeldung/boot/Application.java create mode 100644 spring-boot-testing/src/main/java/com/baeldung/boot/controller/rest/WebController.java create mode 100644 spring-boot-testing/src/test/groovy/org/baeldung/boot/LoadContextTest.groovy create mode 100644 spring-boot-testing/src/test/groovy/org/baeldung/boot/WebControllerTest.groovy diff --git a/pom.xml b/pom.xml index 5aa438132e..2f7212a28c 100644 --- a/pom.xml +++ b/pom.xml @@ -640,6 +640,7 @@ spring-boot-ops spring-boot-property-exp spring-boot-security + spring-boot-testing spring-boot-vue spring-cloud diff --git a/spring-boot-testing/.gitignore b/spring-boot-testing/.gitignore new file mode 100644 index 0000000000..da7c2c5c0a --- /dev/null +++ b/spring-boot-testing/.gitignore @@ -0,0 +1,5 @@ +/target/ +.settings/ +.classpath +.project + diff --git a/spring-boot-testing/.mvn/wrapper/maven-wrapper.jar b/spring-boot-testing/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..9cc84ea9b4d95453115d0c26488d6a78694e0bc6 GIT binary patch literal 47610 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 literal 0 HcmV?d00001 diff --git a/spring-boot-testing/.mvn/wrapper/maven-wrapper.properties b/spring-boot-testing/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000000..a447c9fa81 --- /dev/null +++ b/spring-boot-testing/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1 @@ +distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.2/apache-maven-3.5.2-bin.zip \ No newline at end of file diff --git a/spring-boot-testing/README.MD b/spring-boot-testing/README.MD new file mode 100644 index 0000000000..a609b5bf09 --- /dev/null +++ b/spring-boot-testing/README.MD @@ -0,0 +1,6 @@ +### The Course +The "REST With Spring" Classes: http://bit.ly/restwithspring + +### Relevant Articles: + +- [Testing with Spring and Spock](https://www.baeldung.com/spring-spock-testing) diff --git a/spring-boot-testing/mvnw b/spring-boot-testing/mvnw new file mode 100644 index 0000000000..e96ccd5fbb --- /dev/null +++ b/spring-boot-testing/mvnw @@ -0,0 +1,227 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/spring-boot-testing/mvnw.cmd b/spring-boot-testing/mvnw.cmd new file mode 100644 index 0000000000..6a6eec39ba --- /dev/null +++ b/spring-boot-testing/mvnw.cmd @@ -0,0 +1,145 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" + +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/spring-boot-testing/pom.xml b/spring-boot-testing/pom.xml new file mode 100644 index 0000000000..2a498e54c5 --- /dev/null +++ b/spring-boot-testing/pom.xml @@ -0,0 +1,150 @@ + + 4.0.0 + spring-boot-testing + war + spring-boot-testing + This is simple boot application for demonstrating testing features. + + + parent-boot-2 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-test + test + + + + + org.spockframework + spock-core + ${spock.version} + test + + + + org.spockframework + spock-spring + ${spock.version} + test + + + + + spring-boot + + + src/main/resources + true + + + + + + + org.apache.maven.plugins + maven-war-plugin + + + + pl.project13.maven + git-commit-id-plugin + ${git-commit-id-plugin.version} + + + get-the-git-infos + + revision + + initialize + + + validate-the-git-infos + + validateRevision + + package + + + + true + ${project.build.outputDirectory}/git.properties + + + + + org.codehaus.gmavenplus + gmavenplus-plugin + 1.6 + + + + compileTests + + + + + + + + + + + autoconfiguration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*LiveTest.java + **/*IntegrationTest.java + **/*IntTest.java + + + **/AutoconfigurationTest.java + + + + + + + json + + + + + + + + + + + org.baeldung.boot.Application + 2.2.4 + 1.2-groovy-2.4 + + + diff --git a/spring-boot-testing/src/main/java/com/baeldung/boot/Application.java b/spring-boot-testing/src/main/java/com/baeldung/boot/Application.java new file mode 100644 index 0000000000..c1b6558b26 --- /dev/null +++ b/spring-boot-testing/src/main/java/com/baeldung/boot/Application.java @@ -0,0 +1,14 @@ +package org.baeldung.boot; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationContext; + +@SpringBootApplication +public class Application { + private static ApplicationContext applicationContext; + + public static void main(String[] args) { + applicationContext = SpringApplication.run(Application.class, args); + } +} diff --git a/spring-boot-testing/src/main/java/com/baeldung/boot/controller/rest/WebController.java b/spring-boot-testing/src/main/java/com/baeldung/boot/controller/rest/WebController.java new file mode 100644 index 0000000000..5b65599e00 --- /dev/null +++ b/spring-boot-testing/src/main/java/com/baeldung/boot/controller/rest/WebController.java @@ -0,0 +1,36 @@ +package org.baeldung.boot.controller.rest; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Optional; + +@RestController +@RequestMapping("/hello") +public class WebController { + + private String name; + + @GetMapping + public String salutation() { + return "Hello " + Optional.ofNullable(name).orElse("world") + '!'; + } + + @PutMapping + @ResponseStatus(HttpStatus.NO_CONTENT) + public void setName(@RequestBody final String name) { + this.name = name; + } + + @DeleteMapping + @ResponseStatus(HttpStatus.NO_CONTENT) + public void resetToDefault() { + this.name = null; + } +} \ No newline at end of file diff --git a/spring-boot-testing/src/test/groovy/org/baeldung/boot/LoadContextTest.groovy b/spring-boot-testing/src/test/groovy/org/baeldung/boot/LoadContextTest.groovy new file mode 100644 index 0000000000..2d4a7ca2cf --- /dev/null +++ b/spring-boot-testing/src/test/groovy/org/baeldung/boot/LoadContextTest.groovy @@ -0,0 +1,23 @@ +package org.baeldung.boot + +import org.baeldung.boot.controller.rest.WebController +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest +import spock.lang.Narrative +import spock.lang.Specification +import spock.lang.Title + +@Title("Application Specification") +@Narrative("Specification which beans are expected") +@SpringBootTest +class LoadContextTest extends Specification { + + @Autowired(required = false) + private WebController webController + + + def "when context is loaded then all expected beans are created"() { + expect: "the WebController is created" + webController + } +} diff --git a/spring-boot-testing/src/test/groovy/org/baeldung/boot/WebControllerTest.groovy b/spring-boot-testing/src/test/groovy/org/baeldung/boot/WebControllerTest.groovy new file mode 100644 index 0000000000..fe1b34ab8c --- /dev/null +++ b/spring-boot-testing/src/test/groovy/org/baeldung/boot/WebControllerTest.groovy @@ -0,0 +1,43 @@ +package org.baeldung.boot + +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest +import org.springframework.test.web.servlet.MockMvc +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders +import org.springframework.test.web.servlet.result.MockMvcResultMatchers +import spock.lang.Narrative +import spock.lang.Specification +import spock.lang.Title + +@Title("WebController Specification") +@Narrative("The Specification of the behaviour of the WebController. It can greet a person, change the name and reset it to 'world'") +@AutoConfigureMockMvc +@WebMvcTest +class WebControllerTest extends Specification { + + @Autowired + private MockMvc mvc + + def "when get is performed then the response has status 200 and content is 'Hello world!'"() { + expect: "Status is 200 and the response is 'Hello world!'" + mvc.perform(MockMvcRequestBuilders.get("/hello")).andExpect(MockMvcResultMatchers.status().isOk()).andReturn().response.contentAsString == "Hello world!" + } + + def "when set and delete are performed then the response has status 204 and content changes as expected"() { + given: "a new name" + def NAME = "Emmy" + + when: "the name is set" + mvc.perform(MockMvcRequestBuilders.put("/hello").content(NAME)).andExpect(MockMvcResultMatchers.status().isNoContent()) + + then: "the salutation uses the new name" + mvc.perform(MockMvcRequestBuilders.get("/hello")).andExpect(MockMvcResultMatchers.status().isOk()).andReturn().response.contentAsString == "Hello $NAME!" + + when: "the name is deleted" + mvc.perform(MockMvcRequestBuilders.delete("/hello")).andExpect(MockMvcResultMatchers.status().isNoContent()) + + then: "the salutation uses the default name" + mvc.perform(MockMvcRequestBuilders.get("/hello")).andExpect(MockMvcResultMatchers.status().isOk()).andReturn().response.contentAsString == "Hello world!" + } +} From 64b205a6ce2360de18c418fef3da2e53f1468e90 Mon Sep 17 00:00:00 2001 From: mherbaghinyan Date: Fri, 21 Dec 2018 12:19:09 +0400 Subject: [PATCH 146/359] Vector iterator --- .../src/main/java/com/baeldung/java/list/VectorExample.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core-java-collections/src/main/java/com/baeldung/java/list/VectorExample.java b/core-java-collections/src/main/java/com/baeldung/java/list/VectorExample.java index 38736390ca..7debc07911 100644 --- a/core-java-collections/src/main/java/com/baeldung/java/list/VectorExample.java +++ b/core-java-collections/src/main/java/com/baeldung/java/list/VectorExample.java @@ -1,6 +1,7 @@ package com.baeldung.java.list; import java.util.Enumeration; +import java.util.Iterator; import java.util.Vector; public class VectorExample { @@ -16,6 +17,11 @@ public class VectorExample { while(e.hasMoreElements()){ System.out.println(e.nextElement()); } + + Iterator iterator = vector.iterator(); + while (iterator.hasNext()) { + System.out.println(iterator.next()); + } } } From 1b7ac954d11c2e613aaf6ade5fc2f912cd5240c6 Mon Sep 17 00:00:00 2001 From: rodolforfq <31481067+rodolforfq@users.noreply.github.com> Date: Fri, 21 Dec 2018 04:23:16 -0400 Subject: [PATCH 147/359] Article improvements (#5961) Added 3 methods used to improve the examples on the article. The new methods are simpler to understand for the target audience. --- .../com/baeldung/controlstructures/Loops.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java b/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java index 83f2a27ea7..bb858ffe22 100644 --- a/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java +++ b/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java @@ -30,6 +30,16 @@ public class Loops { } while (count < 50); } + /** + * Splits a sentence in words, and prints each word in a new line. + * @param sentence Sentence to print as independent words. + */ + public static void printWordByWord(String sentence) { + for (String word : sentence.split(" ")) { + System.out.println(word); + } + } + /** * Prints text an N amount of times. Shows usage of the {@code break} branching statement. * @param textToPrint Text to repeatedly print. @@ -45,6 +55,21 @@ public class Loops { } } + /** + * Prints text an N amount of times, up to 50. Shows usage of the {@code break} branching statement. + * @param textToPrint Text to repeatedly print. + * @param times Amount to times to print received text. If times is higher than 50, textToPrint will only be printed 50 times. + */ + public static void printTextNTimesUpTo50(String textToPrint, int times) { + int counter = 1; + while (counter < 50) { + System.out.println(textToPrint); + if (counter == times) { + break; + } + } + } + /** * Prints an specified amount of even numbers. Shows usage of both {@code break} and {@code continue} branching statements. * @param amountToPrint Amount of even numbers to print. @@ -70,4 +95,29 @@ public class Loops { } } + /** + * Prints an specified amount of even numbers, up to 100. Shows usage of both {@code break} and {@code continue} branching statements. + * @param amountToPrint Amount of even numbers to print. + */ + public static void printEvenNumbersToAMaxOf100(int amountToPrint) { + if (amountToPrint <= 0) { // Invalid input + return; + } + int iterator = 0; + int amountPrinted = 0; + while (amountPrinted < 100) { + if (iterator % 2 == 0) { // Is an even number + System.out.println(iterator); + amountPrinted++; + iterator++; + } else { + iterator++; + continue; // Won't print + } + if (amountPrinted == amountToPrint) { + break; + } + } + } + } From a6f807e74ad17231c1d050163f02c4bd4f7cc0e4 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Fri, 21 Dec 2018 17:58:22 +0800 Subject: [PATCH 148/359] Update README.md --- core-java/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/core-java/README.md b/core-java/README.md index 30d8bbde49..4fbc8bbc6e 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -36,7 +36,6 @@ - [A Guide to ThreadLocalRandom in Java](http://www.baeldung.com/java-thread-local-random) - [Compiling Java *.class Files with javac](http://www.baeldung.com/javac) - [A Guide to Iterator in Java](http://www.baeldung.com/java-iterator) -- [The Trie Data Structure in Java](http://www.baeldung.com/trie-java) - [Introduction to Javadoc](http://www.baeldung.com/javadoc) - [Guide to the Externalizable Interface in Java](http://www.baeldung.com/java-externalizable) - [A Practical Guide to DecimalFormat](http://www.baeldung.com/java-decimalformat) @@ -79,7 +78,6 @@ - [Understanding Memory Leaks in Java](https://www.baeldung.com/java-memory-leaks) - [A Guide to SimpleDateFormat](https://www.baeldung.com/java-simple-date-format) - [SSL Handshake Failures](https://www.baeldung.com/java-ssl-handshake-failures) -- [Implementing a Binary Tree in Java](https://www.baeldung.com/java-binary-tree) - [Changing the Order in a Sum Operation Can Produce Different Results?](https://www.baeldung.com/java-floating-point-sum-order) - [Java – Try with Resources](https://www.baeldung.com/java-try-with-resources) - [Abstract Classes in Java](https://www.baeldung.com/java-abstract-class) From c50eb350517b005d579f57e9192c12c8091e7221 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Fri, 21 Dec 2018 17:59:20 +0800 Subject: [PATCH 149/359] Update README.md --- data-structures/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/data-structures/README.md b/data-structures/README.md index ff12555376..2d92068390 100644 --- a/data-structures/README.md +++ b/data-structures/README.md @@ -1 +1,4 @@ ## Relevant articles: + +[The Trie Data Structure in Java](https://www.baeldung.com/trie-java) +[Implementing a Binary Tree in Java](https://www.baeldung.com/java-binary-tree) From 6ee1c1c26d4b73080450a0be2d80508f784bb4a8 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Fri, 21 Dec 2018 18:00:08 +0800 Subject: [PATCH 150/359] Update README.md --- core-kotlin/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/core-kotlin/README.md b/core-kotlin/README.md index 828293ec90..05f07e7e7e 100644 --- a/core-kotlin/README.md +++ b/core-kotlin/README.md @@ -34,7 +34,6 @@ - [Kotlin Constructors](https://www.baeldung.com/kotlin-constructors) - [Creational Design Patterns in Kotlin: Builder](https://www.baeldung.com/kotlin-builder-pattern) - [Kotlin Nested and Inner Classes](https://www.baeldung.com/kotlin-inner-classes) -- [Kotlin with Ktor](https://www.baeldung.com/kotlin-ktor) - [Fuel HTTP Library with Kotlin](https://www.baeldung.com/kotlin-fuel) - [Introduction to Kovenant Library for Kotlin](https://www.baeldung.com/kotlin-kovenant) - [Converting Kotlin Data Class from JSON using GSON](https://www.baeldung.com/kotlin-json-convert-data-class) From cc9292fafd20677f71ba3ff56a2df7d141a68f03 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Fri, 21 Dec 2018 18:00:43 +0800 Subject: [PATCH 151/359] Update README.md --- kotlin-libraries/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/kotlin-libraries/README.md b/kotlin-libraries/README.md index bef951c363..4110bfe12e 100644 --- a/kotlin-libraries/README.md +++ b/kotlin-libraries/README.md @@ -8,3 +8,4 @@ - [Guide to the Kotlin Exposed Framework](https://www.baeldung.com/kotlin-exposed-persistence) - [Working with Dates in Kotlin](https://www.baeldung.com/kotlin-dates) - [Introduction to Arrow in Kotlin](https://www.baeldung.com/kotlin-arrow) +- [Kotlin with Ktor](https://www.baeldung.com/kotlin-ktor) From 25c270a7892c2270021fa41764feb431029380c8 Mon Sep 17 00:00:00 2001 From: j-bennett Date: Fri, 21 Dec 2018 10:54:04 -0500 Subject: [PATCH 152/359] BAEL-2353: Persist a JSON object using Hibernate (#5960) * BAEL-2353: Persist a JSON object using Hibernate * BAEL-2353: Persist a JSON object using Hibernate - Updated dependencies to latest versions --- persistence-modules/hibernate5/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/persistence-modules/hibernate5/pom.xml b/persistence-modules/hibernate5/pom.xml index f5a3a7e4c9..11aca01573 100644 --- a/persistence-modules/hibernate5/pom.xml +++ b/persistence-modules/hibernate5/pom.xml @@ -79,12 +79,12 @@ - 5.3.6.Final + 5.3.7.Final 6.0.6 2.2.3 1.4.196 3.8.0 - 2.8.11.3 + 2.9.7 From fa190f96f641dbc186906c5e8fce170506ba70fb Mon Sep 17 00:00:00 2001 From: raghav-jha Date: Fri, 21 Dec 2018 23:03:40 +0530 Subject: [PATCH 153/359] BAEL-2436 Criteria Queries Using Hibernate Metamodel * BAEL-2436 Type Safe Criteria Queries Using Hibernate Metamodel * Formattng fixes * Formatting fixes --- persistence-modules/hibernate5/pom.xml | 14 ++- .../criteriaquery/HibernateUtil.java | 61 +++++++++++++ .../hibernate/criteriaquery/Student.java | 58 ++++++++++++ .../TypeSafeCriteriaIntegrationTest.java | 89 +++++++++++++++++++ 4 files changed, 219 insertions(+), 3 deletions(-) create mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java create mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/Student.java create mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/criteriaquery/TypeSafeCriteriaIntegrationTest.java diff --git a/persistence-modules/hibernate5/pom.xml b/persistence-modules/hibernate5/pom.xml index 11aca01573..9bfea14d30 100644 --- a/persistence-modules/hibernate5/pom.xml +++ b/persistence-modules/hibernate5/pom.xml @@ -1,11 +1,12 @@ - + 4.0.0 com.baeldung hibernate5 0.0.1-SNAPSHOT - hibernate5 + hibernate5 com.baeldung @@ -66,6 +67,13 @@ byte-buddy 1.9.5 + + + org.hibernate + hibernate-jpamodelgen + ${hibernate.version} + provided + diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java new file mode 100644 index 0000000000..0d11ea1567 --- /dev/null +++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java @@ -0,0 +1,61 @@ +package com.baeldung.hibernate.criteriaquery; + +import com.baeldung.hibernate.customtypes.LocalDateStringType; +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.service.ServiceRegistry; + +import java.io.FileInputStream; +import java.io.IOException; +import java.net.URL; +import java.util.Properties; + +public class HibernateUtil { + private static SessionFactory sessionFactory; + + private HibernateUtil() { + } + + public static SessionFactory getSessionFactory() { + if (sessionFactory == null) { + sessionFactory = buildSessionFactory(); + } + return sessionFactory; + } + + private static SessionFactory buildSessionFactory() { + try { + ServiceRegistry serviceRegistry = configureServiceRegistry(); + + MetadataSources metadataSources = new MetadataSources(serviceRegistry); + + metadataSources.addAnnotatedClass(Student.class); + Metadata metadata = metadataSources.getMetadataBuilder() + .applyBasicType(LocalDateStringType.INSTANCE) + .build(); + + return metadata.getSessionFactoryBuilder().build(); + } catch (IOException ex) { + throw new ExceptionInInitializerError(ex); + } + } + + + private static ServiceRegistry configureServiceRegistry() throws IOException { + Properties properties = getProperties(); + return new StandardServiceRegistryBuilder().applySettings(properties).build(); + } + + private static Properties getProperties() throws IOException { + Properties properties = new Properties(); + URL propertiesURL = Thread.currentThread() + .getContextClassLoader() + .getResource("hibernate.properties"); + try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) { + properties.load(inputStream); + } + return properties; + } +} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/Student.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/Student.java new file mode 100644 index 0000000000..314e7ca557 --- /dev/null +++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/Student.java @@ -0,0 +1,58 @@ +package com.baeldung.hibernate.criteriaquery; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "students") +public class Student { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private int id; + + @Column(name = "first_name") + private String firstName; + + @Column(name = "last_name") + private String lastName; + + @Column(name = "grad_year") + private int gradYear; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public int getGradYear() { + return gradYear; + } + + public void setGradYear(int gradYear) { + this.gradYear = gradYear; + } +} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/criteriaquery/TypeSafeCriteriaIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/criteriaquery/TypeSafeCriteriaIntegrationTest.java new file mode 100644 index 0000000000..9d368fa27e --- /dev/null +++ b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/criteriaquery/TypeSafeCriteriaIntegrationTest.java @@ -0,0 +1,89 @@ +package com.baeldung.hibernate.criteriaquery; + +import com.baeldung.hibernate.criteriaquery.HibernateUtil; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.query.Query; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import java.io.IOException; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + + +public class TypeSafeCriteriaIntegrationTest { + + private static SessionFactory sessionFactory; + + private Session session; + + @BeforeClass + public static void beforeTests() throws IOException { + sessionFactory = HibernateUtil.getSessionFactory(); + } + + @Before + public void setUp() { + session = sessionFactory.openSession(); + session.beginTransaction(); + } + + @Test + public void givenStudentData_whenUsingTypeSafeCriteriaQuery_thenSearchAllStudentsOfAGradYear() { + + prepareData(); + CriteriaBuilder cb = session.getCriteriaBuilder(); + CriteriaQuery criteriaQuery = cb.createQuery(Student.class); + + Root root = criteriaQuery.from(Student.class); + criteriaQuery.select(root).where(cb.equal(root.get(Student_.gradYear), 1965)); + + Query query = session.createQuery(criteriaQuery); + List results = query.getResultList(); + + assertNotNull(results); + assertEquals(1, results.size()); + + Student student = results.get(0); + + assertEquals("Ken", student.getFirstName()); + assertEquals("Thompson", student.getLastName()); + assertEquals(1965, student.getGradYear()); + } + + private void prepareData() { + Student student1 = new Student(); + student1.setFirstName("Ken"); + student1.setLastName("Thompson"); + student1.setGradYear(1965); + + session.save(student1); + + Student student2 = new Student(); + student2.setFirstName("Dennis"); + student2.setLastName("Ritchie"); + student2.setGradYear(1963); + + session.save(student2); + session.getTransaction().commit(); + } + + @After + public void tearDown() { + session.close(); + } + + @AfterClass + public static void afterTests() { + sessionFactory.close(); + } +} From 5e02becb5e0f7a7f3e82e431c7ce9346226e850a Mon Sep 17 00:00:00 2001 From: cror <37755757+cror@users.noreply.github.com> Date: Sat, 22 Dec 2018 03:21:08 +0100 Subject: [PATCH 154/359] BAEL-2445: adding example for the intersection of two lists (#5968) --- .../baeldung/java/lists/ListJUnitTest.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/core-java-collections/src/test/java/org/baeldung/java/lists/ListJUnitTest.java b/core-java-collections/src/test/java/org/baeldung/java/lists/ListJUnitTest.java index 7dddf6c2ce..f9c9d3fda8 100644 --- a/core-java-collections/src/test/java/org/baeldung/java/lists/ListJUnitTest.java +++ b/core-java-collections/src/test/java/org/baeldung/java/lists/ListJUnitTest.java @@ -5,6 +5,10 @@ import org.junit.Test; import java.util.Arrays; import java.util.List; +import java.util.Set; +import java.util.HashSet; + +import java.util.stream.Collectors; public class ListJUnitTest { @@ -18,4 +22,26 @@ public class ListJUnitTest { Assert.assertNotSame(list1, list2); Assert.assertNotEquals(list1, list3); } + + @Test + public void whenIntersection_ShouldReturnCommonElements() throws Exception { + List list = Arrays.asList("red", "blue", "blue", "green", "red"); + List otherList = Arrays.asList("red", "green", "green", "yellow"); + + Set commonElements = new HashSet(Arrays.asList("red", "green")); + + Set result = list.stream() + .distinct() + .filter(otherList::contains) + .collect(Collectors.toSet()); + + Assert.assertEquals(commonElements, result); + + Set inverseResult = otherList.stream() + .distinct() + .filter(list::contains) + .collect(Collectors.toSet()); + + Assert.assertEquals(commonElements, inverseResult); + } } From 29b4110b34701c1ac004d03bc8e8555158a40e31 Mon Sep 17 00:00:00 2001 From: geroza Date: Wed, 28 Nov 2018 12:17:30 -0200 Subject: [PATCH 155/359] just migrated poms, nothing checked --- mustache/pom.xml | 4 ++-- spring-amqp-simple/pom.xml | 4 ++-- spring-aop/pom.xml | 4 ++-- spring-cucumber/pom.xml | 4 ++-- spring-jooq/pom.xml | 4 ++-- spring-kafka/pom.xml | 4 ++-- spring-mockito/pom.xml | 4 ++-- spring-protobuf/pom.xml | 4 ++-- spring-quartz/pom.xml | 4 ++-- spring-reactor/pom.xml | 4 ++-- spring-remoting/pom.xml | 4 ++-- spring-sleuth/pom.xml | 4 ++-- spring-vertx/pom.xml | 4 ++-- spring-zuul/pom.xml | 4 ++-- 14 files changed, 28 insertions(+), 28 deletions(-) diff --git a/mustache/pom.xml b/mustache/pom.xml index a276dfbf43..0c35345100 100644 --- a/mustache/pom.xml +++ b/mustache/pom.xml @@ -7,10 +7,10 @@ mustache - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/spring-amqp-simple/pom.xml b/spring-amqp-simple/pom.xml index 57d84acee6..45cdc066a0 100644 --- a/spring-amqp-simple/pom.xml +++ b/spring-amqp-simple/pom.xml @@ -8,10 +8,10 @@ spring-amqp-simple - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/spring-aop/pom.xml b/spring-aop/pom.xml index 368f3ada14..9e2f97916a 100644 --- a/spring-aop/pom.xml +++ b/spring-aop/pom.xml @@ -6,10 +6,10 @@ spring-aop - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/spring-cucumber/pom.xml b/spring-cucumber/pom.xml index 64b543bb6c..2bc3201775 100644 --- a/spring-cucumber/pom.xml +++ b/spring-cucumber/pom.xml @@ -10,10 +10,10 @@ Demo project for Spring Boot - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/spring-jooq/pom.xml b/spring-jooq/pom.xml index bbd6025418..c1f9dbff5b 100644 --- a/spring-jooq/pom.xml +++ b/spring-jooq/pom.xml @@ -5,10 +5,10 @@ spring-jooq - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/spring-kafka/pom.xml b/spring-kafka/pom.xml index 3060dc00b3..e710f1ac03 100644 --- a/spring-kafka/pom.xml +++ b/spring-kafka/pom.xml @@ -8,10 +8,10 @@ Intro to Kafka with Spring - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/spring-mockito/pom.xml b/spring-mockito/pom.xml index d1fa7f410e..481c818f39 100644 --- a/spring-mockito/pom.xml +++ b/spring-mockito/pom.xml @@ -11,10 +11,10 @@ Injecting Mockito Mocks into Spring Beans - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/spring-protobuf/pom.xml b/spring-protobuf/pom.xml index 1ab5048d27..3d7b7efd7c 100644 --- a/spring-protobuf/pom.xml +++ b/spring-protobuf/pom.xml @@ -7,10 +7,10 @@ spring-protobuf - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/spring-quartz/pom.xml b/spring-quartz/pom.xml index 47ffeccba9..77424c219e 100644 --- a/spring-quartz/pom.xml +++ b/spring-quartz/pom.xml @@ -11,10 +11,10 @@ Demo project for Scheduling in Spring with Quartz - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/spring-reactor/pom.xml b/spring-reactor/pom.xml index e828c44f74..9ab512cddb 100644 --- a/spring-reactor/pom.xml +++ b/spring-reactor/pom.xml @@ -9,10 +9,10 @@ http://maven.apache.org - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/spring-remoting/pom.xml b/spring-remoting/pom.xml index 9f05bc91d2..6fa2846130 100644 --- a/spring-remoting/pom.xml +++ b/spring-remoting/pom.xml @@ -10,10 +10,10 @@ Parent for all projects related to Spring Remoting. - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/spring-sleuth/pom.xml b/spring-sleuth/pom.xml index dd4477c551..c693466ab0 100644 --- a/spring-sleuth/pom.xml +++ b/spring-sleuth/pom.xml @@ -9,10 +9,10 @@ spring-sleuth - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/spring-vertx/pom.xml b/spring-vertx/pom.xml index 14ed77d359..7a0bdc81d0 100644 --- a/spring-vertx/pom.xml +++ b/spring-vertx/pom.xml @@ -8,10 +8,10 @@ A demo project with vertx spring integration - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/spring-zuul/pom.xml b/spring-zuul/pom.xml index 266c20adee..b662b2ef6a 100644 --- a/spring-zuul/pom.xml +++ b/spring-zuul/pom.xml @@ -9,10 +9,10 @@ pom - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 From a1b5d77656e8582fd4f094ceef19098816c353e5 Mon Sep 17 00:00:00 2001 From: geroza Date: Wed, 19 Dec 2018 16:37:10 -0200 Subject: [PATCH 156/359] Migrated the following modules, nos using parent-boot-2: spring-protobuf spring-mockito spring-mustache spring-kafka spring-jooq spring-cucumber spring-aop spring-amqp-simple --- .../baeldung/springamqpsimple/SpringAmqpConfig.java | 2 +- .../springamqpsimple/broadcast/BroadcastConfig.java | 2 +- .../src/test/resources/application.yaml | 5 +++++ spring-jooq/pom.xml | 7 ++++--- spring-kafka/pom.xml | 2 -- .../com/baeldung/spring/kafka/KafkaApplication.java | 8 ++++---- .../com/baeldung/NameServiceTestConfiguration.java | 2 +- spring-protobuf/pom.xml | 13 +------------ .../java/com/baeldung/protobuf/Application.java | 6 ++++++ 9 files changed, 23 insertions(+), 24 deletions(-) create mode 100644 spring-amqp-simple/src/test/resources/application.yaml diff --git a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/SpringAmqpConfig.java b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/SpringAmqpConfig.java index f6c82b635e..3bb0dbf33c 100644 --- a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/SpringAmqpConfig.java +++ b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/SpringAmqpConfig.java @@ -35,7 +35,7 @@ public class SpringAmqpConfig { } @Bean - SimpleMessageListenerContainer container(ConnectionFactory connectionFactory, + SimpleMessageListenerContainer SpringAmqpContainer(ConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) { SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); container.setConnectionFactory(connectionFactory); diff --git a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastConfig.java b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastConfig.java index 1d02b4dad9..c1df053c02 100644 --- a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastConfig.java +++ b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastConfig.java @@ -61,7 +61,7 @@ public class BroadcastConfig { } @Bean - public SimpleRabbitListenerContainerFactory container(ConnectionFactory connectionFactory, SimpleRabbitListenerContainerFactoryConfigurer configurer) { + public SimpleRabbitListenerContainerFactory BroadcastContainer(ConnectionFactory connectionFactory, SimpleRabbitListenerContainerFactoryConfigurer configurer) { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); configurer.configure(factory, connectionFactory); return factory; diff --git a/spring-amqp-simple/src/test/resources/application.yaml b/spring-amqp-simple/src/test/resources/application.yaml new file mode 100644 index 0000000000..aa7a91bac5 --- /dev/null +++ b/spring-amqp-simple/src/test/resources/application.yaml @@ -0,0 +1,5 @@ +spring: + rabbitmq: + username: guest + password: guest + host: localhost \ No newline at end of file diff --git a/spring-jooq/pom.xml b/spring-jooq/pom.xml index c1f9dbff5b..8bce500a86 100644 --- a/spring-jooq/pom.xml +++ b/spring-jooq/pom.xml @@ -129,6 +129,9 @@ com.baeldung.jooq.introduction.db src/main/java + + + @@ -185,14 +188,12 @@ - 3.8.6 + 3.11.7 1.4.193 - 4.3.17.RELEASE 1.0.0 1.5 1.0.0 - 1.5.13.RELEASE org.jooq.example.spring.Application diff --git a/spring-kafka/pom.xml b/spring-kafka/pom.xml index e710f1ac03..67e732d819 100644 --- a/spring-kafka/pom.xml +++ b/spring-kafka/pom.xml @@ -30,11 +30,9 @@ com.fasterxml.jackson.core jackson-databind - - 1.1.3.RELEASE 2.6.7 diff --git a/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaApplication.java b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaApplication.java index 50978d5ea9..4ee7f40335 100644 --- a/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaApplication.java +++ b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaApplication.java @@ -22,7 +22,7 @@ public class KafkaApplication { public static void main(String[] args) throws Exception { ConfigurableApplicationContext context = SpringApplication.run(KafkaApplication.class, args); - + MessageProducer producer = context.getBean(MessageProducer.class); MessageListener listener = context.getBean(MessageListener.class); /* @@ -102,7 +102,7 @@ public class KafkaApplication { } public void sendMessageToPartion(String message, int partition) { - kafkaTemplate.send(partionedTopicName, partition, message); + kafkaTemplate.send(partionedTopicName, partition, null, message); } public void sendMessageToFiltered(String message) { @@ -124,13 +124,13 @@ public class KafkaApplication { private CountDownLatch greetingLatch = new CountDownLatch(1); - @KafkaListener(topics = "${message.topic.name}", group = "foo", containerFactory = "fooKafkaListenerContainerFactory") + @KafkaListener(topics = "${message.topic.name}", groupId = "foo", containerFactory = "fooKafkaListenerContainerFactory") public void listenGroupFoo(String message) { System.out.println("Received Messasge in group 'foo': " + message); latch.countDown(); } - @KafkaListener(topics = "${message.topic.name}", group = "bar", containerFactory = "barKafkaListenerContainerFactory") + @KafkaListener(topics = "${message.topic.name}", groupId = "bar", containerFactory = "barKafkaListenerContainerFactory") public void listenGroupBar(String message) { System.out.println("Received Messasge in group 'bar': " + message); latch.countDown(); diff --git a/spring-mockito/src/test/java/com/baeldung/NameServiceTestConfiguration.java b/spring-mockito/src/test/java/com/baeldung/NameServiceTestConfiguration.java index 2c63ff6203..c50377a22a 100644 --- a/spring-mockito/src/test/java/com/baeldung/NameServiceTestConfiguration.java +++ b/spring-mockito/src/test/java/com/baeldung/NameServiceTestConfiguration.java @@ -11,7 +11,7 @@ import org.springframework.context.annotation.Profile; public class NameServiceTestConfiguration { @Bean @Primary - public NameService nameService() { + public NameService nameServiceTest() { return Mockito.mock(NameService.class); } } diff --git a/spring-protobuf/pom.xml b/spring-protobuf/pom.xml index 3d7b7efd7c..372f969bd7 100644 --- a/spring-protobuf/pom.xml +++ b/spring-protobuf/pom.xml @@ -36,21 +36,10 @@ - - - - org.springframework.boot - spring-boot-maven-plugin - - true - - - - - 3.1.0 1.4 + com.baeldung.protobuf.Application diff --git a/spring-protobuf/src/main/java/com/baeldung/protobuf/Application.java b/spring-protobuf/src/main/java/com/baeldung/protobuf/Application.java index 76f0e45244..d8aa34eb7c 100644 --- a/spring-protobuf/src/main/java/com/baeldung/protobuf/Application.java +++ b/spring-protobuf/src/main/java/com/baeldung/protobuf/Application.java @@ -4,7 +4,9 @@ import com.baeldung.protobuf.BaeldungTraining.Course; import com.baeldung.protobuf.BaeldungTraining.Student; import com.baeldung.protobuf.BaeldungTraining.Student.PhoneNumber; import com.baeldung.protobuf.BaeldungTraining.Student.PhoneType; + import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.context.annotation.Bean; import org.springframework.http.converter.protobuf.ProtobufHttpMessageConverter; import org.springframework.web.client.RestTemplate; @@ -17,6 +19,10 @@ import java.util.Map; @SpringBootApplication public class Application { + + public static void main(String[] args) { + new SpringApplicationBuilder(Application.class).run(args); + } @Bean RestTemplate restTemplate(ProtobufHttpMessageConverter hmc) { From dcc054d6de77dce144d58129b6a437a113776907 Mon Sep 17 00:00:00 2001 From: geroza Date: Fri, 21 Dec 2018 13:39:11 -0200 Subject: [PATCH 157/359] Migrated the following modules to parent-boot-2: spring-reactor spring-quartz --- spring-reactor/pom.xml | 7 ++++++- .../com/baeldung/controller/NotificationController.java | 8 +++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/spring-reactor/pom.xml b/spring-reactor/pom.xml index 9ab512cddb..c6ad99aea7 100644 --- a/spring-reactor/pom.xml +++ b/spring-reactor/pom.xml @@ -27,7 +27,12 @@ io.projectreactor reactor-bus + 2.0.8.RELEASE + + + io.projectreactor + reactor-core + 2.0.8.RELEASE - diff --git a/spring-reactor/src/main/java/com/baeldung/controller/NotificationController.java b/spring-reactor/src/main/java/com/baeldung/controller/NotificationController.java index b17691498e..8665f247b0 100644 --- a/spring-reactor/src/main/java/com/baeldung/controller/NotificationController.java +++ b/spring-reactor/src/main/java/com/baeldung/controller/NotificationController.java @@ -1,14 +1,16 @@ package com.baeldung.controller; -import com.baeldung.doman.NotificationData; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.doman.NotificationData; + import reactor.bus.Event; import reactor.bus.EventBus; -@Controller +@RestController public class NotificationController { @Autowired From cb4470edea53c68dd48688a6bc01901bbf133275 Mon Sep 17 00:00:00 2001 From: geroza Date: Sat, 22 Dec 2018 10:30:08 -0200 Subject: [PATCH 158/359] migration of modules: spring-zuul spring-vertx spring-sleuth --- spring-remoting/pom.xml | 5 +++-- .../remoting-hessian-burlap/pom.xml | 6 ++++-- spring-zuul/pom.xml | 18 +++++++++++++++--- .../config/ResourceServerApplication.java | 2 +- .../config/ResourceServerWebConfig.java | 4 ++-- .../src/main/resources/application.properties | 4 ++-- spring-zuul/spring-zuul-ui/pom.xml | 2 +- .../org/baeldung/config/UiApplication.java | 2 +- .../java/org/baeldung/config/UiWebConfig.java | 5 ++--- 9 files changed, 31 insertions(+), 17 deletions(-) diff --git a/spring-remoting/pom.xml b/spring-remoting/pom.xml index 6fa2846130..060f33837c 100644 --- a/spring-remoting/pom.xml +++ b/spring-remoting/pom.xml @@ -7,7 +7,8 @@ pom 1.0-SNAPSHOT spring-remoting - Parent for all projects related to Spring Remoting. + Parent for all projects related to Spring Remoting, except remoting-hessian-burlap + parent-boot-2 @@ -28,8 +29,8 @@ - remoting-http remoting-hessian-burlap + remoting-http remoting-amqp remoting-jms remoting-rmi diff --git a/spring-remoting/remoting-hessian-burlap/pom.xml b/spring-remoting/remoting-hessian-burlap/pom.xml index e63d0ee22e..8c30e76296 100644 --- a/spring-remoting/remoting-hessian-burlap/pom.xml +++ b/spring-remoting/remoting-hessian-burlap/pom.xml @@ -6,11 +6,13 @@ remoting-hessian-burlap pom remoting-hessian-burlap + 1.0-SNAPSHOT - spring-remoting + parent-boot-1 com.baeldung - 1.0-SNAPSHOT + 0.0.1-SNAPSHOT + ../../parent-boot-1 diff --git a/spring-zuul/pom.xml b/spring-zuul/pom.xml index b662b2ef6a..a8c891cd89 100644 --- a/spring-zuul/pom.xml +++ b/spring-zuul/pom.xml @@ -1,7 +1,8 @@ - 4.0.0 - + com.baeldung spring-zuul 1.0.0-SNAPSHOT @@ -38,11 +39,22 @@ - 1.2.7.RELEASE + 2.1.0.RC3 3.5 2.6 + + + spring-milestones + Spring Milestones + http://repo.spring.io/milestone + + false + + + + \ No newline at end of file diff --git a/spring-zuul/spring-zuul-foos-resource/src/main/java/org/baeldung/config/ResourceServerApplication.java b/spring-zuul/spring-zuul-foos-resource/src/main/java/org/baeldung/config/ResourceServerApplication.java index 9f1d2e162b..77eabe771b 100644 --- a/spring-zuul/spring-zuul-foos-resource/src/main/java/org/baeldung/config/ResourceServerApplication.java +++ b/spring-zuul/spring-zuul-foos-resource/src/main/java/org/baeldung/config/ResourceServerApplication.java @@ -2,7 +2,7 @@ package org.baeldung.config; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; @SpringBootApplication public class ResourceServerApplication extends SpringBootServletInitializer { diff --git a/spring-zuul/spring-zuul-foos-resource/src/main/java/org/baeldung/config/ResourceServerWebConfig.java b/spring-zuul/spring-zuul-foos-resource/src/main/java/org/baeldung/config/ResourceServerWebConfig.java index c040c8ac42..1a45d20edb 100644 --- a/spring-zuul/spring-zuul-foos-resource/src/main/java/org/baeldung/config/ResourceServerWebConfig.java +++ b/spring-zuul/spring-zuul-foos-resource/src/main/java/org/baeldung/config/ResourceServerWebConfig.java @@ -3,11 +3,11 @@ package org.baeldung.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration @EnableWebMvc @ComponentScan({ "org.baeldung.web.controller" }) -public class ResourceServerWebConfig extends WebMvcConfigurerAdapter { +public class ResourceServerWebConfig implements WebMvcConfigurer { } diff --git a/spring-zuul/spring-zuul-foos-resource/src/main/resources/application.properties b/spring-zuul/spring-zuul-foos-resource/src/main/resources/application.properties index 94c0984ac3..9298027030 100644 --- a/spring-zuul/spring-zuul-foos-resource/src/main/resources/application.properties +++ b/spring-zuul/spring-zuul-foos-resource/src/main/resources/application.properties @@ -1,2 +1,2 @@ -server.contextPath=/spring-zuul-foos-resource -server.port=8081 \ No newline at end of file +server.servlet.context-path=/spring-zuul-foos-resource +server.port=8081 diff --git a/spring-zuul/spring-zuul-ui/pom.xml b/spring-zuul/spring-zuul-ui/pom.xml index 6090f5f8b8..159decd331 100644 --- a/spring-zuul/spring-zuul-ui/pom.xml +++ b/spring-zuul/spring-zuul-ui/pom.xml @@ -15,7 +15,7 @@ org.springframework.cloud - spring-cloud-starter-zuul + spring-cloud-starter-netflix-zuul ${spring-cloud.version} diff --git a/spring-zuul/spring-zuul-ui/src/main/java/org/baeldung/config/UiApplication.java b/spring-zuul/spring-zuul-ui/src/main/java/org/baeldung/config/UiApplication.java index b8eda25960..d3e13639ef 100644 --- a/spring-zuul/spring-zuul-ui/src/main/java/org/baeldung/config/UiApplication.java +++ b/spring-zuul/spring-zuul-ui/src/main/java/org/baeldung/config/UiApplication.java @@ -2,7 +2,7 @@ package org.baeldung.config; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; @EnableZuulProxy diff --git a/spring-zuul/spring-zuul-ui/src/main/java/org/baeldung/config/UiWebConfig.java b/spring-zuul/spring-zuul-ui/src/main/java/org/baeldung/config/UiWebConfig.java index 0732182354..7cda1f0e95 100644 --- a/spring-zuul/spring-zuul-ui/src/main/java/org/baeldung/config/UiWebConfig.java +++ b/spring-zuul/spring-zuul-ui/src/main/java/org/baeldung/config/UiWebConfig.java @@ -7,11 +7,11 @@ import org.springframework.web.servlet.config.annotation.DefaultServletHandlerCo import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration @EnableWebMvc -public class UiWebConfig extends WebMvcConfigurerAdapter { +public class UiWebConfig implements WebMvcConfigurer { @Bean public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { @@ -25,7 +25,6 @@ public class UiWebConfig extends WebMvcConfigurerAdapter { @Override public void addViewControllers(final ViewControllerRegistry registry) { - super.addViewControllers(registry); registry.addViewController("/").setViewName("forward:/index"); registry.addViewController("/index"); registry.addViewController("/login"); From 832a3dc1761fdfbb0c9fed276863a6f222389548 Mon Sep 17 00:00:00 2001 From: geroza Date: Sat, 22 Dec 2018 10:30:56 -0200 Subject: [PATCH 159/359] Fixed deprecation usage in spring-boot --- .../main/java/com/baeldung/properties/ConfigProperties.java | 2 +- .../main/java/org/baeldung/properties/ConfigProperties.java | 2 +- .../demo/boottest/EmployeeControllerIntegrationTest.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-boot/src/main/java/com/baeldung/properties/ConfigProperties.java b/spring-boot/src/main/java/com/baeldung/properties/ConfigProperties.java index 863510738b..35b0239287 100644 --- a/spring-boot/src/main/java/com/baeldung/properties/ConfigProperties.java +++ b/spring-boot/src/main/java/com/baeldung/properties/ConfigProperties.java @@ -5,10 +5,10 @@ import java.util.Map; import javax.validation.constraints.Max; import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.Pattern; import org.hibernate.validator.constraints.Length; -import org.hibernate.validator.constraints.NotBlank; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; diff --git a/spring-boot/src/main/java/org/baeldung/properties/ConfigProperties.java b/spring-boot/src/main/java/org/baeldung/properties/ConfigProperties.java index 2c815fe998..2d3e56100c 100644 --- a/spring-boot/src/main/java/org/baeldung/properties/ConfigProperties.java +++ b/spring-boot/src/main/java/org/baeldung/properties/ConfigProperties.java @@ -5,10 +5,10 @@ import java.util.Map; import javax.validation.constraints.Max; import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.Pattern; import org.hibernate.validator.constraints.Length; -import org.hibernate.validator.constraints.NotBlank; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; diff --git a/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeControllerIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeControllerIntegrationTest.java index 640a8b322a..2d70583a54 100644 --- a/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeControllerIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeControllerIntegrationTest.java @@ -45,10 +45,10 @@ public class EmployeeControllerIntegrationTest { @Test public void whenPostEmployee_thenCreateEmployee() throws Exception { Employee alex = new Employee("alex"); - given(service.save(Mockito.anyObject())).willReturn(alex); + given(service.save(Mockito.any())).willReturn(alex); mvc.perform(post("/api/employees").contentType(MediaType.APPLICATION_JSON).content(JsonUtil.toJson(alex))).andExpect(status().isCreated()).andExpect(jsonPath("$.name", is("alex"))); - verify(service, VerificationModeFactory.times(1)).save(Mockito.anyObject()); + verify(service, VerificationModeFactory.times(1)).save(Mockito.any()); reset(service); } From cb259f6f6ca97806cfb391bb38edf77ad0f324d1 Mon Sep 17 00:00:00 2001 From: geroza Date: Sat, 22 Dec 2018 11:05:38 -0200 Subject: [PATCH 160/359] minor fixes: fixed method naming added dirtiesContext annotation to classes that shouldnt share the app context state using SpringApplication instead of unnecessary SpringApplicationBuilder --- .../springamqpsimple/SpringAmqpConfig.java | 2 +- .../broadcast/BroadcastConfig.java | 2 +- .../com/baeldung/protobuf/Application.java | 24 +++++++++---------- .../protobuf/ApplicationIntegrationTest.java | 2 ++ .../SpringContextIntegrationTest.java | 2 ++ 5 files changed, 18 insertions(+), 14 deletions(-) diff --git a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/SpringAmqpConfig.java b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/SpringAmqpConfig.java index 3bb0dbf33c..92fa28ed6f 100644 --- a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/SpringAmqpConfig.java +++ b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/SpringAmqpConfig.java @@ -35,7 +35,7 @@ public class SpringAmqpConfig { } @Bean - SimpleMessageListenerContainer SpringAmqpContainer(ConnectionFactory connectionFactory, + SimpleMessageListenerContainer springAmqpContainer(ConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) { SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); container.setConnectionFactory(connectionFactory); diff --git a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastConfig.java b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastConfig.java index c1df053c02..868cfff0ac 100644 --- a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastConfig.java +++ b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastConfig.java @@ -61,7 +61,7 @@ public class BroadcastConfig { } @Bean - public SimpleRabbitListenerContainerFactory BroadcastContainer(ConnectionFactory connectionFactory, SimpleRabbitListenerContainerFactoryConfigurer configurer) { + public SimpleRabbitListenerContainerFactory broadcastContainer(ConnectionFactory connectionFactory, SimpleRabbitListenerContainerFactoryConfigurer configurer) { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); configurer.configure(factory, connectionFactory); return factory; diff --git a/spring-protobuf/src/main/java/com/baeldung/protobuf/Application.java b/spring-protobuf/src/main/java/com/baeldung/protobuf/Application.java index d8aa34eb7c..fd36986549 100644 --- a/spring-protobuf/src/main/java/com/baeldung/protobuf/Application.java +++ b/spring-protobuf/src/main/java/com/baeldung/protobuf/Application.java @@ -1,27 +1,27 @@ package com.baeldung.protobuf; -import com.baeldung.protobuf.BaeldungTraining.Course; -import com.baeldung.protobuf.BaeldungTraining.Student; -import com.baeldung.protobuf.BaeldungTraining.Student.PhoneNumber; -import com.baeldung.protobuf.BaeldungTraining.Student.PhoneType; - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.http.converter.protobuf.ProtobufHttpMessageConverter; -import org.springframework.web.client.RestTemplate; - import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.http.converter.protobuf.ProtobufHttpMessageConverter; +import org.springframework.web.client.RestTemplate; + +import com.baeldung.protobuf.BaeldungTraining.Course; +import com.baeldung.protobuf.BaeldungTraining.Student; +import com.baeldung.protobuf.BaeldungTraining.Student.PhoneNumber; +import com.baeldung.protobuf.BaeldungTraining.Student.PhoneType; + @SpringBootApplication public class Application { public static void main(String[] args) { - new SpringApplicationBuilder(Application.class).run(args); + SpringApplication.run(Application.class, args); } @Bean diff --git a/spring-protobuf/src/test/java/com/baeldung/protobuf/ApplicationIntegrationTest.java b/spring-protobuf/src/test/java/com/baeldung/protobuf/ApplicationIntegrationTest.java index 4b9f41ace3..f0e2473ec4 100644 --- a/spring-protobuf/src/test/java/com/baeldung/protobuf/ApplicationIntegrationTest.java +++ b/spring-protobuf/src/test/java/com/baeldung/protobuf/ApplicationIntegrationTest.java @@ -16,12 +16,14 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.http.ResponseEntity; +import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.web.client.RestTemplate; import com.baeldung.protobuf.BaeldungTraining.Course; import com.googlecode.protobuf.format.JsonFormat; +@DirtiesContext @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT) public class ApplicationIntegrationTest { diff --git a/spring-protobuf/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-protobuf/src/test/java/org/baeldung/SpringContextIntegrationTest.java index 615ebd5f4a..6d021eb400 100644 --- a/spring-protobuf/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ b/spring-protobuf/src/test/java/org/baeldung/SpringContextIntegrationTest.java @@ -3,10 +3,12 @@ package org.baeldung; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import com.baeldung.protobuf.Application; +@DirtiesContext @RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class) public class SpringContextIntegrationTest { From c2fc5c0aa676e86696bf2ae9435e343803520077 Mon Sep 17 00:00:00 2001 From: Karanbir Singh Date: Sat, 22 Dec 2018 19:27:25 +0530 Subject: [PATCH 161/359] spelling mistake - minor one --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f3fe5e3bf0..378d77196a 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Java and Spring Tutorials ================ This project is **a collection of small and focused tutorials** - each covering a single and well defined area of development in the Java ecosystem. -A strong focus of these is, of course, the Spring Framework - Spring, Spring Boot and Spring Securiyt. +A strong focus of these is, of course, the Spring Framework - Spring, Spring Boot and Spring Security. In additional to Spring, the following technologies are in focus: `core Java`, `Jackson`, `HttpClient`, `Guava`. From 023bf2c5b58523215ac4b0d0fda8aa4795ef6c37 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sat, 22 Dec 2018 21:02:12 +0530 Subject: [PATCH 162/359] [BAEL-10839] - Create core-java-lang-oop module --- core-java-lang-oop/.gitignore | 26 ++ core-java-lang-oop/README.md | 23 ++ core-java-lang-oop/pom.xml | 91 +++++ .../com/baeldung/accessmodifiers/Public.java | 0 .../baeldung/accessmodifiers/SubClass.java | 0 .../baeldung/accessmodifiers/SuperPublic.java | 0 .../another/AnotherPublic.java | 0 .../another/AnotherSubClass.java | 0 .../another/AnotherSuperPublic.java | 0 .../java/com/baeldung/casting/Animal.java | 0 .../com/baeldung/casting/AnimalFeeder.java | 0 .../baeldung/casting/AnimalFeederGeneric.java | 0 .../main/java/com/baeldung/casting/Cat.java | 0 .../main/java/com/baeldung/casting/Dog.java | 0 .../main/java/com/baeldung/casting/Mew.java | 0 .../baeldung/constructors/BankAccount.java | 0 .../baeldung/constructors/Transaction.java | 0 .../java/com/baeldung/deepcopy/Address.java | 0 .../main/java/com/baeldung/deepcopy/User.java | 0 .../com/baeldung/equalshashcode/Money.java | 0 .../com/baeldung/equalshashcode/Team.java | 0 .../com/baeldung/equalshashcode/Voucher.java | 0 .../baeldung/equalshashcode/WrongTeam.java | 0 .../baeldung/equalshashcode/WrongVoucher.java | 0 .../equalshashcode/entities/ComplexClass.java | 0 .../entities/PrimitiveClass.java | 0 .../equalshashcode/entities/Rectangle.java | 0 .../equalshashcode/entities/Shape.java | 0 .../equalshashcode/entities/Square.java | 0 .../com/baeldung/finalkeyword/BlackCat.java | 0 .../com/baeldung/finalkeyword/BlackDog.java | 0 .../java/com/baeldung/finalkeyword/Cat.java | 0 .../java/com/baeldung/finalkeyword/Dog.java | 0 .../com/baeldung/hashcode/entities/User.java | 0 .../baeldung/immutableobjects/Currency.java | 0 .../com/baeldung/immutableobjects/Money.java | 0 .../com/baeldung/inheritance/ArmoredCar.java | 0 .../java/com/baeldung/inheritance/BMW.java | 0 .../java/com/baeldung/inheritance/Car.java | 0 .../com/baeldung/inheritance/Employee.java | 0 .../com/baeldung/inheritance/Floatable.java | 0 .../com/baeldung/inheritance/Flyable.java | 0 .../com/baeldung/inheritance/SpaceCar.java | 0 .../baeldung/inheritance/SpaceTraveller.java | 0 .../application/Application.java | 0 .../inheritancecomposition/model/Actress.java | 0 .../model/Computer.java | 0 .../inheritancecomposition/model/Memory.java | 0 .../inheritancecomposition/model/Person.java | 0 .../model/Processor.java | 0 .../model/SoundCard.java | 0 .../model/StandardMemory.java | 0 .../model/StandardProcessor.java | 0 .../model/StandardSoundCard.java | 0 .../model/Waitress.java | 0 .../baeldung/initializationguide/User.java | 0 .../com/baeldung/keyword/KeywordDemo.java | 0 .../keyword/superkeyword/SuperBase.java | 0 .../keyword/superkeyword/SuperSub.java | 0 .../keyword/thiskeyword/KeywordUnitTest.java | 0 .../application/Application.java | 0 .../model/Car.java | 0 .../model/Vehicle.java | 0 .../util/Multiplier.java | 0 .../baeldung/polymorphism/FileManager.java | 0 .../baeldung/polymorphism/GenericFile.java | 0 .../com/baeldung/polymorphism/ImageFile.java | 0 .../com/baeldung/polymorphism/TextFile.java | 0 .../scope/method/BaseMethodClass.java | 0 .../scope/method/ChildMethodClass.java | 0 .../scope/method/MethodHidingDemo.java | 0 .../scope/variable/ChildVariable.java | 0 .../baeldung/scope/variable/HideVariable.java | 0 .../scope/variable/ParentVariable.java | 0 .../scope/variable/VariableHidingDemo.java | 0 .../java/com/baeldung/staticdemo/Car.java | 0 .../com/baeldung/staticdemo/Singleton.java | 0 .../com/baeldung/staticdemo/StaticBlock.java | 0 .../typeerasure/ArrayContentPrintUtil.java | 0 .../com/baeldung/typeerasure/BoundStack.java | 0 .../baeldung/typeerasure/IntegerStack.java | 0 .../java/com/baeldung/typeerasure/Stack.java | 0 .../src/main/resources/logback.xml | 19 + .../com/baeldung/casting/CastingUnitTest.java | 0 .../constructors/ConstructorUnitTest.java | 0 .../baeldung/deepcopy/DeepCopyUnitTest.java | 0 .../deepcopy/ShallowCopyUnitTest.java | 0 .../equalshashcode/MoneyUnitTest.java | 0 .../baeldung/equalshashcode/TeamUnitTest.java | 0 .../entities/ComplexClassUnitTest.java | 0 .../entities/PrimitiveClassUnitTest.java | 0 .../entities/SquareClassUnitTest.java | 0 .../baeldung/finalkeyword/FinalUnitTest.java | 0 .../application/ApplicationUnitTest.java | 0 .../hashcode/entities/UserUnitTest.java | 0 .../com/baeldung/inheritance/AppUnitTest.java | 0 .../test/ActressUnitTest.java | 0 .../test/CompositionUnitTest.java | 0 .../test/InheritanceUnitTest.java | 0 .../test/PersonUnitTest.java | 0 .../test/WaitressUnitTest.java | 0 .../initializationguide/UserUnitTest.java | 0 .../test/MethodOverloadingUnitTest.java | 0 .../test/MethodOverridingUnitTest.java | 0 .../NonPrimitivesUnitTest.java | 0 .../parameterpassing/PrimitivesUnitTest.java | 0 .../polymorphism/PolymorphismUnitTest.java | 0 .../staticdemo/CarIntegrationTest.java | 0 .../staticdemo/SingletonIntegrationTest.java | 0 .../StaticBlockIntegrationTest.java | 0 .../typeerasure/TypeErasureUnitTest.java | 0 .../src/test/resources/.gitignore | 13 + core-java-lang/README.md | 18 - core-java-lang/pom.xml | 344 ------------------ pom.xml | 2 + 115 files changed, 174 insertions(+), 362 deletions(-) create mode 100644 core-java-lang-oop/.gitignore create mode 100644 core-java-lang-oop/README.md create mode 100644 core-java-lang-oop/pom.xml rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/accessmodifiers/Public.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/accessmodifiers/SubClass.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/casting/Animal.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/casting/AnimalFeeder.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/casting/Cat.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/casting/Dog.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/casting/Mew.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/constructors/BankAccount.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/constructors/Transaction.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/deepcopy/Address.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/deepcopy/User.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/equalshashcode/Money.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/equalshashcode/Team.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/equalshashcode/Voucher.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/equalshashcode/WrongTeam.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/equalshashcode/entities/Shape.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/equalshashcode/entities/Square.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/finalkeyword/BlackCat.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/finalkeyword/BlackDog.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/finalkeyword/Cat.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/finalkeyword/Dog.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/hashcode/entities/User.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/immutableobjects/Currency.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/immutableobjects/Money.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritance/ArmoredCar.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritance/BMW.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritance/Car.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritance/Employee.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritance/Floatable.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritance/Flyable.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritance/SpaceCar.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritance/SpaceTraveller.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritancecomposition/application/Application.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritancecomposition/model/Person.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/initializationguide/User.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/keyword/KeywordDemo.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/polymorphism/FileManager.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/polymorphism/GenericFile.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/polymorphism/ImageFile.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/polymorphism/TextFile.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/scope/method/BaseMethodClass.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/scope/method/ChildMethodClass.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/scope/variable/ChildVariable.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/scope/variable/HideVariable.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/scope/variable/ParentVariable.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/staticdemo/Car.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/staticdemo/Singleton.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/staticdemo/StaticBlock.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/typeerasure/BoundStack.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/typeerasure/IntegerStack.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/typeerasure/Stack.java (100%) create mode 100644 core-java-lang-oop/src/main/resources/logback.xml rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/casting/CastingUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/inheritance/AppUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/initializationguide/UserUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/staticdemo/CarIntegrationTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/staticdemo/SingletonIntegrationTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/staticdemo/StaticBlockIntegrationTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java (100%) create mode 100644 core-java-lang-oop/src/test/resources/.gitignore diff --git a/core-java-lang-oop/.gitignore b/core-java-lang-oop/.gitignore new file mode 100644 index 0000000000..3de4cc647e --- /dev/null +++ b/core-java-lang-oop/.gitignore @@ -0,0 +1,26 @@ +*.class + +0.* + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* +.resourceCache + +# Packaged files # +*.jar +*.war +*.ear + +# Files generated by integration tests +*.txt +backup-pom.xml +/bin/ +/temp + +#IntelliJ specific +.idea/ +*.iml \ No newline at end of file diff --git a/core-java-lang-oop/README.md b/core-java-lang-oop/README.md new file mode 100644 index 0000000000..665178452c --- /dev/null +++ b/core-java-lang-oop/README.md @@ -0,0 +1,23 @@ +========= + +## Core Java Lang OOP Cookbooks and Examples + +### Relevant Articles: +- [Guide to hashCode() in Java](http://www.baeldung.com/java-hashcode) +- [A Guide to the Static Keyword in Java](http://www.baeldung.com/java-static) +- [A Guide to Java Initialization](http://www.baeldung.com/java-initialization) +- [Polymorphism in Java](http://www.baeldung.com/java-polymorphism) +- [Method Overloading and Overriding in Java](http://www.baeldung.com/java-method-overload-override) +- [How to Make a Deep Copy of an Object in Java](http://www.baeldung.com/java-deep-copy) +- [Guide to Inheritance in Java](http://www.baeldung.com/java-inheritance) +- [Object Type Casting in Java](http://www.baeldung.com/java-type-casting) +- [The "final" Keyword in Java](http://www.baeldung.com/java-final) +- [Type Erasure in Java Explained](http://www.baeldung.com/java-type-erasure) +- [Pass-By-Value as a Parameter Passing Mechanism in Java](http://www.baeldung.com/java-pass-by-value-or-pass-by-reference) +- [Variable and Method Hiding in Java](http://www.baeldung.com/java-variable-method-hiding) +- [Access Modifiers in Java](http://www.baeldung.com/java-access-modifiers) +- [Guide to the super Java Keyword](http://www.baeldung.com/java-super) +- [Guide to the this Java Keyword](http://www.baeldung.com/java-this) +- [Immutable Objects in Java](http://www.baeldung.com/java-immutable-object) +- [Inheritance and Composition (Is-a vs Has-a relationship) in Java](http://www.baeldung.com/java-inheritance-composition) +- [A Guide to Constructors in Java](https://www.baeldung.com/java-constructors) \ No newline at end of file diff --git a/core-java-lang-oop/pom.xml b/core-java-lang-oop/pom.xml new file mode 100644 index 0000000000..262408c024 --- /dev/null +++ b/core-java-lang-oop/pom.xml @@ -0,0 +1,91 @@ + + 4.0.0 + com.baeldung + core-java-lang-oop + 0.1.0-SNAPSHOT + jar + core-java-lang-oop + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + com.google.code.gson + gson + ${gson.version} + + + + log4j + log4j + ${log4j.version} + + + org.slf4j + log4j-over-slf4j + ${org.slf4j.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + org.assertj + assertj-core + ${assertj-core.version} + test + + + nl.jqno.equalsverifier + equalsverifier + ${equalsverifier.version} + test + + + + + core-java-lang-oop + + + src/main/resources + true + + + + + + + + 2.8.5 + 2.8.2 + + + 3.5 + 1.16.12 + + 3.10.0 + 3.0.3 + + + diff --git a/core-java-lang/src/main/java/com/baeldung/accessmodifiers/Public.java b/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/Public.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/accessmodifiers/Public.java rename to core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/Public.java diff --git a/core-java-lang/src/main/java/com/baeldung/accessmodifiers/SubClass.java b/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/SubClass.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/accessmodifiers/SubClass.java rename to core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/SubClass.java diff --git a/core-java-lang/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java b/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java rename to core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java diff --git a/core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java b/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java rename to core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java diff --git a/core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java b/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java rename to core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java diff --git a/core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java b/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java rename to core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java diff --git a/core-java-lang/src/main/java/com/baeldung/casting/Animal.java b/core-java-lang-oop/src/main/java/com/baeldung/casting/Animal.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/casting/Animal.java rename to core-java-lang-oop/src/main/java/com/baeldung/casting/Animal.java diff --git a/core-java-lang/src/main/java/com/baeldung/casting/AnimalFeeder.java b/core-java-lang-oop/src/main/java/com/baeldung/casting/AnimalFeeder.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/casting/AnimalFeeder.java rename to core-java-lang-oop/src/main/java/com/baeldung/casting/AnimalFeeder.java diff --git a/core-java-lang/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java b/core-java-lang-oop/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java rename to core-java-lang-oop/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java diff --git a/core-java-lang/src/main/java/com/baeldung/casting/Cat.java b/core-java-lang-oop/src/main/java/com/baeldung/casting/Cat.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/casting/Cat.java rename to core-java-lang-oop/src/main/java/com/baeldung/casting/Cat.java diff --git a/core-java-lang/src/main/java/com/baeldung/casting/Dog.java b/core-java-lang-oop/src/main/java/com/baeldung/casting/Dog.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/casting/Dog.java rename to core-java-lang-oop/src/main/java/com/baeldung/casting/Dog.java diff --git a/core-java-lang/src/main/java/com/baeldung/casting/Mew.java b/core-java-lang-oop/src/main/java/com/baeldung/casting/Mew.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/casting/Mew.java rename to core-java-lang-oop/src/main/java/com/baeldung/casting/Mew.java diff --git a/core-java-lang/src/main/java/com/baeldung/constructors/BankAccount.java b/core-java-lang-oop/src/main/java/com/baeldung/constructors/BankAccount.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/constructors/BankAccount.java rename to core-java-lang-oop/src/main/java/com/baeldung/constructors/BankAccount.java diff --git a/core-java-lang/src/main/java/com/baeldung/constructors/Transaction.java b/core-java-lang-oop/src/main/java/com/baeldung/constructors/Transaction.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/constructors/Transaction.java rename to core-java-lang-oop/src/main/java/com/baeldung/constructors/Transaction.java diff --git a/core-java-lang/src/main/java/com/baeldung/deepcopy/Address.java b/core-java-lang-oop/src/main/java/com/baeldung/deepcopy/Address.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/deepcopy/Address.java rename to core-java-lang-oop/src/main/java/com/baeldung/deepcopy/Address.java diff --git a/core-java-lang/src/main/java/com/baeldung/deepcopy/User.java b/core-java-lang-oop/src/main/java/com/baeldung/deepcopy/User.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/deepcopy/User.java rename to core-java-lang-oop/src/main/java/com/baeldung/deepcopy/User.java diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/Money.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Money.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/Money.java rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Money.java diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/Team.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Team.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/Team.java rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Team.java diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/Voucher.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Voucher.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/Voucher.java rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Voucher.java diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongTeam.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/WrongTeam.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongTeam.java rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/WrongTeam.java diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Shape.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Shape.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Shape.java rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Shape.java diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Square.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Square.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Square.java rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Square.java diff --git a/core-java-lang/src/main/java/com/baeldung/finalkeyword/BlackCat.java b/core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/BlackCat.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/finalkeyword/BlackCat.java rename to core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/BlackCat.java diff --git a/core-java-lang/src/main/java/com/baeldung/finalkeyword/BlackDog.java b/core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/BlackDog.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/finalkeyword/BlackDog.java rename to core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/BlackDog.java diff --git a/core-java-lang/src/main/java/com/baeldung/finalkeyword/Cat.java b/core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/Cat.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/finalkeyword/Cat.java rename to core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/Cat.java diff --git a/core-java-lang/src/main/java/com/baeldung/finalkeyword/Dog.java b/core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/Dog.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/finalkeyword/Dog.java rename to core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/Dog.java diff --git a/core-java-lang/src/main/java/com/baeldung/hashcode/entities/User.java b/core-java-lang-oop/src/main/java/com/baeldung/hashcode/entities/User.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/hashcode/entities/User.java rename to core-java-lang-oop/src/main/java/com/baeldung/hashcode/entities/User.java diff --git a/core-java-lang/src/main/java/com/baeldung/immutableobjects/Currency.java b/core-java-lang-oop/src/main/java/com/baeldung/immutableobjects/Currency.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/immutableobjects/Currency.java rename to core-java-lang-oop/src/main/java/com/baeldung/immutableobjects/Currency.java diff --git a/core-java-lang/src/main/java/com/baeldung/immutableobjects/Money.java b/core-java-lang-oop/src/main/java/com/baeldung/immutableobjects/Money.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/immutableobjects/Money.java rename to core-java-lang-oop/src/main/java/com/baeldung/immutableobjects/Money.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritance/ArmoredCar.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritance/ArmoredCar.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritance/ArmoredCar.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritance/ArmoredCar.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritance/BMW.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritance/BMW.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritance/BMW.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritance/BMW.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritance/Car.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritance/Car.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritance/Car.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritance/Car.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritance/Employee.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritance/Employee.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritance/Employee.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritance/Employee.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritance/Floatable.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritance/Floatable.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritance/Floatable.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritance/Floatable.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritance/Flyable.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritance/Flyable.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritance/Flyable.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritance/Flyable.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritance/SpaceCar.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritance/SpaceCar.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritance/SpaceCar.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritance/SpaceCar.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritance/SpaceTraveller.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritance/SpaceTraveller.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritance/SpaceTraveller.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritance/SpaceTraveller.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/application/Application.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/application/Application.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/application/Application.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/application/Application.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Person.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Person.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Person.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Person.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java diff --git a/core-java-lang/src/main/java/com/baeldung/initializationguide/User.java b/core-java-lang-oop/src/main/java/com/baeldung/initializationguide/User.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/initializationguide/User.java rename to core-java-lang-oop/src/main/java/com/baeldung/initializationguide/User.java diff --git a/core-java-lang/src/main/java/com/baeldung/keyword/KeywordDemo.java b/core-java-lang-oop/src/main/java/com/baeldung/keyword/KeywordDemo.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/keyword/KeywordDemo.java rename to core-java-lang-oop/src/main/java/com/baeldung/keyword/KeywordDemo.java diff --git a/core-java-lang/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java b/core-java-lang-oop/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java rename to core-java-lang-oop/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java diff --git a/core-java-lang/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java b/core-java-lang-oop/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java rename to core-java-lang-oop/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java diff --git a/core-java-lang/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java b/core-java-lang-oop/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java rename to core-java-lang-oop/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java diff --git a/core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java b/core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java rename to core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java diff --git a/core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java b/core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java rename to core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java diff --git a/core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java b/core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java rename to core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java diff --git a/core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java b/core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java rename to core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java diff --git a/core-java-lang/src/main/java/com/baeldung/polymorphism/FileManager.java b/core-java-lang-oop/src/main/java/com/baeldung/polymorphism/FileManager.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/polymorphism/FileManager.java rename to core-java-lang-oop/src/main/java/com/baeldung/polymorphism/FileManager.java diff --git a/core-java-lang/src/main/java/com/baeldung/polymorphism/GenericFile.java b/core-java-lang-oop/src/main/java/com/baeldung/polymorphism/GenericFile.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/polymorphism/GenericFile.java rename to core-java-lang-oop/src/main/java/com/baeldung/polymorphism/GenericFile.java diff --git a/core-java-lang/src/main/java/com/baeldung/polymorphism/ImageFile.java b/core-java-lang-oop/src/main/java/com/baeldung/polymorphism/ImageFile.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/polymorphism/ImageFile.java rename to core-java-lang-oop/src/main/java/com/baeldung/polymorphism/ImageFile.java diff --git a/core-java-lang/src/main/java/com/baeldung/polymorphism/TextFile.java b/core-java-lang-oop/src/main/java/com/baeldung/polymorphism/TextFile.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/polymorphism/TextFile.java rename to core-java-lang-oop/src/main/java/com/baeldung/polymorphism/TextFile.java diff --git a/core-java-lang/src/main/java/com/baeldung/scope/method/BaseMethodClass.java b/core-java-lang-oop/src/main/java/com/baeldung/scope/method/BaseMethodClass.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/scope/method/BaseMethodClass.java rename to core-java-lang-oop/src/main/java/com/baeldung/scope/method/BaseMethodClass.java diff --git a/core-java-lang/src/main/java/com/baeldung/scope/method/ChildMethodClass.java b/core-java-lang-oop/src/main/java/com/baeldung/scope/method/ChildMethodClass.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/scope/method/ChildMethodClass.java rename to core-java-lang-oop/src/main/java/com/baeldung/scope/method/ChildMethodClass.java diff --git a/core-java-lang/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java b/core-java-lang-oop/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java rename to core-java-lang-oop/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java diff --git a/core-java-lang/src/main/java/com/baeldung/scope/variable/ChildVariable.java b/core-java-lang-oop/src/main/java/com/baeldung/scope/variable/ChildVariable.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/scope/variable/ChildVariable.java rename to core-java-lang-oop/src/main/java/com/baeldung/scope/variable/ChildVariable.java diff --git a/core-java-lang/src/main/java/com/baeldung/scope/variable/HideVariable.java b/core-java-lang-oop/src/main/java/com/baeldung/scope/variable/HideVariable.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/scope/variable/HideVariable.java rename to core-java-lang-oop/src/main/java/com/baeldung/scope/variable/HideVariable.java diff --git a/core-java-lang/src/main/java/com/baeldung/scope/variable/ParentVariable.java b/core-java-lang-oop/src/main/java/com/baeldung/scope/variable/ParentVariable.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/scope/variable/ParentVariable.java rename to core-java-lang-oop/src/main/java/com/baeldung/scope/variable/ParentVariable.java diff --git a/core-java-lang/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java b/core-java-lang-oop/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java rename to core-java-lang-oop/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java diff --git a/core-java-lang/src/main/java/com/baeldung/staticdemo/Car.java b/core-java-lang-oop/src/main/java/com/baeldung/staticdemo/Car.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/staticdemo/Car.java rename to core-java-lang-oop/src/main/java/com/baeldung/staticdemo/Car.java diff --git a/core-java-lang/src/main/java/com/baeldung/staticdemo/Singleton.java b/core-java-lang-oop/src/main/java/com/baeldung/staticdemo/Singleton.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/staticdemo/Singleton.java rename to core-java-lang-oop/src/main/java/com/baeldung/staticdemo/Singleton.java diff --git a/core-java-lang/src/main/java/com/baeldung/staticdemo/StaticBlock.java b/core-java-lang-oop/src/main/java/com/baeldung/staticdemo/StaticBlock.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/staticdemo/StaticBlock.java rename to core-java-lang-oop/src/main/java/com/baeldung/staticdemo/StaticBlock.java diff --git a/core-java-lang/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java b/core-java-lang-oop/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java rename to core-java-lang-oop/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java diff --git a/core-java-lang/src/main/java/com/baeldung/typeerasure/BoundStack.java b/core-java-lang-oop/src/main/java/com/baeldung/typeerasure/BoundStack.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/typeerasure/BoundStack.java rename to core-java-lang-oop/src/main/java/com/baeldung/typeerasure/BoundStack.java diff --git a/core-java-lang/src/main/java/com/baeldung/typeerasure/IntegerStack.java b/core-java-lang-oop/src/main/java/com/baeldung/typeerasure/IntegerStack.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/typeerasure/IntegerStack.java rename to core-java-lang-oop/src/main/java/com/baeldung/typeerasure/IntegerStack.java diff --git a/core-java-lang/src/main/java/com/baeldung/typeerasure/Stack.java b/core-java-lang-oop/src/main/java/com/baeldung/typeerasure/Stack.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/typeerasure/Stack.java rename to core-java-lang-oop/src/main/java/com/baeldung/typeerasure/Stack.java diff --git a/core-java-lang-oop/src/main/resources/logback.xml b/core-java-lang-oop/src/main/resources/logback.xml new file mode 100644 index 0000000000..56af2d397e --- /dev/null +++ b/core-java-lang-oop/src/main/resources/logback.xml @@ -0,0 +1,19 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core-java-lang/src/test/java/com/baeldung/casting/CastingUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/casting/CastingUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/casting/CastingUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/casting/CastingUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/inheritance/AppUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/inheritance/AppUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/inheritance/AppUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/inheritance/AppUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/initializationguide/UserUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/initializationguide/UserUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/initializationguide/UserUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/initializationguide/UserUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/staticdemo/CarIntegrationTest.java b/core-java-lang-oop/src/test/java/com/baeldung/staticdemo/CarIntegrationTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/staticdemo/CarIntegrationTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/staticdemo/CarIntegrationTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/staticdemo/SingletonIntegrationTest.java b/core-java-lang-oop/src/test/java/com/baeldung/staticdemo/SingletonIntegrationTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/staticdemo/SingletonIntegrationTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/staticdemo/SingletonIntegrationTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/staticdemo/StaticBlockIntegrationTest.java b/core-java-lang-oop/src/test/java/com/baeldung/staticdemo/StaticBlockIntegrationTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/staticdemo/StaticBlockIntegrationTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/staticdemo/StaticBlockIntegrationTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java diff --git a/core-java-lang-oop/src/test/resources/.gitignore b/core-java-lang-oop/src/test/resources/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/core-java-lang-oop/src/test/resources/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/core-java-lang/README.md b/core-java-lang/README.md index 69209bb193..56de6d2e82 100644 --- a/core-java-lang/README.md +++ b/core-java-lang/README.md @@ -13,35 +13,19 @@ - [Changing Annotation Parameters At Runtime](http://www.baeldung.com/java-reflection-change-annotation-params) - [Dynamic Proxies in Java](http://www.baeldung.com/java-dynamic-proxies) - [Java Double Brace Initialization](http://www.baeldung.com/java-double-brace-initialization) -- [Guide to hashCode() in Java](http://www.baeldung.com/java-hashcode) - [Guide to the Diamond Operator in Java](http://www.baeldung.com/java-diamond-operator) -- [A Guide to the Static Keyword in Java](http://www.baeldung.com/java-static) - [Quick Example - Comparator vs Comparable in Java](http://www.baeldung.com/java-comparator-comparable) - [The Java continue and break Keywords](http://www.baeldung.com/java-continue-and-break) -- [A Guide to Java Initialization](http://www.baeldung.com/java-initialization) - [Nested Classes in Java](http://www.baeldung.com/java-nested-classes) - [A Guide to Java Loops](http://www.baeldung.com/java-loops) - [Varargs in Java](http://www.baeldung.com/java-varargs) - [A Guide to Inner Interfaces in Java](http://www.baeldung.com/java-inner-interfaces) -- [Polymorphism in Java](http://www.baeldung.com/java-polymorphism) - [Recursion In Java](http://www.baeldung.com/java-recursion) - [A Guide to the finalize Method in Java](http://www.baeldung.com/java-finalize) -- [Method Overloading and Overriding in Java](http://www.baeldung.com/java-method-overload-override) -- [How to Make a Deep Copy of an Object in Java](http://www.baeldung.com/java-deep-copy) -- [Guide to Inheritance in Java](http://www.baeldung.com/java-inheritance) -- [Object Type Casting in Java](http://www.baeldung.com/java-type-casting) -- [The "final" Keyword in Java](http://www.baeldung.com/java-final) - [A Guide to Java Enums](http://www.baeldung.com/a-guide-to-java-enums) - [Infinite Loops in Java](http://www.baeldung.com/infinite-loops-java) - [Quick Guide to java.lang.System](http://www.baeldung.com/java-lang-system) -- [Type Erasure in Java Explained](http://www.baeldung.com/java-type-erasure) - [Using Java Assertions](http://www.baeldung.com/java-assert) -- [Pass-By-Value as a Parameter Passing Mechanism in Java](http://www.baeldung.com/java-pass-by-value-or-pass-by-reference) -- [Variable and Method Hiding in Java](http://www.baeldung.com/java-variable-method-hiding) -- [Access Modifiers in Java](http://www.baeldung.com/java-access-modifiers) -- [Guide to the super Java Keyword](http://www.baeldung.com/java-super) -- [Guide to the this Java Keyword](http://www.baeldung.com/java-this) -- [Immutable Objects in Java](http://www.baeldung.com/java-immutable-object) - [ClassNotFoundException vs NoClassDefFoundError](http://www.baeldung.com/java-classnotfoundexception-and-noclassdeffounderror) - [The StackOverflowError in Java](http://www.baeldung.com/java-stack-overflow-error) - [Create a Custom Exception in Java](http://www.baeldung.com/java-new-custom-exception) @@ -55,7 +39,5 @@ - [Ternary Operator In Java](https://www.baeldung.com/java-ternary-operator) - [How to Separate Double into Integer and Decimal Parts](https://www.baeldung.com/java-separate-double-into-integer-decimal-parts) - [“Sneaky Throws” in Java](http://www.baeldung.com/java-sneaky-throws) -- [Inheritance and Composition (Is-a vs Has-a relationship) in Java](http://www.baeldung.com/java-inheritance-composition) -- [A Guide to Constructors in Java](https://www.baeldung.com/java-constructors) - [Retrieving a Class Name in Java](https://www.baeldung.com/java-class-name) - [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts) diff --git a/core-java-lang/pom.xml b/core-java-lang/pom.xml index 2f307859f1..e1663c0df7 100644 --- a/core-java-lang/pom.xml +++ b/core-java-lang/pom.xml @@ -56,22 +56,11 @@ ${assertj-core.version} test - - org.springframework - spring-web - ${springframework.spring-web.version} - javax.mail mail ${javax.mail.version} - - nl.jqno.equalsverifier - equalsverifier - ${equalsverifier.version} - test - @@ -82,330 +71,8 @@ true - - - - org.apache.maven.plugins - maven-surefire-plugin - - - **/*LiveTest.java - **/*IntegrationTest.java - **/*IntTest.java - **/*LongRunningUnitTest.java - **/*ManualTest.java - - true - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - prepare-package - - copy-dependencies - - - ${project.build.directory}/libs - - - - - - - org.apache.maven.plugins - maven-jar-plugin - ${maven-jar-plugin.version} - - - - true - libs/ - org.baeldung.executable.ExecutableMavenJar - - - - - - - org.apache.maven.plugins - maven-assembly-plugin - - - package - - single - - - ${project.basedir} - - - org.baeldung.executable.ExecutableMavenJar - - - - jar-with-dependencies - - - - - - - - org.apache.maven.plugins - maven-shade-plugin - ${maven-shade-plugin.version} - - - - shade - - - true - - - org.baeldung.executable.ExecutableMavenJar - - - - - - - - - com.jolira - onejar-maven-plugin - ${onejar-maven-plugin.version} - - - - org.baeldung.executable.ExecutableMavenJar - true - ${project.build.finalName}-onejar.${project.packaging} - - - one-jar - - - - - - - org.springframework.boot - spring-boot-maven-plugin - ${spring-boot-maven-plugin.version} - - - - repackage - - - spring-boot - org.baeldung.executable.ExecutableMavenJar - - - - - - - org.codehaus.mojo - exec-maven-plugin - ${exec-maven-plugin.version} - - java - com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed - - -Xmx300m - -XX:+UseParallelGC - -classpath - - com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - ${maven-javadoc-plugin.version} - - 1.8 - 1.8 - - - - - - integration - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - **/*ManualTest.java - - - **/*IntegrationTest.java - **/*IntTest.java - - - - - - - json - - - - - org.codehaus.mojo - exec-maven-plugin - ${exec-maven-plugin.version} - - - run-benchmarks - - none - - exec - - - test - java - - -classpath - - org.openjdk.jmh.Main - .* - - - - - - - - - - - - buildAgentLoader - - - - org.apache.maven.plugins - maven-jar-plugin - - - package - - jar - - - agentLoader - target/classes - - - true - - ${project.build.outputDirectory}/META-INF/MANIFEST.MF - - - - com/baeldung/instrumentation/application/AgentLoader.class - com/baeldung/instrumentation/application/Launcher.class - - - - - - - - - - buildApplication - - - - org.apache.maven.plugins - maven-jar-plugin - - - package - - jar - - - application - target/classes - - - true - - ${project.build.outputDirectory}/META-INF/MANIFEST.MF - - - - com/baeldung/instrumentation/application/MyAtm.class - com/baeldung/instrumentation/application/MyAtmApplication.class - com/baeldung/instrumentation/application/Launcher.class - - - - - - - - - - buildAgent - - - - org.apache.maven.plugins - maven-jar-plugin - - - package - - jar - - - agent - target/classes - - - true - - ${project.build.outputDirectory}/META-INF/MANIFEST.MF - - - - com/baeldung/instrumentation/agent/AtmTransformer.class - com/baeldung/instrumentation/agent/MyInstrumentationAgent.class - - - - - - - - - - @@ -420,17 +87,6 @@ 3.10.0 - - - 2.21.0 - 4.3.4.RELEASE - 3.0.0-M1 - 3.0.2 - 1.4.4 - 3.1.1 - 2.0.3.RELEASE - 1.6.0 - 3.0.3 diff --git a/pom.xml b/pom.xml index d3a665b4e1..f133f3b2be 100644 --- a/pom.xml +++ b/pom.xml @@ -382,6 +382,7 @@ core-java-concurrency-collections core-java-io core-java-lang + core-java-lang-oop core-java-networking core-java-sun core-scala @@ -1089,6 +1090,7 @@ core-java-concurrency-collections core-java-io core-java-lang + core-java-lang-oop core-java-networking core-java-sun core-scala From 12bf5e9f3bbb631dab6c7f84472f15f7e96d83e9 Mon Sep 17 00:00:00 2001 From: fanatixan Date: Sat, 22 Dec 2018 18:13:09 +0100 Subject: [PATCH 163/359] bael-2437 (#5972) --- .../dynamicobject/ProductJsonAnySetter.java | 39 +++++++++++ .../dynamicobject/ProductJsonNode.java | 35 ++++++++++ .../dynamicobject/ProductMap.java | 35 ++++++++++ .../DynamicObjectDeserializationUnitTest.java | 69 +++++++++++++++++++ .../deserialize-dynamic-object/embedded.json | 8 +++ .../deserialize-dynamic-object/flat.json | 6 ++ 6 files changed, 192 insertions(+) create mode 100644 jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/ProductJsonAnySetter.java create mode 100644 jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/ProductJsonNode.java create mode 100644 jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/ProductMap.java create mode 100644 jackson/src/test/java/com/baeldung/jackson/deserialization/dynamicobject/DynamicObjectDeserializationUnitTest.java create mode 100644 jackson/src/test/resources/deserialize-dynamic-object/embedded.json create mode 100644 jackson/src/test/resources/deserialize-dynamic-object/flat.json diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/ProductJsonAnySetter.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/ProductJsonAnySetter.java new file mode 100644 index 0000000000..13c21e37af --- /dev/null +++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/ProductJsonAnySetter.java @@ -0,0 +1,39 @@ +package com.baeldung.jackson.deserialization.dynamicobject; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonAnySetter; + +public class ProductJsonAnySetter { + + private String name; + private String category; + private Map details = new LinkedHashMap<>(); + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + public Map getDetails() { + return details; + } + + @JsonAnySetter + public void setDetail(String key, Object value) { + details.put(key, value); + } + +} diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/ProductJsonNode.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/ProductJsonNode.java new file mode 100644 index 0000000000..729d542df3 --- /dev/null +++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/ProductJsonNode.java @@ -0,0 +1,35 @@ +package com.baeldung.jackson.deserialization.dynamicobject; + +import com.fasterxml.jackson.databind.JsonNode; + +public class ProductJsonNode { + + private String name; + private String category; + private JsonNode details; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + public JsonNode getDetails() { + return details; + } + + public void setDetails(JsonNode details) { + this.details = details; + } + +} diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/ProductMap.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/ProductMap.java new file mode 100644 index 0000000000..65d225f49b --- /dev/null +++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/ProductMap.java @@ -0,0 +1,35 @@ +package com.baeldung.jackson.deserialization.dynamicobject; + +import java.util.Map; + +public class ProductMap { + + private String name; + private String category; + private Map details; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + public Map getDetails() { + return details; + } + + public void setDetails(Map details) { + this.details = details; + } + +} diff --git a/jackson/src/test/java/com/baeldung/jackson/deserialization/dynamicobject/DynamicObjectDeserializationUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/deserialization/dynamicobject/DynamicObjectDeserializationUnitTest.java new file mode 100644 index 0000000000..d49677c1a2 --- /dev/null +++ b/jackson/src/test/java/com/baeldung/jackson/deserialization/dynamicobject/DynamicObjectDeserializationUnitTest.java @@ -0,0 +1,69 @@ +package com.baeldung.jackson.deserialization.dynamicobject; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.IOException; +import java.util.Scanner; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class DynamicObjectDeserializationUnitTest { + + private ObjectMapper objectMapper; + + @BeforeEach + void setup() { + objectMapper = new ObjectMapper(); + } + + private String readResource(String path) { + try (Scanner scanner = new Scanner(getClass().getResourceAsStream(path), "UTF-8")) { + return scanner.useDelimiter("\\A").next(); + } + } + + @Test + void givenJsonString_whenParsingToJsonNode_thenItMustContainDynamicProperties() throws JsonParseException, JsonMappingException, IOException { + // given + String json = readResource("/deserialize-dynamic-object/embedded.json"); + + // when + ProductJsonNode product = objectMapper.readValue(json, ProductJsonNode.class); + + // then + assertThat(product.getName()).isEqualTo("Pear yPhone 72"); + assertThat(product.getDetails().get("audioConnector").asText()).isEqualTo("none"); + } + + @Test + void givenJsonString_whenParsingToMap_thenItMustContainDynamicProperties() throws JsonParseException, JsonMappingException, IOException { + // given + String json = readResource("/deserialize-dynamic-object/embedded.json"); + + // when + ProductMap product = objectMapper.readValue(json, ProductMap.class); + + // then + assertThat(product.getName()).isEqualTo("Pear yPhone 72"); + assertThat(product.getDetails().get("audioConnector")).isEqualTo("none"); + } + + @Test + void givenJsonString_whenParsingWithJsonAnySetter_thenItMustContainDynamicProperties() throws JsonParseException, JsonMappingException, IOException { + // given + String json = readResource("/deserialize-dynamic-object/flat.json"); + + // when + ProductJsonAnySetter product = objectMapper.readValue(json, ProductJsonAnySetter.class); + + // then + assertThat(product.getName()).isEqualTo("Pear yPhone 72"); + assertThat(product.getDetails().get("audioConnector")).isEqualTo("none"); + } + +} diff --git a/jackson/src/test/resources/deserialize-dynamic-object/embedded.json b/jackson/src/test/resources/deserialize-dynamic-object/embedded.json new file mode 100644 index 0000000000..e4f11f7f1f --- /dev/null +++ b/jackson/src/test/resources/deserialize-dynamic-object/embedded.json @@ -0,0 +1,8 @@ +{ + "name": "Pear yPhone 72", + "category": "cellphone", + "details": { + "displayAspectRatio": "97:3", + "audioConnector": "none" + } +} \ No newline at end of file diff --git a/jackson/src/test/resources/deserialize-dynamic-object/flat.json b/jackson/src/test/resources/deserialize-dynamic-object/flat.json new file mode 100644 index 0000000000..799ea9339d --- /dev/null +++ b/jackson/src/test/resources/deserialize-dynamic-object/flat.json @@ -0,0 +1,6 @@ +{ + "name": "Pear yPhone 72", + "category": "cellphone", + "displayAspectRatio": "97:3", + "audioConnector": "none" +} \ No newline at end of file From e0d24b67802d516abcd476ee68107cc58674fab3 Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Sat, 22 Dec 2018 11:40:24 -0600 Subject: [PATCH 164/359] BAEL-2363 BAEL-2337 BAEL-1996 BAEL-2277 Update README (#5973) * BAEL-2246: add link back to article * BAEL-2174: rename core-java-net module to core-java-networking * BAEL-2174: add link back to article * BAEL-2363 BAEL-2337 BAEL-1996 BAEL-2277 add links back to articles --- algorithms-miscellaneous-1/README.md | 4 +++- jhipster/README.md | 1 + spring-5-reactive/README.md | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/algorithms-miscellaneous-1/README.md b/algorithms-miscellaneous-1/README.md index a04874c4d2..a725bbd141 100644 --- a/algorithms-miscellaneous-1/README.md +++ b/algorithms-miscellaneous-1/README.md @@ -10,4 +10,6 @@ - [Multi-Swarm Optimization Algorithm in Java](http://www.baeldung.com/java-multi-swarm-algorithm) - [String Search Algorithms for Large Texts](http://www.baeldung.com/java-full-text-search-algorithms) - [Check If a String Contains All The Letters of The Alphabet](https://www.baeldung.com/java-string-contains-all-letters) -- [Find the Middle Element of a Linked List](http://www.baeldung.com/java-linked-list-middle-element) \ No newline at end of file +- [Find the Middle Element of a Linked List](http://www.baeldung.com/java-linked-list-middle-element) +- [Calculate Factorial in Java](https://www.baeldung.com/java-calculate-factorial) +- [Find Substrings That Are Palindromes in Java](https://www.baeldung.com/java-palindrome-substrings) \ No newline at end of file diff --git a/jhipster/README.md b/jhipster/README.md index f3655f8ec1..91ba54bf60 100644 --- a/jhipster/README.md +++ b/jhipster/README.md @@ -2,3 +2,4 @@ - [JHipster with a Microservice Architecture](http://www.baeldung.com/jhipster-microservices) - [Intro to JHipster](http://www.baeldung.com/jhipster) +- [Building a Basic UAA-Secured JHipster Microservice](https://www.baeldung.com/jhipster-uaa-secured-micro-service) diff --git a/spring-5-reactive/README.md b/spring-5-reactive/README.md index fc898a56dc..2a4ee017f4 100644 --- a/spring-5-reactive/README.md +++ b/spring-5-reactive/README.md @@ -17,4 +17,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [A Guide to Spring Session Reactive Support: WebSession](https://www.baeldung.com/spring-session-reactive) - [Validation for Functional Endpoints in Spring 5](https://www.baeldung.com/spring-functional-endpoints-validation) - [Logging a Reactive Sequence](https://www.baeldung.com/spring-reactive-sequence-logging) - +- [Testing Reactive Streams Using StepVerifier and TestPublisher](https://www.baeldung.com/reactive-streams-step-verifier-test-publisher) From 0459f337cd5d1a97896c234300c6a7a3ed49a155 Mon Sep 17 00:00:00 2001 From: sandy03934 Date: Sun, 23 Dec 2018 01:04:29 +0530 Subject: [PATCH 165/359] Passing Parameters to a Thread Issue: BAEL-2417 --- .../parameter/AverageCalculator.java | 20 +++++++++ .../parameter/ParameterizedThreadExample.java | 32 ++++++++++++++ .../ParameterizedThreadUnitTest.java | 43 +++++++++++++++++++ 3 files changed, 95 insertions(+) create mode 100644 core-java-concurrency/src/main/java/com/baeldung/concurrent/parameter/AverageCalculator.java create mode 100644 core-java-concurrency/src/main/java/com/baeldung/concurrent/parameter/ParameterizedThreadExample.java create mode 100644 core-java-concurrency/src/test/java/com/baeldung/parameters/ParameterizedThreadUnitTest.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/parameter/AverageCalculator.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/parameter/AverageCalculator.java new file mode 100644 index 0000000000..a548b5d4a7 --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/parameter/AverageCalculator.java @@ -0,0 +1,20 @@ +package com.baeldung.concurrent.parameter; + +import java.util.concurrent.Callable; +import java.util.stream.IntStream; + +public class AverageCalculator implements Callable { + + int[] numbers; + + public AverageCalculator(int... parameter) { + this.numbers = parameter == null ? new int[0] : parameter; + } + + @Override + public Double call() throws Exception { + return IntStream.of(this.numbers) + .average() + .orElse(0d); + } +} diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/parameter/ParameterizedThreadExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/parameter/ParameterizedThreadExample.java new file mode 100644 index 0000000000..73c61f3fb1 --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/parameter/ParameterizedThreadExample.java @@ -0,0 +1,32 @@ +package com.baeldung.concurrent.parameter; + +import java.util.concurrent.Callable; +import java.util.stream.IntStream; + +public class ParameterizedThreadExample { + + public static void parameterisedThreadAnonymousClass() { + final String parameter = "123"; + Thread parameterizedThread = new Thread(new Runnable() { + + @Override + public void run() { + System.out.println(Thread.currentThread() + .getName() + " : " + parameter); + } + }); + + parameterizedThread.start(); + } + + public static Callable sumCalculator(int... numbers) { + return () -> numbers != null ? IntStream.of(numbers) + .sum() : 0; + } + + public static Callable averageCalculator(int... numbers) { + return () -> numbers != null ? IntStream.of(numbers) + .average() + .orElse(0d) : 0d; + } +} diff --git a/core-java-concurrency/src/test/java/com/baeldung/parameters/ParameterizedThreadUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/parameters/ParameterizedThreadUnitTest.java new file mode 100644 index 0000000000..21b374e609 --- /dev/null +++ b/core-java-concurrency/src/test/java/com/baeldung/parameters/ParameterizedThreadUnitTest.java @@ -0,0 +1,43 @@ +package com.baeldung.parameters; + +import com.baeldung.concurrent.parameter.AverageCalculator; +import org.junit.Test; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.stream.IntStream; + +import static org.junit.Assert.assertEquals; + +public class ParameterizedThreadUnitTest { + + @Test + public void whenSendingParameterToCallable_thenSuccessful() throws Exception { + ExecutorService executorService = Executors.newSingleThreadExecutor(); + Future result = executorService.submit(new AverageCalculator(1, 2, 3)); + try { + assertEquals(Double.valueOf(2.0), result.get()); + } finally { + executorService.shutdown(); + } + } + + @Test + public void whenParametersToThreadWithLamda_thenParametersPassedCorrectly() throws Exception { + ExecutorService executorService = Executors.newFixedThreadPool(2); + int[] numbers = new int[] { 4, 5, 6 }; + try { + Future sumResult = executorService.submit(() -> IntStream.of(numbers) + .sum()); + Future averageResult = executorService.submit(() -> IntStream.of(numbers) + .average() + .orElse(0d)); + assertEquals(Integer.valueOf(15), sumResult.get()); + assertEquals(Double.valueOf(5.0), averageResult.get()); + } finally { + executorService.shutdown(); + } + } + +} From be2e45b0a5429bb3670f103051523f3a2495e240 Mon Sep 17 00:00:00 2001 From: Josh Cummings Date: Sat, 22 Dec 2018 12:39:35 -0700 Subject: [PATCH 166/359] Two More Examples for Break and Continue (#5974) Issue: BAEL-2432 --- .../com/baeldung/controlstructures/Loops.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java b/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java index bb858ffe22..bc4515bfc7 100644 --- a/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java +++ b/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java @@ -70,6 +70,40 @@ public class Loops { } } + /** + * Finds the index of {@code name} in a list + * @param name The name to look for + * @param names The list of names + * @return The index where the name was found or -1 otherwise + */ + public static int findFirstInstanceOfName(String name, String[] names) { + int index = 0; + for ( ; index < names.length; index++) { + if (names[index].equals(name)) { + break; + } + } + return index == names.length ? -1 : index; + } + + /** + * Takes several names and makes a list, skipping the specified {@code name}. + * + * @param name The name to skip + * @param names The list of names + * @return The list of names as a single string, missing the specified {@code name}. + */ + public static String makeListSkippingName(String name, String[] names) { + String list = ""; + for (int i = 0; i < names.length; i++) { + if (names[i].equals(name)) { + continue; + } + list += names[i]; + } + return list; + } + /** * Prints an specified amount of even numbers. Shows usage of both {@code break} and {@code continue} branching statements. * @param amountToPrint Amount of even numbers to print. From bba9a99f3231cec6e31e07cd1b7366bac8bcfdf2 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 23 Dec 2018 01:15:24 +0530 Subject: [PATCH 167/359] [BAEL-10836] - Create core-java-collections-list module --- core-java-collections-list/README.md | 28 +++++++++++ core-java-collections-list/pom.xml | 48 +++++++++++++++++++ .../ClassCastException.java | 0 .../com/baeldung/findanelement/Customer.java | 0 .../FindACustomerInGivenList.java | 0 .../baeldung/java/list/CopyListService.java | 0 .../com/baeldung/java/list/CustomList.java | 0 .../java/com/baeldung/java/list/Flower.java | 0 .../baeldung/java/list/ReverseIterator.java | 0 .../com/baeldung/java/list/WaysToIterate.java | 0 .../com/baeldung/java_8_features/Car.java | 0 .../com/baeldung/java_8_features/Person.java | 0 .../com/baeldung/list/listoflist/Pen.java | 0 .../com/baeldung/list/listoflist/Pencil.java | 0 .../com/baeldung/list/listoflist/Rubber.java | 0 .../baeldung/list/listoflist/Stationery.java | 0 .../ArrayListOfArrayList.java | 0 .../ThreeDimensionalArrayList.java | 0 .../baeldung/list/removeall/RemoveAll.java | 0 .../src/main/resources/logback.xml | 13 +++++ .../converter/ArrayConvertToListUnitTest.java | 0 .../collection/ClearVsRemoveAllUnitTest.java | 0 .../baeldung/collection/CollectionsEmpty.java | 0 .../FindItemsBasedOnOtherStreamUnitTest.java | 0 .../FindACustomerInGivenListUnitTest.java | 0 .../java/list/CopyListServiceUnitTest.java | 0 .../java/list/CustomListUnitTest.java | 0 .../java/list/ReverseIteratorUnitTest.java | 0 .../java/list/WaysToIterateUnitTest.java | 0 .../ListInitializationUnitTest.java | 0 .../baeldung/java8/Java8MaxMinUnitTest.java | 0 .../FlattenNestedListUnitTest.java | 0 .../listoflist/AddElementsToListUnitTest.java | 0 .../list/listoflist/ListOfListsUnitTest.java | 0 .../list/removeall/RemoveAllUnitTest.java | 0 .../RemoveFirstElementUnitTest.java | 0 .../baeldung/RandomListElementUnitTest.java | 2 +- .../java/collections/ArrayListUnitTest.java | 0 .../CoreJavaCollectionsUnitTest.java | 0 .../JavaCollectionCleanupUnitTest.java | 0 .../java/lists/ListAssertJUnitTest.java | 0 .../baeldung/java/lists/ListJUnitTest.java | 0 .../java/lists/ListTestNgUnitTest.java | 0 .../java/org/baeldung/java/lists/README.md | 0 core-java-collections/README.md | 25 +--------- pom.xml | 2 + 46 files changed, 93 insertions(+), 25 deletions(-) create mode 100644 core-java-collections-list/README.md create mode 100644 core-java-collections-list/pom.xml rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/classcastexception/ClassCastException.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/findanelement/Customer.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/findanelement/FindACustomerInGivenList.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/java/list/CopyListService.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/java/list/CustomList.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/java/list/Flower.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/java/list/ReverseIterator.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/java/list/WaysToIterate.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/java_8_features/Car.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/java_8_features/Person.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/list/listoflist/Pen.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/list/listoflist/Pencil.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/list/listoflist/Rubber.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/list/listoflist/Stationery.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/list/multidimensional/ThreeDimensionalArrayList.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/list/removeall/RemoveAll.java (100%) create mode 100644 core-java-collections-list/src/main/resources/logback.xml rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/array/converter/ArrayConvertToListUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/collection/ClearVsRemoveAllUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/collection/CollectionsEmpty.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/findItems/FindItemsBasedOnOtherStreamUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/findanelement/FindACustomerInGivenListUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/java/list/CustomListUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/java/list/ReverseIteratorUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/java/list/WaysToIterateUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/java8/Java8MaxMinUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/list/listoflist/AddElementsToListUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/list/listoflist/ListOfListsUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/list/removeall/RemoveAllUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/list/removefirst/RemoveFirstElementUnitTest.java (100%) rename {core-java/src/test/java/com => core-java-collections-list/src/test/java/org}/baeldung/RandomListElementUnitTest.java (98%) rename {core-java-collections => core-java-collections-list}/src/test/java/org/baeldung/java/collections/ArrayListUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/org/baeldung/java/collections/CoreJavaCollectionsUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/org/baeldung/java/collections/JavaCollectionCleanupUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/org/baeldung/java/lists/ListAssertJUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/org/baeldung/java/lists/ListJUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/org/baeldung/java/lists/ListTestNgUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/org/baeldung/java/lists/README.md (100%) diff --git a/core-java-collections-list/README.md b/core-java-collections-list/README.md new file mode 100644 index 0000000000..cb6999277c --- /dev/null +++ b/core-java-collections-list/README.md @@ -0,0 +1,28 @@ +========= + +## Core Java Collections List Cookbooks and Examples + +### Relevant Articles: +- [Immutable ArrayList in Java](http://www.baeldung.com/java-immutable-list) +- [Guide to the Java ArrayList](http://www.baeldung.com/java-arraylist) +- [Random List Element](http://www.baeldung.com/java-random-list-element) +- [Removing all nulls from a List in Java](http://www.baeldung.com/java-remove-nulls-from-list) +- [Removing all duplicates from a List in Java](http://www.baeldung.com/java-remove-duplicates-from-list) +- [How to TDD a List Implementation in Java](http://www.baeldung.com/java-test-driven-list) +- [Iterating Backward Through a List](http://www.baeldung.com/java-list-iterate-backwards) +- [Add Multiple Items to an Java ArrayList](http://www.baeldung.com/java-add-items-array-list) +- [Remove the First Element from a List](http://www.baeldung.com/java-remove-first-element-from-list) +- [How to Find an Element in a List with Java](http://www.baeldung.com/find-list-element-java) +- [Copy a List to Another List in Java](http://www.baeldung.com/java-copy-list-to-another) +- [Finding Max/Min of a List or Collection](http://www.baeldung.com/java-collection-min-max) +- [Collections.emptyList() vs. New List Instance](https://www.baeldung.com/java-collections-emptylist-new-list) +- [Remove All Occurrences of a Specific Value from a List](https://www.baeldung.com/java-remove-value-from-list) +- [Converting a Collection to ArrayList in Java](https://www.baeldung.com/java-convert-collection-arraylist) +- [Check If Two Lists are Equal in Java](http://www.baeldung.com/java-test-a-list-for-ordinality-and-equality) +- [Java 8 Streams: Find Items From One List Based On Values From Another List](https://www.baeldung.com/java-streams-find-list-items) +- [A Guide to the Java LinkedList](http://www.baeldung.com/java-linkedlist) +- [Java List UnsupportedOperationException](http://www.baeldung.com/java-list-unsupported-operation-exception) +- [Java List Initialization in One Line](https://www.baeldung.com/java-init-list-one-line) +- [Ways to Iterate Over a List in Java](https://www.baeldung.com/java-iterate-list) +- [ClassCastException: Arrays$ArrayList cannot be cast to ArrayList](https://www.baeldung.com/java-classcastexception-arrays-arraylist) +- [Flattening Nested Collections in Java](http://www.baeldung.com/java-flatten-nested-collections) \ No newline at end of file diff --git a/core-java-collections-list/pom.xml b/core-java-collections-list/pom.xml new file mode 100644 index 0000000000..ee99e470d0 --- /dev/null +++ b/core-java-collections-list/pom.xml @@ -0,0 +1,48 @@ + + 4.0.0 + core-java-collections-list + 0.1.0-SNAPSHOT + jar + core-java-collections-list + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + + + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + org.assertj + assertj-core + ${assertj.version} + test + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + + 4.1 + 3.8.1 + 1.7.0 + 3.11.1 + 1.16.12 + + diff --git a/core-java-collections/src/main/java/com/baeldung/classcastexception/ClassCastException.java b/core-java-collections-list/src/main/java/com/baeldung/classcastexception/ClassCastException.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/classcastexception/ClassCastException.java rename to core-java-collections-list/src/main/java/com/baeldung/classcastexception/ClassCastException.java diff --git a/core-java-collections/src/main/java/com/baeldung/findanelement/Customer.java b/core-java-collections-list/src/main/java/com/baeldung/findanelement/Customer.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/findanelement/Customer.java rename to core-java-collections-list/src/main/java/com/baeldung/findanelement/Customer.java diff --git a/core-java-collections/src/main/java/com/baeldung/findanelement/FindACustomerInGivenList.java b/core-java-collections-list/src/main/java/com/baeldung/findanelement/FindACustomerInGivenList.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/findanelement/FindACustomerInGivenList.java rename to core-java-collections-list/src/main/java/com/baeldung/findanelement/FindACustomerInGivenList.java diff --git a/core-java-collections/src/main/java/com/baeldung/java/list/CopyListService.java b/core-java-collections-list/src/main/java/com/baeldung/java/list/CopyListService.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/java/list/CopyListService.java rename to core-java-collections-list/src/main/java/com/baeldung/java/list/CopyListService.java diff --git a/core-java-collections/src/main/java/com/baeldung/java/list/CustomList.java b/core-java-collections-list/src/main/java/com/baeldung/java/list/CustomList.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/java/list/CustomList.java rename to core-java-collections-list/src/main/java/com/baeldung/java/list/CustomList.java diff --git a/core-java-collections/src/main/java/com/baeldung/java/list/Flower.java b/core-java-collections-list/src/main/java/com/baeldung/java/list/Flower.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/java/list/Flower.java rename to core-java-collections-list/src/main/java/com/baeldung/java/list/Flower.java diff --git a/core-java-collections/src/main/java/com/baeldung/java/list/ReverseIterator.java b/core-java-collections-list/src/main/java/com/baeldung/java/list/ReverseIterator.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/java/list/ReverseIterator.java rename to core-java-collections-list/src/main/java/com/baeldung/java/list/ReverseIterator.java diff --git a/core-java-collections/src/main/java/com/baeldung/java/list/WaysToIterate.java b/core-java-collections-list/src/main/java/com/baeldung/java/list/WaysToIterate.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/java/list/WaysToIterate.java rename to core-java-collections-list/src/main/java/com/baeldung/java/list/WaysToIterate.java diff --git a/core-java-collections/src/main/java/com/baeldung/java_8_features/Car.java b/core-java-collections-list/src/main/java/com/baeldung/java_8_features/Car.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/java_8_features/Car.java rename to core-java-collections-list/src/main/java/com/baeldung/java_8_features/Car.java diff --git a/core-java-collections/src/main/java/com/baeldung/java_8_features/Person.java b/core-java-collections-list/src/main/java/com/baeldung/java_8_features/Person.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/java_8_features/Person.java rename to core-java-collections-list/src/main/java/com/baeldung/java_8_features/Person.java diff --git a/core-java-collections/src/main/java/com/baeldung/list/listoflist/Pen.java b/core-java-collections-list/src/main/java/com/baeldung/list/listoflist/Pen.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/list/listoflist/Pen.java rename to core-java-collections-list/src/main/java/com/baeldung/list/listoflist/Pen.java diff --git a/core-java-collections/src/main/java/com/baeldung/list/listoflist/Pencil.java b/core-java-collections-list/src/main/java/com/baeldung/list/listoflist/Pencil.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/list/listoflist/Pencil.java rename to core-java-collections-list/src/main/java/com/baeldung/list/listoflist/Pencil.java diff --git a/core-java-collections/src/main/java/com/baeldung/list/listoflist/Rubber.java b/core-java-collections-list/src/main/java/com/baeldung/list/listoflist/Rubber.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/list/listoflist/Rubber.java rename to core-java-collections-list/src/main/java/com/baeldung/list/listoflist/Rubber.java diff --git a/core-java-collections/src/main/java/com/baeldung/list/listoflist/Stationery.java b/core-java-collections-list/src/main/java/com/baeldung/list/listoflist/Stationery.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/list/listoflist/Stationery.java rename to core-java-collections-list/src/main/java/com/baeldung/list/listoflist/Stationery.java diff --git a/core-java-collections/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java b/core-java-collections-list/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java rename to core-java-collections-list/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java diff --git a/core-java-collections/src/main/java/com/baeldung/list/multidimensional/ThreeDimensionalArrayList.java b/core-java-collections-list/src/main/java/com/baeldung/list/multidimensional/ThreeDimensionalArrayList.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/list/multidimensional/ThreeDimensionalArrayList.java rename to core-java-collections-list/src/main/java/com/baeldung/list/multidimensional/ThreeDimensionalArrayList.java diff --git a/core-java-collections/src/main/java/com/baeldung/list/removeall/RemoveAll.java b/core-java-collections-list/src/main/java/com/baeldung/list/removeall/RemoveAll.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/list/removeall/RemoveAll.java rename to core-java-collections-list/src/main/java/com/baeldung/list/removeall/RemoveAll.java diff --git a/core-java-collections-list/src/main/resources/logback.xml b/core-java-collections-list/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/core-java-collections-list/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/core-java-collections/src/test/java/com/baeldung/array/converter/ArrayConvertToListUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/array/converter/ArrayConvertToListUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/array/converter/ArrayConvertToListUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/array/converter/ArrayConvertToListUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/collection/ClearVsRemoveAllUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/collection/ClearVsRemoveAllUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/collection/ClearVsRemoveAllUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/collection/ClearVsRemoveAllUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/collection/CollectionsEmpty.java b/core-java-collections-list/src/test/java/com/baeldung/collection/CollectionsEmpty.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/collection/CollectionsEmpty.java rename to core-java-collections-list/src/test/java/com/baeldung/collection/CollectionsEmpty.java diff --git a/core-java-collections/src/test/java/com/baeldung/findItems/FindItemsBasedOnOtherStreamUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/findItems/FindItemsBasedOnOtherStreamUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/findItems/FindItemsBasedOnOtherStreamUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/findItems/FindItemsBasedOnOtherStreamUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/findanelement/FindACustomerInGivenListUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/findanelement/FindACustomerInGivenListUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/findanelement/FindACustomerInGivenListUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/findanelement/FindACustomerInGivenListUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/java/list/CustomListUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/java/list/CustomListUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/java/list/CustomListUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/java/list/CustomListUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/java/list/ReverseIteratorUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/java/list/ReverseIteratorUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/java/list/ReverseIteratorUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/java/list/ReverseIteratorUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/java/list/WaysToIterateUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/java/list/WaysToIterateUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/java/list/WaysToIterateUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/java/list/WaysToIterateUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/java8/Java8MaxMinUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/java8/Java8MaxMinUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/java8/Java8MaxMinUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/java8/Java8MaxMinUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/list/listoflist/AddElementsToListUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/list/listoflist/AddElementsToListUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/list/listoflist/AddElementsToListUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/list/listoflist/AddElementsToListUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/list/listoflist/ListOfListsUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/list/listoflist/ListOfListsUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/list/listoflist/ListOfListsUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/list/listoflist/ListOfListsUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/list/removeall/RemoveAllUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/list/removeall/RemoveAllUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/list/removeall/RemoveAllUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/list/removeall/RemoveAllUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/list/removefirst/RemoveFirstElementUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/list/removefirst/RemoveFirstElementUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/list/removefirst/RemoveFirstElementUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/list/removefirst/RemoveFirstElementUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/RandomListElementUnitTest.java b/core-java-collections-list/src/test/java/org/baeldung/RandomListElementUnitTest.java similarity index 98% rename from core-java/src/test/java/com/baeldung/RandomListElementUnitTest.java rename to core-java-collections-list/src/test/java/org/baeldung/RandomListElementUnitTest.java index 6ae7c40f4d..4f5ba0f82f 100644 --- a/core-java/src/test/java/com/baeldung/RandomListElementUnitTest.java +++ b/core-java-collections-list/src/test/java/org/baeldung/RandomListElementUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung; +package org.baeldung; import com.google.common.collect.Lists; import org.junit.Test; diff --git a/core-java-collections/src/test/java/org/baeldung/java/collections/ArrayListUnitTest.java b/core-java-collections-list/src/test/java/org/baeldung/java/collections/ArrayListUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/org/baeldung/java/collections/ArrayListUnitTest.java rename to core-java-collections-list/src/test/java/org/baeldung/java/collections/ArrayListUnitTest.java diff --git a/core-java-collections/src/test/java/org/baeldung/java/collections/CoreJavaCollectionsUnitTest.java b/core-java-collections-list/src/test/java/org/baeldung/java/collections/CoreJavaCollectionsUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/org/baeldung/java/collections/CoreJavaCollectionsUnitTest.java rename to core-java-collections-list/src/test/java/org/baeldung/java/collections/CoreJavaCollectionsUnitTest.java diff --git a/core-java-collections/src/test/java/org/baeldung/java/collections/JavaCollectionCleanupUnitTest.java b/core-java-collections-list/src/test/java/org/baeldung/java/collections/JavaCollectionCleanupUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/org/baeldung/java/collections/JavaCollectionCleanupUnitTest.java rename to core-java-collections-list/src/test/java/org/baeldung/java/collections/JavaCollectionCleanupUnitTest.java diff --git a/core-java-collections/src/test/java/org/baeldung/java/lists/ListAssertJUnitTest.java b/core-java-collections-list/src/test/java/org/baeldung/java/lists/ListAssertJUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/org/baeldung/java/lists/ListAssertJUnitTest.java rename to core-java-collections-list/src/test/java/org/baeldung/java/lists/ListAssertJUnitTest.java diff --git a/core-java-collections/src/test/java/org/baeldung/java/lists/ListJUnitTest.java b/core-java-collections-list/src/test/java/org/baeldung/java/lists/ListJUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/org/baeldung/java/lists/ListJUnitTest.java rename to core-java-collections-list/src/test/java/org/baeldung/java/lists/ListJUnitTest.java diff --git a/core-java-collections/src/test/java/org/baeldung/java/lists/ListTestNgUnitTest.java b/core-java-collections-list/src/test/java/org/baeldung/java/lists/ListTestNgUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/org/baeldung/java/lists/ListTestNgUnitTest.java rename to core-java-collections-list/src/test/java/org/baeldung/java/lists/ListTestNgUnitTest.java diff --git a/core-java-collections/src/test/java/org/baeldung/java/lists/README.md b/core-java-collections-list/src/test/java/org/baeldung/java/lists/README.md similarity index 100% rename from core-java-collections/src/test/java/org/baeldung/java/lists/README.md rename to core-java-collections-list/src/test/java/org/baeldung/java/lists/README.md diff --git a/core-java-collections/README.md b/core-java-collections/README.md index 4c0b24cd5d..15be81156c 100644 --- a/core-java-collections/README.md +++ b/core-java-collections/README.md @@ -3,36 +3,21 @@ ## Core Java Collections Cookbooks and Examples ### Relevant Articles: -- [Immutable ArrayList in Java](http://www.baeldung.com/java-immutable-list) -- [Guide to the Java ArrayList](http://www.baeldung.com/java-arraylist) -- [Random List Element](http://www.baeldung.com/java-random-list-element) - [Java - Combine Multiple Collections](http://www.baeldung.com/java-combine-multiple-collections) -- [Removing all nulls from a List in Java](http://www.baeldung.com/java-remove-nulls-from-list) -- [Removing all duplicates from a List in Java](http://www.baeldung.com/java-remove-duplicates-from-list) -- [Flattening Nested Collections in Java](http://www.baeldung.com/java-flatten-nested-collections) - [HashSet and TreeSet Comparison](http://www.baeldung.com/java-hashset-vs-treeset) - [Collect a Java Stream to an Immutable Collection](http://www.baeldung.com/java-stream-immutable-collection) - [Introduction to the Java ArrayDeque](http://www.baeldung.com/java-array-deque) - [A Guide to HashSet in Java](http://www.baeldung.com/java-hashset) - [A Guide to TreeSet in Java](http://www.baeldung.com/java-tree-set) -- [How to TDD a List Implementation in Java](http://www.baeldung.com/java-test-driven-list) - [Getting the Size of an Iterable in Java](http://www.baeldung.com/java-iterable-size) -- [Iterating Backward Through a List](http://www.baeldung.com/java-list-iterate-backwards) - [How to Filter a Collection in Java](http://www.baeldung.com/java-collection-filtering) -- [Add Multiple Items to an Java ArrayList](http://www.baeldung.com/java-add-items-array-list) -- [Remove the First Element from a List](http://www.baeldung.com/java-remove-first-element-from-list) - [Initializing HashSet at the Time of Construction](http://www.baeldung.com/java-initialize-hashset) - [Removing the First Element of an Array](https://www.baeldung.com/java-array-remove-first-element) - [Fail-Safe Iterator vs Fail-Fast Iterator](http://www.baeldung.com/java-fail-safe-vs-fail-fast-iterator) - [Shuffling Collections In Java](http://www.baeldung.com/java-shuffle-collection) -- [How to Find an Element in a List with Java](http://www.baeldung.com/find-list-element-java) - [An Introduction to Java.util.Hashtable Class](http://www.baeldung.com/java-hash-table) -- [Copy a List to Another List in Java](http://www.baeldung.com/java-copy-list-to-another) -- [Finding Max/Min of a List or Collection](http://www.baeldung.com/java-collection-min-max) - [Java Null-Safe Streams from Collections](https://www.baeldung.com/java-null-safe-streams-from-collections) -- [Remove All Occurrences of a Specific Value from a List](https://www.baeldung.com/java-remove-value-from-list) - [Thread Safe LIFO Data Structure Implementations](https://www.baeldung.com/java-lifo-thread-safe) -- [Collections.emptyList() vs. New List Instance](https://www.baeldung.com/java-collections-emptylist-new-list) - [Differences Between Collection.clear() and Collection.removeAll()](https://www.baeldung.com/java-collection-clear-vs-removeall) - [Performance of contains() in a HashSet vs ArrayList](https://www.baeldung.com/java-hashset-arraylist-contains-performance) - [Time Complexity of Java Collections](https://www.baeldung.com/java-collections-complexity) @@ -40,15 +25,7 @@ - [An Introduction to Synchronized Java Collections](https://www.baeldung.com/java-synchronized-collections) - [Guide to EnumSet](https://www.baeldung.com/java-enumset) - [Removing Elements from Java Collections](https://www.baeldung.com/java-collection-remove-elements) -- [Converting a Collection to ArrayList in Java](https://www.baeldung.com/java-convert-collection-arraylist) -- [Java 8 Streams: Find Items From One List Based On Values From Another List](https://www.baeldung.com/java-streams-find-list-items) - [Combining Different Types of Collections in Java](https://www.baeldung.com/java-combine-collections) - [Sorting in Java](http://www.baeldung.com/java-sorting) -- [A Guide to the Java LinkedList](http://www.baeldung.com/java-linkedlist) -- [Java List UnsupportedOperationException](http://www.baeldung.com/java-list-unsupported-operation-exception) - [Join and Split Arrays and Collections in Java](http://www.baeldung.com/java-join-and-split) -- [Check If Two Lists are Equal in Java](http://www.baeldung.com/java-test-a-list-for-ordinality-and-equality) -- [Java List Initialization in One Line](https://www.baeldung.com/java-init-list-one-line) -- [ClassCastException: Arrays$ArrayList cannot be cast to ArrayList](https://www.baeldung.com/java-classcastexception-arrays-arraylist) -- [A Guide to EnumMap](https://www.baeldung.com/java-enum-map) -- [Ways to Iterate Over a List in Java](https://www.baeldung.com/java-iterate-list) +- [A Guide to EnumMap](https://www.baeldung.com/java-enum-map) \ No newline at end of file diff --git a/pom.xml b/pom.xml index d3a665b4e1..03cc78c9a9 100644 --- a/pom.xml +++ b/pom.xml @@ -379,6 +379,7 @@ core-java-arrays core-java-collections + core-java-collections-list core-java-concurrency-collections core-java-io core-java-lang @@ -1086,6 +1087,7 @@ core-java-arrays core-java-collections + core-java-collections-list core-java-concurrency-collections core-java-io core-java-lang From e8b07fea1dc1b44fcb904c3d0d33ae27ffd4ecd3 Mon Sep 17 00:00:00 2001 From: Ganesh Pagade Date: Sun, 23 Dec 2018 12:05:51 +0530 Subject: [PATCH 168/359] unit tests for nest based access control --- .../src/main/java/com/baeldung/Outer.java | 24 +++++++++ .../test/java/com/baeldung/OuterUnitTest.java | 50 +++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 core-java-11/src/main/java/com/baeldung/Outer.java create mode 100644 core-java-11/src/test/java/com/baeldung/OuterUnitTest.java diff --git a/core-java-11/src/main/java/com/baeldung/Outer.java b/core-java-11/src/main/java/com/baeldung/Outer.java new file mode 100644 index 0000000000..e2f1479ab1 --- /dev/null +++ b/core-java-11/src/main/java/com/baeldung/Outer.java @@ -0,0 +1,24 @@ +package com.baeldung; + +import java.lang.reflect.Method; + +public class Outer { + + public void outerPublic() { + } + + private void outerPrivate() { + } + + class Inner { + + public void innerPublic() { + outerPrivate(); + } + + public void innerPublicReflection(Outer ob) throws Exception { + Method method = ob.getClass().getDeclaredMethod("outerPrivate"); + method.invoke(ob); + } + } +} \ No newline at end of file diff --git a/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java b/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java new file mode 100644 index 0000000000..a954416f68 --- /dev/null +++ b/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java @@ -0,0 +1,50 @@ +package com.baeldung; + +import static org.hamcrest.CoreMatchers.is; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import org.junit.Test; + +public class OuterUnitTest { + + private static final String NEST_HOST_NAME = "com.baeldung.Outer"; + + @Test + public void whenGetNestHostFromOuter_thenGetNestHost() { + is(Outer.class.getNestHost().getName()).equals(NEST_HOST_NAME); + } + + @Test + public void whenGetNestHostFromInner_thenGetNestHost() { + is(Outer.Inner.class.getNestHost().getName()).equals(NEST_HOST_NAME); + } + + @Test + public void whenCheckNestmatesForNestedClasses_thenGetTrue() { + is(Outer.Inner.class.isNestmateOf(Outer.class)).equals(true); + } + + @Test + public void whenCheckNestmatesForUnrelatedClasses_thenGetFalse() { + is(Outer.Inner.class.isNestmateOf(Outer.class)).equals(false); + } + + @Test + public void whenGetNestMembersForNestedClasses_thenGetAllNestedClasses() { + List nestMembers = Arrays.stream(Outer.Inner.class.getNestMembers()) + .map(Class::getName) + .collect(Collectors.toList()); + + is(nestMembers.size()).equals(2); + + boolean containsOuter = nestMembers.stream() + .anyMatch("com.baeldung.Outer"::equals); + is(containsOuter).equals(true); + + boolean containsInner = nestMembers.stream() + .anyMatch("com.baeldung.Outer$Inner"::equals); + is(containsInner).equals(true); + } +} \ No newline at end of file From 338b0bc80cf15eb20e9f9201e8efafc3d2a65eab Mon Sep 17 00:00:00 2001 From: Ganesh Pagade Date: Sun, 23 Dec 2018 12:08:36 +0530 Subject: [PATCH 169/359] format --- .../src/main/java/com/baeldung/Outer.java | 30 +++++----- .../test/java/com/baeldung/OuterUnitTest.java | 60 +++++++++---------- 2 files changed, 45 insertions(+), 45 deletions(-) diff --git a/core-java-11/src/main/java/com/baeldung/Outer.java b/core-java-11/src/main/java/com/baeldung/Outer.java index e2f1479ab1..1d3cd72b44 100644 --- a/core-java-11/src/main/java/com/baeldung/Outer.java +++ b/core-java-11/src/main/java/com/baeldung/Outer.java @@ -4,21 +4,21 @@ import java.lang.reflect.Method; public class Outer { - public void outerPublic() { - } - - private void outerPrivate() { - } - - class Inner { - - public void innerPublic() { - outerPrivate(); + public void outerPublic() { } - public void innerPublicReflection(Outer ob) throws Exception { - Method method = ob.getClass().getDeclaredMethod("outerPrivate"); - method.invoke(ob); - } - } + private void outerPrivate() { + } + + class Inner { + + public void innerPublic() { + outerPrivate(); + } + + public void innerPublicReflection(Outer ob) throws Exception { + Method method = ob.getClass().getDeclaredMethod("outerPrivate"); + method.invoke(ob); + } + } } \ No newline at end of file diff --git a/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java b/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java index a954416f68..6680a8d518 100644 --- a/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java +++ b/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java @@ -9,42 +9,42 @@ import org.junit.Test; public class OuterUnitTest { - private static final String NEST_HOST_NAME = "com.baeldung.Outer"; + private static final String NEST_HOST_NAME = "com.baeldung.Outer"; - @Test - public void whenGetNestHostFromOuter_thenGetNestHost() { - is(Outer.class.getNestHost().getName()).equals(NEST_HOST_NAME); - } + @Test + public void whenGetNestHostFromOuter_thenGetNestHost() { + is(Outer.class.getNestHost().getName()).equals(NEST_HOST_NAME); + } - @Test - public void whenGetNestHostFromInner_thenGetNestHost() { - is(Outer.Inner.class.getNestHost().getName()).equals(NEST_HOST_NAME); - } + @Test + public void whenGetNestHostFromInner_thenGetNestHost() { + is(Outer.Inner.class.getNestHost().getName()).equals(NEST_HOST_NAME); + } - @Test - public void whenCheckNestmatesForNestedClasses_thenGetTrue() { - is(Outer.Inner.class.isNestmateOf(Outer.class)).equals(true); - } + @Test + public void whenCheckNestmatesForNestedClasses_thenGetTrue() { + is(Outer.Inner.class.isNestmateOf(Outer.class)).equals(true); + } - @Test - public void whenCheckNestmatesForUnrelatedClasses_thenGetFalse() { - is(Outer.Inner.class.isNestmateOf(Outer.class)).equals(false); - } + @Test + public void whenCheckNestmatesForUnrelatedClasses_thenGetFalse() { + is(Outer.Inner.class.isNestmateOf(Outer.class)).equals(false); + } - @Test - public void whenGetNestMembersForNestedClasses_thenGetAllNestedClasses() { - List nestMembers = Arrays.stream(Outer.Inner.class.getNestMembers()) - .map(Class::getName) - .collect(Collectors.toList()); + @Test + public void whenGetNestMembersForNestedClasses_thenGetAllNestedClasses() { + List nestMembers = Arrays.stream(Outer.Inner.class.getNestMembers()) + .map(Class::getName) + .collect(Collectors.toList()); - is(nestMembers.size()).equals(2); + is(nestMembers.size()).equals(2); - boolean containsOuter = nestMembers.stream() - .anyMatch("com.baeldung.Outer"::equals); - is(containsOuter).equals(true); + boolean containsOuter = nestMembers.stream() + .anyMatch("com.baeldung.Outer"::equals); + is(containsOuter).equals(true); - boolean containsInner = nestMembers.stream() - .anyMatch("com.baeldung.Outer$Inner"::equals); - is(containsInner).equals(true); - } + boolean containsInner = nestMembers.stream() + .anyMatch("com.baeldung.Outer$Inner"::equals); + is(containsInner).equals(true); + } } \ No newline at end of file From ec53cb77ac9f342c71b495999c817116038a406f Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 23 Dec 2018 16:32:19 +0530 Subject: [PATCH 170/359] [BAEL-9044] - Moved articles out of core-java --- core-java-concurrency/README.md | 3 +++ core-java-concurrency/pom.xml | 12 ++++++++++++ .../forkjoin/CustomRecursiveAction.java | 0 .../forkjoin/CustomRecursiveTask.java | 0 .../com/baeldung/forkjoin/util/PoolUtil.java | 0 .../ThreadLocalRandomBenchMarkRunner.java | 0 .../ThreadLocalRandomBenchMarker.java | 0 .../java8/Java8ForkJoinIntegrationTest.java | 0 .../thread/join/ThreadJoinUnitTest.java | 0 .../ThreadLocalRandomIntegrationTest.java | 0 core-java-networking/README.md | 4 ++++ core-java-networking/pom.xml | 12 ++++++++++++ .../baeldung/console/ConsoleConsoleClass.java | 0 .../baeldung/console/ConsoleScannerClass.java | 0 .../java/com/baeldung/mail/EmailService.java | 0 .../java/com/baeldung/networking/README.md | 0 .../cookies/PersistentCookieStore.java | 0 .../cookies/ProxyAcceptCookiePolicy.java | 0 .../baeldung/networking/udp/EchoClient.java | 0 .../baeldung/networking/udp/EchoServer.java | 0 .../udp/broadcast/BroadcastingClient.java | 0 .../udp/broadcast/BroadcastingEchoServer.java | 0 .../udp/multicast/MulticastEchoServer.java | 0 .../udp/multicast/MulticastingClient.java | 0 .../src/main/resources/logback.xml | 19 +++++++++++++++++++ .../baeldung/networking/udp/UDPLiveTest.java | 0 .../udp/broadcast/BroadcastLiveTest.java | 0 .../udp/multicast/MulticastLiveTest.java | 0 core-java/README.md | 14 -------------- core-java/pom.xml | 6 ------ patterns/README.md | 8 +++++++- .../application/Application.java | 0 .../entities/User.java | 0 .../UserUnitTest.java | 0 34 files changed, 57 insertions(+), 21 deletions(-) rename {core-java => core-java-concurrency}/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java (100%) rename {core-java => core-java-concurrency}/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java (100%) rename {core-java => core-java-concurrency}/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java (100%) rename {core-java => core-java-concurrency}/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java (100%) rename {core-java => core-java-concurrency}/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java (100%) rename {core-java => core-java-concurrency}/src/test/java/com/baeldung/java8/Java8ForkJoinIntegrationTest.java (100%) rename {core-java => core-java-concurrency}/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java (100%) rename {core-java => core-java-concurrency}/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/console/ConsoleConsoleClass.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/console/ConsoleScannerClass.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/mail/EmailService.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/networking/README.md (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/networking/cookies/PersistentCookieStore.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/networking/cookies/ProxyAcceptCookiePolicy.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/networking/udp/EchoClient.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/networking/udp/EchoServer.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingClient.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingEchoServer.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/networking/udp/multicast/MulticastEchoServer.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/networking/udp/multicast/MulticastingClient.java (100%) create mode 100644 core-java-networking/src/main/resources/logback.xml rename {core-java => core-java-networking}/src/test/java/com/baeldung/networking/udp/UDPLiveTest.java (100%) rename {core-java => core-java-networking}/src/test/java/com/baeldung/networking/udp/broadcast/BroadcastLiveTest.java (100%) rename {core-java => core-java-networking}/src/test/java/com/baeldung/networking/udp/multicast/MulticastLiveTest.java (100%) rename {core-java => patterns/design-patterns}/src/main/java/com/baeldung/constructorsstaticfactorymethods/application/Application.java (100%) rename {core-java => patterns/design-patterns}/src/main/java/com/baeldung/constructorsstaticfactorymethods/entities/User.java (100%) rename {core-java => patterns/design-patterns}/src/test/java/com/baeldung/constructorsstaticfactorymethods/UserUnitTest.java (100%) diff --git a/core-java-concurrency/README.md b/core-java-concurrency/README.md index 2db7b91cde..e8693a0231 100644 --- a/core-java-concurrency/README.md +++ b/core-java-concurrency/README.md @@ -31,3 +31,6 @@ - [Brief Introduction to Java Thread.yield()](https://www.baeldung.com/java-thread-yield) - [Print Even and Odd Numbers Using 2 Threads](https://www.baeldung.com/java-even-odd-numbers-with-2-threads) - [Java CyclicBarrier vs CountDownLatch](https://www.baeldung.com/java-cyclicbarrier-countdownlatch) +- [Guide to the Fork/Join Framework in Java](http://www.baeldung.com/java-fork-join) +- [A Guide to ThreadLocalRandom in Java](http://www.baeldung.com/java-thread-local-random) +- [The Thread.join() Method in Java](http://www.baeldung.com/java-thread-join) \ No newline at end of file diff --git a/core-java-concurrency/pom.xml b/core-java-concurrency/pom.xml index bd22253c2c..5dde4d5820 100644 --- a/core-java-concurrency/pom.xml +++ b/core-java-concurrency/pom.xml @@ -47,6 +47,16 @@ ${avaitility.version} test + + org.openjdk.jmh + jmh-core + ${jmh-core.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh-generator-annprocess.version} + @@ -69,6 +79,8 @@ 3.6.1 1.7.0 + 1.19 + 1.19 diff --git a/core-java/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java b/core-java-concurrency/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java similarity index 100% rename from core-java/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java rename to core-java-concurrency/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java diff --git a/core-java/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java b/core-java-concurrency/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java similarity index 100% rename from core-java/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java rename to core-java-concurrency/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java diff --git a/core-java/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java b/core-java-concurrency/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java similarity index 100% rename from core-java/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java rename to core-java-concurrency/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java diff --git a/core-java/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java b/core-java-concurrency/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java similarity index 100% rename from core-java/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java rename to core-java-concurrency/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java diff --git a/core-java/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java b/core-java-concurrency/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java similarity index 100% rename from core-java/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java rename to core-java-concurrency/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java diff --git a/core-java/src/test/java/com/baeldung/java8/Java8ForkJoinIntegrationTest.java b/core-java-concurrency/src/test/java/com/baeldung/java8/Java8ForkJoinIntegrationTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/java8/Java8ForkJoinIntegrationTest.java rename to core-java-concurrency/src/test/java/com/baeldung/java8/Java8ForkJoinIntegrationTest.java diff --git a/core-java/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java rename to core-java-concurrency/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java b/core-java-concurrency/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java rename to core-java-concurrency/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java diff --git a/core-java-networking/README.md b/core-java-networking/README.md index 626ea794e6..2cb2c52d3d 100644 --- a/core-java-networking/README.md +++ b/core-java-networking/README.md @@ -5,3 +5,7 @@ ### Relevant Articles - [Connecting Through Proxy Servers in Core Java](https://www.baeldung.com/java-connect-via-proxy-server) +- [Broadcasting and Multicasting in Java](http://www.baeldung.com/java-broadcast-multicast) +- [A Guide To UDP In Java](http://www.baeldung.com/udp-in-java) +- [Sending Emails with Java](http://www.baeldung.com/java-email) +- [Console I/O in Java](http://www.baeldung.com/java-console-input-output) \ No newline at end of file diff --git a/core-java-networking/pom.xml b/core-java-networking/pom.xml index 178295e1ec..7d7bf4bc95 100644 --- a/core-java-networking/pom.xml +++ b/core-java-networking/pom.xml @@ -13,7 +13,19 @@ ../parent-java + + + javax.mail + mail + ${javax.mail.version} + + + core-java-networking + + + 1.5.0-b01 + diff --git a/core-java/src/main/java/com/baeldung/console/ConsoleConsoleClass.java b/core-java-networking/src/main/java/com/baeldung/console/ConsoleConsoleClass.java similarity index 100% rename from core-java/src/main/java/com/baeldung/console/ConsoleConsoleClass.java rename to core-java-networking/src/main/java/com/baeldung/console/ConsoleConsoleClass.java diff --git a/core-java/src/main/java/com/baeldung/console/ConsoleScannerClass.java b/core-java-networking/src/main/java/com/baeldung/console/ConsoleScannerClass.java similarity index 100% rename from core-java/src/main/java/com/baeldung/console/ConsoleScannerClass.java rename to core-java-networking/src/main/java/com/baeldung/console/ConsoleScannerClass.java diff --git a/core-java/src/main/java/com/baeldung/mail/EmailService.java b/core-java-networking/src/main/java/com/baeldung/mail/EmailService.java similarity index 100% rename from core-java/src/main/java/com/baeldung/mail/EmailService.java rename to core-java-networking/src/main/java/com/baeldung/mail/EmailService.java diff --git a/core-java/src/main/java/com/baeldung/networking/README.md b/core-java-networking/src/main/java/com/baeldung/networking/README.md similarity index 100% rename from core-java/src/main/java/com/baeldung/networking/README.md rename to core-java-networking/src/main/java/com/baeldung/networking/README.md diff --git a/core-java/src/main/java/com/baeldung/networking/cookies/PersistentCookieStore.java b/core-java-networking/src/main/java/com/baeldung/networking/cookies/PersistentCookieStore.java similarity index 100% rename from core-java/src/main/java/com/baeldung/networking/cookies/PersistentCookieStore.java rename to core-java-networking/src/main/java/com/baeldung/networking/cookies/PersistentCookieStore.java diff --git a/core-java/src/main/java/com/baeldung/networking/cookies/ProxyAcceptCookiePolicy.java b/core-java-networking/src/main/java/com/baeldung/networking/cookies/ProxyAcceptCookiePolicy.java similarity index 100% rename from core-java/src/main/java/com/baeldung/networking/cookies/ProxyAcceptCookiePolicy.java rename to core-java-networking/src/main/java/com/baeldung/networking/cookies/ProxyAcceptCookiePolicy.java diff --git a/core-java/src/main/java/com/baeldung/networking/udp/EchoClient.java b/core-java-networking/src/main/java/com/baeldung/networking/udp/EchoClient.java similarity index 100% rename from core-java/src/main/java/com/baeldung/networking/udp/EchoClient.java rename to core-java-networking/src/main/java/com/baeldung/networking/udp/EchoClient.java diff --git a/core-java/src/main/java/com/baeldung/networking/udp/EchoServer.java b/core-java-networking/src/main/java/com/baeldung/networking/udp/EchoServer.java similarity index 100% rename from core-java/src/main/java/com/baeldung/networking/udp/EchoServer.java rename to core-java-networking/src/main/java/com/baeldung/networking/udp/EchoServer.java diff --git a/core-java/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingClient.java b/core-java-networking/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingClient.java similarity index 100% rename from core-java/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingClient.java rename to core-java-networking/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingClient.java diff --git a/core-java/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingEchoServer.java b/core-java-networking/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingEchoServer.java similarity index 100% rename from core-java/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingEchoServer.java rename to core-java-networking/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingEchoServer.java diff --git a/core-java/src/main/java/com/baeldung/networking/udp/multicast/MulticastEchoServer.java b/core-java-networking/src/main/java/com/baeldung/networking/udp/multicast/MulticastEchoServer.java similarity index 100% rename from core-java/src/main/java/com/baeldung/networking/udp/multicast/MulticastEchoServer.java rename to core-java-networking/src/main/java/com/baeldung/networking/udp/multicast/MulticastEchoServer.java diff --git a/core-java/src/main/java/com/baeldung/networking/udp/multicast/MulticastingClient.java b/core-java-networking/src/main/java/com/baeldung/networking/udp/multicast/MulticastingClient.java similarity index 100% rename from core-java/src/main/java/com/baeldung/networking/udp/multicast/MulticastingClient.java rename to core-java-networking/src/main/java/com/baeldung/networking/udp/multicast/MulticastingClient.java diff --git a/core-java-networking/src/main/resources/logback.xml b/core-java-networking/src/main/resources/logback.xml new file mode 100644 index 0000000000..56af2d397e --- /dev/null +++ b/core-java-networking/src/main/resources/logback.xml @@ -0,0 +1,19 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/networking/udp/UDPLiveTest.java b/core-java-networking/src/test/java/com/baeldung/networking/udp/UDPLiveTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/networking/udp/UDPLiveTest.java rename to core-java-networking/src/test/java/com/baeldung/networking/udp/UDPLiveTest.java diff --git a/core-java/src/test/java/com/baeldung/networking/udp/broadcast/BroadcastLiveTest.java b/core-java-networking/src/test/java/com/baeldung/networking/udp/broadcast/BroadcastLiveTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/networking/udp/broadcast/BroadcastLiveTest.java rename to core-java-networking/src/test/java/com/baeldung/networking/udp/broadcast/BroadcastLiveTest.java diff --git a/core-java/src/test/java/com/baeldung/networking/udp/multicast/MulticastLiveTest.java b/core-java-networking/src/test/java/com/baeldung/networking/udp/multicast/MulticastLiveTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/networking/udp/multicast/MulticastLiveTest.java rename to core-java-networking/src/test/java/com/baeldung/networking/udp/multicast/MulticastLiveTest.java diff --git a/core-java/README.md b/core-java/README.md index 4fbc8bbc6e..961ca45cce 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -7,7 +7,6 @@ - [How to Run a Shell Command in Java](http://www.baeldung.com/run-shell-command-in-java) - [MD5 Hashing in Java](http://www.baeldung.com/java-md5) - [A Guide to Java Sockets](http://www.baeldung.com/a-guide-to-java-sockets) -- [Guide to the Fork/Join Framework in Java](http://www.baeldung.com/java-fork-join) - [How to Print Screen in Java](http://www.baeldung.com/print-screen-in-java) - [A Guide To Java Regular Expressions API](http://www.baeldung.com/regular-expressions-java) - [Getting Started with Java Properties](http://www.baeldung.com/java-properties) @@ -27,13 +26,11 @@ - [Guide to UUID in Java](http://www.baeldung.com/java-uuid) - [Guide to Escaping Characters in Java RegExps](http://www.baeldung.com/java-regexp-escape-char) - [Difference between URL and URI](http://www.baeldung.com/java-url-vs-uri) -- [Broadcasting and Multicasting in Java](http://www.baeldung.com/java-broadcast-multicast) - [OutOfMemoryError: GC Overhead Limit Exceeded](http://www.baeldung.com/java-gc-overhead-limit-exceeded) - [Creating a Java Compiler Plugin](http://www.baeldung.com/java-build-compiler-plugin) - [Quick Guide to Java Stack](http://www.baeldung.com/java-stack) - [Guide to java.util.Formatter](http://www.baeldung.com/java-string-formatter) - [Guide to the Cipher Class](http://www.baeldung.com/java-cipher-class) -- [A Guide to ThreadLocalRandom in Java](http://www.baeldung.com/java-thread-local-random) - [Compiling Java *.class Files with javac](http://www.baeldung.com/javac) - [A Guide to Iterator in Java](http://www.baeldung.com/java-iterator) - [Introduction to Javadoc](http://www.baeldung.com/javadoc) @@ -42,31 +39,20 @@ - [How to Detect the OS Using Java](http://www.baeldung.com/java-detect-os) - [ASCII Art in Java](http://www.baeldung.com/ascii-art-in-java) - [What is the serialVersionUID?](http://www.baeldung.com/java-serial-version-uid) -- [A Guide To UDP In Java](http://www.baeldung.com/udp-in-java) - [A Guide to the ResourceBundle](http://www.baeldung.com/java-resourcebundle) - [Class Loaders in Java](http://www.baeldung.com/java-classloaders) -- [Sending Emails with Java](http://www.baeldung.com/java-email) - [Introduction to SSL in Java](http://www.baeldung.com/java-ssl) - [Java KeyStore API](http://www.baeldung.com/java-keystore) - [Double-Checked Locking with Singleton](http://www.baeldung.com/java-singleton-double-checked-locking) - [Guide to Java Clock Class](http://www.baeldung.com/java-clock) -- [Introduction to Creational Design Patterns](http://www.baeldung.com/creational-design-patterns) -- [Proxy, Decorator, Adapter and Bridge Patterns](http://www.baeldung.com/java-structural-design-patterns) -- [Singletons in Java](http://www.baeldung.com/java-singleton) -- [Flyweight Pattern in Java](http://www.baeldung.com/java-flyweight) -- [The Observer Pattern in Java](http://www.baeldung.com/java-observer-pattern) -- [Service Locator Pattern](http://www.baeldung.com/java-service-locator-pattern) -- [The Thread.join() Method in Java](http://www.baeldung.com/java-thread-join) - [Importance of Main Manifest Attribute in a Self-Executing JAR](http://www.baeldung.com/java-jar-executable-manifest-main-class) - [How to Get the File Extension of a File in Java](http://www.baeldung.com/java-file-extension) -- [Console I/O in Java](http://www.baeldung.com/java-console-input-output) - [Java Global Exception Handler](http://www.baeldung.com/java-global-exception-handler) - [Encrypting and Decrypting Files in Java](http://www.baeldung.com/java-cipher-input-output-stream) - [How to Get the Size of an Object in Java](http://www.baeldung.com/java-size-of-object) - [Guide to Java Instrumentation](http://www.baeldung.com/java-instrumentation) - [Getting a File’s Mime Type in Java](http://www.baeldung.com/java-file-mime-type) - [Common Java Exceptions](http://www.baeldung.com/java-common-exceptions) -- [Java Constructors vs Static Factory Methods](https://www.baeldung.com/java-constructors-vs-static-factory-methods) - [Throw Exception in Optional in Java 8](https://www.baeldung.com/java-optional-throw-exception) - [Add a Character to a String at a Given Position](https://www.baeldung.com/java-add-character-to-string) - [Calculating the nth Root in Java](https://www.baeldung.com/java-nth-root) diff --git a/core-java/pom.xml b/core-java/pom.xml index 64345ab14c..e5786f65c3 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -131,11 +131,6 @@ h2 ${h2database.version} - - javax.mail - mail - ${javax.mail.version} - org.apache.tika @@ -514,7 +509,6 @@ 1.19 3.0.0-M1 - 1.5.0-b01 3.0.2 1.4.4 3.1.1 diff --git a/patterns/README.md b/patterns/README.md index 221cba6456..9653558f43 100644 --- a/patterns/README.md +++ b/patterns/README.md @@ -5,4 +5,10 @@ - [Chain of Responsibility Design Pattern in Java](http://www.baeldung.com/chain-of-responsibility-pattern) - [The Command Pattern in Java](http://www.baeldung.com/java-command-pattern) - [The DAO Pattern in Java](http://www.baeldung.com/java-dao-pattern) - +- [Introduction to Creational Design Patterns](http://www.baeldung.com/creational-design-patterns) +- [Proxy, Decorator, Adapter and Bridge Patterns](http://www.baeldung.com/java-structural-design-patterns) +- [Singletons in Java](http://www.baeldung.com/java-singleton) +- [Flyweight Pattern in Java](http://www.baeldung.com/java-flyweight) +- [The Observer Pattern in Java](http://www.baeldung.com/java-observer-pattern) +- [Service Locator Pattern](http://www.baeldung.com/java-service-locator-pattern) +- [Java Constructors vs Static Factory Methods](https://www.baeldung.com/java-constructors-vs-static-factory-methods) \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/constructorsstaticfactorymethods/application/Application.java b/patterns/design-patterns/src/main/java/com/baeldung/constructorsstaticfactorymethods/application/Application.java similarity index 100% rename from core-java/src/main/java/com/baeldung/constructorsstaticfactorymethods/application/Application.java rename to patterns/design-patterns/src/main/java/com/baeldung/constructorsstaticfactorymethods/application/Application.java diff --git a/core-java/src/main/java/com/baeldung/constructorsstaticfactorymethods/entities/User.java b/patterns/design-patterns/src/main/java/com/baeldung/constructorsstaticfactorymethods/entities/User.java similarity index 100% rename from core-java/src/main/java/com/baeldung/constructorsstaticfactorymethods/entities/User.java rename to patterns/design-patterns/src/main/java/com/baeldung/constructorsstaticfactorymethods/entities/User.java diff --git a/core-java/src/test/java/com/baeldung/constructorsstaticfactorymethods/UserUnitTest.java b/patterns/design-patterns/src/test/java/com/baeldung/constructorsstaticfactorymethods/UserUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/constructorsstaticfactorymethods/UserUnitTest.java rename to patterns/design-patterns/src/test/java/com/baeldung/constructorsstaticfactorymethods/UserUnitTest.java From 5deb87325bdbf3e330d38efbc6802b86b72b9b2f Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 23 Dec 2018 16:59:32 +0530 Subject: [PATCH 171/359] [BAEL-10985] - Removed vavr-validation submodule --- .../baeldung/vavrvalidation/application/Application.java | 6 +++--- .../main/java/com/baeldung/vavrvalidation/model/User.java | 0 .../baeldung/vavrvalidation/validator/UserValidator.java | 0 .../vavrvalidation/validator/UserValidatorUnitTest.java} | 2 +- .../vavrvalidation/validator/ValidationUnitTest.java} | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename vavr/{vavr-validation => }/src/main/java/com/baeldung/vavrvalidation/application/Application.java (95%) rename vavr/{vavr-validation => }/src/main/java/com/baeldung/vavrvalidation/model/User.java (100%) rename vavr/{vavr-validation => }/src/main/java/com/baeldung/vavrvalidation/validator/UserValidator.java (100%) rename vavr/{vavr-validation/src/test/java/com/baeldung/vavrvalidation/validator/UserValidatorTest.java => src/test/java/com/baeldung/vavrvalidation/validator/UserValidatorUnitTest.java} (95%) rename vavr/{vavr-validation/src/test/java/com/baeldung/vavrvalidation/validator/ValidationTest.java => src/test/java/com/baeldung/vavrvalidation/validator/ValidationUnitTest.java} (98%) diff --git a/vavr/vavr-validation/src/main/java/com/baeldung/vavrvalidation/application/Application.java b/vavr/src/main/java/com/baeldung/vavrvalidation/application/Application.java similarity index 95% rename from vavr/vavr-validation/src/main/java/com/baeldung/vavrvalidation/application/Application.java rename to vavr/src/main/java/com/baeldung/vavrvalidation/application/Application.java index 8acc4522af..a23ed185c8 100644 --- a/vavr/vavr-validation/src/main/java/com/baeldung/vavrvalidation/application/Application.java +++ b/vavr/src/main/java/com/baeldung/vavrvalidation/application/Application.java @@ -8,10 +8,10 @@ import io.vavr.control.Validation; public class Application { public static void main(String[] args) { - + UserValidator userValidator = new UserValidator(); Validation, User> validation = userValidator.validateUser("John", "john@domain.com"); - + // process validation results here - } + } } diff --git a/vavr/vavr-validation/src/main/java/com/baeldung/vavrvalidation/model/User.java b/vavr/src/main/java/com/baeldung/vavrvalidation/model/User.java similarity index 100% rename from vavr/vavr-validation/src/main/java/com/baeldung/vavrvalidation/model/User.java rename to vavr/src/main/java/com/baeldung/vavrvalidation/model/User.java diff --git a/vavr/vavr-validation/src/main/java/com/baeldung/vavrvalidation/validator/UserValidator.java b/vavr/src/main/java/com/baeldung/vavrvalidation/validator/UserValidator.java similarity index 100% rename from vavr/vavr-validation/src/main/java/com/baeldung/vavrvalidation/validator/UserValidator.java rename to vavr/src/main/java/com/baeldung/vavrvalidation/validator/UserValidator.java diff --git a/vavr/vavr-validation/src/test/java/com/baeldung/vavrvalidation/validator/UserValidatorTest.java b/vavr/src/test/java/com/baeldung/vavrvalidation/validator/UserValidatorUnitTest.java similarity index 95% rename from vavr/vavr-validation/src/test/java/com/baeldung/vavrvalidation/validator/UserValidatorTest.java rename to vavr/src/test/java/com/baeldung/vavrvalidation/validator/UserValidatorUnitTest.java index cb9557fa53..8ac6100b27 100644 --- a/vavr/vavr-validation/src/test/java/com/baeldung/vavrvalidation/validator/UserValidatorTest.java +++ b/vavr/src/test/java/com/baeldung/vavrvalidation/validator/UserValidatorUnitTest.java @@ -7,7 +7,7 @@ import com.baeldung.vavrvalidation.validator.UserValidator; import io.vavr.control.Validation.Invalid; import io.vavr.control.Validation.Valid; -public class UserValidatorTest { +public class UserValidatorUnitTest { @Test public void givenValidUserParams_whenValidated_thenInstanceOfValid() { diff --git a/vavr/vavr-validation/src/test/java/com/baeldung/vavrvalidation/validator/ValidationTest.java b/vavr/src/test/java/com/baeldung/vavrvalidation/validator/ValidationUnitTest.java similarity index 98% rename from vavr/vavr-validation/src/test/java/com/baeldung/vavrvalidation/validator/ValidationTest.java rename to vavr/src/test/java/com/baeldung/vavrvalidation/validator/ValidationUnitTest.java index c89b43b5e3..7b8c551aeb 100644 --- a/vavr/vavr-validation/src/test/java/com/baeldung/vavrvalidation/validator/ValidationTest.java +++ b/vavr/src/test/java/com/baeldung/vavrvalidation/validator/ValidationUnitTest.java @@ -11,7 +11,7 @@ import io.vavr.control.Either.Right; import io.vavr.control.Validation.Invalid; import io.vavr.control.Validation.Valid; -public class ValidationTest { +public class ValidationUnitTest { private static UserValidator userValidator; From fda7ff2690dc19b616e3a2e7ff1291d447321491 Mon Sep 17 00:00:00 2001 From: Shashank agarwal Date: Sun, 23 Dec 2018 20:57:01 +0530 Subject: [PATCH 172/359] Added Character Array method (#5965) * Added the code of Replace char in a string at specific index * added test cases * Renamed the Test class name end with UnitTest * Renamed the Test class name end with UnitTest * Renamed the Test class name end with UnitTest * Replaced README with the upstream repo * Added Char Array Method --- .../string/ReplaceCharacterInString.java | 14 +++++++++++--- .../string/ReplaceCharInStringUnitTest.java | 18 ++++++++++++------ 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/java-strings/src/main/java/com/baeldung/string/ReplaceCharacterInString.java b/java-strings/src/main/java/com/baeldung/string/ReplaceCharacterInString.java index e8d1ce2d8b..2cc67f0b51 100644 --- a/java-strings/src/main/java/com/baeldung/string/ReplaceCharacterInString.java +++ b/java-strings/src/main/java/com/baeldung/string/ReplaceCharacterInString.java @@ -1,12 +1,20 @@ package com.baeldung.string; public class ReplaceCharacterInString { - public String replaceCharSubstring(String str, char ch, int index) { - String myString = str.substring(0, index) + ch + str.substring(index+1); + + public String replaceCharSubstring(String str, char ch, int index) { + String myString = str.substring(0, index) + ch + str.substring(index + 1); return myString; } - public String replaceCharStringBuilder(String str, char ch, int index) { + public String replaceCharUsingCharArray(String str, char ch, int index) { + char[] chars = str.toCharArray(); + chars[index] = ch; + return String.valueOf(chars); + } + + + public String replaceCharStringBuilder(String str, char ch, int index) { StringBuilder myString = new StringBuilder(str); myString.setCharAt(index, ch); return myString.toString(); diff --git a/java-strings/src/test/java/com/baeldung/string/ReplaceCharInStringUnitTest.java b/java-strings/src/test/java/com/baeldung/string/ReplaceCharInStringUnitTest.java index 07e86bb69b..c234c6953c 100644 --- a/java-strings/src/test/java/com/baeldung/string/ReplaceCharInStringUnitTest.java +++ b/java-strings/src/test/java/com/baeldung/string/ReplaceCharInStringUnitTest.java @@ -1,23 +1,29 @@ package com.baeldung.string; import org.junit.Test; + import static org.junit.Assert.*; public class ReplaceCharInStringUnitTest { private ReplaceCharacterInString characterInString = new ReplaceCharacterInString(); @Test - public void whenReplaceCharAtIndexUsingSubstring_thenSuccess(){ - assertEquals("abcme",characterInString.replaceCharSubstring("abcde",'m',3)); + public void whenReplaceCharAtIndexUsingSubstring_thenSuccess() { + assertEquals("abcme", characterInString.replaceCharSubstring("abcde", 'm', 3)); } @Test - public void whenReplaceCharAtIndexUsingStringBuilder_thenSuccess(){ - assertEquals("abcme",characterInString.replaceCharStringBuilder("abcde",'m',3)); + public void whenReplaceCharAtIndexUsingCharArray_thenSuccess() { + assertEquals("abcme", characterInString.replaceCharUsingCharArray("abcde", 'm', 3)); } @Test - public void whenReplaceCharAtIndexUsingStringBuffer_thenSuccess(){ - assertEquals("abcme",characterInString.replaceCharStringBuffer("abcde",'m',3)); + public void whenReplaceCharAtIndexUsingStringBuilder_thenSuccess() { + assertEquals("abcme", characterInString.replaceCharStringBuilder("abcde", 'm', 3)); + } + + @Test + public void whenReplaceCharAtIndexUsingStringBuffer_thenSuccess() { + assertEquals("abcme", characterInString.replaceCharStringBuffer("abcde", 'm', 3)); } } From 7bc513561c21863aa882cfd901950a47cb0198fd Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 23 Dec 2018 23:31:21 +0530 Subject: [PATCH 173/359] [BAEL-10968] - Updated Jackson Dates article --- .../baeldung/jackson/test/JacksonDateUnitTest.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/jackson/src/test/java/com/baeldung/jackson/test/JacksonDateUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/test/JacksonDateUnitTest.java index 390030d0d4..672ff5c6fd 100644 --- a/jackson/src/test/java/com/baeldung/jackson/test/JacksonDateUnitTest.java +++ b/jackson/src/test/java/com/baeldung/jackson/test/JacksonDateUnitTest.java @@ -11,7 +11,6 @@ import java.time.LocalDateTime; import java.util.Date; import java.util.TimeZone; -import com.fasterxml.jackson.databind.util.ISO8601DateFormat; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.junit.Test; @@ -24,8 +23,9 @@ import com.baeldung.jackson.date.EventWithSerializer; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.util.StdDateFormat; import com.fasterxml.jackson.datatype.joda.JodaModule; -import com.fasterxml.jackson.datatype.jsr310.JSR310Module; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; public class JacksonDateUnitTest { @@ -54,10 +54,12 @@ public class JacksonDateUnitTest { final ObjectMapper mapper = new ObjectMapper(); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - mapper.setDateFormat(new ISO8601DateFormat()); + + // StdDateFormat is ISO8601 since jackson 2.9 + mapper.setDateFormat(new StdDateFormat().withColonInTimeZone(true)); final String result = mapper.writeValueAsString(event); - assertThat(result, containsString("1970-01-01T02:30:00Z")); + assertThat(result, containsString("1970-01-01T02:30:00.000+00:00")); } @Test @@ -152,7 +154,7 @@ public class JacksonDateUnitTest { final LocalDateTime date = LocalDateTime.of(2014, 12, 20, 2, 30); final ObjectMapper mapper = new ObjectMapper(); - mapper.registerModule(new JSR310Module()); + mapper.registerModule(new JavaTimeModule()); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); final String result = mapper.writeValueAsString(date); From 8cf3e3f41a348249b8b12502ca09350b065ef2f4 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Mon, 24 Dec 2018 01:10:15 +0530 Subject: [PATCH 174/359] [BAEL-10838] - Created core-java-lang-syntax module --- core-java-lang-syntax/.gitignore | 25 +++++++++ core-java-lang-syntax/README.md | 19 +++++++ core-java-lang-syntax/pom.xml | 53 +++++++++++++++++++ .../baeldung/breakcontinue/BreakContinue.java | 0 .../main/java/com/baeldung/enums/Pizza.java | 0 .../baeldung/enums/PizzaDeliveryStrategy.java | 0 .../PizzaDeliverySystemConfiguration.java | 0 .../main/java/com/baeldung/enums/README.md | 0 .../java/com/baeldung/generics/Building.java | 0 .../java/com/baeldung/generics/Generics.java | 0 .../java/com/baeldung/generics/House.java | 0 .../baeldung/initializationguide/User.java | 0 .../com/baeldung/loops/InfiniteLoops.java | 0 .../java/com/baeldung/loops/LoopsInJava.java | 0 .../switchstatement/SwitchStatement.java | 0 .../java/com/baeldung/system/ChatWindow.java | 0 .../com/baeldung/system/DateTimeService.java | 0 .../baeldung/system/EnvironmentVariables.java | 0 .../com/baeldung/system/SystemErrDemo.java | 0 .../com/baeldung/system/SystemExitDemo.java | 0 .../com/baeldung/system/SystemOutDemo.java | 0 .../com/baeldung/system/UserCredentials.java | 0 .../breakcontinue/BreakContinueUnitTest.java | 0 .../com/baeldung/enums/PizzaUnitTest.java | 0 .../baeldung/generics/GenericsUnitTest.java | 0 .../initializationguide/UserUnitTest.java | 0 .../java/com/baeldung/java/diamond/Car.java | 0 .../java/diamond/DiamondOperatorUnitTest.java | 0 .../com/baeldung/java/diamond/Diesel.java | 0 .../com/baeldung/java/diamond/Engine.java | 0 .../com/baeldung/java/diamond/Vehicle.java | 0 .../java/doublebrace/DoubleBraceUnitTest.java | 0 .../com/baeldung/loops/WhenUsingLoops.java | 0 .../com/baeldung/modulo/ModuloUnitTest.java | 0 .../PrimitiveConversionsJUnitTest.java | 0 .../SwitchStatementUnitTest.java | 0 .../system/DateTimeServiceUnitTest.java | 0 .../system/EnvironmentVariablesUnitTest.java | 0 .../system/SystemArrayCopyUnitTest.java | 0 .../baeldung/system/SystemNanoUnitTest.java | 0 .../system/SystemPropertiesUnitTest.java | 0 .../TernaryOperatorUnitTest.java | 0 .../baeldung/varargs/FormatterUnitTest.java | 0 core-java-lang/README.md | 14 ----- pom.xml | 2 + 45 files changed, 99 insertions(+), 14 deletions(-) create mode 100644 core-java-lang-syntax/.gitignore create mode 100644 core-java-lang-syntax/README.md create mode 100644 core-java-lang-syntax/pom.xml rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/breakcontinue/BreakContinue.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/enums/Pizza.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/enums/PizzaDeliveryStrategy.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/enums/PizzaDeliverySystemConfiguration.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/enums/README.md (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/generics/Building.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/generics/Generics.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/generics/House.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/initializationguide/User.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/loops/InfiniteLoops.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/loops/LoopsInJava.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/switchstatement/SwitchStatement.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/system/ChatWindow.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/system/DateTimeService.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/system/EnvironmentVariables.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/system/SystemErrDemo.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/system/SystemExitDemo.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/system/SystemOutDemo.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/system/UserCredentials.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/breakcontinue/BreakContinueUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/enums/PizzaUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/generics/GenericsUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/initializationguide/UserUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/java/diamond/Car.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/java/diamond/DiamondOperatorUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/java/diamond/Diesel.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/java/diamond/Engine.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/java/diamond/Vehicle.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/loops/WhenUsingLoops.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/modulo/ModuloUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/primitiveconversion/PrimitiveConversionsJUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/switchstatement/SwitchStatementUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/system/SystemNanoUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/varargs/FormatterUnitTest.java (100%) diff --git a/core-java-lang-syntax/.gitignore b/core-java-lang-syntax/.gitignore new file mode 100644 index 0000000000..374c8bf907 --- /dev/null +++ b/core-java-lang-syntax/.gitignore @@ -0,0 +1,25 @@ +*.class + +0.* + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* +.resourceCache + +# Packaged files # +*.jar +*.war +*.ear + +# Files generated by integration tests +backup-pom.xml +/bin/ +/temp + +#IntelliJ specific +.idea/ +*.iml \ No newline at end of file diff --git a/core-java-lang-syntax/README.md b/core-java-lang-syntax/README.md new file mode 100644 index 0000000000..a7c1b7cc4a --- /dev/null +++ b/core-java-lang-syntax/README.md @@ -0,0 +1,19 @@ +========= + +## Core Java Lang Syntax Cookbooks and Examples + +### Relevant Articles: +- [Introduction to Java Generics](http://www.baeldung.com/java-generics) +- [Java Primitive Conversions](http://www.baeldung.com/java-primitive-conversions) +- [Java Double Brace Initialization](http://www.baeldung.com/java-double-brace-initialization) +- [Guide to the Diamond Operator in Java](http://www.baeldung.com/java-diamond-operator) +- [The Java continue and break Keywords](http://www.baeldung.com/java-continue-and-break) +- [A Guide to Java Initialization](http://www.baeldung.com/java-initialization) +- [A Guide to Java Loops](http://www.baeldung.com/java-loops) +- [Varargs in Java](http://www.baeldung.com/java-varargs) +- [A Guide to Java Enums](http://www.baeldung.com/a-guide-to-java-enums) +- [Infinite Loops in Java](http://www.baeldung.com/infinite-loops-java) +- [Quick Guide to java.lang.System](http://www.baeldung.com/java-lang-system) +- [Java Switch Statement](https://www.baeldung.com/java-switch) +- [The Modulo Operator in Java](https://www.baeldung.com/modulo-java) +- [Ternary Operator In Java](https://www.baeldung.com/java-ternary-operator) \ No newline at end of file diff --git a/core-java-lang-syntax/pom.xml b/core-java-lang-syntax/pom.xml new file mode 100644 index 0000000000..9481f29459 --- /dev/null +++ b/core-java-lang-syntax/pom.xml @@ -0,0 +1,53 @@ + + 4.0.0 + com.baeldung + core-java-lang-syntax + 0.1.0-SNAPSHOT + jar + core-java-lang-syntax + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + + + + + + log4j + log4j + ${log4j.version} + + + org.slf4j + log4j-over-slf4j + ${org.slf4j.version} + + + + org.assertj + assertj-core + ${assertj-core.version} + test + + + + + core-java-lang-syntax + + + src/main/resources + true + + + + + + + 3.10.0 + + + diff --git a/core-java-lang/src/main/java/com/baeldung/breakcontinue/BreakContinue.java b/core-java-lang-syntax/src/main/java/com/baeldung/breakcontinue/BreakContinue.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/breakcontinue/BreakContinue.java rename to core-java-lang-syntax/src/main/java/com/baeldung/breakcontinue/BreakContinue.java diff --git a/core-java-lang/src/main/java/com/baeldung/enums/Pizza.java b/core-java-lang-syntax/src/main/java/com/baeldung/enums/Pizza.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/enums/Pizza.java rename to core-java-lang-syntax/src/main/java/com/baeldung/enums/Pizza.java diff --git a/core-java-lang/src/main/java/com/baeldung/enums/PizzaDeliveryStrategy.java b/core-java-lang-syntax/src/main/java/com/baeldung/enums/PizzaDeliveryStrategy.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/enums/PizzaDeliveryStrategy.java rename to core-java-lang-syntax/src/main/java/com/baeldung/enums/PizzaDeliveryStrategy.java diff --git a/core-java-lang/src/main/java/com/baeldung/enums/PizzaDeliverySystemConfiguration.java b/core-java-lang-syntax/src/main/java/com/baeldung/enums/PizzaDeliverySystemConfiguration.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/enums/PizzaDeliverySystemConfiguration.java rename to core-java-lang-syntax/src/main/java/com/baeldung/enums/PizzaDeliverySystemConfiguration.java diff --git a/core-java-lang/src/main/java/com/baeldung/enums/README.md b/core-java-lang-syntax/src/main/java/com/baeldung/enums/README.md similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/enums/README.md rename to core-java-lang-syntax/src/main/java/com/baeldung/enums/README.md diff --git a/core-java-lang/src/main/java/com/baeldung/generics/Building.java b/core-java-lang-syntax/src/main/java/com/baeldung/generics/Building.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/generics/Building.java rename to core-java-lang-syntax/src/main/java/com/baeldung/generics/Building.java diff --git a/core-java-lang/src/main/java/com/baeldung/generics/Generics.java b/core-java-lang-syntax/src/main/java/com/baeldung/generics/Generics.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/generics/Generics.java rename to core-java-lang-syntax/src/main/java/com/baeldung/generics/Generics.java diff --git a/core-java-lang/src/main/java/com/baeldung/generics/House.java b/core-java-lang-syntax/src/main/java/com/baeldung/generics/House.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/generics/House.java rename to core-java-lang-syntax/src/main/java/com/baeldung/generics/House.java diff --git a/core-java-lang/src/main/java/com/baeldung/initializationguide/User.java b/core-java-lang-syntax/src/main/java/com/baeldung/initializationguide/User.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/initializationguide/User.java rename to core-java-lang-syntax/src/main/java/com/baeldung/initializationguide/User.java diff --git a/core-java-lang/src/main/java/com/baeldung/loops/InfiniteLoops.java b/core-java-lang-syntax/src/main/java/com/baeldung/loops/InfiniteLoops.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/loops/InfiniteLoops.java rename to core-java-lang-syntax/src/main/java/com/baeldung/loops/InfiniteLoops.java diff --git a/core-java-lang/src/main/java/com/baeldung/loops/LoopsInJava.java b/core-java-lang-syntax/src/main/java/com/baeldung/loops/LoopsInJava.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/loops/LoopsInJava.java rename to core-java-lang-syntax/src/main/java/com/baeldung/loops/LoopsInJava.java diff --git a/core-java-lang/src/main/java/com/baeldung/switchstatement/SwitchStatement.java b/core-java-lang-syntax/src/main/java/com/baeldung/switchstatement/SwitchStatement.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/switchstatement/SwitchStatement.java rename to core-java-lang-syntax/src/main/java/com/baeldung/switchstatement/SwitchStatement.java diff --git a/core-java-lang/src/main/java/com/baeldung/system/ChatWindow.java b/core-java-lang-syntax/src/main/java/com/baeldung/system/ChatWindow.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/system/ChatWindow.java rename to core-java-lang-syntax/src/main/java/com/baeldung/system/ChatWindow.java diff --git a/core-java-lang/src/main/java/com/baeldung/system/DateTimeService.java b/core-java-lang-syntax/src/main/java/com/baeldung/system/DateTimeService.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/system/DateTimeService.java rename to core-java-lang-syntax/src/main/java/com/baeldung/system/DateTimeService.java diff --git a/core-java-lang/src/main/java/com/baeldung/system/EnvironmentVariables.java b/core-java-lang-syntax/src/main/java/com/baeldung/system/EnvironmentVariables.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/system/EnvironmentVariables.java rename to core-java-lang-syntax/src/main/java/com/baeldung/system/EnvironmentVariables.java diff --git a/core-java-lang/src/main/java/com/baeldung/system/SystemErrDemo.java b/core-java-lang-syntax/src/main/java/com/baeldung/system/SystemErrDemo.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/system/SystemErrDemo.java rename to core-java-lang-syntax/src/main/java/com/baeldung/system/SystemErrDemo.java diff --git a/core-java-lang/src/main/java/com/baeldung/system/SystemExitDemo.java b/core-java-lang-syntax/src/main/java/com/baeldung/system/SystemExitDemo.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/system/SystemExitDemo.java rename to core-java-lang-syntax/src/main/java/com/baeldung/system/SystemExitDemo.java diff --git a/core-java-lang/src/main/java/com/baeldung/system/SystemOutDemo.java b/core-java-lang-syntax/src/main/java/com/baeldung/system/SystemOutDemo.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/system/SystemOutDemo.java rename to core-java-lang-syntax/src/main/java/com/baeldung/system/SystemOutDemo.java diff --git a/core-java-lang/src/main/java/com/baeldung/system/UserCredentials.java b/core-java-lang-syntax/src/main/java/com/baeldung/system/UserCredentials.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/system/UserCredentials.java rename to core-java-lang-syntax/src/main/java/com/baeldung/system/UserCredentials.java diff --git a/core-java-lang/src/test/java/com/baeldung/breakcontinue/BreakContinueUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/breakcontinue/BreakContinueUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/breakcontinue/BreakContinueUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/breakcontinue/BreakContinueUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/enums/PizzaUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/enums/PizzaUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/enums/PizzaUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/enums/PizzaUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/generics/GenericsUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/generics/GenericsUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/generics/GenericsUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/generics/GenericsUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/initializationguide/UserUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/initializationguide/UserUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/initializationguide/UserUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/initializationguide/UserUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/java/diamond/Car.java b/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Car.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/java/diamond/Car.java rename to core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Car.java diff --git a/core-java-lang/src/test/java/com/baeldung/java/diamond/DiamondOperatorUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/DiamondOperatorUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/java/diamond/DiamondOperatorUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/DiamondOperatorUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/java/diamond/Diesel.java b/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Diesel.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/java/diamond/Diesel.java rename to core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Diesel.java diff --git a/core-java-lang/src/test/java/com/baeldung/java/diamond/Engine.java b/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Engine.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/java/diamond/Engine.java rename to core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Engine.java diff --git a/core-java-lang/src/test/java/com/baeldung/java/diamond/Vehicle.java b/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Vehicle.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/java/diamond/Vehicle.java rename to core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Vehicle.java diff --git a/core-java-lang/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/loops/WhenUsingLoops.java b/core-java-lang-syntax/src/test/java/com/baeldung/loops/WhenUsingLoops.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/loops/WhenUsingLoops.java rename to core-java-lang-syntax/src/test/java/com/baeldung/loops/WhenUsingLoops.java diff --git a/core-java-lang/src/test/java/com/baeldung/modulo/ModuloUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/modulo/ModuloUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/modulo/ModuloUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/modulo/ModuloUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/primitiveconversion/PrimitiveConversionsJUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/primitiveconversion/PrimitiveConversionsJUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/primitiveconversion/PrimitiveConversionsJUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/primitiveconversion/PrimitiveConversionsJUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/switchstatement/SwitchStatementUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/switchstatement/SwitchStatementUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/switchstatement/SwitchStatementUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/switchstatement/SwitchStatementUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/system/SystemNanoUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/system/SystemNanoUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/system/SystemNanoUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/system/SystemNanoUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/varargs/FormatterUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/varargs/FormatterUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/varargs/FormatterUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/varargs/FormatterUnitTest.java diff --git a/core-java-lang/README.md b/core-java-lang/README.md index 69209bb193..0ca4d3009f 100644 --- a/core-java-lang/README.md +++ b/core-java-lang/README.md @@ -4,24 +4,16 @@ ### Relevant Articles: - [Guide to Java Reflection](http://www.baeldung.com/java-reflection) -- [Introduction to Java Generics](http://www.baeldung.com/java-generics) - [Generate equals() and hashCode() with Eclipse](http://www.baeldung.com/java-eclipse-equals-and-hashcode) - [Chained Exceptions in Java](http://www.baeldung.com/java-chained-exceptions) -- [Java Primitive Conversions](http://www.baeldung.com/java-primitive-conversions) - [Call Methods at Runtime Using Java Reflection](http://www.baeldung.com/java-method-reflection) - [Iterating Over Enum Values in Java](http://www.baeldung.com/java-enum-iteration) - [Changing Annotation Parameters At Runtime](http://www.baeldung.com/java-reflection-change-annotation-params) - [Dynamic Proxies in Java](http://www.baeldung.com/java-dynamic-proxies) -- [Java Double Brace Initialization](http://www.baeldung.com/java-double-brace-initialization) - [Guide to hashCode() in Java](http://www.baeldung.com/java-hashcode) -- [Guide to the Diamond Operator in Java](http://www.baeldung.com/java-diamond-operator) - [A Guide to the Static Keyword in Java](http://www.baeldung.com/java-static) - [Quick Example - Comparator vs Comparable in Java](http://www.baeldung.com/java-comparator-comparable) -- [The Java continue and break Keywords](http://www.baeldung.com/java-continue-and-break) -- [A Guide to Java Initialization](http://www.baeldung.com/java-initialization) - [Nested Classes in Java](http://www.baeldung.com/java-nested-classes) -- [A Guide to Java Loops](http://www.baeldung.com/java-loops) -- [Varargs in Java](http://www.baeldung.com/java-varargs) - [A Guide to Inner Interfaces in Java](http://www.baeldung.com/java-inner-interfaces) - [Polymorphism in Java](http://www.baeldung.com/java-polymorphism) - [Recursion In Java](http://www.baeldung.com/java-recursion) @@ -31,9 +23,6 @@ - [Guide to Inheritance in Java](http://www.baeldung.com/java-inheritance) - [Object Type Casting in Java](http://www.baeldung.com/java-type-casting) - [The "final" Keyword in Java](http://www.baeldung.com/java-final) -- [A Guide to Java Enums](http://www.baeldung.com/a-guide-to-java-enums) -- [Infinite Loops in Java](http://www.baeldung.com/infinite-loops-java) -- [Quick Guide to java.lang.System](http://www.baeldung.com/java-lang-system) - [Type Erasure in Java Explained](http://www.baeldung.com/java-type-erasure) - [Using Java Assertions](http://www.baeldung.com/java-assert) - [Pass-By-Value as a Parameter Passing Mechanism in Java](http://www.baeldung.com/java-pass-by-value-or-pass-by-reference) @@ -50,9 +39,6 @@ - [Static and Dynamic Binding in Java](https://www.baeldung.com/java-static-dynamic-binding) - [Difference Between Throw and Throws in Java](https://www.baeldung.com/java-throw-throws) - [Synthetic Constructs in Java](https://www.baeldung.com/java-synthetic) -- [Java Switch Statement](https://www.baeldung.com/java-switch) -- [The Modulo Operator in Java](https://www.baeldung.com/modulo-java) -- [Ternary Operator In Java](https://www.baeldung.com/java-ternary-operator) - [How to Separate Double into Integer and Decimal Parts](https://www.baeldung.com/java-separate-double-into-integer-decimal-parts) - [“Sneaky Throws” in Java](http://www.baeldung.com/java-sneaky-throws) - [Inheritance and Composition (Is-a vs Has-a relationship) in Java](http://www.baeldung.com/java-inheritance-composition) diff --git a/pom.xml b/pom.xml index d3a665b4e1..adea3b114d 100644 --- a/pom.xml +++ b/pom.xml @@ -381,6 +381,7 @@ core-java-collections core-java-concurrency-collections core-java-io + core-java-lang-syntax core-java-lang core-java-networking core-java-sun @@ -1088,6 +1089,7 @@ core-java-collections core-java-concurrency-collections core-java-io + core-java-lang-syntax core-java-lang core-java-networking core-java-sun From a444d51ae171378b2716d8577cd0cc904ecdc509 Mon Sep 17 00:00:00 2001 From: myluckagain Date: Mon, 24 Dec 2018 03:30:03 +0500 Subject: [PATCH 175/359] Many To One BAEL-2329 (#5878) * Many To One BAEL-2329 * xml config --- .../main/HibernateManyisOwningSide.java | 71 +++++++++++++++++++ .../main/HibernateOneisOwningSide.java | 67 +++++++++++++++++ .../hibernate/oneToMany/model/CartOIO.java | 42 +++++++++++ .../hibernate/oneToMany/model/ItemsOIO.java | 47 ++++++++++++ .../resources/hibernate-annotation.cfg.xml | 4 +- 5 files changed, 230 insertions(+), 1 deletion(-) create mode 100644 persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java create mode 100644 persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneisOwningSide.java create mode 100644 persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java create mode 100644 persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemsOIO.java diff --git a/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java new file mode 100644 index 0000000000..372fb2fc07 --- /dev/null +++ b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java @@ -0,0 +1,71 @@ +package com.baeldung.hibernate.oneToMany.main; + +import java.util.HashSet; +import java.util.Set; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.Transaction; + +import com.baeldung.hibernate.oneToMany.config.HibernateAnnotationUtil; +import com.baeldung.hibernate.oneToMany.model.Cart; +import com.baeldung.hibernate.oneToMany.model.Items; +import com.baeldung.hibernate.oneToMany.model.ItemsOIO; + +public class HibernateManyisOwningSide { + public static void main(String[] args) { + + Cart cart = new Cart(); + Cart cart2 = new Cart(); + + Items item1 = new Items(cart); + Items item2 = new Items(cart2); + Set itemsSet = new HashSet(); + itemsSet.add(item1); + itemsSet.add(item2); + + cart.setItems(itemsSet); + + + + SessionFactory sessionFactory = null; + Session session = null; + Transaction tx = null; + try { + // Get Session + sessionFactory = HibernateAnnotationUtil.getSessionFactory(); + session = sessionFactory.getCurrentSession(); + System.out.println("Session created"); + // start transaction + tx = session.beginTransaction(); + // Save the Model object + session.save(cart); + session.save(cart2); + session.save(item1); + session.save(item2); + // Commit transaction + tx.commit(); + session = sessionFactory.getCurrentSession(); + tx = session.beginTransaction(); + + item1 = (Items) session.get(Items.class, new Long(1)); + item2 = (Items) session.get(Items.class, new Long(2)); + tx.commit(); + + + System.out.println("item1 ID=" + item1.getId() + ", Foreign Key CartOIO ID=" + item1.getCart() + .getId()); + System.out.println("item2 ID=" + item2.getId() + ", Foreign Key CartOIO ID=" + item2.getCart() + .getId()); + + } catch (Exception e) { + System.out.println("Exception occured. " + e.getMessage()); + e.printStackTrace(); + } finally { + if (!sessionFactory.isClosed()) { + System.out.println("Closing SessionFactory"); + sessionFactory.close(); + } + } + } +} diff --git a/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneisOwningSide.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneisOwningSide.java new file mode 100644 index 0000000000..0777664dd0 --- /dev/null +++ b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneisOwningSide.java @@ -0,0 +1,67 @@ +package com.baeldung.hibernate.oneToMany.main; + +import java.util.HashSet; +import java.util.Set; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.Transaction; + +import com.baeldung.hibernate.oneToMany.config.HibernateAnnotationUtil; +import com.baeldung.hibernate.oneToMany.model.CartOIO; +import com.baeldung.hibernate.oneToMany.model.ItemsOIO; + +public class HibernateOneisOwningSide { + public static void main(String[] args) { + + CartOIO cart = new CartOIO(); + CartOIO cart2 = new CartOIO(); + + ItemsOIO item1 = new ItemsOIO(cart); + ItemsOIO item2 = new ItemsOIO(cart2); + Set itemsSet = new HashSet(); + itemsSet.add(item1); + itemsSet.add(item2); + + cart.setItems(itemsSet); + + SessionFactory sessionFactory = null; + Session session = null; + Transaction tx = null; + try { + // Get Session + sessionFactory = HibernateAnnotationUtil.getSessionFactory(); + session = sessionFactory.getCurrentSession(); + System.out.println("Session created"); + // start transaction + tx = session.beginTransaction(); + // Save the Model object + session.save(cart); + session.save(cart2); + session.save(item1); + session.save(item2); + // Commit transaction + tx.commit(); + + session = sessionFactory.getCurrentSession(); + tx = session.beginTransaction(); + item1 = (ItemsOIO) session.get(ItemsOIO.class, new Long(1)); + item2 = (ItemsOIO) session.get(ItemsOIO.class, new Long(2)); + tx.commit(); + + System.out.println("item1 ID=" + item1.getId() + ", Foreign Key CartOIO ID=" + item1.getCartOIO() + .getId()); + System.out.println("item2 ID=" + item2.getId() + ", Foreign Key CartOIO ID=" + item2.getCartOIO() + .getId()); + + } catch (Exception e) { + System.out.println("Exception occured. " + e.getMessage()); + e.printStackTrace(); + } finally { + if (!sessionFactory.isClosed()) { + System.out.println("Closing SessionFactory"); + sessionFactory.close(); + } + } + } +} diff --git a/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java new file mode 100644 index 0000000000..8a5ed5e7a4 --- /dev/null +++ b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java @@ -0,0 +1,42 @@ +package com.baeldung.hibernate.oneToMany.model; + +import java.util.Set; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; +import javax.persistence.Table; + + + +@Entity +@Table(name = "CARTOIO") +public class CartOIO { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @OneToMany + @JoinColumn(name = "cart_id") // we need to duplicate the physical information + private Set items; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public Set getItems() { + return items; + } + + public void setItems(Set items) { + this.items = items; + } + +} diff --git a/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemsOIO.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemsOIO.java new file mode 100644 index 0000000000..a3d6a796c5 --- /dev/null +++ b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemsOIO.java @@ -0,0 +1,47 @@ +package com.baeldung.hibernate.oneToMany.model; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +@Entity +@Table(name = "ITEMSOIO") +public class ItemsOIO { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @ManyToOne + @JoinColumn(name = "cart_id", insertable = false, updatable = false) + private CartOIO cart; + + // Hibernate requires no-args constructor + public ItemsOIO() { + } + + public ItemsOIO(CartOIO c) { + this.cart = c; + } + + public CartOIO getCartOIO() { + return cart; + } + + public void setCartOIO(CartOIO cart) { + this.cart = cart; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + +} diff --git a/persistence-modules/spring-hibernate4/src/main/resources/hibernate-annotation.cfg.xml b/persistence-modules/spring-hibernate4/src/main/resources/hibernate-annotation.cfg.xml index 311300c77c..14d853d3fd 100644 --- a/persistence-modules/spring-hibernate4/src/main/resources/hibernate-annotation.cfg.xml +++ b/persistence-modules/spring-hibernate4/src/main/resources/hibernate-annotation.cfg.xml @@ -9,11 +9,13 @@ jdbc:mysql://localhost:3306/spring_hibernate_one_to_many?createDatabaseIfNotExist=true myuser org.hibernate.dialect.MySQLDialect - + create thread true + + From b4eee1e23131221b59b516665f87d5984cc2bfa8 Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Mon, 24 Dec 2018 13:02:29 +0000 Subject: [PATCH 176/359] BAEL-2419: Added String Concatenation Unit Tests (#5898) --- .../baeldung/StringConcatenationUnitTest.java | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 java-strings/src/test/java/com/baeldung/StringConcatenationUnitTest.java diff --git a/java-strings/src/test/java/com/baeldung/StringConcatenationUnitTest.java b/java-strings/src/test/java/com/baeldung/StringConcatenationUnitTest.java new file mode 100644 index 0000000000..c25d4ce8f9 --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/StringConcatenationUnitTest.java @@ -0,0 +1,105 @@ +package com.baeldung; + +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; +import java.util.StringJoiner; +import java.util.stream.Collectors; + +import static org.junit.Assert.assertEquals; + +public class StringConcatenationUnitTest { + + @Test + public void givenMultipleStrings_whenConcatUsingStringBuilder_checkStringCorrect() { + + StringBuilder stringBuilder = new StringBuilder(100); + stringBuilder.append("Baeldung"); + stringBuilder.append(" is"); + stringBuilder.append(" awesome"); + + assertEquals("Baeldung is awesome", stringBuilder.toString()); + + } + + @Test + public void givenMultipleString_whenConcatUsingAdditionOperator_checkStringCorrect() { + + String myString = "The " + "quick " + "brown " + "fox..."; + + assertEquals("The quick brown fox...", myString); + } + + + @Test + public void givenMultipleStrings_whenConcatUsingStringFormat_checkStringCorrect() { + + String myString = String.format("%s %s %.2f %s %s, %s...", "I", + "ate", + 2.5056302, + "blueberry", + "pies", + "oops"); + + + assertEquals("I ate 2.51 blueberry pies, oops...", myString); + } + + @Test + public void givenMultipleStrings_whenStringConcatUsed_checkStringCorrect() { + + String myString = "Both".concat(" fickle") + .concat(" dwarves") + .concat(" jinx") + .concat(" my") + .concat(" pig") + .concat(" quiz"); + + assertEquals("Both fickle dwarves jinx my pig quiz", myString); + + + } + + @Test + public void givenMultipleStrings_whenStringJoinUsed_checkStringCorrect() { + + String[] strings = {"I'm", "running", "out", "of", "pangrams!"}; + + String myString = String.join(" ", strings); + + assertEquals("I'm running out of pangrams!", myString); + + } + + @Test + public void givenMultipleStrings_whenStringJoinerUsed_checkStringCorrect() { + + StringJoiner fruitJoiner = new StringJoiner(", "); + fruitJoiner.add("Apples"); + fruitJoiner.add("Oranges"); + fruitJoiner.add("Bananas"); + + assertEquals("Apples, Oranges, Bananas", fruitJoiner.toString()); + } + + @Test + public void givenMultipleStrings_whenArrayJoiner_checkStringCorrect() { + + String[] myFavouriteLanguages = {"Java", "JavaScript", "Python"}; + + String toString = Arrays.toString(myFavouriteLanguages); + + assertEquals("[Java, JavaScript, Python]", toString); + } + + @Test + public void givenArrayListOfStrings_whenCollectorsJoin_checkStringCorrect() { + + List awesomeAnimals = Arrays.asList("Shark", "Panda", "Armadillo"); + + String animalString = awesomeAnimals.stream().collect(Collectors.joining(", ")); + + assertEquals("Shark, Panda, Armadillo", animalString); + } +} From cdaf0b46bfe7ea3119c440659cad6bfe53e462d3 Mon Sep 17 00:00:00 2001 From: Fabian Rivera Date: Mon, 24 Dec 2018 17:44:09 -0600 Subject: [PATCH 177/359] BAEL-2454 Reading the error response and building the full response BAEL-2454 Add examples for reading response content on failed requests. Add example on how to build full response string. --- .../baeldung/http/FullResponseBuilder.java | 65 ++++++++++++++++++ .../baeldung/http/HttpRequestLiveTest.java | 66 +++++++++++++++++-- 2 files changed, 126 insertions(+), 5 deletions(-) create mode 100644 core-java/src/main/java/com/baeldung/http/FullResponseBuilder.java diff --git a/core-java/src/main/java/com/baeldung/http/FullResponseBuilder.java b/core-java/src/main/java/com/baeldung/http/FullResponseBuilder.java new file mode 100644 index 0000000000..394255bd70 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/http/FullResponseBuilder.java @@ -0,0 +1,65 @@ +package com.baeldung.http; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.net.HttpURLConnection; +import java.util.Iterator; +import java.util.List; + +public class FullResponseBuilder { + public static String getFullResponse(HttpURLConnection con) throws IOException { + StringBuilder fullResponseBuilder = new StringBuilder(); + + fullResponseBuilder.append(con.getResponseCode()) + .append(" ") + .append(con.getResponseMessage()) + .append("\n"); + + con.getHeaderFields() + .entrySet() + .stream() + .filter(entry -> entry.getKey() != null) + .forEach(entry -> { + + fullResponseBuilder.append(entry.getKey()) + .append(": "); + + List headerValues = entry.getValue(); + Iterator it = headerValues.iterator(); + if (it.hasNext()) { + fullResponseBuilder.append(it.next()); + + while (it.hasNext()) { + fullResponseBuilder.append(", ") + .append(it.next()); + } + } + + fullResponseBuilder.append("\n"); + }); + + Reader streamReader = null; + + if (con.getResponseCode() > 299) { + streamReader = new InputStreamReader(con.getErrorStream()); + } else { + streamReader = new InputStreamReader(con.getInputStream()); + } + + BufferedReader in = new BufferedReader(streamReader); + String inputLine; + StringBuilder content = new StringBuilder(); + while ((inputLine = in.readLine()) != null) { + content.append(inputLine); + } + + in.close(); + + fullResponseBuilder.append("Response: ") + .append(content); + + return fullResponseBuilder.toString(); + } +} diff --git a/core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java b/core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java index acd6536ac4..37e9f0d752 100644 --- a/core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java +++ b/core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java @@ -7,6 +7,7 @@ import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; +import java.io.Reader; import java.net.CookieManager; import java.net.HttpCookie; import java.net.HttpURLConnection; @@ -48,7 +49,8 @@ public class HttpRequestLiveTest { in.close(); assertEquals("status code incorrect", status, 200); - assertTrue("content incorrect", content.toString().contains("Example Domain")); + assertTrue("content incorrect", content.toString() + .contains("Example Domain")); } @Test @@ -89,18 +91,24 @@ public class HttpRequestLiveTest { Optional usernameCookie = null; if (cookiesHeader != null) { List cookies = HttpCookie.parse(cookiesHeader); - cookies.forEach(cookie -> cookieManager.getCookieStore().add(null, cookie)); - usernameCookie = cookies.stream().findAny().filter(cookie -> cookie.getName().equals("username")); + cookies.forEach(cookie -> cookieManager.getCookieStore() + .add(null, cookie)); + usernameCookie = cookies.stream() + .findAny() + .filter(cookie -> cookie.getName() + .equals("username")); } if (usernameCookie == null) { - cookieManager.getCookieStore().add(null, new HttpCookie("username", "john")); + cookieManager.getCookieStore() + .add(null, new HttpCookie("username", "john")); } con.disconnect(); con = (HttpURLConnection) url.openConnection(); - con.setRequestProperty("Cookie", StringUtils.join(cookieManager.getCookieStore().getCookies(), ";")); + con.setRequestProperty("Cookie", StringUtils.join(cookieManager.getCookieStore() + .getCookies(), ";")); int status = con.getResponseCode(); @@ -125,4 +133,52 @@ public class HttpRequestLiveTest { assertEquals("status code incorrect", con.getResponseCode(), 200); } + @Test + public void whenFailedRequest_thenOk() throws IOException { + URL url = new URL("http://example.com"); + HttpURLConnection con = (HttpURLConnection) url.openConnection(); + con.setRequestMethod("POST"); + + con.setConnectTimeout(5000); + con.setReadTimeout(5000); + + int status = con.getResponseCode(); + + Reader streamReader = null; + + if (status > 299) { + streamReader = new InputStreamReader(con.getErrorStream()); + } else { + streamReader = new InputStreamReader(con.getInputStream()); + } + + BufferedReader in = new BufferedReader(streamReader); + String inputLine; + StringBuilder content = new StringBuilder(); + while ((inputLine = in.readLine()) != null) { + content.append(inputLine); + } + in.close(); + + assertEquals("status code incorrect", status, 411); + assertTrue("error content", content.toString() + .contains("411 - Length Required")); + } + + @Test + public void whenGetRequestFullResponse_thenOk() throws IOException { + URL url = new URL("http://example.com"); + HttpURLConnection con = (HttpURLConnection) url.openConnection(); + con.setRequestMethod("GET"); + + con.setConnectTimeout(5000); + con.setReadTimeout(5000); + + String fullResponse = FullResponseBuilder.getFullResponse(con); + + assertEquals("status code incorrect", con.getResponseCode(), 200); + assertTrue("header incorrect", fullResponse.contains("Content-Type: text/html; charset=UTF-8")); + assertTrue("response incorrect", fullResponse.contains("")); + } + } From 48c0b83978c8f799e2ea2c0ba5b0e715277b34a4 Mon Sep 17 00:00:00 2001 From: Fabian Rivera Date: Mon, 24 Dec 2018 17:46:12 -0600 Subject: [PATCH 178/359] BAEL-2454 Add missing disconnect call on open connections --- .../src/test/java/com/baeldung/http/HttpRequestLiveTest.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java b/core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java index 37e9f0d752..752a75daa5 100644 --- a/core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java +++ b/core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java @@ -160,6 +160,8 @@ public class HttpRequestLiveTest { } in.close(); + con.disconnect(); + assertEquals("status code incorrect", status, 411); assertTrue("error content", content.toString() .contains("411 - Length Required")); @@ -176,6 +178,8 @@ public class HttpRequestLiveTest { String fullResponse = FullResponseBuilder.getFullResponse(con); + con.disconnect(); + assertEquals("status code incorrect", con.getResponseCode(), 200); assertTrue("header incorrect", fullResponse.contains("Content-Type: text/html; charset=UTF-8")); assertTrue("response incorrect", fullResponse.contains("")); From 10c52bc1b900d46d08d4b7ec51fea74a8894cdc7 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Tue, 25 Dec 2018 16:32:35 +0530 Subject: [PATCH 179/359] [BAEL-10839] - Added missed class and moved articles related to hashcode and equals --- core-java-lang-oop/README.md | 4 +++- .../baeldung/immutableobjects/ImmutableObjectsUnitTest.java | 0 core-java-lang/README.md | 2 -- 3 files changed, 3 insertions(+), 3 deletions(-) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java (100%) diff --git a/core-java-lang-oop/README.md b/core-java-lang-oop/README.md index 665178452c..3531ab9677 100644 --- a/core-java-lang-oop/README.md +++ b/core-java-lang-oop/README.md @@ -20,4 +20,6 @@ - [Guide to the this Java Keyword](http://www.baeldung.com/java-this) - [Immutable Objects in Java](http://www.baeldung.com/java-immutable-object) - [Inheritance and Composition (Is-a vs Has-a relationship) in Java](http://www.baeldung.com/java-inheritance-composition) -- [A Guide to Constructors in Java](https://www.baeldung.com/java-constructors) \ No newline at end of file +- [A Guide to Constructors in Java](https://www.baeldung.com/java-constructors) +- [Generate equals() and hashCode() with Eclipse](http://www.baeldung.com/java-eclipse-equals-and-hashcode) +- [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts) \ No newline at end of file diff --git a/core-java-lang/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java diff --git a/core-java-lang/README.md b/core-java-lang/README.md index 56de6d2e82..68cd7ce452 100644 --- a/core-java-lang/README.md +++ b/core-java-lang/README.md @@ -5,7 +5,6 @@ ### Relevant Articles: - [Guide to Java Reflection](http://www.baeldung.com/java-reflection) - [Introduction to Java Generics](http://www.baeldung.com/java-generics) -- [Generate equals() and hashCode() with Eclipse](http://www.baeldung.com/java-eclipse-equals-and-hashcode) - [Chained Exceptions in Java](http://www.baeldung.com/java-chained-exceptions) - [Java Primitive Conversions](http://www.baeldung.com/java-primitive-conversions) - [Call Methods at Runtime Using Java Reflection](http://www.baeldung.com/java-method-reflection) @@ -40,4 +39,3 @@ - [How to Separate Double into Integer and Decimal Parts](https://www.baeldung.com/java-separate-double-into-integer-decimal-parts) - [“Sneaky Throws” in Java](http://www.baeldung.com/java-sneaky-throws) - [Retrieving a Class Name in Java](https://www.baeldung.com/java-class-name) -- [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts) From fb66f1bc78fd363c0c51c110f98ab97272111d11 Mon Sep 17 00:00:00 2001 From: Loredana Date: Tue, 25 Dec 2018 14:05:10 +0200 Subject: [PATCH 180/359] move networking articles, update readme --- core-java-networking/README.md | 4 +++- core-java-networking/pom.xml | 6 ++++++ .../src/main/java/com/baeldung/networking/README.md | 5 ----- .../main/java/com/baeldung/networking}/uriurl/URIDemo.java | 2 +- .../main/java/com/baeldung/networking}/uriurl/URLDemo.java | 2 +- .../networking/interfaces/NetworkInterfaceManualTest.java | 2 +- .../com/baeldung/networking/uriurl}/URIDemoLiveTest.java | 4 ++-- .../com/baeldung/networking}/uriurl/URIvsURLUnitTest.java | 2 +- .../com/baeldung/networking/uriurl}/URLDemoLiveTest.java | 4 ++-- .../test/java/com/baeldung}/networking/url/UrlUnitTest.java | 2 +- core-java/README.md | 1 + .../main/java/com/baeldung/console/ConsoleConsoleClass.java | 0 .../main/java/com/baeldung/console/ConsoleScannerClass.java | 0 13 files changed, 19 insertions(+), 15 deletions(-) delete mode 100644 core-java-networking/src/main/java/com/baeldung/networking/README.md rename {core-java/src/main/java/com/baeldung/javanetworking => core-java-networking/src/main/java/com/baeldung/networking}/uriurl/URIDemo.java (98%) rename {core-java/src/main/java/com/baeldung/javanetworking => core-java-networking/src/main/java/com/baeldung/networking}/uriurl/URLDemo.java (98%) rename {core-java/src/test/java/com/baeldung/java => core-java-networking/src/test/java/com/baeldung}/networking/interfaces/NetworkInterfaceManualTest.java (98%) rename {core-java/src/test/java/com/baeldung/javanetworking/uriurl/test => core-java-networking/src/test/java/com/baeldung/networking/uriurl}/URIDemoLiveTest.java (95%) rename {core-java/src/test/java/com/baeldung/javanetworking => core-java-networking/src/test/java/com/baeldung/networking}/uriurl/URIvsURLUnitTest.java (98%) rename {core-java/src/test/java/com/baeldung/javanetworking/uriurl/test => core-java-networking/src/test/java/com/baeldung/networking/uriurl}/URLDemoLiveTest.java (97%) rename {core-java/src/test/java/com/baeldung/java => core-java-networking/src/test/java/com/baeldung}/networking/url/UrlUnitTest.java (98%) rename {core-java-networking => core-java}/src/main/java/com/baeldung/console/ConsoleConsoleClass.java (100%) rename {core-java-networking => core-java}/src/main/java/com/baeldung/console/ConsoleScannerClass.java (100%) diff --git a/core-java-networking/README.md b/core-java-networking/README.md index 2cb2c52d3d..4b77aa3c1f 100644 --- a/core-java-networking/README.md +++ b/core-java-networking/README.md @@ -8,4 +8,6 @@ - [Broadcasting and Multicasting in Java](http://www.baeldung.com/java-broadcast-multicast) - [A Guide To UDP In Java](http://www.baeldung.com/udp-in-java) - [Sending Emails with Java](http://www.baeldung.com/java-email) -- [Console I/O in Java](http://www.baeldung.com/java-console-input-output) \ No newline at end of file +- [A Guide To HTTP Cookies In Java](http://www.baeldung.com/cookies-java) +- [A Guide to the Java URL](http://www.baeldung.com/java-url) +- [Working with Network Interfaces in Java](http://www.baeldung.com/java-network-interfaces) diff --git a/core-java-networking/pom.xml b/core-java-networking/pom.xml index 7d7bf4bc95..c7fa2af180 100644 --- a/core-java-networking/pom.xml +++ b/core-java-networking/pom.xml @@ -19,6 +19,11 @@ mail ${javax.mail.version} + + commons-io + commons-io + ${commons-io.version} + @@ -27,5 +32,6 @@ 1.5.0-b01 + 2.5 diff --git a/core-java-networking/src/main/java/com/baeldung/networking/README.md b/core-java-networking/src/main/java/com/baeldung/networking/README.md deleted file mode 100644 index b9e827f085..0000000000 --- a/core-java-networking/src/main/java/com/baeldung/networking/README.md +++ /dev/null @@ -1,5 +0,0 @@ -### Relevant Articles: -- [A Guide To UDP In Java](http://www.baeldung.com/udp-in-java) -- [A Guide To HTTP Cookies In Java](http://www.baeldung.com/cookies-java) -- [A Guide to the Java URL](http://www.baeldung.com/java-url) -- [Working with Network Interfaces in Java](http://www.baeldung.com/java-network-interfaces) diff --git a/core-java/src/main/java/com/baeldung/javanetworking/uriurl/URIDemo.java b/core-java-networking/src/main/java/com/baeldung/networking/uriurl/URIDemo.java similarity index 98% rename from core-java/src/main/java/com/baeldung/javanetworking/uriurl/URIDemo.java rename to core-java-networking/src/main/java/com/baeldung/networking/uriurl/URIDemo.java index 121e0f5d72..91f6e21293 100644 --- a/core-java/src/main/java/com/baeldung/javanetworking/uriurl/URIDemo.java +++ b/core-java-networking/src/main/java/com/baeldung/networking/uriurl/URIDemo.java @@ -1,4 +1,4 @@ -package com.baeldung.javanetworking.uriurl; +package com.baeldung.networking.uriurl; import java.io.BufferedReader; import java.io.IOException; diff --git a/core-java/src/main/java/com/baeldung/javanetworking/uriurl/URLDemo.java b/core-java-networking/src/main/java/com/baeldung/networking/uriurl/URLDemo.java similarity index 98% rename from core-java/src/main/java/com/baeldung/javanetworking/uriurl/URLDemo.java rename to core-java-networking/src/main/java/com/baeldung/networking/uriurl/URLDemo.java index 109a9951d2..d257e7a295 100644 --- a/core-java/src/main/java/com/baeldung/javanetworking/uriurl/URLDemo.java +++ b/core-java-networking/src/main/java/com/baeldung/networking/uriurl/URLDemo.java @@ -1,4 +1,4 @@ -package com.baeldung.javanetworking.uriurl; +package com.baeldung.networking.uriurl; import java.io.BufferedReader; import java.io.IOException; diff --git a/core-java/src/test/java/com/baeldung/java/networking/interfaces/NetworkInterfaceManualTest.java b/core-java-networking/src/test/java/com/baeldung/networking/interfaces/NetworkInterfaceManualTest.java similarity index 98% rename from core-java/src/test/java/com/baeldung/java/networking/interfaces/NetworkInterfaceManualTest.java rename to core-java-networking/src/test/java/com/baeldung/networking/interfaces/NetworkInterfaceManualTest.java index 8635a24f18..47a598f599 100644 --- a/core-java/src/test/java/com/baeldung/java/networking/interfaces/NetworkInterfaceManualTest.java +++ b/core-java-networking/src/test/java/com/baeldung/networking/interfaces/NetworkInterfaceManualTest.java @@ -1,4 +1,4 @@ -package com.baeldung.java.networking.interfaces; +package com.baeldung.networking.interfaces; import org.junit.Test; diff --git a/core-java/src/test/java/com/baeldung/javanetworking/uriurl/test/URIDemoLiveTest.java b/core-java-networking/src/test/java/com/baeldung/networking/uriurl/URIDemoLiveTest.java similarity index 95% rename from core-java/src/test/java/com/baeldung/javanetworking/uriurl/test/URIDemoLiveTest.java rename to core-java-networking/src/test/java/com/baeldung/networking/uriurl/URIDemoLiveTest.java index 0c312ff613..3b73cc0943 100644 --- a/core-java/src/test/java/com/baeldung/javanetworking/uriurl/test/URIDemoLiveTest.java +++ b/core-java-networking/src/test/java/com/baeldung/networking/uriurl/URIDemoLiveTest.java @@ -1,4 +1,4 @@ -package com.baeldung.javanetworking.uriurl.test; +package com.baeldung.networking.uriurl; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -20,7 +20,7 @@ import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.baeldung.javanetworking.uriurl.URLDemo; +import com.baeldung.networking.uriurl.URLDemo; @FixMethodOrder public class URIDemoLiveTest { diff --git a/core-java/src/test/java/com/baeldung/javanetworking/uriurl/URIvsURLUnitTest.java b/core-java-networking/src/test/java/com/baeldung/networking/uriurl/URIvsURLUnitTest.java similarity index 98% rename from core-java/src/test/java/com/baeldung/javanetworking/uriurl/URIvsURLUnitTest.java rename to core-java-networking/src/test/java/com/baeldung/networking/uriurl/URIvsURLUnitTest.java index 8837dc5556..ec1cb4c0c9 100644 --- a/core-java/src/test/java/com/baeldung/javanetworking/uriurl/URIvsURLUnitTest.java +++ b/core-java-networking/src/test/java/com/baeldung/networking/uriurl/URIvsURLUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.javanetworking.uriurl; +package com.baeldung.networking.uriurl; import java.io.IOException; import java.net.MalformedURLException; diff --git a/core-java/src/test/java/com/baeldung/javanetworking/uriurl/test/URLDemoLiveTest.java b/core-java-networking/src/test/java/com/baeldung/networking/uriurl/URLDemoLiveTest.java similarity index 97% rename from core-java/src/test/java/com/baeldung/javanetworking/uriurl/test/URLDemoLiveTest.java rename to core-java-networking/src/test/java/com/baeldung/networking/uriurl/URLDemoLiveTest.java index 15f53ed878..a9104311e6 100644 --- a/core-java/src/test/java/com/baeldung/javanetworking/uriurl/test/URLDemoLiveTest.java +++ b/core-java-networking/src/test/java/com/baeldung/networking/uriurl/URLDemoLiveTest.java @@ -1,4 +1,4 @@ -package com.baeldung.javanetworking.uriurl.test; +package com.baeldung.networking.uriurl; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -18,7 +18,7 @@ import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.baeldung.javanetworking.uriurl.URLDemo; +import com.baeldung.networking.uriurl.URLDemo; @FixMethodOrder public class URLDemoLiveTest { diff --git a/core-java/src/test/java/com/baeldung/java/networking/url/UrlUnitTest.java b/core-java-networking/src/test/java/com/baeldung/networking/url/UrlUnitTest.java similarity index 98% rename from core-java/src/test/java/com/baeldung/java/networking/url/UrlUnitTest.java rename to core-java-networking/src/test/java/com/baeldung/networking/url/UrlUnitTest.java index 505d9595ab..112f2cf53f 100644 --- a/core-java/src/test/java/com/baeldung/java/networking/url/UrlUnitTest.java +++ b/core-java-networking/src/test/java/com/baeldung/networking/url/UrlUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.java.networking.url; +package com.baeldung.networking.url; import static org.junit.Assert.assertEquals; diff --git a/core-java/README.md b/core-java/README.md index 961ca45cce..b0e8f81e1f 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -71,3 +71,4 @@ - [Calculate the Area of a Circle in Java](https://www.baeldung.com/java-calculate-circle-area) - [A Guide to the Java Math Class](https://www.baeldung.com/java-lang-math) - [Graphs in Java](https://www.baeldung.com/java-graphs) +- [Console I/O in Java](http://www.baeldung.com/java-console-input-output) diff --git a/core-java-networking/src/main/java/com/baeldung/console/ConsoleConsoleClass.java b/core-java/src/main/java/com/baeldung/console/ConsoleConsoleClass.java similarity index 100% rename from core-java-networking/src/main/java/com/baeldung/console/ConsoleConsoleClass.java rename to core-java/src/main/java/com/baeldung/console/ConsoleConsoleClass.java diff --git a/core-java-networking/src/main/java/com/baeldung/console/ConsoleScannerClass.java b/core-java/src/main/java/com/baeldung/console/ConsoleScannerClass.java similarity index 100% rename from core-java-networking/src/main/java/com/baeldung/console/ConsoleScannerClass.java rename to core-java/src/main/java/com/baeldung/console/ConsoleScannerClass.java From e02f08eb8c334e836df78827c891daa598b99c84 Mon Sep 17 00:00:00 2001 From: Loredana Date: Tue, 25 Dec 2018 14:13:34 +0200 Subject: [PATCH 181/359] update readmes --- patterns/README.md | 11 ----------- patterns/design-patterns/README.md | 4 ++++ 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/patterns/README.md b/patterns/README.md index 9653558f43..9a15cdff02 100644 --- a/patterns/README.md +++ b/patterns/README.md @@ -1,14 +1,3 @@ ### Relevant Articles: - [A Guide to the Front Controller Pattern in Java](http://www.baeldung.com/java-front-controller-pattern) - [Introduction to Intercepting Filter Pattern in Java](http://www.baeldung.com/intercepting-filter-pattern-in-java) -- [Implementing the Template Method Pattern in Java](http://www.baeldung.com/java-template-method-pattern) -- [Chain of Responsibility Design Pattern in Java](http://www.baeldung.com/chain-of-responsibility-pattern) -- [The Command Pattern in Java](http://www.baeldung.com/java-command-pattern) -- [The DAO Pattern in Java](http://www.baeldung.com/java-dao-pattern) -- [Introduction to Creational Design Patterns](http://www.baeldung.com/creational-design-patterns) -- [Proxy, Decorator, Adapter and Bridge Patterns](http://www.baeldung.com/java-structural-design-patterns) -- [Singletons in Java](http://www.baeldung.com/java-singleton) -- [Flyweight Pattern in Java](http://www.baeldung.com/java-flyweight) -- [The Observer Pattern in Java](http://www.baeldung.com/java-observer-pattern) -- [Service Locator Pattern](http://www.baeldung.com/java-service-locator-pattern) -- [Java Constructors vs Static Factory Methods](https://www.baeldung.com/java-constructors-vs-static-factory-methods) \ No newline at end of file diff --git a/patterns/design-patterns/README.md b/patterns/design-patterns/README.md index e56872b3fd..8046d2034b 100644 --- a/patterns/design-patterns/README.md +++ b/patterns/design-patterns/README.md @@ -14,3 +14,7 @@ - [State Design Pattern in Java](https://www.baeldung.com/java-state-design-pattern) - [The Decorator Pattern in Java](https://www.baeldung.com/java-decorator-pattern) - [Abstract Factory Pattern in Java](https://www.baeldung.com/java-abstract-factory-pattern) +- [Implementing the Template Method Pattern in Java](http://www.baeldung.com/java-template-method-pattern) +- [Chain of Responsibility Design Pattern in Java](http://www.baeldung.com/chain-of-responsibility-pattern) +- [The Command Pattern in Java](http://www.baeldung.com/java-command-pattern) +- [Java Constructors vs Static Factory Methods](https://www.baeldung.com/java-constructors-vs-static-factory-methods) From 55158e59c9d46e96de7468b262e83326cdf2290b Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Tue, 25 Dec 2018 15:54:29 +0200 Subject: [PATCH 182/359] Update README.md --- core-java-lang-oop/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core-java-lang-oop/README.md b/core-java-lang-oop/README.md index 3531ab9677..bbc3d26c99 100644 --- a/core-java-lang-oop/README.md +++ b/core-java-lang-oop/README.md @@ -21,5 +21,4 @@ - [Immutable Objects in Java](http://www.baeldung.com/java-immutable-object) - [Inheritance and Composition (Is-a vs Has-a relationship) in Java](http://www.baeldung.com/java-inheritance-composition) - [A Guide to Constructors in Java](https://www.baeldung.com/java-constructors) -- [Generate equals() and hashCode() with Eclipse](http://www.baeldung.com/java-eclipse-equals-and-hashcode) -- [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts) \ No newline at end of file +- [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts) From 45ba2a9387df43f5d50115fd24274ab8202f194e Mon Sep 17 00:00:00 2001 From: amit2103 Date: Tue, 25 Dec 2018 21:54:46 +0530 Subject: [PATCH 183/359] [BAEL-10837] - Splitted core-java-concurrency module --- .../.gitignore | 0 .../README.md | 14 +--- .../pom.xml | 6 +- .../atomic/SafeCounterWithLock.java | 26 +++---- .../atomic/SafeCounterWithoutLock.java | 42 +++++----- .../concurrent/atomic/UnsafeCounter.java | 26 +++---- .../countdownlatch/BrokenWorker.java | 0 .../CountdownLatchCountExample.java | 0 .../CountdownLatchResetExample.java | 0 .../countdownlatch/WaitingWorker.java | 0 .../concurrent/countdownlatch/Worker.java | 0 .../CyclicBarrierCompletionMethodExample.java | 0 .../CyclicBarrierCountExample.java | 0 .../cyclicbarrier/CyclicBarrierDemo.java | 0 .../CyclicBarrierResetExample.java | 0 .../daemon/MultipleThreadsExample.java | 0 .../baeldung/concurrent/daemon/NewThread.java | 0 .../daemon/SingleThreadExample.java | 0 .../DiningPhilosophers.java | 0 .../diningphilosophers/Philosopher.java | 0 .../evenandodd/PrintEvenOddSemaphore.java | 0 .../evenandodd/PrintEvenOddWaitNotify.java | 0 .../locks/ReentrantLockWithCondition.java | 0 .../locks/SharedObjectWithLock.java | 0 .../concurrent/locks/StampedLockDemo.java | 0 .../locks/SynchronizedHashMapWithRWLock.java | 0 .../parameter/AverageCalculator.java | 0 .../parameter/ParameterizedThreadExample.java | 0 .../concurrent/phaser/LongRunningAction.java | 0 .../concurrent/prioritytaskexecution/Job.java | 0 .../prioritytaskexecution/JobPriority.java | 0 .../PriorityJobScheduler.java | 0 .../semaphores/CounterUsingMutex.java | 0 .../DelayQueueUsingTimedSemaphore.java | 0 .../semaphores/LoginQueueUsingSemaphore.java | 0 .../volatilekeyword/SharedObject.java | 0 .../concurrent/yield/ThreadYield.java | 0 .../forkjoin/CustomRecursiveAction.java | 0 .../forkjoin/CustomRecursiveTask.java | 0 .../com/baeldung/forkjoin/util/PoolUtil.java | 0 .../com/baeldung/threadlocal/Context.java | 0 .../threadlocal/SharedMapWithUserContext.java | 0 .../ThreadLocalWithUserContext.java | 0 .../baeldung/threadlocal/UserRepository.java | 0 .../ThreadLocalRandomBenchMarkRunner.java | 0 .../ThreadLocalRandomBenchMarker.java | 0 .../com/baeldung/threadpool/CountingTask.java | 0 .../ExitingExecutorServiceExample.java | 0 .../com/baeldung/threadpool/TreeNode.java | 0 .../src/main/java/log4j.properties | 0 .../src/main/resources/logback.xml | 0 .../accumulator/LongAccumulatorUnitTest.java | 0 .../concurrent/adder/LongAdderUnitTest.java | 0 .../ThreadSafeCounterIntegrationTest.java | 76 +++++++++---------- .../atomic/ThreadUnsafeCounterManualTest.java | 66 ++++++++-------- .../CountdownLatchCountExampleUnitTest.java | 0 .../CountdownLatchExampleIntegrationTest.java | 0 .../CountdownLatchResetExampleUnitTest.java | 0 ...arrierCompletionMethodExampleUnitTest.java | 0 .../CyclicBarrierCountExampleUnitTest.java | 0 .../CyclicBarrierResetExampleUnitTest.java | 0 .../daemon/DaemonThreadUnitTest.java | 0 .../locks/SharedObjectWithLockManualTest.java | 0 ...nchronizedHashMapWithRWLockManualTest.java | 0 .../concurrent/phaser/PhaserUnitTest.java | 0 .../PriorityJobSchedulerUnitTest.java | 0 .../semaphores/SemaphoresManualTest.java | 0 .../SharedObjectManualTest.java | 0 .../java8/Java8ForkJoinIntegrationTest.java | 0 .../ParameterizedThreadUnitTest.java | 0 .../thread/join/ThreadJoinUnitTest.java | 0 .../ThreadLocalIntegrationTest.java | 0 .../ThreadLocalRandomIntegrationTest.java | 0 .../CoreThreadPoolIntegrationTest.java | 0 .../GuavaThreadPoolIntegrationTest.java | 0 .../src/test/resources/.gitignore | 0 core-java-concurrency-basic/.gitignore | 26 +++++++ core-java-concurrency-basic/README.md | 17 +++++ core-java-concurrency-basic/pom.xml | 55 ++++++++++++++ .../ScheduledExecutorServiceDemo.java | 0 .../concurrent/callable/FactorialTask.java | 0 .../cyclicbarrier/CyclicBarrierExample.java | 0 .../concurrent/cyclicbarrier/Task.java | 0 .../concurrent/executor/ExecutorDemo.java | 0 .../baeldung/concurrent/executor/Invoker.java | 0 .../executorservice/DelayedCallable.java | 0 .../executorservice/ExecutorServiceDemo.java | 0 .../concurrent/executorservice/Task.java | 0 .../future/FactorialSquareCalculator.java | 0 .../concurrent/future/FutureDemo.java | 0 .../concurrent/future/SquareCalculator.java | 0 .../concurrent/runnable/EventLoggingTask.java | 0 .../concurrent/runnable/TaskRunner.java | 0 .../concurrent/semaphore/SemaPhoreDemo.java | 0 .../concurrent/sleepwait/ThreadA.java | 0 .../concurrent/sleepwait/ThreadB.java | 0 .../sleepwait/WaitSleepExample.java | 0 .../concurrent/stopping/ControlSubThread.java | 0 .../BaeldungSynchronizedBlocks.java | 0 .../BaeldungSynchronizedMethods.java | 0 .../threadfactory/BaeldungThreadFactory.java | 0 .../concurrent/threadfactory/Demo.java | 0 .../concurrent/threadfactory/Task.java | 0 .../threadlifecycle/BlockedState.java | 0 .../concurrent/threadlifecycle/NewState.java | 0 .../threadlifecycle/RunnableState.java | 0 .../threadlifecycle/TerminatedState.java | 0 .../threadlifecycle/TimedWaitingState.java | 0 .../threadlifecycle/WaitingState.java | 0 .../concurrent/waitandnotify/Data.java | 0 .../waitandnotify/NetworkDriver.java | 0 .../concurrent/waitandnotify/Receiver.java | 0 .../concurrent/waitandnotify/Sender.java | 0 .../src/main/resources/logback.xml | 19 +++++ .../CompletableFutureLongRunningUnitTest.java | 0 .../callable/FactorialTaskManualTest.java | 0 .../WaitingForThreadsToFinishManualTest.java | 0 .../FactorialSquareCalculatorUnitTest.java | 0 .../SquareCalculatorIntegrationTest.java | 0 .../runnable/RunnableVsThreadLiveTest.java | 0 .../stopping/StopThreadManualTest.java | 0 .../BaeldungSychronizedBlockUnitTest.java | 0 .../BaeldungSynchronizeMethodsUnitTest.java | 0 .../waitandnotify/NetworkIntegrationTest.java | 0 .../Java8ExecutorServiceIntegrationTest.java | 0 .../src/test/resources/.gitignore | 13 ++++ pom.xml | 6 +- 127 files changed, 256 insertions(+), 136 deletions(-) rename {core-java-concurrency => core-java-concurrency-advanced}/.gitignore (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/README.md (60%) rename {core-java-concurrency => core-java-concurrency-advanced}/pom.xml (94%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java (94%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java (96%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/atomic/UnsafeCounter.java (94%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/countdownlatch/BrokenWorker.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/countdownlatch/WaitingWorker.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/countdownlatch/Worker.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/daemon/MultipleThreadsExample.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/daemon/NewThread.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/daemon/SingleThreadExample.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/diningphilosophers/DiningPhilosophers.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/diningphilosophers/Philosopher.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/locks/ReentrantLockWithCondition.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/locks/SharedObjectWithLock.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/locks/StampedLockDemo.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLock.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/parameter/AverageCalculator.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/parameter/ParameterizedThreadExample.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/phaser/LongRunningAction.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/prioritytaskexecution/Job.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/prioritytaskexecution/JobPriority.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobScheduler.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/semaphores/CounterUsingMutex.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/semaphores/DelayQueueUsingTimedSemaphore.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/semaphores/LoginQueueUsingSemaphore.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/volatilekeyword/SharedObject.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/yield/ThreadYield.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/threadlocal/Context.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/threadlocal/SharedMapWithUserContext.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/threadlocal/ThreadLocalWithUserContext.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/threadlocal/UserRepository.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/threadpool/CountingTask.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/threadpool/ExitingExecutorServiceExample.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/threadpool/TreeNode.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/log4j.properties (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/resources/logback.xml (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/accumulator/LongAccumulatorUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/adder/LongAdderUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterIntegrationTest.java (97%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/atomic/ThreadUnsafeCounterManualTest.java (97%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchExampleIntegrationTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/locks/SharedObjectWithLockManualTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/phaser/PhaserUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobSchedulerUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/semaphores/SemaphoresManualTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/volatilekeyword/SharedObjectManualTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/java8/Java8ForkJoinIntegrationTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/parameters/ParameterizedThreadUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/threadlocal/ThreadLocalIntegrationTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/threadpool/CoreThreadPoolIntegrationTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/threadpool/GuavaThreadPoolIntegrationTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/resources/.gitignore (100%) create mode 100644 core-java-concurrency-basic/.gitignore create mode 100644 core-java-concurrency-basic/README.md create mode 100644 core-java-concurrency-basic/pom.xml rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/callable/FactorialTask.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierExample.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/cyclicbarrier/Task.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/executor/ExecutorDemo.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/executor/Invoker.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/executorservice/ExecutorServiceDemo.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/executorservice/Task.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/future/FactorialSquareCalculator.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/future/FutureDemo.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/future/SquareCalculator.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/runnable/EventLoggingTask.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/runnable/TaskRunner.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/stopping/ControlSubThread.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/threadfactory/BaeldungThreadFactory.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/threadfactory/Demo.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/threadfactory/Task.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java (100%) create mode 100644 core-java-concurrency-basic/src/main/resources/logback.xml rename {core-java-concurrency => core-java-concurrency-basic}/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/test/java/com/baeldung/concurrent/callable/FactorialTaskManualTest.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishManualTest.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/test/java/com/baeldung/concurrent/future/FactorialSquareCalculatorUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/test/java/com/baeldung/concurrent/future/SquareCalculatorIntegrationTest.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/test/java/com/baeldung/concurrent/runnable/RunnableVsThreadLiveTest.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/test/java/com/baeldung/concurrent/stopping/StopThreadManualTest.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/test/java/com/baeldung/java8/Java8ExecutorServiceIntegrationTest.java (100%) create mode 100644 core-java-concurrency-basic/src/test/resources/.gitignore diff --git a/core-java-concurrency/.gitignore b/core-java-concurrency-advanced/.gitignore similarity index 100% rename from core-java-concurrency/.gitignore rename to core-java-concurrency-advanced/.gitignore diff --git a/core-java-concurrency/README.md b/core-java-concurrency-advanced/README.md similarity index 60% rename from core-java-concurrency/README.md rename to core-java-concurrency-advanced/README.md index e8693a0231..bcbec9d687 100644 --- a/core-java-concurrency/README.md +++ b/core-java-concurrency-advanced/README.md @@ -1,33 +1,21 @@ ========= -## Core Java Concurrency Examples +## Core Java Concurrency Advanced Examples ### Relevant Articles: -- [Guide To CompletableFuture](http://www.baeldung.com/java-completablefuture) -- [A Guide to the Java ExecutorService](http://www.baeldung.com/java-executor-service-tutorial) - [Introduction to Thread Pools in Java](http://www.baeldung.com/thread-pool-java-and-guava) -- [Guide to java.util.concurrent.Future](http://www.baeldung.com/java-future) - [Guide to CountDownLatch in Java](http://www.baeldung.com/java-countdown-latch) - [Guide to java.util.concurrent.Locks](http://www.baeldung.com/java-concurrent-locks) - [An Introduction to ThreadLocal in Java](http://www.baeldung.com/java-threadlocal) -- [Difference Between Wait and Sleep in Java](http://www.baeldung.com/java-wait-and-sleep) - [LongAdder and LongAccumulator in Java](http://www.baeldung.com/java-longadder-and-longaccumulator) - [The Dining Philosophers Problem in Java](http://www.baeldung.com/java-dining-philoshophers) - [Guide to the Java Phaser](http://www.baeldung.com/java-phaser) -- [Guide to Synchronized Keyword in Java](http://www.baeldung.com/java-synchronized) - [An Introduction to Atomic Variables in Java](http://www.baeldung.com/java-atomic-variables) - [CyclicBarrier in Java](http://www.baeldung.com/java-cyclic-barrier) - [Guide to Volatile Keyword in Java](http://www.baeldung.com/java-volatile) -- [Overview of the java.util.concurrent](http://www.baeldung.com/java-util-concurrent) - [Semaphores in Java](http://www.baeldung.com/java-semaphore) - [Daemon Threads in Java](http://www.baeldung.com/java-daemon-thread) -- [Implementing a Runnable vs Extending a Thread](http://www.baeldung.com/java-runnable-vs-extending-thread) -- [How to Kill a Java Thread](http://www.baeldung.com/java-thread-stop) -- [ExecutorService - Waiting for Threads to Finish](http://www.baeldung.com/java-executor-wait-for-threads) -- [wait and notify() Methods in Java](http://www.baeldung.com/java-wait-notify) - [Priority-based Job Scheduling in Java](http://www.baeldung.com/java-priority-job-schedule) -- [Life Cycle of a Thread in Java](http://www.baeldung.com/java-thread-lifecycle) -- [Runnable vs. Callable in Java](http://www.baeldung.com/java-runnable-callable) - [Brief Introduction to Java Thread.yield()](https://www.baeldung.com/java-thread-yield) - [Print Even and Odd Numbers Using 2 Threads](https://www.baeldung.com/java-even-odd-numbers-with-2-threads) - [Java CyclicBarrier vs CountDownLatch](https://www.baeldung.com/java-cyclicbarrier-countdownlatch) diff --git a/core-java-concurrency/pom.xml b/core-java-concurrency-advanced/pom.xml similarity index 94% rename from core-java-concurrency/pom.xml rename to core-java-concurrency-advanced/pom.xml index 5dde4d5820..1209cba619 100644 --- a/core-java-concurrency/pom.xml +++ b/core-java-concurrency-advanced/pom.xml @@ -2,10 +2,10 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung - core-java-concurrency + core-java-concurrency-advanced 0.1.0-SNAPSHOT jar - core-java-concurrency + core-java-concurrency-advanced com.baeldung @@ -60,7 +60,7 @@ - core-java-concurrency + core-java-concurrency-advanced src/main/resources diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java similarity index 94% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java index e3a1629ce1..ef6b7ee8c8 100644 --- a/core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java +++ b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java @@ -1,13 +1,13 @@ -package com.baeldung.concurrent.atomic; - -public class SafeCounterWithLock { - private volatile int counter; - - int getValue() { - return counter; - } - - synchronized void increment() { - counter++; - } -} +package com.baeldung.concurrent.atomic; + +public class SafeCounterWithLock { + private volatile int counter; + + int getValue() { + return counter; + } + + synchronized void increment() { + counter++; + } +} diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java similarity index 96% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java index 18ade35efb..8b2aebba7c 100644 --- a/core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java +++ b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java @@ -1,21 +1,21 @@ -package com.baeldung.concurrent.atomic; - -import java.util.concurrent.atomic.AtomicInteger; - -public class SafeCounterWithoutLock { - private final AtomicInteger counter = new AtomicInteger(0); - - int getValue() { - return counter.get(); - } - - void increment() { - while(true) { - int existingValue = getValue(); - int newValue = existingValue + 1; - if(counter.compareAndSet(existingValue, newValue)) { - return; - } - } - } -} +package com.baeldung.concurrent.atomic; + +import java.util.concurrent.atomic.AtomicInteger; + +public class SafeCounterWithoutLock { + private final AtomicInteger counter = new AtomicInteger(0); + + int getValue() { + return counter.get(); + } + + void increment() { + while(true) { + int existingValue = getValue(); + int newValue = existingValue + 1; + if(counter.compareAndSet(existingValue, newValue)) { + return; + } + } + } +} diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/UnsafeCounter.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/UnsafeCounter.java similarity index 94% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/UnsafeCounter.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/UnsafeCounter.java index 500ef5bd7e..290c26b73d 100644 --- a/core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/UnsafeCounter.java +++ b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/UnsafeCounter.java @@ -1,13 +1,13 @@ -package com.baeldung.concurrent.atomic; - -public class UnsafeCounter { - private int counter; - - int getValue() { - return counter; - } - - void increment() { - counter++; - } -} +package com.baeldung.concurrent.atomic; + +public class UnsafeCounter { + private int counter; + + int getValue() { + return counter; + } + + void increment() { + counter++; + } +} diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/BrokenWorker.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/BrokenWorker.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/BrokenWorker.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/BrokenWorker.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/WaitingWorker.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/WaitingWorker.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/WaitingWorker.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/WaitingWorker.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/Worker.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/Worker.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/Worker.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/Worker.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/MultipleThreadsExample.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/daemon/MultipleThreadsExample.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/MultipleThreadsExample.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/daemon/MultipleThreadsExample.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/daemon/NewThread.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/daemon/NewThread.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/SingleThreadExample.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/daemon/SingleThreadExample.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/SingleThreadExample.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/daemon/SingleThreadExample.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/diningphilosophers/DiningPhilosophers.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/diningphilosophers/DiningPhilosophers.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/diningphilosophers/DiningPhilosophers.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/diningphilosophers/DiningPhilosophers.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/diningphilosophers/Philosopher.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/diningphilosophers/Philosopher.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/diningphilosophers/Philosopher.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/diningphilosophers/Philosopher.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/ReentrantLockWithCondition.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/locks/ReentrantLockWithCondition.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/ReentrantLockWithCondition.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/locks/ReentrantLockWithCondition.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/SharedObjectWithLock.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/locks/SharedObjectWithLock.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/SharedObjectWithLock.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/locks/SharedObjectWithLock.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/StampedLockDemo.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/locks/StampedLockDemo.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/StampedLockDemo.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/locks/StampedLockDemo.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLock.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLock.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLock.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLock.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/parameter/AverageCalculator.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/parameter/AverageCalculator.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/parameter/AverageCalculator.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/parameter/AverageCalculator.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/parameter/ParameterizedThreadExample.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/parameter/ParameterizedThreadExample.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/parameter/ParameterizedThreadExample.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/parameter/ParameterizedThreadExample.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/phaser/LongRunningAction.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/phaser/LongRunningAction.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/phaser/LongRunningAction.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/phaser/LongRunningAction.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/prioritytaskexecution/Job.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/prioritytaskexecution/Job.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/prioritytaskexecution/Job.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/prioritytaskexecution/Job.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/prioritytaskexecution/JobPriority.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/prioritytaskexecution/JobPriority.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/prioritytaskexecution/JobPriority.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/prioritytaskexecution/JobPriority.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobScheduler.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobScheduler.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobScheduler.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobScheduler.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphores/CounterUsingMutex.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/semaphores/CounterUsingMutex.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphores/CounterUsingMutex.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/semaphores/CounterUsingMutex.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphores/DelayQueueUsingTimedSemaphore.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/semaphores/DelayQueueUsingTimedSemaphore.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphores/DelayQueueUsingTimedSemaphore.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/semaphores/DelayQueueUsingTimedSemaphore.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphores/LoginQueueUsingSemaphore.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/semaphores/LoginQueueUsingSemaphore.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphores/LoginQueueUsingSemaphore.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/semaphores/LoginQueueUsingSemaphore.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/volatilekeyword/SharedObject.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/volatilekeyword/SharedObject.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/volatilekeyword/SharedObject.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/volatilekeyword/SharedObject.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/yield/ThreadYield.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/yield/ThreadYield.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/yield/ThreadYield.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/yield/ThreadYield.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/threadlocal/Context.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/Context.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/threadlocal/Context.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/Context.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/threadlocal/SharedMapWithUserContext.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/SharedMapWithUserContext.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/threadlocal/SharedMapWithUserContext.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/SharedMapWithUserContext.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/threadlocal/ThreadLocalWithUserContext.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/ThreadLocalWithUserContext.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/threadlocal/ThreadLocalWithUserContext.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/ThreadLocalWithUserContext.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/threadlocal/UserRepository.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/UserRepository.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/threadlocal/UserRepository.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/UserRepository.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/threadpool/CountingTask.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/threadpool/CountingTask.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/threadpool/CountingTask.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/threadpool/CountingTask.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/threadpool/ExitingExecutorServiceExample.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/threadpool/ExitingExecutorServiceExample.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/threadpool/ExitingExecutorServiceExample.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/threadpool/ExitingExecutorServiceExample.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/threadpool/TreeNode.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/threadpool/TreeNode.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/threadpool/TreeNode.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/threadpool/TreeNode.java diff --git a/core-java-concurrency/src/main/java/log4j.properties b/core-java-concurrency-advanced/src/main/java/log4j.properties similarity index 100% rename from core-java-concurrency/src/main/java/log4j.properties rename to core-java-concurrency-advanced/src/main/java/log4j.properties diff --git a/core-java-concurrency/src/main/resources/logback.xml b/core-java-concurrency-advanced/src/main/resources/logback.xml similarity index 100% rename from core-java-concurrency/src/main/resources/logback.xml rename to core-java-concurrency-advanced/src/main/resources/logback.xml diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/accumulator/LongAccumulatorUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/accumulator/LongAccumulatorUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/accumulator/LongAccumulatorUnitTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/accumulator/LongAccumulatorUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/adder/LongAdderUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/adder/LongAdderUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/adder/LongAdderUnitTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/adder/LongAdderUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterIntegrationTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterIntegrationTest.java similarity index 97% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterIntegrationTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterIntegrationTest.java index 4eead471f8..c3c44b40cf 100644 --- a/core-java-concurrency/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterIntegrationTest.java +++ b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterIntegrationTest.java @@ -1,38 +1,38 @@ -package com.baeldung.concurrent.atomic; - -import static org.junit.Assert.assertEquals; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; -import java.util.stream.IntStream; - -import org.junit.Test; - -public class ThreadSafeCounterIntegrationTest { - - @Test - public void givenMultiThread_whenSafeCounterWithLockIncrement() throws InterruptedException { - ExecutorService service = Executors.newFixedThreadPool(3); - SafeCounterWithLock safeCounter = new SafeCounterWithLock(); - - IntStream.range(0, 1000) - .forEach(count -> service.submit(safeCounter::increment)); - service.awaitTermination(100, TimeUnit.MILLISECONDS); - - assertEquals(1000, safeCounter.getValue()); - } - - @Test - public void givenMultiThread_whenSafeCounterWithoutLockIncrement() throws InterruptedException { - ExecutorService service = Executors.newFixedThreadPool(3); - SafeCounterWithoutLock safeCounter = new SafeCounterWithoutLock(); - - IntStream.range(0, 1000) - .forEach(count -> service.submit(safeCounter::increment)); - service.awaitTermination(100, TimeUnit.MILLISECONDS); - - assertEquals(1000, safeCounter.getValue()); - } - -} +package com.baeldung.concurrent.atomic; + +import static org.junit.Assert.assertEquals; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.stream.IntStream; + +import org.junit.Test; + +public class ThreadSafeCounterIntegrationTest { + + @Test + public void givenMultiThread_whenSafeCounterWithLockIncrement() throws InterruptedException { + ExecutorService service = Executors.newFixedThreadPool(3); + SafeCounterWithLock safeCounter = new SafeCounterWithLock(); + + IntStream.range(0, 1000) + .forEach(count -> service.submit(safeCounter::increment)); + service.awaitTermination(100, TimeUnit.MILLISECONDS); + + assertEquals(1000, safeCounter.getValue()); + } + + @Test + public void givenMultiThread_whenSafeCounterWithoutLockIncrement() throws InterruptedException { + ExecutorService service = Executors.newFixedThreadPool(3); + SafeCounterWithoutLock safeCounter = new SafeCounterWithoutLock(); + + IntStream.range(0, 1000) + .forEach(count -> service.submit(safeCounter::increment)); + service.awaitTermination(100, TimeUnit.MILLISECONDS); + + assertEquals(1000, safeCounter.getValue()); + } + +} diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/atomic/ThreadUnsafeCounterManualTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadUnsafeCounterManualTest.java similarity index 97% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/atomic/ThreadUnsafeCounterManualTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadUnsafeCounterManualTest.java index cc7cc18bb5..bf451e58de 100644 --- a/core-java-concurrency/src/test/java/com/baeldung/concurrent/atomic/ThreadUnsafeCounterManualTest.java +++ b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadUnsafeCounterManualTest.java @@ -1,33 +1,33 @@ -package com.baeldung.concurrent.atomic; - -import static org.junit.Assert.assertEquals; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; -import java.util.stream.IntStream; - -import org.junit.Test; - -/** - * This test shows the behaviour of a thread-unsafe class in a multithreaded scenario. We are calling - * the increment methods 1000 times from a pool of 3 threads. In most of the cases, the counter will - * less than 1000, because of lost updates, however, occasionally it may reach 1000, when no threads - * called the method simultaneously. This may cause the build to fail occasionally. Hence excluding this - * test from build by adding this in manual test - */ -public class ThreadUnsafeCounterManualTest { - - @Test - public void givenMultiThread_whenUnsafeCounterIncrement() throws InterruptedException { - ExecutorService service = Executors.newFixedThreadPool(3); - UnsafeCounter unsafeCounter = new UnsafeCounter(); - - IntStream.range(0, 1000) - .forEach(count -> service.submit(unsafeCounter::increment)); - service.awaitTermination(100, TimeUnit.MILLISECONDS); - - assertEquals(1000, unsafeCounter.getValue()); - } - -} +package com.baeldung.concurrent.atomic; + +import static org.junit.Assert.assertEquals; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.stream.IntStream; + +import org.junit.Test; + +/** + * This test shows the behaviour of a thread-unsafe class in a multithreaded scenario. We are calling + * the increment methods 1000 times from a pool of 3 threads. In most of the cases, the counter will + * less than 1000, because of lost updates, however, occasionally it may reach 1000, when no threads + * called the method simultaneously. This may cause the build to fail occasionally. Hence excluding this + * test from build by adding this in manual test + */ +public class ThreadUnsafeCounterManualTest { + + @Test + public void givenMultiThread_whenUnsafeCounterIncrement() throws InterruptedException { + ExecutorService service = Executors.newFixedThreadPool(3); + UnsafeCounter unsafeCounter = new UnsafeCounter(); + + IntStream.range(0, 1000) + .forEach(count -> service.submit(unsafeCounter::increment)); + service.awaitTermination(100, TimeUnit.MILLISECONDS); + + assertEquals(1000, unsafeCounter.getValue()); + } + +} diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchExampleIntegrationTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchExampleIntegrationTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchExampleIntegrationTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchExampleIntegrationTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadUnitTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/locks/SharedObjectWithLockManualTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/locks/SharedObjectWithLockManualTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/locks/SharedObjectWithLockManualTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/locks/SharedObjectWithLockManualTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/phaser/PhaserUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/phaser/PhaserUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/phaser/PhaserUnitTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/phaser/PhaserUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobSchedulerUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobSchedulerUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobSchedulerUnitTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobSchedulerUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/semaphores/SemaphoresManualTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/semaphores/SemaphoresManualTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/semaphores/SemaphoresManualTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/semaphores/SemaphoresManualTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/volatilekeyword/SharedObjectManualTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/volatilekeyword/SharedObjectManualTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/volatilekeyword/SharedObjectManualTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/volatilekeyword/SharedObjectManualTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/java8/Java8ForkJoinIntegrationTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/java8/Java8ForkJoinIntegrationTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/java8/Java8ForkJoinIntegrationTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/java8/Java8ForkJoinIntegrationTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/parameters/ParameterizedThreadUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/parameters/ParameterizedThreadUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/parameters/ParameterizedThreadUnitTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/parameters/ParameterizedThreadUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/threadlocal/ThreadLocalIntegrationTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/threadlocal/ThreadLocalIntegrationTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/threadlocal/ThreadLocalIntegrationTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/threadlocal/ThreadLocalIntegrationTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/threadpool/CoreThreadPoolIntegrationTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/threadpool/CoreThreadPoolIntegrationTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/threadpool/CoreThreadPoolIntegrationTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/threadpool/CoreThreadPoolIntegrationTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/threadpool/GuavaThreadPoolIntegrationTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/threadpool/GuavaThreadPoolIntegrationTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/threadpool/GuavaThreadPoolIntegrationTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/threadpool/GuavaThreadPoolIntegrationTest.java diff --git a/core-java-concurrency/src/test/resources/.gitignore b/core-java-concurrency-advanced/src/test/resources/.gitignore similarity index 100% rename from core-java-concurrency/src/test/resources/.gitignore rename to core-java-concurrency-advanced/src/test/resources/.gitignore diff --git a/core-java-concurrency-basic/.gitignore b/core-java-concurrency-basic/.gitignore new file mode 100644 index 0000000000..3de4cc647e --- /dev/null +++ b/core-java-concurrency-basic/.gitignore @@ -0,0 +1,26 @@ +*.class + +0.* + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* +.resourceCache + +# Packaged files # +*.jar +*.war +*.ear + +# Files generated by integration tests +*.txt +backup-pom.xml +/bin/ +/temp + +#IntelliJ specific +.idea/ +*.iml \ No newline at end of file diff --git a/core-java-concurrency-basic/README.md b/core-java-concurrency-basic/README.md new file mode 100644 index 0000000000..1c43149d03 --- /dev/null +++ b/core-java-concurrency-basic/README.md @@ -0,0 +1,17 @@ +========= + +## Core Java Concurrency Basic Examples + +### Relevant Articles: +- [Guide To CompletableFuture](http://www.baeldung.com/java-completablefuture) +- [A Guide to the Java ExecutorService](http://www.baeldung.com/java-executor-service-tutorial) +- [Guide to java.util.concurrent.Future](http://www.baeldung.com/java-future) +- [Difference Between Wait and Sleep in Java](http://www.baeldung.com/java-wait-and-sleep) +- [Guide to Synchronized Keyword in Java](http://www.baeldung.com/java-synchronized) +- [Overview of the java.util.concurrent](http://www.baeldung.com/java-util-concurrent) +- [Implementing a Runnable vs Extending a Thread](http://www.baeldung.com/java-runnable-vs-extending-thread) +- [How to Kill a Java Thread](http://www.baeldung.com/java-thread-stop) +- [ExecutorService - Waiting for Threads to Finish](http://www.baeldung.com/java-executor-wait-for-threads) +- [wait and notify() Methods in Java](http://www.baeldung.com/java-wait-notify) +- [Life Cycle of a Thread in Java](http://www.baeldung.com/java-thread-lifecycle) +- [Runnable vs. Callable in Java](http://www.baeldung.com/java-runnable-callable) \ No newline at end of file diff --git a/core-java-concurrency-basic/pom.xml b/core-java-concurrency-basic/pom.xml new file mode 100644 index 0000000000..3544403aca --- /dev/null +++ b/core-java-concurrency-basic/pom.xml @@ -0,0 +1,55 @@ + + 4.0.0 + com.baeldung + core-java-concurrency-basic + 0.1.0-SNAPSHOT + jar + core-java-concurrency-basic + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + org.assertj + assertj-core + ${assertj.version} + test + + + com.jayway.awaitility + awaitility + ${avaitility.version} + test + + + + + core-java-concurrency-basic + + + src/main/resources + true + + + + + + + 3.5 + + 3.6.1 + 1.7.0 + + + diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/callable/FactorialTask.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/callable/FactorialTask.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/callable/FactorialTask.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/callable/FactorialTask.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierExample.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierExample.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierExample.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierExample.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/Task.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/cyclicbarrier/Task.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/Task.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/cyclicbarrier/Task.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/executor/ExecutorDemo.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executor/ExecutorDemo.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/executor/ExecutorDemo.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executor/ExecutorDemo.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/executor/Invoker.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executor/Invoker.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/executor/Invoker.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executor/Invoker.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/ExecutorServiceDemo.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executorservice/ExecutorServiceDemo.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/ExecutorServiceDemo.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executorservice/ExecutorServiceDemo.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/Task.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executorservice/Task.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/Task.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executorservice/Task.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/future/FactorialSquareCalculator.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/future/FactorialSquareCalculator.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/future/FactorialSquareCalculator.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/future/FactorialSquareCalculator.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/future/FutureDemo.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/future/FutureDemo.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/future/FutureDemo.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/future/FutureDemo.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/future/SquareCalculator.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/future/SquareCalculator.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/future/SquareCalculator.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/future/SquareCalculator.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/runnable/EventLoggingTask.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/runnable/EventLoggingTask.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/runnable/EventLoggingTask.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/runnable/EventLoggingTask.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/runnable/TaskRunner.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/runnable/TaskRunner.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/runnable/TaskRunner.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/runnable/TaskRunner.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/stopping/ControlSubThread.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/stopping/ControlSubThread.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/stopping/ControlSubThread.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/stopping/ControlSubThread.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadfactory/BaeldungThreadFactory.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadfactory/BaeldungThreadFactory.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/threadfactory/BaeldungThreadFactory.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadfactory/BaeldungThreadFactory.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadfactory/Demo.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadfactory/Demo.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/threadfactory/Demo.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadfactory/Demo.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadfactory/Task.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadfactory/Task.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/threadfactory/Task.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadfactory/Task.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java diff --git a/core-java-concurrency-basic/src/main/resources/logback.xml b/core-java-concurrency-basic/src/main/resources/logback.xml new file mode 100644 index 0000000000..56af2d397e --- /dev/null +++ b/core-java-concurrency-basic/src/main/resources/logback.xml @@ -0,0 +1,19 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core-java-concurrency/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java rename to core-java-concurrency-basic/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/callable/FactorialTaskManualTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/callable/FactorialTaskManualTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/callable/FactorialTaskManualTest.java rename to core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/callable/FactorialTaskManualTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishManualTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishManualTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishManualTest.java rename to core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishManualTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/future/FactorialSquareCalculatorUnitTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/future/FactorialSquareCalculatorUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/future/FactorialSquareCalculatorUnitTest.java rename to core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/future/FactorialSquareCalculatorUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/future/SquareCalculatorIntegrationTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/future/SquareCalculatorIntegrationTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/future/SquareCalculatorIntegrationTest.java rename to core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/future/SquareCalculatorIntegrationTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/runnable/RunnableVsThreadLiveTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/runnable/RunnableVsThreadLiveTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/runnable/RunnableVsThreadLiveTest.java rename to core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/runnable/RunnableVsThreadLiveTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/stopping/StopThreadManualTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/stopping/StopThreadManualTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/stopping/StopThreadManualTest.java rename to core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/stopping/StopThreadManualTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockUnitTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockUnitTest.java rename to core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsUnitTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsUnitTest.java rename to core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java rename to core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/java8/Java8ExecutorServiceIntegrationTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/java8/Java8ExecutorServiceIntegrationTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/java8/Java8ExecutorServiceIntegrationTest.java rename to core-java-concurrency-basic/src/test/java/com/baeldung/java8/Java8ExecutorServiceIntegrationTest.java diff --git a/core-java-concurrency-basic/src/test/resources/.gitignore b/core-java-concurrency-basic/src/test/resources/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/core-java-concurrency-basic/src/test/resources/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/pom.xml b/pom.xml index 51c94458fb..6fc3e7910b 100644 --- a/pom.xml +++ b/pom.xml @@ -379,6 +379,7 @@ core-java-arrays core-java-collections + core-java-concurrency-basic core-java-concurrency-collections core-java-io core-java-lang-syntax @@ -990,7 +991,7 @@ parent-kotlin core-java - core-java-concurrency + core-java-concurrency-advanced core-kotlin jenkins/hello-world @@ -1088,6 +1089,7 @@ core-java-arrays core-java-collections + core-java-concurrency-basic core-java-concurrency-collections core-java-io core-java-lang-syntax @@ -1535,7 +1537,7 @@ parent-kotlin core-java - core-java-concurrency + core-java-concurrency-advanced core-kotlin jenkins/hello-world From 21bde94745d09a128bd3ce612ce3b525e10a0d93 Mon Sep 17 00:00:00 2001 From: kyleandari <44148335+kyleandari@users.noreply.github.com> Date: Tue, 25 Dec 2018 14:58:14 -0500 Subject: [PATCH 184/359] Java Interfaces Examples (#5992) * Implementing Hexagonal Architecture in java * Implementing multi-inheritance and Polymorphism using interfaces * Removing hexagonal code * Deleting hexagonal architecture code * fix for unit test names * Java Interfaces examples --- .../com/baeldung/interfaces/Electronic.java | 22 ++++++++++++++++++ .../com/baeldung/interfaces/Employee.java | 15 ++++++++++++ .../interfaces/EmployeeSalaryComparator.java | 18 +++++++++++++++ .../com/baeldung/interfaces/HasColor.java | 5 ++++ .../com/baeldung/interfaces/Motorcycle.java | 10 ++++++++ .../java/com/baeldung/interfaces/Truck.java | 8 +++++++ .../java/com/baeldung/interfaces/Vehicle.java | 6 +++++ .../interfaces/multiinheritance/Car.java | 13 +++++++++++ .../multiinheritance/Transform.java | 5 ++++ .../interfaces/polymorphysim/Circle.java | 4 ++++ .../polymorphysim/DisplayShape.java | 4 ++++ .../polymorphysim/FunctionalMain.java | 23 +++++++++++++++++++ .../interfaces/polymorphysim/Shape.java | 5 +++- .../interfaces/polymorphysim/Square.java | 5 ++++ 14 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/Electronic.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/Employee.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/HasColor.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/Motorcycle.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/Truck.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/Vehicle.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/FunctionalMain.java diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/Electronic.java b/core-java-8/src/main/java/com/baeldung/interfaces/Electronic.java new file mode 100644 index 0000000000..bfbc381483 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/Electronic.java @@ -0,0 +1,22 @@ +package com.baeldung.interfaces; + +public interface Electronic { + //Constant variable + public static final String LED = "LED"; + + //Abstract method + public int getElectricityUse(); + + // Static method + public static boolean isEnergyEfficient(String electtronicType) { + if (electtronicType.equals(LED)) { + return true; + } + return false; + } + + //Default method + public default void printDescription() { + System.out.println("Electronic Description"); + } +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/Employee.java b/core-java-8/src/main/java/com/baeldung/interfaces/Employee.java new file mode 100644 index 0000000000..903bc81e6f --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/Employee.java @@ -0,0 +1,15 @@ +package com.baeldung.interfaces; + +public class Employee { + + private double salary; + + public double getSalary() { + return salary; + } + + public void setSalary(double salary) { + this.salary = salary; + } + +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java b/core-java-8/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java new file mode 100644 index 0000000000..cfa4226c1a --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java @@ -0,0 +1,18 @@ +package com.baeldung.interfaces; + +import java.util.Comparator; + +public class EmployeeSalaryComparator implements Comparator { + + @Override + public int compare(Employee employeeA, Employee employeeB) { + + if(employeeA.getSalary() < employeeB.getSalary()){ + return -1; + }else if(employeeA.getSalary() > employeeB.getSalary()){ + return 1; + }else{ + return 0; + } + } +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/HasColor.java b/core-java-8/src/main/java/com/baeldung/interfaces/HasColor.java new file mode 100644 index 0000000000..6eface2d47 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/HasColor.java @@ -0,0 +1,5 @@ +package com.baeldung.interfaces; + +public interface HasColor { + public String getColor(); +} \ No newline at end of file diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/Motorcycle.java b/core-java-8/src/main/java/com/baeldung/interfaces/Motorcycle.java new file mode 100644 index 0000000000..6003f476a3 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/Motorcycle.java @@ -0,0 +1,10 @@ +package com.baeldung.interfaces; + +import com.baeldung.interfaces.multiinheritance.Transform; + +public class Motorcycle implements Transform { + @Override + public void transform() { + // Implementation + } +} \ No newline at end of file diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/Truck.java b/core-java-8/src/main/java/com/baeldung/interfaces/Truck.java new file mode 100644 index 0000000000..d78de23371 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/Truck.java @@ -0,0 +1,8 @@ +package com.baeldung.interfaces; + +public class Truck extends Vehicle { + @Override + public void transform() { + // implementation + } +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/Vehicle.java b/core-java-8/src/main/java/com/baeldung/interfaces/Vehicle.java new file mode 100644 index 0000000000..8b4662e1a3 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/Vehicle.java @@ -0,0 +1,6 @@ +package com.baeldung.interfaces; + +import com.baeldung.interfaces.multiinheritance.Transform; + +public abstract class Vehicle implements Transform { +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java b/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java new file mode 100644 index 0000000000..b951fc0273 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java @@ -0,0 +1,13 @@ +package com.baeldung.interfaces.multiinheritance; + +public class Car implements Fly, Transform { + @Override + public void fly() { + System.out.println("I can Fly!!"); + } + + @Override + public void transform() { + System.out.println("I can Transform!!"); + } +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java b/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java index a18bbafdc1..8bdba43a05 100644 --- a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java +++ b/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java @@ -1,5 +1,10 @@ package com.baeldung.interfaces.multiinheritance; public interface Transform { + void transform(); + + default void printSpecs(){ + System.out.println("Transform Specification"); + } } diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java index bf0e613567..afb3142d96 100644 --- a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java +++ b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java @@ -18,4 +18,8 @@ public class Circle implements Shape { return Math.PI * (radius * radius); } + @Override + public String getColor() { + return "green"; + } } diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/DisplayShape.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/DisplayShape.java index 2cf4fafee1..d9c9dd107a 100644 --- a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/DisplayShape.java +++ b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/DisplayShape.java @@ -6,6 +6,10 @@ public class DisplayShape { private ArrayList shapes; + public ArrayList getShapes() { + return shapes; + } + public DisplayShape() { shapes = new ArrayList<>(); } diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/FunctionalMain.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/FunctionalMain.java new file mode 100644 index 0000000000..5316dd7db7 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/FunctionalMain.java @@ -0,0 +1,23 @@ +package com.baeldung.interfaces.polymorphysim; + +import java.util.function.Predicate; + +public class FunctionalMain { + +public static void main(String[] args) { + Shape circleShape = new Circle(2); + Shape squareShape = new Square(2); + + DisplayShape DisplayShape = new DisplayShape(); + DisplayShape.add(circleShape); + DisplayShape.add(squareShape); + + Predicate checkArea = (shape) -> shape.area() < 5; + + for (Shape shape : DisplayShape.getShapes()) { + if (checkArea.test(shape)) { + System.out.println(shape.name() + " " + shape.area()); + } + } +} +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java index fcb0c65e7b..560e07a80a 100644 --- a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java +++ b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java @@ -1,6 +1,9 @@ package com.baeldung.interfaces.polymorphysim; -public interface Shape { +import com.baeldung.interfaces.HasColor; + +public interface Shape extends HasColor { + public abstract String name(); public abstract double area(); } diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java index 9c440150b5..00b75ace20 100644 --- a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java +++ b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java @@ -17,4 +17,9 @@ public class Square implements Shape { public double area() { return width * width; } + + @Override + public String getColor() { + return "red"; + } } From 0a0701c947c5aad67d70742f308591e74b8f5055 Mon Sep 17 00:00:00 2001 From: Loredana Date: Wed, 26 Dec 2018 20:42:28 +0200 Subject: [PATCH 185/359] new module core-java-perf --- core-java-perf/README.md | 3 ++ core-java-perf/pom.xml | 33 +++++++++++++++++++ .../gc/VerboseGarbageCollectorRunner.java | 0 pom.xml | 4 ++- 4 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 core-java-perf/README.md create mode 100644 core-java-perf/pom.xml rename {core-java => core-java-perf}/src/main/java/com/baeldung/gc/VerboseGarbageCollectorRunner.java (100%) diff --git a/core-java-perf/README.md b/core-java-perf/README.md new file mode 100644 index 0000000000..bd76388310 --- /dev/null +++ b/core-java-perf/README.md @@ -0,0 +1,3 @@ +## Core Java Performance + +### Relevant Articles: diff --git a/core-java-perf/pom.xml b/core-java-perf/pom.xml new file mode 100644 index 0000000000..062f76db77 --- /dev/null +++ b/core-java-perf/pom.xml @@ -0,0 +1,33 @@ + + 4.0.0 + com.baeldung + core-java-perf + 0.1.0-SNAPSHOT + jar + core-java-perf + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + + + + + 3.8.1 + + + + diff --git a/core-java/src/main/java/com/baeldung/gc/VerboseGarbageCollectorRunner.java b/core-java-perf/src/main/java/com/baeldung/gc/VerboseGarbageCollectorRunner.java similarity index 100% rename from core-java/src/main/java/com/baeldung/gc/VerboseGarbageCollectorRunner.java rename to core-java-perf/src/main/java/com/baeldung/gc/VerboseGarbageCollectorRunner.java diff --git a/pom.xml b/pom.xml index 51c94458fb..a4588bf546 100644 --- a/pom.xml +++ b/pom.xml @@ -384,7 +384,8 @@ core-java-lang-syntax core-java-lang core-java-lang-oop - core-java-networking + core-java-networking + core-java-perf core-java-sun core-scala couchbase @@ -1094,6 +1095,7 @@ core-java-lang core-java-lang-oop core-java-networking + core-java-perf core-java-sun core-scala couchbase From a5cf9e4343a8f909a20c8a3036a96c3477cd7d32 Mon Sep 17 00:00:00 2001 From: greg Date: Thu, 27 Dec 2018 04:46:39 +0100 Subject: [PATCH 186/359] BAEL-2438 Difference between HashMap and HashTable (#5931) * BAEL-2368 convert string array to string * BAEL-2368 Convert array to string code * BAEL-2368 Change package * Fix for test * BAEL-2438 Difference between HashMap and HashTable --- .../HashmapVsHashtableDifferenceUnitTest.java | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 core-java-collections/src/test/java/com/baeldung/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java b/core-java-collections/src/test/java/com/baeldung/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java new file mode 100644 index 0000000000..5218332d60 --- /dev/null +++ b/core-java-collections/src/test/java/com/baeldung/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java @@ -0,0 +1,98 @@ +package com.baeldung.hashmapvshashtable; + +import static org.junit.Assert.assertEquals; + +import java.util.Collections; +import java.util.ConcurrentModificationException; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.junit.Test; + +import com.google.common.collect.Lists; + +public class HashmapVsHashtableDifferenceUnitTest { + + // null values + @Test(expected = NullPointerException.class) + public void givenHashtable_whenAddNullKey_thenNullPointerExceptionThrown() { + Hashtable table = new Hashtable(); + table.put(null, "value"); + } + + @Test(expected = NullPointerException.class) + public void givenHashtable_whenAddNullValue_thenNullPointerExceptionThrown() { + Hashtable table = new Hashtable(); + table.put("key", null); + } + + @Test + public void givenHashmap_whenAddNullKeyAndValue_thenObjectAdded() { + HashMap map = new HashMap(); + map.put(null, "value"); + map.put("key1", null); + map.put("key2", null); + + assertEquals(3, map.size()); + } + + // fail-fast iterator + @Test(expected = ConcurrentModificationException.class) + public void givenHashmap_whenModifyUnderlyingCollection_thenConcurrentModificationExceptionThrown() { + HashMap map = new HashMap(); + map.put("key1", "value1"); + map.put("key2", "value2"); + map.put("key3", "value3"); + + Iterator iterator = map.keySet().iterator(); + while(iterator.hasNext()){ + iterator.next(); + map.put("key4", "value4"); + } + } + + @Test + public void givenHashtable_whenModifyUnderlyingCollection_thenItHasNoEffectOnIteratedCollection() { + Hashtable table = new Hashtable(); + table.put("key1", "value1"); + table.put("key2", "value2"); + + List keysSelected = Lists.newArrayList(); + Enumeration keys = table.keys(); + while (keys.hasMoreElements()) { + String key = keys.nextElement(); + keysSelected.add(key); + + if (key.equals("key1")) { + table.put("key3", "value3"); + } + } + + assertEquals(2, keysSelected.size()); + } + + // synchronized map + @Test + public void givenHashmap_thenCreateSynchronizedMap() { + HashMap map = new HashMap(); + map.put("key1", "value1"); + map.put("key2", "value2"); + map.put("key3", "value3"); + + Set> set = map.entrySet(); + synchronized (map) { + Iterator> it = set.iterator(); + while(it.hasNext()) { + Map.Entry elem = (Map.Entry)it.next(); + } + } + + Map syncMap = Collections.synchronizedMap(map); + } +} From 2279246a426c9d35618ce2a1dc2f26b724922060 Mon Sep 17 00:00:00 2001 From: Steven van Beelen Date: Thu, 27 Dec 2018 09:39:40 +0100 Subject: [PATCH 187/359] BAEL-2435 Switch domain around Change the domain from 'Messages' to 'Order' as that domain is better suited for an example project like this. First, update the commands and events, adding an extra command/event to flesh out the domain some what --- .../coreapi/commands/ConfirmOrderCommand.java | 36 ++++++++++++++++ .../commands/CreateMessageCommand.java | 42 ------------------ .../commands/MarkReadMessageCommand.java | 36 ---------------- .../coreapi/commands/PlaceOrderCommand.java | 43 +++++++++++++++++++ .../coreapi/commands/ShipOrderCommand.java | 36 ++++++++++++++++ .../coreapi/events/MessageCreatedEvent.java | 39 ----------------- .../axon/coreapi/events/MessageReadEvent.java | 33 -------------- .../coreapi/events/OrderConfirmedEvent.java | 33 ++++++++++++++ .../axon/coreapi/events/OrderPlacedEvent.java | 40 +++++++++++++++++ .../coreapi/events/OrderShippedEvent.java | 33 ++++++++++++++ 10 files changed, 221 insertions(+), 150 deletions(-) create mode 100644 axon/src/main/java/com/baeldung/axon/coreapi/commands/ConfirmOrderCommand.java delete mode 100644 axon/src/main/java/com/baeldung/axon/coreapi/commands/CreateMessageCommand.java delete mode 100644 axon/src/main/java/com/baeldung/axon/coreapi/commands/MarkReadMessageCommand.java create mode 100644 axon/src/main/java/com/baeldung/axon/coreapi/commands/PlaceOrderCommand.java create mode 100644 axon/src/main/java/com/baeldung/axon/coreapi/commands/ShipOrderCommand.java delete mode 100644 axon/src/main/java/com/baeldung/axon/coreapi/events/MessageCreatedEvent.java delete mode 100644 axon/src/main/java/com/baeldung/axon/coreapi/events/MessageReadEvent.java create mode 100644 axon/src/main/java/com/baeldung/axon/coreapi/events/OrderConfirmedEvent.java create mode 100644 axon/src/main/java/com/baeldung/axon/coreapi/events/OrderPlacedEvent.java create mode 100644 axon/src/main/java/com/baeldung/axon/coreapi/events/OrderShippedEvent.java diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/commands/ConfirmOrderCommand.java b/axon/src/main/java/com/baeldung/axon/coreapi/commands/ConfirmOrderCommand.java new file mode 100644 index 0000000000..ba04343af1 --- /dev/null +++ b/axon/src/main/java/com/baeldung/axon/coreapi/commands/ConfirmOrderCommand.java @@ -0,0 +1,36 @@ +package com.baeldung.axon.coreapi.commands; + +import org.axonframework.modelling.command.TargetAggregateIdentifier; + +import java.util.Objects; + +public class ConfirmOrderCommand { + + @TargetAggregateIdentifier + private final String orderId; + + public ConfirmOrderCommand(String orderId) { + this.orderId = orderId; + } + + public String getOrderId() { + return orderId; + } + + @Override + public int hashCode() { + return Objects.hash(orderId); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + final ConfirmOrderCommand other = (ConfirmOrderCommand) obj; + return Objects.equals(this.orderId, other.orderId); + } +} diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/commands/CreateMessageCommand.java b/axon/src/main/java/com/baeldung/axon/coreapi/commands/CreateMessageCommand.java deleted file mode 100644 index fd03d6b269..0000000000 --- a/axon/src/main/java/com/baeldung/axon/coreapi/commands/CreateMessageCommand.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.baeldung.axon.coreapi.commands; - -import java.util.Objects; - -import org.axonframework.modelling.command.TargetAggregateIdentifier; - -public class CreateMessageCommand { - - @TargetAggregateIdentifier - private final String id; - private final String text; - - public CreateMessageCommand(String id, String text) { - this.id = id; - this.text = text; - } - - public String getId() { - return id; - } - - public String getText() { - return text; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - CreateMessageCommand that = (CreateMessageCommand) o; - return Objects.equals(id, that.id) && Objects.equals(text, that.text); - } - - @Override - public int hashCode() { - return Objects.hash(id, text); - } -} \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/commands/MarkReadMessageCommand.java b/axon/src/main/java/com/baeldung/axon/coreapi/commands/MarkReadMessageCommand.java deleted file mode 100644 index ec68a380f8..0000000000 --- a/axon/src/main/java/com/baeldung/axon/coreapi/commands/MarkReadMessageCommand.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.baeldung.axon.coreapi.commands; - -import java.util.Objects; - -import org.axonframework.modelling.command.TargetAggregateIdentifier; - -public class MarkReadMessageCommand { - - @TargetAggregateIdentifier - private final String id; - - public MarkReadMessageCommand(String id) { - this.id = id; - } - - public String getId() { - return id; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - MarkReadMessageCommand that = (MarkReadMessageCommand) o; - return Objects.equals(id, that.id); - } - - @Override - public int hashCode() { - return Objects.hash(id); - } -} \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/commands/PlaceOrderCommand.java b/axon/src/main/java/com/baeldung/axon/coreapi/commands/PlaceOrderCommand.java new file mode 100644 index 0000000000..cde2d7f1ae --- /dev/null +++ b/axon/src/main/java/com/baeldung/axon/coreapi/commands/PlaceOrderCommand.java @@ -0,0 +1,43 @@ +package com.baeldung.axon.coreapi.commands; + +import java.util.Objects; + +import org.axonframework.modelling.command.TargetAggregateIdentifier; + +public class PlaceOrderCommand { + + @TargetAggregateIdentifier + private final String orderId; + private final String product; + + public PlaceOrderCommand(String orderId, String product) { + this.orderId = orderId; + this.product = product; + } + + public String getOrderId() { + return orderId; + } + + public String getProduct() { + return product; + } + + @Override + public int hashCode() { + return Objects.hash(orderId, product); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + final PlaceOrderCommand other = (PlaceOrderCommand) obj; + return Objects.equals(this.orderId, other.orderId) + && Objects.equals(this.product, other.product); + } +} \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/commands/ShipOrderCommand.java b/axon/src/main/java/com/baeldung/axon/coreapi/commands/ShipOrderCommand.java new file mode 100644 index 0000000000..75469533b9 --- /dev/null +++ b/axon/src/main/java/com/baeldung/axon/coreapi/commands/ShipOrderCommand.java @@ -0,0 +1,36 @@ +package com.baeldung.axon.coreapi.commands; + +import java.util.Objects; + +import org.axonframework.modelling.command.TargetAggregateIdentifier; + +public class ShipOrderCommand { + + @TargetAggregateIdentifier + private final String orderId; + + public ShipOrderCommand(String orderId) { + this.orderId = orderId; + } + + public String getOrderId() { + return orderId; + } + + @Override + public int hashCode() { + return Objects.hash(orderId); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + final ShipOrderCommand other = (ShipOrderCommand) obj; + return Objects.equals(this.orderId, other.orderId); + } +} \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/events/MessageCreatedEvent.java b/axon/src/main/java/com/baeldung/axon/coreapi/events/MessageCreatedEvent.java deleted file mode 100644 index debf383771..0000000000 --- a/axon/src/main/java/com/baeldung/axon/coreapi/events/MessageCreatedEvent.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.baeldung.axon.coreapi.events; - -import java.util.Objects; - -public class MessageCreatedEvent { - - private final String id; - private final String text; - - public MessageCreatedEvent(String id, String text) { - this.id = id; - this.text = text; - } - - public String getId() { - return id; - } - - public String getText() { - return text; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - MessageCreatedEvent that = (MessageCreatedEvent) o; - return Objects.equals(id, that.id) && Objects.equals(text, that.text); - } - - @Override - public int hashCode() { - return Objects.hash(id, text); - } -} \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/events/MessageReadEvent.java b/axon/src/main/java/com/baeldung/axon/coreapi/events/MessageReadEvent.java deleted file mode 100644 index f90bfb054e..0000000000 --- a/axon/src/main/java/com/baeldung/axon/coreapi/events/MessageReadEvent.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.baeldung.axon.coreapi.events; - -import java.util.Objects; - -public class MessageReadEvent { - - private final String id; - - public MessageReadEvent(String id) { - this.id = id; - } - - public String getId() { - return id; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - MessageReadEvent that = (MessageReadEvent) o; - return Objects.equals(id, that.id); - } - - @Override - public int hashCode() { - return Objects.hash(id); - } -} \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderConfirmedEvent.java b/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderConfirmedEvent.java new file mode 100644 index 0000000000..1706b08023 --- /dev/null +++ b/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderConfirmedEvent.java @@ -0,0 +1,33 @@ +package com.baeldung.axon.coreapi.events; + +import java.util.Objects; + +public class OrderConfirmedEvent { + + private final String orderId; + + public OrderConfirmedEvent(String orderId) { + this.orderId = orderId; + } + + public String getOrderId() { + return orderId; + } + + @Override + public int hashCode() { + return Objects.hash(orderId); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + final OrderConfirmedEvent other = (OrderConfirmedEvent) obj; + return Objects.equals(this.orderId, other.orderId); + } +} diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderPlacedEvent.java b/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderPlacedEvent.java new file mode 100644 index 0000000000..8d5364f4c6 --- /dev/null +++ b/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderPlacedEvent.java @@ -0,0 +1,40 @@ +package com.baeldung.axon.coreapi.events; + +import java.util.Objects; + +public class OrderPlacedEvent { + + private final String orderId; + private final String product; + + public OrderPlacedEvent(String orderId, String product) { + this.orderId = orderId; + this.product = product; + } + + public String getOrderId() { + return orderId; + } + + public String getProduct() { + return product; + } + + @Override + public int hashCode() { + return Objects.hash(orderId, product); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + final OrderPlacedEvent other = (OrderPlacedEvent) obj; + return Objects.equals(this.orderId, other.orderId) + && Objects.equals(this.product, other.product); + } +} \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderShippedEvent.java b/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderShippedEvent.java new file mode 100644 index 0000000000..5abcd09a3c --- /dev/null +++ b/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderShippedEvent.java @@ -0,0 +1,33 @@ +package com.baeldung.axon.coreapi.events; + +import java.util.Objects; + +public class OrderShippedEvent { + + private final String orderId; + + public OrderShippedEvent(String orderId) { + this.orderId = orderId; + } + + public String getOrderId() { + return orderId; + } + + @Override + public int hashCode() { + return Objects.hash(orderId); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + final OrderShippedEvent other = (OrderShippedEvent) obj; + return Objects.equals(this.orderId, other.orderId); + } +} \ No newline at end of file From 5dd6d520254050e3378cbc06c46f1985467a8557 Mon Sep 17 00:00:00 2001 From: mherbaghinyan Date: Thu, 27 Dec 2018 12:48:51 +0400 Subject: [PATCH 188/359] Vector class more tests --- .../com/baeldung/performance/ArrayListBenchmark.java | 10 ++++++++++ 1 file changed, 10 insertions(+) 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 index 5c3f7531e3..1eeb17df87 100644 --- a/core-java-collections/src/main/java/com/baeldung/performance/ArrayListBenchmark.java +++ b/core-java-collections/src/main/java/com/baeldung/performance/ArrayListBenchmark.java @@ -49,6 +49,11 @@ public class ArrayListBenchmark { return state.employeeList.contains(state.employee); } + @Benchmark + public boolean testContainsVector(ArrayListBenchmark.MyState state) { + return state.employeeVector.contains(state.employee); + } + @Benchmark public int testIndexOf(ArrayListBenchmark.MyState state) { return state.employeeList.indexOf(state.employee); @@ -73,6 +78,11 @@ public class ArrayListBenchmark { state.employeeList.add(new Employee(state.iterations + 1, "John")); } + @Benchmark + public void testAddVector(ArrayListBenchmark.MyState state) { + state.employeeVector.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) From bd0a1efe707ba65b04f21a21f621110b7769ab0a Mon Sep 17 00:00:00 2001 From: Steven van Beelen Date: Thu, 27 Dec 2018 09:51:08 +0100 Subject: [PATCH 189/359] BAEL-2435 Switch domain around Change the domain from 'Messages' to 'Order' as that domain is better suited for an example project like this. To that end the MessagesAggregate should be replaced by an OrderAggregate. Additionally, add some decision making logic which denies the shipping of an order if it hasn't been confirmed yet. Adjust and update thee unit test accordingly --- .../axon/commandmodel/MessagesAggregate.java | 38 ------------ .../axon/commandmodel/OrderAggregate.java | 58 +++++++++++++++++++ .../MessagesAggregateUnitTest.java | 40 ------------- .../commandmodel/OrderAggregateUnitTest.java | 48 +++++++++++++++ 4 files changed, 106 insertions(+), 78 deletions(-) delete mode 100644 axon/src/main/java/com/baeldung/axon/commandmodel/MessagesAggregate.java create mode 100644 axon/src/main/java/com/baeldung/axon/commandmodel/OrderAggregate.java delete mode 100644 axon/src/test/java/com/baeldung/axon/commandmodel/MessagesAggregateUnitTest.java create mode 100644 axon/src/test/java/com/baeldung/axon/commandmodel/OrderAggregateUnitTest.java diff --git a/axon/src/main/java/com/baeldung/axon/commandmodel/MessagesAggregate.java b/axon/src/main/java/com/baeldung/axon/commandmodel/MessagesAggregate.java deleted file mode 100644 index 1ab9501617..0000000000 --- a/axon/src/main/java/com/baeldung/axon/commandmodel/MessagesAggregate.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.baeldung.axon.commandmodel; - -import static org.axonframework.modelling.command.AggregateLifecycle.apply; - -import org.axonframework.commandhandling.CommandHandler; -import org.axonframework.eventsourcing.EventSourcingHandler; -import org.axonframework.modelling.command.AggregateIdentifier; -import org.axonframework.spring.stereotype.Aggregate; - -import com.baeldung.axon.coreapi.commands.CreateMessageCommand; -import com.baeldung.axon.coreapi.commands.MarkReadMessageCommand; -import com.baeldung.axon.coreapi.events.MessageCreatedEvent; -import com.baeldung.axon.coreapi.events.MessageReadEvent; - -@Aggregate -public class MessagesAggregate { - - @AggregateIdentifier - private String id; - - public MessagesAggregate() { - } - - @CommandHandler - public MessagesAggregate(CreateMessageCommand command) { - apply(new MessageCreatedEvent(command.getId(), command.getText())); - } - - @CommandHandler - public void handle(MarkReadMessageCommand command) { - apply(new MessageReadEvent(id)); - } - - @EventSourcingHandler - public void on(MessageCreatedEvent event) { - this.id = event.getId(); - } -} \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/commandmodel/OrderAggregate.java b/axon/src/main/java/com/baeldung/axon/commandmodel/OrderAggregate.java new file mode 100644 index 0000000000..fd4f901032 --- /dev/null +++ b/axon/src/main/java/com/baeldung/axon/commandmodel/OrderAggregate.java @@ -0,0 +1,58 @@ +package com.baeldung.axon.commandmodel; + +import static org.axonframework.modelling.command.AggregateLifecycle.apply; + +import org.axonframework.commandhandling.CommandHandler; +import org.axonframework.eventsourcing.EventSourcingHandler; +import org.axonframework.modelling.command.AggregateIdentifier; +import org.axonframework.spring.stereotype.Aggregate; + +import com.baeldung.axon.coreapi.commands.ConfirmOrderCommand; +import com.baeldung.axon.coreapi.commands.PlaceOrderCommand; +import com.baeldung.axon.coreapi.commands.ShipOrderCommand; +import com.baeldung.axon.coreapi.events.OrderConfirmedEvent; +import com.baeldung.axon.coreapi.events.OrderPlacedEvent; +import com.baeldung.axon.coreapi.events.OrderShippedEvent; + +@Aggregate +public class OrderAggregate { + + @AggregateIdentifier + private String orderId; + private boolean orderConfirmed; + + @CommandHandler + public OrderAggregate(PlaceOrderCommand command) { + apply(new OrderPlacedEvent(command.getOrderId(), command.getProduct())); + } + + @CommandHandler + public void handle(ConfirmOrderCommand command) { + apply(new OrderConfirmedEvent(orderId)); + } + + @CommandHandler + public void handle(ShipOrderCommand command) { + if (!orderConfirmed) { + throw new IllegalStateException("Cannot ship an order which has not ben confirmed yet."); + } + + apply(new OrderShippedEvent(orderId)); + } + + @EventSourcingHandler + public void on(OrderPlacedEvent event) { + this.orderId = event.getOrderId(); + orderConfirmed = false; + } + + @EventSourcingHandler + public void on(OrderConfirmedEvent event) { + orderConfirmed = true; + } + + protected OrderAggregate() { + // Required by Axon to build a default Aggregate prior to Event Sourcing + } + +} \ No newline at end of file diff --git a/axon/src/test/java/com/baeldung/axon/commandmodel/MessagesAggregateUnitTest.java b/axon/src/test/java/com/baeldung/axon/commandmodel/MessagesAggregateUnitTest.java deleted file mode 100644 index 46357ddff8..0000000000 --- a/axon/src/test/java/com/baeldung/axon/commandmodel/MessagesAggregateUnitTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.baeldung.axon.commandmodel; - -import java.util.UUID; - -import org.axonframework.test.aggregate.AggregateTestFixture; -import org.axonframework.test.aggregate.FixtureConfiguration; -import org.junit.*; - -import com.baeldung.axon.coreapi.commands.CreateMessageCommand; -import com.baeldung.axon.coreapi.commands.MarkReadMessageCommand; -import com.baeldung.axon.coreapi.events.MessageCreatedEvent; -import com.baeldung.axon.coreapi.events.MessageReadEvent; - -public class MessagesAggregateUnitTest { - - private FixtureConfiguration fixture; - - @Before - public void setUp() { - fixture = new AggregateTestFixture<>(MessagesAggregate.class); - } - - @Test - public void giveAggregateRoot_whenCreateMessageCommand_thenShouldProduceMessageCreatedEvent() { - String eventText = "Hello, how is your day?"; - String id = UUID.randomUUID().toString(); - fixture.given() - .when(new CreateMessageCommand(id, eventText)) - .expectEvents(new MessageCreatedEvent(id, eventText)); - } - - @Test - public void givenMessageCreatedEvent_whenReadMessageCommand_thenShouldProduceMessageReadEvent() { - String id = UUID.randomUUID().toString(); - - fixture.given(new MessageCreatedEvent(id, "Hello :-)")) - .when(new MarkReadMessageCommand(id)) - .expectEvents(new MessageReadEvent(id)); - } -} \ No newline at end of file diff --git a/axon/src/test/java/com/baeldung/axon/commandmodel/OrderAggregateUnitTest.java b/axon/src/test/java/com/baeldung/axon/commandmodel/OrderAggregateUnitTest.java new file mode 100644 index 0000000000..e7dfdeb794 --- /dev/null +++ b/axon/src/test/java/com/baeldung/axon/commandmodel/OrderAggregateUnitTest.java @@ -0,0 +1,48 @@ +package com.baeldung.axon.commandmodel; + +import java.util.UUID; + +import org.axonframework.test.aggregate.AggregateTestFixture; +import org.axonframework.test.aggregate.FixtureConfiguration; +import org.junit.*; + +import com.baeldung.axon.coreapi.commands.PlaceOrderCommand; +import com.baeldung.axon.coreapi.commands.ShipOrderCommand; +import com.baeldung.axon.coreapi.events.OrderConfirmedEvent; +import com.baeldung.axon.coreapi.events.OrderPlacedEvent; +import com.baeldung.axon.coreapi.events.OrderShippedEvent; + +public class OrderAggregateUnitTest { + + private static final String ORDER_ID = UUID.randomUUID().toString(); + private static final String DEFAULT_PRODUCT = "Deluxe Chair"; + + private FixtureConfiguration fixture; + + @Before + public void setUp() { + fixture = new AggregateTestFixture<>(OrderAggregate.class); + } + + @Test + public void giveNoPriorActivity_whenPlaceOrderCommand_thenShouldPublishOrderPlacedEvent() { + fixture.givenNoPriorActivity() + .when(new PlaceOrderCommand(ORDER_ID, DEFAULT_PRODUCT)) + .expectEvents(new OrderPlacedEvent(ORDER_ID, DEFAULT_PRODUCT)); + } + + @Test + public void givenOrderPlacedEvent_whenShipOrderCommand_thenShouldThrowIllegalStateException() { + fixture.given(new OrderPlacedEvent(ORDER_ID, DEFAULT_PRODUCT)) + .when(new ShipOrderCommand(ORDER_ID)) + .expectException(IllegalStateException.class); + } + + @Test + public void givenOrderPlacedEventAndOrderConfirmedEvent_whenShipOrderCommand_thenShouldPublishOrderShippedEvent() { + fixture.given(new OrderPlacedEvent(ORDER_ID, DEFAULT_PRODUCT), new OrderConfirmedEvent(ORDER_ID)) + .when(new ShipOrderCommand(ORDER_ID)) + .expectEvents(new OrderShippedEvent(ORDER_ID)); + } + +} \ No newline at end of file From eab6dfe0dd5e29afd990f7b3770242c93d1f3d01 Mon Sep 17 00:00:00 2001 From: Steven van Beelen Date: Thu, 27 Dec 2018 09:55:49 +0100 Subject: [PATCH 190/359] BAEL-2435 Switch domain around Change the domain from 'Messages' to 'Order' as that domain is better suited for an example project like this. Update the endpoint to reflect the order focus i.o. the message focus. Additionally, add a POST endpoint which would return an exception due to the state check in the aggregate --- .../axon/gui/MessagesRestEndpoint.java | 28 ------------- .../baeldung/axon/gui/OrderRestEndpoint.java | 40 +++++++++++++++++++ 2 files changed, 40 insertions(+), 28 deletions(-) delete mode 100644 axon/src/main/java/com/baeldung/axon/gui/MessagesRestEndpoint.java create mode 100644 axon/src/main/java/com/baeldung/axon/gui/OrderRestEndpoint.java diff --git a/axon/src/main/java/com/baeldung/axon/gui/MessagesRestEndpoint.java b/axon/src/main/java/com/baeldung/axon/gui/MessagesRestEndpoint.java deleted file mode 100644 index ddbc3e2fc5..0000000000 --- a/axon/src/main/java/com/baeldung/axon/gui/MessagesRestEndpoint.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.baeldung.axon.gui; - -import java.util.UUID; - -import org.axonframework.commandhandling.gateway.CommandGateway; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.baeldung.axon.coreapi.commands.CreateMessageCommand; -import com.baeldung.axon.coreapi.commands.MarkReadMessageCommand; - -@RestController -public class MessagesRestEndpoint { - - private final CommandGateway commandGateway; - - public MessagesRestEndpoint(CommandGateway commandGateway) { - this.commandGateway = commandGateway; - } - - @PostMapping("/hello") - public void publishMessages() { - final String itemId = UUID.randomUUID().toString(); - commandGateway.send(new CreateMessageCommand(itemId, "Hello, how is your day? :-)")); - commandGateway.send(new MarkReadMessageCommand(itemId)); - } - -} diff --git a/axon/src/main/java/com/baeldung/axon/gui/OrderRestEndpoint.java b/axon/src/main/java/com/baeldung/axon/gui/OrderRestEndpoint.java new file mode 100644 index 0000000000..3c86f9c3b1 --- /dev/null +++ b/axon/src/main/java/com/baeldung/axon/gui/OrderRestEndpoint.java @@ -0,0 +1,40 @@ +package com.baeldung.axon.gui; + +import java.util.UUID; + +import org.axonframework.commandhandling.gateway.CommandGateway; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.axon.coreapi.commands.ConfirmOrderCommand; +import com.baeldung.axon.coreapi.commands.PlaceOrderCommand; +import com.baeldung.axon.coreapi.commands.ShipOrderCommand; + +@RestController +public class OrderRestEndpoint { + + private static final String DEFAULT_PRODUCT = "Deluxe Chair"; + + private final CommandGateway commandGateway; + + public OrderRestEndpoint(CommandGateway commandGateway) { + this.commandGateway = commandGateway; + } + + @PostMapping("/ship-order") + public void shipOrder() { + String orderId = UUID.randomUUID().toString(); + commandGateway.send(new PlaceOrderCommand(orderId, DEFAULT_PRODUCT)); + commandGateway.send(new ConfirmOrderCommand(orderId)); + commandGateway.send(new ShipOrderCommand(orderId)); + } + + @PostMapping("/ship-unconfirmed-order") + public void shipUnconfirmedOrder() { + String orderId = UUID.randomUUID().toString(); + commandGateway.send(new PlaceOrderCommand(orderId, DEFAULT_PRODUCT)); + // This throws an exception, as an Order cannot be shipped if it has not been confirmed yet. + commandGateway.send(new ShipOrderCommand(orderId)); + } + +} From 84b6dc1dbb7badacaed4bbcc5a889ba5a1d5171c Mon Sep 17 00:00:00 2001 From: Steven van Beelen Date: Thu, 27 Dec 2018 10:36:10 +0100 Subject: [PATCH 191/359] BAEL-2435 Switch domain around Change the domain from 'Messages' to 'Order' as that domain is better suited for an example project like this. The Query Model would be better suited to revolve around the OrderedProducts rather than just printing out a line of text. To that end, add a OrderedProduct model with the OrderStatus, which is updated in the (renamed) OrderedProductsEventHandler upon all the events --- .../axon/coreapi/queries/OrderStatus.java | 7 +++ .../axon/coreapi/queries/OrderedProduct.java | 55 +++++++++++++++++++ .../axon/querymodel/MessagesEventHandler.java | 21 ------- .../OrderedProductsEventHandler.java | 42 ++++++++++++++ 4 files changed, 104 insertions(+), 21 deletions(-) create mode 100644 axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderStatus.java create mode 100644 axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderedProduct.java delete mode 100644 axon/src/main/java/com/baeldung/axon/querymodel/MessagesEventHandler.java create mode 100644 axon/src/main/java/com/baeldung/axon/querymodel/OrderedProductsEventHandler.java diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderStatus.java b/axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderStatus.java new file mode 100644 index 0000000000..d215c5fc32 --- /dev/null +++ b/axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderStatus.java @@ -0,0 +1,7 @@ +package com.baeldung.axon.coreapi.queries; + +public enum OrderStatus { + + PLACED, CONFIRMED, SHIPPED + +} diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderedProduct.java b/axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderedProduct.java new file mode 100644 index 0000000000..25096eeb42 --- /dev/null +++ b/axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderedProduct.java @@ -0,0 +1,55 @@ +package com.baeldung.axon.coreapi.queries; + +import java.util.Objects; + +public class OrderedProduct { + + private final String orderId; + private final String product; + private OrderStatus orderStatus; + + public OrderedProduct(String orderId, String product) { + this.orderId = orderId; + this.product = product; + orderStatus = OrderStatus.PLACED; + } + + public String getOrderId() { + return orderId; + } + + public String getProduct() { + return product; + } + + public OrderStatus getOrderStatus() { + return orderStatus; + } + + public void setOrderConfirmed() { + this.orderStatus = OrderStatus.CONFIRMED; + } + + public void setOrderShipped() { + this.orderStatus = OrderStatus.SHIPPED; + } + + @Override + public int hashCode() { + return Objects.hash(orderId, product, orderStatus); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + final OrderedProduct other = (OrderedProduct) obj; + return Objects.equals(this.orderId, other.orderId) + && Objects.equals(this.product, other.product) + && Objects.equals(this.orderStatus, other.orderStatus); + } +} diff --git a/axon/src/main/java/com/baeldung/axon/querymodel/MessagesEventHandler.java b/axon/src/main/java/com/baeldung/axon/querymodel/MessagesEventHandler.java deleted file mode 100644 index 6988d40a53..0000000000 --- a/axon/src/main/java/com/baeldung/axon/querymodel/MessagesEventHandler.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.axon.querymodel; - -import org.axonframework.eventhandling.EventHandler; -import org.springframework.stereotype.Service; - -import com.baeldung.axon.coreapi.events.MessageCreatedEvent; -import com.baeldung.axon.coreapi.events.MessageReadEvent; - -@Service -public class MessagesEventHandler { - - @EventHandler - public void handle(MessageCreatedEvent event) { - System.out.println("Message received: " + event.getText() + " (" + event.getId() + ")"); - } - - @EventHandler - public void handle(MessageReadEvent event) { - System.out.println("Message read: " + event.getId()); - } -} \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/querymodel/OrderedProductsEventHandler.java b/axon/src/main/java/com/baeldung/axon/querymodel/OrderedProductsEventHandler.java new file mode 100644 index 0000000000..7bcdb27af7 --- /dev/null +++ b/axon/src/main/java/com/baeldung/axon/querymodel/OrderedProductsEventHandler.java @@ -0,0 +1,42 @@ +package com.baeldung.axon.querymodel; + +import java.util.HashMap; +import java.util.Map; + +import org.axonframework.eventhandling.EventHandler; +import org.springframework.stereotype.Service; + +import com.baeldung.axon.coreapi.queries.OrderedProduct; +import com.baeldung.axon.coreapi.events.OrderConfirmedEvent; +import com.baeldung.axon.coreapi.events.OrderPlacedEvent; +import com.baeldung.axon.coreapi.events.OrderShippedEvent; + +@Service +public class OrderedProductsEventHandler { + + private final Map orderedProducts = new HashMap<>(); + + @EventHandler + public void on(OrderPlacedEvent event) { + String orderId = event.getOrderId(); + orderedProducts.put(orderId, new OrderedProduct(orderId, event.getProduct())); + + } + + @EventHandler + public void on(OrderShippedEvent event) { + orderedProducts.computeIfPresent(event.getOrderId(), (orderId, orderedProduct) -> { + orderedProduct.setOrderShipped(); + return orderedProduct; + }); + } + + @EventHandler + public void on(OrderConfirmedEvent event) { + orderedProducts.computeIfPresent(event.getOrderId(), (orderId, orderedProduct) -> { + orderedProduct.setOrderConfirmed(); + return orderedProduct; + }); + } + +} \ No newline at end of file From 769af6759ed6dca02d6c8732f2627e11e5f66a48 Mon Sep 17 00:00:00 2001 From: Steven van Beelen Date: Thu, 27 Dec 2018 10:39:42 +0100 Subject: [PATCH 192/359] BAEL-2435 Introduce Query message logic Introduce a FindAllOrderedProductsQuery query message, which is published on the QueryGateway through the OrderRestEndpoint and handled by the OrderedProductsEventHandler --- .../queries/FindAllOrderedProductsQuery.java | 5 +++++ .../com/baeldung/axon/gui/OrderRestEndpoint.java | 16 +++++++++++++++- .../querymodel/OrderedProductsEventHandler.java | 11 ++++++++++- 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 axon/src/main/java/com/baeldung/axon/coreapi/queries/FindAllOrderedProductsQuery.java diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/queries/FindAllOrderedProductsQuery.java b/axon/src/main/java/com/baeldung/axon/coreapi/queries/FindAllOrderedProductsQuery.java new file mode 100644 index 0000000000..9d6ca2cfb2 --- /dev/null +++ b/axon/src/main/java/com/baeldung/axon/coreapi/queries/FindAllOrderedProductsQuery.java @@ -0,0 +1,5 @@ +package com.baeldung.axon.coreapi.queries; + +public class FindAllOrderedProductsQuery { + +} diff --git a/axon/src/main/java/com/baeldung/axon/gui/OrderRestEndpoint.java b/axon/src/main/java/com/baeldung/axon/gui/OrderRestEndpoint.java index 3c86f9c3b1..3b8be0bc46 100644 --- a/axon/src/main/java/com/baeldung/axon/gui/OrderRestEndpoint.java +++ b/axon/src/main/java/com/baeldung/axon/gui/OrderRestEndpoint.java @@ -1,14 +1,20 @@ package com.baeldung.axon.gui; +import java.util.List; import java.util.UUID; import org.axonframework.commandhandling.gateway.CommandGateway; +import org.axonframework.messaging.responsetypes.ResponseTypes; +import org.axonframework.queryhandling.QueryGateway; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import com.baeldung.axon.coreapi.commands.ConfirmOrderCommand; import com.baeldung.axon.coreapi.commands.PlaceOrderCommand; import com.baeldung.axon.coreapi.commands.ShipOrderCommand; +import com.baeldung.axon.coreapi.queries.FindAllOrderedProductsQuery; +import com.baeldung.axon.coreapi.queries.OrderedProduct; @RestController public class OrderRestEndpoint { @@ -16,9 +22,11 @@ public class OrderRestEndpoint { private static final String DEFAULT_PRODUCT = "Deluxe Chair"; private final CommandGateway commandGateway; + private final QueryGateway queryGateway; - public OrderRestEndpoint(CommandGateway commandGateway) { + public OrderRestEndpoint(CommandGateway commandGateway, QueryGateway queryGateway) { this.commandGateway = commandGateway; + this.queryGateway = queryGateway; } @PostMapping("/ship-order") @@ -37,4 +45,10 @@ public class OrderRestEndpoint { commandGateway.send(new ShipOrderCommand(orderId)); } + @GetMapping("/all-orders") + public List findAllOrderedProducts() { + return queryGateway.query(new FindAllOrderedProductsQuery(), ResponseTypes.multipleInstancesOf(OrderedProduct.class)) + .join(); + } + } diff --git a/axon/src/main/java/com/baeldung/axon/querymodel/OrderedProductsEventHandler.java b/axon/src/main/java/com/baeldung/axon/querymodel/OrderedProductsEventHandler.java index 7bcdb27af7..c2bf48614b 100644 --- a/axon/src/main/java/com/baeldung/axon/querymodel/OrderedProductsEventHandler.java +++ b/axon/src/main/java/com/baeldung/axon/querymodel/OrderedProductsEventHandler.java @@ -1,15 +1,19 @@ package com.baeldung.axon.querymodel; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.axonframework.eventhandling.EventHandler; +import org.axonframework.queryhandling.QueryHandler; import org.springframework.stereotype.Service; -import com.baeldung.axon.coreapi.queries.OrderedProduct; import com.baeldung.axon.coreapi.events.OrderConfirmedEvent; import com.baeldung.axon.coreapi.events.OrderPlacedEvent; import com.baeldung.axon.coreapi.events.OrderShippedEvent; +import com.baeldung.axon.coreapi.queries.FindAllOrderedProductsQuery; +import com.baeldung.axon.coreapi.queries.OrderedProduct; @Service public class OrderedProductsEventHandler { @@ -39,4 +43,9 @@ public class OrderedProductsEventHandler { }); } + @QueryHandler + public List handle(FindAllOrderedProductsQuery query) { + return new ArrayList<>(orderedProducts.values()); + } + } \ No newline at end of file From 4c7303c2936706da2aa207eae4b41f0caf8f9d19 Mon Sep 17 00:00:00 2001 From: Steven van Beelen Date: Thu, 27 Dec 2018 10:46:45 +0100 Subject: [PATCH 193/359] BAEL-2435 Rename main file Rename main file from MessagesRunner to OrderApplication --- .../axon/{MessagesRunner.java => OrderApplication.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename axon/src/main/java/com/baeldung/axon/{MessagesRunner.java => OrderApplication.java} (70%) diff --git a/axon/src/main/java/com/baeldung/axon/MessagesRunner.java b/axon/src/main/java/com/baeldung/axon/OrderApplication.java similarity index 70% rename from axon/src/main/java/com/baeldung/axon/MessagesRunner.java rename to axon/src/main/java/com/baeldung/axon/OrderApplication.java index 4f83dd86f0..8f507e141c 100644 --- a/axon/src/main/java/com/baeldung/axon/MessagesRunner.java +++ b/axon/src/main/java/com/baeldung/axon/OrderApplication.java @@ -4,10 +4,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -public class MessagesRunner { +public class OrderApplication { public static void main(String[] args) { - SpringApplication.run(MessagesRunner.class, args); + SpringApplication.run(OrderApplication.class, args); } } \ No newline at end of file From d5ad67a801d96ba707729c0dcb87e331eef5ae28 Mon Sep 17 00:00:00 2001 From: Steven van Beelen Date: Thu, 27 Dec 2018 10:47:22 +0100 Subject: [PATCH 194/359] BAEL-2435 Add http resource Add http resource to try out all the end points when running the application in Intellij --- axon/src/main/resources/order-api.http | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 axon/src/main/resources/order-api.http diff --git a/axon/src/main/resources/order-api.http b/axon/src/main/resources/order-api.http new file mode 100644 index 0000000000..a3c69c72bc --- /dev/null +++ b/axon/src/main/resources/order-api.http @@ -0,0 +1,11 @@ +POST http://localhost:8080/ship-order + +### + +POST http://localhost:8080/ship-unconfirmed-order + +### + +GET http://localhost:8080/all-orders + +### From 67d011540ef655e03faef2a2dc795653c0806fbc Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Thu, 27 Dec 2018 12:35:01 +0200 Subject: [PATCH 195/359] Update README.md --- core-java-perf/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-perf/README.md b/core-java-perf/README.md index bd76388310..6af1c82a0a 100644 --- a/core-java-perf/README.md +++ b/core-java-perf/README.md @@ -1,3 +1,4 @@ ## Core Java Performance ### Relevant Articles: +- [Verbose Garbage Collection in Java](https://www.baeldung.com/java-verbose-gc) From 9e23ea5abee98cd5dfd874bb31619045e35e62fd Mon Sep 17 00:00:00 2001 From: Ganesh Pagade Date: Thu, 27 Dec 2018 17:02:37 +0530 Subject: [PATCH 196/359] simplier asserts --- .../src/test/java/com/baeldung/OuterUnitTest.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java b/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java index 6680a8d518..798736149a 100644 --- a/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java +++ b/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java @@ -1,9 +1,11 @@ package com.baeldung; +import static org.junit.Assert.assertTrue; import static org.hamcrest.CoreMatchers.is; import java.util.Arrays; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; import org.junit.Test; @@ -33,18 +35,13 @@ public class OuterUnitTest { @Test public void whenGetNestMembersForNestedClasses_thenGetAllNestedClasses() { - List nestMembers = Arrays.stream(Outer.Inner.class.getNestMembers()) + Set nestMembers = Arrays.stream(Outer.Inner.class.getNestMembers()) .map(Class::getName) - .collect(Collectors.toList()); + .collect(Collectors.toSet()); is(nestMembers.size()).equals(2); - boolean containsOuter = nestMembers.stream() - .anyMatch("com.baeldung.Outer"::equals); - is(containsOuter).equals(true); - - boolean containsInner = nestMembers.stream() - .anyMatch("com.baeldung.Outer$Inner"::equals); - is(containsInner).equals(true); + assertTrue(nestMembers.contains("com.baeldung.Outer")); + assertTrue(nestMembers.contains("com.baeldung.Outer$Inner")); } } \ No newline at end of file From 6ae59f8f8d36a8a20612fe449a7a33ec683c869b Mon Sep 17 00:00:00 2001 From: Ganesh Pagade Date: Thu, 27 Dec 2018 17:08:34 +0530 Subject: [PATCH 197/359] clean up --- core-java-11/src/test/java/com/baeldung/OuterUnitTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java b/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java index 798736149a..9e6bd72680 100644 --- a/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java +++ b/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java @@ -4,7 +4,6 @@ import static org.junit.Assert.assertTrue; import static org.hamcrest.CoreMatchers.is; import java.util.Arrays; -import java.util.List; import java.util.Set; import java.util.stream.Collectors; import org.junit.Test; From 07f762dfc8838acb09bf53ce1d4bf960d117baf7 Mon Sep 17 00:00:00 2001 From: raghav-jha Date: Fri, 28 Dec 2018 04:22:09 +0530 Subject: [PATCH 198/359] BAEL-2436 * BAEL-2436 Type Safe Criteria Queries Using Hibernate Metamodel * Formattng fixes * Formatting fixes --- persistence-modules/hibernate5/pom.xml | 1 - .../java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java | 1 - 2 files changed, 2 deletions(-) diff --git a/persistence-modules/hibernate5/pom.xml b/persistence-modules/hibernate5/pom.xml index 9bfea14d30..af94025a73 100644 --- a/persistence-modules/hibernate5/pom.xml +++ b/persistence-modules/hibernate5/pom.xml @@ -72,7 +72,6 @@ org.hibernate hibernate-jpamodelgen ${hibernate.version} - provided diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java index 0d11ea1567..35cfe55ba6 100644 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java +++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java @@ -35,7 +35,6 @@ public class HibernateUtil { Metadata metadata = metadataSources.getMetadataBuilder() .applyBasicType(LocalDateStringType.INSTANCE) .build(); - return metadata.getSessionFactoryBuilder().build(); } catch (IOException ex) { throw new ExceptionInInitializerError(ex); From 5cc9a60c591e249d281ef97c55662eb780785f61 Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Fri, 28 Dec 2018 00:05:55 -0600 Subject: [PATCH 199/359] BAEL-2367: update README (#6006) * BAEL-2246: add link back to article * BAEL-2174: rename core-java-net module to core-java-networking * BAEL-2174: add link back to article * BAEL-2363 BAEL-2337 BAEL-1996 BAEL-2277 add links back to articles * BAEL-2367: add link back to article --- java-strings/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/java-strings/README.md b/java-strings/README.md index cbc32d0015..4d735490ce 100644 --- a/java-strings/README.md +++ b/java-strings/README.md @@ -43,3 +43,4 @@ - [Pad a String with Zeros or Spaces in Java](https://www.baeldung.com/java-pad-string) - [Adding a Newline Character to a String in Java](https://www.baeldung.com/java-string-newline) - [Remove or Replace part of a String in Java](https://www.baeldung.com/java-remove-replace-string-part) +- [Replace a Character at a Specific Index in a String in Java](https://www.baeldung.com/java-replace-character-at-index) From 15071b6d49ef751184dbf7fbd033553257a69400 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Fri, 28 Dec 2018 10:44:23 +0200 Subject: [PATCH 200/359] Update README.md --- persistence-modules/hibernate5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/hibernate5/README.md b/persistence-modules/hibernate5/README.md index b6e112b5fc..c066ccb50b 100644 --- a/persistence-modules/hibernate5/README.md +++ b/persistence-modules/hibernate5/README.md @@ -21,3 +21,4 @@ - [Custom Types in Hibernate](https://www.baeldung.com/hibernate-custom-types) - [Criteria API – An Example of IN Expressions](https://www.baeldung.com/jpa-criteria-api-in-expressions) - [Difference Between @JoinColumn and mappedBy](https://www.baeldung.com/jpa-joincolumn-vs-mappedby) +- [Hibernate 5 Bootstrapping API](https://www.baeldung.com/hibernate-5-bootstrapping-api) From 8ce227cce7d92ca7ac1e5e7b0e63b8b41da604a2 Mon Sep 17 00:00:00 2001 From: mherbaghinyan Date: Fri, 28 Dec 2018 16:26:57 +0400 Subject: [PATCH 201/359] immutable sets --- .../com/baeldung/set/UnmodifiableSet.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 core-java-collections/src/main/java/com/baeldung/set/UnmodifiableSet.java diff --git a/core-java-collections/src/main/java/com/baeldung/set/UnmodifiableSet.java b/core-java-collections/src/main/java/com/baeldung/set/UnmodifiableSet.java new file mode 100644 index 0000000000..d821c46a3c --- /dev/null +++ b/core-java-collections/src/main/java/com/baeldung/set/UnmodifiableSet.java @@ -0,0 +1,44 @@ +package com.baeldung.set; + +import com.google.common.collect.ImmutableSet; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +public class UnmodifiableSet { + + public static void main(String[] args) { + + Set set = new HashSet<>(); + set.add("Canada"); + set.add("USA"); + + coreJDK(set); + guavaOf(); + copyOf(set); + setOf(); + } + + private static void setOf() { + Set immutable = Set.of("Canada", "USA"); + System.out.println(immutable); + } + + private static void guavaOf() { + Set immutable = ImmutableSet.of("Canada", "USA"); + System.out.println(immutable); + } + + private static void copyOf(Set set) { + Set immutable = ImmutableSet.copyOf(set); + set.add("Costa Rica"); + System.out.println(immutable); + } + + private static void coreJDK(Set set) { + Set unmodifiableSet = Collections.unmodifiableSet(set); + set.add("Costa Rica"); + System.out.println(unmodifiableSet); + } +} From fb8183d69434b3f3a4b3d2ec311cdbe6a40d98da Mon Sep 17 00:00:00 2001 From: mherbaghinyan Date: Fri, 28 Dec 2018 16:33:41 +0400 Subject: [PATCH 202/359] comment java 9 --- .../src/main/java/com/baeldung/set/UnmodifiableSet.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core-java-collections/src/main/java/com/baeldung/set/UnmodifiableSet.java b/core-java-collections/src/main/java/com/baeldung/set/UnmodifiableSet.java index d821c46a3c..06f477c50a 100644 --- a/core-java-collections/src/main/java/com/baeldung/set/UnmodifiableSet.java +++ b/core-java-collections/src/main/java/com/baeldung/set/UnmodifiableSet.java @@ -17,12 +17,12 @@ public class UnmodifiableSet { coreJDK(set); guavaOf(); copyOf(set); - setOf(); + java9Of(); } - private static void setOf() { - Set immutable = Set.of("Canada", "USA"); - System.out.println(immutable); + private static void java9Of() { + //Set immutable = Set.of("Canada", "USA"); + //System.out.println(immutable); } private static void guavaOf() { From 5aed1b89bbceaa2d91b49675779a72c3d80578ff Mon Sep 17 00:00:00 2001 From: Ali Dehghani Date: Fri, 28 Dec 2018 17:17:13 +0330 Subject: [PATCH 203/359] Added a test for Optional#isEmpty. (#5938) --- .../baeldung/optional/OptionalUnitTest.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 core-java-11/src/test/java/com/baeldung/optional/OptionalUnitTest.java diff --git a/core-java-11/src/test/java/com/baeldung/optional/OptionalUnitTest.java b/core-java-11/src/test/java/com/baeldung/optional/OptionalUnitTest.java new file mode 100644 index 0000000000..281155138d --- /dev/null +++ b/core-java-11/src/test/java/com/baeldung/optional/OptionalUnitTest.java @@ -0,0 +1,23 @@ +package com.baeldung.optional; + +import org.junit.Test; + +import java.util.Optional; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +/** + * Unit tests for {@link Optional} in Java 11. + */ +public class OptionalUnitTest { + + @Test + public void givenAnEmptyOptional_isEmpty_thenBehavesAsExpected() { + Optional opt = Optional.of("Baeldung"); + assertFalse(opt.isEmpty()); + + opt = Optional.ofNullable(null); + assertTrue(opt.isEmpty()); + } +} From 415ecc6421ff449dba0fc09458f2aa896c54af16 Mon Sep 17 00:00:00 2001 From: Loredana Date: Fri, 28 Dec 2018 16:22:03 +0200 Subject: [PATCH 204/359] remove completablefuture --- .../controllers/EthereumRestController.java | 16 +++++------ .../baeldung/web3j/services/Web3Service.java | 28 +++++++++---------- .../services/EthereumContractUnitTest.java | 10 +++---- 3 files changed, 26 insertions(+), 28 deletions(-) diff --git a/ethereum/src/main/java/com/baeldung/web3j/controllers/EthereumRestController.java b/ethereum/src/main/java/com/baeldung/web3j/controllers/EthereumRestController.java index e05517bc79..3238a19ff9 100644 --- a/ethereum/src/main/java/com/baeldung/web3j/controllers/EthereumRestController.java +++ b/ethereum/src/main/java/com/baeldung/web3j/controllers/EthereumRestController.java @@ -32,8 +32,8 @@ public class EthereumRestController { return CompletableFuture.supplyAsync(() -> { try { - CompletableFuture result = web3Service.getBlockNumber(); - responseTransfer.setMessage(result.get().toString()); + EthBlockNumber result = web3Service.getBlockNumber(); + responseTransfer.setMessage(result.toString()); } catch (Exception e) { responseTransfer.setMessage(GENERIC_EXCEPTION); } @@ -51,8 +51,8 @@ public class EthereumRestController { return CompletableFuture.supplyAsync(() -> { try { - CompletableFuture result = web3Service.getEthAccounts(); - responseTransfer.setMessage(result.get().toString()); + EthAccounts result = web3Service.getEthAccounts(); + responseTransfer.setMessage(result.toString()); } catch (Exception e) { responseTransfer.setMessage(GENERIC_EXCEPTION); } @@ -70,8 +70,8 @@ public class EthereumRestController { Instant start = TimeHelper.start(); return CompletableFuture.supplyAsync(() -> { try { - CompletableFuture result = web3Service.getTransactionCount(); - responseTransfer.setMessage(result.get().toString()); + EthGetTransactionCount result = web3Service.getTransactionCount(); + responseTransfer.setMessage(result.toString()); } catch (Exception e) { responseTransfer.setMessage(GENERIC_EXCEPTION); } @@ -88,8 +88,8 @@ public class EthereumRestController { Instant start = TimeHelper.start(); return CompletableFuture.supplyAsync(() -> { try { - CompletableFuture result = web3Service.getEthBalance(); - responseTransfer.setMessage(result.get().toString()); + EthGetBalance result = web3Service.getEthBalance(); + responseTransfer.setMessage(result.toString()); } catch (Exception e) { responseTransfer.setMessage(GENERIC_EXCEPTION); } diff --git a/ethereum/src/main/java/com/baeldung/web3j/services/Web3Service.java b/ethereum/src/main/java/com/baeldung/web3j/services/Web3Service.java index c943ee4006..4b7d01e52b 100644 --- a/ethereum/src/main/java/com/baeldung/web3j/services/Web3Service.java +++ b/ethereum/src/main/java/com/baeldung/web3j/services/Web3Service.java @@ -47,47 +47,47 @@ public class Web3Service { return "0x" + binary; } - public CompletableFuture getBlockNumber() { + public EthBlockNumber getBlockNumber() { EthBlockNumber result = new EthBlockNumber(); try { result = this.web3j.ethBlockNumber().sendAsync().get(); } catch (Exception ex) { System.out.println(GENERIC_EXCEPTION); } - return CompletableFuture.completedFuture(result); + return result; } - public CompletableFuture getEthAccounts() { + public EthAccounts getEthAccounts() { EthAccounts result = new EthAccounts(); try { result = this.web3j.ethAccounts().sendAsync().get(); } catch (Exception ex) { System.out.println(GENERIC_EXCEPTION); } - return CompletableFuture.completedFuture(result); + return result; } - public CompletableFuture getTransactionCount() { + public EthGetTransactionCount getTransactionCount() { EthGetTransactionCount result = new EthGetTransactionCount(); try { result = this.web3j.ethGetTransactionCount(DEFAULT_ADDRESS, DefaultBlockParameter.valueOf("latest")).sendAsync().get(); } catch (Exception ex) { System.out.println(GENERIC_EXCEPTION); } - return CompletableFuture.completedFuture(result); + return result; } - public CompletableFuture getEthBalance() { + public EthGetBalance getEthBalance() { EthGetBalance result = new EthGetBalance(); try { result = this.web3j.ethGetBalance(DEFAULT_ADDRESS, DefaultBlockParameter.valueOf("latest")).sendAsync().get(); } catch (Exception ex) { System.out.println(GENERIC_EXCEPTION); } - return CompletableFuture.completedFuture(result); + return result; } - public CompletableFuture fromScratchContractExample() { + public String fromScratchContractExample() { String contractAddress = ""; @@ -108,13 +108,13 @@ public class Web3Service { } catch (Exception ex) { System.out.println(PLEASE_SUPPLY_REAL_DATA); - return CompletableFuture.completedFuture(PLEASE_SUPPLY_REAL_DATA); + return PLEASE_SUPPLY_REAL_DATA; } - return CompletableFuture.completedFuture(contractAddress); + return contractAddress; } @Async - public CompletableFuture sendTx() { + public String sendTx() { String transactionHash = ""; try { @@ -135,10 +135,10 @@ public class Web3Service { } catch (Exception ex) { System.out.println(PLEASE_SUPPLY_REAL_DATA); - return CompletableFuture.completedFuture(PLEASE_SUPPLY_REAL_DATA); + return PLEASE_SUPPLY_REAL_DATA; } - return CompletableFuture.completedFuture(transactionHash); + return transactionHash; } } diff --git a/ethereum/src/test/java/com/baeldung/web3j/services/EthereumContractUnitTest.java b/ethereum/src/test/java/com/baeldung/web3j/services/EthereumContractUnitTest.java index 382c96e985..ff02659bd5 100644 --- a/ethereum/src/test/java/com/baeldung/web3j/services/EthereumContractUnitTest.java +++ b/ethereum/src/test/java/com/baeldung/web3j/services/EthereumContractUnitTest.java @@ -4,8 +4,6 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; -import java.util.concurrent.CompletableFuture; - public class EthereumContractUnitTest { private Web3Service web3Service; @@ -17,14 +15,14 @@ public class EthereumContractUnitTest { @Test public void testContract() { - CompletableFuture result = web3Service.fromScratchContractExample(); - assert (result instanceof CompletableFuture); + String result = web3Service.fromScratchContractExample(); + assert (result instanceof String); } @Test public void sendTx() { - CompletableFuture result = web3Service.sendTx(); - assert (result instanceof CompletableFuture); + String result = web3Service.sendTx(); + assert (result instanceof String); } @After From 03306112bdc117277afa828912a81b5fe938d158 Mon Sep 17 00:00:00 2001 From: Steven van Beelen Date: Fri, 28 Dec 2018 15:58:41 +0100 Subject: [PATCH 205/359] BAEL-2435 Minor clean ups -Add toString() function to messages/query-model -Fix typo in exception -Reorder event handlers in OrderedProductsEventHandler -Replace usage of constants for local fields -Add missing Aggregate test case --- .../axon/commandmodel/OrderAggregate.java | 2 +- .../coreapi/commands/ConfirmOrderCommand.java | 7 ++++ .../coreapi/commands/PlaceOrderCommand.java | 8 +++++ .../coreapi/commands/ShipOrderCommand.java | 7 ++++ .../coreapi/events/OrderConfirmedEvent.java | 7 ++++ .../axon/coreapi/events/OrderPlacedEvent.java | 8 +++++ .../coreapi/events/OrderShippedEvent.java | 7 ++++ .../axon/coreapi/queries/OrderedProduct.java | 9 +++++ .../baeldung/axon/gui/OrderRestEndpoint.java | 8 ++--- .../OrderedProductsEventHandler.java | 17 +++++----- .../commandmodel/OrderAggregateUnitTest.java | 33 +++++++++++++------ 11 files changed, 88 insertions(+), 25 deletions(-) diff --git a/axon/src/main/java/com/baeldung/axon/commandmodel/OrderAggregate.java b/axon/src/main/java/com/baeldung/axon/commandmodel/OrderAggregate.java index fd4f901032..b37b2fdd66 100644 --- a/axon/src/main/java/com/baeldung/axon/commandmodel/OrderAggregate.java +++ b/axon/src/main/java/com/baeldung/axon/commandmodel/OrderAggregate.java @@ -34,7 +34,7 @@ public class OrderAggregate { @CommandHandler public void handle(ShipOrderCommand command) { if (!orderConfirmed) { - throw new IllegalStateException("Cannot ship an order which has not ben confirmed yet."); + throw new IllegalStateException("Cannot ship an order which has not been confirmed yet."); } apply(new OrderShippedEvent(orderId)); diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/commands/ConfirmOrderCommand.java b/axon/src/main/java/com/baeldung/axon/coreapi/commands/ConfirmOrderCommand.java index ba04343af1..244b69f3b7 100644 --- a/axon/src/main/java/com/baeldung/axon/coreapi/commands/ConfirmOrderCommand.java +++ b/axon/src/main/java/com/baeldung/axon/coreapi/commands/ConfirmOrderCommand.java @@ -33,4 +33,11 @@ public class ConfirmOrderCommand { final ConfirmOrderCommand other = (ConfirmOrderCommand) obj; return Objects.equals(this.orderId, other.orderId); } + + @Override + public String toString() { + return "ConfirmOrderCommand{" + + "orderId='" + orderId + '\'' + + '}'; + } } diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/commands/PlaceOrderCommand.java b/axon/src/main/java/com/baeldung/axon/coreapi/commands/PlaceOrderCommand.java index cde2d7f1ae..c70d503050 100644 --- a/axon/src/main/java/com/baeldung/axon/coreapi/commands/PlaceOrderCommand.java +++ b/axon/src/main/java/com/baeldung/axon/coreapi/commands/PlaceOrderCommand.java @@ -40,4 +40,12 @@ public class PlaceOrderCommand { return Objects.equals(this.orderId, other.orderId) && Objects.equals(this.product, other.product); } + + @Override + public String toString() { + return "PlaceOrderCommand{" + + "orderId='" + orderId + '\'' + + ", product='" + product + '\'' + + '}'; + } } \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/commands/ShipOrderCommand.java b/axon/src/main/java/com/baeldung/axon/coreapi/commands/ShipOrderCommand.java index 75469533b9..7312bc1fdb 100644 --- a/axon/src/main/java/com/baeldung/axon/coreapi/commands/ShipOrderCommand.java +++ b/axon/src/main/java/com/baeldung/axon/coreapi/commands/ShipOrderCommand.java @@ -33,4 +33,11 @@ public class ShipOrderCommand { final ShipOrderCommand other = (ShipOrderCommand) obj; return Objects.equals(this.orderId, other.orderId); } + + @Override + public String toString() { + return "ShipOrderCommand{" + + "orderId='" + orderId + '\'' + + '}'; + } } \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderConfirmedEvent.java b/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderConfirmedEvent.java index 1706b08023..d2b7d58435 100644 --- a/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderConfirmedEvent.java +++ b/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderConfirmedEvent.java @@ -30,4 +30,11 @@ public class OrderConfirmedEvent { final OrderConfirmedEvent other = (OrderConfirmedEvent) obj; return Objects.equals(this.orderId, other.orderId); } + + @Override + public String toString() { + return "OrderConfirmedEvent{" + + "orderId='" + orderId + '\'' + + '}'; + } } diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderPlacedEvent.java b/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderPlacedEvent.java index 8d5364f4c6..06de4c5f9f 100644 --- a/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderPlacedEvent.java +++ b/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderPlacedEvent.java @@ -37,4 +37,12 @@ public class OrderPlacedEvent { return Objects.equals(this.orderId, other.orderId) && Objects.equals(this.product, other.product); } + + @Override + public String toString() { + return "OrderPlacedEvent{" + + "orderId='" + orderId + '\'' + + ", product='" + product + '\'' + + '}'; + } } \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderShippedEvent.java b/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderShippedEvent.java index 5abcd09a3c..76aa684629 100644 --- a/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderShippedEvent.java +++ b/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderShippedEvent.java @@ -30,4 +30,11 @@ public class OrderShippedEvent { final OrderShippedEvent other = (OrderShippedEvent) obj; return Objects.equals(this.orderId, other.orderId); } + + @Override + public String toString() { + return "OrderShippedEvent{" + + "orderId='" + orderId + '\'' + + '}'; + } } \ No newline at end of file diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderedProduct.java b/axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderedProduct.java index 25096eeb42..d847bb2a98 100644 --- a/axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderedProduct.java +++ b/axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderedProduct.java @@ -52,4 +52,13 @@ public class OrderedProduct { && Objects.equals(this.product, other.product) && Objects.equals(this.orderStatus, other.orderStatus); } + + @Override + public String toString() { + return "OrderedProduct{" + + "orderId='" + orderId + '\'' + + ", product='" + product + '\'' + + ", orderStatus=" + orderStatus + + '}'; + } } diff --git a/axon/src/main/java/com/baeldung/axon/gui/OrderRestEndpoint.java b/axon/src/main/java/com/baeldung/axon/gui/OrderRestEndpoint.java index 3b8be0bc46..a9f34cc691 100644 --- a/axon/src/main/java/com/baeldung/axon/gui/OrderRestEndpoint.java +++ b/axon/src/main/java/com/baeldung/axon/gui/OrderRestEndpoint.java @@ -19,8 +19,6 @@ import com.baeldung.axon.coreapi.queries.OrderedProduct; @RestController public class OrderRestEndpoint { - private static final String DEFAULT_PRODUCT = "Deluxe Chair"; - private final CommandGateway commandGateway; private final QueryGateway queryGateway; @@ -32,7 +30,7 @@ public class OrderRestEndpoint { @PostMapping("/ship-order") public void shipOrder() { String orderId = UUID.randomUUID().toString(); - commandGateway.send(new PlaceOrderCommand(orderId, DEFAULT_PRODUCT)); + commandGateway.send(new PlaceOrderCommand(orderId, "Deluxe Chair")); commandGateway.send(new ConfirmOrderCommand(orderId)); commandGateway.send(new ShipOrderCommand(orderId)); } @@ -40,7 +38,7 @@ public class OrderRestEndpoint { @PostMapping("/ship-unconfirmed-order") public void shipUnconfirmedOrder() { String orderId = UUID.randomUUID().toString(); - commandGateway.send(new PlaceOrderCommand(orderId, DEFAULT_PRODUCT)); + commandGateway.send(new PlaceOrderCommand(orderId, "Deluxe Chair")); // This throws an exception, as an Order cannot be shipped if it has not been confirmed yet. commandGateway.send(new ShipOrderCommand(orderId)); } @@ -48,7 +46,7 @@ public class OrderRestEndpoint { @GetMapping("/all-orders") public List findAllOrderedProducts() { return queryGateway.query(new FindAllOrderedProductsQuery(), ResponseTypes.multipleInstancesOf(OrderedProduct.class)) - .join(); + .join(); } } diff --git a/axon/src/main/java/com/baeldung/axon/querymodel/OrderedProductsEventHandler.java b/axon/src/main/java/com/baeldung/axon/querymodel/OrderedProductsEventHandler.java index c2bf48614b..d4cf3d999b 100644 --- a/axon/src/main/java/com/baeldung/axon/querymodel/OrderedProductsEventHandler.java +++ b/axon/src/main/java/com/baeldung/axon/querymodel/OrderedProductsEventHandler.java @@ -24,15 +24,6 @@ public class OrderedProductsEventHandler { public void on(OrderPlacedEvent event) { String orderId = event.getOrderId(); orderedProducts.put(orderId, new OrderedProduct(orderId, event.getProduct())); - - } - - @EventHandler - public void on(OrderShippedEvent event) { - orderedProducts.computeIfPresent(event.getOrderId(), (orderId, orderedProduct) -> { - orderedProduct.setOrderShipped(); - return orderedProduct; - }); } @EventHandler @@ -43,6 +34,14 @@ public class OrderedProductsEventHandler { }); } + @EventHandler + public void on(OrderShippedEvent event) { + orderedProducts.computeIfPresent(event.getOrderId(), (orderId, orderedProduct) -> { + orderedProduct.setOrderShipped(); + return orderedProduct; + }); + } + @QueryHandler public List handle(FindAllOrderedProductsQuery query) { return new ArrayList<>(orderedProducts.values()); diff --git a/axon/src/test/java/com/baeldung/axon/commandmodel/OrderAggregateUnitTest.java b/axon/src/test/java/com/baeldung/axon/commandmodel/OrderAggregateUnitTest.java index e7dfdeb794..9beedbaa19 100644 --- a/axon/src/test/java/com/baeldung/axon/commandmodel/OrderAggregateUnitTest.java +++ b/axon/src/test/java/com/baeldung/axon/commandmodel/OrderAggregateUnitTest.java @@ -6,6 +6,7 @@ import org.axonframework.test.aggregate.AggregateTestFixture; import org.axonframework.test.aggregate.FixtureConfiguration; import org.junit.*; +import com.baeldung.axon.coreapi.commands.ConfirmOrderCommand; import com.baeldung.axon.coreapi.commands.PlaceOrderCommand; import com.baeldung.axon.coreapi.commands.ShipOrderCommand; import com.baeldung.axon.coreapi.events.OrderConfirmedEvent; @@ -14,9 +15,6 @@ import com.baeldung.axon.coreapi.events.OrderShippedEvent; public class OrderAggregateUnitTest { - private static final String ORDER_ID = UUID.randomUUID().toString(); - private static final String DEFAULT_PRODUCT = "Deluxe Chair"; - private FixtureConfiguration fixture; @Before @@ -26,23 +24,38 @@ public class OrderAggregateUnitTest { @Test public void giveNoPriorActivity_whenPlaceOrderCommand_thenShouldPublishOrderPlacedEvent() { + String orderId = UUID.randomUUID().toString(); + String product = "Deluxe Chair"; fixture.givenNoPriorActivity() - .when(new PlaceOrderCommand(ORDER_ID, DEFAULT_PRODUCT)) - .expectEvents(new OrderPlacedEvent(ORDER_ID, DEFAULT_PRODUCT)); + .when(new PlaceOrderCommand(orderId, product)) + .expectEvents(new OrderPlacedEvent(orderId, product)); + } + + @Test + public void givenOrderPlacedEvent_whenConfirmOrderCommand_thenShouldPublishOrderConfirmedEvent() { + String orderId = UUID.randomUUID().toString(); + String product = "Deluxe Chair"; + fixture.given(new OrderPlacedEvent(orderId, product)) + .when(new ConfirmOrderCommand(orderId)) + .expectEvents(new OrderConfirmedEvent(orderId)); } @Test public void givenOrderPlacedEvent_whenShipOrderCommand_thenShouldThrowIllegalStateException() { - fixture.given(new OrderPlacedEvent(ORDER_ID, DEFAULT_PRODUCT)) - .when(new ShipOrderCommand(ORDER_ID)) + String orderId = UUID.randomUUID().toString(); + String product = "Deluxe Chair"; + fixture.given(new OrderPlacedEvent(orderId, product)) + .when(new ShipOrderCommand(orderId)) .expectException(IllegalStateException.class); } @Test public void givenOrderPlacedEventAndOrderConfirmedEvent_whenShipOrderCommand_thenShouldPublishOrderShippedEvent() { - fixture.given(new OrderPlacedEvent(ORDER_ID, DEFAULT_PRODUCT), new OrderConfirmedEvent(ORDER_ID)) - .when(new ShipOrderCommand(ORDER_ID)) - .expectEvents(new OrderShippedEvent(ORDER_ID)); + String orderId = UUID.randomUUID().toString(); + String product = "Deluxe Chair"; + fixture.given(new OrderPlacedEvent(orderId, product), new OrderConfirmedEvent(orderId)) + .when(new ShipOrderCommand(orderId)) + .expectEvents(new OrderShippedEvent(orderId)); } } \ No newline at end of file From 4d6cb52be4642c22cfa57ed52162c695ebe6b2f5 Mon Sep 17 00:00:00 2001 From: Yatendra Goel Date: Fri, 28 Dec 2018 21:57:38 +0530 Subject: [PATCH 206/359] BAEL-1978: Added a test to demostrate classpath resource with relative path --- .../SpringResourceIntegrationTest.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java b/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java index 38e8304f0f..284776fdfa 100644 --- a/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java +++ b/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java @@ -7,6 +7,8 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.net.URL; +import java.net.URLClassLoader; import java.nio.file.Files; import java.util.stream.Collectors; @@ -23,6 +25,8 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; import org.springframework.util.ResourceUtils; +import com.baeldung.dependson.config.TestConfig; + /** * Test class illustrating various methods of accessing a file from the classpath using Resource. * @author tritty @@ -98,4 +102,19 @@ public class SpringResourceIntegrationTest { final String employees = new String(Files.readAllBytes(resource.toPath())); assertEquals(EMPLOYEES_EXPECTED, employees); } + + @Test + public void whenClassPathResourceWithAbsoultePath_thenReadSuccessful() throws IOException { + final File resource = new ClassPathResource("/data/employees.dat", this.getClass()).getFile(); + final String employees = new String(Files.readAllBytes(resource.toPath())); + assertEquals(EMPLOYEES_EXPECTED, employees); + } + + @Test + public void whenClassPathResourceWithRelativePath_thenReadSuccessful() throws IOException { +// final File resource = new ClassPathResource("../../../data/employees.dat", SpringResourceIntegrationTest.class).getFile(); + final File resource = new ClassPathResource("/data/employees.dat", SpringResourceIntegrationTest.class).getFile(); + final String employees = new String(Files.readAllBytes(resource.toPath())); + assertEquals(EMPLOYEES_EXPECTED, employees); + } } From c3eb5c939fff07533096eabb859096970eb147ad Mon Sep 17 00:00:00 2001 From: Yatendra Goel Date: Fri, 28 Dec 2018 22:00:35 +0530 Subject: [PATCH 207/359] BAEL-1978: Added a test to demostrate classpath resource with relative path --- .../com/baeldung/resource/SpringResourceIntegrationTest.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java b/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java index 284776fdfa..c1464feded 100644 --- a/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java +++ b/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java @@ -7,8 +7,6 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.net.URL; -import java.net.URLClassLoader; import java.nio.file.Files; import java.util.stream.Collectors; @@ -25,8 +23,6 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; import org.springframework.util.ResourceUtils; -import com.baeldung.dependson.config.TestConfig; - /** * Test class illustrating various methods of accessing a file from the classpath using Resource. * @author tritty From 3220d1b958446f47ac7d4a4c259f94405b306beb Mon Sep 17 00:00:00 2001 From: Loredana Date: Sat, 29 Dec 2018 00:27:55 +0200 Subject: [PATCH 208/359] fix spring-core mockito issue --- spring-core/pom.xml | 1 + .../com/baeldung/resource/SpringResourceIntegrationTest.java | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-core/pom.xml b/spring-core/pom.xml index 60f3262f08..f1e2e2a748 100644 --- a/spring-core/pom.xml +++ b/spring-core/pom.xml @@ -85,6 +85,7 @@ 1.16.12 2.5 1.5.2.RELEASE + 1.10.19 \ No newline at end of file diff --git a/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java b/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java index c1464feded..a7a2a9032a 100644 --- a/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java +++ b/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java @@ -108,8 +108,7 @@ public class SpringResourceIntegrationTest { @Test public void whenClassPathResourceWithRelativePath_thenReadSuccessful() throws IOException { -// final File resource = new ClassPathResource("../../../data/employees.dat", SpringResourceIntegrationTest.class).getFile(); - final File resource = new ClassPathResource("/data/employees.dat", SpringResourceIntegrationTest.class).getFile(); + final File resource = new ClassPathResource("../../../data/employees.dat", SpringResourceIntegrationTest.class).getFile(); final String employees = new String(Files.readAllBytes(resource.toPath())); assertEquals(EMPLOYEES_EXPECTED, employees); } From a1b1e02e71df82eb3ff6d267efdd3db7643ea804 Mon Sep 17 00:00:00 2001 From: Emily Cheyne Date: Fri, 28 Dec 2018 16:11:16 -0700 Subject: [PATCH 209/359] BAEL-2421 Update readme (#6014) --- java-strings/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/java-strings/README.md b/java-strings/README.md index 4d735490ce..60131e392d 100644 --- a/java-strings/README.md +++ b/java-strings/README.md @@ -44,3 +44,4 @@ - [Adding a Newline Character to a String in Java](https://www.baeldung.com/java-string-newline) - [Remove or Replace part of a String in Java](https://www.baeldung.com/java-remove-replace-string-part) - [Replace a Character at a Specific Index in a String in Java](https://www.baeldung.com/java-replace-character-at-index) +- [Convert a Comma Separated String to a List in Java](https://www.baeldung.com/java-string-with-separator-to-list) From 2c801888e7f3e538f2371d6ad1627ebc761128ca Mon Sep 17 00:00:00 2001 From: FrancoCorleone Date: Sat, 29 Dec 2018 00:18:30 +0100 Subject: [PATCH 210/359] BAEL-2090 Insert with JPA * Adding inserts for JPA objects repositories * Refactor tests * Small refactor * Small refactor * Remove redundant @Repository annotation * Refactor tests * Change to simple entity manager implementation * Refactor changes * Remove Spring repositories, Add simple implementation using EntityManager * Remove redundant Interface * Remove redundant files * Update persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonInsertRepository.java Co-Authored-By: FrancoCorleone --- .../dao/repositories/InsertRepository.java | 5 -- .../PersonEntityManagerInsertRepository.java | 7 -- .../PersonEntityManagerRepository.java | 10 --- .../PersonQueryInsertRepository.java | 7 -- .../repositories/PersonQueryRepository.java | 16 ----- ...rsonEntityManagerInsertRepositoryImpl.java | 21 ------ ...yImpl.java => PersonInsertRepository.java} | 18 +++-- ...PersonInsertRepositoryIntegrationTest.java | 67 +++++++------------ 8 files changed, 35 insertions(+), 116 deletions(-) delete mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InsertRepository.java delete mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerInsertRepository.java delete mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerRepository.java delete mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryInsertRepository.java delete mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryRepository.java delete mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonEntityManagerInsertRepositoryImpl.java rename persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/{PersonQueryInsertRepositoryImpl.java => PersonInsertRepository.java} (60%) diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InsertRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InsertRepository.java deleted file mode 100644 index 6a74e067fe..0000000000 --- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InsertRepository.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.baeldung.dao.repositories; - -public interface InsertRepository { - void insert(S entity); -} diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerInsertRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerInsertRepository.java deleted file mode 100644 index 6d3cbb07df..0000000000 --- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerInsertRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.baeldung.dao.repositories; - -import com.baeldung.domain.Person; - -public interface PersonEntityManagerInsertRepository { - void insert(Person person); -} diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerRepository.java deleted file mode 100644 index cbf3d59620..0000000000 --- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.baeldung.dao.repositories; - -import com.baeldung.domain.Person; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface PersonEntityManagerRepository extends JpaRepository, PersonEntityManagerInsertRepository { - -} diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryInsertRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryInsertRepository.java deleted file mode 100644 index be01e9883a..0000000000 --- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryInsertRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.baeldung.dao.repositories; - -import com.baeldung.domain.Person; - -public interface PersonQueryInsertRepository { - void insert(Person person); -} diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryRepository.java deleted file mode 100644 index 1516c38443..0000000000 --- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryRepository.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.baeldung.dao.repositories; - -import com.baeldung.domain.Person; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Modifying; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; - -@Repository -public interface PersonQueryRepository extends JpaRepository, PersonQueryInsertRepository { - - @Modifying - @Query(value = "INSERT INTO person (id, first_name, last_name) VALUES (:id,:firstName,:lastName)", nativeQuery = true) - void insertWithAnnotation(@Param("id") Long id, @Param("firstName") String firstName, @Param("lastName") String lastName); -} diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonEntityManagerInsertRepositoryImpl.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonEntityManagerInsertRepositoryImpl.java deleted file mode 100644 index c14cc44125..0000000000 --- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonEntityManagerInsertRepositoryImpl.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.dao.repositories.impl; - -import com.baeldung.dao.repositories.PersonEntityManagerInsertRepository; -import com.baeldung.domain.Person; -import org.springframework.transaction.annotation.Transactional; - -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; - -@Transactional -public class PersonEntityManagerInsertRepositoryImpl implements PersonEntityManagerInsertRepository { - - @PersistenceContext - private EntityManager entityManager; - - @Override - public void insert(Person person) { - this.entityManager.persist(person); - } -} - diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonQueryInsertRepositoryImpl.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonInsertRepository.java similarity index 60% rename from persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonQueryInsertRepositoryImpl.java rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonInsertRepository.java index 341db1615d..d809385456 100644 --- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonQueryInsertRepositoryImpl.java +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonInsertRepository.java @@ -1,24 +1,30 @@ package com.baeldung.dao.repositories.impl; -import com.baeldung.dao.repositories.PersonQueryInsertRepository; import com.baeldung.domain.Person; +import org.springframework.stereotype.Repository; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.transaction.Transactional; -@Transactional -public class PersonQueryInsertRepositoryImpl implements PersonQueryInsertRepository { +@Repository +public class PersonInsertRepository { @PersistenceContext private EntityManager entityManager; - @Override - public void insert(Person person) { - entityManager.createNativeQuery("INSERT INTO person (id,first_name, last_name) VALUES (?,?,?)") + @Transactional + public void insertWithQuery(Person person) { + entityManager.createNativeQuery("INSERT INTO person (id, first_name, last_name) VALUES (?,?,?)") .setParameter(1, person.getId()) .setParameter(2, person.getFirstName()) .setParameter(3, person.getLastName()) .executeUpdate(); } + + @Transactional + public void insertWithEntityManager(Person person) { + this.entityManager.persist(person); + } + } diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/PersonInsertRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/PersonInsertRepositoryIntegrationTest.java index 476554f6d6..b248cf8bf1 100644 --- a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/PersonInsertRepositoryIntegrationTest.java +++ b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/PersonInsertRepositoryIntegrationTest.java @@ -1,21 +1,24 @@ package com.baeldung.dao.repositories; +import com.baeldung.dao.repositories.impl.PersonInsertRepository; import com.baeldung.domain.Person; import org.junit.Test; -import org.junit.jupiter.api.BeforeEach; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.context.annotation.Import; import org.springframework.test.context.junit4.SpringRunner; -import java.util.Optional; +import javax.persistence.EntityExistsException; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceException; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; @RunWith(SpringRunner.class) @DataJpaTest +@Import(PersonInsertRepository.class) public class PersonInsertRepositoryIntegrationTest { private static final Long ID = 1L; @@ -24,43 +27,23 @@ public class PersonInsertRepositoryIntegrationTest { private static final Person PERSON = new Person(ID, FIRST_NAME, LAST_NAME); @Autowired - private PersonQueryRepository personQueryRepository; + private PersonInsertRepository personInsertRepository; @Autowired - private PersonEntityManagerRepository personEntityManagerRepository; - - @BeforeEach - public void clearDB() { - personQueryRepository.deleteAll(); - } + private EntityManager entityManager; @Test public void givenPersonEntity_whenInsertWithNativeQuery_ThenPersonIsPersisted() { - insertPerson(); + insertWithQuery(); assertPersonPersisted(); } @Test - public void givenPersonEntity_whenInsertedTwiceWithNativeQuery_thenDataIntegrityViolationExceptionIsThrown() { - assertThatExceptionOfType(DataIntegrityViolationException.class).isThrownBy(() -> { - insertPerson(); - insertPerson(); - }); - } - - @Test - public void givenPersonEntity_whenInsertWithQueryAnnotation_thenPersonIsPersisted() { - insertPersonWithQueryAnnotation(); - - assertPersonPersisted(); - } - - @Test - public void givenPersonEntity_whenInsertedTwiceWithQueryAnnotation_thenDataIntegrityViolationExceptionIsThrown() { - assertThatExceptionOfType(DataIntegrityViolationException.class).isThrownBy(() -> { - insertPersonWithQueryAnnotation(); - insertPersonWithQueryAnnotation(); + public void givenPersonEntity_whenInsertedTwiceWithNativeQuery_thenPersistenceExceptionExceptionIsThrown() { + assertThatExceptionOfType(PersistenceException.class).isThrownBy(() -> { + insertWithQuery(); + insertWithQuery(); }); } @@ -72,31 +55,27 @@ public class PersonInsertRepositoryIntegrationTest { } @Test - public void givenPersonEntity_whenInsertedTwiceWithEntityManager_thenDataIntegrityViolationExceptionIsThrown() { - assertThatExceptionOfType(DataIntegrityViolationException.class).isThrownBy(() -> { + public void givenPersonEntity_whenInsertedTwiceWithEntityManager_thenEntityExistsExceptionIsThrown() { + assertThatExceptionOfType(EntityExistsException.class).isThrownBy(() -> { insertPersonWithEntityManager(); insertPersonWithEntityManager(); }); } - private void insertPerson() { - personQueryRepository.insert(PERSON); - } - - private void insertPersonWithQueryAnnotation() { - personQueryRepository.insertWithAnnotation(ID, FIRST_NAME, LAST_NAME); + private void insertWithQuery() { + personInsertRepository.insertWithQuery(PERSON); } private void insertPersonWithEntityManager() { - personEntityManagerRepository.insert(new Person(ID, FIRST_NAME, LAST_NAME)); + personInsertRepository.insertWithEntityManager(new Person(ID, FIRST_NAME, LAST_NAME)); } private void assertPersonPersisted() { - Optional personOptional = personQueryRepository.findById(PERSON.getId()); + Person person = entityManager.find(Person.class, ID); - assertThat(personOptional.isPresent()).isTrue(); - assertThat(personOptional.get().getId()).isEqualTo(PERSON.getId()); - assertThat(personOptional.get().getFirstName()).isEqualTo(PERSON.getFirstName()); - assertThat(personOptional.get().getLastName()).isEqualTo(PERSON.getLastName()); + assertThat(person).isNotNull(); + assertThat(person.getId()).isEqualTo(PERSON.getId()); + assertThat(person.getFirstName()).isEqualTo(PERSON.getFirstName()); + assertThat(person.getLastName()).isEqualTo(PERSON.getLastName()); } } From 33ba36dc4140f9dec604eea6adc0155b6c287643 Mon Sep 17 00:00:00 2001 From: Yatendra Goel Date: Sat, 29 Dec 2018 13:30:46 +0530 Subject: [PATCH 211/359] BAEL-2307: Added Code to add SAN needed by Chrome to the X509 Certificate --- .../keystore/JavaKeyStoreUnitTest.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/core-java/src/test/java/com/baeldung/keystore/JavaKeyStoreUnitTest.java b/core-java/src/test/java/com/baeldung/keystore/JavaKeyStoreUnitTest.java index cb2a9f1c49..7473c52a35 100644 --- a/core-java/src/test/java/com/baeldung/keystore/JavaKeyStoreUnitTest.java +++ b/core-java/src/test/java/com/baeldung/keystore/JavaKeyStoreUnitTest.java @@ -4,15 +4,24 @@ import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; + import sun.security.x509.AlgorithmId; import sun.security.x509.CertificateAlgorithmId; import sun.security.x509.CertificateSerialNumber; import sun.security.x509.CertificateValidity; import sun.security.x509.CertificateVersion; import sun.security.x509.CertificateX509Key; +import sun.security.x509.SubjectAlternativeNameExtension; import sun.security.x509.X500Name; import sun.security.x509.X509CertImpl; import sun.security.x509.X509CertInfo; +import sun.security.x509.CertificateExtensions; +import sun.security.x509.GeneralNames; +import sun.security.x509.GeneralName; +import sun.security.x509.GeneralNameInterface; +import sun.security.x509.DNSName; +import sun.security.x509.IPAddressName; +import sun.security.util.DerOutputStream; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; @@ -188,6 +197,23 @@ public class JavaKeyStoreUnitTest { Date validTo = new Date(validFrom.getTime() + 50L * 365L * 24L * 60L * 60L * 1000L); //50 years CertificateValidity validity = new CertificateValidity(validFrom, validTo); certInfo.set(X509CertInfo.VALIDITY, validity); + + GeneralNameInterface dnsName = new DNSName("baeldung.com"); + DerOutputStream dnsNameOutputStream = new DerOutputStream(); + dnsName.encode(dnsNameOutputStream); + + GeneralNameInterface ipAddress = new IPAddressName("127.0.0.1"); + DerOutputStream ipAddressOutputStream = new DerOutputStream(); + ipAddress.encode(ipAddressOutputStream); + + GeneralNames generalNames = new GeneralNames(); + generalNames.add(new GeneralName(dnsName)); + generalNames.add(new GeneralName(ipAddress)); + + CertificateExtensions ext = new CertificateExtensions(); + ext.set(SubjectAlternativeNameExtension.NAME, new SubjectAlternativeNameExtension(generalNames)); + + certInfo.set(X509CertInfo.EXTENSIONS, ext); // Create certificate and sign it X509CertImpl cert = new X509CertImpl(certInfo); @@ -202,4 +228,5 @@ public class JavaKeyStoreUnitTest { return newCert; } + } \ No newline at end of file From cf3d7b69e6e43f9f4d232b97e69c09a400f3d24a Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sat, 29 Dec 2018 20:11:40 +0530 Subject: [PATCH 212/359] [BAEL-10836] - Moved Java8CollectionCleanupUnitTest, AddElementsUnitTest and articles --- core-java-collections-list/README.md | 1 - .../src/main/java/com/baeldung/list/Flower.java | 0 .../java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java | 0 .../src/test/java/com/baeldung/list/AddElementsUnitTest.java | 0 java-collections-conversions/README.md | 1 + 5 files changed, 1 insertion(+), 1 deletion(-) rename {core-java-8 => core-java-collections-list}/src/main/java/com/baeldung/list/Flower.java (100%) rename {core-java-8 => core-java-collections-list}/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java (100%) rename {core-java-8 => core-java-collections-list}/src/test/java/com/baeldung/list/AddElementsUnitTest.java (100%) diff --git a/core-java-collections-list/README.md b/core-java-collections-list/README.md index cb6999277c..aba53f5b30 100644 --- a/core-java-collections-list/README.md +++ b/core-java-collections-list/README.md @@ -17,7 +17,6 @@ - [Finding Max/Min of a List or Collection](http://www.baeldung.com/java-collection-min-max) - [Collections.emptyList() vs. New List Instance](https://www.baeldung.com/java-collections-emptylist-new-list) - [Remove All Occurrences of a Specific Value from a List](https://www.baeldung.com/java-remove-value-from-list) -- [Converting a Collection to ArrayList in Java](https://www.baeldung.com/java-convert-collection-arraylist) - [Check If Two Lists are Equal in Java](http://www.baeldung.com/java-test-a-list-for-ordinality-and-equality) - [Java 8 Streams: Find Items From One List Based On Values From Another List](https://www.baeldung.com/java-streams-find-list-items) - [A Guide to the Java LinkedList](http://www.baeldung.com/java-linkedlist) diff --git a/core-java-8/src/main/java/com/baeldung/list/Flower.java b/core-java-collections-list/src/main/java/com/baeldung/list/Flower.java similarity index 100% rename from core-java-8/src/main/java/com/baeldung/list/Flower.java rename to core-java-collections-list/src/main/java/com/baeldung/list/Flower.java diff --git a/core-java-8/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java similarity index 100% rename from core-java-8/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java diff --git a/core-java-8/src/test/java/com/baeldung/list/AddElementsUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/list/AddElementsUnitTest.java similarity index 100% rename from core-java-8/src/test/java/com/baeldung/list/AddElementsUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/list/AddElementsUnitTest.java diff --git a/java-collections-conversions/README.md b/java-collections-conversions/README.md index 0f89e07d63..31fead3c42 100644 --- a/java-collections-conversions/README.md +++ b/java-collections-conversions/README.md @@ -10,3 +10,4 @@ - [Converting a List to String in Java](http://www.baeldung.com/java-list-to-string) - [How to Convert List to Map in Java](http://www.baeldung.com/java-list-to-map) - [Array to String Conversions](https://www.baeldung.com/java-array-to-string) +- [Converting a Collection to ArrayList in Java](https://www.baeldung.com/java-convert-collection-arraylist) \ No newline at end of file From 8b65216ba33e90c6f4c3d4cf3a3a85e773a85eed Mon Sep 17 00:00:00 2001 From: Emily Cheyne Date: Sat, 29 Dec 2018 08:13:10 -0700 Subject: [PATCH 213/359] BAEL-2436 update readme (#6019) --- persistence-modules/hibernate5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/hibernate5/README.md b/persistence-modules/hibernate5/README.md index c066ccb50b..2b948a683a 100644 --- a/persistence-modules/hibernate5/README.md +++ b/persistence-modules/hibernate5/README.md @@ -22,3 +22,4 @@ - [Criteria API – An Example of IN Expressions](https://www.baeldung.com/jpa-criteria-api-in-expressions) - [Difference Between @JoinColumn and mappedBy](https://www.baeldung.com/jpa-joincolumn-vs-mappedby) - [Hibernate 5 Bootstrapping API](https://www.baeldung.com/hibernate-5-bootstrapping-api) +- [Criteria Queries Using JPA Metamodel](https://www.baeldung.com/hibernate-criteria-queries-metamodel) From c61ac5101e8732677f44b4b9efe5956dcdcb34ed Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sat, 29 Dec 2018 21:54:59 +0530 Subject: [PATCH 214/359] [BAEL-11401] - Moved articles out of core-java (part 2) --- core-java-networking/README.md | 3 +++ core-java-networking/pom.xml | 12 ++++++++++++ .../baeldung/http/FullResponseBuilder.java | 0 .../baeldung/http/ParameterStringBuilder.java | 0 .../java/com/baeldung/socket/EchoClient.java | 0 .../com/baeldung/socket/EchoMultiServer.java | 0 .../java/com/baeldung/socket/EchoServer.java | 0 .../java/com/baeldung/socket/GreetClient.java | 0 .../java/com/baeldung/socket/GreetServer.java | 0 .../EncoderDecoderUnitTest.java | 0 .../baeldung/http/HttpRequestLiveTest.java | 2 +- .../baeldung/socket/EchoIntegrationTest.java | 0 .../socket/GreetServerIntegrationTest.java | 0 .../SocketEchoMultiIntegrationTest.java | 0 core-java-perf/README.md | 4 ++++ .../java/com/baeldung/heapdump/HeapDump.java | 0 .../src/main/java/com/baeldung/jmx/Game.java | 0 .../main/java/com/baeldung/jmx/GameMBean.java | 0 .../baeldung/jmx/JMXTutorialMainlauncher.java | 0 .../memoryleaks/equalshashcode/Person.java | 0 .../equalshashcode/PersonOptimized.java | 0 .../memoryleaks/finalize/BulkyObject.java | 0 .../finalize/BulkyObjectOptimized.java | 0 .../memoryleaks/innerclass/BulkyObject.java | 0 .../innerclass/InnerClassDriver.java | 0 .../innerclass/InnerClassWrapper.java | 0 .../innerclass/StaticNestedClassWrapper.java | 0 .../internedstrings/InternedString.java | 0 .../ReadStringFromFileUtil.java | 0 .../internedstrings/StringObject.java | 0 .../staticfields/NonStaticFieldsDemo.java | 0 .../staticfields/StaticFieldsDemo.java | 0 .../OutOfMemoryGCLimitExceed.java | 0 core-java-perf/src/main/resources/logback.xml | 19 +++++++++++++++++++ .../PersonMemoryLeakUnitTest.java | 0 .../finalize/FinalizeMemoryLeakUnitTest.java | 0 .../StaticInnerClassMemoryLeakUnitTest.java | 0 .../StringInternMemoryLeakUnitTest.java | 0 .../NonStaticFieldsMemoryLeakUnitTest.java | 0 .../StaticFieldsMemoryLeakUnitTest.java | 0 core-java-sun/README.md | 1 + .../java/com/baeldung/unsafe/CASCounter.java | 0 .../com/baeldung/unsafe/OffHeapArray.java | 0 .../com/baeldung/unsafe/UnsafeUnitTest.java | 0 core-java/README.md | 8 -------- 45 files changed, 40 insertions(+), 9 deletions(-) rename {core-java => core-java-networking}/src/main/java/com/baeldung/http/FullResponseBuilder.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/http/ParameterStringBuilder.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/socket/EchoClient.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/socket/EchoMultiServer.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/socket/EchoServer.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/socket/GreetClient.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/socket/GreetServer.java (100%) rename {core-java => core-java-networking}/src/test/java/com/baeldung/encoderdecoder/EncoderDecoderUnitTest.java (100%) rename {core-java => core-java-networking}/src/test/java/com/baeldung/http/HttpRequestLiveTest.java (99%) rename {core-java => core-java-networking}/src/test/java/com/baeldung/socket/EchoIntegrationTest.java (100%) rename {core-java => core-java-networking}/src/test/java/com/baeldung/socket/GreetServerIntegrationTest.java (100%) rename {core-java => core-java-networking}/src/test/java/com/baeldung/socket/SocketEchoMultiIntegrationTest.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/heapdump/HeapDump.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/jmx/Game.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/jmx/GameMBean.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/jmx/JMXTutorialMainlauncher.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/memoryleaks/equalshashcode/Person.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/memoryleaks/equalshashcode/PersonOptimized.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/memoryleaks/finalize/BulkyObject.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/memoryleaks/finalize/BulkyObjectOptimized.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/memoryleaks/innerclass/BulkyObject.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/memoryleaks/innerclass/InnerClassDriver.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/memoryleaks/innerclass/InnerClassWrapper.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/memoryleaks/innerclass/StaticNestedClassWrapper.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/memoryleaks/internedstrings/InternedString.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/memoryleaks/internedstrings/ReadStringFromFileUtil.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/memoryleaks/internedstrings/StringObject.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/memoryleaks/staticfields/NonStaticFieldsDemo.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/memoryleaks/staticfields/StaticFieldsDemo.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/outofmemoryerror/OutOfMemoryGCLimitExceed.java (100%) create mode 100644 core-java-perf/src/main/resources/logback.xml rename {core-java => core-java-perf}/src/test/java/com/baeldung/memoryleaks/equalshashcode/PersonMemoryLeakUnitTest.java (100%) rename {core-java => core-java-perf}/src/test/java/com/baeldung/memoryleaks/finalize/FinalizeMemoryLeakUnitTest.java (100%) rename {core-java => core-java-perf}/src/test/java/com/baeldung/memoryleaks/innerclass/StaticInnerClassMemoryLeakUnitTest.java (100%) rename {core-java => core-java-perf}/src/test/java/com/baeldung/memoryleaks/internedstrings/StringInternMemoryLeakUnitTest.java (100%) rename {core-java => core-java-perf}/src/test/java/com/baeldung/memoryleaks/staticfields/NonStaticFieldsMemoryLeakUnitTest.java (100%) rename {core-java => core-java-perf}/src/test/java/com/baeldung/memoryleaks/staticfields/StaticFieldsMemoryLeakUnitTest.java (100%) rename {core-java => core-java-sun}/src/test/java/com/baeldung/unsafe/CASCounter.java (100%) rename {core-java => core-java-sun}/src/test/java/com/baeldung/unsafe/OffHeapArray.java (100%) rename {core-java => core-java-sun}/src/test/java/com/baeldung/unsafe/UnsafeUnitTest.java (100%) diff --git a/core-java-networking/README.md b/core-java-networking/README.md index 4b77aa3c1f..b2367782b6 100644 --- a/core-java-networking/README.md +++ b/core-java-networking/README.md @@ -11,3 +11,6 @@ - [A Guide To HTTP Cookies In Java](http://www.baeldung.com/cookies-java) - [A Guide to the Java URL](http://www.baeldung.com/java-url) - [Working with Network Interfaces in Java](http://www.baeldung.com/java-network-interfaces) +- [A Guide to Java Sockets](http://www.baeldung.com/a-guide-to-java-sockets) +- [URL Encoding and Decoding in Java](http://www.baeldung.com/java-url-encoding-decoding) +- [How to Perform a Simple HTTP Request in Java](http://www.baeldung.com/java-http-request) \ No newline at end of file diff --git a/core-java-networking/pom.xml b/core-java-networking/pom.xml index c7fa2af180..d9c7c691e9 100644 --- a/core-java-networking/pom.xml +++ b/core-java-networking/pom.xml @@ -24,6 +24,16 @@ commons-io ${commons-io.version} + + org.springframework + spring-web + ${springframework.spring-web.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + @@ -33,5 +43,7 @@ 1.5.0-b01 2.5 + 3.5 + 4.3.4.RELEASE diff --git a/core-java/src/main/java/com/baeldung/http/FullResponseBuilder.java b/core-java-networking/src/main/java/com/baeldung/http/FullResponseBuilder.java similarity index 100% rename from core-java/src/main/java/com/baeldung/http/FullResponseBuilder.java rename to core-java-networking/src/main/java/com/baeldung/http/FullResponseBuilder.java diff --git a/core-java/src/main/java/com/baeldung/http/ParameterStringBuilder.java b/core-java-networking/src/main/java/com/baeldung/http/ParameterStringBuilder.java similarity index 100% rename from core-java/src/main/java/com/baeldung/http/ParameterStringBuilder.java rename to core-java-networking/src/main/java/com/baeldung/http/ParameterStringBuilder.java diff --git a/core-java/src/main/java/com/baeldung/socket/EchoClient.java b/core-java-networking/src/main/java/com/baeldung/socket/EchoClient.java similarity index 100% rename from core-java/src/main/java/com/baeldung/socket/EchoClient.java rename to core-java-networking/src/main/java/com/baeldung/socket/EchoClient.java diff --git a/core-java/src/main/java/com/baeldung/socket/EchoMultiServer.java b/core-java-networking/src/main/java/com/baeldung/socket/EchoMultiServer.java similarity index 100% rename from core-java/src/main/java/com/baeldung/socket/EchoMultiServer.java rename to core-java-networking/src/main/java/com/baeldung/socket/EchoMultiServer.java diff --git a/core-java/src/main/java/com/baeldung/socket/EchoServer.java b/core-java-networking/src/main/java/com/baeldung/socket/EchoServer.java similarity index 100% rename from core-java/src/main/java/com/baeldung/socket/EchoServer.java rename to core-java-networking/src/main/java/com/baeldung/socket/EchoServer.java diff --git a/core-java/src/main/java/com/baeldung/socket/GreetClient.java b/core-java-networking/src/main/java/com/baeldung/socket/GreetClient.java similarity index 100% rename from core-java/src/main/java/com/baeldung/socket/GreetClient.java rename to core-java-networking/src/main/java/com/baeldung/socket/GreetClient.java diff --git a/core-java/src/main/java/com/baeldung/socket/GreetServer.java b/core-java-networking/src/main/java/com/baeldung/socket/GreetServer.java similarity index 100% rename from core-java/src/main/java/com/baeldung/socket/GreetServer.java rename to core-java-networking/src/main/java/com/baeldung/socket/GreetServer.java diff --git a/core-java/src/test/java/com/baeldung/encoderdecoder/EncoderDecoderUnitTest.java b/core-java-networking/src/test/java/com/baeldung/encoderdecoder/EncoderDecoderUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/encoderdecoder/EncoderDecoderUnitTest.java rename to core-java-networking/src/test/java/com/baeldung/encoderdecoder/EncoderDecoderUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java b/core-java-networking/src/test/java/com/baeldung/http/HttpRequestLiveTest.java similarity index 99% rename from core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java rename to core-java-networking/src/test/java/com/baeldung/http/HttpRequestLiveTest.java index 752a75daa5..bd6c0a4410 100644 --- a/core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java +++ b/core-java-networking/src/test/java/com/baeldung/http/HttpRequestLiveTest.java @@ -1,6 +1,6 @@ package com.baeldung.http; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.junit.Test; import java.io.BufferedReader; diff --git a/core-java/src/test/java/com/baeldung/socket/EchoIntegrationTest.java b/core-java-networking/src/test/java/com/baeldung/socket/EchoIntegrationTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/socket/EchoIntegrationTest.java rename to core-java-networking/src/test/java/com/baeldung/socket/EchoIntegrationTest.java diff --git a/core-java/src/test/java/com/baeldung/socket/GreetServerIntegrationTest.java b/core-java-networking/src/test/java/com/baeldung/socket/GreetServerIntegrationTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/socket/GreetServerIntegrationTest.java rename to core-java-networking/src/test/java/com/baeldung/socket/GreetServerIntegrationTest.java diff --git a/core-java/src/test/java/com/baeldung/socket/SocketEchoMultiIntegrationTest.java b/core-java-networking/src/test/java/com/baeldung/socket/SocketEchoMultiIntegrationTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/socket/SocketEchoMultiIntegrationTest.java rename to core-java-networking/src/test/java/com/baeldung/socket/SocketEchoMultiIntegrationTest.java diff --git a/core-java-perf/README.md b/core-java-perf/README.md index 6af1c82a0a..252ee4cc45 100644 --- a/core-java-perf/README.md +++ b/core-java-perf/README.md @@ -2,3 +2,7 @@ ### Relevant Articles: - [Verbose Garbage Collection in Java](https://www.baeldung.com/java-verbose-gc) +- [Different Ways to Capture Java Heap Dumps](https://www.baeldung.com/java-heap-dump-capture) +- [Understanding Memory Leaks in Java](https://www.baeldung.com/java-memory-leaks) +- [OutOfMemoryError: GC Overhead Limit Exceeded](http://www.baeldung.com/java-gc-overhead-limit-exceeded) +- [Basic Introduction to JMX](http://www.baeldung.com/java-management-extensions) \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/heapdump/HeapDump.java b/core-java-perf/src/main/java/com/baeldung/heapdump/HeapDump.java similarity index 100% rename from core-java/src/main/java/com/baeldung/heapdump/HeapDump.java rename to core-java-perf/src/main/java/com/baeldung/heapdump/HeapDump.java diff --git a/core-java/src/main/java/com/baeldung/jmx/Game.java b/core-java-perf/src/main/java/com/baeldung/jmx/Game.java similarity index 100% rename from core-java/src/main/java/com/baeldung/jmx/Game.java rename to core-java-perf/src/main/java/com/baeldung/jmx/Game.java diff --git a/core-java/src/main/java/com/baeldung/jmx/GameMBean.java b/core-java-perf/src/main/java/com/baeldung/jmx/GameMBean.java similarity index 100% rename from core-java/src/main/java/com/baeldung/jmx/GameMBean.java rename to core-java-perf/src/main/java/com/baeldung/jmx/GameMBean.java diff --git a/core-java/src/main/java/com/baeldung/jmx/JMXTutorialMainlauncher.java b/core-java-perf/src/main/java/com/baeldung/jmx/JMXTutorialMainlauncher.java similarity index 100% rename from core-java/src/main/java/com/baeldung/jmx/JMXTutorialMainlauncher.java rename to core-java-perf/src/main/java/com/baeldung/jmx/JMXTutorialMainlauncher.java diff --git a/core-java/src/main/java/com/baeldung/memoryleaks/equalshashcode/Person.java b/core-java-perf/src/main/java/com/baeldung/memoryleaks/equalshashcode/Person.java similarity index 100% rename from core-java/src/main/java/com/baeldung/memoryleaks/equalshashcode/Person.java rename to core-java-perf/src/main/java/com/baeldung/memoryleaks/equalshashcode/Person.java diff --git a/core-java/src/main/java/com/baeldung/memoryleaks/equalshashcode/PersonOptimized.java b/core-java-perf/src/main/java/com/baeldung/memoryleaks/equalshashcode/PersonOptimized.java similarity index 100% rename from core-java/src/main/java/com/baeldung/memoryleaks/equalshashcode/PersonOptimized.java rename to core-java-perf/src/main/java/com/baeldung/memoryleaks/equalshashcode/PersonOptimized.java diff --git a/core-java/src/main/java/com/baeldung/memoryleaks/finalize/BulkyObject.java b/core-java-perf/src/main/java/com/baeldung/memoryleaks/finalize/BulkyObject.java similarity index 100% rename from core-java/src/main/java/com/baeldung/memoryleaks/finalize/BulkyObject.java rename to core-java-perf/src/main/java/com/baeldung/memoryleaks/finalize/BulkyObject.java diff --git a/core-java/src/main/java/com/baeldung/memoryleaks/finalize/BulkyObjectOptimized.java b/core-java-perf/src/main/java/com/baeldung/memoryleaks/finalize/BulkyObjectOptimized.java similarity index 100% rename from core-java/src/main/java/com/baeldung/memoryleaks/finalize/BulkyObjectOptimized.java rename to core-java-perf/src/main/java/com/baeldung/memoryleaks/finalize/BulkyObjectOptimized.java diff --git a/core-java/src/main/java/com/baeldung/memoryleaks/innerclass/BulkyObject.java b/core-java-perf/src/main/java/com/baeldung/memoryleaks/innerclass/BulkyObject.java similarity index 100% rename from core-java/src/main/java/com/baeldung/memoryleaks/innerclass/BulkyObject.java rename to core-java-perf/src/main/java/com/baeldung/memoryleaks/innerclass/BulkyObject.java diff --git a/core-java/src/main/java/com/baeldung/memoryleaks/innerclass/InnerClassDriver.java b/core-java-perf/src/main/java/com/baeldung/memoryleaks/innerclass/InnerClassDriver.java similarity index 100% rename from core-java/src/main/java/com/baeldung/memoryleaks/innerclass/InnerClassDriver.java rename to core-java-perf/src/main/java/com/baeldung/memoryleaks/innerclass/InnerClassDriver.java diff --git a/core-java/src/main/java/com/baeldung/memoryleaks/innerclass/InnerClassWrapper.java b/core-java-perf/src/main/java/com/baeldung/memoryleaks/innerclass/InnerClassWrapper.java similarity index 100% rename from core-java/src/main/java/com/baeldung/memoryleaks/innerclass/InnerClassWrapper.java rename to core-java-perf/src/main/java/com/baeldung/memoryleaks/innerclass/InnerClassWrapper.java diff --git a/core-java/src/main/java/com/baeldung/memoryleaks/innerclass/StaticNestedClassWrapper.java b/core-java-perf/src/main/java/com/baeldung/memoryleaks/innerclass/StaticNestedClassWrapper.java similarity index 100% rename from core-java/src/main/java/com/baeldung/memoryleaks/innerclass/StaticNestedClassWrapper.java rename to core-java-perf/src/main/java/com/baeldung/memoryleaks/innerclass/StaticNestedClassWrapper.java diff --git a/core-java/src/main/java/com/baeldung/memoryleaks/internedstrings/InternedString.java b/core-java-perf/src/main/java/com/baeldung/memoryleaks/internedstrings/InternedString.java similarity index 100% rename from core-java/src/main/java/com/baeldung/memoryleaks/internedstrings/InternedString.java rename to core-java-perf/src/main/java/com/baeldung/memoryleaks/internedstrings/InternedString.java diff --git a/core-java/src/main/java/com/baeldung/memoryleaks/internedstrings/ReadStringFromFileUtil.java b/core-java-perf/src/main/java/com/baeldung/memoryleaks/internedstrings/ReadStringFromFileUtil.java similarity index 100% rename from core-java/src/main/java/com/baeldung/memoryleaks/internedstrings/ReadStringFromFileUtil.java rename to core-java-perf/src/main/java/com/baeldung/memoryleaks/internedstrings/ReadStringFromFileUtil.java diff --git a/core-java/src/main/java/com/baeldung/memoryleaks/internedstrings/StringObject.java b/core-java-perf/src/main/java/com/baeldung/memoryleaks/internedstrings/StringObject.java similarity index 100% rename from core-java/src/main/java/com/baeldung/memoryleaks/internedstrings/StringObject.java rename to core-java-perf/src/main/java/com/baeldung/memoryleaks/internedstrings/StringObject.java diff --git a/core-java/src/main/java/com/baeldung/memoryleaks/staticfields/NonStaticFieldsDemo.java b/core-java-perf/src/main/java/com/baeldung/memoryleaks/staticfields/NonStaticFieldsDemo.java similarity index 100% rename from core-java/src/main/java/com/baeldung/memoryleaks/staticfields/NonStaticFieldsDemo.java rename to core-java-perf/src/main/java/com/baeldung/memoryleaks/staticfields/NonStaticFieldsDemo.java diff --git a/core-java/src/main/java/com/baeldung/memoryleaks/staticfields/StaticFieldsDemo.java b/core-java-perf/src/main/java/com/baeldung/memoryleaks/staticfields/StaticFieldsDemo.java similarity index 100% rename from core-java/src/main/java/com/baeldung/memoryleaks/staticfields/StaticFieldsDemo.java rename to core-java-perf/src/main/java/com/baeldung/memoryleaks/staticfields/StaticFieldsDemo.java diff --git a/core-java/src/main/java/com/baeldung/outofmemoryerror/OutOfMemoryGCLimitExceed.java b/core-java-perf/src/main/java/com/baeldung/outofmemoryerror/OutOfMemoryGCLimitExceed.java similarity index 100% rename from core-java/src/main/java/com/baeldung/outofmemoryerror/OutOfMemoryGCLimitExceed.java rename to core-java-perf/src/main/java/com/baeldung/outofmemoryerror/OutOfMemoryGCLimitExceed.java diff --git a/core-java-perf/src/main/resources/logback.xml b/core-java-perf/src/main/resources/logback.xml new file mode 100644 index 0000000000..56af2d397e --- /dev/null +++ b/core-java-perf/src/main/resources/logback.xml @@ -0,0 +1,19 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/memoryleaks/equalshashcode/PersonMemoryLeakUnitTest.java b/core-java-perf/src/test/java/com/baeldung/memoryleaks/equalshashcode/PersonMemoryLeakUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/memoryleaks/equalshashcode/PersonMemoryLeakUnitTest.java rename to core-java-perf/src/test/java/com/baeldung/memoryleaks/equalshashcode/PersonMemoryLeakUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/memoryleaks/finalize/FinalizeMemoryLeakUnitTest.java b/core-java-perf/src/test/java/com/baeldung/memoryleaks/finalize/FinalizeMemoryLeakUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/memoryleaks/finalize/FinalizeMemoryLeakUnitTest.java rename to core-java-perf/src/test/java/com/baeldung/memoryleaks/finalize/FinalizeMemoryLeakUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/memoryleaks/innerclass/StaticInnerClassMemoryLeakUnitTest.java b/core-java-perf/src/test/java/com/baeldung/memoryleaks/innerclass/StaticInnerClassMemoryLeakUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/memoryleaks/innerclass/StaticInnerClassMemoryLeakUnitTest.java rename to core-java-perf/src/test/java/com/baeldung/memoryleaks/innerclass/StaticInnerClassMemoryLeakUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/memoryleaks/internedstrings/StringInternMemoryLeakUnitTest.java b/core-java-perf/src/test/java/com/baeldung/memoryleaks/internedstrings/StringInternMemoryLeakUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/memoryleaks/internedstrings/StringInternMemoryLeakUnitTest.java rename to core-java-perf/src/test/java/com/baeldung/memoryleaks/internedstrings/StringInternMemoryLeakUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/memoryleaks/staticfields/NonStaticFieldsMemoryLeakUnitTest.java b/core-java-perf/src/test/java/com/baeldung/memoryleaks/staticfields/NonStaticFieldsMemoryLeakUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/memoryleaks/staticfields/NonStaticFieldsMemoryLeakUnitTest.java rename to core-java-perf/src/test/java/com/baeldung/memoryleaks/staticfields/NonStaticFieldsMemoryLeakUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/memoryleaks/staticfields/StaticFieldsMemoryLeakUnitTest.java b/core-java-perf/src/test/java/com/baeldung/memoryleaks/staticfields/StaticFieldsMemoryLeakUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/memoryleaks/staticfields/StaticFieldsMemoryLeakUnitTest.java rename to core-java-perf/src/test/java/com/baeldung/memoryleaks/staticfields/StaticFieldsMemoryLeakUnitTest.java diff --git a/core-java-sun/README.md b/core-java-sun/README.md index 9cf8b26f1b..e2dba76b41 100644 --- a/core-java-sun/README.md +++ b/core-java-sun/README.md @@ -4,3 +4,4 @@ ### Relevant Articles: - [Creating a Java Compiler Plugin](http://www.baeldung.com/java-build-compiler-plugin) +- [Guide to sun.misc.Unsafe](http://www.baeldung.com/java-unsafe) \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/unsafe/CASCounter.java b/core-java-sun/src/test/java/com/baeldung/unsafe/CASCounter.java similarity index 100% rename from core-java/src/test/java/com/baeldung/unsafe/CASCounter.java rename to core-java-sun/src/test/java/com/baeldung/unsafe/CASCounter.java diff --git a/core-java/src/test/java/com/baeldung/unsafe/OffHeapArray.java b/core-java-sun/src/test/java/com/baeldung/unsafe/OffHeapArray.java similarity index 100% rename from core-java/src/test/java/com/baeldung/unsafe/OffHeapArray.java rename to core-java-sun/src/test/java/com/baeldung/unsafe/OffHeapArray.java diff --git a/core-java/src/test/java/com/baeldung/unsafe/UnsafeUnitTest.java b/core-java-sun/src/test/java/com/baeldung/unsafe/UnsafeUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/unsafe/UnsafeUnitTest.java rename to core-java-sun/src/test/java/com/baeldung/unsafe/UnsafeUnitTest.java diff --git a/core-java/README.md b/core-java/README.md index b0e8f81e1f..21c58bb880 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -6,19 +6,14 @@ - [Java Timer](http://www.baeldung.com/java-timer-and-timertask) - [How to Run a Shell Command in Java](http://www.baeldung.com/run-shell-command-in-java) - [MD5 Hashing in Java](http://www.baeldung.com/java-md5) -- [A Guide to Java Sockets](http://www.baeldung.com/a-guide-to-java-sockets) - [How to Print Screen in Java](http://www.baeldung.com/print-screen-in-java) - [A Guide To Java Regular Expressions API](http://www.baeldung.com/regular-expressions-java) - [Getting Started with Java Properties](http://www.baeldung.com/java-properties) - [Pattern Search with Grep in Java](http://www.baeldung.com/grep-in-java) -- [URL Encoding and Decoding in Java](http://www.baeldung.com/java-url-encoding-decoding) - [How to Create an Executable JAR with Maven](http://www.baeldung.com/executable-jar-with-maven) -- [Basic Introduction to JMX](http://www.baeldung.com/java-management-extensions) - [Introduction to Nashorn](http://www.baeldung.com/java-nashorn) - [Java Money and the Currency API](http://www.baeldung.com/java-money-and-currency) - [JVM Log Forging](http://www.baeldung.com/jvm-log-forging) -- [Guide to sun.misc.Unsafe](http://www.baeldung.com/java-unsafe) -- [How to Perform a Simple HTTP Request in Java](http://www.baeldung.com/java-http-request) - [How to Add a Single Element to a Stream](http://www.baeldung.com/java-stream-append-prepend) - [How to Find all Getters Returning Null](http://www.baeldung.com/java-getters-returning-null) - [How to Get a Name of a Method Being Executed?](http://www.baeldung.com/java-name-of-executing-method) @@ -26,7 +21,6 @@ - [Guide to UUID in Java](http://www.baeldung.com/java-uuid) - [Guide to Escaping Characters in Java RegExps](http://www.baeldung.com/java-regexp-escape-char) - [Difference between URL and URI](http://www.baeldung.com/java-url-vs-uri) -- [OutOfMemoryError: GC Overhead Limit Exceeded](http://www.baeldung.com/java-gc-overhead-limit-exceeded) - [Creating a Java Compiler Plugin](http://www.baeldung.com/java-build-compiler-plugin) - [Quick Guide to Java Stack](http://www.baeldung.com/java-stack) - [Guide to java.util.Formatter](http://www.baeldung.com/java-string-formatter) @@ -57,11 +51,9 @@ - [Add a Character to a String at a Given Position](https://www.baeldung.com/java-add-character-to-string) - [Calculating the nth Root in Java](https://www.baeldung.com/java-nth-root) - [Convert Double to String, Removing Decimal Places](https://www.baeldung.com/java-double-to-string) -- [Different Ways to Capture Java Heap Dumps](https://www.baeldung.com/java-heap-dump-capture) - [ZoneOffset in Java](https://www.baeldung.com/java-zone-offset) - [Hashing a Password in Java](https://www.baeldung.com/java-password-hashing) - [Merging java.util.Properties Objects](https://www.baeldung.com/java-merging-properties) -- [Understanding Memory Leaks in Java](https://www.baeldung.com/java-memory-leaks) - [A Guide to SimpleDateFormat](https://www.baeldung.com/java-simple-date-format) - [SSL Handshake Failures](https://www.baeldung.com/java-ssl-handshake-failures) - [Changing the Order in a Sum Operation Can Produce Different Results?](https://www.baeldung.com/java-floating-point-sum-order) From 9def7653f7cd2ce7e53a3d40af5ddb3fb3620783 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sat, 29 Dec 2018 21:59:01 +0530 Subject: [PATCH 215/359] [BAEL-11401] - Removed spring web dependency from core-java --- core-java/pom.xml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/core-java/pom.xml b/core-java/pom.xml index 442d378dab..b4f0643aa8 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -121,11 +121,6 @@ jmh-generator-annprocess ${jmh-generator-annprocess.version} - - org.springframework - spring-web - ${springframework.spring-web.version} - com.h2database h2 @@ -500,7 +495,6 @@ 2.21.0 - 4.3.4.RELEASE 1.1 1.4.197 From ef0c49beaa4a49aa8390947ae2d606fa42ac61e2 Mon Sep 17 00:00:00 2001 From: eric-martin Date: Sat, 29 Dec 2018 10:32:29 -0600 Subject: [PATCH 216/359] Fixed TestLauncher test name and config property name --- .../junit-5/src/test/java/com/baeldung/TestLauncher.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/TestLauncher.java b/testing-modules/junit-5/src/test/java/com/baeldung/TestLauncher.java index f9766d2bd9..2e477084aa 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/TestLauncher.java +++ b/testing-modules/junit-5/src/test/java/com/baeldung/TestLauncher.java @@ -18,9 +18,9 @@ public class TestLauncher { //@formatter:off LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request() - .selectors(selectClass("com.baeldung.EmployeesTest")) + .selectors(selectClass("com.baeldung.EmployeesUnitTest")) .configurationParameter("junit.conditions.deactivate", "com.baeldung.extensions.*") - .configurationParameter("junit.extensions.autodetection.enabled", "true") + .configurationParameter("junit.jupiter.extensions.autodetection.enabled", "true") .build(); //@formatter:on From 0a64e26a8fc0e4121159d61a3bd42a419c1acc30 Mon Sep 17 00:00:00 2001 From: DOHA Date: Sat, 29 Dec 2018 20:29:20 +0200 Subject: [PATCH 217/359] cleanup --- .../src/main/java/com/baeldung/boot/Application.java | 2 +- .../com/baeldung/boot/controller/rest/WebController.java | 6 +++--- .../{org => com}/baeldung/boot/LoadContextTest.groovy | 4 ++-- .../{org => com}/baeldung/boot/WebControllerTest.groovy | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) rename spring-boot-testing/src/test/groovy/{org => com}/baeldung/boot/LoadContextTest.groovy (87%) rename spring-boot-testing/src/test/groovy/{org => com}/baeldung/boot/WebControllerTest.groovy (98%) diff --git a/spring-boot-testing/src/main/java/com/baeldung/boot/Application.java b/spring-boot-testing/src/main/java/com/baeldung/boot/Application.java index c1b6558b26..cb0d0c1532 100644 --- a/spring-boot-testing/src/main/java/com/baeldung/boot/Application.java +++ b/spring-boot-testing/src/main/java/com/baeldung/boot/Application.java @@ -1,4 +1,4 @@ -package org.baeldung.boot; +package com.baeldung.boot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-boot-testing/src/main/java/com/baeldung/boot/controller/rest/WebController.java b/spring-boot-testing/src/main/java/com/baeldung/boot/controller/rest/WebController.java index 5b65599e00..7247ca3dfa 100644 --- a/spring-boot-testing/src/main/java/com/baeldung/boot/controller/rest/WebController.java +++ b/spring-boot-testing/src/main/java/com/baeldung/boot/controller/rest/WebController.java @@ -1,4 +1,6 @@ -package org.baeldung.boot.controller.rest; +package com.baeldung.boot.controller.rest; + +import java.util.Optional; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.DeleteMapping; @@ -9,8 +11,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; -import java.util.Optional; - @RestController @RequestMapping("/hello") public class WebController { diff --git a/spring-boot-testing/src/test/groovy/org/baeldung/boot/LoadContextTest.groovy b/spring-boot-testing/src/test/groovy/com/baeldung/boot/LoadContextTest.groovy similarity index 87% rename from spring-boot-testing/src/test/groovy/org/baeldung/boot/LoadContextTest.groovy rename to spring-boot-testing/src/test/groovy/com/baeldung/boot/LoadContextTest.groovy index 2d4a7ca2cf..85b0a4b89b 100644 --- a/spring-boot-testing/src/test/groovy/org/baeldung/boot/LoadContextTest.groovy +++ b/spring-boot-testing/src/test/groovy/com/baeldung/boot/LoadContextTest.groovy @@ -1,6 +1,6 @@ -package org.baeldung.boot +package com.baeldung.boot -import org.baeldung.boot.controller.rest.WebController +import com.baeldung.boot.controller.rest.WebController import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest import spock.lang.Narrative diff --git a/spring-boot-testing/src/test/groovy/org/baeldung/boot/WebControllerTest.groovy b/spring-boot-testing/src/test/groovy/com/baeldung/boot/WebControllerTest.groovy similarity index 98% rename from spring-boot-testing/src/test/groovy/org/baeldung/boot/WebControllerTest.groovy rename to spring-boot-testing/src/test/groovy/com/baeldung/boot/WebControllerTest.groovy index fe1b34ab8c..119992acc3 100644 --- a/spring-boot-testing/src/test/groovy/org/baeldung/boot/WebControllerTest.groovy +++ b/spring-boot-testing/src/test/groovy/com/baeldung/boot/WebControllerTest.groovy @@ -1,4 +1,4 @@ -package org.baeldung.boot +package com.baeldung.boot import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc From d1fb8935e794e1c171754defb478762954f8d5cd Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 30 Dec 2018 00:00:21 +0530 Subject: [PATCH 218/359] [BAEL-10836] - Removed CollectionsEmpty from core-java-collections module --- .../java/collections/CollectionsEmpty.java | 26 ------------------- 1 file changed, 26 deletions(-) delete mode 100644 core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsEmpty.java diff --git a/core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsEmpty.java b/core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsEmpty.java deleted file mode 100644 index 09ecebe47b..0000000000 --- a/core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsEmpty.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.baeldung.java.collections; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import org.junit.Assert; -import org.junit.Test; - -class CollectionsEmpty { - - @Test - public void givenArrayList_whenAddingElement_addsNewElement() { - ArrayList mutableList = new ArrayList<>(); - mutableList.add("test"); - - Assert.assertEquals(mutableList.size(), 1); - Assert.assertEquals(mutableList.get(0), "test"); - } - - @Test(expected = UnsupportedOperationException.class) - public void givenCollectionsEmptyList_whenAddingElement_throwsUnsupportedOperationException() { - List immutableList = Collections.emptyList(); - immutableList.add("test"); - } - -} From b4ff5c46f08a21ea01ffdca6859286a3e351bdb3 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 30 Dec 2018 01:19:12 +0530 Subject: [PATCH 219/359] [BAEL-11402] - Moved articles out of core-java (part 3) --- core-java-io/README.md | 2 + core-java-io/pom.xml | 14 +++++ .../com/baeldung/extension/Extension.java | 0 .../baeldung/extension/ExtensionUnitTest.java | 0 .../java/mimetype/MimeTypeUnitTest.java | 0 .../src/test/resources/META-INF/mime.types | 0 .../src/test/resources/product.png | Bin core-java-security/README.md | 11 ++++ core-java-security/pom.xml | 55 ++++++++++++++++++ .../java/com/baeldung/cipher/Encryptor.java | 0 .../encrypt/FileEncrypterDecrypter.java | 0 .../com/baeldung/hashing/SHA256Hashing.java | 0 .../com/baeldung/keystore/JavaKeyStore.java | 0 .../passwordhashing/PBKDF2Hasher.java | 0 .../passwordhashing/SHA512Hasher.java | 0 .../passwordhashing/SimplePBKDF2Hasher.java | 0 .../com/baeldung/ssl/SecureConnection.java | 0 .../baeldung/ssl/example/SimpleClient.java | 0 .../baeldung/ssl/example/SimpleServer.java | 0 .../src/main/resources/logback.xml | 19 ++++++ .../baeldung/cipher/EncryptorUnitTest.java | 0 ...FileEncrypterDecrypterIntegrationTest.java | 0 .../hashing/SHA256HashingUnitTest.java | 0 .../keystore/JavaKeyStoreUnitTest.java | 0 .../passwordhashing/PBKDF2HasherUnitTest.java | 0 .../passwordhashing/SHA512HasherUnitTest.java | 0 .../baeldung/java/md5/JavaMD5UnitTest.java | 0 .../src/test/resources/test_md5.txt | 0 core-java/README.md | 9 --- core-java/pom.xml | 27 --------- guava/README.md | 1 - pom.xml | 2 + 32 files changed, 103 insertions(+), 37 deletions(-) rename {core-java => core-java-io}/src/main/java/com/baeldung/extension/Extension.java (100%) rename {core-java => core-java-io}/src/test/java/com/baeldung/extension/ExtensionUnitTest.java (100%) rename {core-java => core-java-io}/src/test/java/com/baeldung/java/mimetype/MimeTypeUnitTest.java (100%) rename {core-java => core-java-io}/src/test/resources/META-INF/mime.types (100%) rename {core-java => core-java-io}/src/test/resources/product.png (100%) create mode 100644 core-java-security/README.md create mode 100644 core-java-security/pom.xml rename {core-java => core-java-security}/src/main/java/com/baeldung/cipher/Encryptor.java (100%) rename {core-java => core-java-security}/src/main/java/com/baeldung/encrypt/FileEncrypterDecrypter.java (100%) rename {core-java => core-java-security}/src/main/java/com/baeldung/hashing/SHA256Hashing.java (100%) rename {core-java => core-java-security}/src/main/java/com/baeldung/keystore/JavaKeyStore.java (100%) rename {core-java => core-java-security}/src/main/java/com/baeldung/passwordhashing/PBKDF2Hasher.java (100%) rename {core-java => core-java-security}/src/main/java/com/baeldung/passwordhashing/SHA512Hasher.java (100%) rename {core-java => core-java-security}/src/main/java/com/baeldung/passwordhashing/SimplePBKDF2Hasher.java (100%) rename {core-java => core-java-security}/src/main/java/com/baeldung/ssl/SecureConnection.java (100%) rename {core-java => core-java-security}/src/main/java/com/baeldung/ssl/example/SimpleClient.java (100%) rename {core-java => core-java-security}/src/main/java/com/baeldung/ssl/example/SimpleServer.java (100%) create mode 100644 core-java-security/src/main/resources/logback.xml rename {core-java => core-java-security}/src/test/java/com/baeldung/cipher/EncryptorUnitTest.java (100%) rename {core-java => core-java-security}/src/test/java/com/baeldung/encrypt/FileEncrypterDecrypterIntegrationTest.java (100%) rename {core-java => core-java-security}/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java (100%) rename {core-java => core-java-security}/src/test/java/com/baeldung/keystore/JavaKeyStoreUnitTest.java (100%) rename {core-java => core-java-security}/src/test/java/com/baeldung/passwordhashing/PBKDF2HasherUnitTest.java (100%) rename {core-java => core-java-security}/src/test/java/com/baeldung/passwordhashing/SHA512HasherUnitTest.java (100%) rename {core-java => core-java-security}/src/test/java/org/baeldung/java/md5/JavaMD5UnitTest.java (100%) rename {core-java => core-java-security}/src/test/resources/test_md5.txt (100%) diff --git a/core-java-io/README.md b/core-java-io/README.md index 3d028783ed..2ad980ca6a 100644 --- a/core-java-io/README.md +++ b/core-java-io/README.md @@ -35,3 +35,5 @@ - [Guide to Java OutputStream](https://www.baeldung.com/java-outputstream) - [Reading a CSV File into an Array](https://www.baeldung.com/java-csv-file-array) - [Guide to BufferedReader](https://www.baeldung.com/java-buffered-reader) +- [How to Get the File Extension of a File in Java](http://www.baeldung.com/java-file-extension) +- [Getting a File’s Mime Type in Java](http://www.baeldung.com/java-file-mime-type) \ No newline at end of file diff --git a/core-java-io/pom.xml b/core-java-io/pom.xml index ac5f1f7c2e..1f2d52de81 100644 --- a/core-java-io/pom.xml +++ b/core-java-io/pom.xml @@ -160,6 +160,17 @@ ${opencsv.version} test + + + org.apache.tika + tika-core + ${tika.version} + + + net.sf.jmimemagic + jmimemagic + ${jmime-magic.version} + @@ -264,6 +275,9 @@ 2.1.0.1 1.19 2.4.5 + + 1.18 + 0.1.5 \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/extension/Extension.java b/core-java-io/src/main/java/com/baeldung/extension/Extension.java similarity index 100% rename from core-java/src/main/java/com/baeldung/extension/Extension.java rename to core-java-io/src/main/java/com/baeldung/extension/Extension.java diff --git a/core-java/src/test/java/com/baeldung/extension/ExtensionUnitTest.java b/core-java-io/src/test/java/com/baeldung/extension/ExtensionUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/extension/ExtensionUnitTest.java rename to core-java-io/src/test/java/com/baeldung/extension/ExtensionUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/java/mimetype/MimeTypeUnitTest.java b/core-java-io/src/test/java/com/baeldung/java/mimetype/MimeTypeUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/java/mimetype/MimeTypeUnitTest.java rename to core-java-io/src/test/java/com/baeldung/java/mimetype/MimeTypeUnitTest.java diff --git a/core-java/src/test/resources/META-INF/mime.types b/core-java-io/src/test/resources/META-INF/mime.types similarity index 100% rename from core-java/src/test/resources/META-INF/mime.types rename to core-java-io/src/test/resources/META-INF/mime.types diff --git a/core-java/src/test/resources/product.png b/core-java-io/src/test/resources/product.png similarity index 100% rename from core-java/src/test/resources/product.png rename to core-java-io/src/test/resources/product.png diff --git a/core-java-security/README.md b/core-java-security/README.md new file mode 100644 index 0000000000..415171094b --- /dev/null +++ b/core-java-security/README.md @@ -0,0 +1,11 @@ +## Core Java Security + +### Relevant Articles: +- [MD5 Hashing in Java](http://www.baeldung.com/java-md5) +- [Guide to the Cipher Class](http://www.baeldung.com/java-cipher-class) +- [Introduction to SSL in Java](http://www.baeldung.com/java-ssl) +- [Java KeyStore API](http://www.baeldung.com/java-keystore) +- [Encrypting and Decrypting Files in Java](http://www.baeldung.com/java-cipher-input-output-stream) +- [Hashing a Password in Java](https://www.baeldung.com/java-password-hashing) +- [SSL Handshake Failures](https://www.baeldung.com/java-ssl-handshake-failures) +- [SHA-256 Hashing in Java](https://www.baeldung.com/sha-256-hashing-java) \ No newline at end of file diff --git a/core-java-security/pom.xml b/core-java-security/pom.xml new file mode 100644 index 0000000000..cf91121465 --- /dev/null +++ b/core-java-security/pom.xml @@ -0,0 +1,55 @@ + + 4.0.0 + com.baeldung + core-java-security + 0.1.0-SNAPSHOT + jar + core-java-security + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + org.assertj + assertj-core + ${assertj-core.version} + test + + + + commons-codec + commons-codec + ${commons-codec.version} + + + org.bouncycastle + bcprov-jdk15on + ${bouncycastle.version} + + + + + + + 3.8.1 + 1.55 + 1.10 + + + 3.10.0 + + + + diff --git a/core-java/src/main/java/com/baeldung/cipher/Encryptor.java b/core-java-security/src/main/java/com/baeldung/cipher/Encryptor.java similarity index 100% rename from core-java/src/main/java/com/baeldung/cipher/Encryptor.java rename to core-java-security/src/main/java/com/baeldung/cipher/Encryptor.java diff --git a/core-java/src/main/java/com/baeldung/encrypt/FileEncrypterDecrypter.java b/core-java-security/src/main/java/com/baeldung/encrypt/FileEncrypterDecrypter.java similarity index 100% rename from core-java/src/main/java/com/baeldung/encrypt/FileEncrypterDecrypter.java rename to core-java-security/src/main/java/com/baeldung/encrypt/FileEncrypterDecrypter.java diff --git a/core-java/src/main/java/com/baeldung/hashing/SHA256Hashing.java b/core-java-security/src/main/java/com/baeldung/hashing/SHA256Hashing.java similarity index 100% rename from core-java/src/main/java/com/baeldung/hashing/SHA256Hashing.java rename to core-java-security/src/main/java/com/baeldung/hashing/SHA256Hashing.java diff --git a/core-java/src/main/java/com/baeldung/keystore/JavaKeyStore.java b/core-java-security/src/main/java/com/baeldung/keystore/JavaKeyStore.java similarity index 100% rename from core-java/src/main/java/com/baeldung/keystore/JavaKeyStore.java rename to core-java-security/src/main/java/com/baeldung/keystore/JavaKeyStore.java diff --git a/core-java/src/main/java/com/baeldung/passwordhashing/PBKDF2Hasher.java b/core-java-security/src/main/java/com/baeldung/passwordhashing/PBKDF2Hasher.java similarity index 100% rename from core-java/src/main/java/com/baeldung/passwordhashing/PBKDF2Hasher.java rename to core-java-security/src/main/java/com/baeldung/passwordhashing/PBKDF2Hasher.java diff --git a/core-java/src/main/java/com/baeldung/passwordhashing/SHA512Hasher.java b/core-java-security/src/main/java/com/baeldung/passwordhashing/SHA512Hasher.java similarity index 100% rename from core-java/src/main/java/com/baeldung/passwordhashing/SHA512Hasher.java rename to core-java-security/src/main/java/com/baeldung/passwordhashing/SHA512Hasher.java diff --git a/core-java/src/main/java/com/baeldung/passwordhashing/SimplePBKDF2Hasher.java b/core-java-security/src/main/java/com/baeldung/passwordhashing/SimplePBKDF2Hasher.java similarity index 100% rename from core-java/src/main/java/com/baeldung/passwordhashing/SimplePBKDF2Hasher.java rename to core-java-security/src/main/java/com/baeldung/passwordhashing/SimplePBKDF2Hasher.java diff --git a/core-java/src/main/java/com/baeldung/ssl/SecureConnection.java b/core-java-security/src/main/java/com/baeldung/ssl/SecureConnection.java similarity index 100% rename from core-java/src/main/java/com/baeldung/ssl/SecureConnection.java rename to core-java-security/src/main/java/com/baeldung/ssl/SecureConnection.java diff --git a/core-java/src/main/java/com/baeldung/ssl/example/SimpleClient.java b/core-java-security/src/main/java/com/baeldung/ssl/example/SimpleClient.java similarity index 100% rename from core-java/src/main/java/com/baeldung/ssl/example/SimpleClient.java rename to core-java-security/src/main/java/com/baeldung/ssl/example/SimpleClient.java diff --git a/core-java/src/main/java/com/baeldung/ssl/example/SimpleServer.java b/core-java-security/src/main/java/com/baeldung/ssl/example/SimpleServer.java similarity index 100% rename from core-java/src/main/java/com/baeldung/ssl/example/SimpleServer.java rename to core-java-security/src/main/java/com/baeldung/ssl/example/SimpleServer.java diff --git a/core-java-security/src/main/resources/logback.xml b/core-java-security/src/main/resources/logback.xml new file mode 100644 index 0000000000..56af2d397e --- /dev/null +++ b/core-java-security/src/main/resources/logback.xml @@ -0,0 +1,19 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/cipher/EncryptorUnitTest.java b/core-java-security/src/test/java/com/baeldung/cipher/EncryptorUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/cipher/EncryptorUnitTest.java rename to core-java-security/src/test/java/com/baeldung/cipher/EncryptorUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/encrypt/FileEncrypterDecrypterIntegrationTest.java b/core-java-security/src/test/java/com/baeldung/encrypt/FileEncrypterDecrypterIntegrationTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/encrypt/FileEncrypterDecrypterIntegrationTest.java rename to core-java-security/src/test/java/com/baeldung/encrypt/FileEncrypterDecrypterIntegrationTest.java diff --git a/core-java/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java b/core-java-security/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java rename to core-java-security/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/keystore/JavaKeyStoreUnitTest.java b/core-java-security/src/test/java/com/baeldung/keystore/JavaKeyStoreUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/keystore/JavaKeyStoreUnitTest.java rename to core-java-security/src/test/java/com/baeldung/keystore/JavaKeyStoreUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/passwordhashing/PBKDF2HasherUnitTest.java b/core-java-security/src/test/java/com/baeldung/passwordhashing/PBKDF2HasherUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/passwordhashing/PBKDF2HasherUnitTest.java rename to core-java-security/src/test/java/com/baeldung/passwordhashing/PBKDF2HasherUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/passwordhashing/SHA512HasherUnitTest.java b/core-java-security/src/test/java/com/baeldung/passwordhashing/SHA512HasherUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/passwordhashing/SHA512HasherUnitTest.java rename to core-java-security/src/test/java/com/baeldung/passwordhashing/SHA512HasherUnitTest.java diff --git a/core-java/src/test/java/org/baeldung/java/md5/JavaMD5UnitTest.java b/core-java-security/src/test/java/org/baeldung/java/md5/JavaMD5UnitTest.java similarity index 100% rename from core-java/src/test/java/org/baeldung/java/md5/JavaMD5UnitTest.java rename to core-java-security/src/test/java/org/baeldung/java/md5/JavaMD5UnitTest.java diff --git a/core-java/src/test/resources/test_md5.txt b/core-java-security/src/test/resources/test_md5.txt similarity index 100% rename from core-java/src/test/resources/test_md5.txt rename to core-java-security/src/test/resources/test_md5.txt diff --git a/core-java/README.md b/core-java/README.md index 21c58bb880..a3dd7fb2b7 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -5,7 +5,6 @@ ### Relevant Articles: - [Java Timer](http://www.baeldung.com/java-timer-and-timertask) - [How to Run a Shell Command in Java](http://www.baeldung.com/run-shell-command-in-java) -- [MD5 Hashing in Java](http://www.baeldung.com/java-md5) - [How to Print Screen in Java](http://www.baeldung.com/print-screen-in-java) - [A Guide To Java Regular Expressions API](http://www.baeldung.com/regular-expressions-java) - [Getting Started with Java Properties](http://www.baeldung.com/java-properties) @@ -24,7 +23,6 @@ - [Creating a Java Compiler Plugin](http://www.baeldung.com/java-build-compiler-plugin) - [Quick Guide to Java Stack](http://www.baeldung.com/java-stack) - [Guide to java.util.Formatter](http://www.baeldung.com/java-string-formatter) -- [Guide to the Cipher Class](http://www.baeldung.com/java-cipher-class) - [Compiling Java *.class Files with javac](http://www.baeldung.com/javac) - [A Guide to Iterator in Java](http://www.baeldung.com/java-iterator) - [Introduction to Javadoc](http://www.baeldung.com/javadoc) @@ -35,27 +33,20 @@ - [What is the serialVersionUID?](http://www.baeldung.com/java-serial-version-uid) - [A Guide to the ResourceBundle](http://www.baeldung.com/java-resourcebundle) - [Class Loaders in Java](http://www.baeldung.com/java-classloaders) -- [Introduction to SSL in Java](http://www.baeldung.com/java-ssl) -- [Java KeyStore API](http://www.baeldung.com/java-keystore) - [Double-Checked Locking with Singleton](http://www.baeldung.com/java-singleton-double-checked-locking) - [Guide to Java Clock Class](http://www.baeldung.com/java-clock) - [Importance of Main Manifest Attribute in a Self-Executing JAR](http://www.baeldung.com/java-jar-executable-manifest-main-class) -- [How to Get the File Extension of a File in Java](http://www.baeldung.com/java-file-extension) - [Java Global Exception Handler](http://www.baeldung.com/java-global-exception-handler) -- [Encrypting and Decrypting Files in Java](http://www.baeldung.com/java-cipher-input-output-stream) - [How to Get the Size of an Object in Java](http://www.baeldung.com/java-size-of-object) - [Guide to Java Instrumentation](http://www.baeldung.com/java-instrumentation) -- [Getting a File’s Mime Type in Java](http://www.baeldung.com/java-file-mime-type) - [Common Java Exceptions](http://www.baeldung.com/java-common-exceptions) - [Throw Exception in Optional in Java 8](https://www.baeldung.com/java-optional-throw-exception) - [Add a Character to a String at a Given Position](https://www.baeldung.com/java-add-character-to-string) - [Calculating the nth Root in Java](https://www.baeldung.com/java-nth-root) - [Convert Double to String, Removing Decimal Places](https://www.baeldung.com/java-double-to-string) - [ZoneOffset in Java](https://www.baeldung.com/java-zone-offset) -- [Hashing a Password in Java](https://www.baeldung.com/java-password-hashing) - [Merging java.util.Properties Objects](https://www.baeldung.com/java-merging-properties) - [A Guide to SimpleDateFormat](https://www.baeldung.com/java-simple-date-format) -- [SSL Handshake Failures](https://www.baeldung.com/java-ssl-handshake-failures) - [Changing the Order in a Sum Operation Can Produce Different Results?](https://www.baeldung.com/java-floating-point-sum-order) - [Java – Try with Resources](https://www.baeldung.com/java-try-with-resources) - [Abstract Classes in Java](https://www.baeldung.com/java-abstract-class) diff --git a/core-java/pom.xml b/core-java/pom.xml index b4f0643aa8..6c58653d5a 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -24,11 +24,6 @@ commons-lang3 ${commons-lang3.version} - - org.bouncycastle - bcprov-jdk15on - ${bouncycastle.version} - org.unix4j unix4j-command @@ -75,12 +70,6 @@ ${assertj-core.version} test - - - commons-codec - commons-codec - ${commons-codec.version} - org.javamoney moneta @@ -126,17 +115,6 @@ h2 ${h2database.version} - - - org.apache.tika - tika-core - ${tika.version} - - - net.sf.jmimemagic - jmimemagic - ${jmime-magic.version} - org.javassist @@ -477,8 +455,6 @@ 3.5 - 1.55 - 1.10 2.5 3.6.1 1.0.3 @@ -509,9 +485,6 @@ 2.0.3.RELEASE 1.6.0 61.1 - - 1.18 - 0.1.5 3.21.0-GA diff --git a/guava/README.md b/guava/README.md index 0346d34903..60754dbe57 100644 --- a/guava/README.md +++ b/guava/README.md @@ -18,4 +18,3 @@ - [Hamcrest Text Matchers](http://www.baeldung.com/hamcrest-text-matchers) - [Quick Guide to the Guava RateLimiter](http://www.baeldung.com/guava-rate-limiter) - [Hamcrest File Matchers](https://www.baeldung.com/hamcrest-file-matchers) -- [SHA-256 Hashing in Java](https://www.baeldung.com/sha-256-hashing-java) diff --git a/pom.xml b/pom.xml index 923cbab302..e8ff86665c 100644 --- a/pom.xml +++ b/pom.xml @@ -383,6 +383,7 @@ core-java-concurrency-basic core-java-concurrency-collections core-java-io + core-java-security core-java-lang-syntax core-java-lang core-java-lang-oop @@ -1095,6 +1096,7 @@ core-java-concurrency-basic core-java-concurrency-collections core-java-io + core-java-security core-java-lang-syntax core-java-lang core-java-lang-oop From 40e26514f431478b98e98f42c4a61faed23f908e Mon Sep 17 00:00:00 2001 From: geroza Date: Sat, 29 Dec 2018 19:09:35 -0200 Subject: [PATCH 220/359] * Renamed IntegrationTests that needed manual configurations to run succesfully as ManualTests * Renamed Integrationtests that needed the project (or related project, in case of client-server) as LiveTests * Fixed migration of mustache module to make it compatible with spring-boot 2.1 --- mustache/pom.xml | 5 +++++ mustache/src/main/resources/application.properties | 1 + ...textIntegrationTest.java => SpringContextManualTest.java} | 2 +- ...textIntegrationTest.java => SpringContextManualTest.java} | 2 +- ...textIntegrationTest.java => SpringContextManualTest.java} | 2 +- ...textIntegrationTest.java => SpringContextManualTest.java} | 2 +- ...ontextIntegrationTest.java => SpringContextLiveTest.java} | 2 +- 7 files changed, 11 insertions(+), 5 deletions(-) rename spring-amqp-simple/src/test/java/org/baeldung/{SpringContextIntegrationTest.java => SpringContextManualTest.java} (90%) rename spring-kafka/src/test/java/org/baeldung/{SpringContextIntegrationTest.java => SpringContextManualTest.java} (90%) rename spring-remoting/remoting-amqp/remoting-amqp-server/src/test/java/org/baeldung/{SpringContextIntegrationTest.java => SpringContextManualTest.java} (90%) rename spring-remoting/remoting-jms/remoting-jms-server/src/test/java/org/baeldung/{SpringContextIntegrationTest.java => SpringContextManualTest.java} (90%) rename spring-remoting/remoting-rmi/remoting-rmi-client/src/test/java/org/baeldung/{SpringContextIntegrationTest.java => SpringContextLiveTest.java} (90%) diff --git a/mustache/pom.xml b/mustache/pom.xml index 0c35345100..1b89997996 100644 --- a/mustache/pom.xml +++ b/mustache/pom.xml @@ -30,6 +30,11 @@ log4j ${log4j.version} + + + org.springframework.boot + spring-boot-starter-web + org.springframework.boot diff --git a/mustache/src/main/resources/application.properties b/mustache/src/main/resources/application.properties index e69de29bb2..011bbae980 100644 --- a/mustache/src/main/resources/application.properties +++ b/mustache/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.mustache.suffix:.html \ No newline at end of file diff --git a/spring-amqp-simple/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-amqp-simple/src/test/java/org/baeldung/SpringContextManualTest.java similarity index 90% rename from spring-amqp-simple/src/test/java/org/baeldung/SpringContextIntegrationTest.java rename to spring-amqp-simple/src/test/java/org/baeldung/SpringContextManualTest.java index f134074cf8..03cb34eeb5 100644 --- a/spring-amqp-simple/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ b/spring-amqp-simple/src/test/java/org/baeldung/SpringContextManualTest.java @@ -9,7 +9,7 @@ import com.baeldung.springamqpsimple.SpringAmqpApplication; @RunWith(SpringRunner.class) @SpringBootTest(classes = SpringAmqpApplication.class) -public class SpringContextIntegrationTest { +public class SpringContextManualTest { @Test public void whenSpringContextIsBootstrapped_thenNoExceptions() { diff --git a/spring-kafka/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-kafka/src/test/java/org/baeldung/SpringContextManualTest.java similarity index 90% rename from spring-kafka/src/test/java/org/baeldung/SpringContextIntegrationTest.java rename to spring-kafka/src/test/java/org/baeldung/SpringContextManualTest.java index 40bf86c76f..b8195633fd 100644 --- a/spring-kafka/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ b/spring-kafka/src/test/java/org/baeldung/SpringContextManualTest.java @@ -9,7 +9,7 @@ import com.baeldung.spring.kafka.KafkaApplication; @RunWith(SpringRunner.class) @SpringBootTest(classes = KafkaApplication.class) -public class SpringContextIntegrationTest { +public class SpringContextManualTest { @Test public void whenSpringContextIsBootstrapped_thenNoExceptions() { diff --git a/spring-remoting/remoting-amqp/remoting-amqp-server/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-remoting/remoting-amqp/remoting-amqp-server/src/test/java/org/baeldung/SpringContextManualTest.java similarity index 90% rename from spring-remoting/remoting-amqp/remoting-amqp-server/src/test/java/org/baeldung/SpringContextIntegrationTest.java rename to spring-remoting/remoting-amqp/remoting-amqp-server/src/test/java/org/baeldung/SpringContextManualTest.java index 5dc6d1df75..a6ee0b6000 100644 --- a/spring-remoting/remoting-amqp/remoting-amqp-server/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ b/spring-remoting/remoting-amqp/remoting-amqp-server/src/test/java/org/baeldung/SpringContextManualTest.java @@ -9,7 +9,7 @@ import com.baeldung.server.AmqpServer; @RunWith(SpringRunner.class) @SpringBootTest(classes = AmqpServer.class) -public class SpringContextIntegrationTest { +public class SpringContextManualTest { @Test public void whenSpringContextIsBootstrapped_thenNoExceptions() { diff --git a/spring-remoting/remoting-jms/remoting-jms-server/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-remoting/remoting-jms/remoting-jms-server/src/test/java/org/baeldung/SpringContextManualTest.java similarity index 90% rename from spring-remoting/remoting-jms/remoting-jms-server/src/test/java/org/baeldung/SpringContextIntegrationTest.java rename to spring-remoting/remoting-jms/remoting-jms-server/src/test/java/org/baeldung/SpringContextManualTest.java index 5c9cc5f872..b806f21c27 100644 --- a/spring-remoting/remoting-jms/remoting-jms-server/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ b/spring-remoting/remoting-jms/remoting-jms-server/src/test/java/org/baeldung/SpringContextManualTest.java @@ -9,7 +9,7 @@ import com.baeldung.server.JmsServer; @SpringBootTest(classes = JmsServer.class) @RunWith(SpringRunner.class) -public class SpringContextIntegrationTest { +public class SpringContextManualTest { @Test public void whenSpringContextIsBootstrapped_thenNoExceptions() { diff --git a/spring-remoting/remoting-rmi/remoting-rmi-client/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-remoting/remoting-rmi/remoting-rmi-client/src/test/java/org/baeldung/SpringContextLiveTest.java similarity index 90% rename from spring-remoting/remoting-rmi/remoting-rmi-client/src/test/java/org/baeldung/SpringContextIntegrationTest.java rename to spring-remoting/remoting-rmi/remoting-rmi-client/src/test/java/org/baeldung/SpringContextLiveTest.java index 3460792fc6..3bace4cd1e 100644 --- a/spring-remoting/remoting-rmi/remoting-rmi-client/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ b/spring-remoting/remoting-rmi/remoting-rmi-client/src/test/java/org/baeldung/SpringContextLiveTest.java @@ -9,7 +9,7 @@ import com.baeldung.client.RmiClient; @SpringBootTest(classes = RmiClient.class) @RunWith(SpringRunner.class) -public class SpringContextIntegrationTest { +public class SpringContextLiveTest { @Test public void whenSpringContextIsBootstrapped_thenNoExceptions() { From 676f55e8720e8ec6cc00a73e3bcb1526318a948e Mon Sep 17 00:00:00 2001 From: rahusriv Date: Sun, 30 Dec 2018 08:40:43 +0530 Subject: [PATCH 221/359] BAEL-2335 (#6015) * Making examples simple * Changing variable names --- .../ArrayListOfArrayList.java | 26 +++++++++---------- .../ThreeDimensionalArrayList.java | 16 ++++++------ 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/core-java-collections-list/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java b/core-java-collections-list/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java index 72045d6761..2c3da7b1fc 100644 --- a/core-java-collections-list/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java +++ b/core-java-collections-list/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java @@ -6,30 +6,28 @@ public class ArrayListOfArrayList { public static void main(String args[]) { - int vertex = 5; - ArrayList> graph = new ArrayList<>(vertex); + int numVertices = 3; + ArrayList> graph = new ArrayList<>(numVertices); //Initializing each element of ArrayList with ArrayList - for(int i=0; i< vertex; i++) { + for(int i=0; i< numVertices; i++) { graph.add(new ArrayList()); } //We can add any number of columns to each row graph.get(0).add(1); - graph.get(0).add(5); - graph.get(1).add(0); graph.get(1).add(2); + graph.get(2).add(0); + graph.get(1).add(0); graph.get(2).add(1); - graph.get(2).add(3); - graph.get(3).add(2); - graph.get(3).add(4); - graph.get(4).add(3); - graph.get(4).add(5); - + graph.get(0).add(2); + //Printing all the edges - for(int i=0; i listOfVertices = graph.get(vertexNo); + for(int i=0; i Date: Sun, 30 Dec 2018 00:38:11 -0300 Subject: [PATCH 222/359] BAEL-2444 Samples (#6002) --- core-java-8/pom.xml | 37 +++++++++++++- .../baeldung/time/LocalDateTimeUnitTest.java | 43 +++++++++++++++++ .../time/LocalDateTimeWithJMockUnitTest.java | 48 +++++++++++++++++++ 3 files changed, 126 insertions(+), 2 deletions(-) create mode 100644 core-java-8/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java create mode 100644 core-java-8/src/test/java/com/baeldung/time/LocalDateTimeWithJMockUnitTest.java diff --git a/core-java-8/pom.xml b/core-java-8/pom.xml index 18bdaa15f4..112e8b764d 100644 --- a/core-java-8/pom.xml +++ b/core-java-8/pom.xml @@ -1,5 +1,5 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung core-java-8 @@ -104,6 +104,24 @@ aspectjweaver ${asspectj.version} + + org.powermock + powermock-module-junit4 + ${powermock.version} + test + + + org.powermock + powermock-api-mockito2 + ${powermock.version} + test + + + org.jmockit + jmockit + ${jmockit.version} + test + @@ -119,7 +137,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.1 + ${maven-compiler-plugin.version} 1.8 1.8 @@ -142,6 +160,16 @@ + + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar + + true + + @@ -159,9 +187,14 @@ 3.6.1 1.8.9 + 2.0.0-RC.4 + 1.44 1.7.0 1.19 1.19 2.0.4.RELEASE + + 3.8.0 + 2.22.1 diff --git a/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java b/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java new file mode 100644 index 0000000000..04c1a0b74e --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java @@ -0,0 +1,43 @@ +package com.baeldung.time; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.time.Clock; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; +import static org.powermock.api.mockito.PowerMockito.mockStatic; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({ LocalDateTime.class }) +public class LocalDateTimeUnitTest { + + @Test + public void givenLocalDateTimeMock_whenNow_thenGetFixedLocalDateTime() { + Clock clock = Clock.fixed(Instant.parse("2014-12-22T10:15:30.00Z"), ZoneId.of("UTC")); + LocalDateTime dateTime = LocalDateTime.now(clock); + mockStatic(LocalDateTime.class); + when(LocalDateTime.now()).thenReturn(dateTime); + String dateTimeExpected = "2014-12-22T10:15:30"; + + LocalDateTime now = LocalDateTime.now(); + + assertThat(now).isEqualTo(dateTimeExpected); + } + + @Test + public void givenFixedClock_whenNow_thenGetFixedLocalDateTime() { + Clock clock = Clock.fixed(Instant.parse("2014-12-22T10:15:30.00Z"), ZoneId.of("UTC")); + String dateTimeExpected = "2014-12-22T10:15:30"; + + LocalDateTime dateTime = LocalDateTime.now(clock); + + assertThat(dateTime).isEqualTo(dateTimeExpected); + } +} diff --git a/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeWithJMockUnitTest.java b/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeWithJMockUnitTest.java new file mode 100644 index 0000000000..13861dfd0b --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeWithJMockUnitTest.java @@ -0,0 +1,48 @@ +package com.baeldung.time; + +import mockit.Expectations; +import mockit.Mock; +import mockit.MockUp; +import org.junit.jupiter.api.Test; + +import java.time.Clock; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; + +import static org.assertj.core.api.Assertions.assertThat; + +public class LocalDateTimeWithJMockUnitTest { + + @Test + public void givenLocalDateTimeWithJMock_whenNow_thenGetFixedLocalDateTime() { + Clock clock = Clock.fixed(Instant.parse("2014-12-21T10:15:30.00Z"), ZoneId.of("UTC")); + new MockUp() { + @Mock + public LocalDateTime now() { + return LocalDateTime.now(clock); + } + }; + String dateTimeExpected = "2014-12-21T10:15:30"; + + LocalDateTime now = LocalDateTime.now(); + + assertThat(now).isEqualTo(dateTimeExpected); + } + + @Test + public void givenLocalDateTimeWithExpectations_whenNow_thenGetFixedLocalDateTime() { + Clock clock = Clock.fixed(Instant.parse("2014-12-23T10:15:30.00Z"), ZoneId.of("UTC")); + LocalDateTime dateTimeExpected = LocalDateTime.now(clock); + new Expectations(LocalDateTime.class) { + { + LocalDateTime.now(); + result = dateTimeExpected; + } + }; + + LocalDateTime now = LocalDateTime.now(); + + assertThat(now).isEqualTo(dateTimeExpected); + } +} From a89983a65cbf165f0e18889b6e43b1a7ed686dd3 Mon Sep 17 00:00:00 2001 From: mherbaghinyan Date: Sun, 30 Dec 2018 14:19:24 +0400 Subject: [PATCH 223/359] move unmodifiable set code to java 9 module --- .../com/baeldung/java9}/set/UnmodifiableSet.java | 6 +++--- .../java/com/baeldung/java9/SetExamplesUnitTest.java | 12 ++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) rename {core-java-collections/src/main/java/com/baeldung => core-java-9/src/main/java/com/baeldung/java9}/set/UnmodifiableSet.java (88%) diff --git a/core-java-collections/src/main/java/com/baeldung/set/UnmodifiableSet.java b/core-java-9/src/main/java/com/baeldung/java9/set/UnmodifiableSet.java similarity index 88% rename from core-java-collections/src/main/java/com/baeldung/set/UnmodifiableSet.java rename to core-java-9/src/main/java/com/baeldung/java9/set/UnmodifiableSet.java index 06f477c50a..7dbcd2a3a3 100644 --- a/core-java-collections/src/main/java/com/baeldung/set/UnmodifiableSet.java +++ b/core-java-9/src/main/java/com/baeldung/java9/set/UnmodifiableSet.java @@ -1,4 +1,4 @@ -package com.baeldung.set; +package com.baeldung.java9.set; import com.google.common.collect.ImmutableSet; @@ -21,8 +21,8 @@ public class UnmodifiableSet { } private static void java9Of() { - //Set immutable = Set.of("Canada", "USA"); - //System.out.println(immutable); + Set immutable = Set.of("Canada", "USA"); + System.out.println(immutable); } private static void guavaOf() { diff --git a/core-java-9/src/test/java/com/baeldung/java9/SetExamplesUnitTest.java b/core-java-9/src/test/java/com/baeldung/java9/SetExamplesUnitTest.java index 9e7e8e6e4b..28e71affcc 100644 --- a/core-java-9/src/test/java/com/baeldung/java9/SetExamplesUnitTest.java +++ b/core-java-9/src/test/java/com/baeldung/java9/SetExamplesUnitTest.java @@ -1,5 +1,7 @@ package com.baeldung.java9; +import java.util.Collections; +import java.util.HashSet; import java.util.Set; import org.junit.Test; @@ -23,4 +25,14 @@ public class SetExamplesUnitTest { Set intSet = Set.of(intArray); assertEquals(intSet.size(), intArray.length); } + + @Test(expected = UnsupportedOperationException.class) + public void testUnmodifiableSet() { + Set set = new HashSet<>(); + set.add("Canada"); + set.add("USA"); + + Set unmodifiableSet = Collections.unmodifiableSet(set); + unmodifiableSet.add("Costa Rica"); + } } From eb4928b972264c86472576a1673fa7245431a740 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 30 Dec 2018 16:30:36 +0530 Subject: [PATCH 224/359] [BAEL-11403] - Moved articles out of core-java (part 4) --- core-java-collections/README.md | 3 +- .../baeldung/iteratorguide/IteratorGuide.java | 0 core-java/README.md | 11 --- .../StringReplaceAndRemoveUnitTest.java | 83 ------------------- java-dates/README.md | 2 + .../zoneddatetime/OffsetDateTimeExample.java | 0 .../zoneddatetime/OffsetTimeExample.java | 0 .../zoneddatetime/ZoneDateTimeExample.java | 0 .../com/baeldung/date/DateDiffUnitTest.java | 2 + .../SimpleDateFormatUnitTest.java | 0 .../OffsetDateTimeExampleUnitTest.java | 0 .../OffsetTimeExampleUnitTest.java | 0 .../ZoneDateTimeExampleUnitTest.java | 0 java-numbers/README.md | 6 ++ .../java/com/baeldung/area/circle/Circle.java | 0 .../com/baeldung/area/circle/CircleArea.java | 0 .../root/calculator/NthRootCalculator.java | 0 .../java/com/baeldung/nth/root/main/Main.java | 0 .../DecimalFormatExamplesUnitTest.java | 0 .../com/baeldung/java/math/MathUnitTest.java | 0 .../calculator/NthRootCalculatorUnitTest.java | 0 .../baeldung/nth/root/main/MainUnitTest.java | 0 .../RemovingDecimalsManualTest.java | 0 .../RemovingDecimalsUnitTest.java | 0 java-strings/README.md | 2 + .../string/AppendCharAtPositionX.java | 0 .../string/AppendCharAtPositionXUnitTest.java | 0 .../DateToStringFormatterUnitTest.java | 9 +- 28 files changed, 19 insertions(+), 99 deletions(-) rename {core-java => core-java-collections}/src/main/java/com/baeldung/iteratorguide/IteratorGuide.java (100%) delete mode 100644 core-java/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java rename {core-java => java-dates}/src/main/java/com/baeldung/zoneddatetime/OffsetDateTimeExample.java (100%) rename {core-java => java-dates}/src/main/java/com/baeldung/zoneddatetime/OffsetTimeExample.java (100%) rename {core-java => java-dates}/src/main/java/com/baeldung/zoneddatetime/ZoneDateTimeExample.java (100%) rename {core-java => java-dates}/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java (100%) rename {core-java => java-dates}/src/test/java/com/baeldung/zoneddatetime/OffsetDateTimeExampleUnitTest.java (100%) rename {core-java => java-dates}/src/test/java/com/baeldung/zoneddatetime/OffsetTimeExampleUnitTest.java (100%) rename {core-java => java-dates}/src/test/java/com/baeldung/zoneddatetime/ZoneDateTimeExampleUnitTest.java (100%) rename {core-java => java-numbers}/src/main/java/com/baeldung/area/circle/Circle.java (100%) rename {core-java => java-numbers}/src/main/java/com/baeldung/area/circle/CircleArea.java (100%) rename {core-java => java-numbers}/src/main/java/com/baeldung/nth/root/calculator/NthRootCalculator.java (100%) rename {core-java => java-numbers}/src/main/java/com/baeldung/nth/root/main/Main.java (100%) rename {core-java => java-numbers}/src/test/java/com/baeldung/decimalformat/DecimalFormatExamplesUnitTest.java (100%) rename {core-java => java-numbers}/src/test/java/com/baeldung/java/math/MathUnitTest.java (100%) rename {core-java => java-numbers}/src/test/java/com/baeldung/nth/root/calculator/NthRootCalculatorUnitTest.java (100%) rename {core-java => java-numbers}/src/test/java/com/baeldung/nth/root/main/MainUnitTest.java (100%) rename {core-java => java-numbers}/src/test/java/com/baeldung/removingdecimals/RemovingDecimalsManualTest.java (100%) rename {core-java => java-numbers}/src/test/java/com/baeldung/removingdecimals/RemovingDecimalsUnitTest.java (100%) rename {core-java => java-strings}/src/main/java/com/baeldung/string/AppendCharAtPositionX.java (100%) rename {core-java => java-strings}/src/test/java/com/baeldung/string/AppendCharAtPositionXUnitTest.java (100%) diff --git a/core-java-collections/README.md b/core-java-collections/README.md index 15be81156c..71d4e6b614 100644 --- a/core-java-collections/README.md +++ b/core-java-collections/README.md @@ -28,4 +28,5 @@ - [Combining Different Types of Collections in Java](https://www.baeldung.com/java-combine-collections) - [Sorting in Java](http://www.baeldung.com/java-sorting) - [Join and Split Arrays and Collections in Java](http://www.baeldung.com/java-join-and-split) -- [A Guide to EnumMap](https://www.baeldung.com/java-enum-map) \ No newline at end of file +- [A Guide to EnumMap](https://www.baeldung.com/java-enum-map) +- [A Guide to Iterator in Java](http://www.baeldung.com/java-iterator) \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/iteratorguide/IteratorGuide.java b/core-java-collections/src/main/java/com/baeldung/iteratorguide/IteratorGuide.java similarity index 100% rename from core-java/src/main/java/com/baeldung/iteratorguide/IteratorGuide.java rename to core-java-collections/src/main/java/com/baeldung/iteratorguide/IteratorGuide.java diff --git a/core-java/README.md b/core-java/README.md index 21c58bb880..4f03bac732 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -23,13 +23,10 @@ - [Difference between URL and URI](http://www.baeldung.com/java-url-vs-uri) - [Creating a Java Compiler Plugin](http://www.baeldung.com/java-build-compiler-plugin) - [Quick Guide to Java Stack](http://www.baeldung.com/java-stack) -- [Guide to java.util.Formatter](http://www.baeldung.com/java-string-formatter) - [Guide to the Cipher Class](http://www.baeldung.com/java-cipher-class) - [Compiling Java *.class Files with javac](http://www.baeldung.com/javac) -- [A Guide to Iterator in Java](http://www.baeldung.com/java-iterator) - [Introduction to Javadoc](http://www.baeldung.com/javadoc) - [Guide to the Externalizable Interface in Java](http://www.baeldung.com/java-externalizable) -- [A Practical Guide to DecimalFormat](http://www.baeldung.com/java-decimalformat) - [How to Detect the OS Using Java](http://www.baeldung.com/java-detect-os) - [ASCII Art in Java](http://www.baeldung.com/ascii-art-in-java) - [What is the serialVersionUID?](http://www.baeldung.com/java-serial-version-uid) @@ -48,19 +45,11 @@ - [Getting a File’s Mime Type in Java](http://www.baeldung.com/java-file-mime-type) - [Common Java Exceptions](http://www.baeldung.com/java-common-exceptions) - [Throw Exception in Optional in Java 8](https://www.baeldung.com/java-optional-throw-exception) -- [Add a Character to a String at a Given Position](https://www.baeldung.com/java-add-character-to-string) -- [Calculating the nth Root in Java](https://www.baeldung.com/java-nth-root) -- [Convert Double to String, Removing Decimal Places](https://www.baeldung.com/java-double-to-string) -- [ZoneOffset in Java](https://www.baeldung.com/java-zone-offset) - [Hashing a Password in Java](https://www.baeldung.com/java-password-hashing) - [Merging java.util.Properties Objects](https://www.baeldung.com/java-merging-properties) -- [A Guide to SimpleDateFormat](https://www.baeldung.com/java-simple-date-format) - [SSL Handshake Failures](https://www.baeldung.com/java-ssl-handshake-failures) -- [Changing the Order in a Sum Operation Can Produce Different Results?](https://www.baeldung.com/java-floating-point-sum-order) - [Java – Try with Resources](https://www.baeldung.com/java-try-with-resources) - [Abstract Classes in Java](https://www.baeldung.com/java-abstract-class) - [Guide to Character Encoding](https://www.baeldung.com/java-char-encoding) -- [Calculate the Area of a Circle in Java](https://www.baeldung.com/java-calculate-circle-area) -- [A Guide to the Java Math Class](https://www.baeldung.com/java-lang-math) - [Graphs in Java](https://www.baeldung.com/java-graphs) - [Console I/O in Java](http://www.baeldung.com/java-console-input-output) diff --git a/core-java/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java b/core-java/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java deleted file mode 100644 index d952d2383b..0000000000 --- a/core-java/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.baeldung.string; - - -import org.apache.commons.lang3.StringUtils; -import org.junit.Test; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -public class StringReplaceAndRemoveUnitTest { - - - @Test - public void givenTestStrings_whenReplace_thenProcessedString() { - - String master = "Hello World Baeldung!"; - String target = "Baeldung"; - String replacement = "Java"; - String processed = master.replace(target, replacement); - assertTrue(processed.contains(replacement)); - assertFalse(processed.contains(target)); - - } - - @Test - public void givenTestStrings_whenReplaceAll_thenProcessedString() { - - String master2 = "Welcome to Baeldung, Hello World Baeldung"; - String regexTarget= "(Baeldung)$"; - String replacement = "Java"; - String processed2 = master2.replaceAll(regexTarget, replacement); - assertTrue(processed2.endsWith("Java")); - - } - - @Test - public void givenTestStrings_whenStringBuilderMethods_thenProcessedString() { - - String master = "Hello World Baeldung!"; - String target = "Baeldung"; - String replacement = "Java"; - - int startIndex = master.indexOf(target); - int stopIndex = startIndex + target.length(); - - StringBuilder builder = new StringBuilder(master); - - - builder.delete(startIndex, stopIndex); - assertFalse(builder.toString().contains(target)); - - - builder.replace(startIndex, stopIndex, replacement); - assertTrue(builder.toString().contains(replacement)); - - - } - - - @Test - public void givenTestStrings_whenStringUtilsMethods_thenProcessedStrings() { - - String master = "Hello World Baeldung!"; - String target = "Baeldung"; - String replacement = "Java"; - - String processed = StringUtils.replace(master, target, replacement); - assertTrue(processed.contains(replacement)); - - String master2 = "Hello World Baeldung!"; - String target2 = "baeldung"; - String processed2 = StringUtils.replaceIgnoreCase(master2, target2, replacement); - assertFalse(processed2.contains(target)); - - } - - - - - - - -} diff --git a/java-dates/README.md b/java-dates/README.md index 21e54082f4..ac3166d938 100644 --- a/java-dates/README.md +++ b/java-dates/README.md @@ -26,3 +26,5 @@ - [Format ZonedDateTime to String](https://www.baeldung.com/java-format-zoned-datetime-string) - [Convert Between java.time.Instant and java.sql.Timestamp](https://www.baeldung.com/java-time-instant-to-java-sql-timestamp) - [Convert between String and Timestamp](https://www.baeldung.com/java-string-to-timestamp) +- [A Guide to SimpleDateFormat](https://www.baeldung.com/java-simple-date-format) +- [ZoneOffset in Java](https://www.baeldung.com/java-zone-offset) \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/zoneddatetime/OffsetDateTimeExample.java b/java-dates/src/main/java/com/baeldung/zoneddatetime/OffsetDateTimeExample.java similarity index 100% rename from core-java/src/main/java/com/baeldung/zoneddatetime/OffsetDateTimeExample.java rename to java-dates/src/main/java/com/baeldung/zoneddatetime/OffsetDateTimeExample.java diff --git a/core-java/src/main/java/com/baeldung/zoneddatetime/OffsetTimeExample.java b/java-dates/src/main/java/com/baeldung/zoneddatetime/OffsetTimeExample.java similarity index 100% rename from core-java/src/main/java/com/baeldung/zoneddatetime/OffsetTimeExample.java rename to java-dates/src/main/java/com/baeldung/zoneddatetime/OffsetTimeExample.java diff --git a/core-java/src/main/java/com/baeldung/zoneddatetime/ZoneDateTimeExample.java b/java-dates/src/main/java/com/baeldung/zoneddatetime/ZoneDateTimeExample.java similarity index 100% rename from core-java/src/main/java/com/baeldung/zoneddatetime/ZoneDateTimeExample.java rename to java-dates/src/main/java/com/baeldung/zoneddatetime/ZoneDateTimeExample.java diff --git a/java-dates/src/test/java/com/baeldung/date/DateDiffUnitTest.java b/java-dates/src/test/java/com/baeldung/date/DateDiffUnitTest.java index 1234a700de..a35699e469 100644 --- a/java-dates/src/test/java/com/baeldung/date/DateDiffUnitTest.java +++ b/java-dates/src/test/java/com/baeldung/date/DateDiffUnitTest.java @@ -8,6 +8,8 @@ import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.Period; +import java.time.ZoneId; +import java.time.ZonedDateTime; import java.time.temporal.ChronoUnit; import java.util.Date; import java.util.Locale; diff --git a/core-java/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java b/java-dates/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java rename to java-dates/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/zoneddatetime/OffsetDateTimeExampleUnitTest.java b/java-dates/src/test/java/com/baeldung/zoneddatetime/OffsetDateTimeExampleUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/zoneddatetime/OffsetDateTimeExampleUnitTest.java rename to java-dates/src/test/java/com/baeldung/zoneddatetime/OffsetDateTimeExampleUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/zoneddatetime/OffsetTimeExampleUnitTest.java b/java-dates/src/test/java/com/baeldung/zoneddatetime/OffsetTimeExampleUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/zoneddatetime/OffsetTimeExampleUnitTest.java rename to java-dates/src/test/java/com/baeldung/zoneddatetime/OffsetTimeExampleUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/zoneddatetime/ZoneDateTimeExampleUnitTest.java b/java-dates/src/test/java/com/baeldung/zoneddatetime/ZoneDateTimeExampleUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/zoneddatetime/ZoneDateTimeExampleUnitTest.java rename to java-dates/src/test/java/com/baeldung/zoneddatetime/ZoneDateTimeExampleUnitTest.java diff --git a/java-numbers/README.md b/java-numbers/README.md index 1138d9a74c..2b1131f325 100644 --- a/java-numbers/README.md +++ b/java-numbers/README.md @@ -13,3 +13,9 @@ - [Find All Pairs of Numbers in an Array That Add Up to a Given Sum](http://www.baeldung.com/java-algorithm-number-pairs-sum) - [Java – Random Long, Float, Integer and Double](http://www.baeldung.com/java-generate-random-long-float-integer-double) - [Using Math.sin with Degrees](https://www.baeldung.com/java-math-sin-degrees) +- [A Practical Guide to DecimalFormat](http://www.baeldung.com/java-decimalformat) +- [Calculating the nth Root in Java](https://www.baeldung.com/java-nth-root) +- [Convert Double to String, Removing Decimal Places](https://www.baeldung.com/java-double-to-string) +- [Changing the Order in a Sum Operation Can Produce Different Results?](https://www.baeldung.com/java-floating-point-sum-order) +- [Calculate the Area of a Circle in Java](https://www.baeldung.com/java-calculate-circle-area) +- [A Guide to the Java Math Class](https://www.baeldung.com/java-lang-math) \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/area/circle/Circle.java b/java-numbers/src/main/java/com/baeldung/area/circle/Circle.java similarity index 100% rename from core-java/src/main/java/com/baeldung/area/circle/Circle.java rename to java-numbers/src/main/java/com/baeldung/area/circle/Circle.java diff --git a/core-java/src/main/java/com/baeldung/area/circle/CircleArea.java b/java-numbers/src/main/java/com/baeldung/area/circle/CircleArea.java similarity index 100% rename from core-java/src/main/java/com/baeldung/area/circle/CircleArea.java rename to java-numbers/src/main/java/com/baeldung/area/circle/CircleArea.java diff --git a/core-java/src/main/java/com/baeldung/nth/root/calculator/NthRootCalculator.java b/java-numbers/src/main/java/com/baeldung/nth/root/calculator/NthRootCalculator.java similarity index 100% rename from core-java/src/main/java/com/baeldung/nth/root/calculator/NthRootCalculator.java rename to java-numbers/src/main/java/com/baeldung/nth/root/calculator/NthRootCalculator.java diff --git a/core-java/src/main/java/com/baeldung/nth/root/main/Main.java b/java-numbers/src/main/java/com/baeldung/nth/root/main/Main.java similarity index 100% rename from core-java/src/main/java/com/baeldung/nth/root/main/Main.java rename to java-numbers/src/main/java/com/baeldung/nth/root/main/Main.java diff --git a/core-java/src/test/java/com/baeldung/decimalformat/DecimalFormatExamplesUnitTest.java b/java-numbers/src/test/java/com/baeldung/decimalformat/DecimalFormatExamplesUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/decimalformat/DecimalFormatExamplesUnitTest.java rename to java-numbers/src/test/java/com/baeldung/decimalformat/DecimalFormatExamplesUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/java/math/MathUnitTest.java b/java-numbers/src/test/java/com/baeldung/java/math/MathUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/java/math/MathUnitTest.java rename to java-numbers/src/test/java/com/baeldung/java/math/MathUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/nth/root/calculator/NthRootCalculatorUnitTest.java b/java-numbers/src/test/java/com/baeldung/nth/root/calculator/NthRootCalculatorUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/nth/root/calculator/NthRootCalculatorUnitTest.java rename to java-numbers/src/test/java/com/baeldung/nth/root/calculator/NthRootCalculatorUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/nth/root/main/MainUnitTest.java b/java-numbers/src/test/java/com/baeldung/nth/root/main/MainUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/nth/root/main/MainUnitTest.java rename to java-numbers/src/test/java/com/baeldung/nth/root/main/MainUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/removingdecimals/RemovingDecimalsManualTest.java b/java-numbers/src/test/java/com/baeldung/removingdecimals/RemovingDecimalsManualTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/removingdecimals/RemovingDecimalsManualTest.java rename to java-numbers/src/test/java/com/baeldung/removingdecimals/RemovingDecimalsManualTest.java diff --git a/core-java/src/test/java/com/baeldung/removingdecimals/RemovingDecimalsUnitTest.java b/java-numbers/src/test/java/com/baeldung/removingdecimals/RemovingDecimalsUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/removingdecimals/RemovingDecimalsUnitTest.java rename to java-numbers/src/test/java/com/baeldung/removingdecimals/RemovingDecimalsUnitTest.java diff --git a/java-strings/README.md b/java-strings/README.md index 60131e392d..fa048dbb5a 100644 --- a/java-strings/README.md +++ b/java-strings/README.md @@ -45,3 +45,5 @@ - [Remove or Replace part of a String in Java](https://www.baeldung.com/java-remove-replace-string-part) - [Replace a Character at a Specific Index in a String in Java](https://www.baeldung.com/java-replace-character-at-index) - [Convert a Comma Separated String to a List in Java](https://www.baeldung.com/java-string-with-separator-to-list) +- [Guide to java.util.Formatter](http://www.baeldung.com/java-string-formatter) +- [Add a Character to a String at a Given Position](https://www.baeldung.com/java-add-character-to-string) \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/string/AppendCharAtPositionX.java b/java-strings/src/main/java/com/baeldung/string/AppendCharAtPositionX.java similarity index 100% rename from core-java/src/main/java/com/baeldung/string/AppendCharAtPositionX.java rename to java-strings/src/main/java/com/baeldung/string/AppendCharAtPositionX.java diff --git a/core-java/src/test/java/com/baeldung/string/AppendCharAtPositionXUnitTest.java b/java-strings/src/test/java/com/baeldung/string/AppendCharAtPositionXUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/string/AppendCharAtPositionXUnitTest.java rename to java-strings/src/test/java/com/baeldung/string/AppendCharAtPositionXUnitTest.java diff --git a/java-strings/src/test/java/com/baeldung/string/formatter/DateToStringFormatterUnitTest.java b/java-strings/src/test/java/com/baeldung/string/formatter/DateToStringFormatterUnitTest.java index f236c641c3..d760510c73 100644 --- a/java-strings/src/test/java/com/baeldung/string/formatter/DateToStringFormatterUnitTest.java +++ b/java-strings/src/test/java/com/baeldung/string/formatter/DateToStringFormatterUnitTest.java @@ -1,7 +1,6 @@ package com.baeldung.string.formatter; -import org.junit.BeforeClass; -import org.junit.Test; +import static org.junit.Assert.assertEquals; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -11,9 +10,11 @@ import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.Calendar; import java.util.Date; +import java.util.Locale; import java.util.TimeZone; -import static org.junit.Assert.assertEquals; +import org.junit.BeforeClass; +import org.junit.Test; public class DateToStringFormatterUnitTest { @@ -40,7 +41,7 @@ public class DateToStringFormatterUnitTest { @Test public void whenDateConvertedUsingDateFormatToString_thenCorrect() { String formattedDate = DateFormat - .getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT) + .getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT, Locale.US) .format(date); assertEquals(EXPECTED_STRING_DATE, formattedDate); From de80339a2a03ce98ba1b0c189a3e953d03ad4686 Mon Sep 17 00:00:00 2001 From: Emily Cheyne Date: Sun, 30 Dec 2018 09:12:21 -0700 Subject: [PATCH 225/359] BAEL-2090 update readme --- persistence-modules/spring-data-jpa/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/spring-data-jpa/README.md b/persistence-modules/spring-data-jpa/README.md index e240ae6d33..3c71600565 100644 --- a/persistence-modules/spring-data-jpa/README.md +++ b/persistence-modules/spring-data-jpa/README.md @@ -17,6 +17,7 @@ - [Spring Data – CrudRepository save() Method](https://www.baeldung.com/spring-data-crud-repository-save) - [Limiting Query Results with JPA and Spring Data JPA](https://www.baeldung.com/jpa-limit-query-results) - [Sorting Query Results with Spring Data](https://www.baeldung.com/spring-data-sorting) +- [INSERT Statement in JPA](https://www.baeldung.com/jpa-insert) ### Eclipse Config After importing the project into Eclipse, you may see the following error: From 3bdd542dbf78acb998d64527ba49120c6eea3c9a Mon Sep 17 00:00:00 2001 From: Erhan KARAKAYA Date: Mon, 31 Dec 2018 03:48:20 +0300 Subject: [PATCH 226/359] Added @Value for map examples --- .../java/com/baeldung/value/ValuesApp.java | 28 +++++++++++++++++++ .../src/main/resources/values.properties | 3 +- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/spring-core/src/main/java/com/baeldung/value/ValuesApp.java b/spring-core/src/main/java/com/baeldung/value/ValuesApp.java index f525dfde89..33592ae38a 100644 --- a/spring-core/src/main/java/com/baeldung/value/ValuesApp.java +++ b/spring-core/src/main/java/com/baeldung/value/ValuesApp.java @@ -45,6 +45,27 @@ public class ValuesApp { @Value("#{'${listOfValues}'.split(',')}") private List valuesList; + + @Value("#{${valuesMap}}") + private Map valuesMap; + + @Value("#{${valuesMap}.key1}") + private Integer valuesMapKey1; + + @Value("#{${valuesMap}['unknownKey']}") + private Integer unknownMapKey; + + @Value("#{${unknownMap : {key1:'1', key2 : '2'}}}") + private Map unknownMap; + + @Value("#{${valuesMap}['unknownKey'] ?: 5}") + private Integer unknownMapKeyWithDefaultValue; + + @Value("#{${valuesMap}.?[value>'1']}") + private Map valuesMapFiltered; + + @Value("#{systemProperties}") + private Map systemPropertiesMap; public static void main(String[] args) { System.setProperty("systemValue", "Some system parameter value"); @@ -69,5 +90,12 @@ public class ValuesApp { System.out.println(spelSomeDefault); System.out.println(someBeanValue); System.out.println(valuesList); + System.out.println(valuesMap); + System.out.println(valuesMapKey1); + System.out.println(unknownMapKey); + System.out.println(unknownMap); + System.out.println(unknownMapKeyWithDefaultValue); + System.out.println(valuesMapFiltered); + System.out.println(systemPropertiesMap); } } diff --git a/spring-core/src/main/resources/values.properties b/spring-core/src/main/resources/values.properties index d7d61b8ee8..c6db5873fb 100644 --- a/spring-core/src/main/resources/values.properties +++ b/spring-core/src/main/resources/values.properties @@ -1,3 +1,4 @@ value.from.file=Value got from the file priority=Properties file -listOfValues=A,B,C \ No newline at end of file +listOfValues=A,B,C +valuesMap={key1:'1', key2 : '2', key3 : '3'} \ No newline at end of file From 90037051b917432008c0a39eca55cc6d86e109cb Mon Sep 17 00:00:00 2001 From: Erhan KARAKAYA Date: Mon, 31 Dec 2018 04:01:27 +0300 Subject: [PATCH 227/359] Added missing import --- spring-core/src/main/java/com/baeldung/value/ValuesApp.java | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-core/src/main/java/com/baeldung/value/ValuesApp.java b/spring-core/src/main/java/com/baeldung/value/ValuesApp.java index 33592ae38a..80893c1adf 100644 --- a/spring-core/src/main/java/com/baeldung/value/ValuesApp.java +++ b/spring-core/src/main/java/com/baeldung/value/ValuesApp.java @@ -2,6 +2,7 @@ package com.baeldung.value; import java.util.Arrays; import java.util.List; +import java.util.Map; import javax.annotation.PostConstruct; From 6c6046200060f121f040c16db6c8d7bdf7fa1922 Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Mon, 31 Dec 2018 10:07:38 +0100 Subject: [PATCH 228/359] added README --- akka-http/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 akka-http/README.md diff --git a/akka-http/README.md b/akka-http/README.md new file mode 100644 index 0000000000..583d2efa74 --- /dev/null +++ b/akka-http/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [Introduction to Akka HTTP](https://www.baeldung.com/akka-http) From 0cf67f5dbef3d8c1ef17d2478654469f17fb2472 Mon Sep 17 00:00:00 2001 From: Steven van Beelen Date: Mon, 31 Dec 2018 13:45:58 +0100 Subject: [PATCH 229/359] BAEL-2435 Change dependency Change the autoconfigure dependency to the starter dependency of Axon --- axon/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/axon/pom.xml b/axon/pom.xml index 03d2499a99..598dc820e5 100644 --- a/axon/pom.xml +++ b/axon/pom.xml @@ -16,7 +16,7 @@ org.axonframework - axon-spring-boot-autoconfigure + axon-spring-boot-starter ${axon.version} From f757eba28b25d8d7807a23c1748230a096f7df97 Mon Sep 17 00:00:00 2001 From: DOHA Date: Mon, 31 Dec 2018 16:50:19 +0200 Subject: [PATCH 230/359] adding security for testing purpose --- spring-boot-testing/pom.xml | 32 +++++++++++++----- .../com/baeldung/boot/SecurityConfig.java | 32 ++++++++++++++++++ .../boot/controller/rest/HomeController.java | 14 ++++++++ .../src/main/resources/application.properties | 4 +++ ...oovy => LoadContextIntegrationTest.groovy} | 2 +- ...vy => WebControllerIntegrationTest.groovy} | 6 ++-- .../boot/WebControllerTest.groovy alias | Bin 0 -> 217036 bytes 7 files changed, 78 insertions(+), 12 deletions(-) create mode 100644 spring-boot-testing/src/main/java/com/baeldung/boot/SecurityConfig.java create mode 100644 spring-boot-testing/src/main/java/com/baeldung/boot/controller/rest/HomeController.java create mode 100644 spring-boot-testing/src/main/resources/application.properties rename spring-boot-testing/src/test/groovy/com/baeldung/boot/{LoadContextTest.groovy => LoadContextIntegrationTest.groovy} (91%) rename spring-boot-testing/src/test/groovy/com/baeldung/boot/{WebControllerTest.groovy => WebControllerIntegrationTest.groovy} (94%) create mode 100644 spring-boot-testing/src/test/groovy/com/baeldung/boot/WebControllerTest.groovy alias diff --git a/spring-boot-testing/pom.xml b/spring-boot-testing/pom.xml index 2a498e54c5..dd40789604 100644 --- a/spring-boot-testing/pom.xml +++ b/spring-boot-testing/pom.xml @@ -23,6 +23,10 @@ org.springframework.boot spring-boot-starter-tomcat + + org.springframework.boot + spring-boot-starter-security + org.springframework.boot spring-boot-starter-test @@ -43,6 +47,13 @@ ${spock.version} test + + + io.rest-assured + rest-assured + test + + @@ -99,13 +110,23 @@ + + org.apache.maven.plugins + maven-surefire-plugin + + + **/*IntegrationTest.java + + + + - autoconfiguration + integration @@ -118,13 +139,8 @@ test - - **/*LiveTest.java - **/*IntegrationTest.java - **/*IntTest.java - - **/AutoconfigurationTest.java + **/*IntegrationTest.java @@ -142,7 +158,7 @@ - org.baeldung.boot.Application + com.baeldung.boot.Application 2.2.4 1.2-groovy-2.4 diff --git a/spring-boot-testing/src/main/java/com/baeldung/boot/SecurityConfig.java b/spring-boot-testing/src/main/java/com/baeldung/boot/SecurityConfig.java new file mode 100644 index 0000000000..61e86d01c5 --- /dev/null +++ b/spring-boot-testing/src/main/java/com/baeldung/boot/SecurityConfig.java @@ -0,0 +1,32 @@ +//package com.baeldung.boot; +// +//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 SecurityConfig extends WebSecurityConfigurerAdapter { +// +// @Override +// protected void configure(AuthenticationManagerBuilder auth) throws Exception { +// auth.inMemoryAuthentication() +// .withUser("john") +// .password("{noop}123") +// .roles("USER"); +// } +// +// @Override +// protected void configure(HttpSecurity http) throws Exception { +// http.authorizeRequests() +// .antMatchers("/hello") +// .permitAll() +// .anyRequest() +// .authenticated() +// .and() +// .httpBasic(); +// } +//} \ No newline at end of file diff --git a/spring-boot-testing/src/main/java/com/baeldung/boot/controller/rest/HomeController.java b/spring-boot-testing/src/main/java/com/baeldung/boot/controller/rest/HomeController.java new file mode 100644 index 0000000000..595c34254b --- /dev/null +++ b/spring-boot-testing/src/main/java/com/baeldung/boot/controller/rest/HomeController.java @@ -0,0 +1,14 @@ +package com.baeldung.boot.controller.rest; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class HomeController { + + @GetMapping("/") + public String salutation() { + return "Welcome !"; + } + +} \ No newline at end of file diff --git a/spring-boot-testing/src/main/resources/application.properties b/spring-boot-testing/src/main/resources/application.properties new file mode 100644 index 0000000000..e378aacdd5 --- /dev/null +++ b/spring-boot-testing/src/main/resources/application.properties @@ -0,0 +1,4 @@ + +# security +spring.security.user.name=john +spring.security.user.password=123 \ No newline at end of file diff --git a/spring-boot-testing/src/test/groovy/com/baeldung/boot/LoadContextTest.groovy b/spring-boot-testing/src/test/groovy/com/baeldung/boot/LoadContextIntegrationTest.groovy similarity index 91% rename from spring-boot-testing/src/test/groovy/com/baeldung/boot/LoadContextTest.groovy rename to spring-boot-testing/src/test/groovy/com/baeldung/boot/LoadContextIntegrationTest.groovy index 85b0a4b89b..8bfc86685c 100644 --- a/spring-boot-testing/src/test/groovy/com/baeldung/boot/LoadContextTest.groovy +++ b/spring-boot-testing/src/test/groovy/com/baeldung/boot/LoadContextIntegrationTest.groovy @@ -10,7 +10,7 @@ import spock.lang.Title @Title("Application Specification") @Narrative("Specification which beans are expected") @SpringBootTest -class LoadContextTest extends Specification { +class LoadContextIntegrationTest extends Specification { @Autowired(required = false) private WebController webController diff --git a/spring-boot-testing/src/test/groovy/com/baeldung/boot/WebControllerTest.groovy b/spring-boot-testing/src/test/groovy/com/baeldung/boot/WebControllerIntegrationTest.groovy similarity index 94% rename from spring-boot-testing/src/test/groovy/com/baeldung/boot/WebControllerTest.groovy rename to spring-boot-testing/src/test/groovy/com/baeldung/boot/WebControllerIntegrationTest.groovy index 119992acc3..17c60376ed 100644 --- a/spring-boot-testing/src/test/groovy/com/baeldung/boot/WebControllerTest.groovy +++ b/spring-boot-testing/src/test/groovy/com/baeldung/boot/WebControllerIntegrationTest.groovy @@ -12,9 +12,9 @@ import spock.lang.Title @Title("WebController Specification") @Narrative("The Specification of the behaviour of the WebController. It can greet a person, change the name and reset it to 'world'") -@AutoConfigureMockMvc -@WebMvcTest -class WebControllerTest extends Specification { +@AutoConfigureMockMvc(secure=false) +@WebMvcTest() +class WebControllerIntegrationTest extends Specification { @Autowired private MockMvc mvc diff --git a/spring-boot-testing/src/test/groovy/com/baeldung/boot/WebControllerTest.groovy alias b/spring-boot-testing/src/test/groovy/com/baeldung/boot/WebControllerTest.groovy alias new file mode 100644 index 0000000000000000000000000000000000000000..f2fc2f48e27bcf946a76f67ec7bacd1a2c3dd394 GIT binary patch literal 217036 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

l- znw;FUwaD{EP|f)qvS7biY*flKMcjc=vdf+l<+(RloccZn7VQ+z3*CC>qCQhiqA?wL zg3w%>g+Z)PvRK(^U0nS~oAz`2+WKkkcy!%pxyUsb=8sQQ-D?(q3Kx;? zj@#ceOFGEy@}Wv=u>^W5utRW(+w!o+n_U7CdWP+KRq=iYV{S0l&8x5vHeHc0cCseL$ogJ#Kclt$z7wWCMyA)T9~w-z=<7KTm)(6M6~|(l++A@vUCc6% zrl~MGM@_W;iSW2Pm~z;SATJ*IEf^adv%shkX7XMck;7ERB& zv!$B>L&|cNmqY2slj8?>JJQ9lmL;FuyL3}kn8(>kqf^Y+pMNQ`J*?!eaYO$dFKKZ4 zm*yDG(Ppg`%Bh(x@4FRoCf4(281(M4KOzh*RB=)6> zM8>WgV)j`VsOF%PnbhIROv(JODl|%mLs{(clcweQ0%K24?qiq=K7!88F*6>!Tp3<{ zY+L{rVE~1(?9Npo4@0nBKf)TG(`IIW-sZ(s*)-~_+X8uQr(av?w@E~#JLkrWHI6V{ zpk;e>Sj_`x<$ZH$d$@ReBfs6r{l&XiciajIr3x@5W%V@Hx1OcR)6No|GevW_oqUvV zw7vv7A$N~&IOe>iW@b~O@t`8v((Lu!Zgk{DXj9(V<(n5QI_D!TI?)krr~9rQt#fS& z5VD>PJX5s0PVvbZ{i&v^#}UQ;&G~tA9oONImbLnuT(v2OyTjLCW{glt1mRkY-JEC* zM{DjKdO#UR7-+OS6#+B4yIDU?qBdkoRtxczN>B{yP<+UQTh26a+&Q?M%!?Z_x@>Oh zyu1ruGZUVque(zy(%^h|x#^SEh~X+W*C?rN{A`PwGeRH)t4}Y{cH(Sh8x8q&p~}=m zceA#n@PS6Q%371@eAWYKdiqfrNX@x)0UBDAmj#KDPGcjm`m6 zMn)>!GgpoD!*x{)WLfxuk4<8Vr}AO1r=i8mf?HR?gUd^SR&5Vn9j7uqUJvavQOW$h zsY&8=PyMS2CM@W7jkJjz#gaq|W{x`&LGR_~S=`#`ZmmUe_FamxJAaQ$_|`*JoiqhUQ#M#WmQ z7o2QS5f99hN@aKBD_X?cALE1aCmJ%}s}`SdGRe`l&~JO3pBCq-TqKm)czWsQokqb| zmrq%mUSEItVUE;T(QJPK`LnV9exm`gu;j zXuf;h8&(m9(fY`8(+FqWT+p`VhsGfck%i97FATdK`bAgYH}6+gr6Qj4xN~<@n4x~= zQgMjjcA8{lz2-D_EwPqF?q(&2S54WC`nHFvCCkZ9c9-wP%cpe4-W@sK?%y0Zl%V5g zXBo^n8r7VjWt5xd!F8hjr|buDA5&*ZjjONlOj3_!9a3Pw6mzKN?lkKmCp(98>8u=e>L06LDUq(N8LhGU<$-O63iTX?3?rKE;aDZgZValDc`i8#%295>1jV zyq_2{Y8mu3=Cg_mvEI+$Vv^W4thTQ1mighTid);TzGsqtsdiVtIYH;)mNYRz)+?q9gMu*wiOU}X8_)(vDricNi`y_P zrRGo5Smb+|v@80Yxf40U@ML1lTa>BoRCw+DVCsrh@$0ozLe3lK-rVeP?QkY4uUUU~ zClftFq@=aQ#f!7qK{;HIdBgG6s}~GqZFb~kycxH)GqJ~!$9Uaa>@l_%j!ABwzp&4H zxtxtOhR*n8)*Qce?#VqzaLd_DO^v2+#APzolOzOnwhI^$9?;Njj~U{!o>TK)R(evK zmyuuGB#5c=vg#i3OF#$|$crklYUU*rDO#02sTC4%-I3lFopGkx=GoxQJtx?7j_FP% zmY#0U3r#GXG7TVQ&UE1y) zyQ;bRQvV`N&HFdC6kya_hsT{dB5)RE>okYE`__WaT;S9F>H@0 zl?0TPZ)}OLEL%C1Hr;IGy*9sgxwx*f%j^VV&SGCkV$B7EGl_>vg~OlRkt%lD|H_|m zkG~{0jd3gakYa3*=yQ_3x}@zQ@(S!cy?2!b(KFQh`xC$uK#zsVeP%aatfJ73I{cx9 zteq~Dd@=76-yX`{=NXJp(^GXJbzfa`Z6=ixUdEf0;jsxn$6g+P z)-E>NKH}Gn5=bjQ`@+cK9bdb?$MRYGR<;OQCEh142aWps;X}oNy)T2( z8x*-xm$gTeE+pV>RU<_h>Q2QvW!Bt#EfU?ce4W3m4Ws=k^(XSWZM9-67Z1k8UnzSC zCU9moLh12#jcjKXnA2Hb3trQ>cIq(;KW*>PzTRAH-Tl;^`@CXZmvas0QiZZkzfaHc zPv*`1@T5*?_ZCm<-q4eMk$aeM)61$ct{wx_&|Wi3D`EBiK+#}fEu*~bYR3;$Wp-PY zS!wVVS<&ZN_X?RYPL7lHR1QCA63w4Y-+EOo0`4j-(1XR~^j$qq=I)|O72?s%Y>22z zt9eo?vObWR!t*jg?B1)r7hjzb&-0JJj|U&&9tP9h=LaN@X(<2PGs()RRkWL~xey)t z=r;3eOi}$n3by6ve8aiUy>d69pK1%r3$wd{@c5x-so=bAa=de<<&y>ERVp zqs*pbY4eopc}c2!2aOxbEvg-M(A@NO-(Pd%5m#*j58tEY(N#aNT%u2ddPk5pUFf_D z=bSoKyZW+{26c&cLsHt|lPfj8FsqH|8uQ2e9RH7UMy4&1NeLIpjc}1kaqi{~y_Kvg z;(ZTa=|5pqQd|$Ak!3GzsEZ0*t;(Z$7UTJ>yQaf4CN1eYCGs$(iqfcClSx!AnGjFv z!_xsYZWr0B+2lNf+bpIU<~m;-dyrbumUm+9QE1U}#e;0?0mjwG zJsgLQiw}|TCbQ+Ge_o(`UHBe%1VaK6?J% zpg4YDPGw(L;e603`MoKzHuI$7O}%qbUXl0eW*5R%oaDa8Rx(}RiD~r^JVo*cbeX_$%%QEvsB3mKjuB3dny4RbRG95FH%~6K1fY@ zI*+_Dfe`URf0oM72zM8Es%a^e0$ieunfF(f#W=P)PqRh~ym)N*9_C23XH;ma?B!X@<6pf}=-E+b^+tc-GOKMy1`rLi{ zMGkziKX@3pEFR^X%^h^%egQ{R6TON^L~ft`%Fm~nf_5b_WzJW*zd5a|xpvk@xTeBf zKVDp@T}jk_txUf{@7B+^m;>{>z-1y+@f2GE;o9I*a<-_oP~2n^R3$1P*s9EE{-I5N zP%$%g?t=Wj5S^(YtLm{^0{Ez;P(r0tieZe`Q|Y4|rTVuc3ZIS|dCyBe%Q5#=7M|nK z<4JXYllCT$xn7*~NX#`wMP3a}IRn8}9Rv%f<+5hHSfu3ODXws8qx~Gu=35^LnBk&y zZF;R~o(eoJLLa5mZ~q{-g*rrFu<3pHE^c}^{B@R7oM|5;XovG5HdCGp0SrJmdKOcE$MW8y;92HQNE!gx#ZU(osRlTI|zTRaS1Q8fhnq zcwViZ-@*UNHyyqBgtuMkne~&sR?$xzAHM^3Yfnbkl&IAJCbD% ziJ)-GE4$+lneNq%2w7+xm5(xcSUJbZq+NQ!^X>Z2^C@kts)mJ+ zbjY+NRb9bcmH=prdY`mUW5t_?bmL9DnH;f;FYk+1-;!_2)C=nnsQ}Y%%8wqztLG`c zaLv_iBDYqEGjH)#O83anju3VtZ|rJV-96+!-m1p)nwM43Fi2ckY{fnrKUTE>9zND$ z-%7SzV`toY8+I{YWE**`kL!698m*+#F&nYF{n{f{uebDT%yIKcdk@od*38Gbi^8U# z1g?<6nK*O|_<;G8MBzC<3BD1f)p`g7hxZ z2}M+@Mx;v@klrD5g3^2ME%X}cp@w`r@Bfr<&fS@Fac&sLA8pVXN|TJIKV`KAc}7aB z;xsi{Oy_B!s)Q{z{q8aK+Rw4a4NgSuXl4@nMAvshPDe#!7Rt7nf^s3Aj_Myu7oXm8 zwpn*uT^Cw)EUjES0?KoKJTG$r#e8>Q3%MAylJfPTZ35e>hVGmOcanE0JQn}TMohin zl1H!y!MY?}`lx(7VbJC%SwJBvD2z$YfKB8mqM@8S+->jJWb*yS59*N)Eeb~SEh>dJ zUU`+9ke4qkp7-;OzN**xp{<4c?k|@ZgjgJZSyp6770-+}I?U=$+cX*5Nc|w`i9d3MHwqCF`b{GXEz5J zZo3n1me{ZDS+j@Q)(_Ol13L}KS1k4$6;vp&c4Mokn#m42wZ##L97uGIz! zXi}-<2Jv-^M*3%D28_Ujhq@(ztbJ*Ca95R%ZMt#FTwhRui1YZ%CcTlQvjGO?{UH18 zp@JBd45+=zci{f!@s(%41T+;0wuy1(O5 zH1Eqeelwy~`P!4`Jw4%GfEAa5zWR21E_CQIb1+iF&R~jdkZ7Zrya__f6*a{?SDKYp z&NW6GP`2PT^pBrJIfve-XJIZ1D$x00JdoeSl^R%%8Xmg)x!gC0Qn##pCP-zXT@PMe zg@h-#5j2*c(@8iUXM5ltC*avhBAyXg9!^)Oq%AzC^zcQ~AVpf@XfAIHN@}o9Nuxmd zr<(&0T#~?5a&JJvJtSB&R!6s;rZM@>-(ZG($G037)m1LOE|7j*moB%2uGtw4t1!W1a|Dnn zh}YS+Id&(i#lcx;InxraIY(c?V=D&R*c11qB*9w+Zl#Gi}!*iQ`_^_8zf5aY8221Z}PPcaz#@w zdxG2h^LL?Kz;1PT(dd%ZuPmKMu~(zLj#Xf<=)Sy;v%2k%-vURCt%3s~)_od9Lx|(&hSDFD1-{Vq|4ox}$CZYm$6qA4kh~ZS zr5H;H`(%VRj-5T>l_^G;H7>1ndv&2aF+<8ME~Xo$2ozOt6^+4-aV=(PM*|A+;b%hK zoJp&XkK~`cxnADd!o31m5SGQC4w>%B3vzc88SW$nMTI|6u7XcQbewEFnFxj>*M7he z$7)o0I_v$7!2xKmyDptDVUtsli9z$wAi^*2tN~byRjyzh_a;#Fr4UasmmKq&HwO1H zE${5=Czx=Szqa|)bvf~vh&HGSpWDm!rc}8^iS7Qz+d0mTCfB6S2J&~-YOgczKH@GX zR=S10eXKIgF|AY!ZkK$!V^+0GrIHf8=x@g`j;7s zhugx!WBrq#BDLaota5yi>4pX!S_v+Z*)3Xz7qybMT3gn}S6ZqbB7>9=D?D>eHcGB| zAgTT*UB6n`YQi$rrqfJg5eXihZ;gB1ALY*L*d({8hi)B2so{F{EHr9F_RC~e!oH3L z+OH0jiLWsOiF+ZTt**K$_s(` zWrD|TE)kZzc`=6er1kQ(;@#hreCKc{<$RU71zUQ(aLoi~q4ulMH6B2q)V}8*e_LKq ztCP)P4nAJKaI9u-fN5RSdtGg#Xn6m3fA)b?+Vz?B5U$=Ca^@hoO6kQ1s~XckQtXe^ zqaNZG`x-)C`WR;?R!MB@7I+Q+(SXN#z0B|SHlDeUm7=z-Z`1x+6_sF{sWJb)gc zA(~vK8vG-@=69P#{Vhqml$}(C9Dckf{V-K7pK?q%i6d0r%m1+mrs9i|{ zieKxDH3Dj#vtW59_G;Yn^!BVFg~0m3jO!H~M{qJGEq~Cl-59Z-0p~J{Q>z8*?o=IZ z1<2IYUbq*I-fD0Dp(72uZ>DVK`D#PY#ke0+%*df@Y;7<>cr}r84S}Yq1*-Vb>v=AX zzg1)FG)9hSHbK9I#P0MMLY9Ap2uKwAJkbm<$7c+qB+L}2&OS34Ryas8^O|Ux2y+)y zsN@_3_;PX8B`v@XCY{U$J;yqhlzz6Y-2S1YV;aP{+CRCO4cjXa>{0aGH*v->?&qYx z#I(&94BMK7{`PURD++YvPn3()8-cH<$_vN6I3X+i+bZeqEAT?}>R!!mx85I<05*Aw z_``23^8^1^CP|wo|Jt39h-bxjP`ShwT`s4+h|!Vl%vzn_1&2V3D2?7VP6@nFG%DdO zsCnP)k1_lPBOB3o>T3U5MXNJrBN2=xBAxPRU1w-Y70YL?J(^Pw&j61_2i}ny;_a)tyYtI!V_AQH`F34_-}uc`VBdmD za+AnlB`hQyeYdPap?vsh#47($* z@3s^E`qsd>dTj)9eHt`@@_I4%bDRk`Gb(Q0?{QMr+aCIDT96>R zI^Yu3XB7wQ5t|RS-L1Q96JShT;#oPBGF=l);|vt{*uuRH_nzc;XTDR<>A0gsWeDTZ zK|UXvP#D)r^gu@+?`a5Qi|=R|2HSQRN|&ycT}g#mmT6>MBD|dTh`iN;ZV%fQie~q# z`-A^KqsrZPvzH#^pFW;;o8K7Lvrn++f+(nejhy^@Y)K{(etAt)lQT<$TOqh+QSiiA za{Tqry2TVj_8g=!7MEfBF#~RiSYK^8yU8laVz@$^neqDdG^USh)LNR8SwX^BVyn`F@z$+!ZW~a#v{iK3fk%9}42LY)y%Q#zKCSLg{=EdXh!6hibBY-D*L`CJd zXO^F8$ryic$l!E-_2M|5R`s-xYEpbT{sF3NTXpjH4uLT_^z;BZbI>&n6cOTcpg6#PG2zZhan3)E)^ z+EZ{1`1|@?a0i*gQmi?i(}u^SayLj_4R3{#Mb&$de05{5qk}%z$_|64{bL+{``=^% zwRv!eFIm5$!wi)0@X^7w@fUJkftu06>G_GCd_|+Tq|ZW924h@>)1(;R17$B$&EfZ% z^!e}B2h;x^EC^bct|M%CP%tV0Hix!hAX1uao!zgk?m}Zu96?WSJ;5vPy^BWod>#2{ z1mDK;7*}r~Ak{aXtp4KgQwah-ikhaKxZ^K8B-LIjysFAnG}0h_RAE{5PLwA5dO;bl z;j4gPP;P{K6FV@c9UG)`8QZk=Qt7oPQ=71pLlp5)TsoodY9~YV7Hu=C#xzX9i65X%_}K5@Upq zL>xty2oiS$lcr|rL*yD4JiDC|ON3fA+deu?yDxWj%MeeG3K)>%8OZUC0U5#oug%+p zwnIgqJ;f63x}C_~BtZnl?^;FaHMJ6Z!mxb;P~j>clB_cIq};iKzr52MOYLnmBBSRH z9D9+Pf6SuILp(|%ik}p5o)j7M+8;&P$4(K?4w9rd-Fqg^Rvn)-&c^n5Ep5~t)E4|w zJKmKc?v|9-;%uw;;O^}jW{AVjh>DlqRTmk}4^}<2(q}fk530>ETeKJ>~!#9bzm){H!^0Y04NGAkvW@}NfZRl93{+%Bd$dq zdGvTrKk!_AiI70FM!oHO;77#U6J79d;vT$&bQ)^+^Vhb*7viDl(XT=@s~S<5lWI&H zk(0{1%32q!H{Wec01UC0%fHIyZjPf?#copVE$;m;aQ;HFWRozxIdvEQhg#BsIpIRGqDrc)A)wv_IU5#(3dRmt}mKHQjW@JJGNMCmC1m-SR1y39qp6bc+jT zXPZRt=sgXYeU0UC&ZfK3`XZ#0S}t$TfVx-@mod|5+>Z?GqXPG?{5I5C5Zr67pZ)Ez zIQwClA?OU4CU^WiFi;c3(UM0uPxU|Ws$B)TeNz3vj+4H63;x{a-?F!zcavS&{&0Dn zGyWxJ?`7A*HB9?a&3~1p3wH%sY^f0eQ;g+z@_3Qf#-4WSiL(x@+Ajs}|5wWmcl!&u z|Bgel*(rC@q2W@=2X$;|~+1?sTPU0A^pZRwQoXG`{Gm;+DDW1nHQNX0%zq<141 zhwyxGylEt*?{*e(F<{2&w6o{5^TQ(qsNxd#t$h^cFa#5W=+f(v3q)GG?kzxN-1!kI zhzUw;w9irWGI3avn&XUAeZ6slA)c56LQ(6Id3eot-U+tsWTt=1d-t)Alj4u|WuBoSAv`)4)LnO@X!XGea6!m+EwHT}S__I@$lS%b<{M8}J z#91iy7u^cVx1rYVt#TY9KEGcruD?Qb=z%!qPKSU|&fk99~-!ppGZ1xWVSs0j@L#&D_(+9bEAj$*jZcdz;9-Pqc zX?rzkZ;bD3&wO;xclf>tW^k()aP@lned1MO)CuYZq*GdexM>%;Q-(Mx>!Q{HYTfl* zVmM9pCbLUnXZjylw}Ad_?&@W3JoI+^-Fx3_d>c4g_qF=<>BzFoX@ksUR7v61Rso|O zF9)DFwYJ9xM|K#KBW1ll?aCweyp&nz& zk)nT%wVEsa2q7vfcQ6_J)vAy3X=Ibe)ef0@DfH}B49KuzKygXCtDsZw(u-uYZQ3zL1!MCXArQ z>%V&w?cT*$$Ggjv34BspyGRgh=qSMFFyM6$;$(4l+VG;|8E~Gqr4e7yI{Khc@kjZ^vHs;h5YsxV$*PMbwC+PW zhL4C;#(3KeFMJ88up{e$SZd1JZ^L;e1e_ajxLdIK@X+z*sK(Tpx#wi__Nr>mR$Zf^ zjDh8mxWPMXS6U&Lf*$EbomubWi8|bbOO`uV!G2`FLH!rs%>-2K#m*M}nz0t`Z|nTD zf~gDF198G33doAeBqeb(lg@9&c{fBjRK1(cy_!$0E7nfMzQbwO$Yhl{@Pz?1QxH?| z*_`0n97{on`IEY6SNVSYhs6;)>Mf{>=j((?JC-Zw+W-ENU9%Jj)8@ zeTXMB7`am*D)^w7aB;Ku!4tgtTDXgi``Bked0jwiCnC_Wo@G&A6weG$1Wgk+&~u#I zGrnJWMqmGsI&5{_&PJ zXC3gseJ`CFOBvd7JE@ype_PzWF-&?AsmT#BiCT@U8+H^Ls}@`KQ00 zuhIV~V5r?Qz&JktTVB`IqDcTw7TN6%E${6YN7ve%v68o^N$uqzBw_974aNT9$lB?v zNW8g^%kC4a~HyzVV_APKn2Z8Qq3^znE~rWHT=F$b*8Tp9Qf+Q;U{D49SP| zU_pxQAFYOV*IgbJQvVr6T3AQ_H6O6|nrC%2*cJqi10A7$cu$QWr#7B2c=U$yOIK6o z$Ja1+4VBa_Sut&o9bfHILz^Pfq()8NW>??b?;XA!cHCXS;Rk4ZF(mp2%I9?6+-Hm0 zr;zuCSK_HP25;>o9{yeFm5j-7U|Z=(fbF;DV~*l|#ukn{mIRlu^z$PH2Z&J2%ti~^Pl7? ze#Vd%QBC-5fBbt4b+&>MEk7HYQA0=CI$1X_pXT+K6Z0}R5a?lA-?wkUSa*q=XP2XXl-1-Ira3;|{hnC2!Udal#%6RKe)A*<5OjPFTeqR!b5Jvs=j1$o z4}`lnQM@VDF#80-Ut^%;;~`#gVe%hVA2$IBxt!#<4G}w)xJ#^B0ykXWy52xBd1M{w zKlhsUpu;P_Gvuz6{BrqD$3*B(t$u+J|gj(YZ9qu`Dm(9i{4_|~FGb(Y$|(A-14`^=8z@C4^k=Bvz{`rbaaRD6Ays{1fH#3 zVPI%^)F62>!mtVV`EckM>SZ8)1Rj2gs=vckC|wyKD2lXkyB_1S*;q|nc-(^a#-hrU z-#&FrU&ctri?ey%3iNU7kr}F9ci1X$J9>Kg{T}wX+vvhm!SJsjNPLbo@mH`?kI#cj zGqL;|->d@~1j$ldwS@{>G=3M7J3RW}{Ek|-H)e%mD|glijAivlf|)<|cBFA($?6{y zT4&+{{FQ*yn*J#}5K#XV?`caB9WR+a_S65s}Xc9lc)-Jt$nB`LcXjIMiulQe{16aiMjpgc zN&j!O1K>=ME4+%qQUrcvOT0dqhdCf3sf8%gqub=`l~e?r9Lij^J8okaT)~%RGQVXg z1Crb6bfs0|k4eAhUJ(3)N2~`$t2uCl_hXxi_eU|nWv*j>$V7hciOEj&K7b~;9BRnT z>DT$T055Q1job06#?M#yyHL;e3o-jj6a}uo6pikXDZhWA4)tzFziK&j&4%1Ri98kl zlKmKvje-kev%;$0i0&#iAin>9|F8bXg;S!x?XBA^Iv1h=5)4R5UiDf2Q=^ZTCPHHW zUsy7<5D%kSu*D=nRAxRIZNi8C3DV_IcLe7vt-U$GUqIrbC%3G zOXi#%kSu*D=nRAxRIZNi8C3DV_IcLe7vt-U$GUqIrbC%3GOXi#%kSu*D= znRAxR|8FcA;fEklWmV8CRmDpeZ(Ia0GnbT}KT`*R$bgSzpbJ#Mk3F}+W8eqaNnPSD&^XYI3FBv9NpL{vLD=1Lwj(2zk5&Q z&XtdsyuMJf6!P8q79jfF@ynA_%B_1dcMi!KS-c={sgA*KmzW(u6CYKW(SG%p-~I7p z$w|4Xdq+Mv?Rk+qYO|>0Y^WAhN#v%o{2=Dq^L2YS5`~7^`NI&WJ`f4sDdkLx{x)S)7 z5INJkVAXEf#H|u3@mFA8-~oMfgP&x6{vvx#71bfDVz}9**WG3t@O^@{X~~c6CBEZ* zBO`)kbc9YUQx9W<)Vd#cBx3=CQB`0c0;e)`1mC#)@&?RJi?xBEiCnHDWxtf7GWO%l5Fyz zPdnBF#-fwE=!KjNx$0bRh<1Tt?I|l}n-!&Rv)KHVHF^elFtwZaa3{aQX%nEDhoY*y z4~t(@;d#j?1@|hZpp#OYbp-sx^7!_@^q0}oAM3{2apf~--Cc2yXKZ3zZx9uDH*1d9 za_k>&`})v6Du-$L?R93!2E_Lx|)BFrTel)bCCFk~W zx!`teuIL-H5=aXV8?RSpc(q?HQW(IJNm+lWWd6gvgNPU1M$|dX{-wTwTtH9QRrh}o zU~Epk_DiI&fhDFGlzd|Q%f8pOr|e{fKZYAKHfaCYqc+IC>}2gmDGoH*MV72`$TVT> zmqDBWpt_0HNdSS*&U+4$RB^Tn5OFV7Q;rlMeA2_pNu1iFNb8aOS^~gH7CUmX|2y(& z=Etja5upgbH=xP(;PA?bpc#M4`bE)u26lUi_-hT0S?tF4@;vz>g^Mf}5Fz;5aiAJIqd0pSXrsZ+6*?sdQ zB%bI=*dIaE?RHBNSF2|T|JDI?=YjV)BjrE3t-Z}^GWRFgZdw1%b~kf*#yq->=Tuf; zA+Ou>jor6Fu?#2X*QP}_49DB+@n*hl@k%UJ!NzJ!XT}@}49MFRMioWz|g3~ITSSh-SDQNOK_*cDoW)nhOYJuU43ec2KC+OS=lD5>? zCd_dT<`{z^5;ifX14(Clu`Y$QTMCjD_DIEgg&|ehmoFj-owEF(Y0qgEW;V73-D{mM zSU;6!-6y@4?wxN?TpOoVP)(JvRcOQK#*GJ`nmN6qdJUUx&o)a@^oOEsTfP#I_o}Mg$4)P_*CI`xIhz2+>bPn*63r58)sJ1%p)2L4X4UHtu5;LlMu{#5p z=y73Bn!-zBqd6qa3~iN-sX)oA34T>zf~*uWyd4){U)se{{;9rk)_yWWJVV%4umUV< z%x)I`Jr*_b@)L1!9YH*XkH7pV_=qjUcO7SRs~*YD1TKU0UR5_OfAEUdcXoIE&ZaSF z(AM^*n#_jgIH3HEM1>`F8C3c^eh2E9IOc6`87_L)=HNhEC+w)w19H2Q!3@~`J>ag? z5%PSQ{Xvb#i9ToUu#3r!ZA4iOA6|0FM4%6Bxu^4%W-o;}1jqzR`I}O`gfELT%P-II zl2=E7p@Wkd?jtZ!!a@_Lw^>qyvne5Tgp%V%W0|M(Z%YhEE7BuHqM0%ll?rxQ)xd6{ql&?&p` z_0M@ik$zL1zTrZ(A*Yu6Q4$7jg;?z8DFwlY9(us|%a+Uxd#ikRCGW-@&V|%4yVdfO zP0~30mC0Mul8*Fy(BX?n7cZf*k!`YDKWUbUU1c3(=571R&+7_bNC~vDAX-ra$7- zv|@Xb95<qH8?i&?$-!t4V zOA@U7m(BgJ%loLM#;l%e@kO^cKfyjd78S)|#s8|-H=!X82h^}Fzn;>BT4EK_8rz09 zd0H+5TpVJ{mFz;+`L=JWTNVfEl)>16KL($A6%>;!G;aqeyn?hyQm`gs8+>GeL-%Bs zoKuhwuy2hGYCZPV4B1WrYWkiRj)Km#{6lq&-#ED9QBinE1vyp{b+x8r% zulE5uV^DKF8@?+dWIxBg?8zsG zyalljl1>4H_k_@l^dwEDE19xRUqTnq%+RDajFkI(GKm>aUsHA8A$Rz zMqBgDe^WJ*vi7sguV&nnlkPQH#`;hfUa%m_fA`?=lEmgKa=0%%z>a z+1r5L01f)4-#+x!wiOi4-=Y%~{-H6u=UQl0t0Mbx&4Zh0!i$@jYi{{SUaWrHY0u-t znX?!iMd=L9p^e@>DfdHFSscap()*HOz_^bF4d^6f(#0dGVn!1jxP0*ZlG9`pfsBdh z9bsSFFK81y4m3>z+D&0Vu2`K+`MNf2QVdFhTL#|rGm>nio?Cx*Tcn>#r);85w53U? z@PdpP=MGE%6(|QE=uiwhUS_=k>YS#rsHR+=@PX9yGlI1_JvWMGtT$<;CO-IVHA3L0 zhubZj#J4AkPx;6Wd;IE{b%^o~_r}sEM(GC0j7;Dvk8(u{4OjxWnBhJi!(3?|rial3BjvRng2+t(h3kJmKd=6kp5Pi~X=~uoNv>cWkj@(~MzA6_Aj%`9rr zHZ%+|O;&l=l32VK@SPV)+f&XEMXQ_v? z1|ZBWhq|Wf(Y4C;K1I&F1Yfsb!85_6hG@nAwt8o3t5->(j1H{RF;78sx5~HR6kGp|&0U=+^vR%nK zU-scz|7Xp+=w}VJe+88OtPaahp;UM&tDrhgxi|oV3-fGzoBA9j`xU$l@ea+9(ZOvs z$_}GYU=BB|-&i@=O}zIiq3=;8pb%C2@<@-fX|l{#(4s=ikUReU#Q8IKd4DJEY}Z&Z zZod}>gezbhUQt|cW`MoKi(1HK$eYtL6}6FxV7Jxis(G@Cp(14RzBSa2Pc?om zw>*QI$%JlO4!EL=S3z83qM;G)xZ|_+hZ!uZ8QKGiZM@oY)r5Za7cvl4v===N zyT?f*d&CHmm$?_fd8^*vI>P7Xhf+vy9k*Lq)|wA>%;YcDFu-N9X|&8#0Bk)kx$=i1 zFW3iq2vUAJMyjXFnS8Kn<5k zx1mH8AF-Mb$qQe+%@gQ|bqaOITa_p>>8_BcDrP>*l}Gg>I#m7=8$IeL4*HY)lTR2)xc9-$UPU8vUnT-GWZ|=80^v8`06ZSjae+$R8 z_j61uO=ld1I+10tqbb{csPCXT$(gAQ8W$5l>sR2&O9)A@`1ai-CDQx3Eel=%i52jJ z%TSzHiWO(7#wizfO9)yA1}{0e~+!%HqC{sRWq`r0~m{L zfdfq^QzL5;2Qf=_X&nAW9bGrga7^R#@bupYD}VUs>`&5E2kpjA#_AmNm?f!+w4fw> zSzRp8@tD~?4-?t>r}Z%^Kx?>DS7P4*0%QIIpI!Q2;zzYvom<&$CE^$7=q*fU$Z5pr zmHB7%WnTqu&QYMcK0oQP(_{FlF9{azX-YCA^~0kw|L1*jy(BPHkGsW_#;3}#D+d-o05`Ng5;{rqsaFz#<-(*$j~rbxt+_fHLNXp1mz`aDbb=G0XG|r zBzVq-yx5V!_G`TT`WIS;)B*(ELk;lwpG)HmnnFs4|O*o_!^oR=1Pu5LoZj51%vb9)tj3X*busX2k1>aO&qQ)A>eTL z>oAdC=tzEq6bj`^H)%cr^h2QqRgBPl8q1MkZeY-*@wbq02XAUgA;?igo5`fo zH@5t;@N^1-s|;c!5R(5G=$?+fH?N1OQNe@yG{%r{gTX%`A^2Oc`H1x6d*)WPYpJ2C z$h789JDwobwZk0>)P}08_nf(-FQ?c&$CPa$`fEtuJ9&UCJc}$NIX>1Z_JDH%wQFW>N5kj5pOu2E?;$jNXcu&u^hjng>{1u6F6 zUJ|o}K%@9fLL_8hV)0lMBSme3@9>u;Lk#4ylm6)%sYOGJ#kV!7@S^0Z@8!bHl-rpF zCc;dV-IFR3p68jgB3NHnS0#qR#v@`g-Gi5vk{S>crP9sL(0Zu%UTK0D9(9;2N!FP< zA>JavtxRt5Px~%E=pt^Z9>J0=rGb_qHH)3r)S>ZKopAc-B#qc4Pi6w>hx-4cEoSvf zKO}BrEE4)2?}*cj($<7OmMGttHKAj=w!$O)<$Y-6f2|rW=coVq63|1a`_LXh38*GE z1d}qnd@*1sEYT&P{kybD6IM`ALA*slP=U27l=H7Ji==SK$VkxmsMKuBucR6JKruI_ zYek0pjX~Q#>s-i;--jS1NYf_ayr=^_D&CALo-M&E_U6!~GOlqE!D$^eZh^bw*eP(m zK(lC|_U1<;#(PaySxtgnQ!cMF+S}NCwI_{}ecvK!>K1pj3`r@@c)A6eTx!#~RI$o^ zhj9idhAZYwwOehNTF9GCwU7!_P#{s%IvQlccRG6{3Zlj{lP4N0Cmou%<6Dl0SRc2q zY(TxFLdk89$7up-c)Vvx-uG-oq#Phv4pA%)@6#@Y_1FfZTN!2t{X){0m($pa!g?G_ zO{GNwXsMXk1gXnt0=*`yWVh`4?!K-RBh4=VFe?c1Mw>FNOxq z_f5?IE?u^k5`OhTbptkQ?fOyMo(;q9+nGYxIskneH%D$feW(wFh@-z~N#>O{J*S@3 z&3yCvwn*>4lH$BMA;*TQ#<_uQ$BDTd?Xw@rrjHqp6s({(mnsf{d@q@il;USnDt?<|pd?OB0i?4xT!|N&Pk^gmcl zcVExY3x&%^w*j*r)%NCylsPg_1aoUa|F#z7yd8X!(%lNrf_pWaA>mpKiw?7(r1!nA z%OKx(^>-XdiOcxteo~xn{vFI+sx!Cn#ZY{=)luYGqIPbJTl*Nbq#}Cv*`|gxY%D)s zxE(gDmjsa@0=ENsNP>^Y1hO2HRkSxL8b4i|=>i&1mBmAvh{84&qaUVZY0qHgV{LA9 z(S)ToImjlU0Y@2~dviD2)>7C6*svM`KeGWb`xfG3542-zIzHkzU}i?Y1E~(R_(_kh ztB>EcJRau~G)#E7RzlC3)a0~qdl;qV7(Ogtv7s}m0~t|ZsOkMr zuI~-e;69n1kj4<(U~k=-@F6*IV6e@K4zoyeJ*a#=A9#z79^k+*CcN5Tf28dBEyw#J zC6}F*^jw~+fh4%@fvog)VM1x@YEL};iP!xZhoMg+?p>7Sw6wGbmo z8^|VOrvEs{)&7NX8l8#Aq69x{aACr7-Wvm8ZRU!RI~IRk3XyJ@(%Q#oAczM1=wBp99a8DtB@ z{-r&~*f=B*D#1j>JfO*AL~IZ=5y+i9@8yVm1KQ|o%g@)MauFt1_1@#(F+n=34-3wj z#Jg9llw5=jU!ONcM*UHkif|?S+41>hw19Nz4C$7<9NWIFe?X!qb(yq>;slr8za~gk zH${&Ct`mtgAbBn>xKJ&h`{a@_eqxn~X@`SA>1{_5%)jHHL+#JK)s#V0K!%o!P%nbb-XFmOv?GQ^QI=8Zd_M zjAdT%gYffG+Jd~~dSQN2?vk;l$bttUbDoYK9&=7xpZ;lhFtF}d8t57hsrpKS235K< zsc$gYY%uHm#H~z#fh_*A&t^#yVWR}Fg)S~}!(>L~J@)$~F&v$vt9aFF(CYCH>RCAU zFWko-3W|0CQWtmZQNUZHq{gNlURFix{pS!sR$sM2MlMqs;5UyE6|4 ziu-nIR>(?k)3ubwDN3)1c?e8wVqOw_cKQ1z#pP&!=HV*@;~KL9U;?}Uw+XyYJ`oFM zqOaW7MRm@8{PQ_PM3jj_u1JTXRDF|TVPPZFYu!JY9f$p7cf`=z_Fn|vvE705#ca-V z5)Y*jz;%pga(cEiLt3Lu6&gS5UXWJ)5}iYidVplNf&3JNkKfl-UAmf) zz0@T0Y*cF^q?__->kE};9=Y95 zsBb|Lu9a3Slp5UeEmaS)f`uJo}Bh$z41lystx zl&pWYc_ELo{#$(Onu4j(%!B%c)lW=Ern__RLW%e1_$R(?Fird=tA|Z=2U2&;l0Ef` z`m^vpljK6Yw{wxtr>xJ9Z(CC|H3|{Ieu6*?!bN48gHIzWu&F3q$m>Km<+P(!&ll3t zp+&ZGQF*-Z$+hl^mxa>JppW^bks&zSy++Lv($4Wb zi$lKxtGk-A@fueFQqOXuqjy0CGw8qQkV4M+vQZw{s^^rI;2RTXy98*vF7twMLzdAJ zI)epCaMTXx2ZFUW$xdYaV4WS zDTX+tudV^lTHs#*p7j};_fwzbASL=$$OfLix&xiG2mx}Fow_?kaDfXpa63Vf0EicQ zUFMUCWA9!B?WM<_P^=v1aqmzw<|LJquyP~`=&?x+xU_T0P#21_)`T_KjuiD2V#O_) z2pi2|0;JFa*j{-`YrrrYfmpLO(x-;W=)r0PPaRYE1u6v=UN*KdN@^=*bvYN z$@hFA|0q_hrN+5tY!qkc5C1aNZFxSnpY}p8ZZjmh%>{AFoE^@~02l5t=~8ULIrS+T zeL%u#B~`yNNZX?E>c4V+lHOR$5*V(rz?3(n#3VDH>EEoRN%-ZQ3$c&OYM}JnU&P;b zssOdS5CR$hY#a?%-*&6VO*yZ#$n!qD$o&(|YjiXDJ zhUF}({h+yUsrUb=MOum_!PK{U%4gWCUTso*$MW+4%J~OGvnv;Hff##a6IU3&3N7@6 zZ?f9g2z!#5{e6aSbL%@~u}3y*FlNN#fOrf8sls*A`aPcUa$+1u&|Tx4InKyG#evq# z4FdK76-+aB^$o2rzqr~^CuuMq0PCu?XQ}uy;2S!-8^7)@9SN6md016;^VIHV9U~~tMIjs59BQxs%VI?KMqc>aL)GL) zMbtkaXyZNGJ8VtHLrtk7#nwLJ~c zV2fk#=mpwcCmmaq>praZhhFVaiubq;uLky@)J%MA!aWMFttwmi1dhA_?AG^78NkqN zL0)&|ki5e zS^h^c86!S<9E?rTS$IfFDi3tJ43VZX_YS%8!)wsqqU5zQ~%P_`k=ueFOIM1R#r%MqNtP5Y6&R0-Xy@-#MSpW#rp#Y)kWFZSwv6^ zFyu4_M1p0U9uNtf7<{N55D6>=i_zaVY06Fh9RcA2`|_|6PTQSfUd<$Ak;#AnY`*lR zyYVtMmE0>4i63Jb>Iq7eC!>}mVAM~M5tBLtI+y934eeQmX5U)d9-;|3SD9Od}jm;Hh!GCW~a*mOA< zBi3OV6k1J}cZ*G2I&jV&i|-xw!k?MIFY! z@;>qorA(U0sbvaii#OJHGp+${EHA0@!Iva;S)3#gSxnXH?+{6boskj;^)(-Kr747T zxKhx&QkfCu3y%zJfvq%+fg;EjhCsUe8b$o~zbJe2c&OJue3+a#oh+3K*(&EW6%mTD z%#4ntMMfxuA=9L?HDsG%kP6unQCY^4Ez4N4?`6goV_$|WGu9bnpTRIZpE=*(?|HqR zKcD}-%xAej@B4aR*Y&>c<-MiPltZT(+13C}RJ~nD;cejRU3{^r;_SU01?Ith7Z`=mO@eIe72@S z91kDx5*!wpOy>6!oj3uWI4RHV_ZWcN6-w zakUp~SEj`><{cs^ zTITOJ<_ml1k$bT5i@41cZ@=yAz>MedGBNM3OWbkvhg?!`yT&<+@!$|-nqZ{OMh;8 zT?_ZGzjSQrd3^$I#sW7Jum>Dpy>EmCv_)=W!*-%$!)D!b@t>1-i410ro6z^a^D}^k zBq$%FjyCgAnnZL1pX6ykWO%)E9)6C$leE$7bV{uED>#s z_+_$~qwx0Nge07MoD!b9{K+;cuKY#OpYKb+K7eJ%QTx1(z~Zq~w^cW%79v}lsKG5kJ@4*-gp8Wi{a`QYAN==fi^Df1g z^q;%PScVXUMP*~9-W=-GP909AKS|Y>(E#1tJwG3RffPb{;xJP&SQXoUlTa~?B6K{B zmCvy0u-8q>2_=Yr8$a~0!KiHKs^-Z9oL~d_T-f^z{A#|~1nRc4jxPE_Gpd#vf|04n zB7vfyE92|*w7PUW^N3?W+hIxXKPZX&r5Y7&4Y_Ve&?L8@-W$rwh5JteXI55BxY~); z;Bi2(gxWkV0heqnID7Y;{-xF} zC0d5)7f`xPAIPUjA4gBBj9hMJHfJ>)=4Z82KJ!IBa(?EVSUv8a_1m&J^RAz)SUZfL z+POpUn^7#aTSwOTBUIs4^_I~Z&mx4Pf@MW=SW*_>RFH?oBzVVzFIo%KN_Ttly9R9Z z7)}hGytL`Zbh6u#w;sj2Ztbt}4g;?>X;kJLy_65NoY^?}2Y29>$2WIfp!$JRqCbeL zH;Qyj5(9rk2U=DZSA|*qX`U;bpk@r#rFss6+{epcDsSA@@Qr3*LZj9{fh#OuD~Jbq50ag#zrJZD;eC# zTjdr;8$EgJD``VLKtj&wHD_3G{=KnIaYV=TEv52)E1Sy9sPS9zmi>vyV?xO;>bS4a zHbdKK7W3YyJ@%Q9C5uxgvG=4#P}ljp+hLpCEx>OP!$vp$1e`b)`#Zb?+Wk3V`zvDm z~TY7;&lH!Gy5TXaUAnG{NlI^CW|J+ycv}trT+NwPr3NAK*zH*-N+hI2+Gm*g+ zl$Hb0SGYP%p*Mx!1Md1|aHWyB)1lPYc!>i-gB%^6&hRNQMePf}tAnf2gO%~_v0pCX zt{S1+FVpTer0>K86|Z-dmEKexPsfG#tG+HnJR|ue@4UvN+l?2??O;rfv|XLK|JPJO|)r zyc>3GNuO#c#*G1edku{q4Zs2H8~f$5fG?D1xG7*O25SZ$E0^_CYBZRALwXgM?ss}% z0?DJ*ieJVZQJ=IA?2^7Z(cLODR%D+JkGQ|<>S(`Mi~ViX`Dzt|qi2!~0GeHH^oTOO z%uybc|FngCNOMR5QR6vJfD8$^=1>0gCpEopyQa%15v6t)`dr>7VEOgxzQ4g-_#UF2 zsXj9$|8iFJJ_7s+bW&Hu+nT|ETpEmIPYA$rqzzx0R9O_sMQk3_w2 zw?c0@3roLg}4{c1tN9#^h>}llM&g< z9UMtBo!IhfslL6yGFwt#mR*0wdiG0SZLc$@-&&5xnw+ys+1uWQH3-;4I2Z3^$c=je zVqiJU41}Q=j3r4hBI67i#c(UZv+h%AY=LY0KY=5-RiIp+T}6dy_a|(W(gf)0oK0(f zr9Y|0dg6|m03m-J;KTlGJMZ;SuvY7uhk!cxMMg$~akzO-d!xHl=+I>CpT>H|5gdcR zmj3`DYDzqP{2gn(xRol?X{37ztM|kRN-R0#)Lmz)RIDW%j(}C{SqZ`(w=Ir} zh*ncgp3i`;8She^L;CA4l>Yg2msubpRz{mOgmHR=M#F=K_80Jb3j^%4f5+;Kin8SN zjMn}D8ZGe;-wE%1e*W}O$LK%zNL??z6`(zw6xOH0_?Rh`4Q-K%EycU5)U#E!%Mi3s zi}+cujTh8xQ`#w&4w6(~c*o10%BmDqt)c8BZi$?fFjG8S8UFXYL)dVBOP1|(KiX~9 z3C-!lq%eTV$Rver-)M1jHvw$|ni0-)!)VK>Xz9RdX^XKV2a&Ll#e0srx!We?#vqKp zZA54YUEm-*tUA7Cl%gU8?e5eS_vzc0T7o5DhV+lrzLeE=2#h&m=QrqRWs^nf-`#6Y zidr|zrQp|HuD!6JEkA2GykfsIGAXoFw>chuNf$4@r5qUdJntpXDwo_G$C)HW`p%0) z&95KjK4>E6>5!JE&YoL?01sm%TEm)2L9Y#e6nWGdq7Dx07B$u#mHCp>BuVVjumnT`pPKjr)5( zt=!UwmI8Qb#>Ryzhxa}o0SyGV$G`rPnH~u$gQ6H$cbLE5!pouKeYn%}0zi8RbtDs{t6IbP_XkNu!8T zD$ll5Qy$8*#Y?KJ4J$lIT-~UEq1Q+%oOhAOb)XJhysSe$yvh(;nQswwJcW~{Bo@fZdKpqoch4Mo$PuMG(5#Zw6nz#8>~Mv4(F?v~i^obr5?S zAnvk3_0>EvN#=25o4NKC{^Y+cNFPt(Kdl@G`OJKF|AChjuT*sRbpf#|!-czV!6Y_fDdB;3ZjyWVFYm)YU3*s`fIYZmtsz_U$w1k6Gl z^`1{mKq%jI*9Gqjbm)xC z^fxuIIzL&8`7mBnY@}zExfz9Jbt9A90MCFUy6dH$rz4*SmU$T z!EmfogltI9G^0u?4Okp}+$_eUb_|L_bMh<($1{*yfND%;Jx(eCQ*w>JT{3lHJ3ajo zwe@T6(5O$h-=x!S#LsgGxi72p=k1GE6Ze>kPIG&Uli1_t#0P@LAOT@Pqdn$OZI>-z=NZ-;bZTnsgaxxVw2Vp5yic2-tjIy^$M)K| zMJ0@8D;Wm>Z6Wrh@I>k6Mpa6L*-1y8WWIjKZ+4_S^49s_RTBcf|KPvPC^@^)Lqub2 zDt!uhjofsA&pGKms|?;FmSTA{+BpBpV790XuJxXfid>DZ&z2#@~@He|Jc%+=?A|VB?}wX4K|~m57vqndw{DR*Mf6>sG*U5HsBlyi3|A7b$M>3So1Ym z>*lVAYlNhQBPo_+7K??&!?Q(}(Iw_}s~h*?--V?ABsg|h`lrs`k5IKavgI1+wMrFb ziQq<;Chhi8@mx1M(>`~3; z9UpXMMQrf!Irz;wrw$)|C`9(7+R>R$st=~sZgxN9Yj!>!@J(v+ z+>^`Gfp|^Hq~|}sl|*(14&6-Rb9SzOo22*MkUrf}mT)KPuFUF4JmGf)u+DG14QW?! z!uOsmGS07ps2WdW_eCxbRpcZwh9+>1Qo12bO*?7?$kWiE#(d`tWP;;eHKJUB*_I6S zjbuiFds>Kk>i2mxWe#J~2QZ7&?;#KY8L;Hpr)!dd~9w3-@87bA>g?;On!R9 zP*z`KG@}!GQ966`HN2r|)|+o5_LWwCM_39dKon{>Wg`E~%;JByYfn>~Jl%sErj2!| zH0bUap7A|BR(ZoBc<=*1;f+jf_VQFCL!r}h+IhX&OvUq+!`ij%6iH*8(TZOOvCT3u zHcjp2?>8DFg=y8ZBX3vcSJEaRcFuJNU#Vj2=d($gC-2f%uGu>C2pk8EcXnU_QCzRg zX;H5p5+8l?6l+a)TYY=K4ZqtKfvE9f4xd(Zjp$W=CvZ2OWkFCve5(&(EU;pqByo&9 z>L{gvh=}-tt^))9udh@R^&J_^(uyi!tA1H+AI#Q02^w9cwW8l6f9?L!aaCltOJ_NW z+dAOJ9dzr=nQ%w{``SIQENWPg5xN=8(Z@QNVbz-LZuwen zU~gfX1FWP|Rbgm!0~?yA=a-3XAu2dJbPW^?&O7L?XXym#=1y zCOGb=^hRAwlv88pPg79v1voH%iS5FH|0(~8i8ib&d&A)C!TxB)wGTepRSIYHr~=%*UU^$cW8#I>!X;DRF z0e~=lZfBFS&MFjspj+$`ZN6_qaIdddAK#js{q08T==XYD=dO~)oWI8{!!~@2X1%%= z|0>MuvGey#;-fWkEG|wVnt@0F3?Hn8iQO&_q{n4Fy-U7)CMqQU%n)&W?j8rFMJv^P zJ5)H4&I%=S!`%ymt4WLHhDjxH7^DpvQitnJ^J?*-Vy+Ad-LRw4vk_XO1L3jX64)D* zOo+|kCgo9*=RLaT2WWvtw>SNlR%*1BW8znR-^RE2Prj>ST-x9A+i5G7kx;Ze_FAUyM7`$I z?>aY0iCUUrO+i1^jvGo}AsNd3bgXe{6S(CpfG(B&eU^yH;)GVnwsST&%+RDZ^8lcW zQm+R&2B7I5BNJIjuT@U?@;!n$Ie;Xk!ia=D0pWBj5gV#EA_^|i-};P-M53o71!hvm zeT0cNAzf@qYb{fs(L97zgB)v5oD8!_{|>Ip-bdur4GtZ!C%^+d>j5#t(oyhJYSQ=Q z{7;MBXRy;6;4@FS$44-Y56Q)i1dNF8uQ2FzFxo2ZO2C%ZvK>51L* zPMU=nR4%UF?3qeECYQyYM)*rj{LEcuWq7-svfCds-Z&~CkK*Q3Sa?UJ!N2x*JaS$z z!LCT>k%u{ocOnT&%&9Vl=3DWJj+#Bwm6+^+ko`YfO+J&7gPcdL0aq3lOV6Y6wBKsA z#%2i+;JyAS$1HmjCW;47v5M$(11e9fpLOB4M+WzjP&H2cFXBfgUR76()J{F<8Ph%Q zzAh@_T!latBVF3TsGZaXK#S^C)l|6b{(rLoY5*89W8?v$4%}gxos?Jy34XJ+1t#WI zqAH8QQlN3K$5^&n-Ak3rcuLTs(mD@sh zM2Vr=^fIyLEc=QmfzBqom-YpU6pUYfUdXkH@XxHO0@ANaOBD^EB_8cmztOYFvj{JD z-g?H9#M&DlsyF^|5>#yY8I!AVt~$Rj{(>dwuK!p2kaG_g!~0_xi*3y^)|SJAhzMWK zFyY}JzdHJ{E@gZ^ZpOF8)fywUW@e`kg#~}~@q5^=`S^R2$2v(GYz{#d*nRu0A?5Z| zPe9T2mkO=|)YTbFnh?2Bntvl(0W0HHhqgB%CM~E98i=#p& zs2gN=(z66MUAot-B4p2$J|~$c<`;3dcFYUuAnxQ>*pcRBmQ)|!yEqa1tgrT!U32%6 zjN*C{o&GyxnCEc73CcWPpVXPi%kKcJ%kN@9C+8lGYc(!aJF=y7MG3(UUGBoi{ma`}p+wt+s5uQp@lPwFKcipL^5# zYn201UB{C@>IXHMQsTi0A!?R7H$At#;$Gy zbBPy#_=NmA!!S2leMt)Ok&S9|G;W1`?bneL`nB`0*9Mvg`__}GZdi<}@pF)}>ilv) zwrVKezaOY1@?;Fl*HP`g&U5a+w&YNd<5qj7R$H|@zk~I}h}2@a!r6R5VXZ&wVce`UuU%d9 zj7QNXvsH=#Jy<@26phXhV^Tvs9|4_~76~i@txy>nDNWo=fsjH<^Mu=_$S^JKV;FOwePJYNEBkBMGAt0H)6J9Om6czw5*@6P#T3PG+u zI~v_&d6rNJ*yO$VPSy%qe#Wjd>36U8!|-7D>i#>WkPc|i*6WPl+A(3MYxv^flCDb5 z_UmkCBl2gU$uO_mGi3p<5NO#-pdDJS<%+?y%Y}Y$0^aAbuYXUI+4nZF1;<9Vp|pFH zLDEy9SWiIaeN`q*>=qnQ=}WLmZ+VwU|LTt|Meg zd(>wU@c6G1m+M`)`3Lv%y_E*dlhBJHYmx^Wa>$my{EK+6v1=`!r8?dkGg0Dd^t_OZ z42(-i_bBq_Bc6jj2tqd+H2jhV(ONbr>P%vof5h&Qap-Kh=z<5=@sb!zC>gVGi*if2 zP-I>8WwNDMKkaYNCwBBGmsa-q(XJfDy+xier4%M)J#s)uLYgen)nsPqxAwyRSOSU# zc|PV$X3c^2w`MzBV^KX|!-c*=+stpy3Ot z@Y*n~jJso?lu=**#8;o^8kWleK(=$@a`C?J%6yep6Kl~5cIC2xQTZk%h9xR&C65$a zh16nb^gKB&O4iEOJ9SaDTK9azL{9_Z+TwIuqwkO8`-0O#b>2s9-n0EmEr6d=jfwUt zYL!{DSCIEdF18vP%@)A@<6Edo7=LScbQJRwYuCL-T@ICpRUXlZH-GPM2Pp^yD%v_yuR-Wk@4X?kQ4W$B_C??=kD zlSsC(`+j%onF4snIdMQrphjEO0Ini1JHB2V^(B&NsLseiN+1D=UV=>jYo|GKrt|7Q z`S2^oCL^GL^3P1jh>w0S_dVRzgWUlokvV6yT26|yR*H>5X`!;E!6(F#(gI&tY=s@v zh$I!FLeCsYVW<~w8L1<*c5;Vcl&Ml#8ErHrLx$TgZRZzXifG8ij2?vUSXz9Y9+GkN zk7tUZr#?2_%~d4nxZrG=>$^!_0bZH)z+-R!oR3Sg5~QB)myQb&)Dv<)RcQO%u_PZi z^lVYHR_j5ubD;tp(cghb6+R`nAPjZp875Ya$@;A1k6pMz9kSy22XqLthRykpakT8u+^B zI}g>nrDZa3q4K>2Wog(`NxJI%M8Cv$XQX3`#N)kI8L7p#yeXLzrD{b+yh3a=$Zib@ z>OdkYh&SgR6(=7L2~a}YYvO?Y;(4D6kHr7t|9wF~_UB{yRZ@5T`DFUCaU{Gbd{CiY z0#xyHZvn(yD7)jKyTQ5LbRFuT1}mEwRJ>Z>zo%$Mj(cUNyYZQ#yjo>@FZz-^B_VS# zJ0M=7GZ_69#L_hGdBzh5zw4fO4p*BDY}1Pqs_@Gpz_d0#`_q1_p_~8L z;mHe}^W?ZYdts^$ws+o2zbvf_CYe4Eyun+;F@JpYt&_61j}Sl=M)E7m>3hBOJ^f3y zR0#kk#ve-qfKOsrc_MPE}aAJdL1su)|QXdWPcmBflfh_rYOeB5WF|34 zy@ia%tST5s9G9-WQf|-?N=(5w+JNU35hLJs$QK&>1rjrgtgC_`_p(uViro$^wt?BP zhvX)I5JKKu4GN(X?tUBhLVfm{Eq_Ivkkl_hFE*^k6wm0_sIn?>jM#T}5@mayL_%d= zXQNA=h(*sufj;%g)HjCH*@j@f8xv>bY;}zvPNXvxcfC;d^QYQ}jGCP-mcNyK3<9#E zfJlw1^RA}_e5o>lzs#v65V5#>QGV?8TOlC%sN7YW_|54sc}8EB@rc(n=rWq3&RQQ# z%dQW-S_qyA{rn@k%<&gAGwQxQX^oQib9ZCWYJx%FjESNa*Lo3)PZKn88)4d8=fe}T zg<@%jzUL9&ty`?R)5 zIv89R0u0QXax=9G-J?&naIlqkhvxR8%OrNwp-9!uCIpZ~@zZL24N8*MnV1&_=A8MS z*fbxvlLFroTw_%}&5z}%JhTJ6X?46ob`|wZSUfPg6b1I-Hwh5-%P|B&jekk${M}N? zc@?agRkC-FaEZ};yUaSIgzb5c!63>zwS4+rS%(4O4(CqUCVfB|cd-*!x1}}S4+`Mg zoS$_&@f2_9BJT1g+9gU?^*v2h#r3;YNVSZFe}7oCwtw2RV~>o%K6O(8cu2sINbNw~ z%c9uc&#i8rbKd~vp63>g;ME58+q>oW8Lt&tZTeCdVf_`((m%zBsm8Qch0&9K{X5MP zfbRj_zx~;7Ik(M+itVqgLa-nW2CTd&M=TbN<&3$~9{afi=d48O}%OO zm-mv2Ye=+0d5gNAKs3@UD$wbIarG+Yo$e<&SHx}!kRqZ6M937`v#SChc^5A~FR;9llm4rcm zen+lU+T3+-XxWWWkI$BA@uI7o7%I(^$i`n`lsfA$vvH<0#XDGzjC`%7^BO&d_Q>x7 zlUC&4BOk#+%l@3G_4Rn$2}b3v#?aDmLplCqWw?SG7~n(oep>;?$rw$_Ml7248#tGX zjhwxK3#ICi16m!WUuq?^o9?_vv1YG-L0b*Nzv0EBIjS%;5Kck?JJA2SZ>d&H@aJIJ-|wS+JWXqybkCPNO9(}-rq{RZG$$~v@Tk@D zyH$qj%J8pRd)97sR}Z7?n3@<*zR+Oj-KW81)>8>Qvx-aYXAqQtTODn19)e>dvPCWu zxKv`eVf9mBEZIKv*hC%~4EZwp-$UV)jsWfEEq2%*1<5}n$gyTU@@1(J z1q~(UHe_YxQC5c+NFfJmKb3}qz-6>qCgJt%y`k37aSW; z)!~C>IUE_(6l*o3856D0ZU)T{^R|4y9 zWR`vo$}={bTC)Ud!^SUh<@tyhG&C1zqdr6F_7jk+;J& zm7WqxIA~jOEJf(1khM-QM2@cBi7q0qBl+fzAa#YjXj+eQBocDPOK~{1awmL?8mZEW zE*;;wgl%e)u029i00Po| z$CpAhViPgwc}^nrtNrX$h{I#qVuxDiQ=#V$THt?^w+6yu=_l0GId_*sc4z|PIZ)V#))ZjG9(mc!j6oCu!26*H&@l8aK>B1 z=PBwZ2+$6p@e0a6#@v#Z_tEhMu$@R?2Xd{=1+SWNe>DK+=3H>$;lIQo2H0_}l`u84 zlYen0-Ntf)H~G{vC0h=b4rQQw!oya-JDDNA?@5+!ae1?*>^U1kT{e29Sk1E?lqves zROmJ}-6MUo4N)ghzjeQY@s)dVzqBoIDCSDV4@Pq`zr-KPe>Z#B2Av?_X5wyPRa!}$A)A4_fIQ>E- z-%}aHlnOtv-iRgpEFG4pb9nba&>bil@6}D$Or`Ak+>boGsORobM0;@>`D#w@?G2qm zU;d)@@~>GRD?_AStabLA`_ySIVCrrIih^Ahh3JR{0)_7L2(-LkvvNfD)K{El{mt!s zs4+?OG4<|IXb(I|To;beb*Tf)@^c7()_})Qp{>rBt*|qQ@vZrpvTK)m-Wrbpd{^d3 zVZJS8eJJG_$x(||aes;B^bJZY8Pk!Uy;J)=WO+nE4k0t7T|03j73#8kj(>>xQPJYb zkoM+VjnRP&DGA2%b}AVMkUM$68c8h-`uI37$T6lVgg>%LyuGP8Iv}pcKnj=BjG?7F z{Apd?-grxG(sQXyk^rH8+iZiGF4q4##p3vIgTr;*Kejh&^R_$B$DSb$+LKz{x0vZ_ z!IrxH>XY{*SI!%CPx?4eFYHHZj(?IJW(Bo$&2d*I%bLtebj<|)fsrz{+||7jc8VQ* z`3F&#^&(Tgt8sX{w}YW)^{v5cMion|Fj9W=pVzS+t`r=;8hQ|N z@U|@iG;Zj?s8$s>kl-z{lWh+kNpuAYd=)sZCKP-&MBpo!*=v&~;4sJoz;A_L)Oon* zLn_5~=Y^pN+KTbsh6<%Ttzm%F$pe=fJG)7~42*cOh=-m>s;L+;A=~dVbi2{121s^{ zPTAnil=DY{WJGBcQ6@E$-gJ*Ny_kTa# zN^ILr&iRQ7<}!u|UKuXiu879pt-wzkt%_|U1SK%J+`IWC4{wv7`+?}%t%Y}5Wc@OzT& zw-;`xPwEMDx8V=+2?fWo!IfH1Z?Ap~xgjTQ@H@yHNctO%4f0{O>(4O5N{&NnH%0qp z`IZ$gi2DPpriAwymwX--Z`l32sj+$T=V*rs{w6gR7W`2_^4Z!m1KEBDzm&%^zhuUm z0|9w9jb5Oih(SGr6a4$0cHN4H*VH-M?pJe0Ym_kn7Dnq2ozWMT{#EFqi|1pqVxK0ke{3%{{yjj6Oi+UesLG*rRiZ%ie>PRGpj=**{O zU)Nd#9Iw_=!v(@Vgck*dP`0VGm+11Eo#=j?DY7^D}9y-65b;qIYCgx)%txBiG3e*Pa3PYm7U*xDmLM$uL75WrQJeJX9{q}z z5{|k#=YObkYu?%q70BBb+8BX}ZuHKY$0r z4mD3h*|qfGBp=%2&!3L(%mGyno41!@J9djn`g|Lxrzxi#g%fB`e1A1K0%%~p5MhPQ zN`bRD7Z`YSN&uQtim3S>qE8S}VutEiwJxPU%C<#%1|>es$M1a9x6;09JjMRMAo`_> zRH}?F_L|I!%;UJGjynTd^9vbr?=I2H7J_YnK+QHO$!gr^-Ssl2{~6h8Qd!SLt5_RE zmIGuIB>{kGIwHt9)#Yp-0b4@L`EPFH*r9{}QNr2vB) zB__JlY6g64`JRMK{|Q!1G;{a_?&J2@$0VZ#Lnfb5TQA=eJ7sXnWvOOenVVm;1Z&_K z^hTg*td*R2>y^z9fdX^UEQaQdjAh+LbHG?oOxhrkEAz>0o9GfSpzd2Gv2**u97P5J zq17i>KbH;Nk+Q(X6M59RRJLs$E20h1UexwTd>LbjpCT0^>*=ZboE!z5>z#N7C`lO? zpbpqL4=3$x1b2swLKgRuvD&hgs zehv*Z$vP1i7()XHhO@#4i4Z1&niGvq;gu&9M4^ZdX;B$Fte1N67^CNeJufnp+Q zMaZ|U#pGfDotzzE(Qy816l;Ni05%>BX0_CIgu^le{@|Of)kWy&z@4)H?r0Rtku$DE z18zSd`RJ72Tc1gsbOI+rrAn;`2q6}-k8wWXl_?b(Y&l)yiK{m*KrB09ZtS1T;DG8uL1zoxFV8FWi0x;I}TdD`zC2Nu65}ee$)?`HkTA zjOA@Z;Yvi?o)(Tw*w{(tr8q9H!zeqYayKQ1*CsV6^FUts|Afb%jJ_GvxNJz2J}r{zv&^2kSKgUV1wsgkl8 znhr1lY*lXm)*!%SZT03$5Fj1YQbg?)T8WbJ7a9r}HwPJ8C2^F(`wGW?qH0R|!CNil z-7@`1S>KoU++?_M>c%zZN$y`s2{%TSSJ&N(?r?2Tb^!N!U8Ao1>z&ubJ`$XhLJ_U- zXMO;dBwda+En1sQCun#cl|Vj^uD(!<(^AHWvV_-G+BtV~k$+}1tiHXx{*vQpG^pTV z37=k#+-ArLmRzTYmAAH3hiq6m)_m=O z(I-D<9@U8^d%lwGoso1n`;k2S-v(NL5HNJP+6q$nBz$#_dBzNlX8_;peOj2T7*)~Q zB2HaiHAcv=&4)#Kl6olMBul*EDHj4u%z;z{+^btvyDEBR4PxUO0`>=9P10VKEWL$# zs^KZh9-z$xF2|>p$am=B($Vif9C#}+mwE!VjSPzAyOE?CAu`}<>p(p3WC(lEOx0=5 z2scQoemZ1l{k8n=mty+r=O5CeoYk;euUw63OYhlYai{Yss_7!S01!$y_6>dFM*@gH zH(0*-DOC#AzgvaofZZ^V@O{jkn)^7M)yfd3T}S9#8IpA&S_qPO)^em21&Ngbl0D-; zghuXuvLm|+3q5|ZB8vO08HH<&84~lKCZ+~!7Wzd6%Y^UEpH(?Gcw##=($fmIcNFi- zP2=Q+TY5H!>#7;ZLRVxsit?w$il`ZPWx@VwWS_etCOGs zxnjUHbux2MUw)E#7`;eKS3PVeCD{%@>$fGQ)qoIUFYX(GHu*P7;EcPH=+pVL@~UP& z{z%&x&3Z6J(wAWZLilG%WeZ38u^DZgVP%i=M6vPSpBWMo+ly{83-6;nLxXPoKD)}w zNI5e;Oi7KY@Sk*ui1=yTW1&={`rRPOkDR5_|H;(fU6%7SJ1W<}Ze@K-QfF=JOpAam z06KwW8$&)b_4}1Q!r;(bhO(#Z|9TK{g%nxc8Xi{N>a^SgJSgoIQUvR|95!wS5Q1jp zlz}&6aaLmuf(MvbX~#cxz6t~!t7DRg6sxuL&k(gPpOYMsVG_Kp?SkD>kjk(1AdhRL~r~Vvz%!dafO;**kb56 zolOmSF%Mn~)P9|8>d5xs>%t&e_3|mB3W!s*H2qo0JhxUDhsd@JF}Guw$(1;DTtSv5 zt+r2s-*Q0bOlh;a-x5y2Cvp-J-i2MEoQ1_1?sm6?K}hX>Dko|0q~M>Sqf# z8~i&xgh1afQs?2CWUY_ceKF&D!S#+AC@Ax>5$;%fon&darYk`X9d1ffW>h@I#utz= z?m8{h$Po{lRU`)8J64#YG``hNZF!7_1Tf8V(Q42N{jv85>j-{j2jX?xW(hkfOGBQR z6_vmA$Vl+AP%&f?=UJup;KnIr$rdN$lV#sbH0jPtASZtMl5Vrbo97vn~x{ zFz8}(>4F__%mwcpfuft`fANl^Fc;JS1cs@}v(+aLNxyI}&p8CNgz2%KC-1Tjk@#DJ zNad-UiudM8f~mVFF3?WFpVzh5-0rmP>L_GaaQ=(mFczd+^CfyHmzV#8zISB1fN65I zR;?&gYB=G|dVESsq>~qb2z+kWHhn!@?RIdi-hl4NhE5?f^ad{VRRQ%L-~&G;&i7$^ z<*{qa+b$0Bd3U+O%?zoOb*R@;NIDU$&(0TD>15l+c-I9mwBZ2TT=;A0-dH7H=&oF5 zYV|`YaG&stiGe!rtZaKlMS^T#fv!vT(9;w>2w=2%X2vTX#pT`EGWf>>`aO{aV`0g( z7D+ST(KEOl2<2@K;4buSb-bCq|K26V)vCc)wWFLP>|^Wmn_cL}Od9f?8}zZ?2;0;r z2qDo}T;>FUm!OMFUM^z|Ha&AWVLr*T##|Bbl#j~F;R9T@0!KdFbA}0Qx7k%KqwQB0 z&OzJkug!kaw%@)UON$sFKq~aPmbEFreMnjtm;)ZYl^pyP9Jv8-)L*>QvgSCZ>L->x zjwx{-%QfGR(5&Yu<=LHJGS5$MeXkgrjkx6dA8_2kF6GVr-!P-zNG=0GjmESSjF^88(`l?Ivc%;UyIJU;Q8C z<6$cZFM(Ofr`L8wWxm|=#f}#H4+Yl|kSG^>s2%NZ`UN1D(xEU}DNRP{*iR|z+R79} z5+JOMsy?tIr*J}d>^ov%5b-p_HbO@X$|-SQvrs~&=^g7dQ_WWO8kQStM)jqeZu>1Hkz1pc3A0c0KQ^4`xZJ|og~Djj|b{ZVe)KxaYR zj7%P;#u4+D+aP}IzJ`$Hg;KkyL~b(>y08j(M6rX4j<6XSSO+lT&~;@r5-{$Z%x*BZ zDOUulJJ5z>y;#(*^JVwu`av)JBaqku1uVhf6n=}Sx7zm>Xf=W3LMZ$^YU4ko$vgL^ zh{k&>valu)GX;Jb>N)L08E65W^wf_7CGUP0M_1J&Y*_0KM=ff$EG?$X!iUOp5Djun zqPQEN3ETnPt552-s8m9o^}=`qf;?S%gW$$?I-su=aZ;g>`S=+r9-F z{RsFIJ24CZ&u~z?pT>PSVHOQaw)c||TqM)BKV{WwsZ4>9!1N~6qiB(39h~MFOxBqE zmZafx-DgpGP_yO4Voa%B+s@Si_*CV!{*c8G>k;yAmEC&G`KC=93j?>JdhF0uFFo>NPE|!I=V?DGh zmxkMvTQ`7Fz>=*rBBEeuD*`~AOBq@vVMhN`iW)dJcnsA#q}sQCOG@2*!X$a{AaU-; zo5O~ix1+4wQH{X52>g7WcWTK08UhG!6$2r2(8xm0bS&P+?_aHF(hW>8uhR79kt8$@R4p}VApmKtEl-!td)J@5Mu*Co#ItiASHYv1?U``I^sE5!yN zt((&Snb6b5j%TsQd!L0zY;$;mUhHo?nM&Kgp*$x#dUn+B;dR-wl&ZaDd+x?c-P1C6ql9b1D~l`J3M^sOH4xGLA^| zM~(lZWf<#)=Z`qF?^cf#7BB>YuT+&fK|rYfFOQEO-~)%7J7CK7KzT{`2IPL3z(d{b zW^OuX-57}fVLB&@#gW>h6T3Yws0p0MHgA%0piadajW5(qwR|%Vb%6h6SwZ$6Z%-rw zhu@oipaGkAXi|Z9Zh$=?)X|iy%+L8I>}Gt(5TksL(iMP1;;bq#zAD%L*tJQnzjk^ zYh7K>$ke`?gMYs$v-z7zOA93?yz%gEc7i*djsOWYqkit*_`v{wantd^HQU8abL{}D zWct|Q7i~}WLBxpMikA=W-+e$s^k8aACXoC3WMT^4Gs!tui3!qjYB>yUa4eONhcujT zWW(Zip_oSF1J35@I9pAYaE;r0H`*Sqr%#ZB2{xvW4c; z<}B&gZ<=_d2sh~CMtvWsd750LYaa3a-CsS+Ol9rv_b3H=KBnHkl^A!TC29n5-*s6X zteFE!+1arBF`}6ggub9A(gyOUP~K7q<=EJ|*(>6>Fd7j;yVx+cu*%NsyT%hjN)^&2 zY)|`7CwhKMa;*tsF1~uLpm%u6q=u2+rD*@^bkr;#W9xb{!UgGF+@dEmuYdmCLUOlS zrbZrN;g2omR`V{YL*;BGqc0PJ#`p)k`G7r=Wd4EGo)hb}#OFKzWLqb5M*U<6{!Ck9 zb9AL5y`!V*Z40UGMIyp~Cz^(6k zrDv=iXf7OVwR-)5!bEWsBVx7JTNhOlV$&jE;Jt-3x_Su}yqZNbm=((nVa@~$u=!{# zRQQY)@nviOUR3PWH?8!jrgb_y<{nr=(^gsQar2Hkqd(vvIpR_?4LQdNmVc)W@0(b~ zHf~UC8gh>MiA+L;47|b{76@WqlnN|qO5GsWB zAF7^qNRAcm)otmNtTFfYLcEKZCrAqnoonq-1jcLCHDBO&U0H_U>+vGWikyR-qi={~Qb7SriBTxKJ-V_QaJQR${lCD1ceSX= zHtUT=tyv&hGe-ZI!%Tbpj>V~3iOPjP&%ys^1UQ`O9uTlh8c5d0{4DZdryYqUO=X!x z7lf@@eZ}<=F9vm7**U?t@N(Di%4b7j=cHlhRg1oY@oKsSuIOk<_eZsyzGkd^3UznB z&^W5X$Y{cF2GypSSzdlqlOWj(E5mJ+7u}>f!vG=3PA3$B%<;m|XCoJp&H(a&UU` zdf6*gr+PWd?7^jIoPaP!rR+dfDEY*C|5^5dT#L(?+w^Y3MV!~RA!^u#g0|O49>~2E z1r$rX_RW7hG{8PvS5J(d3*FTFr+WNrZ%R1muytk77**nsB{?1k%Es*?7NYun( z=m{s$Z3kY&qmoD75Xzx@7O1wp1oTk_^*>6S(w%##NB(d8Jf(qRV|6ps@gk|y^Ryt& zG-n3hlvngI&IgjUVI2rz^S72hz#MdOY(x(0sH#)%*A0+66A|QqoQXO)6T+>RKE6rJ ze-Scs`|fLlpS5!ay<&tk1amA&*buV22l3CgS_Y#te6PeY=o2(p8IghH2BGAxP1u58 zNKjmoNnsHAv~(CNw-2%XttiA0j_X?ygtPrHsb4D zqoPl^sE)eesxmZE4OytdZTM}X!ZEf+-<)4bQ^3HuVtTu?`N}4wo6(|#{gZz4dS0~m zba#*TOHFHLZ($s$9t!L9k;NLeB<|^HaV3Nd)|}G&&LPxx5<=wz5B`2E>7_l5QgFa zV%H?B4n%?sa9*9+Qd1VA$$nW(`LVLtotmbpfxUSJ&Pf8sY&zWW)eiRN^r3akeeELA` zg3sW`S*Ah#si*l-y}37(p}D6swb!fpAjTv}$#XHUMTK)p*BYxN+k=tdG03uKV+m&< z3?a*X7uOq)Uv7XEKmZIxvVfl_M&!|sYL#xZe{%c=ca``V4>hzTNQh(P)#vUD-9sG) zhkcA^ybiXvBA!ANEMg2zhFW*;h z<4Jq&kG7qjz(mzpo6GPdM_UBH$PReIFMP(3wb@w~6l?BXZyp3dm!LIW+@#?FvWF&X z#qJ6SgHG5Mmq8HJb*#8)48B>}q;Kx|^`Ls?ndbA-9(pAX;g%813#J_&4N4A1hbKw8 zH%qT{`~`}?6gYRk)m#Xb&F7)gyIa3#w#yeL5&gBMP%24z|CeyBk^cE7PG(+NI$Ap9IJT&6_)S(ZXh7v z2>`VoFZmH(VSM~9nKuLY=xml_h<5;;o*43HvI)M_2;$n_B zz*X#|4Uqqc0E`)b+%Nn88N-S<=9GB1@q9YnzEHIKvLa|O{>vBYO@lIp^wMOv>Jra= zUH}#rE9C2%WBJ@x#hMS6dVzVVU#eI&a*b6OdDhaC%oqwc!NPErva4JMo?lb!t}@-a zi>tZK_eZTy@0SfP>9rtbUXr%jP!84a*3ke9z6bhRUzLMiL*4DZEI(4i=06N>9t{|1 z9^GvjO_{j#c!{Xw$BuMW0T{NJ_knT<@NSCkSBfrWC1&X%q;#^1@enQlNGBY|AjR z)gzWeBSk^HG#$TDxgI<7h)^5|CvBxpTPM!2{Ma6$uLXnZj9b=cz!4E{Qz-^hLH`d? zM-ASdmc|$LvY0VMc4pDPSB3SI`eZlp2&BAG2XXum_ttdkFs?KyVS42;8Jz ziV&reN*BtD5YzC&)Efpc@?9%4HGsor5J-xORfytvfZd;vzp)cAqzA3#bQ2 za?(Ru@xTWh3-yE=fPfzd{&D$%wZ{YG+PG8m)7PjYUA3w)W=wJgbyPYHG`8?m<l-pu<^CMJP+ycG`MeT_#wuo00Ov zJUCWswShx2nbRMRAOcKBLC`X6wlAe2&Cd$D9*4JV>Xq>|f_dvSY(7npZ&MJA3s2mV zoGm}04GWGR+F`{5NUBgObP(~76bcp~T~n%*n_BK#znbENEUfuynj9+yFd?&lCJzjv1!G6pm)B3Y>JlmlCDgN=MWZfwW|Pb6S1;# zU@F|80h|8wF{m@6NBr93o+a60-CCe;fr`g1-ZInFLuTz_Q*2D2cXL4ZMyDKfYy9MN zv<%=_O{l^%){_<6fK}8%^}6w@?kcbt&N{a0Wv?nprbrwfALzKMpPZV829Zw^NVPz7 z9$D`^nw;`-u+#jcD9@Lk_SIbG{%|#@xzxD1H?D2?_F%w7^KheDB(n9!-vrYMHZoxB za9H+h>7H+Its5qIsv7*dwFXoWXsqgD0?i;ywB%BWJ@!0g694zNaWjE`s}Bu2R=mp_(Pgh@8YvrM!xJrqOYi!pZer`+RvDs#PW8Z74R>b;LTt9r za)A4>J#V^imDHLa@>m^by(Wuq`$XQgAAHcwt@Sl%o;mAXnt3J5D=|WDfKZdG-b+AW zs<+Uq1#iu`0yc{ZHABv8Lj$=LGQN+zt<+EQ+CU}wLtHq*H89ENWXsoCe}f7aCW&Jz z&HvIiI1V%2wIs77O?3ZZrbrNSKC>|2y(g(RII}rwdR9@gZ#eLr+|RuEPD&WSgt_{b z*paz*ml@lqCxiVX536XUom5IfGJX4^jqa82o=r|PmCm#pg>Mh^F@&dHeVKM{#K4*G zOT)i3|Nn<})rV;Gm5-=M>OBnG$XA(a0XLy#Zw2JN!B4IFIH{uZf@$x|-LgX0joUQk zMDFh^*W>|0?4Crvc)RNchbPs`!c(61gWN{IXX{VAXNh@k3z<(QE)jf4dkB=mB$}_g zRm#_QPI_A(O!6^iSxUA=f&pK(wu*R5lIsnR(r+V4vIfowsfUt!2_=?8%l<}(_a1}DfwoI674UC@6mQJHr z{_4X%>2~&glWkKM~q63f&VC~C<5K6qalO-S&b3owLP5+FtER0Ks2dbas z+Ox8R`v6f`F65~;5M}*@$?5`sbMl>HXL4rVs(YV|&DOS7xj09Pn&|D$G8rxKy%zwo z0H{~De#r;-J7+niNj>#YumyPJb5|h5VzoSgKGqO+$!y=YzPafveM96*iAr&PpL*!~ zEffmh3R})Pf5wT3A^YO}=hr*yBb?hSDS}iXGd^y@->^4yde0vhng2BQ{+`2JyHXr9 za%}AB=|7;w7PXG**#HXaShn>LzwoT5f2je0Ks)hJOF()b+hc;2gD%bJ&2F|%>jv)@ zYTg;hlHq=VQneHXeEm?#w~6w_6DiO%7Ip!>F*x+u9-03rB}8Cu(pStZCFd|b#JL3s zRLq4TF5UG8;lVP-$ z0kO%3?;)5IMUdyd{A{SrBfE@R4?SsI5QO+ciOKJjysb$}=uyczl)LKV#!t=3>C3V! z-kjxG_@>F~_Z+@jt}<@5ooeguek@<=MW%uOn$xOSC=i^UGE20FaF|XHt@V<$&h3J ztEmq}zX6%Er92Y*CpL9mPgTB0zrjEl3Sn?dDGG9%t2zbzAT#d7RxE@}7dk1_)2iR3 zt6dr2fyNH@Z-fVKNub-~s6G@}LofXg$6 zBdCVaXKpR9W3B4-or&sDPO}t7NSwFMuTf7wPU;g)=Rz)%U|P4|JiT%LS;XINHM4}V zcE`9#yZo1V77<}d!{Cp#aPZ7VQ9=Bo%i0K3a8V=9QLB#?`3Hd5I^DffC@{Q z=e6R)Lpy(LcY+oR)dWrA3NqbEe>lT~!u?L|Vn8Q3l&!41^XR;|G9qKm-|4>7@#vdC zG7@V#doGbO9Xp4~@s|K-!j3V!B!I-Bfa||(6G`E4Qd;9yh zU$Q(hiGi*}*u-O6f+SQ)?Rb4A<#RMnD!e7#DMs!gzV_QkGM zGCDtT_xBGxCn(-XQ?t_s^UzQ#P=U~QAZJbF_R9(gsHZT#*#q5`C9DJ9s_B*MYj)<& zjZEp?2Kn83Nn?2;%nc&+rS%HFvS16Nh;O60AC`xKC_cKH?WI!9jRXe4%%^4^dB4yLixv5M$wMDZ<)0-!BeR_M!pyTt5;nYsHp4JwvK0|DUF4@Z1h&dR@A-dh*PR&OLm_|Y zpLowR?&%;V6kvD68i&l`bN6$z9$&YVK zp-JGh6H?D)3wx)rUK0f)0q#W*MB`b#2sQBqRh#Tud-K1&A>cRV20$im)4NLk z-{y^~B|Bht8cMc~@jvc;90T~E`PUBeU)TrywhvD@4%5g^e*L#0WsYA`4eI97{%iRA z<6$WK;iCC}&5TKYAVH3A*0TJIYyM{npluCfpQZQ@PzK`pkog~9*nbaR!$**RUqqnQ z{}89DWf@@GB>${y-+vF5#ZNrK-(C1W+qUTe+XCOs#Qz6W)9`SA4MM&9?myd_@%V;t z76UApUs`q>wlqgH|7T^})ZN=Y9-~8cBN-iz*b6J46X(Fd)t+Q0>D!F+;`9Um_bKz+ zet^)8)=anbS=Fy-K0l(zuSloR;9`mf35{tbAp)M&a_>wld==diHQn|?%lRMC10 zsknNQT1*`^}sCsMHOnN8px*UI?#P=w+;g793)GTRsyx~veBBEpWAKi}>KG=Vi+uCQe}rcHkPD*$ieMZPmc zl5k#ME?i%7OU}A?bY}tO!V{n1K?^6r3pbFfaG716NDL2XX8CSAJ11`LZ^#KTW*dL~ zc8{zac2t+^y7l_J)iyg#hO%W1qgNK7m!8wO+fe+wk8z+)LvpSPHD8-yyjeHR=^IZY zC5!j$d}jP6M3uecjZQrvb<;hfrC>(cyNpmUx29BBWfU^y@h0yKQ$!Huf}tzXMfex* zwA|@L9)Uk=5CyNC0Zi}pG(y9cYJcl35%W%Nw1?+=Kwgwh1pbL*&yIZsWVzSQP6jGK zC@IQ0oN2NJuh@k7=Lro=;LFq6#<+=_;BvT~h1Krz#{v~~3zNrNgxjvbajcRbUe%pJ zL-Hpa``Wp|b8dZ*qghn*)$@lJKnXE1lAMvcM<|BP@SwDM%3*ztSxURff)WNev}HIy z0c?N00Krgj&?y{J!4vNma+uNSw~ibe`k8e5A4HqR^R`Ldhqmt@|2d1!IgO_E&7zh+ zwbaqf;9;0X?pbYz{5=UN`}}-a=Cq*VX`VHY&iAqqY_ZnU>o)2OMW%&}g^RTpEfGR= zA9(sP!0oszctwaIgw#nj zD~Z-E;5BSgbnAfjN8^t~AV3y`Poj5c7!;h|)L*ZwDHtOO6r5fqw(%};E8x0^ugd^Y z29+Gj?&X%V^c-CJ@D<{664Afr?f4Ci(zheCye9^KqQqK?iOe#7if3S~^BmltyXga3SV)OW#m(Q-NXr=IS8?=QJ)J>e_YR3`q+E0{TqhJ{VGt2?*F@1RQWq0$iTZveX2#RX zh_#kQc85Rx4WQ@i^)>YN2;U7NZn>iZdYiU%;8LxvsF9y}SDdsVYdI2W*Aq=^;w(^5 zm4=03>KW za8>3NvI$-j%i+DbdYE$^G-cIvefd`byQlL>mni04ixnN@Z6lQB zzHgj;?YBV+d*RecC#3U$OI_z~NPYJB1A?TM1@AcZ23?^-FVwuqD6;z~4m$(d@0r@U zV4$`kX^c>eacnwVmNbd&DEMT~AWo8s*I)D7BE|-B?!jYOUatkYIssPJX>OC*0;xOT zE8*ac=bbk!1w7R~IqGWtxJjBqSJXm2&uY!I3D+)Ptl?`YYlm2JTl{DDt86UH+7heRaE`_KQW7-{i*aN*0?Y zQ(YpMwQF4hYN%|DtjY0EtoqivgBnDY;NpWuBQv!V(YvO2HNq%qAxhdU+6XGul4?aZ zDbMhGC*Up1%?6>wJ6D6*tY+i-#ldIY0Rs~Bu0GGMgPF4n5Bm@q*SCrMt|me+C%W;pK1`iP~iD^`X_|4?Y~IGj;rQl^XT1(hgmZ3i;Nz)p|M8 zO0P8jD-8OJ;BtszBAHS6FROgA?Q~icoI*`e#^?+rOiD#k866(&vLn`?W+T;}yiX%mT7=gA z&{0Hq_-lxlvGE(^)Uhw0>!Er&$NGkX%P?acmH#;TVFV=8kvze_YuUO9{9sK5#)yp5 zAjrJ&3z0}WoIyM%T-EX$4#a94`xVx`4a!eUBU*Q#LMw@E9Yf9y~|u`ZW8{I`e9g`YLxe4Q%bI$s0TL ztMrcNh^H>~4v(>@j;O2>CK9Fnb7ZB&!iL=%M8?YGzE)y~JUW|bZHaTEY_UAWPe-0#`F-&ID58YZI!JPGZZjJU3QDYLVM zJ_kp%@7|l9Jqc0QZjBbF8s8WWH$6y?DSntyp)+8ZYa3!uU4Wcj_k+R`4xfV=mtS3qM45hWuYAV>L(;6=Z+2Cb zKlvau9yP9%ROF-B*T^h-oUR&~A`gjb;5d*}TUxIa&ZoC_zcy1*liz zL9j>+fy#ZA@cg9`AJ>b}D@>>msk&PU^({iKc6hoSCX=w7#S+sb$Q=f`07AlYLo)KG z?xoEzm5Z(+N4;QGuBLoJ8Qs=iFAZTiwjec4ZdSq1RZ>-uY`f1>%_QWE3| zAO}%qD;VmIZ6tgP5svsda5^0pQi(K%Kc}fXi;(|QOgp|kd9K?8N0S0@(k|lMxFr9* z2S`NJ?`T_ymvhuLgz|wolr(MG-Alh#9g44=!l!zShR-%p6gWfmGC)V&c<0UT6jjDn`(TEx}}Y<{1Pp z2Ax83F?ZyApkenI{UD`zIGq_V`B}ValE9%7o6{Q)9RsK5mj&5S8+iwVv_XWv;cy+8 z8~iiUeIRoD_VTM>`<-%z#VqDD{%LEMqj91WO2(6ihsG2~=>fY0yS8VA=RZ}^Qid#p z9-+T_jkie7VzRADj?Vgx^IHRs72Z0PnN9q~?*W~61T3f2bzd(DU*-F)u&#b|;|*k9 zez+33vc%XwnZ6MCx7k)Q`hMcR4k|Y)vTc`bO14+cBN)(}6O^Iyg)220(~(?S+r@b0 z9giXb;q0x#kj=sv(=(_F(}*xqN&VX2_h#f7S4&>VA5eKj#9!{v1Mb*AB|`<49R4dG zL>0g*^Y9x@9(`#X+1*;{9GZsU-kJI1nk9SpgI|7Es}@&Zc+QQlUq(U(qe)x0yEX__ z3s;E+TukE(EQrd*UIkTyTBJM%D=8j^oxfa;Ozb?l&TL9>C5c%!x=v5^j8ia(RXr5* zMJcoJ3=|y}K=@z5pNX;W5wH+0J6NH??we^QNMh2iaD^x?c&zxqS^J(-v)Hk0?Ml5N z$KaAwc$A;0eu=ECu|f$noUuMr-5pX`jeGB+h^Y7yYE0Hu7EdI)`&Zg5aDv87_!iY$C7=}B?7e5`0ZnL3V35vkO-?<*dY2Tu27OCcr*LzG5Taqin>o2 zu1NWujS>0r`m(LTrVm^{-E@bh<&8OE!ddS>D2nY1iwB zEBh%r_m3n92{Li>wM=X`__Ub{%K9T6oU4Q`hr5H_L6L;27U-*IGOSdD%LWI3;v78W zRHEH!^S@Qmc1yajRsoywL^8zINu3ShHFXs_AEoZ_Jc8aC9Rk#=oyZ6TZzjp#!a@)J zN|)^Cu8R;_%8W|#dLTcd{;^p0gTAtbJ9;xS8m`k3aVx5QRSLfCCKyQ_g#i15U8nDA zr<~`@9!Asto(|)V`U0m=2aCb)GH&ESiCD(T4Q>_2neJ2P!NGFgUoD(sbzbcL5uj6Y zxzMX34U8n#;|(cH0Rb)H~4rZ_mK{B*KW718c3t}8JP7bn{VpU14{_A zkB{)AlSRlX7fAKcoA=$2@oDb*cJQ=OlNp+6U*6lnV@Vn5TXXb*mO^M8jGJUUc+Q$y zZu=u3RvtJb5!3#-@zpSlsLGO}Y_DX0*jN4ocvCASyr3`<%F0417Ab$C=kJRxc}-AP zYb4euW6+=e#jPvfY=h}cVMQ4uFQY&WaBrZ!LmJqwsgAzwBqI*-Qpz9nL!KPhwl;&) zAxMpjX2Zx>iIB^Q&}LQ_DlAz*2pQ;|a)9gO7{<7On~cmtbOHvH0Qd55wri?t7ouK9 zU+h`irqHiyYKUD++4I<~jBvCptL9A*MuM2vvHoCqM7iN+-CL5w?vvxpUwfL*DY)HF z0pw-QY7uuIK9=Us61dTWLmx)Dm%)y;kt^EvxRA z!jU}BzT_n0&RYY0a~Y3m>AAP#?uRF0xXirF`Ww}{oC`NaMYajQeE!^LBCFdAS?T(H zhzg_JaTa;X!?>^R;>2+j7w*I(VxA;ma7$~=rjLroe2v7mTczQl+c)86X%Rc_NS)== zlpy{=Hza%s1#lqioD^xHKLp28m5ZPK?+%=R{mThB|NL%XK&-5S<##?;_B|~Q8BERY z>tY=Fp}|U)34#iYP9QtvVk;vw^Fn{9obqClK47lnYJDv3Chk}28`@gRfg`#c$IJD7<-QP}4OwMCtjtsX@wm~K4pz|$tvUz6m*cj!k zG_{XR8#6gXMAU0~?R?nBY&fAxHW8vX(f-=Rt zGSo~GNm8Px?Q}w#pstBM5~XQHUYIsymd3!ZE}>s9kp?n9aq(@zgH3yUlVg=9NNBhr zMWR%S5fY#HRtKhW3#z^dS^G_Xv7+el_ve~pIJ7;w?fugG@&TTi2lmaIW}x^&iR+`p z{c=r_vp7Vc)wkA6fj{Nt-JnX1^Tuw&{zfRiY4k8T@qJcO8QjS3wHFq zv4WSlzi(g2!;m}$q{2OEW;FjGXhBI?a2clK6Rg*6y2&qV}Im3?YEsQnE5Bm&@t^sLE^KtSMRsO{vvZsp?t4ZO3gk+X|a+4o1 z2bF37taaug0^>WUJ2wgmiP|zP?-F3WbU z;Lk>zb;gD&QO~?sCy0YqR`0y1w*9nKn3xX$T?+E$!lT zf&h)--qJc%$!f}o?n*B>r@u`4a)$4k8`nE0&T1hSAtp%L6 zBC0#Qf_*o)OK((PQ;`c_o4g79{!nd)GpbD7&$YE=PT^;IARGG7De-6--}!>#Ud%vV zwRl8E5e|qH$^yJ8@Nzqp{2NhmqkaLKAqJ7x$g`8OG_agHthTS^0n!Flh2L4^n6j5l zSk>yU+`_zPTh*B{QcsSejGK}mf*G{&j2H;PrK-=>_Nyr+E_5Pos;$=|oh-sbYR^jL z?I~k;5e`GQI-^8Or@?gwB5i##P7J7IwvcQCt0!z*x1*B8)A!#|alhg31$w+0mS4>R zQgpU3Nun!%CKtPg)uvxG)@wm?W*#$e-^_eCXfgaT*&$0o0KanjwbVgYK}W7HBHJ~f zYlmgi2|AA3`r5{3*js9_7CkhmxJa2lg>! z?$d939_xT_;YBerJ$Hovab_Wantp7&mEM>_FaQqBBL1DFTjH{g8n|`gx$gMWSLZ7f z{ILYW6DjdE%1`e#&+>~ExOk;^bz8=~>Ylmksx#`x)do1)mGMHO&?=ljhWs?mSic`DiKB9r8o2c;8- zEtcv6$gS6p#M@F^j=tzv5dGUtrSI(qU0)(jh}@}+(PIv3trt<@^Q*xz7t*l4xL`$7sK*>sy|L1*i&Efh!y4f80Y(MR) zXD^(Lu}RRGXM)?3HRF!o148N;gcMoQi6II6BDkM=d5yVI%+3x_e**SdWJ4k7;IFl7 zOs#7&WsC>X1n+(L?E1rkf5h(GH4u*Y9&gyX^Jv+c3~k(ovvgLv)II;DguV^B9Ni$6U|5@sZ2>qHF|_BbB#DM5Z6 z0)pk4ExDb~+VG;~o|$~o)@KD-VjJd)HEU5vrG(4B$vq&x)6AleM)PLBECL3y&;Q^J zp}EZ+c3xT?i;6D3e60w-<}hhy84NtnIoIU|eSXbmzwF``Xo9QAL5CbyuFn673I(II zE#>xNLuJn~Ei-BsQD@5yJ9xx$p604?KgLL=;vPvUsm=w@J)vP;!kuy%MI4rn$TP3K zd~jSS-iVbbG8&V>bN@{GZFF3)H%KIswRhM8xZyOi{Kb!e&C_bdoiuBUq_0||O2t=C z;r4X8RIa9i%tNksI5R4czLC=f3;tO^jwsc=A=-+;zT5ApFP?jD`K&(sFfmeXOVx?L z_6wGvCKFU%sc-ak?p3w~m;#osv3o-v=R&g1#CbVd89GeWi|;DMVUk#Mg#X6r(DB@D zCQ=M=PI&T*JZN2sV>84t%EKzPgUW0D`WwO}RDf;Z#=>ePry68v!5l=E#Dq-H1%)uh z&!O$)57S53JfD;PCEi;Ynk1;8wKhnLpp0y38GNSnl~YUMk;3QK^k6aWTc)safXi3Jup@;5%nQ_5MrrS=Dd! zA}yVf;HEF?5^~nX!?SI++`l+qOGstm0!TA^E9aZ7{mtR0x_dmsX) zU=}*M3mD(c3-1fAB z$d>V!@P~bV+oj^6GTlf|rJ?*56>M{!Bi)PPmjCVv9|CVLfGZ^bpI2&)FLgrKD<#HgX-EC%1 z=3ZNPthbRYQ^BVQ+9tgS+u%90paavAu!!o|g)6sej3?(Hkb8>Mc}$})k;v?4-(z`r ze5-i`<_}cF+eLpq))AW!1p|6@k>#uh^UZC_k?x%!DXsQ}=X2y(ZhPE-pd4Q!n ztc08fpa*riu=ue0@n_Bx4xHs~KoV`U?2Avs?7Ck!ZP!hCRGB|g>ds9P>C3q~D(u~b z+l}DtU&jm4F|6R5dA3tV!;F;u3E@VyS!RcMLC{EBSr}afU2t#i8)39BR%T=Ig%~k2 z;~~nevhsW_i-MBKtM9_)&N|06Ha<(?uh3!@W%uWPylDF>ahNyNb2bBZJ3;gYIZ`3y zR#-S99E#klgr6F}1+E;HOeczyM`YD;_#@szUjy&y#)ldFF+#V!KZd*rqI&Q7*dsx0 z%4WG(HYS=DWRIhx4De;=$%l{%zrIn=8vb(&!+20PNpp*-UI3=)@2=SHb&KgK*2s`w zzuwxW{P}Ooy&Fsr)yIeTq&pW$Q@{@Jt#sOu1;yYybCYSl38-HCOo892gO0(2X%5td zTp?GCGp3t$OW>&CxX^Vm(-JaP!Aqi&X}NILabiX|13Wo`CXEQl^)(TSEcslKqwRz_ zq8KvUoYxQTC_x()eeF1r<@Vi^_OGOIKV8mOAvbqZ2IFs+;-f?Ct*b z5pdur?r7ZaqGFObc}+&3LvUA(TTpl0 zv_vqKDcl8rwj{%T_bEdRnClnS6SuO06%*1ML`rO`%mraDhD+I&e|3lXw&Hm1m=iWK zpGx_(wJmDjjqo*zbW!VAh&B{ioz@2#u!_f#M6#K3S)_dzTx~aO^y#Pdipw0o=xSRh zj;wEE8odxPsD{~BYpAzM(fnfiEEo5pcLV5s+-EO&B=u)993n;8Z?|PmH*eVtKb+gl z=#6iaz;86(qC2@uwA!(MfCdCMQ`puxuKsZ7Td2pFwLjhKwF!dmO>WK+Br#pntE2Dh zTy0;8NPq<>Y1PvAth7Z0a?WQlJ@D&di%Um{K#7^Q^U3YuxO69H5DU{T19fE5bq1C1 zHrS)B?I*p+nk*p*g9zS+*@nmi+r@NB`;n4Od0@M>sQPx^uxvG%u2nY5wHV(;Ok*hJ zwRYep+2K|8NmHThIm#+;LCLCUnVDJ4$Fj7HKxAHu&~ny<%&1iJ>}w{=}-%%Z4oKCkkwDkfxIR&F1Z7UT%{J>u(+(N`gmVuuWnL(cbAYB4<|ss{!3X zhUwn71&@4qRqAloD=s0T8DHJmA@m`&*}dwK7TB-6>`#R3rp;u!mOE;nDFiDD9S*emtxnLH$XrVy0e%jzNG27|Y6)kVMBFll&6@nU(Htd~ zvf!<1If37$7XM|Egb-aSv60^iTsWUMNV*=Z?4EoSLqRlPa>3)Bbm!*HRn@rgdyA}= z_TE;8Pix^)AC$t@vE`{+;5gpxQ=#&!Gp4AVomK*`JuPeP2DU( zo5gQdU51jT;D>9j&Omq~<8msNC;tR}U}tH|I!~m)^ddtAJipE`0uy@t?ucRLao*mK zG&atEqU{FoeT%7Enl7qHySP88&PnOn@dwu91my z=TJ}Fm&clpr<92}+|j1s<$BPqeUx;ZoC_b^2Q~t}o@l+ocJ6tJhI{=gh$#Z%Yx7TA z9k!L=l=+o&n3mghqOS;{7aqmUzOqpcoixgAgHUd-k#B2jAIT~p4HZYk^uKfK2YmCl z$?uwk9&k!*--oJ>n+z*8dHsONS|Y{YGEOeqd&IX#S8OViz$mCut(H-=?V6!+j}1(I z|AT1PfmzkYR6eyx6CS^L*lC>pGcn#p$j8(p4th&}*6qjZ5_PhMV-Hm= zGw{Ll@KazC*XqIZ)}!aPcG1=t-Jfdg{x)_p9+Y5o0^|X;+>tg!sH*#&wQLnA^6bY) zT2P#);9h2yU29WkzsXgcp78qEx?W_(O6pZYfAkHvz0iZi99cQ~E@8bGHx`HstlZCl z7!v{hf7HEoSd`lrHatU$q>d6&Djo)Z!7xoYj5X?U1#MC1zQIRC%%68F~NkD*s(uiT)aJE5@kPOc)!g+Y0pj7M3 zy&q1e5|FCl`z(l81~Z(m61$m2bCOPdIa~HZIh!Kn(f8I^o*KQQrMNGMp1fZdLNlkh zMP}KZxV^4GQSg>tzG)PXQ?@@}@6mgfWV<_)>6J0vw{Ip~R)DJe5OQEnzCLNdVN)UD zznJ~$GhfXADiv0h#m)znR=CQo5Ujo3UB&Ul@Jc%>>I@l?^b(#}B&5y!(Yb1xz3D?< zibB$p_w~sMTm*S3Xkz!Fb&$u4p~Fx*rQkh&<~8KWZ{(-xZRgq}0Dgtme{yo+giLoA zy2MePGC`0eSV7*Y`^BRiTza>eGsLSG9~&p^&nltBP3h%}sNt3w(-#wjn-ixY3o+1_ zlvziw@HJ5PRoX$OjcXH}#rfqHFTs>*)_Eky3AOXMM$-mAL_DU6ar(wAbdz7&_q~Qs zk<%?^S^*SeQPhkuDHDOGwan($Ro#Kf*gTjqQ}ptEdCB)7UZtk@I|LYCEf~~3N8VAS zn}))gC5tlUcY7q6@nV(%}%_Yh%J1DM$w^BXfuZ+0mJMb&OzZl-o1G>W_wk-jY_N2b5&U<^SB|M z9X0y?@Wi*m z@4A$^Xvu7W{Cv9wPT_}6zh!at0Z#QiS4O{D9D-C`DYNN}jaiY=Bj;1N*jnLmXe7nQ_zp_who zK~4Y-d+qXKS%F}E<+nGR28mmJJ#qc4U%|g`xoWe)E=uPk5K1Rk2??e4VU}r|;E z?^ZmA7G*-XlDyZpzaJW<*yAD0`71&|(j)jLMji~s96I|*pRB|m|wu|1xeh&w-vZibQg}|F2^=L8A*PJ5#}a9rgcog^m=uOt`RRM5#~qfLr*# zwAr$yhw5m>#x0^3KurKG_ij1*@n3d*_@F)2xq`^_rRY?*Jb0D&UhK^ z(&Fbj!<(g~>+N4;?(ApY3f-U0-0-)b?~-<3?E7nK{>22h!%!jKtl8^%%};Rk5eL)f z@deGrVU56Z6?^`mI13qIrQ0iAd;Pvi$TbXE)x9oZCNN0dHEi!XGRd7b08y4|-6qHy z#uWwU=()zvN}rd61`{CLK6n29a(x;SJBZL>5AWPFr%#@ffPSGny8#Ajy|Bgzr1AD8>zLcm7#^Tyx)-Rj-|9H)Vtl(|x+I8x^92CS#+cmB4Bg|O>nrpsT=|IU}tqoGzu^;b*iXkuLQ`3`=BV(xzwDC>fdLqLB^|Iu}eToa|Ggi5%&`8 zB+tj4yHEMcDvA=Y5?AmxGs) zd67!#u}$~C`eUy*BpU83!*FF44hHD@mTMn2O2N-H{@qj_H_3vo^!vXQ0U-i7ehpYW z7A;MuirYV{p_rm22Z!loJ?Dxg0zVB#UJy2B_BIGb#)L{6f6svPc-@?@{b%h9G5TaV z8~-xK+pAQ&^fYOcH3`lhmxAqppY=~9|2S>Bp49vsi-!efz<;ncVpJh76#i11|F?Y8 zlk9sy(v9p#aL9sAXf+#TJ2%vuk4Z0FV}{NNlA}Y)cafa&!u$Bxp5S5z;dO03H3P!2 z@&0A79RJ;j5a^;o(`aB)z|F>WSQKZ){le?Ka+}e}rD3|dj^7w23Tm2^P6eHb1N8`B z$ornwb#?BV=LO$`*#CY03Q1oFR(k~6LxmPI*th|4i)T)M-ll$Qm*8@S1iUitcr}QWFtDgVxzd_plE~GjBcFg{Zwu{%p+S&dgbE@OL@S!GE@vT9s@xt@Z zTeo72Hg2xD_@l%6Iyz)ETl377RLcd@x3o^B4`Z}!+W$FJ2IXWabc9*?-iaCA8tT$> zZHnZOX^)WEC)0PK%6l-wY^sz?{ugngo(a@UGHUUlFgQzg8=si%!6O$gkovR9I zR+XX-c=TRo?f7}Z^ag)y-#`5_J7?6G?Q#2fz3p0ho6XC6vdy4?|r#^wQ2_X#sd1~nD2U=%AZ`wjpM>31=OJ)5JwKR*{%|*2TEj$^MzltFF2i$~D#^oP@ete~-XkC{t+>KKgbeONM+uD-mX5d8f?zH7u3_6<|0A^ghn3F>NjmRb z8^XK%T2Mp!r2SToEZ});udC$pWG{>;izx@>eL|#6M!~2q*@X2%DM>XbQ9cT&3i%QvhsutCs{p?GK%F7$V<+u^L{mQZW-$*IVjj;I3#uShxC^wRVFw zLfc}tIgB+12eRO|vTtwZl-aLUZFPl4RCw(d01iW5(s9Al2^$zfB#F82iaraJKTs0-_?JeZ$czRCmVITD zk0u>wyJ8!9H8ztClvg}wO2(`z`y2!qn^P_&i{v%3#1=pjk1Ug|dz`zAj~4i2xob!I zt;OA{gRF~>maY^LAmg1RiI4Z0#teMY&c;B!ZGt%wqq6dvf?>)|7gfCv&sUNUn}6_TZ@U=pdXgdEKlSkB-%L!tSL; z+YELCYlWLRB6+hcrZ6GZrTIidgL5}_#`!3=zp|3XATgkY5LQC#H^ylebyhC6Sex7AvA0^ec4`rF zHrE1*e{xI6?~T#8oFFVI@lCadnYD+twV*hq_V_n|!@oG?QLif^%B($=>J$f1vX35q zIw49QOt??5Ftf4Eyu9@5A*)|e#x3G&X^hZ8-`Y6Mf~qQn%|aXfu`8l}&72;edvu#E zPuGef==R0xSz`qCysG&bR!u9RNM{XR0+%1FVD)w%D=~Td^xn}NWG@FnGXA^tir8Qv zkSBB!0wOzQj!(C+C@W?oZ8B{$K~^0LRhD^4m-87@}?T>#}D4?X<6e(9AdD4%pbb!UXlYgeO7E{djXSeQ+y7q^A=CD++n2&^#_vHMhxDv?Eq{qZLj$3&FaDUDI>KhdJGQ7t^DU(gcKR>OV# z+3(iTC!ka_eiw(@{<8VIHfB`Vohpx3VmOn?VGD1SjV+5%cp@04$OK!+qklarz&^J{ zAg`~ya@r0O8c+2s%UEl-5VczwyLR}9u}6Mqv&(vChpMBG-U;4e3qdav^sm)$+W`YkQ5K0&TLA0^UTiwPrM(m(F&_z|dSXq&yZt~={hok@VK zAF)Ri?U7m?^{2_~@K|3g86wR=0+U=E5DB@;oKM8Ioyn>LJ*R)v;IodW-@bVy#34W; zP{iMq;vvi+$*eFBSlBD0q456kG}j>+v6Go5POmqZMn~h5&>?b;E7)Rp#~*KNIa)p4 zk{<6zlvvYM5drHZZ?oEkgK4nz&p_nPV|s*GG}m1eK{hOA1BcX>F{j6)Uve*Z3%tRb z-WzM`%1&1mfE=@VRyaF1bd_+=$d&awR&E{CeH{rwec{|3cPULEi-*d*l`nZ)n~QNK_ed zlO*8{C06)I0ta}IbB;-#qWIT9P1)r zARedm-e<%rEB8^lI&bhXI#ri{s&0u0Sx>QV+BbBGZTE`Z$&s1*(t5K!pTl9PzAZ#< z9wmEZa*t`unsj`?OAs%LIi7(d$Aoaw<5cO+Br2M{@tvTXp_o^UR0$!ZnRGS85I*c)6G!?bK}%oS_1Fu=VvudhZ{9 z<}sEfYsC?iE^sh%D!RS#9YnV3@tfInKy#Iw)K(1)y>-;)& ze3NOk#hpII1P+lOrouau><8<6BGA}pBSA!3^nJRzS*IT_dH!esPE_n2y?9M^icvDR zOOl&B0o-$3Hu~$+%nd2(n2enalZ$CQ^3pwq^LTH{ymO{!3Lo5VdLZyQ0I;4BC3r<3 zpgRP}MGfOLqGkxf@ouK*C!fL&bQC{-;PFVYY1!Pcm<)+&)M+mmYd66VbO}Y-x{W(a zo)gJ?b_gElL?n@SJm|M(d^$~>Cq?XVybYK4EGH? zK{MtpsLh%|zTwAL{u;DhW-;75ziK{mw%m1!mU{Fpbas*e$>!Rfw|k27DRmKt;L zUdO^zkM}oPIL}@mDc$2E+3)tLVb(lTu;Cd=9UCT!rx~g~zLO=Ar^6Dc+EWxq_2Lir z9@ZZ%NZvOmw%9#7k#Kmxd9~1)q;3FJ$Bk(-8%ri$DeqVeZ30`~t&-=`SU6I|lFffg zqT>A1fBkdXhGzexV&n2OrkI;9j(iYZx5daFj5{HA$nQykSJ}3 zW#YM>jr1P?2IL!Kv~rX`3D9>bagoT@9Tr&fHJM85k&!uX8g&w?1jjMnpmkd(Kx_!k zBspTWZgBLC=Od#u{iP7bW5&9nn%&|A|CZavi02EGmdP z&&{~=)UuUhVQMBK0Y{GB6s=R6pfuH^jjQJD!8^$&J05(h?nJ`~nk2Ds`nmRl)<78N%^llx zt}7n7>`#z>qMs$wDf9naK+jL3L5hfT33Z(}eShf}7h#(cSPvrvGwDoX21kcJA1NX3 zo09l^Gizi0ZV@4|gBBn}4OfP7k~8pfHe0y0`#b&eBJR;&D!rCOMtL@=9s4ei%@}Yp zi|Mot48n{P9~-qK6wH&8R+_fSs4q`vAQ-3p(l!hUgW>cZyYp0>@rN94h_b7 zxC$Sv>tCqDMkM&|k>tJn8g7@gXb!LYe(BFw@ECEBJDXn7N*~b_wONT>IGmA6RnXr^ z;hPfo6Q>i~ciqSneW?^`85AXPch`-Brcau2;nVo+IE)OKbHM}xCO@Et$O z6QTb(D(7Jb9fi(dk@8A4% zCi(TKm(cppo_EsD7-$azhyJ7{%U7Wk)go5Grv#OP02m?C9s4@vL4<4=bROmvnugRQ ztYc*dBO;(2E_k1jQmBh$&&8A8JLTX&MD=D9o3m(o`&01+MG2DBw!x3{Yu5bE=J(Sr z1Ep^}Ju<*ufm-m25qi=CtnWUohB3fi9XAu{_5snnp&Gze ztL4kt>qpn0=|6QVk^}ehU<^2oH1(`_?SKc(Ao2mO0`G==!Cq{+Xh^r1>=_u5za29w z!^24>d%y@$K=K4|UaRvpkM_RmPz39#;dUv`Sn{Tf9ZzPB1ZJNF_HDW%xa)aIRe+-T zOT|A@x@RkCx_X4ANXh6VwhM6U&`>#~Uy$3hXnrAUPr|54)G=@`-{2@@*S@Rrxt?h9 z+?HM=(|)VRRkh@O!J-1W52`gzrU7Zoae!dW{?y~IeRQ=N%(!s2zFsU)Mf^lmy5xOi zO#T!2+dquzlrQpmB!spYgdViS0&y-?tb%kEOe#vM%mXbK(~*=Dxy3YkcFBd=oj^9j z_sQck@yvSprgkZZ#=?{$uBVxMKBH{-vBB#k{GS9-`sU`Gptk1mVU9Xl40{>b)Q2H2I#y`4m%Xt8Oj zXS}yaS-(Kxx8XIqTtohaGRr2(sY2IM3UwVKo$n2*x?>YV$^tLbD|FMLD@n1f2uMi_ z+}kLaAl=^$PX3Bfs#xQ+(>O=q%h?Q?BrfIBth}X|GNQr2@%cr>5i*o=f}1aeew+Ic04q>Y1~@?? z$&52a{g{ipC8R{N){Wc61@3(uIWovOdbw`(-gNP_;9^mWfKFME z7TD5ThQ(Pgzo({8$i+(hniw4&Ic)JczA`29seq`b#N; z@I;axS20XqAS6c|e4eJY7q6SKey(WUcgBz?o&NfeklkxC)6uDiJSJwaWvC z&XD<;_!EQBR#xi-3^Vt_G1gkz;Ja`FHN^9ij>Iqrk5c2ErwHg=!Gar6zIkV+IQa#| z?sZa?7txLIAuCMUR0Widwz*AWr)QkeLAn}Ht86n)9U>qyBZj1n0+6O`FK3dTa#Qr( z4K0jqo~#hX0Re3$(bc~FE6}WNFNxX%@ zKl2%e+(pVr#Ni_t$*SYggYV~bYheub+Q&=89u3SETz^inD@Ka4laG3%(#|X}7HO#B ziYbeKkZsti$NH?YA|X^}H2O=rYw)}>rcsZqNV?e(UI+KuE{d1fg`TIo!gRTH<*M4S zt*P-Y0sTVhgh{U8iLo*9XlsA^(uatLIvQO?eT~#p(%CY&YwPQi#?OdZ`IKV$Ack;Q zX`@Eb(z|31w%ae`-T~tF$ZRuI$N)q9iXt|P2Z(juq&qX!7;1bQ^9H%2o^ks0B+fM6 zrC5HpzI}@ya-J|(r^oVBO1%V0>=rw#$Y0( z%NGlU%Op4jw11E`Y{Cl)DoVB}3M#TzgmN|rvmk^+hK7PhhovT4k}){CKnWM7OZmDx z*r1KCHBKZ3b|HFqiPLu1aaI#F759cBjxFBf%hdteVy;mU!3oVL+yZ}%;{QPF1e(PH zHP+tgGx9WDWHk(SPGVSQw6?GavnGy{b?+>3>Si}z=n^5$IGP!%EK1|46p8X3n^Agr zEm!O*s_V%hrH~gJDvtt^n|n9EbvVe7?|AY+3_`ifOqyVzg4rjkY#$D=inlMUz&)fw zNi7dYsRF5PdQB3o@5$&-@?c@vd}gt+`%W9#Z5dqBNy& zpS&6nlDwHAhq@?(tiZOzge;Es$#*0Zhx7-EX7H4h`dOPv2*$4GSuyOxmiDF%5x9(t z=_C5-CLf^OMVeDH?{y`&T5Uz{Cun4~xU`Q@B9uzD?ysp!%Z%j23Af8kYGGh^&$Q5o zZV2e%h(LyI;$w|9GOXVvTqjs|6&W{)69J@|^*)?nz=3V8g2meEkWQS$K%IHR#9sL|pU_aLo*V08q!1xN*16i{eHt;-g%Gy79M{ z3h7ueP4+X_2Y2T{MK%2oClb54hcY2x_<%mBt|RdS(mq4s#<%>O?Q~0^y~xcFY=~vB z*GpW~fV?Ca>^J%Q8N|8nSGk-6-lC}m3>e0EwVmZVD(>N#UgycVtjwgRvYmAh&>B%$ z>5aVjqLjt%QuYAeY+8-l{U*UvUH4l2$d4mmBK;83>v*HZ8(>I+6BaHqk6h<_*6{Y9 zNMAp2KF3=?Aik#rQ*Y)?T$4*IHU-jen*=V|#bt4R>^+!Sqd#|$PbN0{Kyup>RD`#> zPB@nX89*=cXJ-IQi}q=3v$B-FE~8`()jxT=Dg8B6qZ+1yEjoMe?SN`XPi=B@99Z^!b4UpsGH2N2K_j6cK@`2I!Rhxl)vz*UkFlW>D4 zj-26x;0XXbdC7d}0VVrB(Lg9It!OPReo}cR# z|3o{JeC_ZDeB;ugI7*NxlWEzzz6yYzlzCzd#a>l<=aL{r%^x~F5(|q@Iz-FGi4gk2 z`xYr8)(7xXRp-MU)IXf`cZc}U)?U-w>E|3{m{y!%HYi+)avgsRNm&s*WBHx!g*)A2 zB8^{fq9>5`P%OiBqf9{UJF3nwLR##|31A4ZizkV|xQy7+uFj%av7m_UpCaQ$4o*t2 zG&37|rM-@@4B7d+!|c>Fo0AQ4F9C4+LZFDesc|8v1YCwj2FQo}klkr14MAQ~tw6o1}( ztq^mvQV8xsC#P?NB>JV@);q*yI6OsDrq-&{>ShFY&l_2d^0tOUVw?bUal<+Sy!Erx z$b`+KiWsfG4FcGrS{rPLfkJ0@?ZCJimUKE|<+&i;vp7$7%j$`lXStX0QWEwLxkvOg zOh#gC8Ua0J_^?LC5aY`{c;UpL>P;?~z^?z#1l}SY`vPU6E8lq;@oVy3y?=;^7!#R% zz9w1G(>1c0nU!>pW#2@00^ZN+fWEcuZx6g7*RsS7yclLG zQ~z4?kht^bXlycV_b>4ho@Yv{TaRRkhr^6ZcnwXSR!@f`x;FYx@V@k2GOFS^w$14$ z7sOS?#QL3jD0Wbr*r!OpLb{E<1?RxmaJ<3vn%Nqe*BlJ9k2TS%#Z&<@I6}Ad-uTW7 zW~PJS#A&^Vixuq@Ccxhl+n;&%n|N;ndriY|r5Gj@y{ywWK%yVh^=2m(OhBx$zNrE0!^h1x<+uDI!h@nobyw8JGwvE{YJAQJ znZjCXZ;TEcq0ksY$Z|Cdk03n^;?mucK6HYdDXiOLjt+`Hm=27$ri?<*ZcXuzg|9G;HIUTFjCBQ4c1)7o^Y~mpW0y`eA?&Q26mrPxa^l*S zl#KO5MDTtvcy5#!vN`xTx(uHZK?r%4;G**VVA1`dv~*~`rTph?Ue)obVpbgd5TLb( zLKBU=ng;HDVHrl4tE+;Ao0^0YOyn`6NW3Mk+`Ou zwktUON!0P)FE=B4?lBNX`Bg)11N=IE@QiNd7@51pW&+&Yw>g=wiGq`fYJH(UBq`#8 zNvQnzK}n&|kyBktgv={oVkqOD);K{*wz1C(iIL-J7MngrR@Wyg21{JIo?35LI(lXv z*Y^9)+9Z*3KEf(^wrbgD#G_-sSwmsX?)U@L6aJ)R{Vb4Hw z?NJKn$-)5woMYqas?v^y1Dz4%)rPFWRz$BS4=?$a>13rjQh?}Mfbhya3J;P_wN*s$ zGj|WO=S;$z&Ci{Z?XUkTD0?s|on@}m?`B_FXmL`ahp^)dStVOAmm1~5St#M?0P$PR zy1Tgbgh$Ej20f7vj}v*iKaKPNgqAPK)>S#R$*|rK;qQeN$!XC<=ksZD=2zkyt62i0 z)MuEo2b7tR)9Jp=%Fj=d9kXE8-!dA>eRgJduiKYF+MP}UZ1~8&CfIEg(7?U=JthZ+ zg?&Eb)k~tWCr2?lBlhiT_Ny;J!UAMPxgk#lo6@Xjbv;KC#wr$2=$(f_-er(PszN;) zi!;_qGXmLmSL>T4(8QPd)K`B?$36h=^OXbIx4NY)s6NP4l$6~nrASKw0!n$UyA;P> zp|(c$0ndLE9L^tM&pWe#3B=efo3OwbCN$F>wZ>{)CG1Y}rs4i>n@jILi?wI7I%8TK z0r+FJunNL2Y9Dc&hdtw{9?d0A++kYIF#)n%suQpSj$o>hi?68B{E|-weh~*l6zr?k z?zsX6U>iER8a(SN8j6y#x}9s6?z%#3}%d3#UJ6=zeLFQceLIM&IuKdpmt4 z`seR2M!~IkRHrWOv@VRzFDpspc?_W1zk?HOcEpHIpxt@gwne4JVX-gtVux~^+jZ4S z5QBPR=xq_@mUn4U#nd}+=pnebKG3Ftp;?DL>&zrthu@&w3e+A6{YA?82%pm2n$C4K z2iqx1=jrCKFY!UJN?1BIblE_}WK$|mHrq_>T8h07o~#=i8t#@)&kyP$<)OwE`_v9x|H7Q6o2Lj#}7{~6y@(go+FI_~0Qgen0iQ^MUGtjnbuW8*^$KL#{yZruE zA%p(Yd2i;t*s{F|cav>EhK1p$Tdg@-WpR{)CKw<`o}isg8rez45TvEZ0BYZx2#su`l8MN(VqPVa2?fG^WPkI=744u)3NnQ?+h)#0sul$oI0lJ(9U`eoy(t#yGkWd|H2TKA^#-iWw>bpvl zZ%06sz>b2<5U1tlAn$XGXTITY0h#HdN3I6*_!Lr)1i*aHGSD5Apg=;2AmL*mvR-z{ zym0~i$Zt5|&IdWL#n2&5q={oj?Vj<^0(EM@ri?hPc?b@^D+SBETvt8@6 zT^zl)@cPb=OyK1?1*bAX(qdPB{secB#1Rd)tuM%-_eB%);ZNTy8n?LnOhY`dzovJ5 z=q_`=5gye!w{9!X=Q{5bG?wNrLxE3~mtn-)%tJyeDNE$qyP%FQRYM$W+LUUUT>u5W zQpQ;u9OF@QP;~^t+WWYWsTN3nP*W~YFNSE!Kjk$dnx%JHY#MA0eC^V^vtv@d_o!jAd3c1+>K(XuB9x?T(rkR(Jyz ztxnUU_%jycCv`W@h!;B}IRTC~>362egLOEQ(K%DRIaA0x(6I!eH1*&4u=U!Lj@sjn zh%->gwfbe0>gsZu7J!K=4su3`7r1B_Bq|Z6GZSO^IqFuwOP{e}PD8iTg%JODp5gfc z4!x`Q8sM(R+z!r=*qMX7H`ZwLxat}p5A$gUaZBbueb3l?eyz!Df!C4V*oOWIN$XKZ@TN6^NRQ;^;R?tm3xbT@@Pk?p=_4IQl##OUCzh9rxTVoI~I1& zQGaRX9i7@-%z-%`03yN}PREmaAPDmkNz@-;F`k-t0jvrpptOl%m=+%o^`OIDmcTL6 zI^Q|i1eWJ6ClYY_os>O3K09E=?Kek^)n7+r;91s`vD9zEY_&C!ve)f^;Ab$EzSkdxc`%=xix7 zw@c=Vev+J?1P`ry&0?(ggiYvigFFwkAeifvdBmR_^or^oZi zGZl9bTRb81(3;c&n!fyV_{UAlgmi1lq8nK$z#;L;auc;xcj3e9_JA#U6$Balj(AkL zp#_&%4Hdokm^B~G^s>O0M3MdULLA|oSYM_H9o=7QE9qSC$#Kl8CznP;GS*^s;-X7z z^3HuIkZ=JhJ0^E|5Tq*?6RkI_&0Cswh3k*5c+L||NUqM92&k^>+!qrwcpWweoGto3 z*or^13N>hRIpV;eC>XyOmF@8u%1p&ES34JC3i`QkEw4%E($KL-vG`MU-c1}%TzZoz z&n5rKjwsMPKZlWFwara@+ zg6_;2t4*5Awoc$HN9VI8gx&ieU~s-v(lrl^4j02^R3_0m(w3kh7+@WP_cD7jwX=T zO{YxW8%&~0SL-^dbE`5>a=qeF6myTc<@sCp`KD9ozQU8)e#2ezS%EH#L1niGm zYABEk{sIYmZSmIPTg8Ouk3X8&)W;s|^zBIKRObYMl(X}Z75~9 zFFS4e4vWT5K~SZ|Bv^aAxuQi{#oFTpwesHXRl*H1^6z;N%=L~qwZ<@3`)8YJfF-X= ztxfeX0OV?e@>WG?IO2*txKYY;Zo(@lNNvDR4ePx1_OP6r!o!?DLj(3}MJxZvE z)lA}pBu4-=gIfRkk{_vK26?lAJ(1- zzFr^yHPO@h{1)kQ7kY?wXrbylN~PK4C7ajCdx4hawx#&}@6Fqy-b@@Seuu*p3m;I3 z{LqdWWxkUBm)d2i;S~AtOvgvD@LfwM(6}c1j%sp5`Jup zpF-$}Kq#s5i1TIfRPmeQx1@Y&eEr1*#Bcvaf9oira_MZ>^W?5BT>tzmbv(qWzT~5JCB^=s&W9MUw+79cCkjMsosQmbDk8MVnq{irV zbUeBgxfvNDwNAW6tcx+UH4{#f%pT*=53d}1$%!Z<`Nv{aHLC{{m(PpekcysC_X&YG zL@E*Ubl%g<1htz>mFmPjtK4@vN!g;pxsxNeQC+9ca!$Wo@eX|F*f3-7u==>9C*$`~ z^e(pKsh*XgpqQJdrAG757_(CE1<3_(ti%tR$-sIPMF@HqLo#AnbxcgD3?am$W4sAN zUW5Q5TXVu`3i2=|_l!u|%1hghfU>zl@cTbSLPUp5ufwYIodwUCq)Un{vs=Qn&hWhPnOe z*k8{D9kuJMRQ9W`21?|s$-J|e^*Gwa#uE&EOGjHsB5t1`2$cRgMc$7+QchS6y{-mM z`C*tyC$PDL#)IC4;+#n*CroD`s8nQ6&F4bo=Elz z=@<4Z)_vRT5`W}}v291Kl;|M|hpc+l&pf|lrbh5|Q0h}QbR?ByYW)Q{eqq|t|;Cfow#`E-( zRYRX2TbbyuRJs3A>3p~0=CzdCtN>tkjxh#-rD8xHm1Ww}O(j0WrCaH^kSjezYL$g= z^lYy8Ym<{&E})z0$#D@n$aROxRu}oZ-7E^Yn<_dx$>}gh_gq&Z7S1R|>#ViBEX_X{ zwu>W04&$vox4z*#t^}JScvi{S9_%? zt*Eo{$>%v({!Uv4?$UPIOQc~^r}707miW*#fsR9FbwpH21oDO+g{ zu6LcTU45@P5v9hhmvDM;jI1Tqmp;7pD1~Ff2?PU6km_)^QHAk1rsc3`g*tk#b>BI= z$)sIUxwA&W(FsrPEP+G#s&gn=ROq3?`86`QZe@X^i>FDI(@B}&Oj7fcn2jg& zxqLeuhLevirdXmhcU5(frKc}xY-X-osi^AYhlfUp2*)p^$ZVpHrz`^cYi<^vGd(6` z)6y4D&k@O`D91v4hRzl-r;7u-*Kb52#^`o9WK}lFfTIQbSd{z0rLoao)J@*ZK5?s1 z+57HrT+na9!9qiTg$StLSTG10&T9FgW9BjaaObl440Ur5Kr&LBgANp1tnJj`dmv`y z^>kZhUnOsq26js5iaG&mBSp;ORX({40^5|IMHCd@usybsHp2@e7ytlUz0VKGVjs4%n%EIvc-T zsV04fRh0JNV@c!xKl&P7N%dTXlN9NtnMKa3g41%`QYyA7ZQi>2LT*IKgKXrWd1b+4 zm2C~mFeU7^%ld9=fE;}@m2MoY(lS~^Y?#}@RW1>EkblaIlOQZdbnfgvBAEE%aNK9& zYk zrMku$I}ZwFI#|-!+vTLyMrC`ulvpkic1?a*cw?0ba6~ArdrSApc(-RpeZq;q-oAgW z(Gze_t<#I^xlEEzkm^$=)?DuSD3n^YC!cgv*Pj@u0|4_!D4eANc2Ky&0ZWOxO=#Wh zFPWTAhH^4d9CER`a|~FAHZ$wrT*7AyHrqztpu0tZ1f?%Im~r|Hhf|0!pV#J?o34U+T?ZaO=&P#Bh1p( zyT*%}a=0-sW@}(iOnH8 zGG@-J$qC(Eu=B89Ei`4KZL7{LQ+LI7YKBT%FJEnp$#H92Ucx|)vwwG{Y!$s=tyQPs zeIhb(%uqYvSaT9p@F+}botR-?Yl)+ASt5FetHcE25Plg1#9}XxRd$2q!(b(Z()G(p zHo5Er#rzggd}pB8X3LYmo>P>FlB&GQkK4Wi=MWC1?!Hec{dQ%zOTlHdVbb90(e7xf z?$?uKsa)Jt-1?_fm6gL3Q9Z-`-3tu|CCp_#UN;t!N;F-jfi^|?_ylFy@aY!@_<(O4 zM-BJMXTPMU)aazF=$vm*N;0ca%@2hFqanF8zdGuwpq#Y{I@PLygThYyW@|d#OJVS0 z8RO+U9ES_6t`<{vY{t_*?6>ya_1Bu1V92vHy6q8@^aNu^nR2aw{?lvr>o;=4D%`vb zwnGTk6^{si-m8|#O#Jq`x21H{8FKZ?`u=YJUXTAMpp0(w#PS8_g6lX?WDWg>rxd9S9Sivc3PQT@B^YeSr6 zi&X7GE~o9}m~G9-n(0)$bMfZsUhP>sDZP}9yA}l79cdM>&6deV40MF2rufA{tz@n5 zS&X~L|26$yC^eHN)c7julHsta^Sc40ZXw=nh+iykw2*UGQ$%1WQwPH=xH-)A;@ie{ zDbjYcS@1A8>=Hu8-~_{NkfmC#G*Fo}=G;DX87^)RnPqvLCH9!CmT1gp2+ zkyxDxr{{KWz^EXF%wE5`>IOfg=1pBC}}#9$JeQC-`!ySJh7 zH#C|*UBSezUxK^Lez9x7FvH4392R03Hkq+5Ezyr#2@WI?5*~(n#Yu&=J(}1@`LvV8 zrEXLG%$RL;frMR)yhW33RW<&av?W$YZiiVxB zek6^A+zgfCi6&oeHwOwaR2X$$GuImA9R88I<;B50cr6!W=VjL{@P0Uw^W(uOQuPdP z&{cpT6ip;#$vpKKKLjD!jCp#qKWZy%Rhf|D+CyberK>I0o)y_m2sko)mXXUY)U6+-0>eOHLD*d`~YXe*?Z4Po5-5saMGhcrM4)ZlXgjwqArPH zl{3?r;FssIlSV0gmjyfBrcDFh1x39mnx%TE6>iS9-Ctk3(;2Ht@3QPS%DG8`(%br; z>vcgem$oAK-ngb<6+yIyp#J%zufj1Q_q69nWi~%s&h6cY)6;b5C{I5oPNLQNA=Dtv z{Y#@#zcaRm~i8K|H9Pc3)NO&h}Zf6Y^kx%7D8&5uJHxpg_d zZY=QV=Wl#FCGeWh17ev|i;{CaVx;V+`PPGyesXYu%_nII$`Y#BDFb#q|E|2G`pNgL z75z<=kIS+!>a&hokFM~cn2soJS8c1j*TtKmwY<}sw7(L<&8HT1=~>eY3KX1_hC=0( zFjUp01JZehWe3gc>pGFXyW5he=C{sQpD~uE>z+mRXV*1JNVU0QT#;BT5?ukp2hH~BYBoK?Z4?D%Gz4Qs1 z7a~wuw+GYc*t}YwPzrKXO1V73X0j%;42Af6oijffdBc$b8~bqP^HyvFad1Q@I}Qbi zKhy404d5`SBA8y+JYb^9zie~VMhm$6nhi0ps*>105P?ej6|#NF*?tNCv2Gfb>Orir z*PhqgpI6Vpvh=N9Kl89i2xT?^Y4Dwi9#$dI5puCbDnKRlPG z8By@8dSm;^=iq?k#$1yQP0z%+=b^&d4Et7Sr;RDP9a^ukKiS#NrN??^cjxYKdxY;_ z*M~&}Q@>mE9g19D6#~mM-oD&X+BVO}u94STN9kvM+Gn5J>-2-v+^P?%%{yG=Wu)0Z ziCmbC6@D=z%Av>oBIiK2E#JLNSlV{#S`AZe+K_eNlwnRXJG2f zLyqRM>e=FKrZ?(eqr88p>@MuO^@;EGynUO}4b`2whOZ2uh$%;NF!j$RDcopEM zuXIZFGZ1LrY}v@yq>lZe+0OCL>bC0&+ zW`ur=?^aH#X7zp;*I;2nAu+G5AwTc+fXO|hTB*qloUB?>c|m&>FBp~Fo9ee%Jopat zKM`6WTdPzX&FeDipI-st1j*rx^NX0itpPDo$J60%Q$;0qd9ksSPMKS*X?uREwe@q( zknN~n%|<5L>&J3i;d(YRm_dNUtd^H z!b$5{RFl6GcCT4TYZhmGytFQ-V?hLP48(%! z$8Djyl}?1=tGrgBeFDLxk3a8d@B0V4h z5v3TKBtQ_E5s(s*CQ_yMNbkjwBoKtqyMPHbAyPvL#d|XI`|e%$AJ=k;yyrddKKnd- z?`J>TZ@pTG%g?K=a~HYZB8nQ!*Vlaa zA`2TI*Gw}~+o8|KisSIYc9aCUf+m+9p>ZUQjtw~yh@3|#!BNDhy+0RU@c7Uc6lN_ zFJHfY3C;CDiFhD8L@+IXpY5nYE7yKAR5F>t3Z?9Ydz1v%5f`iUlgnZ;NNW_d5!?I8 zhvZAeTp8rOWlN*yA~ePZ!ea^&Hr7Y8q1J<&qmPrlAJV{&>}>`F(82 zf`^|M$9x`8>6@l<3~zj~PKKm?GhkZ!$$&O1Ijbbq9S+|qRo0+&7TzyGbC3qEwq8PJt+TTx1dp>9fKPUwViaqy!R0l^Bsa zPas(B8pOKtt%%}F^f$g^MyWMu5i1QN-?2i3MYAMpUy!0>mQkVJ znEMNn*El$I&<+m|^lk#h409)*59!GjDMcR^yU+SfUsFH(Wbfn%rp1zSvbnFNwdzYB zB`>L$XN`AI+tpGhcO5Cnx!C?H|IF<=busm&wAK+Kq@-=`dnd8rG2j#^kcV(Wdm0%q6v1DUsr6x>1YhxM_AUgRqe~Fd( z()G0MuW`fmi3P7 zqjLj8ejRChkVs4kav8G%tSmo2dLfNd`>j)HX%&V5?)6tmX64^u{AubxSfA;014>V< zoV(JtM+Wzk9qXSTco9D``MR!lq~XV-o^fp%k2U_IF0}~9Qlu+c-Ek+q8PuYBmDQv# zd;CuepdP@883Ru!bpQ;R6B1s7@D$kCfR1^ksG3rBQOJakgCAVU5OftrDh-s3XA&7B zx%l~ zWz8Y?1G4NwE?O>z_eV1p+gru0%!daN5oq=>-ty45j($JaN-ke_!@GhiEs+{Cv(vwY z1;_dNTawirD!zEG5yjL^pvYp|g74Qv-Jf3PmUsK6L~FfATBN$be^&d@*4agkAw#Kq z{xeZqZWADMH5I-uewpaI)jL=!VrQOZupnF-aW83EEWFuZ?B(}dA+CDt z8+dJ?_I6kOahmaMP@K$BUKPAMC~t);!;(j{HwZWKA>m8VZ3g6&&Mjc4hyYMH$wf4H za1tX5V)_jpL|La~k18jNPCbyPHq4DQ*`+0IBcH`OIMs!vV`9 z?yxqcHCb5H0jSGwqai|bk0&%*e%4y%{OsEZbFFlLsD_7XsI7f={I6G+qJQV!lUGUJ z^rK>hQ?oV>XV&ht=cXx;hL@>j2=sjZZL6$WcVZ=TL^9w9!LgZ>rtqOz+QtuT=B*HS zE5Z{ts0B+u`o+u|$~FKXBRZS8gLK(OUAy`oK^Dj-6gBFHxl8DZj1nGOE4SjX%NsYo z9XqAlFt78Mp4#EQwG^tmA4b{m8AMTeeyQKDb|^leA9xZe3WkMtQhCSwg4cvaMoL8a zqGgq*!vwcQhJr*+2dE&DVnvo~r*dJdq9AMpWHW0H-Nt%iV?v()+xg%FngZ*_@2|}2 zLkIP=(_;M(8doWf9SiuJFAV8q=VM27NIi-+gKmChf$%gGDD^-;uIRE}-JqOxZ#dha zsoY)E!FpmqB$+R>H(!9EBhEdH+l?j-E34k|jP5NT-; z)sMoem4-&jlQvVKL}dZv&pr69YpIV;0M0^ukgv2pwr{jnmZ_}YE!)5p3KvH+=^-xj zWiWCyZsnX3&*|;Zky{f@-9G3YnUqnyWK%8<^~L-gz68+Zf#y{Mk9nfs8k2tiYQIjJ zx<_6Ay>e&=tY_=5%P95gtP*8v^S^ToKLU0}hfWkX-gBT6s%DQ}E7DD%Fqr8`6U>itd%~tU*c5F--r*}bx~A-vVlL26JMaC(mLBEWwjndtl_$Ty z$RVbb>+o8Q9OM-iqa5w}Vyy4K`oiu+f+Gw1Y}|#ynuF|1!gge}uHPBhq~;0h3@XvW z%&r;6670hL<1>#=h(IL+FSFZqrPG*f3!UM%&1JgN)K?wdx~FO-b)h(IpRs6kz}!Nl zBcEeF2AOZRff4KVyfh^xu$N^={e+-Hr@jA9W*mGjG3ru{VO)00+IrQeHkz|)9Ka+M z&$o0{xLU+~c#R%`BF(*wI?o9s`V~v^Px=^wHSU{IU48txlMf4PFgAex!9&}Fk1`{h$m4MFacI@ zTom&IYuBS*mETXh%m%FxRTJ~TQ!eGibGbpl%SbsnZb=I-r(NMG86 z^ld6Sbp0-jm5J|VbcVHIzC1RIGIv#u_b2At3a6OaR^0#LEUmudk~AR7U9YLE2Up^r zomeZ4`WVU7S7qcOg^{2{FHE8TzS9~x(|Pqm5&VkbgAqtzRU#8Q;;S3H_YUsnxzPb5 zQrKrTNJ4_FiJm=@%1|xYGEhZm?BoyWjQ%K> z5Z6SFW{U6ii`n|emm`|dA?HQ428~BJmlA0>qQ4`}vE(V<6``*+ z&v;gYCEw$CPDA|j6>BG`H1*k$`1I-%AR^xB&@LIPfXi%`SySE6pKoebU} zTzf0p>nxU0+oT|{o&2U`sJSoCFNp!lY}e8npY2$xc8iH;Vnd~Riz`3*ole$PJwWhJ zdV5wZ=CfeD&k7^G)P~a~bE;hBvjN8u8w_r=g#>jV5!Hm-bB{|?PKE?3pzPGJ;J$d) zr^HF(e+;Nt;FkF6Ahkm5Zjwo%FBwL{KZg%WHwiSkCw$)xw993MYwRwoUBsH3lJ(wF9FWec7%7U=e411h8#lZ^gQ_tWk zQ?J^u$MROo%9<0M?vDS{pvFC|nU?$ESDU_jK-Tb-EL(;Wdv8BX+1}>f8!@l)#$ck+ zBc59v8;(8{hi(+Lvy0$%EQvgzD5>k?g+B95xm*DN6T`UjKyW066(=K?f9rNhd^!r>A)7nYXlZtoUxyA;(WHE|m<@Qa{7w@9^4||^R;W|;MJ#Adq zN#>gSwl=e!`S)t?_%r_u_o@VI(cw4_uiva|T9ozm#!0zma*l}EGZ)?sg}G}E77hLC zRPo))!i0jQhcsuYHP26Hu?9lb3Y|==Yh52~OCX!~ex)Mnx7WswPy z%gwNiE`ZGjQ+`~+QLc;Nv_I&Lb*JYm?nGu2f>cQq6lO)*Fyf?G!<8z%=1@XvT8p*% zygXt=oecd*+jxP*j3FCqp~(GQ$Fxz~9a>B?vtu8*m-3z$d3z-&gpR*oFyZ5v=rddO znlLG%TZUR}UWqQ9(XCfzRbv@3Z*7Gu_q_@Dn!?T&*TSP_J#yTAs#EEI>rdzEt6#r0 zc~;U!+t6|{gDJo3<7hX3nmlCC>SDH3P#G5lw4#8dMy-t78E!OH{M9!TY8g}@_FQ4cC*|_S(DczVhzcu`MfazwOMU!1ZjQzL!fxk*+uEIsb%HbT(CY9BYLk z43@Dw6xvvm@AXVF_vgvsrhJyZc)&ktU-x@pzK$z{!HprHVcuvjTcgAScbdfZtGPck zw~wn7-pzm^l{dd2fD*-5i-}bjQA}%co)7dnb3L(cJ!vbdeurn3Rr9nchOK023%F^G zoJMvf)oh)3(7F_*?t9=tAfJDpJ_Kg?O;qbVsfPVJSS_b){~`VoqxEj3RY=)}_d^DQ zAoZN|;d@OZ2EZNmy~<7cfFf3|6Wh3@G0_hR+_RRMbwBkqP2W|}^>3VOl(zCanzE8x zg+)l6xNty!7)~?b)3j5MxZW@7rZm_j&?M3@(CGC!rZ=(8-FvP8RPH%!(Fl%jP`$fb zWy<(Vp4F}^DyP$5?IQM7fRJuTYm*)m^6%ei6$ZQqRR4CO|5ARtFV(NVrWU~hb4^%< zQBHn-C_nbN8_gjA{*z!j89uk&R-@nt%N}*bt@vSH*nReFE6kOcw@()Ds1y36!J{SI z|G3#xVWmoX>|O~UpX1aPZ=P;wFVmGr+~oH4Y52!?BJ!(9lyntI_4=(b^KU>JY1Z-8 zb6LZ>mC?7_A0*unyJbK{LuT@+Pb-jFQ1b_u{Rcv%j--FdN1>p ztfjhPSThhmUgxwUuEAwKEa+$<+@BMw^fx&sV^E22DK!e4yB^J?-3ZnATyc^QUFpJQ>~5_H<*%$STyR_bEy&-Id=;iO4XtSwmFG;X(W)1cHTL% zW^aB(Sq#Dp(gbmAWgQf>pxGpu<%s5kV2z*t)OQiSwxcQ_9Pk#;m+S~`p#P$8(KbwQ zVz9*bcQ{`#M&Y@(OqGi;Z{$iw6KSV4foYNExKee$R$o;So~5yG<=%Mp4@X<38pfL| zG}vYLX)uNLR5*=UyGQM3;1$5Djy1as!Tlm~kILcqsDyC+x~HHm*)H_NWFbWz`f=>v zO<|W$Y}_t~Zd@44(5?&+%}w6<8WmJ!4hQ!00nmLwD!usukI1lV-RGY&axrC#&d=oL zs=c4PVC4T!!~E&>lqn4<`^e)9+E%TnfMg(nbHjZpKh2wP*rxhKD(`JxE3IItBwe)= z^_jAUD|>T3=LqLBR< z(u*p2nrn!UGcl4dRFa13mv7#lO;U|hfBB>}KcN@4<-f)Mdh&FSjxqj^oqQL+R%xe{ zs@sGa-zu}aP&;IO7!rIMSL+#@+|(hPrMZF~P(U(u^5Uftz7T?*}G$2*gHs+ z+Bdi?wev?9@jkQHQ2#S!YalF!u4I#QN!N9e(2j9rNWHCW*Bnb5%bUQ;I*pr*s8i!2 zu(r#ZLcigc%nIMWUckh;?1SjRGLMzNqrgfJxDv0H9>F-o&gqvwvDS*Mr$8;GAFRk zX87@Pz?Gog_ETpZhj=@+K-P9$4+|eMnz(T6`8Pz$L#07XIo~6z^%#op&p(74?cYA) z@c=I4ovP8Qk*FP)$1zK}>mK%>X)n$oU(a2Cb4#lPec&^>Dk~?hCPehbYG=QRZ==Qn zrtvPQDA?wV5}f>ippYpifmZl!R+8Y6{+ivYySZHiGbHjmQ12gy^}v$_wc!YD*G52= zpF;$&20VvKY_vXZg`GuAY|YP9-ni8B#&87WyRt`0ifl&LhEko0P8zgo)1R#81u$CK zxR%uHy@raAr4eaKg!qtV!{n`WnCtGv14GO>d9x=&nwxK~jSXaq3Nx0r(VDZqsx5r!AA&aPMYdE|%kXw@2jjX$L9@?{ zvLBHqEYJn{!=l7-9eeL@M(XziGFmpnH9W&tLk~j_-?c$NCiLwYb;^Qz!W<(LYJc=t zxa$>n7WYXN-r#c~+*#_(Uh7ZX_JbS%{D$vEqo=Dbv_@ceo)3ngEgSByD~(otY91hV za=_)ao!w+K10z^^)bqM$x{&}OA=m#hY`f)oJy3SUrLJ>&$`3?A#QABX{7h;#{mVn* z^kRY|Eid7;8QQeJp-66`iL|ndZi@9pU_hd4AE~l0Zm{_C^}}lT&n?f-sx4ny;VV|W zJyQFtGaah+n`5APht64i0%!5@?UvgOpcMXu-w^e{{>4`!*IYWU;{)S2xwk8ubKe^Q znGgkT>plZ^EP80OyYX0n&6&`#vMVN@YF9X5q+77uxzl60%!d5nqCY=RK4S<^krCAS z`@p@^5FZw7fpVRR3w9i|N~=*QOgL?ej+phekX%#RdE$5`tyw{7)N-$}BsPR;bjC4v~AkSfai&j?=IX@ox0B5-JW)si#IrS zL%l}h>D`sMkXw>sdf$UgfYRSsOpq^=tUJRDD?15o*yQh*;98QG6$}7YQ^q;QWr<^g z&AaEnw6sor9qV|IcAFZb6CB4a;=JmtC(&>3pXwm~O?sMErd}Mcvit=TUwio>m%iSLN|Jz6;YdU(SM{E95?oEwVz<9M19WLhc#lI-l zhiw>%`S34YU0=D5GdN%d^hA}wyMIVXDeFvKMvpH4rsJ;nK4T)?kuCl%Ykua_N_Pn4 zH2*#E0;RzgMZL;Uly%SnWRNx!Ls`Uwa zzf+=q<7HVuuF!w51Y;Oq6nVtd9rKpPmrJ;=Vc{*CJRU{w<+(WyL34OI?Z6Kv8;@xZ;NrG`7+o(uS`b8Ftp-|-da zT4-myN^+-n);pYXnibk1#^{8kvBqS0OVzs_ni8a5^zgtNiaJ!h^(9s_f|Gq|4v8O5 z?#ux%=U2F&YBPR^Nld&8{AucGC%y#Q6ZE%cCx8alN)Q%)IjL|KTb7ZAN)1GfmLuvb zLUi#*6_}w~7HvN>9_QL1y@Qf0i_&)DbS*Tm8vfY$ABgr+5=|G^_PZgzEbb8drQ_a! z#{5F2a2z>4;c=1#Uh| z@y7SOS(1tZE?cPStwDluOoQ^5IrSbMohQOdDWlkxDp{qsWw0?;LevQ15{OsYy^X7Hu2KBuae!e0G`>Ntz)aIMjoY~CL%34kY*a=k= z8&FA=Sv78dz`fRTp7`b7Gli9vFg>xR)d%QxVh}Dn7x%%@H*MVi^*0Z=&LguZ)i;z4 zVw)g#;ANW<*0#b(2A4CTs^>wSW;|gN_)LqAlQybl7>c{Tn|e zrZV9m_puA~mcgY6a@XH-)K*`+Ssli4n@?942o3q_=>eu|Z_=jZf|YC=B#P zvlwc(GMBU$O#rc=l(?=h9Z@sCcmgMN zE}Co8$cktOwHK9rB3I^k(uYXt$R>KaE;~;e>vk_*8b(ya2C4!Y=O4*CTfvg`{;Gr~ zJ*_@UP&-e%-_D5CenD+Rflm62*X*V z1s%mt2DK&`oK91mlIDkjDa}vCU5O8(v<}kW%s&u+F$kQAhy}jLrU8?W0d?|?2(xCH zt5K{4JOW%i7|cq!%?O)i41S=%#zGD@HgK=<-!~fbV@nz~pa9#CR|=QM&H^e`FzH>zIYRE=u zn3%P;f!vbd^vmBX^yI*AI@)B`jHUXivxsJcz|(b5BZo3;zt>7S?ztv_%4K+ODgcY9 zI8c)_sW)l#-6<@x`MB550DS9m+bTu^irBdo(I?dan_mwmXD)5)^VJ~Q_cgE-{Q6D` zN5yezO=oncT=KTa@aojH(RrX3{$JtoDQD?d^bUuLw#BRr3%=c0)cLk08DSzb%oStD~GTibgC~iY1jw6VbNT`%o~7fzUkOd5F>3Fu|xqH zA@&9w zTloG_WHDa_U+Z&Wgau}FsG4>6CG&iW5A3CEAc$R;U5H6-1KY39Rvk=rmt&`Rmr4&K z-6|5LUCE=L=vkxd#|4=^IW{^^tDYN6As-tLD#94$3W~-kI>-cUDDU-e4T4P8R&S9o z9@;@IM>Jfal_?m0q&b3ibBLiuGFu_MuVnnIV|`h_`WA_@Td5liXUtzWoZ$um1*&kp@;$@uC=hdkU{59|6 z!pLX1I@t!Sh9ZWa#kaalX5Y_89?5K8d2@Nqi|u4EDD7zupI(XFdTK1SS0q3BExgKr z@FXDCvvE*V8HmH_N1O^c#{>1gnSw=X2BfUJK3_M6T=j8*PiMLl&*}TEGgb!WnLnyb z(>yDR_te9EhB(SBO@Di9`l@fq;0xtZ>EYgbsdcWDejfvZzz_THtGYFxs)|mlnUG9U zT!kl}Tea#Tbet>nB>j}CnsmJqMb_wHRc)lYkaY{E`m7!u`cz!@aV;Fh`?W;xjEMcY zILh$97iiOAKbQ>0 zK)ri^@Qv_X`YFe4WKay(tz_khqXTX>_5_*d`Z|wVsama>;d;q+Pls%+va0TXETyj` z{v$TVUI}aP$-g#j{&Kcd@VQK?a>h|@0E99O(V20C2e>@Gn_laE?ZtmS0uC1ac0b3Sl z%S)XR_)N{bFQFdr$=DZpuN8fjKTwOb z4COy;MMcN}+rB9?ssn`(J3({=>cO8;+-E%$_@B<7lTtSJ4M5sNt2L>Qil7+}Ac%k* z(OkYr{|!bvdsxv^h9EG}`!!Qocze-ZeBm9=J2dFl_j4<(%+#|J!=vfZ)d5rX5fNVv zd(0Hdlq>X-{V6$0{U3}1JS5mpbEES0Y?s%zM6_17&XTxo0O$nDHu_w~s-`tPeCnZh z^d(N){r)K83Nf;-Ej+BQ?fFs<*eK0qVg&1^q+jd|CT>6ByFZkRnI!5V0BH3PJTNHqptpAmzUaW`u~QC4|!J8Pw-|-cb^q> z1)Ys8?X=U|B7({K{lPf)JifDL>YS3$-Z6J5Ajw5sxRv(F_c&5vh4{9t0XqWO6lgFH z$mF-GniCn3+*6feh)|IVzITh<+aPqXpyPtH0^BfI^uyBbPxgWKDaO9`L4sN*lQg$+ z2|{D(|K@2+OqzFD_n7}b@T3HaN#B1umm2b7UVZhI=3gmBP8*(F zT^J;*Nh)q3CS&$+k~LIFaZNmwX0WK z+e??33z10y9`$8KlNlAlkfAhMYL#t?twyzKN23ot&J_Q~n}P+U{tdoXy+5ai5Gd2nsvKOCq7j$d z7d>%3xXCHg5yo^dz@8vCij;?|x#1;I;YKt?M)gy__+kpiLyJU>9PzYXL1Iw7<0YvI z6I)~|$pHloWE$tARAAM*6O6^*P0?sG^^b4R|i|mO>Y?-nA+( zo{28QVrJi3++24NwOYkGfw$iY*w^=?Tt6WoA#Mk1r;n_2+(9kQfDmqEw<3k1w*xUa z+7r>;i*e=8ClQ`F7Rs zoN*K;Jl8;h;m6duI-%dhUU*dH{RTq9j2LgB`>fxH2S`E0s`O3yhx0_9^xadkwA1is zjpX{foi<$^B^%Z3f8{p}dFWPLNuG*TRToeXk8Kw-A6#uv`J62}obdNrd}?asb02^R zeD5}V$@-(t{qT5`9^GjJ_5+!Dec)1GE%5gsANV0@zR#~$%5QaP+tpsG@ctfOD?>DO z4d(MRB!i%?yHO;l)VX03{jxETp$P}s=8|teACA{>h3-mbr`K7Es`v4|m>g()nUiZL zFOQdaRjlorJM=X5IusCXoQ*loqqM3!S3J#OK({BdcswkHMiMbbkDbNlK}X-@0d^s} z&FOaTuXnDgZWhgG<&G*gpRbMY_l**FX7UhvZqV0mJ#14K&x=I)VY4Uk90gr$%2Fk3 z@QbtSDU&G-8Y1@T3)_ha1VCgA3<^{1EwP(s>UcE|0-(LP?L&C28ER|RPbU022;0dYqtx7ozHN*;K35Qh8tu&7z{l@I6o zAuj?VkbVQwet5mpX_q6Zm z00|=Gts4tT*{u*n)ixolS!?#k&FZ(z&892EhpO@r&5}%lpgX7u+ym^@CyiT@omiwg zlP!xINMe%NP9K5zZKtmzlfCJ%VuT_av4}AR!kl8Z(p{wX&oKYyPlZOJ=GQp&7?)Wx z{{J935JpYrpkivw%hUHa?=)OWP_jxOJ6Pv$`WN*%||aqYlaf z4-)61`WDHUv41N?&1~y54Am;64&A>cs%kR%AZ73{VGazW)8D)sW#Qr20_@^dq6}wh z$bSI=lw-v}WDXWt!k&&vv-bZ}!&xi>xtr<&4X3U%2v<|V)BX(vcAj(U79f2+6Vc&= zN~A*&7S{2E$PreD@16=MJJB2(*!k*vEaRUKQA9vfKc364fN>oW7FEy}5JWn{$iym` zi>?o+l;Qw_R=Vc@mOyTi%UMc&j%hOfMk@<{j(k}8?dErte)f7N%5#rQjdM){ zDQWfm4FkZfWq^KBUnYn}5MXDjWsavRf9MZP^}lnxah_v15C~?(ZS^MA_&4Qq zc!i6`i;a+zF2-+_(QAp)B(Y}#C<1G7@RA|mVv1wxG z#^O*6Aip;hQNWs+#}h!$4X6Q;)<@j5$|f3E^hj)vFpR9b4{%7tV4C0uD8RbM-&x}UmVvG(k}uV|HL9d z0N*$Vo}z(>_d^k!&90SPVUU(bSwQ_!6;x>1<&z)4_2^#$0htfeE>vuJGkd%Xjd79G zK*0BZjcHXs`5slUi+5N`78KMtbnv%}XHwt2IQdZFuz>KR^yR_TF8RWSjn!WgyT2nI zU>?Vv3hy;)`E!Nq5H7vcIBDZXLeWP%(H>&w?BWf<44Lbo&AdmJ?~ z1kXQ*TMTf{??bcdE#*EiuCVh~5V$ zYjsJ({q3ug?d>Q$tWUmKF%A6Nv)sRJ3;m0B4RSX;woBG3#Kxk~*~oyOZ~ z(qHScbEJ)O!jRmg$xrir?}cm3%{u0jrbjxKGl{m_`Ri2UqDtr^!*E!a;~2?m2kURO0B*?X#~o@1Z%ySL z3*~|4;C??OuyKZS2yYnlX={q&_K+Ci#tML0b`EBHa)vg@H1G8$HwrvVCO`WdT zGEJjN29!{?6_n=m@T=O2ahvulcT!iOO|Ap(qd)6*BRm()NxiOr2zFS&z}bt}A&Esk z`28;GzKAzt|4)m1iocuQtsKnhh!5ggYo6}5Bo%w>2!-#$Yu0rR%H($5pTRLh7Wl=$ zvO=JN<%>|VK2hxNo9~Rs3q~5NxQM^0LSnA0(a61ak5;%rw{O4OtZD7^O>FxEo2)o% zI&t01>%Hjq1+}4vikdxnO5L+%%6rEIcDsj0O~iCjE;{5;?b1ux$i0ism3Z^Ar;vD7 zZ>gl{^eKBw$G2A{335_zbG!N5Q7Ol{zzPt&RyVHe2sWI0EM$L(UnJ;h7V4cn*6izh z+Qn^kN!_lHd2uPVgZsZv)yxIrGbz72zqS9XN?&Qao3P%0qd=lEOd;-$qKcJs&!5uV z$DCzxSBkHADf9K5wI#JIzoV>|3f$F|)+8*GuApE0dT0V?^Z56`XS=ZkkFCrI>$I_` zhEMtLBfOPU7VQ0$CD8Vot8=SuQVVZ-AKo$$SgGkc;=+9(jmw3bApI`Lp8EcEOokD5 z?AV!?W@Xji%{o*M9zXD1ES81kJ+m5lhtbp>mgKX4b&j%05xI#=B0{)G&|g*(0Ve9o zjro5@l-XOR;8u~Athdtc28CFeTW+yO1LKb~?vOAkhq`YmKvK5*aRzE8{I2nFV<(#J z+i?Mr0qtH_(cR(t%3jKsG>XkDN`KLcAYSJpPDmOHca=L@Jbyuz*bUU} zlqD8Yt{wFJ6F3*okCCFA7vwbSWDi#tDsG-!DjBV`mVR;MNZY4aPh+j$)c-=&;DC#U zb9D**(yNwCIh0*4t$gT}Z+h5*5IhU~u@~zxedkF8vhD)>NL zx?5KA;o5fvPR#=0wgfsAf^&Ed! zf89Gs<)Oi)nVTAK^ohB85c9mD(r4jSj}Y>@h6-kurK5|4#(f8DyRdDsPPR6cb96PaWj z{;r%^5j)wecFO~?UW@S35Nae75;{B^SKnIs>v~LmYSNP)F}7#vYLn-#$(W@)l@JRO zI*8>>|2v{1l5^dFS+@!zz>*bwJ?1W7Vcx1R4nxO9ElRL-mU?ASN=Nk# zW8>Bm;pi24ooikGrOZ+lgO?3Qwhm4C&P_-I_sN+CEqx0ZfFMK)r-cw45qPZ)1{Hf* z4nKvwcO-a#4^?H4(2|J@vkfpx#r!F+#1=}S6Y&1w2(Ma%KY%X&v&P%Q=Bq^V@sw$& zeP9LzB;$gazlPgDVZ%Tay}aQO!Xsz3a{7+py%O>%T`8rezBwaNrp$dlDPiY7V~u|= z*?)*uD9p}uY5&V`=4$GN*h>Na^&h3vxE6o6==k5P@5{(T{s%A9+7pe3rXO$mob#U` zWq;QXPhEW^LF-~w`nT$rSuzU{rSt1HFJn*jW#AmMOiRpHZ{~UsirEHAnyh>1_J`y0 z3DyK^$F>4wPBo2wK_B%KPbT2acfp3vSa}stb~D@uoG>$lAu`x!V`jg-uh#(mx#Kek zDZ^AJ?xoA2svvMCtAa8d|2NiL{W4hA3p+ud!S4g$x{Mo_qU#AVR01L|_HOn9KoT`w zG4F|@wRRv)E24b_w0F7}@W2+8Fwc>FcJ?%n_9BikL~KL!j(d@3tNFJUD5shQF9 zW;1+Bq%W!4Nz!*9#Ck~1%~X0c*)A4!DbA_x5rQcrl(PEP6WtZ==EC>u9UqZ&;dG?gb}92i*O8)N zu$aLco!bBJV#GO%**f&IerGiCX|77;Ua5a~WOlXy-3+gjSQ6)6S?sYQ3t(ZPPKGgp zCFee)+PF&X0NXV92jNALT;C9&s;F`$ccB_Pj+uFtb`y|`t7&Q z;d`m3O++mdo@NKWp4y)^$H9e<^2GZN|HI&jFt9*GSi4;qUkvpI zmAklzsacUJf}Hvk&DR5VH{LkskG7k-r!{+snsIuTJ%aMnm^gX2cITBatPOU>aoc$9 zedd0sZ7E$XvV1qb;Zc3@YU;QU@E!nJY7%M@%t8bzr(@dyqLCquSLr!ntaLg%F1LxO zTl;60sc7kzB`d=;iL7)9!QS$@Y709se5y?UyxHB*v!wO9V>caz`WR%@wBzc39HNd! zE|kxQk6k%<6`0clU4r9t=~o%yWW}7!ZUbS4JsVI&AlB+a)|b%HA?tNs9(IDe}8+R%UlDwaK8GKyId{- z?_qyXJw|AvRwpC3;nq+gWz{FnOeYlC4amj}nK>(3f&!hAqV-ZvcP1*bW&GG@?#tDp z8t?XR|MuiUUFXltzm{rfQ89lAD<&uF1UBvBf?UayH{*#)qN2P5a~?gLbiL|+-*%eQ z_X+F{6Y}!A_fWoI`bty^yf`V}zZ*UyItJ;xBml01j-)=lh$9!?^aQdBZEc9bf-O4s z&a$`So-bdzFq~-|5Z-*j*1teXEL^F2NZ!3YA-QxnBSCvbHjM%N!8%m42ObH2;90Jz zVjVE}LGYKoXmK)%%dMVSRpw*yHStzO{o4VxY0`ShC`fE^LX{s~-xJrZ$u0?R|Gwtd zv^^UGgpYQn)vz=*vKE(FiM2+|O5H>0&-@3q54LPIZ&czhmHteMFG2)_!)NNG)Z(Pk zQ8;d}bdoYfOTy7aQ@Qa@X4{RRCb}tJu3kj8=Dx$np(Bfb92is@I;uAQc~kIJKx7Y7 zoC6^F1NkZbhkDdWNQ`DxiEetrXSdp!_~*pjsxs@iaCHy~>F2VAny1&Psp13o4Bg-? zaK>iL*OA+LN*YvS*ifN$>Aas;hM9Ie+>2_gRqWBj0$c5-uuaEJPp?`l)!j#q{&??C zNFrbTg*t1;J5@95=aZ?2Ix35|PFOqrpwOE2*3YXE)4o7}YA^;jxBBrQ#%dttvc)&2 z9WgVc)yjFx8RHpn8IC_|Hcg$;Rg1s2wz2xq&0urOI?(^f@B#HEjkGKF%qznqp3Y8& zAFspY5%Sp3|F-nbdPss7yn7Tf^`#~`?=Snh zA(@Ig-*$MH9*)AgHTCXzH&Uf|PggR02RqF9{fpaUeoK{WW?!d06X_V`-kIKgYYU4vXwGppWhG`wK>K zHDXQX@kYu^-pH1ZN7_~bR@)))9RG>aDSv-Jl#4x4JqQ5-^^sd=-{Iye8I+mKzicjG z==r&Z*q!P?KZs6JLEm5Hk77L+NU>;TSE-=;b8$Pov|lMp{<)LGhu)SWmIUjb^@@TS z_I5lmFN$ogAHeR6O-{5gtC@C>(fh60rNt}eUH6XoA{tM`zXFl)g>O_zV!G2_(&E-; zcW2+l3PH{1dd1jepKoCnXFvaB4-Ykzj5S*XEp~kq3QE||9(AdoixNE`ZFlJ3`RV^3 zw5wdBQ1-o5E+?FwljzIQs#I`Sq$Y(0_-F1Hq2;qM z5D>qJJu-Ey?Kde8ev{lSnJ=s9^fp zqxt->oN$W$C?pht9)L#@(q?9MO=^=?3!&`~5qqXhr^4auK}lUKs@$hr+|l1=gI9mWV|)w~HT z-f+FR<^m+4ddoC*CvELL00>kHDu==%ZZ2izTc|2e~j0 zkF1)#oyV8@;o_3rp>yEKojYy#^7y+Gf0o*g|3G;XBNWd^oHK*;W6zGfrrv2L16>;5K2nhiBWzAo9R!*#e%$n6@FIq z(C-Sd|5NnwE=M`}M4`)()3Oz3KU&(%GG;DF_vJU7a$+Y7+j4R*0I~qoYg|k9-fm5! z#WxrvtX*mXkG$swOe`FZ0(q<+7S(3Ov9_^+ow#s$Uzh*-#EL*q!BG;4lM17y?A(#Y zz2(jJ`ti@-_Uqg3Pt*@2DB8$D4z?m+pESL9BOg&_=~a++x_Y|Mzi-3R!voy~mk60B zkr#kN9Z0qBkyje`K$n;S1WMpQEd|XL7TJmg)u4`8lLD%(SjI}ZrQ1T zy}qdH)4*r+r#jat3%RTDTX#>^Q)0%Ic&x(rVINhS__Vb|tVr?L@btWJw!5 zth&%2=ibLgXc^B`&p&}O*j!v1I(Kf~FtM6>7HEbl{H{FXA=F_L9v}vUIz|H!}OUh`CLq|>&|5X+Hj;xoq2HpP#;e49SEff5{Y#MDmif%PikS14s z0T0nw5W1TSyYdIOCuXx`9sPez_prl7Y+kOkdU@c;-CStSR}wCk1z%+f?jKR za%w*LJ=l@g8D$B}4`?CMQLJXW&E|#G9;H_0tAMBt=Tl}>cvHWjIhtSqwmk) z)WXw^_D&@+*one2ysv|pgtiB$yXID@91jduo< zg)Su4L$oA&OhjR*0L?4;7=7wa7W}4oR1_Ki^!~+j`P%f+HJ-?)&qR14Rg&*%^Xo?N zCh`xoNC1)hXXdzqG8J95SAsD$wyKs9FVbP*M^EkOIwFm1IyKq48(-9Xk11YS71>wR zefKr7pffnswG(~6>Y4dJ((hhcMzpHdB>)=0d@UHJxD8awV494Egg%=AZ zXmOt3JTowARw(_Fb;v!KcduM45A#|x;B$czOU4h~InEbxFhf zMA?LiVy#r3u0fz;>iLf82h69qot7Vjm>_RGNySP7%5#+lP6xtVgPqk-STDk3Bwd9F z$sWla8E_@gRnsloQ)|zi8IsVw1@fZ(=c>uE5H|?y!QkePGiFCoM>Sl%h00om$=}CK zb<-(lh5&B8QgRTSu05R&650j`+# zm|RZ;mF!eXd)_7Zj|^k0)4A~!Fa#>Vk#W(9++@aWb%tFW{L53a)_k>4ra0(o2gOMS zk)e0?{3b8kQw+`c`I|Ts3mKy4qo2ke(S>3ZXK- z(p%Chc#>AJ3u%(cPf-mCS7W(MxJ|kn1fQj{qk`4e%0tab0bB$D4B-q!n4aWflDZD1vCU3V1!@9;+1gaZ&esa>WL@;CPW69LRYZPRw!|J**{(;h;=flVSm zZu)y5WklFgwJWES{wDmr32rC{cFyQ;GGmMnSRj9>Dp>#L*ZeCAz-?{LF-85?q4Xuh zLq_u+=6@f&LeL=Zo*-Y-e?3lRlR`kYF}^9sp1%*4A-wn)Z)c&uvTa=lWb+N4jQZ=S zCK25I6&U?a@L$<#3H}XuY8BWpztrvg+C&T?{*|&}{Kge`m*D}cp_FFZqYG2_V|!oU z<*pBQQdb}|53cw9_bsCZQ#lRTdMD>4~j3?P}3|9ue#Ns0?(BgPIjyR zn;Eo6p^#Kw#Cvq%FW`x%7g$V2?8p(o%n@(8HdZ*hcVP>DMRr=wRQL(lQ0Wq{mARm$W{#tenQ}#itP(U$Hlv4mUrPXV#?f1aX_$yCi8q`!9#_FlM+)DI_yW-|t~~7(;R&&Z3ga*_A}j z7DUeBmDz&{l{?Hbs{t7DQkep!&qR-1=ADcC7DNlM;xFavqHz=JCjUsyEj$%H5IsC8xh>@ zRa^t_0yq4$a}Zw$kTNJ`&~z@=oh4_SCJ*9bF2`beS6KS)prgsY7 z&~Vd%B4Tk1AQY)3kG_X5TYj9C!NRz5h6WCO{Z3b_AL=HSq+G&5YxT}CH8~0y#X(xp#kbAl-qD+}dn5tpk>A((V*`hgqDNDr5SPTW&vm zAq$VeU#M3-)CBXysyQn13R?KDh-UCoEn_qAe&eP!_{&}R(Vpf|O>ULbw^G1&|-rH<2-5}#e>L9oO^|82W&KU_QVLdA`o zI=zP)+v?MJ)4p z$H2}y!L2`)EpZKs6Y^hIZKX8fcYWr{Sy|!5O{&`pz#UxIPhaQ*3Qh9fWY{LealvenoiBX_(#4xlg3vT+P{ zI0dacPgvK8PUdgc??|oGtuBGv!|ZYmCqP!IOp@v;W{K@97ajyN&CZ5Vq!NE1Er;#~ zI4<_JnlVv*WqGKDN6eW$xFvPm=czR)OL`8rCng1dh1d%>io6`{B&;U}gof854&b)Y z9tjAE*q_sdW3g7qKUS?zz$Jzl`mrG~L<4~i2SVH+eX|FnB6sla;2CrCPe+Mi7gG)7 zT4+FS&u0DQWc_u8ktUR66Vb`UXx+=T@_k1NY~y8Dt;o`a>Du_In_eUA7aNlqV(K** zMKfa0C#;_OdhWs>(4c#p(JBTKP%W^;MKkf)P6b9Yxe-XDxa-=O{g5!z*w`(Qbd6dFyfA}_6b1`;BpBP|IJ40qTT?Ml41*~o(?X@aU&L%h))_)FfJ`Fp$q=OLL3Fxkcyy-h2vM}8 z(4Os9S-BhYWy`?a?LY>82Y%bjoQw_t8{gy5#x`O7!jIr%WK=yWD!{Wg!Dh^B~)!fHsn#?PUpd}9j^GY~l&v-3*6Romg&Xnh^p ziKfovgz!3A*RTk(E`~cbPsS_)pyW9$5?shb734o{*m-(nCGosa!=FC=S~%>Yirb1_TUp9t%+=+lbTWJx!#s>BD?FY?y?~V zusnSzn|QBOwWB@)8y#bpyd0^%B6FTID}l;y7=Uxrl10|4Skq^>O|5xJn#W>Qp^(K_m%^b2pBqbp zS zOy6gqHx1^u7<6LeAGv-q(l%~4dUUP;_*S^0naVqkj~T_=mSgZIG3qfNcz36*r_gMi zbpR!lfH?20q+8s9zitk}EqfhurV3GYS@gA+7`8`EB$kfKs zj6tM8Y1-e8Toh4T1XRXiriPH|>jxZUyU;6fDpmBP+jGoA03DBU;(pDp|1O^w-M)a0 zLDMNfRwvZHCc|Y_I|}xa^Ee{O40VVyw%j{#eB!i9FWZ(@c9~F7^QDLWvX^Le8StMx ztMHQEaYi=^NZXD9I*39`0i^R$HTW$|DClS3$pk8(q)jhc^=jo=klcJ8!^qayxmHay zh752gt%A<=@;`;SfP_W74z~n(xrQABXl@%xk|iyAdoWI=PF=K26-ixF9JoQP$E!GT zEscg=nM2BARg70f^9C_-WY4pbkp=*Om?>T0;DW*GYel5yW_J;Ggt}bhW-q3?h6^YviQp1db@~eE{!FLZ^F#saD@1n26B8Ct4Dp9?6X6( zV|kWy{!&voucPV6P0n$5`JnOq#YbhRnD{f!2Ju@_oGpHCf1P@y>^)w zN0};xKJQP}XxBVf#~-RgssK(Zq#oK=Rm^<8?xMQ>yxJ9iae=}6*<>qWCR%mpLBz#L&SvIi9$P2$OCBviUT^X8EGB=-0GJ5cQ$v{X|>N96pPT6UggM3W!7o;9}M`0AP+|J~Q zAn0|O7|&=p(WZsVvd58PHE6oO9}!nqyl6@uxDfv+uTw5kB#Qjm=^gntg`Ryc zflP@kBJDxR%-7@lqCzzSYE$n?g9~iO<7o-{9-(M?8dY{k+k5cD=p@nfbhtgQL^gm)+sKw{68LgxeGm%+86EWMicf z4Us#3;q7sh?@3fyp)1-Wt=*ga#i`?y;X3mfd`WRtP8v=R#NI%9hs?JT@eFgtPWl1N zP2p3&SKINQiuzh;GOSJQqE;s)QY_$d6j{sWKzBs$6F?3MR`hXv7y&{1P(fG(8Tqwo zfY{5s)~cqoQILKSbFpV;nQ(m>p(cu#u;#H^8se;5RL&X&hk#htj=Z7KK}9+nm2XM0 zoyUJtoAwZ@)ZES|fahhzW{kcS{X5B<)pynvIaLpUsBUGPvU2I0-w4TImjH^>O%b61 z6~tVHo^UUZ!m?h8Q&QFRODnsiOtkj-uJN7k$9aejwBr#ris#p+RbR2_p}T6dLTcHm^y{uu zu28L%uoZWR=Hf|$A78&yTl7LZ5CfTIBuEL)6aA4WnfvU0qwg5%T|~q+-|~woW@#BJ zxBa=K=W$*@e`0!12W04n8XI{kNRoeew5?e-vLpzRh5Vs(!n+#(ZWWKNa5ugYw_oy7 z$13GeI=XTF5^(QK@JTU_SHCp&p;O*t@ID-p;&<@Klr$3YqXLg<=yf&}>>-)8VXN5J zD0dqT=Zl4#)oBSo6~rW5zc;;TW(@8|Mk&y(zm)Gh=!rjVd}3bbaW(cF@b{aSKL_q! zx*%*Hwgncuy$N(#6kmH_rOKXIWFog?yj?TyF3Jg2q%jsiU5y5F6SbJ*q;LG>(61G5 z_+{PsMPMazcU2dX@`I8_MB2w=@1n_cQ!z*^*^Yy6<5=p1>aE?H72)f(O0_eThO4Y;twkn^t4AaL%nIw;;hp);Htk)myZzaZk$YN&+2{cx;XphUl zd@|8Y=b6l6hsc^DG!6}_Q#ma*ONwCInOmA?(1*OZFVTF36li!fJEkA@(eL`e#N`58 zQFc4!T<>uW(`{BRN?LBuRN-PSr|EjA#zZaB{aPa>!>K!QNYaBYnSLlTw@?uMx*mLSc?9e9N^Fx1`8sxMu3t|Vyo{#4du;b#U1046|WXdi9Ym+96k zms!691JMG~dA!o}%wq8pA}5WEf(TH@=pL!Uggmdg25jo8wpV3r?~Ayru$j?|+*ucP zjgbw`Wgb7l!Cwht1riWgRNPxlb2VDYXLGQX7K)1{d6(UvE4G1>jo}Sp3t>flJd?Mr zYc~u*Q8{Ax!?^t-gzy0snc66NyvD%J6m0=d^rBZ`P~kw zqX*6PM8^vb%+24~|D5i=eJ*F-#*ftg5SL2{{+eR=fMdA3pi)`9j3%hF#4Vc3TRM5MSq&_)_fk5->ifaN;=mlU?H=39 zhvkgZ1aiIiEB}ywfe;^9T>1RW+#kWE4J2Cdx-W$=7uiKNF>;^gN{C|7HGP2nixO|| z*}T-QCo_pM_WtlnF)xf;g4tU0Os>_aFGdR&ayT)Tm1NLw&kqU>B{zl=ugLNmmo z%xopZ&Nwij;;cZxm5JxoRqB!%lMk7=sZ#Iu8xOw!V3P*tC+wVF zb(OGX(4ph=kVZAh6>Q-|tfuYOOAS3XLr1QTZ_o)+hwL%t1|ey z=z>GR_Po|BmOWFsF+BrvA69>D3%DD63}sscnT&be#eAd0)6x?gQ%~{57+$h~RAA{e zruOr!XUm8c#qH^ODepPPn_anORS4$IWV~dc7CuXKB#XRNlThmzQbC3 zAMJ(fn(a>y&99Qs_xUiM5V5bJUN1a(7M~;SVAwuE2-mpl$sDnkb>-uBR7v-fj|Cr# zN%hh9LgL*+MCHfJiOn-<*;r+%7M5-uSN$#+0bMTMN2_>C+^b%*%cB>Z6#(?sBXYNG zP?OQX94sz|;rU`9Y(%$s)nv8Jb71SNF*=ReNvmSUQ2y#CgLaN^5%{U^`F?GRa`=2B zPYFk5NW9!)zf|0y@j|5!h1uHSgNDSq!!Me~#Q)2tUhnP%;V)y3iJj^6Fu!e7>MueA zXO{iDYJS?~WYkda0qn%Khm@RlM4@5r6jIErd69^RE@mVDv#f{C#0#x%fXRxNdm5Hk zj$PZw)Ec!t*-yfC?FEuUY6R?gM!8McQm%R32Gd8xNRY=L>ySoY`1jH;uCP>#T3G?? zPrx~g3=)R%|5~xaT)!e+2sw}<3Uj|_)r<1~5xIRsTPWyzlurHj{Y5i!j9$a3iM_(5 z)_Icx=FJIhWJT{n_1UkN=d057&sxWGInSVZm* zXH9*X0|exl`N11-^$IuYyr3+yJv{HyQ$8Bcsb9<5?|YtcuEh=d?8$Du=-}k5e_EV@ z3HVd8JTo7Pgtlv#$nHfVWzJXYCRL0>&lZ1e6FiplBuBMd5xUaFH%SY~G%t8=3Jz+4 zw~M6ZPmdUhU9%dC`bPw#blHeQ!dGK?ZkzxLy5rxV(#G4UE!TZfsdDE&U zPpZ~aa03T$B3 z2t*#w+!m_^3Sf?!##qT=lZV({RmpZq_GSmhh>97^w3C8pLh9=JpD29gQitD%fA+i% z73HQiFdrepV(5edb}ENmj)YekQB{83`ZLe>O#Dad$mTdQWpJMIBV*ci2OnIWV*3Jp zpK-LsMMGKiI#5z_=X$XMTEn$9xp_dP1Sy-%QEQ7CRx5a z`AsfOO96eYl$!-GjFi;p9;-CYMLYsfosYk7gW1D}ou!@u=gz1_e!uwXAxBqUA zI|?l6M5Mo_Yx-xCyCCM~R3ig9iu%W~<;8FOSU{@PZ@#b5un4&g&H)J{GGLj%l8M<; zJ`wN%&bxwSlyk2OKc77tsfcj-wk@yc2jt2X<2jtppEj1Q!6MF7qy#=zeaNe10*06)wB|W#d3{f!I?QeY zHxdnjF#4rDQ#Eq?+7nT@f{cJ}zUx`n1^V=Yp7{sgw(^tqI(~Npfvtb~DqX^oIY&Z; zO>t%*J4x3b-b0gFSJ1m)gMut~$mE#E$6{-l$pi=Q(9i~nO=qt~y=O7w@3Jy?t5(y^ z_)n12Jn4E3kBf;dAx%Q>_W3Lq@&*dELR=LF_Gb@6(zyz_e2rzG(}eRt9?ClUkJbX4;6kb+Ht#?uD+PV5VD2;E^q~nP>+hHI(Zw@^5 zvEpJ8pw!M5Q^(Vu#x83Oq>FUX<3tT(Zs3OK3u{w; z{6-)fn9wdz2^UjAyFST-%1rYpRMp56`%xRNA}3%GZL#h@m@v2M^sL#c9Cs--y06fg z886(Efji9U-ifvvI<@wU5@cjrA|&%H$8`rGG`+Ebx)o`L*epNE5K9?z#$rbQ?#wqr z7>^_A^||MwBrFhYyHiQY`AQl!4Y6C#g~PQqPW(|+8hlr9u9T+pb1#9keVGLHnogBn zo5M-~vrf?l51>T_#so^X?Uh8I=)DCXhsBeL(Q+|qm7Lx&ZzVm2!B$Zy?Ri~HL)ahK zb3eK;*M}~#D&rQ5c`^~<3?S=MMj9Uv4xUdiG9gdODz?C%o2!t6%CW1o%vJp62ybWk zMmJjK$49z4d@rlaEQ(ZHO!g?5VagA&H>FzV$P%D7(VNK(0kiV{*QUpkJYw6styB41 z68mla`;%uTEi*iCUsI5*miPEX55I68ciHoYR~s>Yq(QCu!rC$_mSGoL!sACY zvidun(wjcaV(33Q{0*hS;vx+R-rjqSi~{83Kywxx-IezU7gk~XAYUMnInaSnTaseE^Oz|DdZ&r*kyByzl0F$Fu>!j?OE&8HU;+DLQzy!! z{*>pM5xAP=M8dtHVNT;lkcWPVgG%#kxQ_7h#7mGi+XFOd2)n@@vhZ3_!4%z`nwXo9BFK{4Bz-@$p`_g`ec!*v2$b zJTw0KGt4bb+!jt)49ZW#ppv|2sv*puaXz)$6^+j`zO;q$=NoF+A72?nC)?SBSebX2 z=tJW1DRdrNP?v^=pVx&~WWb=+82>GE%K$mxxR_C4KSaDH3u?6zTGhylN>`EYSZ1eL ziSU?Ptwz$|HGDV7vAFc(njD$)cGIj`1=DYfEG(k#CIy8=!ZQ+JlPP_2-2%k5lZiK_ zfLc%!)Ix-T>nyPGk!gvW1$pStcBr*>l2T@_#oMv0%o<^~79MvRqWe&&MO*^$-pOK2 z#t#3Hn&fsHO6!&-bm-ly0-Lk$2V%mAsIt~(!FP$Z&ZYO&pArxFTBOodRk_1H4E|EI4T11SJRQ^7yQ*Cn8T1yPtr#A4q7_qV_`s zG4u%e)C>tulY&#*UUmD#fZEeuCqZLQ=WF+09n<5Vw_h)|`J&6!69{+%$EVfP=u7QjBi=M1tQ_7BhJtDQ>_Wf0GD51ANtxkhOOM2F zb01`NXgEtL%`M4qhdK7a%oB)ju<2dq$QUUsKDs+rRQ<}xYYHq>$uPv^Len+6qH?Kt z_q7C-R+@mtT&`({j<^Bz?uw&5pq_2$jN-+ydB1lYtPN@Ban!5bZAgCCuagkqh5iXX zWSV@Kwf7^5o$G11RUaX5F;0tcP;RqA&nMc)C#Odp;D_cdSG%aKL$5)JA<^^@b8Avz zGkb%kJSA00*V8W#5w<5Zai^z;8v>VWezg1TQfOI+d(rOZLs0x^J?^M=&rKxIttmU= z8=zks^9_|p^+YEuuk2CkPWU(vVXzy)i<^37p@heTg~ z=YHvv>uvF=V@&dZOKj_wr1FUVphAt?4|5rlwg+z^V{_InQH|ln8;Ydn)b#E3CZP9mJDh|7?Xz1|`8BEpFk z=3rjrrA@LL1m$X*+(P@t0lRLQ@cfz)x6v63D5qi-VcC0)r=`JOY4~}aq4AaprQp?xFF8< zV>D-Li~{P>F7tDXH?(AmLa2GghDe$fWh{vUCi8GliR`Bhy+Z56-0TxKsz$#7e3r|f zrM!S|i-RY&u*#o^hSDQ{t6MiGzUP;1(gi1;w%n4ld*S&~M_k>uQ$i zC(9}bacg>oQfh98Z;RK`VQraPN-Kz9Dveu$5kt0lIx3y--7xw+pH#$P z35nlSRFDjb45+YH>=tCwTQjSF0e_%Ow@Ad$CRv)N@TXtG$03N}q1OP1a-eq;QGYdS zk7g?OnX=JC^H2!Q>v!a=9v5?OFF5|ZuX<7gc&)-j=0(dhrZY(;dME@P3W2hHeJ*I8 z-_JP$JLWrH)quLG)9qI~;wWl*ZWm^tHAvCP@6pxv!5gsXi<)OE@qRi&JVO?yk!8c9YBi_sb zSWl!8#ES|nKBQ;{SFbuXwjf42Kc2J>ZYi%yFMT;IP@nI*#tD1sF(g0R80yi;!!q&F z{tPJ9m9bs?w!bVgktI8^d>`dW1ch@yIQs(cWdPE%?AtD>n2Rf-5ZG4(q3@JVMHAYD z1A*E2qoyn>x1sLh3^_5N6KB=FnrDDUH} z&H%jX*9kMC=6f)H2d#LN4SG8=k*eiX=1Gkv#=zRy$S71!|l2-%?_y3 z%A2H9u$Ea-`@Bi z0ho#vRQ|aMNqI0(SL<+7QcF^V;^4w+qBnatfu?fd3+U56k5N~p3>{Yy3CW*hlryEZ zH_hJ)Q>Hh-MZwQLhyGtNE)`(4zh+wM{jJ}neh8S)M|TIC|JD`@lLGsTR=-I8-YeB#-aH{+8X|2X2kd(DaR8EEf4fxY%Tu!T@L}9T{TKs37hq z-~32=v=Av|)c)H_^uK!JE#OAWM;dbV9Fw=IgbzuW{T3ikJ5`Yd2FS}JA)sLu_kYh^ z2?R-Mw<#j(;FZqR)A-ErXuki= z$>P;YpVC<~9;wq{h>_R+J;SL=+Ku&u26NsD;=Qh9xd$hC_s}QHdHca`t9`P*>w|X| zR$tECeLY$-XWJI=qV7Ae^${jBQ0=PD`j~bY#joRFpg9X3>S#0|TYpQ@D)MFqNzJ1^ z7zCIkOdZ>s?mSYDeE=v+z2N|;8lEkUC@}U;Tb8AgB#PJu9R@!5-^fj9z^)+Svwpsn ze>^_;&jauanEWONpx3K~C`<((D}DdUo|wC3OQD&YLqGDxVKEF_c=L$rTp=o;2g%d>>aM+YLvbGbA; zOB+MJ?SiIi^w=dp6$OH+LDG-XT_vefDHO@y+)rdfzZm@QF?VlV@x*?%Y_J>?%I^|h zQ4fWFq}IlMDj_Zc-zJBHy-s!C6}?l*O=?yA7~FEJDbxJq3BzpVuh(X%#`c@B`xU_V zn*VpJqPyTVBiWEU$^ak&V1CV*{nj0<7s|R4G!T$@$&oQSdH>LP{;okB8X_+taTzRE0ni+k0Flpmtx5+zJ~|# z@QpFLhVG#Z2pKg^cCV7*%&AsP5GbU-V^8aD-HV@}!`c74o&`ME-C{6K)K7^LGuyun z@=1f{zUb7#<(f-_3R7`4^6^&lR~fruv5kqu4O}4b5#7I|E|LTfHjAt+RV{SN%TQ|6 zn)%32-2C65m9knJZ#8+Dk5PIhQ4K#-VFv(0*FVcggPgLiwFs%m@2i&K{<9+jB%foh z+bt@ktNzjfHa}2&yJpzK!}mE7gKUNqz}$B&E||=l)V%l_e47~aCbBKe22xH}cBW7`Lw9nYP^&N*?SB%^ViHR3w(c>kkwMrrB9m0$HN3d?5$>2X( zWl1cGvTtfL7k7Qh_<~d#ibKX9f!BG+Gspz^^@`I^OENRxWob_>sP;nuVH0h|YIzbtx(8PcHWV+Tfupv4S54LZ!c&8_}UQuIII;YM*Mh zot6E{X7e-eABa@|E+d_2Z*4nNh`DeJNm zG5D|XWK!XVH26KxPg=Wp9W2!+_J8*MUv&ZO6VYFL{@3#VfBh4AhCn>Mi+tpe{*0I> z2>A6x387f<$mETUIqW_NRP`%d1EE4o#X<%Ai1x{2#pfUp82Bd`L_r4pb?7w=^k0IA z+@7mE0u}VJtpop|bbhSs1_CkNA^ahF^8EJRU$$m1qOIB|KkP@{kB>P{Sq_SwhW9kf zeYj%p@QB>L`i9mogp|36|8{h!SgcFP!wb?qp4rZ*DroYJ8nisH z;fh6LAah>U4c*&H5uYCyd&le+cjJE7)}N0U%2fA#`}N}ZWr>*c&IZnIyLMF4YS-T* z?Yr-e!3O}+^e-&n{{dS5i^}H#CtmfekL24l71EZy?7CMV58ym@HB@u?vzNqFCRPF9 zeZs^LiwH!YeEMFAjHCt;fj$ag6?zN*_z6H_Pw19cGurLd@9T63jh$p|T?u4U1$d}i zm;f54Q5uOX)!t_5P_z#Z`SI1mZ4Zr4vR$I)MSPHa01!}$0H}#Ddq44n)2EnSgNaNd zlA3hcT1y*%wB2RyV30VKhtR(kq{tjlk%dN-6Mw_K1c2Y;L^a}u^Z!YXe5QLFRy8|L zcTzpsI0To`*^f%QZu#vDU=rwR@a4AWc23`$Po9&EcVgRkmyKJ=s(Y7g>=X);ZuO!2 z3^04-()8RdeyRW`MlAFL)Wb%#7p(RBtT6`m%WYAtiL*czJU0LSK|!V4ZVk2%9rG*T zXEPVDahZ8S4)>c+daD`s(hy(!|e_DP;BcxArbnzM~O zr~CWcPCy;D)BXC2lxJ+w6=9=Pk%tnUDgk7Qo0SA>IG-2oj@kd0(0<_ zK)-Fe9U({M7_h*QQHfhuN1jntla3Y|Bfq?>z?}kx*B|Ug3u-UB0DP8HH>al2x3ljx z{s+aX2b$`Nh^vYZpA8~ySQg_kbUaM|!`STdjor*iiMK$cXqnlXL0ElbHPc+FXIMYW zVIA{GtX|jIns4n@sXybMN92QZYtXa;z3kGXK<*3i$rijHaoxa9>*@q}{>TbwcgOo) z9*r8;0sKDr_3GKnolPJWbR00jM7l$>ceq;(_I^0mCm+<)Q(be$h6{<7!3G=TAGk$9xl}2;_sEnv54xuJwv~pY5YW&;TJ*WEm zT8h(5>C~m;p%D{ zv&_);?Wl6vx09TkAzvG?iU7UR+ex)5~{wXXceKbkqbt&yYKG#}*mREmP zUk@~=)L#q%>F{KaBI-S5=}ISml?LVC2zk|~A1(>h2Q$7i%uqJAC0)jzr>t*FzuhA| zmc{}Vp3=!_8(#AZW{YkPZrKuj+s5ga&~Mb{fZHvNp*s<4WK9$@4yYBlvSVFM1ozbD z+va-9DpY$o$Vw>Q#yvV;0UZ}egQtcnSj0xc0D3|XVSr?(()~HM1>p#_Fd#9o6=F5C zS7%<8^rHIqoO!H_=2=>1&Kw>0RyLzjMh7PmIJIXmR3Ye{WLEqfj7+%0+A;4WG{fM_O#umbk6 zED)jq#yK$R;n!D}i>LR#iS+k^7)m2S+=qf*Z%lcN!lbLky~Q(sp9=0?DP<3=o=_o) z5t|MsG{?l0yQ)l5o@naRIIEXXnEY&y>8!hZk?{83`3HchW=d)nahQBCRG&Bj^QA1J zl^Dw-VAyhZ$R}0CC}|2sDMJ|6is(%z1ld=x+oX-vEVwS9pb=;6P{~@4m9EEr`{Ozn zGpYI(zr1OTKU1GjeIxXMEfTf4ZE~~0pB+L}#?XK5xn%``^Lie;d3)CkH0E7MM2)>%Lel*$Im!GRH2)bZLT@TI|{t!6bgNhTb zjl8fqN{}-2Dw>-Mo>msR@1qaQzkJE;NPt?bCvji>$wFie)T>qiJVoi;1kYc2Df=N% zv>RpoMY4pU$v&9^4grNqA1cqjDgd-@ zhUW0Dt>FF(gO%EoSI?^NZ+^%!X?c>ow%j=O>X2<4Nt0?1qmn#R+H2Dzo#Q9hLCzo^M>>H)*10O>Evx z98vBeJ#`^^JianJG>oihd4 zqElXN03P;;;G*OLUW=S7famm zN#R-9Dau?=@H3r(v|d0=bcP-i>CquPJ?GIsWPP`ZUEajhM1@O1=*D#ZxqoWS4N8?J zB5b?3N82Pxji0JN{!gx|c6QKRKPHtLh;u1%{|pg9qFRRU#(cdf^(```m9V(ta^7Jt z#9Z4u7Ouq>JC(N3?Eo+9^P>jrwkMHb5yReIGd=R_^lFAf`EFSZxfeGubI*(h(z*#~ z)l?I24Pc_SJTOkv(IT55@nMua;0e9E!sTqTw+L;@*2?&H z^v&v84v&ItzxnDMlDvq*8m|=V!|NwKR{$iemqfP%Vx)Wz zOS(~U0s>(d<7L*BD`R4EVCy*C05I1+LXoI)vdTSYU*;kYaEO-91bZhi8bF|EgRb9E z4jrI4fp(qnxYsS;F^uS69V+Z+HKI4lFQ4A1XY?un=*taKE->Qhv$&*flG0hq6MKCg z8SfK>{5DB!={@Op1l;lPA)T~bnpA(Xq_H$-F618p=^5~37*l%r0Sx63Qf~fd8wAwW zW3%Y}*KE(HQJ&4aB*W4~?L&HlOoTmB-)rzYz&4@QBcHC5Xan?SEx})L9xxAH<>ufA zok+}0l-U8*6f>08)ugMFNQRn0CL(Q4->u?VyIpFT$=Are76$c;ll^v1yy>~hBYyA+ zCa?~wgI99q8UHdlMj%f!S66%RL!`)%IZVC3G?nt@^xfl@V3ZK);ELEfW@0A&?3D9H zi6^+>H=^NgMyKuMC&HHUhS}UXto_XnX(5fhJ6RIR>W3^!>P>2|4>Z!>VPLRXLDE zUN3ikkde>&m+__9yJzF|SKCJDgE#&me$x&IyU7}UEXPIu(`s{6koVPu}1!DC++^E|x#wTcoD?m&a zObw%Tf6C5`LHfQ`+Rcf;=60w3R-A;6ACK1MErjufs1SncF4NI-hYpUlg{7GESyI%2 zXoJQKxwSEEYAt8~-0KxHeMUBa>CDs73gX8WAMy#j0soJ(H;;$14c~{y67^)MlqFlG z$5ghY7|WnX(xM?Mgdt-h`;eVMD$8IJS+Yz>c4ObSGRBrQ>yTxv4U=^S!|=Q3`+eWf z`+na4-v4Lr`?{~?yw3ADkMlU47G4$HHQ`d$;%L0@KahZJ``&B&DB>WK77XUYuxq}V z`GfOjGX55n}`L!6T7w@suajYS}?ex*fnK1>n5kBqi zd!HJ6f(59i>`7q$#jd@MZ~@7yG*qtC`2f85W39JJ36Naw(%+|pm*#>2iimgB$(A7g zq3UEGMYk$}enAj!)|=e{931s@yoz;hs?tgwT#?p&H?Ax1wF8Z)!S@9ukDZc{Bs%$Z zz4Q8sW}VTW`UB1^MR_p|nn!QIW+Gsjl`T7mM+A^x9@)01mn|LRsJHLbG+vp@Qx}|j zo3nwSj>PZ>(3eg~rZFTIB5+u?zs*O7S-Z2ApyrEiO>OmKl-iX6J;|c9V4uv$=}6W< zo~3?suti$?D_vK?X3T43>soJQ$&yvxs_-fA`fijcndwD2N5nzY7VO(`M`yx| zn3BQc{{`=`+tjyIbROA*g8^Hj@J0?6sBWE*$0+Y)-5ZZI)rYIPTKH^(?+>!~U9Q&` z!3ZD>W}S5u(>Or6*easWomzJn5)`@MuAfT&ku+! zxqU!r9-+|dF!smp%Okj+z~nVYu!}4#l~P!p!!3m1+0apAM#(3{X3KWp^ZNwO|8MO|(faDl3m;Z5MI8V=F(pKY9Q;&G`(^Yy2feo%1Ww%5_Hk1#6Q!5(YQ`Sf z&<}{)#z6CmsUrVxdY z+gEM*Rz~h6mGftragg%AtX8G*N{^|zJgfJ)Qse&=3lzmIT)G;Ln(>J8rQ4VH=3+L& zyW2sse1#nTgb8f!LsUv0a4PQ)^spL5E6-^>k-5epn#=~i32uT*jlL__T(Qf{zJ4*Q z9R51i`@azbf5I0`P53!}-9EnHdJaN|I;g509Aq0wg%0%rmcNd4A_R4A0_vI={4qc+pg`>gj%zrsHNfE6~SQ(!72!$C63_&`d!9aCl6>?iHx0}eWf9UqY- zooo5~-z9mF#T7B4^H(qSj;Ei>yMejrmEU>lfwXqK;Rbmn4yDr1H}UkI7)c`Bi_8AD zv;19-?7IIIHsmtCKi-5Y5?1FvItjwjE1Qz9GR9wC@k40O{nwK82pElY)^akdJ(Jx> zdOoWG;B^id(MVd~XE{Doa_nMrF6JP9?DX6nzRGC%3uI1g&%4`wF6R87E!5c*``U1D z)_3^T7JmjBl;GIF=F+vk?;@~d!dNTO2bOOgjSq~}N{TX3PDc&deMU76V( z;I-}x_N5_MG$9mdk^Uo!?!_MN_-dDQ;<|{g!7X5$K!#tNAX)uj6oB!J1-g6LQ1@&D zqhg(PHcx3%W}G?VkMVMAD3@-^`#3eLvyq)R%252y(W$O0?@#h);jMUX8taZG14|{F zWa%>EBfAV=?`nbB2Kxt-FORImtFs|$mJOUXU|&a;IAx}G&DI3y4JVR>Yb6%o0p1{c ze$U-A7uGmuFg!Fj@CEvb6l!H!*zQ*J$PwT5J>AiC;K7B^wx_oN`%q%fm2`dXtH>U_ zFg)TwqoFEF@7s07Zkep|5)kT!i4dYTIJx?i;#7u}RHcBmJf>I$_&ifrw2U9p8n4vy zRS*+rIrJTapuX z4V1ZD1nh-7pDJ07kK-d(z_|c$xt`#-e-C3NF-!AlOq-|(@vY!d7hDdxj*X9(*a@NaPYS+< zHUiQr+k#|m&v1iRo zJ`dskScC_BHN3L{{aDg77AsKZC%p)HB>+y4MPSslG$E-oSV7LlwBV8Vi|}TFQyvxv z6xN7_7s@U@<)SNdz}$7>Ug~!V%TL52^nGzPY4?f{9af@G>g&>@G)eKvxxSH0_i?RO zoE1=_C%6TS-mXZ4(AoasJ1=yuWA%dJ7|I?=rv^XMV+!3adyGV~Ok0dJb$x&$+GZ3K?y9!mRk$l!7bW>a zQAAx4GddbU8q=6<&%{mhg+qLV&X&SygousLOz3N`1+dDwY+wkh$14rGfu4tx;i;UyRzoVbzp(D zbPJo$;4FwUm1q7$Avcno1*xUEk@&&QQb~uf-p3={*U@6I5-t!PuU6VI7J-mGnB7wb zanpr4(rxr{yR0tTjA2oguH{v5fJPLDGlO&@{KQrCEX(_zjsK(rY%I3~5jXd*ys>@G zkyRc1vqK@6?4_lzVx_Tts0t+XM%YO%Au;*01Y^l#svD1<0{gsr*@m_7Hhb4zv-af= zU}!GyGO+K;BtCVaZnV9JTN1A!?0zhsa@0^Xd<|RGoOSemW8x~-EFSzbgSox~iXqtr zuKst^0tgYuGEcIu*OS==Ev(NhwrlD9g#MwfDpP=Az+pCp;hl{1LW!=~H|$dk{=K^n z;0ud2y8zzHZmpsBj@1!oB$W*)K#wDtdXoKX(i?MBU{z9f;$tZ)uDw$~*T$o{kIfON z0*&+rftk3bnpW_^xB}ltQRLQ>X};@m|4*-Q7II{l&L;f~{G$V3@M7q8MsJ5fo4k5ec8dd{fWwyTh&6yRw$Ddl{kxHgaZOC$6}prV@pn-{zL;sZ?#FnvIO zP`D@S19B4Bz{qQFz1`teYy(=G7y`yQ5^XjeH>{%yO!mvt-8|M>59yyP2Hs+74mdD^ zX@<0wTl)Sn1?Yc{Nx3*c$wl6l>TFF)+R%-Xw2G`hebwS&GDW;5&AV+1hj9PqnelJ? zp)C0!E%d=gdk}yjDNH%}Xg>5^>R+4j_{8zzp7(K?GAipmRk-gCL99JV5pgSnzG{;{ z>z-OD`Eg)xevSY5UMZ(C>7MGgGf)xU;XCDB3$y`5AA52HU}^Cot(`8;&`X+nu58xK zSDVn!Q6`N7*6L0IYl69PK_SkEjy2zEV>Tbf`aR zFMWsA*{X2wK+ZtyU(v^yNeKi(B~4|BANb4o(M$w59l%cR^-Fwu&T6VvT>Om7OOXSH z-j>@$1bP~cD3B4UzBS9`|7eb!n?nXBe82lU-kbe%_d7su92zyv4G?7toCntb0zgmJ z5-W$|VF0C_Rp4s+&1c2#-Fd@9n7p-VR zk`t%q?oJ8Yl&{A5PCf!1H$JD~O*)`Gx7mG`{> z3?b9t24jOvYo6CKk-)U9Y^fPsNf(=0Nmx9*Ham>|n;4bv?N*Q6duI_WCv9{qDnWx6E z!?MHA7VKX#{x>ej6%0!B0-%e_u2|r$2^!;5ZV&4c&Hu+C5cp%*DKL79%aXpfhinwc zI2?BgT!!}lS>n9r^4KA;7LBB25PlyEh@TVCgiOq-vmKuLu*P{RF;sZuG}ETxB_3G7 z-v8GEUgMZZW)tG8rI}%W&c6Bn4s%0Uh*PK3l(WKUjdOl}H8)@-^ouxk=B>*fe@Ey4 zMBv>U-PGXbwK>V7U8vPQY4lLX+7qru*QjA6u|8g?97{S4S*ONwGX;8NqZ(Nv={kh&I)^`u8YeKi1(Ct=b!vy-P-^@ zB_Jyo>}>?C7Zk5R8cyb^AxupY@-SqAv&9B!cpnywqheMX1!mMa7!gwNEhxha zbfmlPf!ntTRBySncD(3VOH679gXC-ZX#w?XyONZi{?ac zICu9f`+orm-{;+PSuTXTisScJczHE$-+`GPttw# zzwZ6l{)Jr6v-G&k}E~0!3+ScWz3*ra=%_^4im_K$Wp&X}}lKunJ$DdVT#iQ|n`b>!? z7wm->OTRsRm{c%zaYw{O_lqEx+^xkVg60bj%Hi>*Rp{ z!0RVC{hc<`!H%KCOxZRrNud+#%R`t9>}k6woyonb^6UFvEm>I2=YWfGf7+zgq3?pMTUm6uRJ+!6EsOpc~j>?va-koRs3c2w1xw zJ3I+4GFHw5d2v52=^lp~5_|)>8jIb{RgtHc%T~2kA(Iaur*?P*?eSM5B~eI>+PCC19LLJJ_h@*h_KdynB?^~fjw0S-@v6gP=ay)r#6{Vc1wHw!Ivv>fvD zs4sV7R#~aL%VPd=E<0+Fq^6zpruhKjx2AP}71ybNs)Y@HmL8s@*5U4)RsbMqX~wy3 zAZfu#2m&d7Ew9VWiDw0$MwtblS#N9<36C?L7b+UQFQhe>8%n(Yl$q&SDBzls*Lp03 zwm`q+Q3LAoVurcNa(+&C-=+ow;nlB++rYGlFXcTqV>x@bxk&TMDHn>KCr2pCb5`In zMha~?t_$$M@$`whWmqunK}1ju=*x+6D;}pK(OCy7=XP($OA7FaweFk<#Tmy;5f;p*FARcQLsH6To8KN>B;2}t|;yEih&B!S} zpn_JaEyHMl2|h7?=K0BBIn~F*KUtHZ1e~jmzQwXrfN$vOYxAVHVl++zC8Pe`PNY#e zmlkgPt;wmKi;t3lJIO{x+kSCsB>%Tc9D!-C9k_gM5(K4q-OUG*LtQODM6B7L>ng_F zgnc3CVgCZ4arxXQ6L@l`#{Dedz*xKAdGBtm$N%*GnK-b^6$A2FTF3Il(uy9WBw!fU z^%byS3*)wY@?GAOsCNCP*MA11&UD{T^}A$H59FX8BZ8db{7TOL(YFr@AAJDaTOW9H zfT>v*c+ykA@(xqjq;*dQqz_fxFI5kz#y9n>8@@)7xxMFz(aC8M0`&s9C)rkPZrE*V zq-qyAC|}I-2$|vRBSgjcmGa90^^iJjNH*>3lU{(`T(zgB+A+Gr_AxFo4&XUgAh8xX_7$?^Sd z+W#x!d7CZWMr-_Wu(w^SIQxV;N3~Yi$s~jUg|!4KDuI5-}7JAQ4^FAu5ocuIzFBPdVsI3nI)0;T_D#K)(iIdyWx) zmNFlQ!6j{gEg?eU1GWSeVldnVY>6385$hk%zv{Pzc8A5u({wdQC7m}%WS-&zOA){1 zHRmcG`r0hbWN`$f1IqUz!+jCyy6oKQ?6Rj=s+YZ*FMR-g4*NkBolT$kDkLa#P^lAPe#dX@Z0wBusip&-SC0miebQ?FUr2aurG%RA}>;{uxY8uo#-_U<%>+zu*@ zXu|{Di$SJ3Ml!Z6w^U8U?FY&x)IGPaNL%5VsM-b)G;vp+KWDwk zxFc8qhQCII1$4m-VQ!S@ER8$S=SpYZ^C?0d4ix>1jm;c_;0Kgr;`^mw9JtVxJ8ApYAb=1l)}CWELIsk?ko$w79Ww2m{qQ%&c=x)*{N0FSj`qCYD!|T*iDHL$k*`N!^IgrqCWMJeBl5vn-{~9-o6l`_Uh> zO-sz^{$Ob%;^dC+dfmnZHp!j&>(G=4NL!*8f({Rsw2t)sf!rdKr9*4i49N7A9-n#C zwnEKy<*v9~m<0qRA%%WQC}SVl8F)W%BrgC-hPV4y45Zo0&Wa-LqGg3mAI=YmfGJ8^ zL;TkzVk8NnLRd@qPs7z*srSdGg$X|RD z8?KJ+ZFI%&`{x6fST3YgPa>8L?z@<5=KyXY6a%)!I)qU7dqKA;*zq=NVqjc?$+k5+ zR}h-yRN+SNa$MPv^tF{WD4vH;JWk}@i5|5tV_zsQzvzf5gYO+&Sx&f03?sd?8Hagd zh*i*WtH79?boAp78^bs(JA{;S*zU!t39Lf7l$-f}$4pbzg_^ByfOQh&RL^Emo%qku z7E7mBOE1^!)ONJj5J0B+aqXcTNU%d%fHuNR zbgfsZ3rn*F0}NV#5WW$@#r)d z*Wx2-9l4HO*|{vf&)`h4UtpgS9W*7iCVGuPC46f>$p*9wP6kE4aC+sGQa2U&?YAi* z`%!>6f0q^;xo4jx5?pSzg{TjND;m@`nPQb+MRCW3iu2~uL`?D(fGRB^h313JRdbF8 z(S9#Bm!Rzdz3EXwxt##2qt(8o`2@~o_h>T*P|0gBY>@{|$Q5duE^G^OGKcSb_ zyA_S^)JzZlcNajWV=FAZXWt`1FZ^Rd+Jas^Xl5$BSfBhk)!*^-8pld+@TlnMa>FH< zKGDuh3_bo{zI~;WlD7MmxUCcVAUhPzvG< zcbc;j`m1KAp5;7^`gp?H{}s0>jZrCd__Cf$!>Pjcq{RUsk8>DHN42y9OdOM=eJkd$ zRUm`^Xr2G4uS#_9S8Lt)iJEafd3FWPX@1CCu|JY!!S zL{8T#!_oeKg`l%WZ{okqOCH#UFvLN zzHBo9G{C`Yl${9p>DxETm;79wyBZl?RG@L`d6kT9#XsHIk>!9r zPDrC7LaRyb?AV)3bt?C};)7lI4erK{aXZ} z_DC`SYzC;Ce7;9_UJ+Tj0Nzvs<{ADWU))CFL6 ziHTG4luAH6s?ff@?}W;z6ujPZ84n%ha4DQ=4J3Yl+j(1KrHqfO_7W23J}Ve|@tW%G%0#?W^W>@xpu4sW?MvtMtRY1FdEbYbfK| z!z_s@FCZCMrDY8EBk4}23av!P>$dQt*FzWGXEW#=w~tyC4#^6dOcq^5fogSJYl8G0 z$g4AU%-Lj*lVREdcG&N_Za}#zzb_yG6x>|nR{(xG<%U?OS$P$<0p1_2R9{s@`{u!oUx*VrI z!AFzO*5Bj=0xf}$75EQ6t*stPemV{wU$)Bc2dRyvM*LD(`IIe^quDMJSB`U6Xre2s zRl?`OO%fKpw%y1%Msw#Cx``scFx{^QYHHIJRY!ADnPn0pJX8UUyusyVn~1T(_HULB z0do&%=TzoT5+eX4BbykpcemZu-4MJ3LBz@fHWniSUbdi!S3sPr^q^>P94(InsUC8;|bv|G(c7)NACaE*T7Yc@w&_`C}sYS zWJB3u?KCBu(3Z30+ISj|t-4pFHR4!b_DFx*ggaV~u&knoIPdoun6{vTPzo9%P z{o42T7p=Y0L*Z!%bp_i)qd%nDg-%aPAE~SX3jWA`Av#{bBdsjDY27lNZ$i5nm%%j~a*X$O_5%0PUH6&>d^y-P6rPA%b zIRz2!Q^D#{y#DQd%*npMyzlAEcUHUanr$Bg_tZMSij~jou_+E~?k`Q}`afRJZrIVu zxC(#AO4I=W^G7zYNS(l5`Kp9KR@_Z$$L3Jg>{2G1q!1TFO4MIs*fokMY<-n7Q=~vd z#a`yS#%E5DNXKnC-*z*ZTYJ@fa@~4=e1`jPpD<2&1Q1F^Xl}jVUGiHd< zzRSEZ%Uh?J&%XB+s1w&_FG+7gfyo*dhBnfXe@rKV2%|czk0Fa~>)e&a?m6z9z<$?E z5Hm0fAl!wE#od=3;E(d!u=!M3u=d!E5gePih;H)=?kl4`_-+`LHPyM*;#UA)MUm%E zSXh-BP6&B!ZRmwx)kUX^f7 zKl<`=MwO}09MGGhc5;flX6!Ke6nHqaQ=&tx&06!Yp~H(F>zDD-b$)1@Z4A}5?jiN}dxI*?sbA;|%N#&>HfBye;JLPtCDl1iYH$Gb0PTBuE;0wXf|th%NR6DMv{Xi%%?UsGrjb2gok zA?ZuXQ@cV?J%QvPRfU`|| z1T8}Cv>m3Wp`?6`Ev}~=y&4>_v&w|~1vx_Cb4!F-+br303O#;v_F-=#;+|D3oOoa! z<0!U0^u3wZlVr;8v+|ZCxycT*+WLw|pH{&0))Mc+2q(=;FJE<7$Y@d;@!&%?#D1s=e8ieQi&<6(WNnP@r!;Q4U?Kk6r;doWGV}>3uKM^Xtt?k5K3G~N7b15b!*jn6BgpLq6kZ{H0*~fGL$Wqrs;-TwF5pur#fnT zTsem7LDI5@ac7^jJ>!CbIe57A52>RKy_Nu-XH0v<@q0^;Rw#X26-IpJec_2Yty5Q1?|++Ktp!Xq7-7BFRhIri2vHu8239E?{ zZ7}~Ylv%{>zVGZHr_>L$N`nFZbkoyVSmDi)96m90$75~*c@_fkQ(E%2aTp^*WxSlOZW(_~# zwzxT=H|jP%_0Oqv(@B%n;?l9j5>ss1lg5qh#|e>PnXP!cZqvXoi%+8zEl%ya1bc0e z`Dnc8iQh#<-qiPw}H`n<`PD&fxYjo`P(b0s8f4XscAxZJsypn{K^t0kUcxS19jUp69zStzxoHObg zPDT`Gii-!{6dI7$!Z(Q}LgsnTBP575jSH1ULNAR!#|3@Ur!Uj}232*ENk3o&${&RL9ON{lN`x4J&ha9**_d z-_;Y>QJ%=^(Yz*_v-8%V`TL?bXgltWYGHRoIyi_=(`wdG@|Cg4|9-CZ+>MzF1L(22 z$!>*ajeWg~z85BI?wW*-d}PDF6Klv>n{8Q<>M@;n+Nv{F@O)#lc{?Xv7>3qg59n^| zG);-ixbgb;JLU1>jJn0~_v_2+8PiZJr^aJ%6#bi)bBHQ}k0|T6EuB~Zj*W7p6@-Hi zJt%g8&uf4PqRgD9ZEEZ(?HzUE4mzXY^-H`*Ph&IchrAx-GeJ*#<*6(cd%5pwQjds!2he1@D{TX-}0HTRrecHtl#UG zY+wct7H8OKmGvk}jZSPo8fKrm_7}AKEj#{*UmI0=Dv(dsf4f=`%8+gqchGJESdIG0!uNQfKUwBMZEHQE3xtbVYFgRwa(7f1|`>YF+W0GPmcvDOMviTw};|Mhfes_$@TOrch`)OY`C) zgxpRx!~2j7V(F`7rJh|`OrPHZym8z`EYB;?Z!Vb|fGJ*D#3XK*^=_0;Vn%<7PH#Ex z4`Bx~YL=aZP`(tp_Q+i)+m#qk-nM8jUpF1om0+TdRvu(Q@$*X8;edqm_UV+m3{B(e z!@*LzPtcpC8S#_7FXn0o7R3=6J6-UT!HsIaCq~V<__(oD$G}P-+>KLsW9hmp?HYFi z=cQf_YtT}^7N@%!80?oSs`j-8bIkq6=KCN*an`bB0ej~gfn=u-uut|@@g-}MZ^atV zHL2KFsNW-|sH#MK4{5z|R!{UMQBR`PuHLzmHbF^bsv zBnXJ2l$yYHK`6?n=oA{lYlDGVdyE(83nGdrtVCie(0+>}ACE$$Hw=jU2E+Xw;H#rC$m zgu{78I^A1J{WuX^+_7}l4WSMp)DVHdXeDlgA`S`o*l|c|d#F^*`T%1Z)FLKp($Q)} zMs)h%ila)gA2JW!W&BE^$uEyapN9vEOt-t&q<-g`*199I7iVXSku%(@JkS zWTdMsHTU`2!qq61{Dg1T)iE4B->qI-7s-(P0tySlZck&9X|+YfpEafm%0Ngw(W7*C zV24E!UhBF4ij@-UYI&~I!YK$YHBI)*QIA4d=X}LeD?Ui!p~i~+9sF&*O$8r| zypw%)2S-YUtxdn`{}C#UdYG~eHL*z2u7J!gCmNKSrJ+!S~) zB4ds%LwAv~>20_3z?e1Y-U|4f)?Hwq!UKWCNe;Zhodt}@it07E6R+B(x>wnmrEYwJ zx>EenWau<`yU(5YDv?eR9W<^EJ2av!2^a7OL_KPl^g`GOI0h7VXE++CHem)=r{iAz zYItKs=>IDwvv23W?P@yB=yUlu3?TJgxSTb{VmP3=#B8@_)Tavyy8-HQWGq;4>BW?4 z%ir4P-~RrhM>toyK32g)RaLf1kpEk&+oyN`;mhC@PYSPS!OWti?S-xTojEw!_OW$x z8Qga{@1FVBT32EvbzCBFwhh_Lf+@V_o?9gh@8oU}4=ON;baMXM?2xEQLm3@#$cV2@ zTmiU@Ue^g>wp|6}6ABykB3#9Fgh_2LEEEY?^g8|a&r|1g8kV)*>Z%<3wUtJ8_4iYR zIe_IAm)C~;Yey3ThX6|=+2=>|wY%|w+l~7PtqUO@?h98`Kp03%hAA^@;7K>x>;Ypy|k~ zft7oWPZ~BhJrj^~GdT*SKt5P9i-<*K@l(m+o-cq%OO*)W)vQ(+9WPJWNrw^@`Hf2k z@Vmi2C5)N%$G_Db6PIb?25&1TvFgVzZX7!cdDu1 z%Xj}u8VN7al!HZmH@$=}259nt=2ZiiX|n$omGbD;kQNT&UN`ix9NMipu=_Uaw_0oj z@;0t?tgN?&vG+E|Nxv@{2r`~D9vabrB?LmYGR&oBSm9SX4uS}eb1)IinOf;tF^q%*O!}yIX)6Ly zwV2f`{8@Ew)43PFOoD9x0Xh`-qL-gNF7%cid6J4+4cinx)|}gC`ZKVEwT!)+2{gs2 zj@aok7k!6fCL%aKG1H^O8`LJP^(+L{qTBpa6g=0yO;Vz^MFd72oSM>Htm6CQ!L*a( zr*WtG{kc!N&r{61rT99{lz(XMvgb=HN{n*{{mMjduFT;oiG=H zj7}XX9F<|FHP*4SPO+P5)zYc6S1GOw$7*;@#QFv<{fS2MAoKhXc_wr}(LoQn8A*QT zS8H+xoC2Nqe3!by?kG-js`gvC?(%gv_?HUl+oo|KwLO0hRutsWxc?sTSenu{C~I9x zr?@TOEQQ?SE8~01XTgBQw()shAQ5*js;lu$xQL&|$aifHrvEn8d7X||9pEoiV`ipK z6i>?=Z(SeJa}&WdM5tyxngpj$_y(rDNnUDRs{$Od{d3n#k9^mcYgNC~R?W0-Uf0#H z+9Ac#_;}1D5&Rp_2ERElCPhFmd(o9SJiWic(wk5*Sz*h@r~;MbNAkl_V1k`dX^R4I{yDol!-Ajdm=jg zzP~VuF?Ci<2q5NJ38k4>RXmz~B?Z}cN*Na6s8>_eHBjJKoZ2dl`5aBvQ(DPI2qAzJ zy-*+JpM65~LeHk`0<49CGiRmoK7xQ|XK^Miql2fbU9*vGi2+Ab(STQ7xyGs4Bo zL(d5yL^(dw=u-R0abYr4fs#F*zM@pTtFHuC-On4aYVSz^o~QLBK2a(Hu| z-^4M^eN&UK^P^&RfeBQ8)adt6O>efN3SCChB6EN*v$%W`tGcNLlA<_6S zE^Ti2^Tn19c4dX=(O0V~4XV$uPQ_9N@S$!Tve+K)4A)a%UNJPYOVgpHedN{!6exUT3&P$mgIYNXZHTPcKtv_@bP<8tQK9}RfG@=^KU3pk!;%^{` zdqwZ|vbA}GDIG@o6RedqHU6F8uc$tBFv&`tlfBjqD9^kX`--5$)wx1%Azh}+4jFBJ zQPI5cC`K*@y>9c3(pKvM)Y_Xif&;yOMyX)=DpB`T&W6(4lp{q3Ux{YcHp%kurM@p7 zZT^+(pRxj^*_3gO4*SoQ`bEXE(BYDUMU@%;=TkM5*xCY8A}@-@l?WtwZLEALwPaPv zoGZUkqR%qK`Xls?u#j#9yt?h)(u>lxvtdE9C~Floa9=q5Qec7jp93rYaEQ0sN^TJQ zo35l$)?m>FC72PZCLwTj>){_T^-twP4~=ccgYS1VZEk2)PLIgkY8pC}G46|hW2Ld3 zOp@QIwS0_~lO!c(kK_a;2=#=bzJh5guz^>skB9t0eTG5P7}^%MQzhYMnQ{v+7V+Q4pNCv6@wf;e*5 zBG?7S6gY{ok`_|(TQ=*_2O0ob4#Hfjw9?-W#UA4cqa_I`HtrHf3>wY`_DR1KAM%nD zRo}DFIvS{D)%Dp=xZXaU#j(J@00-Y()m^ZHL=>jeN+*;Vndbc?^=@5|V zT9s%aGWLnZ>o@707ooM@K6|aX>zlBNgA+Ghc1hXRtYHX37CWdcNX%b*Joid+%Om3= zT3@hQwufr2+?!-o4BmNoln$@o+nP8|4!lt%k%u;7e#$s4qX08&@LNc?6!Y>Sy)xg> zZI5Nfmh&|*mEPZ|@@?}f$(k=7)HwJyvD#;<{yn)s(P`Y3RrONs{&-TvHdxe~@~Fva zD}1db6#=n_9LLwo)gFE{(Bgpe4~hBW*|uZ#;8mxZi}R4>Cg_!3z&9I7o0Y@%X$xaD zl5{8fzvRj9M`yQ%D7E*Y{5GUuQD;RPZdU0whqtBUS}Y*TGVpOo7xeQS-3{S4foQCS zA`WwqIFi-=TwF7?`w+oQ`^b&Bw-FLX!9U8M@l{xT2S}&jP z8r3H_nXKhkehLA!q5w&a+AA&>IDE-s!9Smn%b@)6k7EMpTld4jk}-K3a{~9~BP3UT zeS?jA&4aI_NJ_M=k&K+C@LR=@h4ADb*h;&fn%OZ=t%;kYg4ToWRkP_8JY$j%xw<(B zU$swEL2pN>?Ows8G@uPSD3e(^=DMc{o>m%k8<79XF0XsmhwM{#FZo+jWd>x%!yF>2UAtNL)n9`?tsSL(WUUZ*g=Xvug*MjYy>^hu`FnP( zDUYTn7Wf0#dN`ozgWMPiZ43hn=8c%ys>SZu^X&}(nn$BchuBJ?gG^0?;?8$CphVGX zHnpiq6jh&I<^k%QK`$)`XRSma_qjG{HTH#Z429=b05`3XRmiTOl&zHjlrF_UeAoB1Kb_P!^$1X zusr%&54v$zb!rG4#I(4w=z7i`r{^r-{0{3JqoMd=PEo<7!Yr&#Oekf~@ zrh7!*kpdbaB;WbRpP(I}Q}PpQ}46Rc~T!++zV8GBmK?vYIpoaF61J?37eaQYpHMMXW(AR`k5M$@>kMd_sy3E-I8vJd0 zI*nP{>!^|S*UTn4V>kT$+^kDHItp^cmu*tTy6XfpRJqiJhF&y#$Zk|gO*|~-;X%&q za_8!V4^o}E#Gc&Ko;UdXL0D!Jfs(3fSJJ*aVfqu0Mp{G$J6?s=ZIB{0k|bQ<2W5bY z$PGY3ro@_F`)987%l@+#s+EhA*!m?&6obBcT1IPLz;m6acq`q-kG25z=YEAd?i^a? zMT3$G3<6l8%1{$B)en^%*;gaGbKu_Geh{UUkR#UaMNv36T3#TOgS)v>?xar5K^x7< zJoIOXNj8`|ZBk#;AjrIp*trb!Xl~$SCAz3y3*e!8 zzpsX%#q?*yqgIWEbe*dB$1mMQhm+O&f;#L(U#li|8SQ^S(iZQ0MwyKmPAs*0Z{C_L2Zz&^B(W-o-J)-uUM zD|lJpQzx38Mh*O zSnakv4VHX`m!K_r6pE9hiki!wSoF!uPtdx(z*4!I*0ULCsDYRo%@EVnH5h(75sA`e z@fHDVbgZSw;;hOCHm=F3FX|wzZ#Jh!RQNlL=U{DSC|CB^Hm4IOvNWqrRAEEQyRr#q zCb-w`e8ZuXsN?>ORlJjyA5#!aZBvQy%0mN;9g3^^S4OfBa-&PdWiqMM3;-L&yT1E= z;`aD6n4Q(BMcLZxb9ceh9%T<9OQ&*wNuSGdVlwXa;A`~DEmhn5(Eplnu?q4jYQjCi zp|LmBzIgOUFrID@;NAfw2XUi)2PVLm@x6M;H)G`Vlp(UbkdveGap_;9fDfvs_S$JP zs**O*r~hb}6V3sWfo-fC?tA%p?!;r3)o0SV?{S-}he9PNN>4)c0NjBXn( z#-WB}n)en{ls-YcUlQ^X2Q_yCcKO~+pC8aN#-H5JbMhxh*`-z8Yg_QCGI;>CM$|_j zfTeM^Sg_1V|36fHbzBqN7dIss2;`BU{)U`)m;~Gt^N-4f)N$1 zN+TH~pT^Omj-y7u6o~QB;{8h+1QdR{{pHg6SFv;MmK5lRX1UGVcJaXuHlW8MgH3nT zBKJ7`XZc%BP)W8J1DBQVsuprN(UH#u&8|ev<`kL=KQ#^wVD_85wJIBf*4-Ww8J0a) z3~y%{uNoHC-7obvMkW-h?M8ze$PJsPuxha1(Fls0^Aw6s9EYfC28=7Ngv%Im9H&mW zkA8Z-MJM}#tK~@9U^cQlGJLh%*$`2Fz*V-r-wJkklWbXBpNm{6k@0DReqi%9V7Wug z^2*w3MbtAkY#Ue2=j@9embHcqzPVcUZN52;o|8%HQnQy;=(%FFK(y&Lf_EAxV&O1x ziKfA~ORKaSSatc>%#mLr0(HZ$?Ux3fPBw-AT5o>2pt0PXPBLpWsw-W53&IYi4N%Oi zSCH9&b^ThU!TP)1>~XY{N%3eIsFfhy3Q(9o4fSzsg0Anm9^qs%7#BX}+<{2bhYk3b zu|BZah$Z+fo#3pujd;N92~5UoS%WnLZW}t!Q|4mVJ#D{`JkHxaBVT{1rCfxf|I${O z^D(|UjN4=FXP=Q@z2dBY{T+}|u>LrVa|{3tg^XzdwET`~0i0*%GitN?)=mLj7tdx- zymuPjt(OW>(L<=X)`MbsG9rl5?=@ItrTlI?`~qTpduFQQhGh3k-CrQy_2E}hfz|N( zV7e3DQIS+-yhL&S3@4S2Dhp2E#g>OH{}K{F@C_-p++Io3y zq(7URbAEXzlYj=noqV7pnMI-T_93B;Z@z}nM}LL1eQm}B$8~FRqdztKld^1&TGX~R z-Ikf~S*qYFRwaJkYE?5>Xz1XfQ2q9wN2++nw>2rzt~(!lpDntfSHn^jL*^jxq-;|_?x1ut-CA$?8%~Ad z@jR;5lf4sq!mP+)1AX_!eEJx@h_cmCHS>_%t0SsM?pPt9 z_+Xz=kW|H}>Oy(!k}l-Mv)Qyg#Jmq}O$?OapdYVs79S_)e2^9q8!XE^>4(wzO_;ePQ zp6OTVEp2;!k!||gthZ{x(k*zfHq|a$w>1JD@66GJPoxQ-&}zPe1*z~yY`Vz%wjST{ zbmUAHhx>*vb8l5N=DsxmZ9*g%EqisSaj3zquKH6!R_9-hlwLLRlD|p=BVCX(r=OlH zrB-eCF9)(Q=gkim6GR|tFX->`Kz%9jS;F;2%yWkUi;QZC{6rpWRMfPenZP=1_mRW- zj7ACAu=##{QCt|&X1!~PvY?t7Wo0#4lkw_LOo;MhsZXxjqgGA7aZjT#;Mt~)2pEs6 z?ar*0?8J4(uGWkrbS%%~HWjKBAKzJx57QFh)f@{o0-gRwVnh8F+tjBP!%NSqVz=1( z`019#MIk{zYf5RyxHNeL(zti&Yg6;Y_mTGd8MlbBYR}^txt!LVH2M2%1JmvKI`~GL zLqK}={am4Xiob)CUU5+GQ

L?r!fZ) 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 Date: Mon, 31 Dec 2018 16:51:27 +0200 Subject: [PATCH 231/359] exclude auto-configuration --- .../resources/application-test.properties | 3 ++ .../ExcludeAutoConfig1IntegrationTest.java | 26 ++++++++++++++++ .../ExcludeAutoConfig2IntegrationTest.java | 26 ++++++++++++++++ .../ExcludeAutoConfig3IntegrationTest.java | 27 +++++++++++++++++ .../ExcludeAutoConfig4IntegrationTest.java | 22 ++++++++++++++ .../autoconfig/exclude/TestApplication.java | 13 ++++++++ .../boot/SpringContextIntegrationTest.java | 15 ++++++++++ .../autoconfig/AutoConfigIntegrationTest.java | 30 +++++++++++++++++++ 8 files changed, 162 insertions(+) create mode 100644 spring-boot-testing/src/main/resources/application-test.properties create mode 100644 spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig1IntegrationTest.java create mode 100644 spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig2IntegrationTest.java create mode 100644 spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig3IntegrationTest.java create mode 100644 spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig4IntegrationTest.java create mode 100644 spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/TestApplication.java create mode 100644 spring-boot-testing/src/test/java/com/baeldung/boot/SpringContextIntegrationTest.java create mode 100644 spring-boot-testing/src/test/java/com/baeldung/boot/autoconfig/AutoConfigIntegrationTest.java diff --git a/spring-boot-testing/src/main/resources/application-test.properties b/spring-boot-testing/src/main/resources/application-test.properties new file mode 100644 index 0000000000..8d5e86ba26 --- /dev/null +++ b/spring-boot-testing/src/main/resources/application-test.properties @@ -0,0 +1,3 @@ + +# test properties +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration \ No newline at end of file diff --git a/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig1IntegrationTest.java b/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig1IntegrationTest.java new file mode 100644 index 0000000000..a4a29cddf3 --- /dev/null +++ b/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig1IntegrationTest.java @@ -0,0 +1,26 @@ +package com.baeldung.autoconfig.exclude; + +import static org.junit.Assert.assertEquals; +import io.restassured.RestAssured; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.http.HttpStatus; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.boot.Application; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT) +@TestPropertySource(properties = "spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration") +public class ExcludeAutoConfig1IntegrationTest { + + @Test + public void givenSecurityConfigExcluded_whenAccessHome_thenNoAuthenticationRequired() { + int statusCode = RestAssured.get("http://localhost:8080/").statusCode(); + assertEquals(HttpStatus.OK.value(), statusCode); + } +} diff --git a/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig2IntegrationTest.java b/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig2IntegrationTest.java new file mode 100644 index 0000000000..cdf79b159c --- /dev/null +++ b/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig2IntegrationTest.java @@ -0,0 +1,26 @@ +package com.baeldung.autoconfig.exclude; + +import static org.junit.Assert.assertEquals; +import io.restassured.RestAssured; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.http.HttpStatus; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.boot.Application; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT) +@ActiveProfiles("test") +public class ExcludeAutoConfig2IntegrationTest { + + @Test + public void givenSecurityConfigExcluded_whenAccessHome_thenNoAuthenticationRequired() { + int statusCode = RestAssured.get("http://localhost:8080/").statusCode(); + assertEquals(HttpStatus.OK.value(), statusCode); + } +} diff --git a/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig3IntegrationTest.java b/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig3IntegrationTest.java new file mode 100644 index 0000000000..0e45d1e9e5 --- /dev/null +++ b/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig3IntegrationTest.java @@ -0,0 +1,27 @@ +package com.baeldung.autoconfig.exclude; + +import static org.junit.Assert.assertEquals; +import io.restassured.RestAssured; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.http.HttpStatus; +import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.boot.Application; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT) +@EnableAutoConfiguration(exclude=SecurityAutoConfiguration.class) +public class ExcludeAutoConfig3IntegrationTest { + + @Test + public void givenSecurityConfigExcluded_whenAccessHome_thenNoAuthenticationRequired() { + int statusCode = RestAssured.get("http://localhost:8080/").statusCode(); + assertEquals(HttpStatus.OK.value(), statusCode); + } +} diff --git a/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig4IntegrationTest.java b/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig4IntegrationTest.java new file mode 100644 index 0000000000..8429aed6cd --- /dev/null +++ b/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig4IntegrationTest.java @@ -0,0 +1,22 @@ +package com.baeldung.autoconfig.exclude; + +import static org.junit.Assert.assertEquals; +import io.restassured.RestAssured; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.http.HttpStatus; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = TestApplication.class, webEnvironment = WebEnvironment.DEFINED_PORT) +public class ExcludeAutoConfig4IntegrationTest { + + @Test + public void givenSecurityConfigExcluded_whenAccessHome_thenNoAuthenticationRequired() { + int statusCode = RestAssured.get("http://localhost:8080/").statusCode(); + assertEquals(HttpStatus.OK.value(), statusCode); + } +} diff --git a/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/TestApplication.java b/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/TestApplication.java new file mode 100644 index 0000000000..7c162f85ab --- /dev/null +++ b/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/TestApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.autoconfig.exclude; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; + +@SpringBootApplication(scanBasePackages="com.baeldung.boot", exclude=SecurityAutoConfiguration.class) +public class TestApplication { + + public static void main(String[] args) { + SpringApplication.run(TestApplication.class, args); + } +} diff --git a/spring-boot-testing/src/test/java/com/baeldung/boot/SpringContextIntegrationTest.java b/spring-boot-testing/src/test/java/com/baeldung/boot/SpringContextIntegrationTest.java new file mode 100644 index 0000000000..63ab07fdb7 --- /dev/null +++ b/spring-boot-testing/src/test/java/com/baeldung/boot/SpringContextIntegrationTest.java @@ -0,0 +1,15 @@ +package com.baeldung.boot; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class) +public class SpringContextIntegrationTest { + + @Test + public void whenSpringContextIsBootstrapped_thenNoExceptions() { + } +} diff --git a/spring-boot-testing/src/test/java/com/baeldung/boot/autoconfig/AutoConfigIntegrationTest.java b/spring-boot-testing/src/test/java/com/baeldung/boot/autoconfig/AutoConfigIntegrationTest.java new file mode 100644 index 0000000000..fe71f44ddf --- /dev/null +++ b/spring-boot-testing/src/test/java/com/baeldung/boot/autoconfig/AutoConfigIntegrationTest.java @@ -0,0 +1,30 @@ +package com.baeldung.boot.autoconfig; + +import static org.junit.Assert.assertEquals; +import io.restassured.RestAssured; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.http.HttpStatus; +import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.boot.Application; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT) +public class AutoConfigIntegrationTest { + + @Test + public void givenNoAuthentication_whenAccessHome_thenUnauthorized() { + int statusCode = RestAssured.get("http://localhost:8080/").statusCode(); + assertEquals(HttpStatus.UNAUTHORIZED.value(), statusCode); + } + + @Test + public void givenAuthentication_whenAccessHome_thenOK() { + int statusCode = RestAssured.given().auth().basic("john", "123").get("http://localhost:8080/").statusCode(); + assertEquals(HttpStatus.OK.value(), statusCode); + } +} From 1ed8fcf9dcbed1aa5424715c0207bbeaf669773a Mon Sep 17 00:00:00 2001 From: Urvy Agrawal Date: Tue, 1 Jan 2019 02:56:19 +0530 Subject: [PATCH 232/359] BAEL-2323 Java Native Keyword (#6038) -Moved files to core-java-lang module --- .../native/nativedatetimeutils.dll | Bin .../com/baeldung/nativekeyword/DateTimeUtils.java | 0 .../com/baeldung/nativekeyword/NativeMainApp.java | 0 .../nativekeyword/DateTimeUtilsManualTest.java | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename {core-java => core-java-lang}/native/nativedatetimeutils.dll (100%) rename {core-java => core-java-lang}/src/main/java/com/baeldung/nativekeyword/DateTimeUtils.java (100%) rename {core-java => core-java-lang}/src/main/java/com/baeldung/nativekeyword/NativeMainApp.java (100%) rename {core-java => core-java-lang}/src/test/java/com/baeldung/nativekeyword/DateTimeUtilsManualTest.java (100%) diff --git a/core-java/native/nativedatetimeutils.dll b/core-java-lang/native/nativedatetimeutils.dll similarity index 100% rename from core-java/native/nativedatetimeutils.dll rename to core-java-lang/native/nativedatetimeutils.dll diff --git a/core-java/src/main/java/com/baeldung/nativekeyword/DateTimeUtils.java b/core-java-lang/src/main/java/com/baeldung/nativekeyword/DateTimeUtils.java similarity index 100% rename from core-java/src/main/java/com/baeldung/nativekeyword/DateTimeUtils.java rename to core-java-lang/src/main/java/com/baeldung/nativekeyword/DateTimeUtils.java diff --git a/core-java/src/main/java/com/baeldung/nativekeyword/NativeMainApp.java b/core-java-lang/src/main/java/com/baeldung/nativekeyword/NativeMainApp.java similarity index 100% rename from core-java/src/main/java/com/baeldung/nativekeyword/NativeMainApp.java rename to core-java-lang/src/main/java/com/baeldung/nativekeyword/NativeMainApp.java diff --git a/core-java/src/test/java/com/baeldung/nativekeyword/DateTimeUtilsManualTest.java b/core-java-lang/src/test/java/com/baeldung/nativekeyword/DateTimeUtilsManualTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/nativekeyword/DateTimeUtilsManualTest.java rename to core-java-lang/src/test/java/com/baeldung/nativekeyword/DateTimeUtilsManualTest.java From c39fe1c85ca175a028521f8bf77ef9a906e24a6f Mon Sep 17 00:00:00 2001 From: Markus Gulden <> Date: Tue, 1 Jan 2019 15:40:15 +0100 Subject: [PATCH 233/359] BAEL-2321 --- .../04_Custom/connect-distributed.properties | 88 ----------------- .../04_Custom/connect-mongodb-sink.json | 30 +++--- .../04_Custom/connect-mqtt-source.json | 8 +- .../04_Custom/docker-compose.yaml | 94 +++++++++++++++++++ 4 files changed, 110 insertions(+), 110 deletions(-) delete mode 100644 libraries-data/src/main/kafka-connect/04_Custom/connect-distributed.properties create mode 100644 libraries-data/src/main/kafka-connect/04_Custom/docker-compose.yaml diff --git a/libraries-data/src/main/kafka-connect/04_Custom/connect-distributed.properties b/libraries-data/src/main/kafka-connect/04_Custom/connect-distributed.properties deleted file mode 100644 index 5b91baddbd..0000000000 --- a/libraries-data/src/main/kafka-connect/04_Custom/connect-distributed.properties +++ /dev/null @@ -1,88 +0,0 @@ -## -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -## - -# This file contains some of the configurations for the Kafka Connect distributed worker. This file is intended -# to be used with the examples, and some settings may differ from those used in a production system, especially -# the `bootstrap.servers` and those specifying replication factors. - -# A list of host/port pairs to use for establishing the initial connection to the Kafka cluster. -bootstrap.servers=localhost:9092 - -# unique name for the cluster, used in forming the Connect cluster group. Note that this must not conflict with consumer group IDs -group.id=connect-cluster - -# The converters specify the format of data in Kafka and how to translate it into Connect data. Every Connect user will -# need to configure these based on the format they want their data in when loaded from or stored into Kafka -key.converter=org.apache.kafka.connect.json.JsonConverter -value.converter=org.apache.kafka.connect.json.JsonConverter -# Converter-specific settings can be passed in by prefixing the Converter's setting with the converter we want to apply -# it to -key.converter.schemas.enable=true -value.converter.schemas.enable=true - -# Topic to use for storing offsets. This topic should have many partitions and be replicated and compacted. -# Kafka Connect will attempt to create the topic automatically when needed, but you can always manually create -# the topic before starting Kafka Connect if a specific topic configuration is needed. -# Most users will want to use the built-in default replication factor of 3 or in some cases even specify a larger value. -# Since this means there must be at least as many brokers as the maximum replication factor used, we'd like to be able -# to run this example on a single-broker cluster and so here we instead set the replication factor to 1. -offset.storage.topic=connect-offsets -offset.storage.replication.factor=1 -#offset.storage.partitions=25 - -# Topic to use for storing connector and task configurations; note that this should be a single partition, highly replicated, -# and compacted topic. Kafka Connect will attempt to create the topic automatically when needed, but you can always manually create -# the topic before starting Kafka Connect if a specific topic configuration is needed. -# Most users will want to use the built-in default replication factor of 3 or in some cases even specify a larger value. -# Since this means there must be at least as many brokers as the maximum replication factor used, we'd like to be able -# to run this example on a single-broker cluster and so here we instead set the replication factor to 1. -config.storage.topic=connect-configs -config.storage.replication.factor=1 - -# Topic to use for storing statuses. This topic can have multiple partitions and should be replicated and compacted. -# Kafka Connect will attempt to create the topic automatically when needed, but you can always manually create -# the topic before starting Kafka Connect if a specific topic configuration is needed. -# Most users will want to use the built-in default replication factor of 3 or in some cases even specify a larger value. -# Since this means there must be at least as many brokers as the maximum replication factor used, we'd like to be able -# to run this example on a single-broker cluster and so here we instead set the replication factor to 1. -status.storage.topic=connect-status -status.storage.replication.factor=1 -#status.storage.partitions=5 - -# Flush much faster than normal, which is useful for testing/debugging -offset.flush.interval.ms=10000 - -# These are provided to inform the user about the presence of the REST host and port configs -# Hostname & Port for the REST API to listen on. If this is set, it will bind to the interface used to listen to requests. -#rest.host.name= -#rest.port=8083 - -# The Hostname & Port that will be given out to other workers to connect to i.e. URLs that are routable from other servers. -#rest.advertised.host.name= -#rest.advertised.port= - -# Set to a list of filesystem paths separated by commas (,) to enable class loading isolation for plugins -# (connectors, converters, transformations). The list should consist of top level directories that include -# any combination of: -# a) directories immediately containing jars with plugins and their dependencies -# b) uber-jars with plugins and their dependencies -# c) directories immediately containing the package directory structure of classes of plugins and their dependencies -# Examples: -# plugin.path=/usr/local/share/java,/usr/local/share/kafka/plugins,/opt/connectors, -# Replace the relative path below with an absolute path if you are planning to start Kafka Connect from within a -# directory other than the home directory of Confluent Platform. -plugin.path=./share/java diff --git a/libraries-data/src/main/kafka-connect/04_Custom/connect-mongodb-sink.json b/libraries-data/src/main/kafka-connect/04_Custom/connect-mongodb-sink.json index 333768e4b7..852f400fc6 100644 --- a/libraries-data/src/main/kafka-connect/04_Custom/connect-mongodb-sink.json +++ b/libraries-data/src/main/kafka-connect/04_Custom/connect-mongodb-sink.json @@ -1,22 +1,14 @@ { - "firstName": "John", - "lastName": "Smith", - "age": 25, - "address": { - "streetAddress": "21 2nd Street", - "city": "New York", - "state": "NY", - "postalCode": "10021" - }, - "phoneNumber": [{ - "type": "home", - "number": "212 555-1234" - }, { - "type": "fax", - "number": "646 555-4567" - } - ], - "gender": { - "type": "male" + "name": "mongodb-sink", + "config": { + "connector.class": "at.grahsl.kafka.connect.mongodb.MongoDbSinkConnector", + "tasks.max": 1, + "topics": "connect-custom", + "mongodb.connection.uri": "mongodb://mongo-db/test?retryWrites=true", + "mongodb.collection": "MyCollection", + "key.converter": "org.apache.kafka.connect.json.JsonConverter", + "key.converter.schemas.enable": false, + "value.converter": "org.apache.kafka.connect.json.JsonConverter", + "value.converter.schemas.enable": false } } diff --git a/libraries-data/src/main/kafka-connect/04_Custom/connect-mqtt-source.json b/libraries-data/src/main/kafka-connect/04_Custom/connect-mqtt-source.json index 02d87c5ad7..c76d326c0a 100644 --- a/libraries-data/src/main/kafka-connect/04_Custom/connect-mqtt-source.json +++ b/libraries-data/src/main/kafka-connect/04_Custom/connect-mqtt-source.json @@ -3,9 +3,11 @@ "config": { "connector.class": "io.confluent.connect.mqtt.MqttSourceConnector", "tasks.max": 1, - "mqtt.server.uri": "ws://broker.hivemq.com:8000/mqtt", + "mqtt.server.uri": "tcp://mosquitto:1883", "mqtt.topics": "baeldung", "kafka.topic": "connect-custom", - "value.converter": "org.apache.kafka.connect.converters.ByteArrayConverter" + "value.converter": "org.apache.kafka.connect.converters.ByteArrayConverter", + "confluent.topic.bootstrap.servers": "kafka:9092", + "confluent.topic.replication.factor": 1 } -} +} \ No newline at end of file diff --git a/libraries-data/src/main/kafka-connect/04_Custom/docker-compose.yaml b/libraries-data/src/main/kafka-connect/04_Custom/docker-compose.yaml new file mode 100644 index 0000000000..26cd653335 --- /dev/null +++ b/libraries-data/src/main/kafka-connect/04_Custom/docker-compose.yaml @@ -0,0 +1,94 @@ +version: '3.3' + +services: + mosquitto: + image: eclipse-mosquitto:1.5.5 + hostname: mosquitto + container_name: mosquitto + expose: + - "1883" + ports: + - "1883:1883" + zookeeper: + image: zookeeper:3.4.9 + restart: unless-stopped + hostname: zookeeper + container_name: zookeeper + ports: + - "2181:2181" + environment: + ZOO_MY_ID: 1 + ZOO_PORT: 2181 + ZOO_SERVERS: server.1=zookeeper:2888:3888 + volumes: + - ./zookeeper/data:/data + - ./zookeeper/datalog:/datalog + kafka: + image: confluentinc/cp-kafka:5.1.0 + hostname: kafka + container_name: kafka + ports: + - "9092:9092" + environment: + KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT + KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092 + KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181" + KAFKA_BROKER_ID: 1 + KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 + volumes: + - ./kafka/data:/var/lib/kafka/data + depends_on: + - zookeeper + kafka-connect: + image: confluentinc/cp-kafka-connect:5.1.0 + hostname: kafka-connect + container_name: kafka-connect + ports: + - "8083:8083" + environment: + CONNECT_BOOTSTRAP_SERVERS: "kafka:9092" + CONNECT_REST_ADVERTISED_HOST_NAME: connect + CONNECT_REST_PORT: 8083 + CONNECT_GROUP_ID: compose-connect-group + CONNECT_CONFIG_STORAGE_TOPIC: docker-connect-configs + CONNECT_OFFSET_STORAGE_TOPIC: docker-connect-offsets + CONNECT_STATUS_STORAGE_TOPIC: docker-connect-status + CONNECT_KEY_CONVERTER: org.apache.kafka.connect.json.JsonConverter + CONNECT_VALUE_CONVERTER: org.apache.kafka.connect.json.JsonConverter + CONNECT_INTERNAL_KEY_CONVERTER: "org.apache.kafka.connect.json.JsonConverter" + CONNECT_INTERNAL_VALUE_CONVERTER: "org.apache.kafka.connect.json.JsonConverter" + CONNECT_CONFIG_STORAGE_REPLICATION_FACTOR: "1" + CONNECT_OFFSET_STORAGE_REPLICATION_FACTOR: "1" + CONNECT_STATUS_STORAGE_REPLICATION_FACTOR: "1" + CONNECT_PLUGIN_PATH: '/usr/share/java,/etc/kafka-connect/jars' + CONNECT_CONFLUENT_TOPIC_REPLICATION_FACTOR: 1 + volumes: + - /tmp/custom/jars:/etc/kafka-connect/jars + depends_on: + - zookeeper + - kafka + - mosquitto + mongo-db: + image: mongo:4.0.5 + hostname: mongo-db + container_name: mongo-db + expose: + - "27017" + ports: + - "27017:27017" + command: --bind_ip_all --smallfiles + volumes: + - ./mongo-db:/data + mongoclient: + image: mongoclient/mongoclient:2.2.0 + container_name: mongoclient + hostname: mongoclient + depends_on: + - mongo-db + ports: + - 3000:3000 + environment: + MONGO_URL: "mongodb://mongo-db:27017" + PORT: 3000 + expose: + - "3000" \ No newline at end of file From c560a37b70907834f90d73eca63c612e27cd1826 Mon Sep 17 00:00:00 2001 From: Loredana Date: Tue, 1 Jan 2019 22:44:53 +0200 Subject: [PATCH 234/359] add start class --- spring-boot-security/pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spring-boot-security/pom.xml b/spring-boot-security/pom.xml index d5c7976ba2..b87189757a 100644 --- a/spring-boot-security/pom.xml +++ b/spring-boot-security/pom.xml @@ -66,4 +66,8 @@ + + com.baeldung.springbootsecurity.basic_auth.SpringBootSecurityApplication + + From 0d5483e1bf74b0d00aa314d7f8a84f5feb710e81 Mon Sep 17 00:00:00 2001 From: rahusriv Date: Wed, 2 Jan 2019 08:26:43 +0530 Subject: [PATCH 235/359] Rahul/multidimensional/pr3 (#6040) * Making examples simple * Changing variable names * Modificatons in naming * Giving extra spaces --- .../ArrayListOfArrayList.java | 21 ++++++++++--------- .../ThreeDimensionalArrayList.java | 10 ++++----- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/core-java-collections-list/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java b/core-java-collections-list/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java index 2c3da7b1fc..e11f8e8ba0 100644 --- a/core-java-collections-list/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java +++ b/core-java-collections-list/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java @@ -6,11 +6,11 @@ public class ArrayListOfArrayList { public static void main(String args[]) { - int numVertices = 3; - ArrayList> graph = new ArrayList<>(numVertices); + int vertexCount = 3; + ArrayList> graph = new ArrayList<>(vertexCount); //Initializing each element of ArrayList with ArrayList - for(int i=0; i< numVertices; i++) { + for(int i = 0; i< vertexCount; i++) { graph.add(new ArrayList()); } @@ -21,13 +21,14 @@ public class ArrayListOfArrayList { graph.get(1).add(0); graph.get(2).add(1); graph.get(0).add(2); - - //Printing all the edges - for(int vertexNo=0; vertexNo listOfVertices = graph.get(vertexNo); - for(int i=0; i > > space = new ArrayList<>(x_axis_length); //Initializing each element of ArrayList with ArrayList< ArrayList > - for(int i=0; i< x_axis_length; i++) { + for(int i = 0; i < x_axis_length; i++) { space.add(new ArrayList< ArrayList >(y_axis_length)); - for(int j =0; j< y_axis_length; j++) { + for(int j = 0; j < y_axis_length; j++) { space.get(i).add(new ArrayList(z_axis_length)); } } @@ -33,9 +33,9 @@ public class ThreeDimensionalArrayList { space.get(1).get(1).add(1,"Yellow"); //Printing colors for all the points - for(int i=0; i Date: Wed, 2 Jan 2019 13:36:50 +0200 Subject: [PATCH 236/359] Update README.md --- core-java/README.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/core-java/README.md b/core-java/README.md index 3c5d1941d6..03b77186b0 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -22,7 +22,6 @@ - [Difference between URL and URI](http://www.baeldung.com/java-url-vs-uri) - [Creating a Java Compiler Plugin](http://www.baeldung.com/java-build-compiler-plugin) - [Quick Guide to Java Stack](http://www.baeldung.com/java-stack) -- [Guide to java.util.Formatter](http://www.baeldung.com/java-string-formatter) - [Compiling Java *.class Files with javac](http://www.baeldung.com/javac) - [Introduction to Javadoc](http://www.baeldung.com/javadoc) - [Guide to the Externalizable Interface in Java](http://www.baeldung.com/java-externalizable) @@ -40,13 +39,7 @@ - [Common Java Exceptions](http://www.baeldung.com/java-common-exceptions) - [Throw Exception in Optional in Java 8](https://www.baeldung.com/java-optional-throw-exception) - [Merging java.util.Properties Objects](https://www.baeldung.com/java-merging-properties) -- [Add a Character to a String at a Given Position](https://www.baeldung.com/java-add-character-to-string) -- [Calculating the nth Root in Java](https://www.baeldung.com/java-nth-root) -- [Convert Double to String, Removing Decimal Places](https://www.baeldung.com/java-double-to-string) -- [ZoneOffset in Java](https://www.baeldung.com/java-zone-offset) - [Merging java.util.Properties Objects](https://www.baeldung.com/java-merging-properties) -- [A Guide to SimpleDateFormat](https://www.baeldung.com/java-simple-date-format) -- [Changing the Order in a Sum Operation Can Produce Different Results?](https://www.baeldung.com/java-floating-point-sum-order) - [Java – Try with Resources](https://www.baeldung.com/java-try-with-resources) - [Abstract Classes in Java](https://www.baeldung.com/java-abstract-class) - [Guide to Character Encoding](https://www.baeldung.com/java-char-encoding) From e464591902afaa61de6035486a8240a87e046b38 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Wed, 2 Jan 2019 14:39:01 +0200 Subject: [PATCH 237/359] Update README.md --- core-java-collections/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-collections/README.md b/core-java-collections/README.md index 71d4e6b614..1a90d01a82 100644 --- a/core-java-collections/README.md +++ b/core-java-collections/README.md @@ -29,4 +29,4 @@ - [Sorting in Java](http://www.baeldung.com/java-sorting) - [Join and Split Arrays and Collections in Java](http://www.baeldung.com/java-join-and-split) - [A Guide to EnumMap](https://www.baeldung.com/java-enum-map) -- [A Guide to Iterator in Java](http://www.baeldung.com/java-iterator) \ No newline at end of file +- [A Guide to Iterator in Java](http://www.baeldung.com/java-iterator) From 1db24b5c06076b85d4a2c3ab4b3caddd74df8154 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Wed, 2 Jan 2019 15:45:28 +0200 Subject: [PATCH 238/359] Update README.md --- core-java-8/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core-java-8/README.md b/core-java-8/README.md index e5fa953cc7..f9af585ab3 100644 --- a/core-java-8/README.md +++ b/core-java-8/README.md @@ -33,3 +33,7 @@ - [Java Primitives versus Objects](https://www.baeldung.com/java-primitives-vs-objects) - [How to Use if/else Logic in Java 8 Streams](https://www.baeldung.com/java-8-streams-if-else-logic) - [How to Replace Many if Statements in Java](https://www.baeldung.com/java-replace-if-statements) +- [Java @Override Annotation](https://www.baeldung.com/java-override) +- [Java @SuppressWarnings Annotation](https://www.baeldung.com/java-suppresswarnings) +- [Java @SafeVarargs Annotation](https://www.baeldung.com/java-safevarargs) +- [Java @Deprecated Annotation](https://www.baeldung.com/java-deprecated) From 66016332f82446179aaae1ed5bd41c15b26773c0 Mon Sep 17 00:00:00 2001 From: Mikhail Chugunov Date: Wed, 2 Jan 2019 19:09:00 +0300 Subject: [PATCH 239/359] BAEL-2475: Add sample code and tests --- .../immutable/MaritalAwarePerson.java | 58 +++++++++++++++++++ .../deserialization/immutable/Person.java | 24 ++++++++ ...mmutableObjectDeserializationUnitTest.java | 40 +++++++++++++ 3 files changed, 122 insertions(+) create mode 100644 jackson/src/main/java/com/baeldung/jackson/deserialization/immutable/MaritalAwarePerson.java create mode 100644 jackson/src/main/java/com/baeldung/jackson/deserialization/immutable/Person.java create mode 100644 jackson/src/test/java/com/baeldung/jackson/deserialization/immutable/ImmutableObjectDeserializationUnitTest.java diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/immutable/MaritalAwarePerson.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/immutable/MaritalAwarePerson.java new file mode 100644 index 0000000000..cb593b3bb7 --- /dev/null +++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/immutable/MaritalAwarePerson.java @@ -0,0 +1,58 @@ +package com.baeldung.jackson.deserialization.immutable; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; + +@JsonDeserialize(builder = MaritalAwarePerson.Builder.class) +public class MaritalAwarePerson { + + private final String name; + private final int age; + private final Boolean married; + + private MaritalAwarePerson(String name, int age, Boolean married) { + this.name = name; + this.age = age; + this.married = married; + } + + public String getName() { + return name; + } + + public int getAge() { + return age; + } + + public Boolean getMarried() { + return married; + } + + @JsonPOJOBuilder + static class Builder { + String name; + int age; + Boolean married; + + Builder withName(String name) { + this.name = name; + return this; + } + + Builder withAge(int age) { + this.age = age; + return this; + } + + Builder withMarried(boolean married) { + this.married = married; + return this; + } + + public MaritalAwarePerson build() { + return new MaritalAwarePerson(name, age, married); + } + + + } +} diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/immutable/Person.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/immutable/Person.java new file mode 100644 index 0000000000..0214f93ca9 --- /dev/null +++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/immutable/Person.java @@ -0,0 +1,24 @@ +package com.baeldung.jackson.deserialization.immutable; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class Person { + + private final String name; + private final int age; + + @JsonCreator(mode = JsonCreator.Mode.PROPERTIES) + public Person(@JsonProperty("name") String name, @JsonProperty("age") int age) { + this.name = name; + this.age = age; + } + + public String getName() { + return name; + } + + public int getAge() { + return age; + } +} diff --git a/jackson/src/test/java/com/baeldung/jackson/deserialization/immutable/ImmutableObjectDeserializationUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/deserialization/immutable/ImmutableObjectDeserializationUnitTest.java new file mode 100644 index 0000000000..348ece4a09 --- /dev/null +++ b/jackson/src/test/java/com/baeldung/jackson/deserialization/immutable/ImmutableObjectDeserializationUnitTest.java @@ -0,0 +1,40 @@ +package com.baeldung.jackson.deserialization.immutable; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.*; + +public class ImmutableObjectDeserializationUnitTest { + + @Test + public void testPublicConstructor() throws IOException { + final String json = "{\"name\":\"Frank\",\"age\":50}"; + Person person = new ObjectMapper().readValue(json, Person.class); + + assertEquals("Frank", person.getName()); + assertEquals(50, person.getAge()); + } + + @Test + public void testBuilderNullField() throws IOException { + final String json = "{\"name\":\"Frank\",\"age\":50}"; + MaritalAwarePerson person = new ObjectMapper().readValue(json, MaritalAwarePerson.class); + + assertEquals("Frank", person.getName()); + assertEquals(50, person.getAge()); + assertNull(person.getMarried()); + } + + @Test + public void testBuilderAllFields() throws IOException { + final String json = "{\"name\":\"Frank\",\"age\":50,\"married\":true}"; + MaritalAwarePerson person = new ObjectMapper().readValue(json, MaritalAwarePerson.class); + + assertEquals("Frank", person.getName()); + assertEquals(50, person.getAge()); + assertTrue(person.getMarried()); + } +} From 2e436ce3e8e31c6791257f624b9661b4ba3368b3 Mon Sep 17 00:00:00 2001 From: Mikhail Chugunov Date: Wed, 2 Jan 2019 19:14:09 +0300 Subject: [PATCH 240/359] BAEL-2475: Rename tests --- .../immutable/ImmutableObjectDeserializationUnitTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/jackson/src/test/java/com/baeldung/jackson/deserialization/immutable/ImmutableObjectDeserializationUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/deserialization/immutable/ImmutableObjectDeserializationUnitTest.java index 348ece4a09..5c33a2da26 100644 --- a/jackson/src/test/java/com/baeldung/jackson/deserialization/immutable/ImmutableObjectDeserializationUnitTest.java +++ b/jackson/src/test/java/com/baeldung/jackson/deserialization/immutable/ImmutableObjectDeserializationUnitTest.java @@ -10,7 +10,7 @@ import static org.junit.Assert.*; public class ImmutableObjectDeserializationUnitTest { @Test - public void testPublicConstructor() throws IOException { + public void whenPublicConstructorIsUsed_thenObjectIsDeserialized() throws IOException { final String json = "{\"name\":\"Frank\",\"age\":50}"; Person person = new ObjectMapper().readValue(json, Person.class); @@ -19,7 +19,7 @@ public class ImmutableObjectDeserializationUnitTest { } @Test - public void testBuilderNullField() throws IOException { + public void whenBuilderIsUsedAndFieldIsNull_thenObjectIsDeserialized() throws IOException { final String json = "{\"name\":\"Frank\",\"age\":50}"; MaritalAwarePerson person = new ObjectMapper().readValue(json, MaritalAwarePerson.class); @@ -29,7 +29,7 @@ public class ImmutableObjectDeserializationUnitTest { } @Test - public void testBuilderAllFields() throws IOException { + public void whenBuilderIsUsedAndAllFieldsPresent_thenObjectIsDeserialized() throws IOException { final String json = "{\"name\":\"Frank\",\"age\":50,\"married\":true}"; MaritalAwarePerson person = new ObjectMapper().readValue(json, MaritalAwarePerson.class); From 75bf7ba5155da5fd1b8240080e35c4f0adb8781f Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Wed, 2 Jan 2019 22:11:21 +0530 Subject: [PATCH 241/359] BAEL-2536-check-for-a-panagram-string --- .../java/com/baeldung/string/Panagram.java | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 java-strings/src/main/java/com/baeldung/string/Panagram.java diff --git a/java-strings/src/main/java/com/baeldung/string/Panagram.java b/java-strings/src/main/java/com/baeldung/string/Panagram.java new file mode 100644 index 0000000000..d000b4455e --- /dev/null +++ b/java-strings/src/main/java/com/baeldung/string/Panagram.java @@ -0,0 +1,60 @@ +package com.baeldung.string; + +import java.util.Arrays; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class Panagram { + + public static boolean isPanagram(String str) { + if (str == null) + return false; + Boolean[] alphabetMarker = new Boolean[26]; + Arrays.fill(alphabetMarker, false); + int alphabetIndex = 0; + str = str.toUpperCase(); + for (int i = 0; i < str.length(); i++) { + if ('A' <= str.charAt(i) && str.charAt(i) <= 'Z') { + alphabetIndex = str.charAt(i) - 'A'; + alphabetMarker[alphabetIndex] = true; + } + } + for (boolean index : alphabetMarker) { + if (!index) + return false; + } + return true; + } + + public static boolean isPanagramWithStreams(String str) { + if (str == null) + return false; + + // filtered character stream + str = str.toUpperCase(); + Stream filteredCharStream = str.chars() + .filter(item -> ((item >= 'A' && item <= 'Z') || (item >= 'a' && item <= 'z'))) + .mapToObj(c -> (char) c); + Map alphabetMap = filteredCharStream.collect(Collectors.toMap(item -> item, k -> Boolean.TRUE, (p1, p2) -> p1)); + + return (alphabetMap.size() == 26); + } + + public static boolean isPerfectPanagram(String str) { + if (str == null) + return false; + + // filtered character stream + str = str.toUpperCase(); + Stream filteredCharStream = str.chars() + .filter(item -> ((item >= 'A' && item <= 'Z') || (item >= 'a' && item <= 'z'))) + .mapToObj(c -> (char) c); + Map alphabetFrequencyMap = filteredCharStream.collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); + + return (alphabetFrequencyMap.size() == 26 && alphabetFrequencyMap.values() + .stream() + .allMatch(item -> item == 1)); + } +} From 725076b8ee4593c3dbccd6b5006edc657e0c0bbb Mon Sep 17 00:00:00 2001 From: mherbaghinyan Date: Wed, 2 Jan 2019 22:18:53 +0400 Subject: [PATCH 242/359] performance tests tune up --- .../com/baeldung/performance/ArrayListBenchmark.java | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) 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 index 1eeb17df87..331ae8d908 100644 --- a/core-java-collections/src/main/java/com/baeldung/performance/ArrayListBenchmark.java +++ b/core-java-collections/src/main/java/com/baeldung/performance/ArrayListBenchmark.java @@ -9,7 +9,7 @@ import java.util.*; import java.util.concurrent.TimeUnit; @BenchmarkMode(Mode.AverageTime) -@OutputTimeUnit(TimeUnit.MICROSECONDS) +@OutputTimeUnit(TimeUnit.NANOSECONDS) @Warmup(iterations = 10) public class ArrayListBenchmark { @@ -63,6 +63,7 @@ public class ArrayListBenchmark { public Employee testGet(ArrayListBenchmark.MyState state) { return state.employeeList.get(state.employeeIndex); } + @Benchmark public Employee testVectorGet(ArrayListBenchmark.MyState state) { return state.employeeVector.get(state.employeeIndex); @@ -78,14 +79,9 @@ public class ArrayListBenchmark { state.employeeList.add(new Employee(state.iterations + 1, "John")); } - @Benchmark - public void testAddVector(ArrayListBenchmark.MyState state) { - state.employeeVector.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) + .include(ArrayListBenchmark.class.getSimpleName()).threads(3) .forks(1).shouldFailOnError(true) .shouldDoGC(true) .jvmArgs("-server").build(); From 9a8e006d73870b24c3116575ad56b97b319ab8ee Mon Sep 17 00:00:00 2001 From: Loredana Date: Wed, 2 Jan 2019 21:58:02 +0200 Subject: [PATCH 243/359] fix abstract factory ex --- .../creational/abstractfactory/AbstractFactory.java | 5 ++--- .../abstractfactory/AbstractPatternDriver.java | 4 ++-- .../creational/abstractfactory/AnimalFactory.java | 9 ++------- .../creational/abstractfactory/ColorFactory.java | 9 ++------- .../abstractfactory/AbstractPatternIntegrationTest.java | 4 ++-- 5 files changed, 10 insertions(+), 21 deletions(-) diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/AbstractFactory.java b/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/AbstractFactory.java index 5b4bf08006..88e819c066 100644 --- a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/AbstractFactory.java +++ b/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/AbstractFactory.java @@ -1,6 +1,5 @@ package com.baeldung.creational.abstractfactory; -public interface AbstractFactory { - Animal getAnimal(String toyType) ; - Color getColor(String colorType); +public interface AbstractFactory { + T create(String type) ; } \ No newline at end of file diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/AbstractPatternDriver.java b/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/AbstractPatternDriver.java index 68759d5aff..c1501091c5 100644 --- a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/AbstractPatternDriver.java +++ b/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/AbstractPatternDriver.java @@ -6,10 +6,10 @@ public class AbstractPatternDriver { //creating a brown toy dog abstractFactory = FactoryProvider.getFactory("Toy"); - Animal toy = abstractFactory.getAnimal("Dog"); + Animal toy =(Animal) abstractFactory.create("Dog"); abstractFactory = FactoryProvider.getFactory("Color"); - Color color = abstractFactory.getColor("Brown"); + Color color =(Color) abstractFactory.create("Brown"); String result = "A " + toy.getType() + " with " + color.getColor() + " color " + toy.makeSound(); diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/AnimalFactory.java b/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/AnimalFactory.java index bbc3eb7a82..4b46261571 100644 --- a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/AnimalFactory.java +++ b/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/AnimalFactory.java @@ -1,9 +1,9 @@ package com.baeldung.creational.abstractfactory; -public class AnimalFactory implements AbstractFactory { +public class AnimalFactory implements AbstractFactory { @Override - public Animal getAnimal(String animalType) { + public Animal create(String animalType) { if ("Dog".equalsIgnoreCase(animalType)) { return new Dog(); } else if ("Duck".equalsIgnoreCase(animalType)) { @@ -13,9 +13,4 @@ public class AnimalFactory implements AbstractFactory { return null; } - @Override - public Color getColor(String color) { - throw new UnsupportedOperationException(); - } - } diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/ColorFactory.java b/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/ColorFactory.java index 8b7e4f8086..3d9c5c18a3 100644 --- a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/ColorFactory.java +++ b/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/ColorFactory.java @@ -1,9 +1,9 @@ package com.baeldung.creational.abstractfactory; -public class ColorFactory implements AbstractFactory { +public class ColorFactory implements AbstractFactory { @Override - public Color getColor(String colorType) { + public Color create(String colorType) { if ("Brown".equalsIgnoreCase(colorType)) { return new Brown(); } else if ("White".equalsIgnoreCase(colorType)) { @@ -13,9 +13,4 @@ public class ColorFactory implements AbstractFactory { return null; } - @Override - public Animal getAnimal(String toyType) { - throw new UnsupportedOperationException(); - } - } diff --git a/patterns/design-patterns/src/test/java/com/baeldung/creational/abstractfactory/AbstractPatternIntegrationTest.java b/patterns/design-patterns/src/test/java/com/baeldung/creational/abstractfactory/AbstractPatternIntegrationTest.java index 6d1a4ad8fd..4f02249a4b 100644 --- a/patterns/design-patterns/src/test/java/com/baeldung/creational/abstractfactory/AbstractPatternIntegrationTest.java +++ b/patterns/design-patterns/src/test/java/com/baeldung/creational/abstractfactory/AbstractPatternIntegrationTest.java @@ -11,10 +11,10 @@ public class AbstractPatternIntegrationTest { //creating a brown toy dog abstractFactory = FactoryProvider.getFactory("Toy"); - Animal toy = abstractFactory.getAnimal("Dog"); + Animal toy = (Animal) abstractFactory.create("Dog"); abstractFactory = FactoryProvider.getFactory("Color"); - Color color = abstractFactory.getColor("Brown"); + Color color =(Color) abstractFactory.create("Brown"); String result = "A " + toy.getType() + " with " + color.getColor() + " color " + toy.makeSound(); assertEquals("A Dog with brown color Barks", result); From e0a063a932aead8d7b664eed674672b5bea4387f Mon Sep 17 00:00:00 2001 From: DOHA Date: Wed, 2 Jan 2019 22:25:14 +0200 Subject: [PATCH 244/359] remove unused SecurityConfig --- .../com/baeldung/boot/SecurityConfig.java | 32 ------------------- 1 file changed, 32 deletions(-) delete mode 100644 spring-boot-testing/src/main/java/com/baeldung/boot/SecurityConfig.java diff --git a/spring-boot-testing/src/main/java/com/baeldung/boot/SecurityConfig.java b/spring-boot-testing/src/main/java/com/baeldung/boot/SecurityConfig.java deleted file mode 100644 index 61e86d01c5..0000000000 --- a/spring-boot-testing/src/main/java/com/baeldung/boot/SecurityConfig.java +++ /dev/null @@ -1,32 +0,0 @@ -//package com.baeldung.boot; -// -//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 SecurityConfig extends WebSecurityConfigurerAdapter { -// -// @Override -// protected void configure(AuthenticationManagerBuilder auth) throws Exception { -// auth.inMemoryAuthentication() -// .withUser("john") -// .password("{noop}123") -// .roles("USER"); -// } -// -// @Override -// protected void configure(HttpSecurity http) throws Exception { -// http.authorizeRequests() -// .antMatchers("/hello") -// .permitAll() -// .anyRequest() -// .authenticated() -// .and() -// .httpBasic(); -// } -//} \ No newline at end of file From 23de38295f0efe7c3f7767b4cee3ce92bd3ce43b Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Wed, 2 Jan 2019 22:49:58 +0200 Subject: [PATCH 245/359] Update README.md --- core-java-8/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-8/README.md b/core-java-8/README.md index f9af585ab3..892dc71f76 100644 --- a/core-java-8/README.md +++ b/core-java-8/README.md @@ -37,3 +37,4 @@ - [Java @SuppressWarnings Annotation](https://www.baeldung.com/java-suppresswarnings) - [Java @SafeVarargs Annotation](https://www.baeldung.com/java-safevarargs) - [Java @Deprecated Annotation](https://www.baeldung.com/java-deprecated) +- [Java 8 Predicate Chain](https://www.baeldung.com/java-predicate-chain) From f912eaf5d98c8d51f444b9cca4ecd9523f89bf94 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Wed, 2 Jan 2019 22:50:52 +0200 Subject: [PATCH 246/359] Update README.md --- core-java-lang/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-lang/README.md b/core-java-lang/README.md index 52dfe708a3..f7aa47008d 100644 --- a/core-java-lang/README.md +++ b/core-java-lang/README.md @@ -33,3 +33,4 @@ - [How to Separate Double into Integer and Decimal Parts](https://www.baeldung.com/java-separate-double-into-integer-decimal-parts) - [“Sneaky Throws” in Java](http://www.baeldung.com/java-sneaky-throws) - [Retrieving a Class Name in Java](https://www.baeldung.com/java-class-name) +- [Guide to Java Packages](https://www.baeldung.com/java-packages) From 53b0c016fff0863cc47342edb2c1892ef89bb9bf Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Wed, 2 Jan 2019 22:53:09 +0200 Subject: [PATCH 247/359] Update README.md --- persistence-modules/hibernate5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/hibernate5/README.md b/persistence-modules/hibernate5/README.md index 2b948a683a..e973907248 100644 --- a/persistence-modules/hibernate5/README.md +++ b/persistence-modules/hibernate5/README.md @@ -23,3 +23,4 @@ - [Difference Between @JoinColumn and mappedBy](https://www.baeldung.com/jpa-joincolumn-vs-mappedby) - [Hibernate 5 Bootstrapping API](https://www.baeldung.com/hibernate-5-bootstrapping-api) - [Criteria Queries Using JPA Metamodel](https://www.baeldung.com/hibernate-criteria-queries-metamodel) +- [Guide to the Hibernate EntityManager](https://www.baeldung.com/hibernate-entitymanager) From 13e4081fc7a22111cfbf4c075dfd87eaab3471f1 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Wed, 2 Jan 2019 22:53:54 +0200 Subject: [PATCH 248/359] Update README.md --- java-collections-maps/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/java-collections-maps/README.md b/java-collections-maps/README.md index a6037a3c57..0b76ca1959 100644 --- a/java-collections-maps/README.md +++ b/java-collections-maps/README.md @@ -17,3 +17,4 @@ - [Finding the Highest Value in a Java Map](https://www.baeldung.com/java-find-map-max) - [Merging Two Maps with Java 8](https://www.baeldung.com/java-merge-maps) - [How to Check If a Key Exists in a Map](https://www.baeldung.com/java-map-key-exists) +- [Comparing Two HashMaps in Java](https://www.baeldung.com/java-compare-hashmaps) From 1a76da2f8f589204f57fc1d7a6e9b7bf45c37c72 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Wed, 2 Jan 2019 22:54:36 +0200 Subject: [PATCH 249/359] Update README.md --- core-java-lang/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-lang/README.md b/core-java-lang/README.md index 52dfe708a3..d5ad7d8e7c 100644 --- a/core-java-lang/README.md +++ b/core-java-lang/README.md @@ -33,3 +33,4 @@ - [How to Separate Double into Integer and Decimal Parts](https://www.baeldung.com/java-separate-double-into-integer-decimal-parts) - [“Sneaky Throws” in Java](http://www.baeldung.com/java-sneaky-throws) - [Retrieving a Class Name in Java](https://www.baeldung.com/java-class-name) +- [Java Compound Operators](https://www.baeldung.com/java-compound-operators) From 7b666654ec11d8e4b524d3fc44be572f6101d8ed Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Wed, 2 Jan 2019 22:56:06 +0200 Subject: [PATCH 250/359] Update README.md --- persistence-modules/java-jpa/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/persistence-modules/java-jpa/README.md b/persistence-modules/java-jpa/README.md index 9a90216519..2eea5e60b4 100644 --- a/persistence-modules/java-jpa/README.md +++ b/persistence-modules/java-jpa/README.md @@ -2,4 +2,5 @@ - [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) -- [Fixing the JPA error “java.lang.String cannot be cast to [Ljava.lang.String;”](https://www.baeldung.com/jpa-error-java-lang-string-cannot-be-cast) +- [Fixing the JPA error “java.lang.String cannot be cast to Ljava.lang.String;”](https://www.baeldung.com/jpa-error-java-lang-string-cannot-be-cast) +- [JPA Entity Graph](https://www.baeldung.com/jpa-entity-graph) From 6903a0c2bbdd72081fa8cac9f16d35f78bd05340 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Wed, 2 Jan 2019 22:56:48 +0200 Subject: [PATCH 251/359] Update README.md --- spring-5-security-oauth/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-5-security-oauth/README.md b/spring-5-security-oauth/README.md index f13925992b..5a444d4784 100644 --- a/spring-5-security-oauth/README.md +++ b/spring-5-security-oauth/README.md @@ -2,3 +2,4 @@ - [Spring Security 5 -OAuth2 Login](http://www.baeldung.com/spring-security-5-oauth2-login) - [Extracting Principal and Authorities using Spring Security OAuth](https://www.baeldung.com/spring-security-oauth-principal-authorities-extractor) +- [Customizing Authorization and Token Requests with Spring Security 5.1 Client](https://www.baeldung.com/spring-security-custom-oauth-requests) From 2ec62d9091c005a8783f71a8af63076e18f12c73 Mon Sep 17 00:00:00 2001 From: DOHA Date: Wed, 2 Jan 2019 23:16:14 +0200 Subject: [PATCH 252/359] minor clean up --- spring-boot-testing/pom.xml | 44 +------------------ ...tionTest.groovy => LoadContextTest.groovy} | 2 +- ...onTest.groovy => WebControllerTest.groovy} | 2 +- 3 files changed, 3 insertions(+), 45 deletions(-) rename spring-boot-testing/src/test/groovy/com/baeldung/boot/{LoadContextIntegrationTest.groovy => LoadContextTest.groovy} (91%) rename spring-boot-testing/src/test/groovy/com/baeldung/boot/{WebControllerIntegrationTest.groovy => WebControllerTest.groovy} (97%) diff --git a/spring-boot-testing/pom.xml b/spring-boot-testing/pom.xml index dd40789604..c2c886a4fe 100644 --- a/spring-boot-testing/pom.xml +++ b/spring-boot-testing/pom.xml @@ -109,53 +109,11 @@ - - - org.apache.maven.plugins - maven-surefire-plugin - - - **/*IntegrationTest.java - - - - + - - - integration - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - **/*IntegrationTest.java - - - - - - - json - - - - - - - - com.baeldung.boot.Application diff --git a/spring-boot-testing/src/test/groovy/com/baeldung/boot/LoadContextIntegrationTest.groovy b/spring-boot-testing/src/test/groovy/com/baeldung/boot/LoadContextTest.groovy similarity index 91% rename from spring-boot-testing/src/test/groovy/com/baeldung/boot/LoadContextIntegrationTest.groovy rename to spring-boot-testing/src/test/groovy/com/baeldung/boot/LoadContextTest.groovy index 8bfc86685c..85b0a4b89b 100644 --- a/spring-boot-testing/src/test/groovy/com/baeldung/boot/LoadContextIntegrationTest.groovy +++ b/spring-boot-testing/src/test/groovy/com/baeldung/boot/LoadContextTest.groovy @@ -10,7 +10,7 @@ import spock.lang.Title @Title("Application Specification") @Narrative("Specification which beans are expected") @SpringBootTest -class LoadContextIntegrationTest extends Specification { +class LoadContextTest extends Specification { @Autowired(required = false) private WebController webController diff --git a/spring-boot-testing/src/test/groovy/com/baeldung/boot/WebControllerIntegrationTest.groovy b/spring-boot-testing/src/test/groovy/com/baeldung/boot/WebControllerTest.groovy similarity index 97% rename from spring-boot-testing/src/test/groovy/com/baeldung/boot/WebControllerIntegrationTest.groovy rename to spring-boot-testing/src/test/groovy/com/baeldung/boot/WebControllerTest.groovy index 17c60376ed..d8b4e03adc 100644 --- a/spring-boot-testing/src/test/groovy/com/baeldung/boot/WebControllerIntegrationTest.groovy +++ b/spring-boot-testing/src/test/groovy/com/baeldung/boot/WebControllerTest.groovy @@ -14,7 +14,7 @@ import spock.lang.Title @Narrative("The Specification of the behaviour of the WebController. It can greet a person, change the name and reset it to 'world'") @AutoConfigureMockMvc(secure=false) @WebMvcTest() -class WebControllerIntegrationTest extends Specification { +class WebControllerTest extends Specification { @Autowired private MockMvc mvc From bbb6c93598e4c401ee000392a69f96a8badaa4b6 Mon Sep 17 00:00:00 2001 From: Ger Roza Date: Wed, 2 Jan 2019 22:13:35 -0200 Subject: [PATCH 253/359] [BAEL-2315] spring-5-reactive-oauth & spring-5-security-oauth | WebClient and OAuth2 support (#6053) * Cleaned shared properties in spring-5-security-oauth module, and made some final tunings on authorization service and the resource server * Added and modified example for webclient-oauth2 * Cleaned authorization service and resource service for webclient and oauth2 article * Added examples for auth code with client and with login cleaned properties and packages * Added examples fow webclient + oauth2 --- .../Spring5ReactiveOauthApplication.java | 2 + .../OauthClientApplication.java | 24 +++++++ .../configuration/WebClientConfig.java | 20 ++++++ .../configuration/WebSecurityConfig.java | 22 ++++++ .../web/ClientRestController.java | 53 +++++++++++++++ .../OauthClientApplication.java | 24 +++++++ .../configuration/WebClientConfig.java | 31 +++++++++ .../configuration/WebSecurityConfig.java | 20 ++++++ .../web/ClientRestController.java | 68 +++++++++++++++++++ .../ClientCredentialsOauthApplication.java | 26 +++++++ .../configuration/WebClientConfig.java | 22 ++++++ .../service/WebClientChonJob.java | 33 +++++++++ .../ManualRequestApplication.java | 23 +++++++ .../configure/WebClientConfig.java | 16 +++++ .../configure/WebSecurityConfig.java | 17 +++++ .../web/ManualOauthRequestController.java | 57 ++++++++++++++++ .../src/main/resources/application.yml | 23 +------ .../main/resources/default-application.yml | 20 ++++++ ...nt-auth-code-client-application.properties | 10 +++ ...ent-auth-code-login-application.properties | 10 +++ ...t-credentials-oauth-application.properties | 4 ++ .../OAuth2ClientCredentialsLiveTest.java | 52 ++++++++++++++ .../OAuth2ManualRequestLiveTest.java | 43 ++++++++++++ .../webclient/utils/ListAppender.java | 25 +++++++ .../src/test/resources/logback-test.xml | 16 +++++ .../oauth2/SpringOAuthApplication.java | 2 + .../ExtractorsApplication.java | 2 + .../AuthorizationServerApplication.java | 17 +++++ .../configuration/WebSecurityConfig.java | 26 +++++++ .../ResourceServerApplication.java | 17 +++++ .../configuration/AuthorizationConfigs.java | 29 ++++++++ .../web/ResourceRestController.java | 23 +++++++ .../src/main/resources/application.properties | 2 - .../resources/default-application.properties | 1 + ...lient-authorization-application.properties | 13 ++++ ...webclient-resources-application.properties | 6 ++ 36 files changed, 777 insertions(+), 22 deletions(-) create mode 100644 spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/OauthClientApplication.java create mode 100644 spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/configuration/WebClientConfig.java create mode 100644 spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/configuration/WebSecurityConfig.java create mode 100644 spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/web/ClientRestController.java create mode 100644 spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/OauthClientApplication.java create mode 100644 spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/configuration/WebClientConfig.java create mode 100644 spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/configuration/WebSecurityConfig.java create mode 100644 spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/web/ClientRestController.java create mode 100644 spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/clientcredentials/ClientCredentialsOauthApplication.java create mode 100644 spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/clientcredentials/configuration/WebClientConfig.java create mode 100644 spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/clientcredentials/service/WebClientChonJob.java create mode 100644 spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/ManualRequestApplication.java create mode 100644 spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/configure/WebClientConfig.java create mode 100644 spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/configure/WebSecurityConfig.java create mode 100644 spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/web/ManualOauthRequestController.java create mode 100644 spring-5-reactive-oauth/src/main/resources/default-application.yml create mode 100644 spring-5-reactive-oauth/src/main/resources/webclient-auth-code-client-application.properties create mode 100644 spring-5-reactive-oauth/src/main/resources/webclient-auth-code-login-application.properties create mode 100644 spring-5-reactive-oauth/src/main/resources/webclient-client-credentials-oauth-application.properties create mode 100644 spring-5-reactive-oauth/src/test/java/com/baeldung/webclient/clientcredentials/OAuth2ClientCredentialsLiveTest.java create mode 100644 spring-5-reactive-oauth/src/test/java/com/baeldung/webclient/manualrequest/OAuth2ManualRequestLiveTest.java create mode 100644 spring-5-reactive-oauth/src/test/java/com/baeldung/webclient/utils/ListAppender.java create mode 100644 spring-5-reactive-oauth/src/test/resources/logback-test.xml create mode 100644 spring-5-security-oauth/src/main/java/com/baeldung/webclient/authorizationserver/AuthorizationServerApplication.java create mode 100644 spring-5-security-oauth/src/main/java/com/baeldung/webclient/authorizationserver/configuration/WebSecurityConfig.java create mode 100644 spring-5-security-oauth/src/main/java/com/baeldung/webclient/resourceserver/ResourceServerApplication.java create mode 100644 spring-5-security-oauth/src/main/java/com/baeldung/webclient/resourceserver/configuration/AuthorizationConfigs.java create mode 100644 spring-5-security-oauth/src/main/java/com/baeldung/webclient/resourceserver/web/ResourceRestController.java create mode 100644 spring-5-security-oauth/src/main/resources/default-application.properties create mode 100644 spring-5-security-oauth/src/main/resources/webclient-authorization-application.properties create mode 100644 spring-5-security-oauth/src/main/resources/webclient-resources-application.properties diff --git a/spring-5-reactive-oauth/src/main/java/com/baeldung/reactive/oauth/Spring5ReactiveOauthApplication.java b/spring-5-reactive-oauth/src/main/java/com/baeldung/reactive/oauth/Spring5ReactiveOauthApplication.java index 602ded6b9e..b95517200e 100644 --- a/spring-5-reactive-oauth/src/main/java/com/baeldung/reactive/oauth/Spring5ReactiveOauthApplication.java +++ b/spring-5-reactive-oauth/src/main/java/com/baeldung/reactive/oauth/Spring5ReactiveOauthApplication.java @@ -3,11 +3,13 @@ package com.baeldung.reactive.oauth; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.PropertySource; import org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository; import org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction; import org.springframework.security.oauth2.client.web.server.ServerOAuth2AuthorizedClientRepository; import org.springframework.web.reactive.function.client.WebClient; +@PropertySource("classpath:default-application.yml") @SpringBootApplication public class Spring5ReactiveOauthApplication { diff --git a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/OauthClientApplication.java b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/OauthClientApplication.java new file mode 100644 index 0000000000..7bae78bb14 --- /dev/null +++ b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/OauthClientApplication.java @@ -0,0 +1,24 @@ +package com.baeldung.webclient.authorizationcodeclient; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.PropertySource; + +/** + * + * Note: This app is configured to use the authorization service and the resource service located in module spring-5-security-oauth + * + * As we usually do with other well-known auth providers (github/facebook/...) we have to log-in using user credentials (bael-user/bael-password) and client configurations (bael-client-id/bael-secret) handled by the auth server + * + * @author rozagerardo + * + */ +@PropertySource("classpath:webclient-auth-code-client-application.properties") +@SpringBootApplication +public class OauthClientApplication { + + public static void main(String[] args) { + SpringApplication.run(OauthClientApplication.class, args); + } + +} diff --git a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/configuration/WebClientConfig.java b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/configuration/WebClientConfig.java new file mode 100644 index 0000000000..884a3c145d --- /dev/null +++ b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/configuration/WebClientConfig.java @@ -0,0 +1,20 @@ +package com.baeldung.webclient.authorizationcodeclient.configuration; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository; +import org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction; +import org.springframework.security.oauth2.client.web.server.ServerOAuth2AuthorizedClientRepository; +import org.springframework.web.reactive.function.client.WebClient; + +@Configuration +public class WebClientConfig { + + @Bean + WebClient webClientForAuthorized(ReactiveClientRegistrationRepository clientRegistrations, ServerOAuth2AuthorizedClientRepository authorizedClients) { + ServerOAuth2AuthorizedClientExchangeFilterFunction oauth = new ServerOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrations, authorizedClients); + return WebClient.builder() + .filter(oauth) + .build(); + } +} diff --git a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/configuration/WebSecurityConfig.java b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/configuration/WebSecurityConfig.java new file mode 100644 index 0000000000..4271ae96cf --- /dev/null +++ b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/configuration/WebSecurityConfig.java @@ -0,0 +1,22 @@ +package com.baeldung.webclient.authorizationcodeclient.configuration; + +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; + +@Configuration +public class WebSecurityConfig { + @Bean + public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { + http.authorizeExchange() + .anyExchange() + .authenticated() + .and() + .oauth2Client() + .and() + .formLogin(); + return http.build(); + } + +} diff --git a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/web/ClientRestController.java b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/web/ClientRestController.java new file mode 100644 index 0000000000..c36b7d1dea --- /dev/null +++ b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/web/ClientRestController.java @@ -0,0 +1,53 @@ +package com.baeldung.webclient.authorizationcodeclient.web; + +import static org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction.clientRegistrationId; +import static org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction.oauth2AuthorizedClient; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.oauth2.client.OAuth2AuthorizedClient; +import org.springframework.security.oauth2.client.annotation.RegisteredOAuth2AuthorizedClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.reactive.function.client.WebClient; + +import reactor.core.publisher.Mono; + +@RestController +public class ClientRestController { + + private static final String RESOURCE_URI = "http://localhost:8084/retrieve-resource"; + + @Autowired + WebClient webClient; + + @GetMapping("/auth-code") + Mono useOauthWithAuthCode() { + Mono retrievedResource = webClient.get() + .uri(RESOURCE_URI) + .retrieve() + .bodyToMono(String.class); + return retrievedResource.map(string -> "We retrieved the following resource using Oauth: " + string); + } + + @GetMapping("/auth-code-annotated") + Mono useOauthWithAuthCodeAndAnnotation(@RegisteredOAuth2AuthorizedClient("bael") OAuth2AuthorizedClient authorizedClient) { + Mono retrievedResource = webClient.get() + .uri(RESOURCE_URI) + .attributes(oauth2AuthorizedClient(authorizedClient)) + .retrieve() + .bodyToMono(String.class); + return retrievedResource.map(string -> "We retrieved the following resource using Oauth: " + string + ". Principal associated: " + authorizedClient.getPrincipalName() + ". Token will expire at: " + authorizedClient.getAccessToken() + .getExpiresAt()); + } + + @GetMapping("/auth-code-explicit-client") + Mono useOauthWithExpicitClient() { + Mono retrievedResource = webClient.get() + .uri(RESOURCE_URI) + .attributes(clientRegistrationId("bael")) + .retrieve() + .bodyToMono(String.class); + return retrievedResource.map(string -> "We retrieved the following resource using Oauth: " + string); + } + +} diff --git a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/OauthClientApplication.java b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/OauthClientApplication.java new file mode 100644 index 0000000000..9dd6dd1bde --- /dev/null +++ b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/OauthClientApplication.java @@ -0,0 +1,24 @@ +package com.baeldung.webclient.authorizationcodelogin; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.PropertySource; + +/** + * + * Note: This app is configured to use the authorization service and the resource service located in module spring-5-security-oauth + * + * As we usually do with other well-known auth providers (github/facebook/...) we have to log-in using user credentials (bael-user/bael-password) and client configurations (bael-client-id/bael-secret) handled by the auth server + * + * @author rozagerardo + * + */ +@PropertySource("classpath:webclient-auth-code-login-application.properties") +@SpringBootApplication +public class OauthClientApplication { + + public static void main(String[] args) { + SpringApplication.run(OauthClientApplication.class, args); + } + +} diff --git a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/configuration/WebClientConfig.java b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/configuration/WebClientConfig.java new file mode 100644 index 0000000000..15458cc60a --- /dev/null +++ b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/configuration/WebClientConfig.java @@ -0,0 +1,31 @@ +package com.baeldung.webclient.authorizationcodelogin.configuration; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository; +import org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction; +import org.springframework.security.oauth2.client.web.server.ServerOAuth2AuthorizedClientRepository; +import org.springframework.web.reactive.function.client.WebClient; + +@Configuration +public class WebClientConfig { + + @Bean + @Primary + WebClient webClientForAuthorized(ReactiveClientRegistrationRepository clientRegistrations, ServerOAuth2AuthorizedClientRepository authorizedClients) { + ServerOAuth2AuthorizedClientExchangeFilterFunction oauth = new ServerOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrations, authorizedClients); + oauth.setDefaultOAuth2AuthorizedClient(true); + return WebClient.builder() + .filter(oauth) + .build(); + } + + @Bean + WebClient otherWebClient(ReactiveClientRegistrationRepository clientRegistrations, ServerOAuth2AuthorizedClientRepository authorizedClients) { + ServerOAuth2AuthorizedClientExchangeFilterFunction oauth = new ServerOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrations, authorizedClients); + return WebClient.builder() + .filter(oauth) + .build(); + } +} diff --git a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/configuration/WebSecurityConfig.java b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/configuration/WebSecurityConfig.java new file mode 100644 index 0000000000..f45fc09222 --- /dev/null +++ b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/configuration/WebSecurityConfig.java @@ -0,0 +1,20 @@ +package com.baeldung.webclient.authorizationcodelogin.configuration; + +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; + +@Configuration +public class WebSecurityConfig { + @Bean + public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { + http.authorizeExchange() + .anyExchange() + .authenticated() + .and() + .oauth2Login(); + return http.build(); + } + +} diff --git a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/web/ClientRestController.java b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/web/ClientRestController.java new file mode 100644 index 0000000000..55e0096525 --- /dev/null +++ b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/web/ClientRestController.java @@ -0,0 +1,68 @@ +package com.baeldung.webclient.authorizationcodelogin.web; + +import static org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction.clientRegistrationId; +import static org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction.oauth2AuthorizedClient; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.security.oauth2.client.OAuth2AuthorizedClient; +import org.springframework.security.oauth2.client.annotation.RegisteredOAuth2AuthorizedClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.reactive.function.client.WebClient; + +import reactor.core.publisher.Mono; + +@RestController +public class ClientRestController { + + private static final String RESOURCE_URI = "http://localhost:8084/retrieve-resource"; + + @Autowired + WebClient webClient; + + @Autowired + @Qualifier("otherWebClient") + WebClient otherWebClient; + + @GetMapping("/auth-code") + Mono useOauthWithAuthCode() { + Mono retrievedResource = webClient.get() + .uri(RESOURCE_URI) + .retrieve() + .bodyToMono(String.class); + return retrievedResource.map(string -> "We retrieved the following resource using Oauth: " + string); + } + + @GetMapping("/auth-code-no-client") + Mono useOauthWithNoClient() { + // This call will fail, since we don't have the client properly set for this webClient + Mono retrievedResource = otherWebClient.get() + .uri(RESOURCE_URI) + .retrieve() + .bodyToMono(String.class); + return retrievedResource.map(string -> "We retrieved the following resource using Oauth: " + string); + } + + @GetMapping("/auth-code-annotated") + Mono useOauthWithAuthCodeAndAnnotation(@RegisteredOAuth2AuthorizedClient("bael") OAuth2AuthorizedClient authorizedClient) { + Mono retrievedResource = otherWebClient.get() + .uri(RESOURCE_URI) + .attributes(oauth2AuthorizedClient(authorizedClient)) + .retrieve() + .bodyToMono(String.class); + return retrievedResource.map(string -> "We retrieved the following resource using Oauth: " + string + ". Principal associated: " + authorizedClient.getPrincipalName() + ". Token will expire at: " + authorizedClient.getAccessToken() + .getExpiresAt()); + } + + @GetMapping("/auth-code-explicit-client") + Mono useOauthWithExpicitClient() { + Mono retrievedResource = otherWebClient.get() + .uri(RESOURCE_URI) + .attributes(clientRegistrationId("bael")) + .retrieve() + .bodyToMono(String.class); + return retrievedResource.map(string -> "We retrieved the following resource using Oauth: " + string); + } + +} diff --git a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/clientcredentials/ClientCredentialsOauthApplication.java b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/clientcredentials/ClientCredentialsOauthApplication.java new file mode 100644 index 0000000000..d1b9f7f744 --- /dev/null +++ b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/clientcredentials/ClientCredentialsOauthApplication.java @@ -0,0 +1,26 @@ +package com.baeldung.webclient.clientcredentials; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.PropertySource; +import org.springframework.scheduling.annotation.EnableScheduling; + +/** + * + * Note: This app is configured to use the authorization service and the resource service located in module spring-5-security-oauth + * + * As we usually do with other well-known auth providers (github/facebook/...) we have to log-in using credentials handled by the auth server (bael-user/bael-password) + * + * @author rozagerardo + * + */ +@PropertySource("classpath:webclient-client-credentials-oauth-application.properties") +@EnableScheduling +@SpringBootApplication +public class ClientCredentialsOauthApplication { + + public static void main(String[] args) { + SpringApplication.run(ClientCredentialsOauthApplication.class, args); + } + +} diff --git a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/clientcredentials/configuration/WebClientConfig.java b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/clientcredentials/configuration/WebClientConfig.java new file mode 100644 index 0000000000..8ffc92b4cd --- /dev/null +++ b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/clientcredentials/configuration/WebClientConfig.java @@ -0,0 +1,22 @@ +package com.baeldung.webclient.clientcredentials.configuration; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository; +import org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction; +import org.springframework.security.oauth2.client.web.server.UnAuthenticatedServerOAuth2AuthorizedClientRepository; +import org.springframework.web.reactive.function.client.WebClient; + +@Configuration +public class WebClientConfig { + + @Bean + WebClient webClient(ReactiveClientRegistrationRepository clientRegistrations) { + ServerOAuth2AuthorizedClientExchangeFilterFunction oauth = new ServerOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrations, new UnAuthenticatedServerOAuth2AuthorizedClientRepository()); + oauth.setDefaultClientRegistrationId("bael"); + return WebClient.builder() + .filter(oauth) + .build(); + } + +} diff --git a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/clientcredentials/service/WebClientChonJob.java b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/clientcredentials/service/WebClientChonJob.java new file mode 100644 index 0000000000..dc38ce3f9e --- /dev/null +++ b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/clientcredentials/service/WebClientChonJob.java @@ -0,0 +1,33 @@ +package com.baeldung.webclient.clientcredentials.service; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.security.oauth2.client.OAuth2AuthorizedClient; +import org.springframework.security.oauth2.client.annotation.RegisteredOAuth2AuthorizedClient; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.WebClient; + +@Component +public class WebClientChonJob { + + Logger logger = LoggerFactory.getLogger(WebClientChonJob.class); + + private static final String RESOURCE_URI = "http://localhost:8084/retrieve-resource"; + + @Autowired + private WebClient webClient; + + @Scheduled(fixedRate = 1000) + public void logResourceServiceResponse() { + + webClient.get() + .uri(RESOURCE_URI) + .retrieve() + .bodyToMono(String.class) + .map(string -> "We retrieved the following resource using Client Credentials Grant Type: " + string) + .subscribe(logger::info); + } + +} diff --git a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/ManualRequestApplication.java b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/ManualRequestApplication.java new file mode 100644 index 0000000000..c2762ad559 --- /dev/null +++ b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/ManualRequestApplication.java @@ -0,0 +1,23 @@ +package com.baeldung.webclient.manualrequest; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.PropertySource; + +/** + * + * Note: This app is configured to use the authorization service and the resource service located in module spring-5-security-oauth + * + * As we usually do with other well-known auth providers (github/facebook/...) we have to log-in using user credentials (bael-user/bael-password) and client configurations (bael-client-id/bael-secret) handled by the auth server + * + * @author rozagerardo + * + */ +@SpringBootApplication +public class ManualRequestApplication { + + public static void main(String[] args) { + SpringApplication.run(ManualRequestApplication.class, args); + } + +} diff --git a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/configure/WebClientConfig.java b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/configure/WebClientConfig.java new file mode 100644 index 0000000000..51fc60821a --- /dev/null +++ b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/configure/WebClientConfig.java @@ -0,0 +1,16 @@ +package com.baeldung.webclient.manualrequest.configure; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.reactive.function.client.WebClient; + +@Configuration +public class WebClientConfig { + + @Bean + public WebClient configureWebClient() { + return WebClient.builder() + .build(); + }; + +} diff --git a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/configure/WebSecurityConfig.java b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/configure/WebSecurityConfig.java new file mode 100644 index 0000000000..1753681db8 --- /dev/null +++ b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/configure/WebSecurityConfig.java @@ -0,0 +1,17 @@ +package com.baeldung.webclient.manualrequest.configure; + +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; + +@Configuration +public class WebSecurityConfig { + @Bean + public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { + http.authorizeExchange() + .anyExchange() + .permitAll(); + return http.build(); + } +} diff --git a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/web/ManualOauthRequestController.java b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/web/ManualOauthRequestController.java new file mode 100644 index 0000000000..9f9d6d3167 --- /dev/null +++ b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/web/ManualOauthRequestController.java @@ -0,0 +1,57 @@ +package com.baeldung.webclient.manualrequest.web; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; +import org.springframework.util.Base64Utils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.client.WebClient; + +import com.fasterxml.jackson.databind.JsonNode; +import com.nimbusds.oauth2.sdk.GrantType; + +import reactor.core.publisher.Mono; + +@RestController +public class ManualOauthRequestController { + + private static Logger logger = LoggerFactory.getLogger(ManualOauthRequestController.class); + + private static final String TOKEN_ENDPOINT = "localhost:8085/oauth/token"; + private static final String RESOURCE_ENDPOINT = "localhost:8084/retrieve-resource"; + private static final String CLIENT_ID = "bael-client-id"; + private static final String CLIENT_SECRET = "bael-secret"; + + @Autowired + WebClient client; + + @GetMapping("/manual-request-oauth") + public Mono obtainSecuredResource() { + logger.info("Creating web client..."); + Mono resource = client.post() + .uri(TOKEN_ENDPOINT) + .header(HttpHeaders.AUTHORIZATION, "Basic " + Base64Utils.encodeToString((CLIENT_ID + ":" + CLIENT_SECRET).getBytes())) + .body(BodyInserters.fromFormData(OAuth2ParameterNames.GRANT_TYPE, GrantType.CLIENT_CREDENTIALS.getValue())) + .retrieve() + .bodyToMono(JsonNode.class) + .flatMap(tokenResponse -> { + String accessTokenValue = tokenResponse.get("access_token") + .textValue(); + logger.info("Retrieved the following access token: {}", accessTokenValue); + return client.get() + .uri(RESOURCE_ENDPOINT) + .headers(h -> h.setBearerAuth(accessTokenValue)) + .retrieve() + .bodyToMono(String.class); + }); + logger.info("non-blocking Oauth calls registered..."); + return resource.map(res -> "Retrieved the resource using a manual approach: " + res); + + } + +} diff --git a/spring-5-reactive-oauth/src/main/resources/application.yml b/spring-5-reactive-oauth/src/main/resources/application.yml index e35e19b344..bec62fdd33 100644 --- a/spring-5-reactive-oauth/src/main/resources/application.yml +++ b/spring-5-reactive-oauth/src/main/resources/application.yml @@ -1,20 +1,3 @@ -spring: - security: - oauth2: - client: - registration: - google: - client-id: YOUR_APP_CLIENT_ID - client-secret: YOUR_APP_CLIENT_SECRET - custom: - client-id: fooClientIdPassword - client-secret: secret - scopes: read,foo - authorization-grant-type: authorization_code - redirect-uri-template: http://localhost:8080/login/oauth2/code/custom - provider: - custom: - authorization-uri: http://localhost:8081/spring-security-oauth-server/oauth/authorize - token-uri: http://localhost:8081/spring-security-oauth-server/oauth/token - user-info-uri: http://localhost:8088/spring-security-oauth-resource/users/extra - user-name-attribute: user_name \ No newline at end of file +logging: + level: + root: DEBUG \ No newline at end of file diff --git a/spring-5-reactive-oauth/src/main/resources/default-application.yml b/spring-5-reactive-oauth/src/main/resources/default-application.yml new file mode 100644 index 0000000000..e35e19b344 --- /dev/null +++ b/spring-5-reactive-oauth/src/main/resources/default-application.yml @@ -0,0 +1,20 @@ +spring: + security: + oauth2: + client: + registration: + google: + client-id: YOUR_APP_CLIENT_ID + client-secret: YOUR_APP_CLIENT_SECRET + custom: + client-id: fooClientIdPassword + client-secret: secret + scopes: read,foo + authorization-grant-type: authorization_code + redirect-uri-template: http://localhost:8080/login/oauth2/code/custom + provider: + custom: + authorization-uri: http://localhost:8081/spring-security-oauth-server/oauth/authorize + token-uri: http://localhost:8081/spring-security-oauth-server/oauth/token + user-info-uri: http://localhost:8088/spring-security-oauth-resource/users/extra + user-name-attribute: user_name \ No newline at end of file diff --git a/spring-5-reactive-oauth/src/main/resources/webclient-auth-code-client-application.properties b/spring-5-reactive-oauth/src/main/resources/webclient-auth-code-client-application.properties new file mode 100644 index 0000000000..612777a06d --- /dev/null +++ b/spring-5-reactive-oauth/src/main/resources/webclient-auth-code-client-application.properties @@ -0,0 +1,10 @@ +spring.security.oauth2.client.registration.bael.client-name=bael +spring.security.oauth2.client.registration.bael.client-id=bael-client-id +spring.security.oauth2.client.registration.bael.client-secret=bael-secret +spring.security.oauth2.client.registration.bael.authorization-grant-type=authorization_code +spring.security.oauth2.client.registration.bael.redirect-uri=http://localhost:8080/authorize/oauth2/code/bael + +spring.security.oauth2.client.provider.bael.token-uri=http://localhost:8085/oauth/token +spring.security.oauth2.client.provider.bael.authorization-uri=http://localhost:8085/oauth/authorize + +spring.security.user.password=pass diff --git a/spring-5-reactive-oauth/src/main/resources/webclient-auth-code-login-application.properties b/spring-5-reactive-oauth/src/main/resources/webclient-auth-code-login-application.properties new file mode 100644 index 0000000000..edd5b80b13 --- /dev/null +++ b/spring-5-reactive-oauth/src/main/resources/webclient-auth-code-login-application.properties @@ -0,0 +1,10 @@ +spring.security.oauth2.client.registration.bael.client-name=bael +spring.security.oauth2.client.registration.bael.client-id=bael-client-id +spring.security.oauth2.client.registration.bael.client-secret=bael-secret +spring.security.oauth2.client.registration.bael.authorization-grant-type=authorization_code +spring.security.oauth2.client.registration.bael.redirect-uri=http://localhost:8080/login/oauth2/code/bael + +spring.security.oauth2.client.provider.bael.token-uri=http://localhost:8085/oauth/token +spring.security.oauth2.client.provider.bael.authorization-uri=http://localhost:8085/oauth/authorize +spring.security.oauth2.client.provider.bael.user-info-uri=http://localhost:8084/user +spring.security.oauth2.client.provider.bael.user-name-attribute=name diff --git a/spring-5-reactive-oauth/src/main/resources/webclient-client-credentials-oauth-application.properties b/spring-5-reactive-oauth/src/main/resources/webclient-client-credentials-oauth-application.properties new file mode 100644 index 0000000000..f82f74ec48 --- /dev/null +++ b/spring-5-reactive-oauth/src/main/resources/webclient-client-credentials-oauth-application.properties @@ -0,0 +1,4 @@ +spring.security.oauth2.client.registration.bael.authorization-grant-type=client_credentials +spring.security.oauth2.client.registration.bael.client-id=bael-client-id +spring.security.oauth2.client.registration.bael.client-secret=bael-secret +spring.security.oauth2.client.provider.bael.token-uri=http://localhost:8085/oauth/token diff --git a/spring-5-reactive-oauth/src/test/java/com/baeldung/webclient/clientcredentials/OAuth2ClientCredentialsLiveTest.java b/spring-5-reactive-oauth/src/test/java/com/baeldung/webclient/clientcredentials/OAuth2ClientCredentialsLiveTest.java new file mode 100644 index 0000000000..e31815c3f8 --- /dev/null +++ b/spring-5-reactive-oauth/src/test/java/com/baeldung/webclient/clientcredentials/OAuth2ClientCredentialsLiveTest.java @@ -0,0 +1,52 @@ +package com.baeldung.webclient.clientcredentials; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Collection; +import java.util.stream.Collectors; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.webclient.clientcredentials.service.WebClientChonJob; +import com.baeldung.webclient.utils.ListAppender; + +import ch.qos.logback.classic.spi.ILoggingEvent; + +/** + * + * Note: this Live test requires the Authorization Service and the Resource service located in the spring-5-security-oauth module + * + * @author ger + * + */ +@RunWith(SpringRunner.class) +@SpringBootTest(classes = { ClientCredentialsOauthApplication.class }) +public class OAuth2ClientCredentialsLiveTest { + + @Autowired + WebClientChonJob service; + + @Before + public void clearLogList() { + ListAppender.clearEventList(); + } + + @Test + public void givenFooWithNullId_whenProcessFoo_thenLogsWithDebugTrace() throws Exception { + service.logResourceServiceResponse(); + + Thread.sleep(3000); + + Collection allLoggedEntries = ListAppender.getEvents() + .stream() + .map(ILoggingEvent::getFormattedMessage) + .collect(Collectors.toList()); + assertThat(allLoggedEntries).anyMatch(entry -> entry.contains("We retrieved the following resource using Client Credentials Grant Type: This is the resource!")); + } + +} diff --git a/spring-5-reactive-oauth/src/test/java/com/baeldung/webclient/manualrequest/OAuth2ManualRequestLiveTest.java b/spring-5-reactive-oauth/src/test/java/com/baeldung/webclient/manualrequest/OAuth2ManualRequestLiveTest.java new file mode 100644 index 0000000000..94aa580f0a --- /dev/null +++ b/spring-5-reactive-oauth/src/test/java/com/baeldung/webclient/manualrequest/OAuth2ManualRequestLiveTest.java @@ -0,0 +1,43 @@ +package com.baeldung.webclient.manualrequest; + +import org.junit.Before; +import org.junit.Test; +import org.springframework.test.web.reactive.server.WebTestClient; +import org.springframework.test.web.reactive.server.WebTestClient.ResponseSpec; + +/** + * + * Note: this Live test requires not only the corresponding application running, + * but also the Authorization Service and the Resource service located in the spring-5-security-oauth module. + * + * + * @author ger + * + */ +public class OAuth2ManualRequestLiveTest { + + private static final String BASE_URL = "http://localhost:8080"; + private static final String MANUAL_REQUEST_URI = "/manual-request-oauth"; + + private static WebTestClient client; + + @Before + public void setup() { + client = WebTestClient.bindToServer() + .baseUrl(BASE_URL) + .build(); + } + + @Test + public void whenRequestingDebugHookOn_thenObtainExpectedMessage() { + ResponseSpec response = client.get() + .uri(MANUAL_REQUEST_URI) + .exchange(); + + response.expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("Retrieved the resource using a manual approach: This is the resource!"); + } + +} diff --git a/spring-5-reactive-oauth/src/test/java/com/baeldung/webclient/utils/ListAppender.java b/spring-5-reactive-oauth/src/test/java/com/baeldung/webclient/utils/ListAppender.java new file mode 100644 index 0000000000..6f8fbe004a --- /dev/null +++ b/spring-5-reactive-oauth/src/test/java/com/baeldung/webclient/utils/ListAppender.java @@ -0,0 +1,25 @@ +package com.baeldung.webclient.utils; + +import java.util.ArrayList; +import java.util.List; + +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.AppenderBase; + +public class ListAppender extends AppenderBase { + + static private List events = new ArrayList<>(); + + @Override + protected void append(ILoggingEvent eventObject) { + events.add(eventObject); + } + + public static List getEvents() { + return events; + } + + public static void clearEventList() { + events.clear(); + } +} \ No newline at end of file diff --git a/spring-5-reactive-oauth/src/test/resources/logback-test.xml b/spring-5-reactive-oauth/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..891c54bfd3 --- /dev/null +++ b/spring-5-reactive-oauth/src/test/resources/logback-test.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/SpringOAuthApplication.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/SpringOAuthApplication.java index 557c23b368..1478b03d2e 100644 --- a/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/SpringOAuthApplication.java +++ b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/SpringOAuthApplication.java @@ -2,7 +2,9 @@ package com.baeldung.oauth2; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.PropertySource; +@PropertySource("classpath:default-application.properties") @SpringBootApplication public class SpringOAuthApplication { diff --git a/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/ExtractorsApplication.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/ExtractorsApplication.java index 6ab4d525bf..174e5b0fdf 100644 --- a/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/ExtractorsApplication.java +++ b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/ExtractorsApplication.java @@ -3,10 +3,12 @@ package com.baeldung.oauth2extractors; import org.apache.logging.log4j.util.Strings; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.AbstractEnvironment; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; +@PropertySource("classpath:default-application.properties") @SpringBootApplication @Controller public class ExtractorsApplication { diff --git a/spring-5-security-oauth/src/main/java/com/baeldung/webclient/authorizationserver/AuthorizationServerApplication.java b/spring-5-security-oauth/src/main/java/com/baeldung/webclient/authorizationserver/AuthorizationServerApplication.java new file mode 100644 index 0000000000..d72704386c --- /dev/null +++ b/spring-5-security-oauth/src/main/java/com/baeldung/webclient/authorizationserver/AuthorizationServerApplication.java @@ -0,0 +1,17 @@ +package com.baeldung.webclient.authorizationserver; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.PropertySource; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; + +@EnableAuthorizationServer +@PropertySource("classpath:webclient-authorization-application.properties") +@SpringBootApplication +public class AuthorizationServerApplication { + + public static void main(String[] args) { + SpringApplication.run(AuthorizationServerApplication.class, args); + } + +} diff --git a/spring-5-security-oauth/src/main/java/com/baeldung/webclient/authorizationserver/configuration/WebSecurityConfig.java b/spring-5-security-oauth/src/main/java/com/baeldung/webclient/authorizationserver/configuration/WebSecurityConfig.java new file mode 100644 index 0000000000..5dd15f1b8c --- /dev/null +++ b/spring-5-security-oauth/src/main/java/com/baeldung/webclient/authorizationserver/configuration/WebSecurityConfig.java @@ -0,0 +1,26 @@ +package com.baeldung.webclient.authorizationserver.configuration; + +import org.springframework.context.annotation.Configuration; +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; + +@EnableWebSecurity +@Configuration +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.authorizeRequests() + .antMatchers("/login", "/user") + .permitAll() + .and() + .authorizeRequests() + .anyRequest() + .authenticated() + .and() + .formLogin() + .and() + .httpBasic(); + } +} diff --git a/spring-5-security-oauth/src/main/java/com/baeldung/webclient/resourceserver/ResourceServerApplication.java b/spring-5-security-oauth/src/main/java/com/baeldung/webclient/resourceserver/ResourceServerApplication.java new file mode 100644 index 0000000000..50ad293ef8 --- /dev/null +++ b/spring-5-security-oauth/src/main/java/com/baeldung/webclient/resourceserver/ResourceServerApplication.java @@ -0,0 +1,17 @@ +package com.baeldung.webclient.resourceserver; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.PropertySource; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; + +@EnableResourceServer +@PropertySource("webclient-resources-application.properties") +@SpringBootApplication +public class ResourceServerApplication { + + public static void main(String[] args) { + SpringApplication.run(ResourceServerApplication.class, args); + } + +} diff --git a/spring-5-security-oauth/src/main/java/com/baeldung/webclient/resourceserver/configuration/AuthorizationConfigs.java b/spring-5-security-oauth/src/main/java/com/baeldung/webclient/resourceserver/configuration/AuthorizationConfigs.java new file mode 100644 index 0000000000..5aea1983db --- /dev/null +++ b/spring-5-security-oauth/src/main/java/com/baeldung/webclient/resourceserver/configuration/AuthorizationConfigs.java @@ -0,0 +1,29 @@ +package com.baeldung.webclient.resourceserver.configuration; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.oauth2.provider.token.RemoteTokenServices; +import org.springframework.security.oauth2.provider.token.ResourceServerTokenServices; + +@Configuration +public class AuthorizationConfigs { + + @Value("${oauth.authserver.client-id}") + String clientId; + + @Value("${oauth.authserver.client-secret}") + String clientSecret; + + @Value("${oauth.authserver.check-token-endpoint}") + String checkTokenEndpoint; + + @Bean + public ResourceServerTokenServices tokenSvc() { + RemoteTokenServices remoteService = new RemoteTokenServices(); + remoteService.setCheckTokenEndpointUrl(checkTokenEndpoint); + remoteService.setClientId(clientId); + remoteService.setClientSecret(clientSecret); + return remoteService; + } +} diff --git a/spring-5-security-oauth/src/main/java/com/baeldung/webclient/resourceserver/web/ResourceRestController.java b/spring-5-security-oauth/src/main/java/com/baeldung/webclient/resourceserver/web/ResourceRestController.java new file mode 100644 index 0000000000..aef0fb4d7d --- /dev/null +++ b/spring-5-security-oauth/src/main/java/com/baeldung/webclient/resourceserver/web/ResourceRestController.java @@ -0,0 +1,23 @@ +package com.baeldung.webclient.resourceserver.web; + +import java.security.Principal; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class ResourceRestController { + + @GetMapping("/retrieve-resource") + public String retrieveResource() { + return "This is the resource!"; + } + + @GetMapping("/user") + @ResponseBody + public Principal user(Principal user) { + return user; + } + +} diff --git a/spring-5-security-oauth/src/main/resources/application.properties b/spring-5-security-oauth/src/main/resources/application.properties index 5912b0f755..c84e745918 100644 --- a/spring-5-security-oauth/src/main/resources/application.properties +++ b/spring-5-security-oauth/src/main/resources/application.properties @@ -1,5 +1,3 @@ -server.port=8081 - logging.level.root=INFO logging.level.com.baeldung.dsl.ClientErrorLoggingFilter=DEBUG \ No newline at end of file diff --git a/spring-5-security-oauth/src/main/resources/default-application.properties b/spring-5-security-oauth/src/main/resources/default-application.properties new file mode 100644 index 0000000000..bafddced85 --- /dev/null +++ b/spring-5-security-oauth/src/main/resources/default-application.properties @@ -0,0 +1 @@ +server.port=8081 \ No newline at end of file diff --git a/spring-5-security-oauth/src/main/resources/webclient-authorization-application.properties b/spring-5-security-oauth/src/main/resources/webclient-authorization-application.properties new file mode 100644 index 0000000000..9531045359 --- /dev/null +++ b/spring-5-security-oauth/src/main/resources/webclient-authorization-application.properties @@ -0,0 +1,13 @@ +server.port=8085 + +security.oauth2.client.client-id=bael-client-id +security.oauth2.client.client-secret=bael-secret +security.oauth2.client.scope=read,write + +security.oauth2.authorization.check-token-access=isAuthenticated() + +spring.security.user.name=bael-user +spring.security.user.password=bael-password + +security.oauth2.client.registered-redirect-uri=http://localhost:8080/login/oauth2/code/bael, http://localhost:8080/authorize/oauth2/code/bael +security.oauth2.client.use-current-uri=false \ No newline at end of file diff --git a/spring-5-security-oauth/src/main/resources/webclient-resources-application.properties b/spring-5-security-oauth/src/main/resources/webclient-resources-application.properties new file mode 100644 index 0000000000..1cfb9ca12d --- /dev/null +++ b/spring-5-security-oauth/src/main/resources/webclient-resources-application.properties @@ -0,0 +1,6 @@ +server.port=8084 + +#spring.security.oauth2.resourceserver.jwt.issuer-uri=localhost:8085 +oauth.authserver.client-id=bael-client-id +oauth.authserver.client-secret=bael-secret +oauth.authserver.check-token-endpoint=http://localhost:8085/oauth/check_token From eacc84a450dad6e85354ea7e3acf72e902dcae19 Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Thu, 3 Jan 2019 08:08:25 +0530 Subject: [PATCH 254/359] BAEL-2536-added-unit-tests-for-panagram --- .../com/baeldung/string/PanagramUnitTest.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 java-strings/src/test/java/com/baeldung/string/PanagramUnitTest.java diff --git a/java-strings/src/test/java/com/baeldung/string/PanagramUnitTest.java b/java-strings/src/test/java/com/baeldung/string/PanagramUnitTest.java new file mode 100644 index 0000000000..81d46956e2 --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/PanagramUnitTest.java @@ -0,0 +1,44 @@ +package com.baeldung.string; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import org.junit.Test; + + +public class PanagramUnitTest { + + @Test + public void givenValidString_isPanagram_shouldReturnSuccess() { + String input = "Two driven jocks help fax my big quiz"; + assertTrue(Panagram.isPanagram(input)); + assertTrue(Panagram.isPanagramWithStreams(input)); + } + + @Test + public void givenNullString_isPanagram_shouldReturnFailure() { + String input = null; + assertFalse(Panagram.isPanagram(input)); + assertFalse(Panagram.isPanagramWithStreams(input)); + assertFalse(Panagram.isPerfectPanagram(input)); + } + + @Test + public void givenPerfectPanagramString_isPerfectPanagram_shouldReturnSuccess() { + String input = "abcdefghijklmNoPqrStuVwxyz"; + assertTrue(Panagram.isPerfectPanagram(input)); + } + + @Test + public void givenNonPanagramString_isPanagram_shouldReturnFailure() { + String input = "invalid panagram"; + assertFalse(Panagram.isPanagram(input)); + assertFalse(Panagram.isPanagramWithStreams(input)); + } + + @Test + public void givenPanagram_isPerfectPanagram_shouldReturnFailure() { + String input = "Two driven jocks help fax my big quiz"; + assertFalse(Panagram.isPerfectPanagram(input)); + } + +} From 34b90a33aac7df4feae5867355d72bb54ed4a045 Mon Sep 17 00:00:00 2001 From: Krzysztof Majewski Date: Thu, 3 Jan 2019 14:15:43 +0100 Subject: [PATCH 255/359] BAEL-2483 --- .../java/com/baeldung/annotation/MyBean.java | 26 +++++++++++++++++++ .../com/baeldung/annotation/TestBean.java | 8 ++++++ 2 files changed, 34 insertions(+) create mode 100644 spring-core/src/main/java/com/baeldung/annotation/MyBean.java create mode 100644 spring-core/src/main/java/com/baeldung/annotation/TestBean.java diff --git a/spring-core/src/main/java/com/baeldung/annotation/MyBean.java b/spring-core/src/main/java/com/baeldung/annotation/MyBean.java new file mode 100644 index 0000000000..9a1fd3beec --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/annotation/MyBean.java @@ -0,0 +1,26 @@ +package com.baeldung.annotation; + +import org.springframework.stereotype.Component; +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; + +@Component +public class MyBean { + + private final TestBean testBean; + + public MyBean(TestBean testBean) { + this.testBean = testBean; + System.out.println("Hello from constructor"); + } + + @PostConstruct + private void postConstruct() { + System.out.println("Hello from @PostConstruct method"); + } + + @PreDestroy + public void preDestroy() { + System.out.println("Bean is being destroyed"); + } +} \ No newline at end of file diff --git a/spring-core/src/main/java/com/baeldung/annotation/TestBean.java b/spring-core/src/main/java/com/baeldung/annotation/TestBean.java new file mode 100644 index 0000000000..0539e10751 --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/annotation/TestBean.java @@ -0,0 +1,8 @@ +package com.baeldung.annotation; + +import org.springframework.stereotype.Component; + +@Component +public class TestBean { + +} \ No newline at end of file From bdcc961542282c5411d2ad7e6196dccccb9e075f Mon Sep 17 00:00:00 2001 From: ramansahasi Date: Thu, 3 Jan 2019 20:19:51 +0530 Subject: [PATCH 256/359] BAEL-2392_Java_String_interview_questions second commit (#6064) --- .../string/interview/LocaleUnitTest.java | 19 +++++++++++ .../interview/StringAnagramUnitTest.java | 29 +++++++++++++++++ .../interview/StringChangeCaseUnitTest.java | 20 ++++++++++++ .../StringCountOccurrencesUnitTest.java | 28 ++++++++++++++++ .../interview/StringFormatUnitTest.java | 14 ++++++++ .../interview/StringInternUnitTest.java | 17 ++++++++++ .../interview/StringJoinerUnitTest.java | 18 +++++++++++ .../interview/StringPalindromeUnitTest.java | 29 +++++++++++++++++ .../interview/StringReverseUnitTest.java | 13 ++++++++ .../string/interview/StringSplitUnitTest.java | 32 +++++++++++++++++++ .../interview/StringToByteArrayUnitTest.java | 24 ++++++++++++++ .../interview/StringToCharArrayUnitTest.java | 17 ++++++++++ .../interview/StringToIntegerUnitTest.java | 15 +++++++++ 13 files changed, 275 insertions(+) create mode 100644 java-strings/src/test/java/com/baeldung/string/interview/LocaleUnitTest.java create mode 100644 java-strings/src/test/java/com/baeldung/string/interview/StringAnagramUnitTest.java create mode 100644 java-strings/src/test/java/com/baeldung/string/interview/StringChangeCaseUnitTest.java create mode 100644 java-strings/src/test/java/com/baeldung/string/interview/StringCountOccurrencesUnitTest.java create mode 100644 java-strings/src/test/java/com/baeldung/string/interview/StringFormatUnitTest.java create mode 100644 java-strings/src/test/java/com/baeldung/string/interview/StringInternUnitTest.java create mode 100644 java-strings/src/test/java/com/baeldung/string/interview/StringJoinerUnitTest.java create mode 100644 java-strings/src/test/java/com/baeldung/string/interview/StringPalindromeUnitTest.java create mode 100644 java-strings/src/test/java/com/baeldung/string/interview/StringReverseUnitTest.java create mode 100644 java-strings/src/test/java/com/baeldung/string/interview/StringSplitUnitTest.java create mode 100644 java-strings/src/test/java/com/baeldung/string/interview/StringToByteArrayUnitTest.java create mode 100644 java-strings/src/test/java/com/baeldung/string/interview/StringToCharArrayUnitTest.java create mode 100644 java-strings/src/test/java/com/baeldung/string/interview/StringToIntegerUnitTest.java diff --git a/java-strings/src/test/java/com/baeldung/string/interview/LocaleUnitTest.java b/java-strings/src/test/java/com/baeldung/string/interview/LocaleUnitTest.java new file mode 100644 index 0000000000..1d221056fd --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/interview/LocaleUnitTest.java @@ -0,0 +1,19 @@ +package com.baeldung.string.interview; + +import java.math.BigDecimal; +import java.text.NumberFormat; +import java.util.Locale; +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class LocaleUnitTest { + @Test + public void whenUsingLocal_thenCorrectResultsForDifferentLocale() { + Locale usLocale = Locale.US; + BigDecimal number = new BigDecimal(102_300.456d); + + NumberFormat usNumberFormat = NumberFormat.getCurrencyInstance(usLocale); + assertEquals(usNumberFormat.format(number), "$102,300.46"); + } +} diff --git a/java-strings/src/test/java/com/baeldung/string/interview/StringAnagramUnitTest.java b/java-strings/src/test/java/com/baeldung/string/interview/StringAnagramUnitTest.java new file mode 100644 index 0000000000..aadfade737 --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/interview/StringAnagramUnitTest.java @@ -0,0 +1,29 @@ +package com.baeldung.string.interview; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Arrays; + +import org.junit.Test; + +public class StringAnagramUnitTest { + public boolean isAnagram(String s1, String s2) { + if(s1.length() != s2.length()) + return false; + + char[] arr1 = s1.toCharArray(); + char[] arr2 = s2.toCharArray(); + + Arrays.sort(arr1); + Arrays.sort(arr2); + + return Arrays.equals(arr1, arr2); + } + + @Test + public void whenTestAnagrams_thenTestingCorrectly() { + assertThat(isAnagram("car", "arc")).isTrue(); + assertThat(isAnagram("west", "stew")).isTrue(); + assertThat(isAnagram("west", "east")).isFalse(); + } +} diff --git a/java-strings/src/test/java/com/baeldung/string/interview/StringChangeCaseUnitTest.java b/java-strings/src/test/java/com/baeldung/string/interview/StringChangeCaseUnitTest.java new file mode 100644 index 0000000000..2c7ec500fe --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/interview/StringChangeCaseUnitTest.java @@ -0,0 +1,20 @@ +package com.baeldung.string.interview; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class StringChangeCaseUnitTest { + @Test + public void givenString_whenChangingToUppercase_thenCaseChanged() { + String s = "Welcome to Baeldung!"; + assertEquals("WELCOME TO BAELDUNG!", s.toUpperCase()); + } + + + @Test + public void givenString_whenChangingToLowerrcase_thenCaseChanged() { + String s = "Welcome to Baeldung!"; + assertEquals("welcome to baeldung!", s.toLowerCase()); + } +} diff --git a/java-strings/src/test/java/com/baeldung/string/interview/StringCountOccurrencesUnitTest.java b/java-strings/src/test/java/com/baeldung/string/interview/StringCountOccurrencesUnitTest.java new file mode 100644 index 0000000000..6c17643ac8 --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/interview/StringCountOccurrencesUnitTest.java @@ -0,0 +1,28 @@ +package com.baeldung.string.interview; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class StringCountOccurrencesUnitTest { + public int countOccurrences(String s, char c) { + int count = 0; + for (int i = 0; i < s.length(); i++) { + if (s.charAt(i) == c) { + count++; + } + } + return count; + } + + @Test + public void givenString_whenCountingFrequencyOfChar_thenCountCorrect() { + assertEquals(3, countOccurrences("united states", 't')); + } + + public void givenString_whenUsingJava8_thenCountingOfCharCorrect() { + String str = "united states"; + long count = str.chars().filter(ch -> (char)ch == 't').count(); + assertEquals(3, count); + } +} diff --git a/java-strings/src/test/java/com/baeldung/string/interview/StringFormatUnitTest.java b/java-strings/src/test/java/com/baeldung/string/interview/StringFormatUnitTest.java new file mode 100644 index 0000000000..787017791c --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/interview/StringFormatUnitTest.java @@ -0,0 +1,14 @@ +package com.baeldung.string.interview; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class StringFormatUnitTest { + @Test + public void givenString_whenUsingStringFormat_thenStringFormatted() { + String title = "Baeldung"; + String formatted = String.format("Title is %s", title); + assertEquals(formatted, "Title is Baeldung"); + } +} diff --git a/java-strings/src/test/java/com/baeldung/string/interview/StringInternUnitTest.java b/java-strings/src/test/java/com/baeldung/string/interview/StringInternUnitTest.java new file mode 100644 index 0000000000..c5bffb7573 --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/interview/StringInternUnitTest.java @@ -0,0 +1,17 @@ +package com.baeldung.string.interview; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; + +public class StringInternUnitTest { + @Test + public void whenCallingStringIntern_thenStringsInterned() { + String s1 = "Baeldung"; + String s2 = new String("Baeldung"); + String s3 = new String("Baeldung").intern(); + + assertThat(s1 == s2).isFalse(); + assertThat(s1 == s3).isTrue(); + } +} diff --git a/java-strings/src/test/java/com/baeldung/string/interview/StringJoinerUnitTest.java b/java-strings/src/test/java/com/baeldung/string/interview/StringJoinerUnitTest.java new file mode 100644 index 0000000000..d44c7478e4 --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/interview/StringJoinerUnitTest.java @@ -0,0 +1,18 @@ +package com.baeldung.string.interview; + +import java.util.StringJoiner; +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class StringJoinerUnitTest { + @Test + public void whenUsingStringJoiner_thenStringsJoined() { + StringJoiner joiner = new StringJoiner(",", "[", "]"); + joiner.add("Red") + .add("Green") + .add("Blue"); + + assertEquals(joiner.toString(), "[Red,Green,Blue]"); + } +} diff --git a/java-strings/src/test/java/com/baeldung/string/interview/StringPalindromeUnitTest.java b/java-strings/src/test/java/com/baeldung/string/interview/StringPalindromeUnitTest.java new file mode 100644 index 0000000000..79ed14cd99 --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/interview/StringPalindromeUnitTest.java @@ -0,0 +1,29 @@ +package com.baeldung.string.interview; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; + +public class StringPalindromeUnitTest { + + public boolean isPalindrome(String text) { + int forward = 0; + int backward = text.length() - 1; + while (backward > forward) { + char forwardChar = text.charAt(forward++); + char backwardChar = text.charAt(backward--); + if (forwardChar != backwardChar) + return false; + } + return true; + } + + @Test + public void givenIsPalindromeMethod_whenCheckingString_thenFindIfPalindrome() { + assertThat(isPalindrome("madam")).isTrue(); + assertThat(isPalindrome("radar")).isTrue(); + assertThat(isPalindrome("level")).isTrue(); + + assertThat(isPalindrome("baeldung")).isFalse(); + } +} diff --git a/java-strings/src/test/java/com/baeldung/string/interview/StringReverseUnitTest.java b/java-strings/src/test/java/com/baeldung/string/interview/StringReverseUnitTest.java new file mode 100644 index 0000000000..bb9b45dc97 --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/interview/StringReverseUnitTest.java @@ -0,0 +1,13 @@ +package com.baeldung.string.interview; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class StringReverseUnitTest { + @Test + public void whenUsingInbuildMethods_thenStringReversed() { + String reversed = new StringBuilder("baeldung").reverse().toString(); + assertEquals("gnudleab", reversed); + } +} diff --git a/java-strings/src/test/java/com/baeldung/string/interview/StringSplitUnitTest.java b/java-strings/src/test/java/com/baeldung/string/interview/StringSplitUnitTest.java new file mode 100644 index 0000000000..e1cea62462 --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/interview/StringSplitUnitTest.java @@ -0,0 +1,32 @@ +package com.baeldung.string.interview; + +import org.apache.commons.lang3.StringUtils; +import org.junit.Test; +import static org.junit.Assert.assertArrayEquals; + +public class StringSplitUnitTest { + @Test + public void givenCoreJava_whenSplittingStrings_thenSplitted() { + String expected[] = { + "john", + "peter", + "mary" + }; + + String[] splitted = "john,peter,mary".split(","); + assertArrayEquals( expected, splitted ); + } + + @Test + public void givenApacheCommons_whenSplittingStrings_thenSplitted() { + String expected[] = { + "john", + "peter", + "mary" + }; + String[] splitted = StringUtils.split("john peter mary"); + assertArrayEquals( expected, splitted ); + } + + +} diff --git a/java-strings/src/test/java/com/baeldung/string/interview/StringToByteArrayUnitTest.java b/java-strings/src/test/java/com/baeldung/string/interview/StringToByteArrayUnitTest.java new file mode 100644 index 0000000000..aee4eedcd6 --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/interview/StringToByteArrayUnitTest.java @@ -0,0 +1,24 @@ +package com.baeldung.string.interview; + +import static org.junit.Assert.assertArrayEquals; + +import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; + +import org.junit.Test; + +public class StringToByteArrayUnitTest { + @Test + public void whenGetBytes_thenCorrect() throws UnsupportedEncodingException { + byte[] byteArray1 = "abcd".getBytes(); + byte[] byteArray2 = "efgh".getBytes(StandardCharsets.US_ASCII); + byte[] byteArray3 = "ijkl".getBytes("UTF-8"); + byte[] expected1 = new byte[] { 97, 98, 99, 100 }; + byte[] expected2 = new byte[] { 101, 102, 103, 104 }; + byte[] expected3 = new byte[] { 105, 106, 107, 108 }; + + assertArrayEquals(expected1, byteArray1); + assertArrayEquals(expected2, byteArray2); + assertArrayEquals(expected3, byteArray3); + } +} diff --git a/java-strings/src/test/java/com/baeldung/string/interview/StringToCharArrayUnitTest.java b/java-strings/src/test/java/com/baeldung/string/interview/StringToCharArrayUnitTest.java new file mode 100644 index 0000000000..1322d0fa82 --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/interview/StringToCharArrayUnitTest.java @@ -0,0 +1,17 @@ +package com.baeldung.string.interview; + +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; + +import org.junit.Test; + +public class StringToCharArrayUnitTest { + @Test + public void whenConvertingStringToCharArray_thenConversionSuccessful() { + String beforeConvStr = "hello"; + char[] afterConvCharArr = { 'h', 'e', 'l', 'l', 'o' }; + + assertEquals(Arrays.equals(beforeConvStr.toCharArray(), afterConvCharArr), true); + } +} diff --git a/java-strings/src/test/java/com/baeldung/string/interview/StringToIntegerUnitTest.java b/java-strings/src/test/java/com/baeldung/string/interview/StringToIntegerUnitTest.java new file mode 100644 index 0000000000..a905438a84 --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/interview/StringToIntegerUnitTest.java @@ -0,0 +1,15 @@ +package com.baeldung.string.interview; + +import org.junit.Test; +import static org.assertj.core.api.Assertions.assertThat; + +public class StringToIntegerUnitTest { + @Test + public void givenString_whenParsingInt_shouldConvertToInt() { + String givenString = "42"; + + int result = Integer.parseInt(givenString); + + assertThat(result).isEqualTo(42); + } +} From 4eb3f2943038f3b0635e8267b7e9a666af6281d9 Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Thu, 3 Jan 2019 22:42:26 +0530 Subject: [PATCH 257/359] BAEL-2536-addressed review comments --- .../string/{Panagram.java => Pangram.java} | 21 ++++++++++--------- ...gramUnitTest.java => PangramUnitTest.java} | 20 +++++++++--------- 2 files changed, 21 insertions(+), 20 deletions(-) rename java-strings/src/main/java/com/baeldung/string/{Panagram.java => Pangram.java} (71%) rename java-strings/src/test/java/com/baeldung/string/{PanagramUnitTest.java => PangramUnitTest.java} (61%) diff --git a/java-strings/src/main/java/com/baeldung/string/Panagram.java b/java-strings/src/main/java/com/baeldung/string/Pangram.java similarity index 71% rename from java-strings/src/main/java/com/baeldung/string/Panagram.java rename to java-strings/src/main/java/com/baeldung/string/Pangram.java index d000b4455e..48e31b2157 100644 --- a/java-strings/src/main/java/com/baeldung/string/Panagram.java +++ b/java-strings/src/main/java/com/baeldung/string/Pangram.java @@ -6,12 +6,13 @@ import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; -public class Panagram { +public class Pangram { + private static final int ALPHABET_COUNT = 26; public static boolean isPanagram(String str) { if (str == null) return false; - Boolean[] alphabetMarker = new Boolean[26]; + Boolean[] alphabetMarker = new Boolean[ALPHABET_COUNT]; Arrays.fill(alphabetMarker, false); int alphabetIndex = 0; str = str.toUpperCase(); @@ -33,13 +34,13 @@ public class Panagram { return false; // filtered character stream - str = str.toUpperCase(); - Stream filteredCharStream = str.chars() - .filter(item -> ((item >= 'A' && item <= 'Z') || (item >= 'a' && item <= 'z'))) + String strUpper = str.toUpperCase(); + Stream filteredCharStream = strUpper.chars() + .filter(item -> ((item >= 'A' && item <= 'Z'))) .mapToObj(c -> (char) c); Map alphabetMap = filteredCharStream.collect(Collectors.toMap(item -> item, k -> Boolean.TRUE, (p1, p2) -> p1)); - return (alphabetMap.size() == 26); + return (alphabetMap.size() == ALPHABET_COUNT); } public static boolean isPerfectPanagram(String str) { @@ -47,13 +48,13 @@ public class Panagram { return false; // filtered character stream - str = str.toUpperCase(); - Stream filteredCharStream = str.chars() - .filter(item -> ((item >= 'A' && item <= 'Z') || (item >= 'a' && item <= 'z'))) + String strUpper = str.toUpperCase(); + Stream filteredCharStream = strUpper.chars() + .filter(item -> ((item >= 'A' && item <= 'Z'))) .mapToObj(c -> (char) c); Map alphabetFrequencyMap = filteredCharStream.collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); - return (alphabetFrequencyMap.size() == 26 && alphabetFrequencyMap.values() + return (alphabetFrequencyMap.size() == ALPHABET_COUNT && alphabetFrequencyMap.values() .stream() .allMatch(item -> item == 1)); } diff --git a/java-strings/src/test/java/com/baeldung/string/PanagramUnitTest.java b/java-strings/src/test/java/com/baeldung/string/PangramUnitTest.java similarity index 61% rename from java-strings/src/test/java/com/baeldung/string/PanagramUnitTest.java rename to java-strings/src/test/java/com/baeldung/string/PangramUnitTest.java index 81d46956e2..150f27d7c0 100644 --- a/java-strings/src/test/java/com/baeldung/string/PanagramUnitTest.java +++ b/java-strings/src/test/java/com/baeldung/string/PangramUnitTest.java @@ -5,40 +5,40 @@ import static org.junit.Assert.assertTrue; import org.junit.Test; -public class PanagramUnitTest { +public class PangramUnitTest { @Test public void givenValidString_isPanagram_shouldReturnSuccess() { String input = "Two driven jocks help fax my big quiz"; - assertTrue(Panagram.isPanagram(input)); - assertTrue(Panagram.isPanagramWithStreams(input)); + assertTrue(Pangram.isPanagram(input)); + assertTrue(Pangram.isPanagramWithStreams(input)); } @Test public void givenNullString_isPanagram_shouldReturnFailure() { String input = null; - assertFalse(Panagram.isPanagram(input)); - assertFalse(Panagram.isPanagramWithStreams(input)); - assertFalse(Panagram.isPerfectPanagram(input)); + assertFalse(Pangram.isPanagram(input)); + assertFalse(Pangram.isPanagramWithStreams(input)); + assertFalse(Pangram.isPerfectPanagram(input)); } @Test public void givenPerfectPanagramString_isPerfectPanagram_shouldReturnSuccess() { String input = "abcdefghijklmNoPqrStuVwxyz"; - assertTrue(Panagram.isPerfectPanagram(input)); + assertTrue(Pangram.isPerfectPanagram(input)); } @Test public void givenNonPanagramString_isPanagram_shouldReturnFailure() { String input = "invalid panagram"; - assertFalse(Panagram.isPanagram(input)); - assertFalse(Panagram.isPanagramWithStreams(input)); + assertFalse(Pangram.isPanagram(input)); + assertFalse(Pangram.isPanagramWithStreams(input)); } @Test public void givenPanagram_isPerfectPanagram_shouldReturnFailure() { String input = "Two driven jocks help fax my big quiz"; - assertFalse(Panagram.isPerfectPanagram(input)); + assertFalse(Pangram.isPerfectPanagram(input)); } } From 693da95f44bdd66609acc103824ad49b38f91141 Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Thu, 3 Jan 2019 22:44:52 +0530 Subject: [PATCH 258/359] BAEL-2536-updated Panagram to Pangram --- .../main/java/com/baeldung/string/Pangram.java | 10 +++++----- .../com/baeldung/string/PangramUnitTest.java | 18 +++++++++--------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/java-strings/src/main/java/com/baeldung/string/Pangram.java b/java-strings/src/main/java/com/baeldung/string/Pangram.java index 48e31b2157..8498a7074a 100644 --- a/java-strings/src/main/java/com/baeldung/string/Pangram.java +++ b/java-strings/src/main/java/com/baeldung/string/Pangram.java @@ -9,7 +9,7 @@ import java.util.stream.Stream; public class Pangram { private static final int ALPHABET_COUNT = 26; - public static boolean isPanagram(String str) { + public static boolean isPangram(String str) { if (str == null) return false; Boolean[] alphabetMarker = new Boolean[ALPHABET_COUNT]; @@ -29,10 +29,10 @@ public class Pangram { return true; } - public static boolean isPanagramWithStreams(String str) { + public static boolean isPangramWithStreams(String str) { if (str == null) return false; - + // filtered character stream String strUpper = str.toUpperCase(); Stream filteredCharStream = strUpper.chars() @@ -43,10 +43,10 @@ public class Pangram { return (alphabetMap.size() == ALPHABET_COUNT); } - public static boolean isPerfectPanagram(String str) { + public static boolean isPerfectPangram(String str) { if (str == null) return false; - + // filtered character stream String strUpper = str.toUpperCase(); Stream filteredCharStream = strUpper.chars() diff --git a/java-strings/src/test/java/com/baeldung/string/PangramUnitTest.java b/java-strings/src/test/java/com/baeldung/string/PangramUnitTest.java index 150f27d7c0..67523a4524 100644 --- a/java-strings/src/test/java/com/baeldung/string/PangramUnitTest.java +++ b/java-strings/src/test/java/com/baeldung/string/PangramUnitTest.java @@ -10,35 +10,35 @@ public class PangramUnitTest { @Test public void givenValidString_isPanagram_shouldReturnSuccess() { String input = "Two driven jocks help fax my big quiz"; - assertTrue(Pangram.isPanagram(input)); - assertTrue(Pangram.isPanagramWithStreams(input)); + assertTrue(Pangram.isPangram(input)); + assertTrue(Pangram.isPangramWithStreams(input)); } @Test public void givenNullString_isPanagram_shouldReturnFailure() { String input = null; - assertFalse(Pangram.isPanagram(input)); - assertFalse(Pangram.isPanagramWithStreams(input)); - assertFalse(Pangram.isPerfectPanagram(input)); + assertFalse(Pangram.isPangram(input)); + assertFalse(Pangram.isPangramWithStreams(input)); + assertFalse(Pangram.isPerfectPangram(input)); } @Test public void givenPerfectPanagramString_isPerfectPanagram_shouldReturnSuccess() { String input = "abcdefghijklmNoPqrStuVwxyz"; - assertTrue(Pangram.isPerfectPanagram(input)); + assertTrue(Pangram.isPerfectPangram(input)); } @Test public void givenNonPanagramString_isPanagram_shouldReturnFailure() { String input = "invalid panagram"; - assertFalse(Pangram.isPanagram(input)); - assertFalse(Pangram.isPanagramWithStreams(input)); + assertFalse(Pangram.isPangram(input)); + assertFalse(Pangram.isPangramWithStreams(input)); } @Test public void givenPanagram_isPerfectPanagram_shouldReturnFailure() { String input = "Two driven jocks help fax my big quiz"; - assertFalse(Pangram.isPerfectPanagram(input)); + assertFalse(Pangram.isPerfectPangram(input)); } } From cd3f0fcb1f1a4e782a470ad66da197be0a2aab1b Mon Sep 17 00:00:00 2001 From: Dhananjay Singh Date: Fri, 4 Jan 2019 05:10:26 +0530 Subject: [PATCH 259/359] BAEL-2391 Two pointer technique * two pointer technique * Corrected two sum * Changed asserts in unit test --- .../LinkedListFindMiddle.java | 16 ++++++ .../twopointertechnique/MyNode.java | 20 +++++++ .../twopointertechnique/RotateArray.java | 22 ++++++++ .../twopointertechnique/TwoSum.java | 38 +++++++++++++ .../LinkedListFindMiddleUnitTest.java | 37 ++++++++++++ .../RotateArrayUnitTest.java | 26 +++++++++ .../twopointertechnique/TwoSumUnitTest.java | 56 +++++++++++++++++++ 7 files changed, 215 insertions(+) create mode 100644 algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddle.java create mode 100644 algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/MyNode.java create mode 100644 algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/RotateArray.java create mode 100644 algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/TwoSum.java create mode 100644 algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddleUnitTest.java create mode 100644 algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/twopointertechnique/RotateArrayUnitTest.java create mode 100644 algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/twopointertechnique/TwoSumUnitTest.java diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddle.java b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddle.java new file mode 100644 index 0000000000..a7031f4fba --- /dev/null +++ b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddle.java @@ -0,0 +1,16 @@ +package com.baeldung.algorithms.twopointertechnique; + +public class LinkedListFindMiddle { + + public T findMiddle(MyNode head) { + MyNode slowPointer = head; + MyNode fastPointer = head; + + while (fastPointer.next != null && fastPointer.next.next != null) { + fastPointer = fastPointer.next.next; + slowPointer = slowPointer.next; + } + return slowPointer.data; + } + +} diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/MyNode.java b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/MyNode.java new file mode 100644 index 0000000000..7d93f03ef9 --- /dev/null +++ b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/MyNode.java @@ -0,0 +1,20 @@ +package com.baeldung.algorithms.twopointertechnique; + +public class MyNode { + MyNode next; + E data; + + public MyNode(E value) { + data = value; + next = null; + } + + public MyNode(E value, MyNode n) { + data = value; + next = n; + } + + public void setNext(MyNode n) { + next = n; + } +} diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/RotateArray.java b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/RotateArray.java new file mode 100644 index 0000000000..b4e3698c01 --- /dev/null +++ b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/RotateArray.java @@ -0,0 +1,22 @@ +package com.baeldung.algorithms.twopointertechnique; + +public class RotateArray { + + public void rotate(int[] input, int step) { + step %= input.length; + reverse(input, 0, input.length - 1); + reverse(input, 0, step - 1); + reverse(input, step, input.length - 1); + } + + private void reverse(int[] input, int start, int end) { + while (start < end) { + int temp = input[start]; + input[start] = input[end]; + input[end] = temp; + start++; + end--; + } + } + +} diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/TwoSum.java b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/TwoSum.java new file mode 100644 index 0000000000..14eceaa1bd --- /dev/null +++ b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/TwoSum.java @@ -0,0 +1,38 @@ +package com.baeldung.algorithms.twopointertechnique; + +public class TwoSum { + + public boolean twoSum(int[] input, int targetValue) { + + int pointerOne = 0; + int pointerTwo = input.length - 1; + + while (pointerOne < pointerTwo) { + int sum = input[pointerOne] + input[pointerTwo]; + + if (sum == targetValue) { + return true; + } else if (sum < targetValue) { + pointerOne++; + } else { + pointerTwo--; + } + } + + return false; + } + + public boolean twoSumSlow(int[] input, int targetValue) { + + for (int i = 0; i < input.length; i++) { + for (int j = 1; j < input.length; j++) { + if (input[i] + input[j] == targetValue) { + return true; + } + } + } + + return false; + } + +} diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddleUnitTest.java b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddleUnitTest.java new file mode 100644 index 0000000000..422a53fa3e --- /dev/null +++ b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddleUnitTest.java @@ -0,0 +1,37 @@ +package com.baeldung.algorithms.twopointertechnique; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; + +public class LinkedListFindMiddleUnitTest { + + LinkedListFindMiddle linkedListFindMiddle = new LinkedListFindMiddle(); + + @Test + public void givenLinkedListOfMyNodes_whenLinkedListFindMiddle_thenCorrect() { + + MyNode head = createNodesList(8); + + assertThat(linkedListFindMiddle.findMiddle(head)).isEqualTo("4"); + + head = createNodesList(9); + + assertThat(linkedListFindMiddle.findMiddle(head)).isEqualTo("5"); + } + + private static MyNode createNodesList(int n) { + + MyNode head = new MyNode("1"); + MyNode current = head; + + for (int i = 2; i <= n; i++) { + MyNode newNode = new MyNode(String.valueOf(i)); + current.setNext(newNode); + current = newNode; + } + + return head; + } + +} diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/twopointertechnique/RotateArrayUnitTest.java b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/twopointertechnique/RotateArrayUnitTest.java new file mode 100644 index 0000000000..da227ae751 --- /dev/null +++ b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/twopointertechnique/RotateArrayUnitTest.java @@ -0,0 +1,26 @@ +package com.baeldung.algorithms.twopointertechnique; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; + +public class RotateArrayUnitTest { + + private RotateArray rotateArray = new RotateArray(); + + private int[] inputArray; + + private int step; + + @Test + public void givenAnArrayOfIntegers_whenRotateKsteps_thenCorrect() { + + inputArray = new int[] { 1, 2, 3, 4, 5, 6, 7 }; + step = 4; + + rotateArray.rotate(inputArray, step); + + assertThat(inputArray).containsExactly(new int[] { 4, 5, 6, 7, 1, 2, 3 }); + } + +} diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/twopointertechnique/TwoSumUnitTest.java b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/twopointertechnique/TwoSumUnitTest.java new file mode 100644 index 0000000000..aa76f8e1cf --- /dev/null +++ b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/twopointertechnique/TwoSumUnitTest.java @@ -0,0 +1,56 @@ +package com.baeldung.algorithms.twopointertechnique; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +public class TwoSumUnitTest { + + private TwoSum twoSum = new TwoSum(); + + private int[] sortedArray; + + private int targetValue; + + @Test + public void givenASortedArrayOfIntegers_whenTwoSumSlow_thenPairExists() { + + sortedArray = new int[] { 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9 }; + + targetValue = 12; + + assertTrue(twoSum.twoSumSlow(sortedArray, targetValue)); + } + + @Test + public void givenASortedArrayOfIntegers_whenTwoSumSlow_thenPairDoesNotExists() { + + sortedArray = new int[] { 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9 }; + + targetValue = 20; + + assertFalse(twoSum.twoSumSlow(sortedArray, targetValue)); + } + + @Test + public void givenASortedArrayOfIntegers_whenTwoSum_thenPairExists() { + + sortedArray = new int[] { 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9 }; + + targetValue = 12; + + assertTrue(twoSum.twoSum(sortedArray, targetValue)); + } + + @Test + public void givenASortedArrayOfIntegers_whenTwoSum_thenPairDoesNotExists() { + + sortedArray = new int[] { 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9 }; + + targetValue = 20; + + assertFalse(twoSum.twoSum(sortedArray, targetValue)); + } + +} From b62edd2503d91dca0096f7a39379bb03f7cdbbf7 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Fri, 4 Jan 2019 17:16:51 +0530 Subject: [PATCH 260/359] backlink added --- core-kotlin/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-kotlin/README.md b/core-kotlin/README.md index 05f07e7e7e..de989ce141 100644 --- a/core-kotlin/README.md +++ b/core-kotlin/README.md @@ -47,3 +47,4 @@ - [Dependency Injection for Kotlin with Injekt](https://www.baeldung.com/kotlin-dependency-injection-with-injekt) - [Implementing a Binary Tree in Kotlin](https://www.baeldung.com/kotlin-binary-tree) - [Generate a Random Alphanumeric String in Kotlin](https://www.baeldung.com/kotlin-random-alphanumeric-string) +- [Kotlin Contracts](https://www.baeldung.com/kotlin-contracts) From 8d3e2c9b0791cc48dc9c5141974d2f792eb16983 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Fri, 4 Jan 2019 17:20:24 +0530 Subject: [PATCH 261/359] backlink added --- core-kotlin/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-kotlin/README.md b/core-kotlin/README.md index de989ce141..609a30a1a8 100644 --- a/core-kotlin/README.md +++ b/core-kotlin/README.md @@ -48,3 +48,4 @@ - [Implementing a Binary Tree in Kotlin](https://www.baeldung.com/kotlin-binary-tree) - [Generate a Random Alphanumeric String in Kotlin](https://www.baeldung.com/kotlin-random-alphanumeric-string) - [Kotlin Contracts](https://www.baeldung.com/kotlin-contracts) +- [Operator Overloading in Kotlin](https://www.baeldung.com/kotlin-operator-overloading) From 58ddffc6cb344776aee93a625bf9804068934a7d Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Fri, 4 Jan 2019 17:24:15 +0530 Subject: [PATCH 262/359] backlink-added --- persistence-modules/hibernate5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/hibernate5/README.md b/persistence-modules/hibernate5/README.md index e973907248..d1ebff1d8a 100644 --- a/persistence-modules/hibernate5/README.md +++ b/persistence-modules/hibernate5/README.md @@ -24,3 +24,4 @@ - [Hibernate 5 Bootstrapping API](https://www.baeldung.com/hibernate-5-bootstrapping-api) - [Criteria Queries Using JPA Metamodel](https://www.baeldung.com/hibernate-criteria-queries-metamodel) - [Guide to the Hibernate EntityManager](https://www.baeldung.com/hibernate-entitymanager) +- [Get All Data from a Table with Hibernate](https://www.baeldung.com/hibernate-select-all) From b2d0f6cc832bb310028d755f4dc45f3e8df9fb1c Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Fri, 4 Jan 2019 17:26:20 +0530 Subject: [PATCH 263/359] backlink added --- java-strings/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java-strings/README.md b/java-strings/README.md index fa048dbb5a..a86f6e73c3 100644 --- a/java-strings/README.md +++ b/java-strings/README.md @@ -46,4 +46,5 @@ - [Replace a Character at a Specific Index in a String in Java](https://www.baeldung.com/java-replace-character-at-index) - [Convert a Comma Separated String to a List in Java](https://www.baeldung.com/java-string-with-separator-to-list) - [Guide to java.util.Formatter](http://www.baeldung.com/java-string-formatter) -- [Add a Character to a String at a Given Position](https://www.baeldung.com/java-add-character-to-string) \ No newline at end of file +- [Add a Character to a String at a Given Position](https://www.baeldung.com/java-add-character-to-string) +- [Remove Leading and Trailing Characters from a String](https://www.baeldung.com/java-remove-trailing-characters) From 703890941d21986f26504f52eea68484446c960a Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Fri, 4 Jan 2019 17:28:11 +0530 Subject: [PATCH 264/359] back-link added --- core-java/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java/README.md b/core-java/README.md index 03b77186b0..5aee69d9a9 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -45,3 +45,4 @@ - [Guide to Character Encoding](https://www.baeldung.com/java-char-encoding) - [Graphs in Java](https://www.baeldung.com/java-graphs) - [Console I/O in Java](http://www.baeldung.com/java-console-input-output) +- [Formatting with printf() in Java](https://www.baeldung.com/java-printstream-printf) From 48f3db9713b4797973df4092e1500f1d5d315aed Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Fri, 4 Jan 2019 17:30:45 +0530 Subject: [PATCH 265/359] back-link added --- java-collections-maps/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/java-collections-maps/README.md b/java-collections-maps/README.md index 0b76ca1959..b4ab270448 100644 --- a/java-collections-maps/README.md +++ b/java-collections-maps/README.md @@ -18,3 +18,4 @@ - [Merging Two Maps with Java 8](https://www.baeldung.com/java-merge-maps) - [How to Check If a Key Exists in a Map](https://www.baeldung.com/java-map-key-exists) - [Comparing Two HashMaps in Java](https://www.baeldung.com/java-compare-hashmaps) +- [Immutable Map Implementations in Java](https://www.baeldung.com/java-immutable-maps) From e20cf9ac43a05ae558d68aba8cf031c0cd459264 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Fri, 4 Jan 2019 17:32:02 +0530 Subject: [PATCH 266/359] back-link added --- algorithms-miscellaneous-1/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/algorithms-miscellaneous-1/README.md b/algorithms-miscellaneous-1/README.md index a725bbd141..59765588b0 100644 --- a/algorithms-miscellaneous-1/README.md +++ b/algorithms-miscellaneous-1/README.md @@ -12,4 +12,5 @@ - [Check If a String Contains All The Letters of The Alphabet](https://www.baeldung.com/java-string-contains-all-letters) - [Find the Middle Element of a Linked List](http://www.baeldung.com/java-linked-list-middle-element) - [Calculate Factorial in Java](https://www.baeldung.com/java-calculate-factorial) -- [Find Substrings That Are Palindromes in Java](https://www.baeldung.com/java-palindrome-substrings) \ No newline at end of file +- [Find Substrings That Are Palindromes in Java](https://www.baeldung.com/java-palindrome-substrings) +- [Find the Longest Substring without Repeating Characters](https://www.baeldung.com/java-longest-substring-without-repeated-characters) From 129630109b387ace7543e0d000d7bdd9d2ff5d7d Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Fri, 4 Jan 2019 17:35:15 +0530 Subject: [PATCH 267/359] back-link added --- persistence-modules/hibernate5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/hibernate5/README.md b/persistence-modules/hibernate5/README.md index d1ebff1d8a..5f826eec73 100644 --- a/persistence-modules/hibernate5/README.md +++ b/persistence-modules/hibernate5/README.md @@ -25,3 +25,4 @@ - [Criteria Queries Using JPA Metamodel](https://www.baeldung.com/hibernate-criteria-queries-metamodel) - [Guide to the Hibernate EntityManager](https://www.baeldung.com/hibernate-entitymanager) - [Get All Data from a Table with Hibernate](https://www.baeldung.com/hibernate-select-all) +- [One-to-One Relationship in JPA](https://www.baeldung.com/jpa-one-to-one) From c91211b4e67841dac61be31bd823f3a7831103a9 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Fri, 4 Jan 2019 17:36:49 +0530 Subject: [PATCH 268/359] back-link added --- persistence-modules/hibernate5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/hibernate5/README.md b/persistence-modules/hibernate5/README.md index 5f826eec73..fbcf1c94bb 100644 --- a/persistence-modules/hibernate5/README.md +++ b/persistence-modules/hibernate5/README.md @@ -26,3 +26,4 @@ - [Guide to the Hibernate EntityManager](https://www.baeldung.com/hibernate-entitymanager) - [Get All Data from a Table with Hibernate](https://www.baeldung.com/hibernate-select-all) - [One-to-One Relationship in JPA](https://www.baeldung.com/jpa-one-to-one) +- [Hibernate Named Query](https://www.baeldung.com/hibernate-named-query) From ca08f5ff9d0c1c2c2502e501aa9d57927e65562d Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Fri, 4 Jan 2019 17:38:08 +0530 Subject: [PATCH 269/359] back-link added --- spring-5-reactive/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-5-reactive/README.md b/spring-5-reactive/README.md index 2a4ee017f4..c39bb616f8 100644 --- a/spring-5-reactive/README.md +++ b/spring-5-reactive/README.md @@ -18,3 +18,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Validation for Functional Endpoints in Spring 5](https://www.baeldung.com/spring-functional-endpoints-validation) - [Logging a Reactive Sequence](https://www.baeldung.com/spring-reactive-sequence-logging) - [Testing Reactive Streams Using StepVerifier and TestPublisher](https://www.baeldung.com/reactive-streams-step-verifier-test-publisher) +- [Debugging Reactive Streams in Spring 5](https://www.baeldung.com/spring-debugging-reactive-streams) From 52269334d931b748fbb0e338cbfdf2394487050f Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Fri, 4 Jan 2019 17:41:30 +0530 Subject: [PATCH 270/359] back-link added --- java-streams/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/java-streams/README.md b/java-streams/README.md index 2550f08650..33ca2619a8 100644 --- a/java-streams/README.md +++ b/java-streams/README.md @@ -14,3 +14,4 @@ - [Primitive Type Streams in Java 8](http://www.baeldung.com/java-8-primitive-streams) - [Stream Ordering in Java](https://www.baeldung.com/java-stream-ordering) - [Introduction to Protonpack](https://www.baeldung.com/java-protonpack) +- [Java Stream Filter with Lambda Expression](https://www.baeldung.com/java-stream-filter-lambda) From 45924c75ead9d0add259a42b2ad6927440aaece5 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Fri, 4 Jan 2019 17:42:37 +0530 Subject: [PATCH 271/359] backlink added --- persistence-modules/hibernate5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/hibernate5/README.md b/persistence-modules/hibernate5/README.md index fbcf1c94bb..512370e853 100644 --- a/persistence-modules/hibernate5/README.md +++ b/persistence-modules/hibernate5/README.md @@ -27,3 +27,4 @@ - [Get All Data from a Table with Hibernate](https://www.baeldung.com/hibernate-select-all) - [One-to-One Relationship in JPA](https://www.baeldung.com/jpa-one-to-one) - [Hibernate Named Query](https://www.baeldung.com/hibernate-named-query) +- [Using c3p0 with Hibernate](https://www.baeldung.com/hibernate-c3p0) From c5ddf0178f658ac74cd6e5c6f625722b7f824be9 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Fri, 4 Jan 2019 17:44:10 +0530 Subject: [PATCH 272/359] backlink added --- spring-boot-ops/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-ops/README.md b/spring-boot-ops/README.md index c125c96c36..553b02ebf0 100644 --- a/spring-boot-ops/README.md +++ b/spring-boot-ops/README.md @@ -9,4 +9,4 @@ - [Shutdown a Spring Boot Application](http://www.baeldung.com/spring-boot-shutdown) - [Spring Boot Console Application](http://www.baeldung.com/spring-boot-console-app) - [Comparing Embedded Servlet Containers in Spring Boot](http://www.baeldung.com/spring-boot-servlet-containers) - + - [Programmatically Restarting a Spring Boot Application](https://www.baeldung.com/java-restart-spring-boot-app) From 83795f942119caae01148be5417690a0d6d8cc81 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Fri, 4 Jan 2019 17:46:02 +0530 Subject: [PATCH 273/359] Backlink added --- persistence-modules/spring-data-jpa/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/spring-data-jpa/README.md b/persistence-modules/spring-data-jpa/README.md index 3c71600565..976a692699 100644 --- a/persistence-modules/spring-data-jpa/README.md +++ b/persistence-modules/spring-data-jpa/README.md @@ -18,6 +18,7 @@ - [Limiting Query Results with JPA and Spring Data JPA](https://www.baeldung.com/jpa-limit-query-results) - [Sorting Query Results with Spring Data](https://www.baeldung.com/spring-data-sorting) - [INSERT Statement in JPA](https://www.baeldung.com/jpa-insert) +- [Pagination and Sorting using Spring Data JPA](https://www.baeldung.com/spring-data-jpa-pagination-sorting) ### Eclipse Config After importing the project into Eclipse, you may see the following error: From 25eed099f34cb085a08b4a2a027677fb36051b60 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Fri, 4 Jan 2019 17:47:44 +0530 Subject: [PATCH 274/359] backlink added --- core-kotlin/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-kotlin/README.md b/core-kotlin/README.md index 609a30a1a8..0ce4b74d91 100644 --- a/core-kotlin/README.md +++ b/core-kotlin/README.md @@ -49,3 +49,4 @@ - [Generate a Random Alphanumeric String in Kotlin](https://www.baeldung.com/kotlin-random-alphanumeric-string) - [Kotlin Contracts](https://www.baeldung.com/kotlin-contracts) - [Operator Overloading in Kotlin](https://www.baeldung.com/kotlin-operator-overloading) +- [Inline Classes in Kotlin](https://www.baeldung.com/kotlin-inline-classes) From 1c120d1886b8399f8ce9c2d287d3b25c09245fa0 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Fri, 4 Jan 2019 17:49:44 +0530 Subject: [PATCH 275/359] backlink added --- core-java-11/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-11/README.md b/core-java-11/README.md index 181ada3f45..c8039f4bc5 100644 --- a/core-java-11/README.md +++ b/core-java-11/README.md @@ -2,4 +2,4 @@ - [Java 11 Single File Source Code](https://www.baeldung.com/java-single-file-source-code) - [Java 11 Local Variable Syntax for Lambda Parameters](https://www.baeldung.com/java-var-lambda-params) - +- [Java 11 String API Additions](https://www.baeldung.com/java-11-string-api) From cd5d9da8c072a9bf86d2552d0a36cac7c415cca1 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Fri, 4 Jan 2019 17:53:20 +0530 Subject: [PATCH 276/359] Backlink added --- lombok-custom/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 lombok-custom/README.md diff --git a/lombok-custom/README.md b/lombok-custom/README.md new file mode 100644 index 0000000000..bfc784ea7e --- /dev/null +++ b/lombok-custom/README.md @@ -0,0 +1,3 @@ +## Relevant articles: + +- [Implementing a Custom Lombok Annotation](https://www.baeldung.com/lombok-custom-annotation) From c8fcad8b6a0bda2fae75090d0171e7799921e2b8 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Fri, 4 Jan 2019 17:54:37 +0530 Subject: [PATCH 277/359] backlink added --- core-java-arrays/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-arrays/README.md b/core-java-arrays/README.md index 56110585ac..400dd7793c 100644 --- a/core-java-arrays/README.md +++ b/core-java-arrays/README.md @@ -13,3 +13,4 @@ - [How to Invert an Array in Java](http://www.baeldung.com/java-invert-array) - [Array Operations in Java](http://www.baeldung.com/java-common-array-operations) - [Intersection Between two Integer Arrays](https://www.baeldung.com/java-array-intersection) +- [Sorting Arrays in Java](https://www.baeldung.com/java-sorting-arrays) From e67486cf739cf245ede5757332bc84c340e6c6b3 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Fri, 4 Jan 2019 17:55:40 +0530 Subject: [PATCH 278/359] backlink added --- gson/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/gson/README.md b/gson/README.md index e1eb155f43..4edd7158d4 100644 --- a/gson/README.md +++ b/gson/README.md @@ -9,3 +9,4 @@ - [Exclude Fields from Serialization in Gson](http://www.baeldung.com/gson-exclude-fields-serialization) - [Save Data to a JSON File with Gson](https://www.baeldung.com/gson-save-file) - [Convert JSON to a Map Using Gson](https://www.baeldung.com/gson-json-to-map) +- [Working with Primitive Values in Gson](https://www.baeldung.com/java-gson-primitives) From e67dae8b6b0483791aab0a1c7e151a2a91bdf6c1 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Fri, 4 Jan 2019 17:56:40 +0530 Subject: [PATCH 279/359] backlink added --- jee-7/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/jee-7/README.md b/jee-7/README.md index a2493e561b..a783e7860e 100644 --- a/jee-7/README.md +++ b/jee-7/README.md @@ -5,3 +5,4 @@ - [Introduction to JAX-WS](http://www.baeldung.com/jax-ws) - [A Guide to Java EE Web-Related Annotations](http://www.baeldung.com/javaee-web-annotations) - [Introduction to Testing with Arquillian](http://www.baeldung.com/arquillian) +- [Java EE 7 Batch Processing](https://www.baeldung.com/java-ee-7-batch-processing) From c31163f54f5ecd7dfd79ced4c761b5dbf28168a9 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Fri, 4 Jan 2019 17:57:55 +0530 Subject: [PATCH 280/359] backlink added --- core-kotlin/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-kotlin/README.md b/core-kotlin/README.md index 0ce4b74d91..225ad87e87 100644 --- a/core-kotlin/README.md +++ b/core-kotlin/README.md @@ -50,3 +50,4 @@ - [Kotlin Contracts](https://www.baeldung.com/kotlin-contracts) - [Operator Overloading in Kotlin](https://www.baeldung.com/kotlin-operator-overloading) - [Inline Classes in Kotlin](https://www.baeldung.com/kotlin-inline-classes) +- [Creating Java static final Equivalents in Kotlin](https://www.baeldung.com/kotlin-java-static-final) From 5e7ca37b760c7e570ede5b0f1cd25bf103d6007d Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Fri, 4 Jan 2019 17:58:56 +0530 Subject: [PATCH 281/359] Backlink added --- spring-cloud/spring-cloud-kubernetes/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-cloud/spring-cloud-kubernetes/README.md b/spring-cloud/spring-cloud-kubernetes/README.md index 295ead1c2f..2387758626 100644 --- a/spring-cloud/spring-cloud-kubernetes/README.md +++ b/spring-cloud/spring-cloud-kubernetes/README.md @@ -1,3 +1,4 @@ ### Relevant Articles: - [Running Spring Boot Applications With Minikube](https://www.baeldung.com/spring-boot-minikube) +- [Self-Healing Applications with Kubernetes and Spring Boot](https://www.baeldung.com/spring-boot-kubernetes-self-healing-apps) From eaa57758366e7d08d788929b59528fa112179824 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Fri, 4 Jan 2019 18:00:24 +0530 Subject: [PATCH 282/359] backlink added --- persistence-modules/hibernate5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/hibernate5/README.md b/persistence-modules/hibernate5/README.md index 512370e853..03bdd9b759 100644 --- a/persistence-modules/hibernate5/README.md +++ b/persistence-modules/hibernate5/README.md @@ -28,3 +28,4 @@ - [One-to-One Relationship in JPA](https://www.baeldung.com/jpa-one-to-one) - [Hibernate Named Query](https://www.baeldung.com/hibernate-named-query) - [Using c3p0 with Hibernate](https://www.baeldung.com/hibernate-c3p0) +- [Persist a JSON Object Using Hibernate](https://www.baeldung.com/hibernate-persist-json-object) From 6afe91c171f28aa0c6f70e2afc9c2252b82652e3 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Fri, 4 Jan 2019 18:01:35 +0530 Subject: [PATCH 283/359] backlink added --- core-java-collections/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-collections/README.md b/core-java-collections/README.md index 1a90d01a82..f549adaa4f 100644 --- a/core-java-collections/README.md +++ b/core-java-collections/README.md @@ -30,3 +30,4 @@ - [Join and Split Arrays and Collections in Java](http://www.baeldung.com/java-join-and-split) - [A Guide to EnumMap](https://www.baeldung.com/java-enum-map) - [A Guide to Iterator in Java](http://www.baeldung.com/java-iterator) +- [Intersection of Two Lists in Java](https://www.baeldung.com/java-lists-intersection) From 8b2af060dfb5befd3c2d0423aee9052f5d707b81 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Fri, 4 Jan 2019 18:03:13 +0530 Subject: [PATCH 284/359] backlink added --- akka-http/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 akka-http/README.md diff --git a/akka-http/README.md b/akka-http/README.md new file mode 100644 index 0000000000..3831b5079f --- /dev/null +++ b/akka-http/README.md @@ -0,0 +1,3 @@ +## Relevant articles: + +- [Introduction to Akka HTTP](https://www.baeldung.com/akka-http) From 35744e704426ddc034a5248c62c912e243c02722 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Fri, 4 Jan 2019 18:04:15 +0530 Subject: [PATCH 285/359] backlink added --- core-java-collections/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-collections/README.md b/core-java-collections/README.md index f549adaa4f..bde0f9fdb9 100644 --- a/core-java-collections/README.md +++ b/core-java-collections/README.md @@ -31,3 +31,4 @@ - [A Guide to EnumMap](https://www.baeldung.com/java-enum-map) - [A Guide to Iterator in Java](http://www.baeldung.com/java-iterator) - [Intersection of Two Lists in Java](https://www.baeldung.com/java-lists-intersection) +- [Differences Between HashMap and Hashtable](https://www.baeldung.com/hashmap-hashtable-differences) From dd45e825d455ffa6d5d41869f144030202feb576 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Fri, 4 Jan 2019 18:06:27 +0530 Subject: [PATCH 286/359] backlink added --- java-strings/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/java-strings/README.md b/java-strings/README.md index a86f6e73c3..08fbec35ab 100644 --- a/java-strings/README.md +++ b/java-strings/README.md @@ -48,3 +48,4 @@ - [Guide to java.util.Formatter](http://www.baeldung.com/java-string-formatter) - [Add a Character to a String at a Given Position](https://www.baeldung.com/java-add-character-to-string) - [Remove Leading and Trailing Characters from a String](https://www.baeldung.com/java-remove-trailing-characters) +- [Concatenating Strings In Java](https://www.baeldung.com/java-strings-concatenation) From d5ab82475deb7e451db519bfbd37092f1e6f6f5b Mon Sep 17 00:00:00 2001 From: Olaniyi Anjola Date: Fri, 4 Jan 2019 11:44:24 -0500 Subject: [PATCH 287/359] BAEL-2452: Using curl from Java (#6043) * BAEL-2452: Using curl from Java * A re-do of the examples using tests, instead of main class * Fix un-used variable --- .../baeldung/curltojava/JavaCurlExamples.java | 29 ++++++++++ .../curltojava/JavaCurlExamplesUnitTest.java | 55 +++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/curltojava/JavaCurlExamples.java create mode 100644 core-java/src/test/java/com/baeldung/curltojava/JavaCurlExamplesUnitTest.java diff --git a/core-java/src/main/java/com/baeldung/curltojava/JavaCurlExamples.java b/core-java/src/main/java/com/baeldung/curltojava/JavaCurlExamples.java new file mode 100644 index 0000000000..166b0ecb13 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/curltojava/JavaCurlExamples.java @@ -0,0 +1,29 @@ +package com.baeldung.curltojava; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class JavaCurlExamples { + + public static String inputStreamToString(InputStream inputStream) { + final int bufferSize = 8 * 1024; + byte[] buffer = new byte[bufferSize]; + final StringBuilder builder = new StringBuilder(); + try (BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream, bufferSize)) { + while (bufferedInputStream.read(buffer) != -1) { + builder.append(new String(buffer)); + } + } catch (IOException ex) { + Logger.getLogger(JavaCurlExamples.class.getName()).log(Level.SEVERE, null, ex); + } + return builder.toString(); + } + + public static void consumeInputStream(InputStream inputStream) { + inputStreamToString(inputStream); + } + +} diff --git a/core-java/src/test/java/com/baeldung/curltojava/JavaCurlExamplesUnitTest.java b/core-java/src/test/java/com/baeldung/curltojava/JavaCurlExamplesUnitTest.java new file mode 100644 index 0000000000..4e82059f2b --- /dev/null +++ b/core-java/src/test/java/com/baeldung/curltojava/JavaCurlExamplesUnitTest.java @@ -0,0 +1,55 @@ +package com.baeldung.curltojava; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; + +import org.junit.Assert; +import org.junit.Test; + +public class JavaCurlExamplesUnitTest { + + + @Test + public void givenCommand_whenCalled_thenProduceZeroExitCode() throws IOException { + String command = "curl --location --request GET \"https://postman-echo.com/get?foo1=bar1&foo2=bar2\""; + ProcessBuilder processBuilder = new ProcessBuilder(command.replaceAll("\"", "").split(" ")); + processBuilder.directory(new File("/home/")); + Process process = processBuilder.start(); + InputStream inputStream = process.getInputStream(); + // Consume the inputStream so the process can exit + JavaCurlExamples.consumeInputStream(inputStream); + int exitCode = process.exitValue(); + + Assert.assertEquals(0, exitCode); + } + + @Test + public void givenNewCommands_whenCalled_thenCheckIfIsAlive() throws IOException { + String command = "curl --location --request GET \"https://postman-echo.com/get?foo1=bar1&foo2=bar2\""; + ProcessBuilder processBuilder = new ProcessBuilder(command.replaceAll("\"", "").split(" ")); + processBuilder.directory(new File("/home/")); + Process process = processBuilder.start(); + + // Re-use processBuilder + processBuilder.command(new String[]{"newCommand", "arguments"}); + + Assert.assertEquals(true, process.isAlive()); + } + + @Test + public void whenRequestGet_thenReturnSuccessResponseCode() throws IOException { + String url = "https://postman-echo.com/get?foo1=bar1&foo2=bar2"; + URL urlObj = new URL(url); + HttpURLConnection connection = (HttpURLConnection) urlObj.openConnection(); + connection.setDoOutput(true); + connection.setInstanceFollowRedirects(false); + connection.setRequestMethod("GET"); + connection.connect(); + + Assert.assertEquals(HttpURLConnection.HTTP_OK, connection.getResponseCode()); + } + +} From 082724abecd4bc514baadc96b4a3046570254609 Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Sat, 5 Jan 2019 10:38:13 +0530 Subject: [PATCH 288/359] BAEL-2536-addressed review comments --- .../java/com/baeldung/string/Pangram.java | 6 ++-- .../com/baeldung/string/PangramUnitTest.java | 29 +++++++++---------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/java-strings/src/main/java/com/baeldung/string/Pangram.java b/java-strings/src/main/java/com/baeldung/string/Pangram.java index 8498a7074a..c09b0c1d29 100644 --- a/java-strings/src/main/java/com/baeldung/string/Pangram.java +++ b/java-strings/src/main/java/com/baeldung/string/Pangram.java @@ -15,10 +15,10 @@ public class Pangram { Boolean[] alphabetMarker = new Boolean[ALPHABET_COUNT]; Arrays.fill(alphabetMarker, false); int alphabetIndex = 0; - str = str.toUpperCase(); + String strUpper = str.toUpperCase(); for (int i = 0; i < str.length(); i++) { - if ('A' <= str.charAt(i) && str.charAt(i) <= 'Z') { - alphabetIndex = str.charAt(i) - 'A'; + if ('A' <= strUpper.charAt(i) && strUpper.charAt(i) <= 'Z') { + alphabetIndex = strUpper.charAt(i) - 'A'; alphabetMarker[alphabetIndex] = true; } } diff --git a/java-strings/src/test/java/com/baeldung/string/PangramUnitTest.java b/java-strings/src/test/java/com/baeldung/string/PangramUnitTest.java index 67523a4524..36e603b535 100644 --- a/java-strings/src/test/java/com/baeldung/string/PangramUnitTest.java +++ b/java-strings/src/test/java/com/baeldung/string/PangramUnitTest.java @@ -4,39 +4,38 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.junit.Test; - public class PangramUnitTest { - + @Test - public void givenValidString_isPanagram_shouldReturnSuccess() { + public void givenValidString_isPangram_shouldReturnSuccess() { String input = "Two driven jocks help fax my big quiz"; - assertTrue(Pangram.isPangram(input)); - assertTrue(Pangram.isPangramWithStreams(input)); + assertTrue(Pangram.isPangram(input)); + assertTrue(Pangram.isPangramWithStreams(input)); } - + @Test - public void givenNullString_isPanagram_shouldReturnFailure() { + public void givenNullString_isPangram_shouldReturnFailure() { String input = null; assertFalse(Pangram.isPangram(input)); assertFalse(Pangram.isPangramWithStreams(input)); assertFalse(Pangram.isPerfectPangram(input)); } - + @Test - public void givenPerfectPanagramString_isPerfectPanagram_shouldReturnSuccess() { + public void givenPerfectPangramString_isPerfectPangram_shouldReturnSuccess() { String input = "abcdefghijklmNoPqrStuVwxyz"; - assertTrue(Pangram.isPerfectPangram(input)); + assertTrue(Pangram.isPerfectPangram(input)); } - + @Test - public void givenNonPanagramString_isPanagram_shouldReturnFailure() { - String input = "invalid panagram"; + public void givenNonPangramString_isPangram_shouldReturnFailure() { + String input = "invalid pangram"; assertFalse(Pangram.isPangram(input)); assertFalse(Pangram.isPangramWithStreams(input)); } - + @Test - public void givenPanagram_isPerfectPanagram_shouldReturnFailure() { + public void givenPangram_isPerfectPangram_shouldReturnFailure() { String input = "Two driven jocks help fax my big quiz"; assertFalse(Pangram.isPerfectPangram(input)); } From 833285f2ba1407fda131542e2c261d5763f2f656 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sat, 5 Jan 2019 11:12:31 +0200 Subject: [PATCH 289/359] Update README.md --- core-java-collections-list/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core-java-collections-list/README.md b/core-java-collections-list/README.md index aba53f5b30..a35e714006 100644 --- a/core-java-collections-list/README.md +++ b/core-java-collections-list/README.md @@ -24,4 +24,5 @@ - [Java List Initialization in One Line](https://www.baeldung.com/java-init-list-one-line) - [Ways to Iterate Over a List in Java](https://www.baeldung.com/java-iterate-list) - [ClassCastException: Arrays$ArrayList cannot be cast to ArrayList](https://www.baeldung.com/java-classcastexception-arrays-arraylist) -- [Flattening Nested Collections in Java](http://www.baeldung.com/java-flatten-nested-collections) \ No newline at end of file +- [Flattening Nested Collections in Java](http://www.baeldung.com/java-flatten-nested-collections) +- [Intersection of Two Lists in Java](https://www.baeldung.com/java-lists-intersection) From ceb41607f0d406080bffe30fad8f450feab0f06f Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sat, 5 Jan 2019 11:13:39 +0200 Subject: [PATCH 290/359] Update README.md --- core-java-collections/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-collections/README.md b/core-java-collections/README.md index bde0f9fdb9..be83621429 100644 --- a/core-java-collections/README.md +++ b/core-java-collections/README.md @@ -30,5 +30,4 @@ - [Join and Split Arrays and Collections in Java](http://www.baeldung.com/java-join-and-split) - [A Guide to EnumMap](https://www.baeldung.com/java-enum-map) - [A Guide to Iterator in Java](http://www.baeldung.com/java-iterator) -- [Intersection of Two Lists in Java](https://www.baeldung.com/java-lists-intersection) - [Differences Between HashMap and Hashtable](https://www.baeldung.com/hashmap-hashtable-differences) From b1352b58e08542038ab4973a16617a205e1b3226 Mon Sep 17 00:00:00 2001 From: Kumar Chandrakant Date: Sat, 5 Jan 2019 17:52:23 +0530 Subject: [PATCH 291/359] Adding files for the tutorial BAEL-2301 (#6066) --- apache-spark/pom.xml | 68 ++++++++- .../java/com/baeldung/data/pipeline/Word.java | 25 ++++ .../data/pipeline/WordCountingApp.java | 116 +++++++++++++++ .../WordCountingAppWithCheckpoint.java | 140 ++++++++++++++++++ 4 files changed, 345 insertions(+), 4 deletions(-) create mode 100644 apache-spark/src/main/java/com/baeldung/data/pipeline/Word.java create mode 100644 apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingApp.java create mode 100644 apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingAppWithCheckpoint.java diff --git a/apache-spark/pom.xml b/apache-spark/pom.xml index 290b63a14d..b05b97198d 100644 --- a/apache-spark/pom.xml +++ b/apache-spark/pom.xml @@ -15,16 +15,76 @@ - org.apache.spark - spark-core_2.10 + spark-core_2.11 ${org.apache.spark.spark-core.version} + provided + + org.apache.spark + spark-sql_2.11 + ${org.apache.spark.spark-sql.version} + provided + + + org.apache.spark + spark-streaming_2.11 + ${org.apache.spark.spark-streaming.version} + provided + + + org.apache.spark + spark-streaming-kafka-0-10_2.11 + ${org.apache.spark.spark-streaming-kafka.version} + + + com.datastax.spark + spark-cassandra-connector_2.11 + ${com.datastax.spark.spark-cassandra-connector.version} + + + com.datastax.spark + spark-cassandra-connector-java_2.11 + ${com.datastax.spark.spark-cassandra-connector-java.version} + - + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.2 + + 1.8 + 1.8 + + + + maven-assembly-plugin + + + package + + single + + + + + + jar-with-dependencies + + + + + - 2.2.0 + 2.3.0 + 2.3.0 + 2.3.0 + 2.3.0 + 2.3.0 + 1.5.2 diff --git a/apache-spark/src/main/java/com/baeldung/data/pipeline/Word.java b/apache-spark/src/main/java/com/baeldung/data/pipeline/Word.java new file mode 100644 index 0000000000..b0caa468b1 --- /dev/null +++ b/apache-spark/src/main/java/com/baeldung/data/pipeline/Word.java @@ -0,0 +1,25 @@ +package com.baeldung.data.pipeline; + +import java.io.Serializable; + +public class Word implements Serializable { + private static final long serialVersionUID = 1L; + private String word; + private int count; + Word(String word, int count) { + this.word = word; + this.count = count; + } + public String getWord() { + return word; + } + public void setWord(String word) { + this.word = word; + } + public int getCount() { + return count; + } + public void setCount(int count) { + this.count = count; + } +} \ No newline at end of file diff --git a/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingApp.java b/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingApp.java new file mode 100644 index 0000000000..08695b3631 --- /dev/null +++ b/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingApp.java @@ -0,0 +1,116 @@ +package com.baeldung.data.pipeline; + +import static com.datastax.spark.connector.japi.CassandraJavaUtil.javaFunctions; +import static com.datastax.spark.connector.japi.CassandraJavaUtil.mapToRow; + +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.apache.spark.SparkConf; +import org.apache.spark.api.java.JavaPairRDD; +import org.apache.spark.api.java.JavaRDD; +import org.apache.spark.api.java.function.FlatMapFunction; +import org.apache.spark.api.java.function.Function; +import org.apache.spark.api.java.function.Function2; +import org.apache.spark.api.java.function.PairFunction; +import org.apache.spark.api.java.function.VoidFunction; +import org.apache.spark.streaming.Durations; +import org.apache.spark.streaming.api.java.JavaDStream; +import org.apache.spark.streaming.api.java.JavaInputDStream; +import org.apache.spark.streaming.api.java.JavaPairDStream; +import org.apache.spark.streaming.api.java.JavaStreamingContext; +import org.apache.spark.streaming.kafka010.ConsumerStrategies; +import org.apache.spark.streaming.kafka010.KafkaUtils; +import org.apache.spark.streaming.kafka010.LocationStrategies; + +import scala.Tuple2; + +public class WordCountingApp { + + @SuppressWarnings("serial") + public static void main(String[] args) throws InterruptedException { + Logger.getLogger("org") + .setLevel(Level.OFF); + Logger.getLogger("akka") + .setLevel(Level.OFF); + + Map kafkaParams = new HashMap<>(); + kafkaParams.put("bootstrap.servers", "localhost:9092"); + kafkaParams.put("key.deserializer", StringDeserializer.class); + kafkaParams.put("value.deserializer", StringDeserializer.class); + kafkaParams.put("group.id", "use_a_separate_group_id_for_each_stream"); + kafkaParams.put("auto.offset.reset", "latest"); + kafkaParams.put("enable.auto.commit", false); + + Collection topics = Arrays.asList("messages"); + + SparkConf sparkConf = new SparkConf(); + sparkConf.setMaster("local[2]"); + sparkConf.setAppName("WordCountingApp"); + sparkConf.set("spark.cassandra.connection.host", "127.0.0.1"); + + JavaStreamingContext streamingContext = new JavaStreamingContext(sparkConf, Durations.seconds(1)); + + JavaInputDStream> messages = KafkaUtils.createDirectStream(streamingContext, LocationStrategies.PreferConsistent(), ConsumerStrategies. Subscribe(topics, kafkaParams)); + + JavaPairDStream results = messages.mapToPair(new PairFunction, String, String>() { + @Override + public Tuple2 call(ConsumerRecord record) { + return new Tuple2<>(record.key(), record.value()); + } + }); + + JavaDStream lines = results.map(new Function, String>() { + @Override + public String call(Tuple2 tuple2) { + return tuple2._2(); + } + }); + + JavaDStream words = lines.flatMap(new FlatMapFunction() { + @Override + public Iterator call(String x) { + return Arrays.asList(x.split("\\s+")) + .iterator(); + } + }); + + JavaPairDStream wordCounts = words.mapToPair(new PairFunction() { + @Override + public Tuple2 call(String s) { + return new Tuple2<>(s, 1); + } + }) + .reduceByKey(new Function2() { + @Override + public Integer call(Integer i1, Integer i2) { + return i1 + i2; + } + }); + + wordCounts.foreachRDD(new VoidFunction>() { + @Override + public void call(JavaPairRDD javaRdd) throws Exception { + Map wordCountMap = javaRdd.collectAsMap(); + for (String key : wordCountMap.keySet()) { + List words = Arrays.asList(new Word(key, wordCountMap.get(key))); + JavaRDD rdd = streamingContext.sparkContext() + .parallelize(words); + javaFunctions(rdd).writerBuilder("vocabulary", "words", mapToRow(Word.class)) + .saveToCassandra(); + } + } + }); + + streamingContext.start(); + streamingContext.awaitTermination(); + } +} \ No newline at end of file diff --git a/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingAppWithCheckpoint.java b/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingAppWithCheckpoint.java new file mode 100644 index 0000000000..e20b910635 --- /dev/null +++ b/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingAppWithCheckpoint.java @@ -0,0 +1,140 @@ +package com.baeldung.data.pipeline; + +import static com.datastax.spark.connector.japi.CassandraJavaUtil.javaFunctions; +import static com.datastax.spark.connector.japi.CassandraJavaUtil.mapToRow; + +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.apache.spark.SparkConf; +import org.apache.spark.api.java.JavaPairRDD; +import org.apache.spark.api.java.JavaRDD; +import org.apache.spark.api.java.JavaSparkContext; +import org.apache.spark.api.java.Optional; +import org.apache.spark.api.java.function.FlatMapFunction; +import org.apache.spark.api.java.function.Function; +import org.apache.spark.api.java.function.Function2; +import org.apache.spark.api.java.function.Function3; +import org.apache.spark.api.java.function.PairFunction; +import org.apache.spark.api.java.function.VoidFunction; +import org.apache.spark.streaming.Durations; +import org.apache.spark.streaming.State; +import org.apache.spark.streaming.StateSpec; +import org.apache.spark.streaming.api.java.JavaDStream; +import org.apache.spark.streaming.api.java.JavaInputDStream; +import org.apache.spark.streaming.api.java.JavaMapWithStateDStream; +import org.apache.spark.streaming.api.java.JavaPairDStream; +import org.apache.spark.streaming.api.java.JavaStreamingContext; +import org.apache.spark.streaming.kafka010.ConsumerStrategies; +import org.apache.spark.streaming.kafka010.KafkaUtils; +import org.apache.spark.streaming.kafka010.LocationStrategies; + +import scala.Tuple2; + +public class WordCountingAppWithCheckpoint { + + public static JavaSparkContext sparkContext; + + @SuppressWarnings("serial") + public static void main(String[] args) throws InterruptedException { + + Logger.getLogger("org") + .setLevel(Level.OFF); + Logger.getLogger("akka") + .setLevel(Level.OFF); + + Map kafkaParams = new HashMap<>(); + kafkaParams.put("bootstrap.servers", "localhost:9092"); + kafkaParams.put("key.deserializer", StringDeserializer.class); + kafkaParams.put("value.deserializer", StringDeserializer.class); + kafkaParams.put("group.id", "use_a_separate_group_id_for_each_stream"); + kafkaParams.put("auto.offset.reset", "latest"); + kafkaParams.put("enable.auto.commit", false); + + Collection topics = Arrays.asList("messages"); + + SparkConf sparkConf = new SparkConf(); + sparkConf.setMaster("local[2]"); + sparkConf.setAppName("WordCountingAppWithCheckpoint"); + sparkConf.set("spark.cassandra.connection.host", "127.0.0.1"); + + JavaStreamingContext streamingContext = new JavaStreamingContext(sparkConf, Durations.seconds(1)); + + sparkContext = streamingContext.sparkContext(); + + streamingContext.checkpoint("./.checkpoint"); + + JavaInputDStream> messages = KafkaUtils.createDirectStream(streamingContext, LocationStrategies.PreferConsistent(), ConsumerStrategies. Subscribe(topics, kafkaParams)); + + JavaPairDStream results = messages.mapToPair(new PairFunction, String, String>() { + @Override + public Tuple2 call(ConsumerRecord record) { + return new Tuple2<>(record.key(), record.value()); + } + }); + + JavaDStream lines = results.map(new Function, String>() { + @Override + public String call(Tuple2 tuple2) { + return tuple2._2(); + } + }); + + JavaDStream words = lines.flatMap(new FlatMapFunction() { + @Override + public Iterator call(String x) { + return Arrays.asList(x.split("\\s+")) + .iterator(); + } + }); + + JavaPairDStream wordCounts = words.mapToPair(new PairFunction() { + @Override + public Tuple2 call(String s) { + return new Tuple2<>(s, 1); + } + }) + .reduceByKey(new Function2() { + @Override + public Integer call(Integer i1, Integer i2) { + return i1 + i2; + } + }); + + Function3, State, Tuple2> mappingFunc = (word, one, state) -> { + int sum = one.orElse(0) + (state.exists() ? state.get() : 0); + Tuple2 output = new Tuple2<>(word, sum); + state.update(sum); + return output; + }; + + JavaPairRDD initialRDD = JavaPairRDD.fromJavaRDD(sparkContext.emptyRDD()); + + JavaMapWithStateDStream> cumulativeWordCounts = wordCounts.mapWithState(StateSpec.function(mappingFunc) + .initialState(initialRDD)); + + cumulativeWordCounts.foreachRDD(new VoidFunction>>() { + @Override + public void call(JavaRDD> javaRdd) throws Exception { + List> wordCountList = javaRdd.collect(); + for (Tuple2 tuple : wordCountList) { + List words = Arrays.asList(new Word(tuple._1, tuple._2)); + JavaRDD rdd = sparkContext.parallelize(words); + javaFunctions(rdd).writerBuilder("vocabulary", "words", mapToRow(Word.class)) + .saveToCassandra(); + } + } + }); + + streamingContext.start(); + streamingContext.awaitTermination(); + } +} \ No newline at end of file From e3e1c84b24458a2a37799568fcdfe06acf3453e6 Mon Sep 17 00:00:00 2001 From: Maiklins Date: Sat, 5 Jan 2019 13:27:25 +0100 Subject: [PATCH 292/359] BAEL-2485 Permutations of an array in Java (#6027) --- .../algorithms/permutation/Permutation.java | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/permutation/Permutation.java diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/permutation/Permutation.java b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/permutation/Permutation.java new file mode 100644 index 0000000000..7fedd78ffb --- /dev/null +++ b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/permutation/Permutation.java @@ -0,0 +1,123 @@ +package com.baeldung.algorithms.permutation; + +import java.util.Arrays; +import java.util.Collections; + +public class Permutation { + + public static void printAllRecursive(T[] elements, char delimiter) { + printAllRecursive(elements.length, elements, delimiter); + } + + public static void printAllRecursive(int n, T[] elements, char delimiter) { + + if(n == 1) { + printArray(elements, delimiter); + } else { + for(int i = 0; i < n-1; i++) { + printAllRecursive(n - 1, elements, delimiter); + if(n % 2 == 0) { + swap(elements, i, n-1); + } else { + swap(elements, 0, n-1); + } + } + printAllRecursive(n - 1, elements, delimiter); + } + } + + public static void printAllIterative(int n, T[] elements, char delimiter) { + + int[] indexes = new int[n]; + for (int i = 0; i < n; i++) { + indexes[i] = 0; + } + + printArray(elements, delimiter); + + int i = 0; + while (i < n) { + if (indexes[i] < i) { + swap(elements, i % 2 == 0 ? 0: indexes[i], i); + printArray(elements, delimiter); + indexes[i]++; + i = 0; + } + else { + indexes[i] = 0; + i++; + } + } + } + + public static > void printAllOrdered(T[] elements, char delimiter) { + + Arrays.sort(elements); + boolean hasNext = true; + + while(hasNext) { + printArray(elements, delimiter); + int k = 0, l = 0; + hasNext = false; + for (int i = elements.length - 1; i > 0; i--) { + if (elements[i].compareTo(elements[i - 1]) > 0) { + k = i - 1; + hasNext = true; + break; + } + } + + for (int i = elements.length - 1; i > k; i--) { + if (elements[i].compareTo(elements[k]) > 0) { + l = i; + break; + } + } + + swap(elements, k, l); + Collections.reverse(Arrays.asList(elements).subList(k + 1, elements.length)); + } + } + + public static void printRandom(T[] elements, char delimiter) { + + Collections.shuffle(Arrays.asList(elements)); + printArray(elements, delimiter); + } + + private static void swap(T[] elements, int a, int b) { + + T tmp = elements[a]; + elements[a] = elements[b]; + elements[b] = tmp; + } + + private static void printArray(T[] elements, char delimiter) { + + String delimiterSpace = delimiter + " "; + for(int i = 0; i < elements.length; i++) { + System.out.print(elements[i] + delimiterSpace); + } + System.out.print('\n'); + } + + public static void main(String[] argv) { + + Integer[] elements = {1,2,3,4}; + + System.out.println("Rec:"); + printAllRecursive(elements, ';'); + + System.out.println("Iter:"); + printAllIterative(elements.length, elements, ';'); + + System.out.println("Orderes:"); + printAllOrdered(elements, ';'); + + System.out.println("Random:"); + printRandom(elements, ';'); + + System.out.println("Random:"); + printRandom(elements, ';'); + } +} From cceb6a022e41bc84b7aa0ddd8a9cb8ea538d9019 Mon Sep 17 00:00:00 2001 From: pcoates33 Date: Sat, 5 Jan 2019 12:39:43 +0000 Subject: [PATCH 293/359] spring-boot ehcache example added (#6012) --- pom.xml | 3 + spring-ehcache/.gitignore | 13 +++ spring-ehcache/README.md | 7 ++ spring-ehcache/checkstyle.xml | 11 +++ spring-ehcache/pom.xml | 87 +++++++++++++++++++ .../com/baeldung/cachetest/Application.java | 13 +++ .../cachetest/config/CacheConfig.java | 57 ++++++++++++ .../cachetest/config/CacheEventLogger.java | 18 ++++ .../cachetest/rest/NumberController.java | 29 +++++++ .../cachetest/service/NumberService.java | 22 +++++ 10 files changed, 260 insertions(+) create mode 100644 spring-ehcache/.gitignore create mode 100644 spring-ehcache/README.md create mode 100644 spring-ehcache/checkstyle.xml create mode 100644 spring-ehcache/pom.xml create mode 100644 spring-ehcache/src/main/java/com/baeldung/cachetest/Application.java create mode 100644 spring-ehcache/src/main/java/com/baeldung/cachetest/config/CacheConfig.java create mode 100644 spring-ehcache/src/main/java/com/baeldung/cachetest/config/CacheEventLogger.java create mode 100644 spring-ehcache/src/main/java/com/baeldung/cachetest/rest/NumberController.java create mode 100644 spring-ehcache/src/main/java/com/baeldung/cachetest/service/NumberService.java diff --git a/pom.xml b/pom.xml index e8ff86665c..4dba0da173 100644 --- a/pom.xml +++ b/pom.xml @@ -663,6 +663,7 @@ spring-dispatcher-servlet spring-drools + spring-ehcache spring-ejb spring-exceptions @@ -882,6 +883,7 @@ spring-data-rest spring-dispatcher-servlet spring-drools + spring-ehcache spring-freemarker persistence-modules/spring-hibernate-3 persistence-modules/spring-hibernate4 @@ -1370,6 +1372,7 @@ spring-dispatcher-servlet spring-drools + spring-ehcache spring-ejb spring-exceptions diff --git a/spring-ehcache/.gitignore b/spring-ehcache/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/spring-ehcache/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/spring-ehcache/README.md b/spring-ehcache/README.md new file mode 100644 index 0000000000..749441375e --- /dev/null +++ b/spring-ehcache/README.md @@ -0,0 +1,7 @@ +## Spring Ehcache Example Project + +A simple example of using ehcache with spring-boot. + +### Relevant Articles: +- [Spring Boot Ehcache Example](http://www.baeldung.com/spring-ehcache) + diff --git a/spring-ehcache/checkstyle.xml b/spring-ehcache/checkstyle.xml new file mode 100644 index 0000000000..85063a7570 --- /dev/null +++ b/spring-ehcache/checkstyle.xml @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/spring-ehcache/pom.xml b/spring-ehcache/pom.xml new file mode 100644 index 0000000000..b8378617c5 --- /dev/null +++ b/spring-ehcache/pom.xml @@ -0,0 +1,87 @@ + + 4.0.0 + spring-ehcache + 0.1-SNAPSHOT + spring-ehcache + jar + + + 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-cache + + + javax.cache + cache-api + + + org.ehcache + ehcache + + + + + spring-ehcache + + + src/main/resources + true + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-checkstyle-plugin + ${checkstyle-maven-plugin.version} + + checkstyle.xml + + + + + check + + + + + + + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + ${checkstyle-maven-plugin.version} + + checkstyle.xml + + + + + + + + 3.0.0 + false + + + diff --git a/spring-ehcache/src/main/java/com/baeldung/cachetest/Application.java b/spring-ehcache/src/main/java/com/baeldung/cachetest/Application.java new file mode 100644 index 0000000000..a1ce7a5317 --- /dev/null +++ b/spring-ehcache/src/main/java/com/baeldung/cachetest/Application.java @@ -0,0 +1,13 @@ +package com.baeldung.cachetest; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} \ No newline at end of file diff --git a/spring-ehcache/src/main/java/com/baeldung/cachetest/config/CacheConfig.java b/spring-ehcache/src/main/java/com/baeldung/cachetest/config/CacheConfig.java new file mode 100644 index 0000000000..3cf2309cb9 --- /dev/null +++ b/spring-ehcache/src/main/java/com/baeldung/cachetest/config/CacheConfig.java @@ -0,0 +1,57 @@ +package com.baeldung.cachetest.config; + +import java.math.BigDecimal; +import java.time.Duration; + +import javax.cache.CacheManager; + +import org.ehcache.config.CacheConfiguration; +import org.ehcache.config.ResourcePools; +import org.ehcache.config.builders.CacheConfigurationBuilder; +import org.ehcache.config.builders.CacheEventListenerConfigurationBuilder; +import org.ehcache.config.builders.ExpiryPolicyBuilder; +import org.ehcache.config.builders.ResourcePoolsBuilder; +import org.ehcache.config.units.EntryUnit; +import org.ehcache.config.units.MemoryUnit; +import org.ehcache.event.EventType; +import org.ehcache.jsr107.Eh107Configuration; +import org.springframework.boot.autoconfigure.cache.JCacheManagerCustomizer; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableCaching +public class CacheConfig { + + private static final int ON_HEAP_CACHE_SIZE_ENTRIES = 2; + private static final int OFF_HEAP_CACHE_SIZE_MB = 10; + private static final int CACHE_EXPIRY_SECONDS = 30; + + @Bean + public JCacheManagerCustomizer jcacheManagerCustomizer() { + return new JCacheManagerCustomizer() { + + @Override + public void customize(CacheManager cacheManager) { + ResourcePools resourcePools = ResourcePoolsBuilder.newResourcePoolsBuilder() + .heap(ON_HEAP_CACHE_SIZE_ENTRIES, EntryUnit.ENTRIES) + .offheap(OFF_HEAP_CACHE_SIZE_MB, MemoryUnit.MB).build(); + + CacheEventListenerConfigurationBuilder eventLoggerConfig = CacheEventListenerConfigurationBuilder + .newEventListenerConfiguration(new CacheEventLogger(), EventType.CREATED, EventType.EXPIRED) + .unordered().asynchronous(); + + CacheConfiguration cacheConfiguration = CacheConfigurationBuilder + .newCacheConfigurationBuilder(Long.class, BigDecimal.class, resourcePools) + .withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(CACHE_EXPIRY_SECONDS))) + .add(eventLoggerConfig).build(); + + cacheManager.createCache("squareCache", + Eh107Configuration.fromEhcacheCacheConfiguration(cacheConfiguration)); + + } + }; + } + +} diff --git a/spring-ehcache/src/main/java/com/baeldung/cachetest/config/CacheEventLogger.java b/spring-ehcache/src/main/java/com/baeldung/cachetest/config/CacheEventLogger.java new file mode 100644 index 0000000000..c8ead85f1e --- /dev/null +++ b/spring-ehcache/src/main/java/com/baeldung/cachetest/config/CacheEventLogger.java @@ -0,0 +1,18 @@ +package com.baeldung.cachetest.config; + +import org.ehcache.event.CacheEvent; +import org.ehcache.event.CacheEventListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class CacheEventLogger implements CacheEventListener { + + private static final Logger log = LoggerFactory.getLogger(CacheEventLogger.class); + + @Override + public void onEvent(CacheEvent cacheEvent) { + log.info("Cache event {} for item with key {}. Old value = {}, New value = {}", cacheEvent.getType(), + cacheEvent.getKey(), cacheEvent.getOldValue(), cacheEvent.getNewValue()); + } + +} diff --git a/spring-ehcache/src/main/java/com/baeldung/cachetest/rest/NumberController.java b/spring-ehcache/src/main/java/com/baeldung/cachetest/rest/NumberController.java new file mode 100644 index 0000000000..4115c34cc4 --- /dev/null +++ b/spring-ehcache/src/main/java/com/baeldung/cachetest/rest/NumberController.java @@ -0,0 +1,29 @@ +package com.baeldung.cachetest.rest; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.cachetest.service.NumberService; + +@RestController +@RequestMapping(path = "/number", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) +public class NumberController { + + private final static Logger log = LoggerFactory.getLogger(NumberController.class); + + @Autowired + private NumberService numberService; + + @GetMapping(path = "/square/{number}") + public String getThing(@PathVariable Long number) { + log.info("call numberService to square {}", number); + return String.format("{\"square\": %s}", numberService.square(number)); + } + +} diff --git a/spring-ehcache/src/main/java/com/baeldung/cachetest/service/NumberService.java b/spring-ehcache/src/main/java/com/baeldung/cachetest/service/NumberService.java new file mode 100644 index 0000000000..bcd930f5e1 --- /dev/null +++ b/spring-ehcache/src/main/java/com/baeldung/cachetest/service/NumberService.java @@ -0,0 +1,22 @@ +package com.baeldung.cachetest.service; + +import java.math.BigDecimal; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +@Service +public class NumberService { + + private final static Logger log = LoggerFactory.getLogger(NumberService.class); + + @Cacheable(value = "squareCache", key = "#number", condition = "#number>10") + public BigDecimal square(Long number) { + BigDecimal square = BigDecimal.valueOf(number).multiply(BigDecimal.valueOf(number)); + log.info("square of {} is {}", number, square); + return square; + } + +} From b5c29f0e1b556229ad9f29412cbecdcd62da7bb7 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sat, 5 Jan 2019 20:11:29 +0530 Subject: [PATCH 294/359] [BAEL-11403] - Moved DoubleToString and DoubleToStringUnitTest to java-numbers module --- .../src/main/java/com/baeldung/string/DoubleToString.java | 0 .../src/test/java/com/baeldung/string/DoubleToStringUnitTest.java | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename {core-java => java-numbers}/src/main/java/com/baeldung/string/DoubleToString.java (100%) rename {core-java => java-numbers}/src/test/java/com/baeldung/string/DoubleToStringUnitTest.java (100%) diff --git a/core-java/src/main/java/com/baeldung/string/DoubleToString.java b/java-numbers/src/main/java/com/baeldung/string/DoubleToString.java similarity index 100% rename from core-java/src/main/java/com/baeldung/string/DoubleToString.java rename to java-numbers/src/main/java/com/baeldung/string/DoubleToString.java diff --git a/core-java/src/test/java/com/baeldung/string/DoubleToStringUnitTest.java b/java-numbers/src/test/java/com/baeldung/string/DoubleToStringUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/string/DoubleToStringUnitTest.java rename to java-numbers/src/test/java/com/baeldung/string/DoubleToStringUnitTest.java From bcc848f6a71688ead0c5d61d32abe3a53a984982 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sat, 5 Jan 2019 18:35:47 +0200 Subject: [PATCH 295/359] Update DoubleToString.java --- .../src/main/java/com/baeldung/string/DoubleToString.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java-numbers/src/main/java/com/baeldung/string/DoubleToString.java b/java-numbers/src/main/java/com/baeldung/string/DoubleToString.java index d26d26f3df..dd55ba51ad 100644 --- a/java-numbers/src/main/java/com/baeldung/string/DoubleToString.java +++ b/java-numbers/src/main/java/com/baeldung/string/DoubleToString.java @@ -38,4 +38,5 @@ public class DoubleToString { return df.format(d); } + } From 9c45b7eda8e7f2eea9bc9ef8fd45d28fd9608db1 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sat, 5 Jan 2019 18:44:33 +0200 Subject: [PATCH 296/359] Update README.MD --- spring-boot-testing/README.MD | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-testing/README.MD b/spring-boot-testing/README.MD index a609b5bf09..144c3581f7 100644 --- a/spring-boot-testing/README.MD +++ b/spring-boot-testing/README.MD @@ -4,3 +4,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: - [Testing with Spring and Spock](https://www.baeldung.com/spring-spock-testing) +- [Exclude Auto-Configuration Classes in Spring Boot Tests](https://www.baeldung.com/spring-boot-exclude-auto-configuration-test) From 994cb303a0595e96c0ec699a70e323391fe9366a Mon Sep 17 00:00:00 2001 From: dupirefr Date: Sat, 5 Jan 2019 19:03:14 +0100 Subject: [PATCH 297/359] [BAEL-2424] Added classes and tests --- .../com/baeldung/reflection/Employee.java | 7 + .../baeldung/reflection/MonthEmployee.java | 7 + .../java/com/baeldung/reflection/Person.java | 8 ++ .../PersonAndEmployeeReflectionTest.java | 128 ++++++++++++++++++ 4 files changed, 150 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/reflection/Employee.java create mode 100644 core-java/src/main/java/com/baeldung/reflection/MonthEmployee.java create mode 100644 core-java/src/main/java/com/baeldung/reflection/Person.java create mode 100644 core-java/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionTest.java diff --git a/core-java/src/main/java/com/baeldung/reflection/Employee.java b/core-java/src/main/java/com/baeldung/reflection/Employee.java new file mode 100644 index 0000000000..833cf26b14 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/reflection/Employee.java @@ -0,0 +1,7 @@ +package com.baeldung.reflection; + +public class Employee extends Person { + + public int employeeId; + +} diff --git a/core-java/src/main/java/com/baeldung/reflection/MonthEmployee.java b/core-java/src/main/java/com/baeldung/reflection/MonthEmployee.java new file mode 100644 index 0000000000..697ecc1500 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/reflection/MonthEmployee.java @@ -0,0 +1,7 @@ +package com.baeldung.reflection; + +public class MonthEmployee extends Employee { + + private double reward; + +} diff --git a/core-java/src/main/java/com/baeldung/reflection/Person.java b/core-java/src/main/java/com/baeldung/reflection/Person.java new file mode 100644 index 0000000000..23b312cdd9 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/reflection/Person.java @@ -0,0 +1,8 @@ +package com.baeldung.reflection; + +public class Person { + + public String lastName; + private String firstName; + +} diff --git a/core-java/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionTest.java b/core-java/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionTest.java new file mode 100644 index 0000000000..034e54ee93 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionTest.java @@ -0,0 +1,128 @@ +package com.baeldung.reflection; + +import org.junit.Test; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static org.junit.Assert.*; + +public class PersonAndEmployeeReflectionTest { + + // Fields names + private static final String LAST_NAME_FIELD = "lastName"; + private static final String FIRST_NAME_FIELD = "firstName"; + private static final String EMPLOYEE_ID_FIELD = "employeeId"; + private static final String MONTH_EMPLOYEE_REWARD_FIELD = "reward"; + + @Test + public void givenPersonClass_whenGetDeclaredFields_thenTwoFields() { + // When + Field[] allFields = Person.class.getDeclaredFields(); + + // Then + assertEquals(2, allFields.length); + + Field lastNameField = allFields[0]; + assertEquals(LAST_NAME_FIELD, lastNameField.getName()); + assertEquals(String.class, lastNameField.getType()); + + Field firstNameField = allFields[1]; + assertEquals(FIRST_NAME_FIELD, firstNameField.getName()); + assertEquals(String.class, firstNameField.getType()); + } + + @Test + public void givenEmployeeClass_whenSuperClassGetDeclaredFields_thenOneField() { + // When + Field[] allFields = Employee.class.getSuperclass().getDeclaredFields(); + + // Then + assertEquals(2, allFields.length); + + Field lastNameField = allFields[0]; + assertEquals(LAST_NAME_FIELD, lastNameField.getName()); + assertEquals(String.class, lastNameField.getType()); + + Field firstNameField = allFields[1]; + assertEquals(FIRST_NAME_FIELD, firstNameField.getName()); + assertEquals(String.class, firstNameField.getType()); + } + + @Test + public void givenEmployeeClass_whenGetDeclaredFields_thenOneField() { + // When + Field[] allFields = Employee.class.getDeclaredFields(); + + // Then + assertEquals(1, allFields.length); + + Field employeeIdField = allFields[0]; + assertEquals(EMPLOYEE_ID_FIELD, employeeIdField.getName()); + assertEquals(int.class, employeeIdField.getType()); + } + + @Test + public void givenEmployeeClass_whenGetDeclaredFieldsOnBothClasses_thenThreeFields() { + // When + Field[] personFields = Employee.class.getSuperclass().getDeclaredFields(); + Field[] employeeFields = Employee.class.getDeclaredFields(); + Field[] allFields = new Field[employeeFields.length + personFields.length]; + Arrays.setAll(allFields, i -> (i < personFields.length ? personFields[i] : employeeFields[i - personFields.length])); + + // Then + assertEquals(3, allFields.length); + + Field lastNameField = allFields[0]; + assertEquals(LAST_NAME_FIELD, lastNameField.getName()); + assertEquals(String.class, lastNameField.getType()); + + Field firstNameField = allFields[1]; + assertEquals(FIRST_NAME_FIELD, firstNameField.getName()); + assertEquals(String.class, firstNameField.getType()); + + Field employeeIdField = allFields[2]; + assertEquals(EMPLOYEE_ID_FIELD, employeeIdField.getName()); + assertEquals(int.class, employeeIdField.getType()); + } + + @Test + public void givenMonthEmployeeClass_whenGetAllFields_thenFourFields() { + // When + List allFields = getAllFields(MonthEmployee.class); + + // Then + assertEquals(4, allFields.size()); + + Field lastNameField = allFields.get(0); + assertEquals(LAST_NAME_FIELD, lastNameField.getName()); + assertEquals(String.class, lastNameField.getType()); + + Field firstNameField = allFields.get(1); + assertEquals(FIRST_NAME_FIELD, firstNameField.getName()); + assertEquals(String.class, firstNameField.getType()); + + Field employeeIdField = allFields.get(2); + assertEquals(EMPLOYEE_ID_FIELD, employeeIdField.getName()); + assertEquals(int.class, employeeIdField.getType()); + + Field monthEmployeeRewardField = allFields.get(3); + assertEquals(MONTH_EMPLOYEE_REWARD_FIELD, monthEmployeeRewardField.getName()); + assertEquals(double.class, monthEmployeeRewardField.getType()); + } + + public List getAllFields(Class clazz) { + if (clazz == null) { + return Collections.emptyList(); + } + + List result = new ArrayList<>(); + result.addAll(getAllFields(clazz.getSuperclass())); + result.addAll(Arrays.asList(clazz.getDeclaredFields())); + return result; + } + +} \ No newline at end of file From fe44881bb15a18497d1fb8f25c78db52dd4cf91d Mon Sep 17 00:00:00 2001 From: pandachris Date: Sun, 6 Jan 2019 01:21:28 +0700 Subject: [PATCH 298/359] BAEL-2565 (#6077) * BAEL-2565 * BAEL-2565 Test code consistency --- .../com/baeldung/enums/values/Element1.java | 17 ++++ .../com/baeldung/enums/values/Element2.java | 52 ++++++++++ .../com/baeldung/enums/values/Element3.java | 63 ++++++++++++ .../com/baeldung/enums/values/Element4.java | 95 +++++++++++++++++++ .../com/baeldung/enums/values/Labeled.java | 5 + .../enums/values/Element1UnitTest.java | 48 ++++++++++ .../enums/values/Element2UnitTest.java | 59 ++++++++++++ .../enums/values/Element3UnitTest.java | 57 +++++++++++ .../enums/values/Element4UnitTest.java | 71 ++++++++++++++ 9 files changed, 467 insertions(+) create mode 100644 core-java-8/src/main/java/com/baeldung/enums/values/Element1.java create mode 100644 core-java-8/src/main/java/com/baeldung/enums/values/Element2.java create mode 100644 core-java-8/src/main/java/com/baeldung/enums/values/Element3.java create mode 100644 core-java-8/src/main/java/com/baeldung/enums/values/Element4.java create mode 100644 core-java-8/src/main/java/com/baeldung/enums/values/Labeled.java create mode 100644 core-java-8/src/test/java/com/baeldung/enums/values/Element1UnitTest.java create mode 100644 core-java-8/src/test/java/com/baeldung/enums/values/Element2UnitTest.java create mode 100644 core-java-8/src/test/java/com/baeldung/enums/values/Element3UnitTest.java create mode 100644 core-java-8/src/test/java/com/baeldung/enums/values/Element4UnitTest.java diff --git a/core-java-8/src/main/java/com/baeldung/enums/values/Element1.java b/core-java-8/src/main/java/com/baeldung/enums/values/Element1.java new file mode 100644 index 0000000000..6c80adacb1 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/enums/values/Element1.java @@ -0,0 +1,17 @@ +package com.baeldung.enums.values; + +/** + * This is a simple enum of periodic table elements + */ +public enum Element1 { + H, + HE, + LI, + BE, + B, + C, + N, + O, + F, + NE +} diff --git a/core-java-8/src/main/java/com/baeldung/enums/values/Element2.java b/core-java-8/src/main/java/com/baeldung/enums/values/Element2.java new file mode 100644 index 0000000000..28bf3a475a --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/enums/values/Element2.java @@ -0,0 +1,52 @@ +package com.baeldung.enums.values; + +/** + * The simple enum has been enhanced to add the name of the element. + */ +public enum Element2 { + H("Hydrogen"), + HE("Helium"), + LI("Lithium"), + BE("Beryllium"), + B("Boron"), + C("Carbon"), + N("Nitrogen"), + O("Oxygen"), + F("Flourine"), + NE("Neon"); + + /** a final variable to store the label, which can't be changed */ + public final String label; + + /** + * A private constructor that sets the label. + * @param label + */ + private Element2(String label) { + this.label = label; + } + + /** + * Look up Element2 instances by the label field. This implementation iterates through + * the values() list to find the label. + * @param label The label to look up + * @return The Element2 instance with the label, or null if not found. + */ + public static Element2 valueOfLabel(String label) { + for (Element2 e2 : values()) { + if (e2.label.equals(label)) { + return e2; + } + } + return null; + } + + /** + * Override the toString() method to return the label instead of the declared name. + * @return + */ + @Override + public String toString() { + return this.label; + } +} diff --git a/core-java-8/src/main/java/com/baeldung/enums/values/Element3.java b/core-java-8/src/main/java/com/baeldung/enums/values/Element3.java new file mode 100644 index 0000000000..cb98695de8 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/enums/values/Element3.java @@ -0,0 +1,63 @@ +package com.baeldung.enums.values; + +import java.util.HashMap; +import java.util.Map; + +/** + * A Map has been added to cache labels for faster lookup. + */ +public enum Element3 { + H("Hydrogen"), + HE("Helium"), + LI("Lithium"), + BE("Beryllium"), + B("Boron"), + C("Carbon"), + N("Nitrogen"), + O("Oxygen"), + F("Flourine"), + NE("Neon"); + + /** + * A map to cache labels and their associated Element3 instances. + * Note that this only works if the labels are all unique! + */ + private static final Map BY_LABEL = new HashMap<>(); + + /** populate the BY_LABEL cache */ + static { + for (Element3 e3 : values()) { + BY_LABEL.put(e3.label, e3); + } + } + + /** a final variable to store the label, which can't be changed */ + public final String label; + + /** + * A private constructor that sets the label. + * @param label + */ + private Element3(String label) { + this.label = label; + } + + /** + * Look up Element2 instances by the label field. This implementation finds the + * label in the BY_LABEL cache. + * @param label The label to look up + * @return The Element3 instance with the label, or null if not found. + */ + public static Element3 valueOfLabel(String label) { + return BY_LABEL.get(label); + } + + /** + * Override the toString() method to return the label instead of the declared name. + * @return + */ + @Override + public String toString() { + return this.label; + } +} diff --git a/core-java-8/src/main/java/com/baeldung/enums/values/Element4.java b/core-java-8/src/main/java/com/baeldung/enums/values/Element4.java new file mode 100644 index 0000000000..89c45f9d1b --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/enums/values/Element4.java @@ -0,0 +1,95 @@ +package com.baeldung.enums.values; + +import java.util.HashMap; +import java.util.Map; + +/** + * Multiple fields have been added and the Labeled interface is implemented. + */ +public enum Element4 implements Labeled { + H("Hydrogen", 1, 1.008f), + HE("Helium", 2, 4.0026f), + LI("Lithium", 3, 6.94f), + BE("Beryllium", 4, 9.01722f), + B("Boron", 5, 10.81f), + C("Carbon", 6, 12.011f), + N("Nitrogen", 7, 14.007f), + O("Oxygen", 8, 15.999f), + F("Flourine", 9, 18.998f), + NE("Neon", 10, 20.180f); + /** + * Maps cache labels and their associated Element3 instances. + * Note that this only works if the values are all unique! + */ + private static final Map BY_LABEL = new HashMap<>(); + private static final Map BY_ATOMIC_NUMBER = new HashMap<>(); + private static final Map BY_ATOMIC_WEIGHT = new HashMap<>(); + + /** populate the caches */ + static { + for (Element4 e4 : values()) { + BY_LABEL.put(e4.label, e4); + BY_ATOMIC_NUMBER.put(e4.atomicNumber, e4); + BY_ATOMIC_WEIGHT.put(e4.atomicWeight, e4); + } + } + + /** final variables to store the values, which can't be changed */ + public final String label; + public final int atomicNumber; + public final float atomicWeight; + + private Element4(String label, int atomicNumber, float atomicWeight) { + this.label = label; + this.atomicNumber = atomicNumber; + this.atomicWeight = atomicWeight; + } + + /** + * Implement the Labeled interface. + * @return the label value + */ + @Override + public String label() { + return label; + } + + /** + * Look up Element2 instances by the label field. This implementation finds the + * label in the BY_LABEL cache. + * @param label The label to look up + * @return The Element4 instance with the label, or null if not found. + */ + public static Element4 valueOfLabel(String label) { + return BY_LABEL.get(label); + } + + /** + * Look up Element2 instances by the atomicNumber field. This implementation finds the + * atomicNUmber in the cache. + * @param number The atomicNumber to look up + * @return The Element4 instance with the label, or null if not found. + */ + public static Element4 valueOfAtomicNumber(int number) { + return BY_ATOMIC_NUMBER.get(number); + } + + /** + * Look up Element2 instances by the atomicWeight field. This implementation finds the + * atomic weight in the cache. + * @param weight the atomic weight to look up + * @return The Element4 instance with the label, or null if not found. + */ + public static Element4 valueOfAtomicWeight(float weight) { + return BY_ATOMIC_WEIGHT.get(weight); + } + + /** + * Override the toString() method to return the label instead of the declared name. + * @return + */ + @Override + public String toString() { + return this.label; + } +} diff --git a/core-java-8/src/main/java/com/baeldung/enums/values/Labeled.java b/core-java-8/src/main/java/com/baeldung/enums/values/Labeled.java new file mode 100644 index 0000000000..e41d6525f1 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/enums/values/Labeled.java @@ -0,0 +1,5 @@ +package com.baeldung.enums.values; + +public interface Labeled { + String label(); +} diff --git a/core-java-8/src/test/java/com/baeldung/enums/values/Element1UnitTest.java b/core-java-8/src/test/java/com/baeldung/enums/values/Element1UnitTest.java new file mode 100644 index 0000000000..ab3e684230 --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/enums/values/Element1UnitTest.java @@ -0,0 +1,48 @@ +package com.baeldung.enums.values; + +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 chris + */ +public class Element1UnitTest { + + public Element1UnitTest() { + } + + @BeforeClass + public static void setUpClass() { + } + + @AfterClass + public static void tearDownClass() { + } + + @Before + public void setUp() { + } + + @After + public void tearDown() { + } + + @Test + public void whenAccessingToString_thenItShouldEqualName() { + for (Element1 e1 : Element1.values()) { + assertEquals(e1.name(), e1.toString()); + } + } + + @Test + public void whenCallingValueOf_thenReturnTheCorrectEnum() { + for (Element1 e1 : Element1.values()) { + assertSame(e1, Element1.valueOf(e1.name())); + } + } +} diff --git a/core-java-8/src/test/java/com/baeldung/enums/values/Element2UnitTest.java b/core-java-8/src/test/java/com/baeldung/enums/values/Element2UnitTest.java new file mode 100644 index 0000000000..02995a2f41 --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/enums/values/Element2UnitTest.java @@ -0,0 +1,59 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.baeldung.enums.values; + +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.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + * @author chris + */ +public class Element2UnitTest { + private static final Logger LOGGER = LoggerFactory.getLogger(Element2UnitTest.class); + + public Element2UnitTest() { + } + + @BeforeClass + public static void setUpClass() { + } + + @AfterClass + public static void tearDownClass() { + } + + @Before + public void setUp() { + } + + @After + public void tearDown() { + } + + @Test + public void whenLocatebyLabel_thenReturnCorrectValue() { + for (Element2 e2 : Element2.values()) { + assertSame(e2, Element2.valueOfLabel(e2.label)); + } + } + + /** + * Test of toString method, of class Element2. + */ + @Test + public void whenCallingToString_thenReturnLabel() { + for (Element2 e2 : Element2.values()) { + assertEquals(e2.label, e2.toString()); + } + } +} diff --git a/core-java-8/src/test/java/com/baeldung/enums/values/Element3UnitTest.java b/core-java-8/src/test/java/com/baeldung/enums/values/Element3UnitTest.java new file mode 100644 index 0000000000..40c76a97b1 --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/enums/values/Element3UnitTest.java @@ -0,0 +1,57 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.baeldung.enums.values; + +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 chris + */ +public class Element3UnitTest { + + public Element3UnitTest() { + } + + @BeforeClass + public static void setUpClass() { + } + + @AfterClass + public static void tearDownClass() { + } + + @Before + public void setUp() { + } + + @After + public void tearDown() { + } + + @Test + public void whenLocatebyLabel_thenReturnCorrectValue() { + for (Element3 e3 : Element3.values()) { + assertSame(e3, Element3.valueOfLabel(e3.label)); + } + } + + /** + * Test of toString method, of class Element3. + */ + @Test + public void whenCallingToString_thenReturnLabel() { + for (Element3 e3 : Element3.values()) { + assertEquals(e3.label, e3.toString()); + } + } + +} diff --git a/core-java-8/src/test/java/com/baeldung/enums/values/Element4UnitTest.java b/core-java-8/src/test/java/com/baeldung/enums/values/Element4UnitTest.java new file mode 100644 index 0000000000..d349dcef72 --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/enums/values/Element4UnitTest.java @@ -0,0 +1,71 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.baeldung.enums.values; + +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 chris + */ +public class Element4UnitTest { + + public Element4UnitTest() { + } + + @BeforeClass + public static void setUpClass() { + } + + @AfterClass + public static void tearDownClass() { + } + + @Before + public void setUp() { + } + + @After + public void tearDown() { + } + + @Test + public void whenLocatebyLabel_thenReturnCorrectValue() { + for (Element4 e4 : Element4.values()) { + assertSame(e4, Element4.valueOfLabel(e4.label)); + } + } + + @Test + public void whenLocatebyAtmNum_thenReturnCorrectValue() { + for (Element4 e4 : Element4.values()) { + assertSame(e4, Element4.valueOfAtomicNumber(e4.atomicNumber)); + } + } + + @Test + public void whenLocatebyAtmWt_thenReturnCorrectValue() { + for (Element4 e4 : Element4.values()) { + assertSame(e4, Element4.valueOfAtomicWeight(e4.atomicWeight)); + } + } + + /** + * Test of toString method, of class Element4. + */ + @Test + public void whenCallingToString_thenReturnLabel() { + for (Element4 e4 : Element4.values()) { + assertEquals(e4.label, e4.toString()); + } + } + +} From 2d8ea6d287b2542ba7b4e5a13e3711d613b65ea8 Mon Sep 17 00:00:00 2001 From: kyleandari <44148335+kyleandari@users.noreply.github.com> Date: Sat, 5 Jan 2019 13:25:22 -0500 Subject: [PATCH 299/359] Bael 2431 (#6073) * Adding code to java core and deleting it from java-8 * removing failed unittest * removing space --- .../com/baeldung/interfaces/Electronic.java | 22 ---------------- .../com/baeldung/interfaces/Motorcycle.java | 10 ------- .../java/com/baeldung/interfaces/Truck.java | 8 ------ .../java/com/baeldung/interfaces/Vehicle.java | 6 ----- .../interfaces/multiinheritance/Vehicle.java | 13 ---------- .../interfaces/polymorphysim/Circle.java | 25 ------------------ .../polymorphysim/DisplayShape.java | 26 ------------------- .../polymorphysim/FunctionalMain.java | 23 ---------------- .../polymorphysim/MainPolymorphic.java | 15 ----------- .../interfaces/polymorphysim/Shape.java | 9 ------- .../interfaces/polymorphysim/Square.java | 25 ------------------ .../interfaces/PolymorphysimUnitTest.java | 26 ------------------- .../java/com/baeldung/interfaces/Box.java | 5 ++++ .../com/baeldung/interfaces/Employee.java | 1 - .../interfaces/EmployeeSalaryComparator.java | 7 +++-- .../com/baeldung/interfaces/HasColor.java | 3 +-- .../interfaces/multiinheritance/Car.java | 3 ++- .../interfaces/multiinheritance/Fly.java | 3 ++- .../multiinheritance/Transform.java | 0 .../interfaces/multiinheritance/Vehicle.java | 4 +++ .../interfaces/polymorphysim/Circle.java | 9 +++++++ .../polymorphysim/MainTestClass.java | 20 ++++++++++++++ .../interfaces/polymorphysim/Shape.java | 6 +++++ .../interfaces/polymorphysim/Square.java | 9 +++++++ 24 files changed, 61 insertions(+), 217 deletions(-) delete mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/Electronic.java delete mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/Motorcycle.java delete mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/Truck.java delete mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/Vehicle.java delete mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java delete mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java delete mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/DisplayShape.java delete mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/FunctionalMain.java delete mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/MainPolymorphic.java delete mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java delete mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java delete mode 100644 core-java-8/src/test/java/com/baeldung/interfaces/PolymorphysimUnitTest.java create mode 100644 core-java/src/main/java/com/baeldung/interfaces/Box.java rename {core-java-8 => core-java}/src/main/java/com/baeldung/interfaces/Employee.java (99%) rename {core-java-8 => core-java}/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java (67%) rename {core-java-8 => core-java}/src/main/java/com/baeldung/interfaces/HasColor.java (66%) rename {core-java-8 => core-java}/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java (84%) rename {core-java-8 => core-java}/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java (69%) rename {core-java-8 => core-java}/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java (100%) create mode 100644 core-java/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java create mode 100644 core-java/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java create mode 100644 core-java/src/main/java/com/baeldung/interfaces/polymorphysim/MainTestClass.java create mode 100644 core-java/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java create mode 100644 core-java/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/Electronic.java b/core-java-8/src/main/java/com/baeldung/interfaces/Electronic.java deleted file mode 100644 index bfbc381483..0000000000 --- a/core-java-8/src/main/java/com/baeldung/interfaces/Electronic.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.baeldung.interfaces; - -public interface Electronic { - //Constant variable - public static final String LED = "LED"; - - //Abstract method - public int getElectricityUse(); - - // Static method - public static boolean isEnergyEfficient(String electtronicType) { - if (electtronicType.equals(LED)) { - return true; - } - return false; - } - - //Default method - public default void printDescription() { - System.out.println("Electronic Description"); - } -} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/Motorcycle.java b/core-java-8/src/main/java/com/baeldung/interfaces/Motorcycle.java deleted file mode 100644 index 6003f476a3..0000000000 --- a/core-java-8/src/main/java/com/baeldung/interfaces/Motorcycle.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.baeldung.interfaces; - -import com.baeldung.interfaces.multiinheritance.Transform; - -public class Motorcycle implements Transform { - @Override - public void transform() { - // Implementation - } -} \ No newline at end of file diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/Truck.java b/core-java-8/src/main/java/com/baeldung/interfaces/Truck.java deleted file mode 100644 index d78de23371..0000000000 --- a/core-java-8/src/main/java/com/baeldung/interfaces/Truck.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.baeldung.interfaces; - -public class Truck extends Vehicle { - @Override - public void transform() { - // implementation - } -} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/Vehicle.java b/core-java-8/src/main/java/com/baeldung/interfaces/Vehicle.java deleted file mode 100644 index 8b4662e1a3..0000000000 --- a/core-java-8/src/main/java/com/baeldung/interfaces/Vehicle.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.baeldung.interfaces; - -import com.baeldung.interfaces.multiinheritance.Transform; - -public abstract class Vehicle implements Transform { -} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java b/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java deleted file mode 100644 index fb0d36e3e0..0000000000 --- a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.interfaces.multiinheritance; - -public class Vehicle implements Fly, Transform { - @Override - public void fly() { - System.out.println("I can Fly!!"); - } - - @Override - public void transform() { - System.out.println("I can Transform!!"); - } -} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java deleted file mode 100644 index afb3142d96..0000000000 --- a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.interfaces.polymorphysim; - -public class Circle implements Shape { - - private double radius; - - public Circle(double radius){ - this.radius = radius; - } - - @Override - public String name() { - return "Circle"; - } - - @Override - public double area() { - return Math.PI * (radius * radius); - } - - @Override - public String getColor() { - return "green"; - } -} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/DisplayShape.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/DisplayShape.java deleted file mode 100644 index d9c9dd107a..0000000000 --- a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/DisplayShape.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.baeldung.interfaces.polymorphysim; - -import java.util.ArrayList; - -public class DisplayShape { - - private ArrayList shapes; - - public ArrayList getShapes() { - return shapes; - } - - public DisplayShape() { - shapes = new ArrayList<>(); - } - - public void add(Shape shape) { - shapes.add(shape); - } - - public void display() { - for (Shape shape : shapes) { - System.out.println(shape.name() + " area: " + shape.area()); - } - } -} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/FunctionalMain.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/FunctionalMain.java deleted file mode 100644 index 5316dd7db7..0000000000 --- a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/FunctionalMain.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.interfaces.polymorphysim; - -import java.util.function.Predicate; - -public class FunctionalMain { - -public static void main(String[] args) { - Shape circleShape = new Circle(2); - Shape squareShape = new Square(2); - - DisplayShape DisplayShape = new DisplayShape(); - DisplayShape.add(circleShape); - DisplayShape.add(squareShape); - - Predicate checkArea = (shape) -> shape.area() < 5; - - for (Shape shape : DisplayShape.getShapes()) { - if (checkArea.test(shape)) { - System.out.println(shape.name() + " " + shape.area()); - } - } -} -} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/MainPolymorphic.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/MainPolymorphic.java deleted file mode 100644 index cc43c1300b..0000000000 --- a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/MainPolymorphic.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.baeldung.interfaces.polymorphysim; - -public class MainPolymorphic { - public static void main(String[] args){ - - Shape circleShape = new Circle(2); - Shape squareShape = new Square(2); - - DisplayShape displayShape = new DisplayShape(); - displayShape.add(circleShape); - displayShape.add(squareShape); - - displayShape.display(); - } -} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java deleted file mode 100644 index 560e07a80a..0000000000 --- a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.baeldung.interfaces.polymorphysim; - -import com.baeldung.interfaces.HasColor; - -public interface Shape extends HasColor { - - public abstract String name(); - public abstract double area(); -} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java deleted file mode 100644 index 00b75ace20..0000000000 --- a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.interfaces.polymorphysim; - -public class Square implements Shape { - - private double width; - - public Square(double width) { - this.width = width; - } - - @Override - public String name() { - return "Square"; - } - - @Override - public double area() { - return width * width; - } - - @Override - public String getColor() { - return "red"; - } -} diff --git a/core-java-8/src/test/java/com/baeldung/interfaces/PolymorphysimUnitTest.java b/core-java-8/src/test/java/com/baeldung/interfaces/PolymorphysimUnitTest.java deleted file mode 100644 index 7ded5e6621..0000000000 --- a/core-java-8/src/test/java/com/baeldung/interfaces/PolymorphysimUnitTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.baeldung.interfaces; - -import com.baeldung.interfaces.polymorphysim.Circle; -import com.baeldung.interfaces.polymorphysim.Shape; -import com.baeldung.interfaces.polymorphysim.Square; -import org.assertj.core.api.Assertions; -import org.junit.Test; - -public class PolymorphysimUnitTest { - - @Test - public void whenInterfacePointsToCircle_CircleAreaMethodisBeingCalled(){ - double expectedArea = 12.566370614359172; - Shape circle = new Circle(2); - double actualArea = circle.area(); - Assertions.assertThat(actualArea).isEqualTo(expectedArea); - } - - @Test - public void whenInterfacePointsToSquare_SquareAreaMethodisBeingCalled(){ - double expectedArea = 4; - Shape square = new Square(2); - double actualArea = square.area(); - Assertions.assertThat(actualArea).isEqualTo(expectedArea); - } -} diff --git a/core-java/src/main/java/com/baeldung/interfaces/Box.java b/core-java/src/main/java/com/baeldung/interfaces/Box.java new file mode 100644 index 0000000000..0bb6560465 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/interfaces/Box.java @@ -0,0 +1,5 @@ +package com.baeldung.interfaces; + +public interface Box extends HasColor { + int getHeight(); +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/Employee.java b/core-java/src/main/java/com/baeldung/interfaces/Employee.java similarity index 99% rename from core-java-8/src/main/java/com/baeldung/interfaces/Employee.java rename to core-java/src/main/java/com/baeldung/interfaces/Employee.java index 903bc81e6f..8c6bd3f7f3 100644 --- a/core-java-8/src/main/java/com/baeldung/interfaces/Employee.java +++ b/core-java/src/main/java/com/baeldung/interfaces/Employee.java @@ -11,5 +11,4 @@ public class Employee { public void setSalary(double salary) { this.salary = salary; } - } diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java b/core-java/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java similarity index 67% rename from core-java-8/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java rename to core-java/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java index cfa4226c1a..5c841b7c2b 100644 --- a/core-java-8/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java +++ b/core-java/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java @@ -6,12 +6,11 @@ public class EmployeeSalaryComparator implements Comparator { @Override public int compare(Employee employeeA, Employee employeeB) { - - if(employeeA.getSalary() < employeeB.getSalary()){ + if (employeeA.getSalary() < employeeB.getSalary()) { return -1; - }else if(employeeA.getSalary() > employeeB.getSalary()){ + } else if (employeeA.getSalary() > employeeB.getSalary()) { return 1; - }else{ + } else { return 0; } } diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/HasColor.java b/core-java/src/main/java/com/baeldung/interfaces/HasColor.java similarity index 66% rename from core-java-8/src/main/java/com/baeldung/interfaces/HasColor.java rename to core-java/src/main/java/com/baeldung/interfaces/HasColor.java index 6eface2d47..d9688ea866 100644 --- a/core-java-8/src/main/java/com/baeldung/interfaces/HasColor.java +++ b/core-java/src/main/java/com/baeldung/interfaces/HasColor.java @@ -1,5 +1,4 @@ package com.baeldung.interfaces; public interface HasColor { - public String getColor(); -} \ No newline at end of file +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java b/core-java/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java similarity index 84% rename from core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java rename to core-java/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java index b951fc0273..d9b30a1e7b 100644 --- a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java +++ b/core-java/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java @@ -1,6 +1,7 @@ package com.baeldung.interfaces.multiinheritance; -public class Car implements Fly, Transform { +public class Car implements Fly,Transform { + @Override public void fly() { System.out.println("I can Fly!!"); diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java b/core-java/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java similarity index 69% rename from core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java rename to core-java/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java index d84182aec6..611e51c67b 100644 --- a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java +++ b/core-java/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java @@ -1,5 +1,6 @@ package com.baeldung.interfaces.multiinheritance; -public abstract interface Fly{ +public interface Fly { + void fly(); } diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java b/core-java/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java similarity index 100% rename from core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java rename to core-java/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java diff --git a/core-java/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java b/core-java/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java new file mode 100644 index 0000000000..be25e112ee --- /dev/null +++ b/core-java/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java @@ -0,0 +1,4 @@ +package com.baeldung.interfaces.multiinheritance; + +public abstract class Vehicle implements Transform { +} diff --git a/core-java/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java b/core-java/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java new file mode 100644 index 0000000000..b4d97bd53a --- /dev/null +++ b/core-java/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java @@ -0,0 +1,9 @@ +package com.baeldung.interfaces.polymorphysim; + +public class Circle implements Shape { + + @Override + public String name() { + return "Circle"; + } +} diff --git a/core-java/src/main/java/com/baeldung/interfaces/polymorphysim/MainTestClass.java b/core-java/src/main/java/com/baeldung/interfaces/polymorphysim/MainTestClass.java new file mode 100644 index 0000000000..5cce3c3af0 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/interfaces/polymorphysim/MainTestClass.java @@ -0,0 +1,20 @@ +package com.baeldung.interfaces.polymorphysim; + +import java.util.ArrayList; +import java.util.List; + +public class MainTestClass { + + public static void main(String[] args) { + List shapes = new ArrayList<>(); + Shape circleShape = new Circle(); + Shape squareShape = new Square(); + + shapes.add(circleShape); + shapes.add(squareShape); + + for (Shape shape : shapes) { + System.out.println(shape.name()); + } + } +} diff --git a/core-java/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java b/core-java/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java new file mode 100644 index 0000000000..885dc73de2 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java @@ -0,0 +1,6 @@ +package com.baeldung.interfaces.polymorphysim; + +public interface Shape { + + String name(); +} diff --git a/core-java/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java b/core-java/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java new file mode 100644 index 0000000000..c17bdd902d --- /dev/null +++ b/core-java/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java @@ -0,0 +1,9 @@ +package com.baeldung.interfaces.polymorphysim; + +public class Square implements Shape { + + @Override + public String name() { + return "Square"; + } +} From 1d14de6b4b2a2fba456967a38a9e9623e925d5a2 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sat, 5 Jan 2019 22:39:29 +0200 Subject: [PATCH 300/359] Update and rename PersonAndEmployeeReflectionTest.java to PersonAndEmployeeReflectionUnitTest.java --- ...tionTest.java => PersonAndEmployeeReflectionUnitTest.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename core-java/src/test/java/com/baeldung/reflection/{PersonAndEmployeeReflectionTest.java => PersonAndEmployeeReflectionUnitTest.java} (98%) diff --git a/core-java/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionTest.java b/core-java/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java similarity index 98% rename from core-java/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionTest.java rename to core-java/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java index 034e54ee93..c051f165f1 100644 --- a/core-java/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionTest.java +++ b/core-java/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java @@ -10,7 +10,7 @@ import java.util.List; import static org.junit.Assert.*; -public class PersonAndEmployeeReflectionTest { +public class PersonAndEmployeeReflectionUnitTest { // Fields names private static final String LAST_NAME_FIELD = "lastName"; @@ -125,4 +125,4 @@ public class PersonAndEmployeeReflectionTest { return result; } -} \ No newline at end of file +} From cd4be8ce9eba7905eecb78dd1195bc2ca7936ac5 Mon Sep 17 00:00:00 2001 From: kyleandari <44148335+kyleandari@users.noreply.github.com> Date: Sat, 5 Jan 2019 15:56:01 -0500 Subject: [PATCH 301/359] moving code from java-core to java-core-lang (#6084) --- .../src/main/java/com/baeldung/interfaces/Box.java | 0 .../src/main/java/com/baeldung/interfaces/Employee.java | 0 .../java/com/baeldung/interfaces/EmployeeSalaryComparator.java | 0 .../src/main/java/com/baeldung/interfaces/HasColor.java | 0 .../main/java/com/baeldung/interfaces/multiinheritance/Car.java | 0 .../main/java/com/baeldung/interfaces/multiinheritance/Fly.java | 0 .../java/com/baeldung/interfaces/multiinheritance/Transform.java | 0 .../java/com/baeldung/interfaces/multiinheritance/Vehicle.java | 0 .../main/java/com/baeldung/interfaces/polymorphysim/Circle.java | 0 .../java/com/baeldung/interfaces/polymorphysim/MainTestClass.java | 0 .../main/java/com/baeldung/interfaces/polymorphysim/Shape.java | 0 .../main/java/com/baeldung/interfaces/polymorphysim/Square.java | 0 12 files changed, 0 insertions(+), 0 deletions(-) rename {core-java => core-java-lang}/src/main/java/com/baeldung/interfaces/Box.java (100%) rename {core-java => core-java-lang}/src/main/java/com/baeldung/interfaces/Employee.java (100%) rename {core-java => core-java-lang}/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java (100%) rename {core-java => core-java-lang}/src/main/java/com/baeldung/interfaces/HasColor.java (100%) rename {core-java => core-java-lang}/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java (100%) rename {core-java => core-java-lang}/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java (100%) rename {core-java => core-java-lang}/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java (100%) rename {core-java => core-java-lang}/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java (100%) rename {core-java => core-java-lang}/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java (100%) rename {core-java => core-java-lang}/src/main/java/com/baeldung/interfaces/polymorphysim/MainTestClass.java (100%) rename {core-java => core-java-lang}/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java (100%) rename {core-java => core-java-lang}/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java (100%) diff --git a/core-java/src/main/java/com/baeldung/interfaces/Box.java b/core-java-lang/src/main/java/com/baeldung/interfaces/Box.java similarity index 100% rename from core-java/src/main/java/com/baeldung/interfaces/Box.java rename to core-java-lang/src/main/java/com/baeldung/interfaces/Box.java diff --git a/core-java/src/main/java/com/baeldung/interfaces/Employee.java b/core-java-lang/src/main/java/com/baeldung/interfaces/Employee.java similarity index 100% rename from core-java/src/main/java/com/baeldung/interfaces/Employee.java rename to core-java-lang/src/main/java/com/baeldung/interfaces/Employee.java diff --git a/core-java/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java b/core-java-lang/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java similarity index 100% rename from core-java/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java rename to core-java-lang/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java diff --git a/core-java/src/main/java/com/baeldung/interfaces/HasColor.java b/core-java-lang/src/main/java/com/baeldung/interfaces/HasColor.java similarity index 100% rename from core-java/src/main/java/com/baeldung/interfaces/HasColor.java rename to core-java-lang/src/main/java/com/baeldung/interfaces/HasColor.java diff --git a/core-java/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java b/core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java similarity index 100% rename from core-java/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java rename to core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java diff --git a/core-java/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java b/core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java similarity index 100% rename from core-java/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java rename to core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java diff --git a/core-java/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java b/core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java similarity index 100% rename from core-java/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java rename to core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java diff --git a/core-java/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java b/core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java similarity index 100% rename from core-java/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java rename to core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java diff --git a/core-java/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java b/core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java similarity index 100% rename from core-java/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java rename to core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java diff --git a/core-java/src/main/java/com/baeldung/interfaces/polymorphysim/MainTestClass.java b/core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/MainTestClass.java similarity index 100% rename from core-java/src/main/java/com/baeldung/interfaces/polymorphysim/MainTestClass.java rename to core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/MainTestClass.java diff --git a/core-java/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java b/core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java similarity index 100% rename from core-java/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java rename to core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java diff --git a/core-java/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java b/core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java similarity index 100% rename from core-java/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java rename to core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java From 20e8886165192cd55e5151120b07ff0029242e28 Mon Sep 17 00:00:00 2001 From: Kumar Chandrakant Date: Sun, 6 Jan 2019 19:26:21 +0530 Subject: [PATCH 302/359] Kafka spark cassandra (#6078) * Adding files for the tutorial BAEL-2301 * Incorporating review comments on the article. --- .../data/pipeline/WordCountingApp.java | 58 ++++------------ .../WordCountingAppWithCheckpoint.java | 66 +++++-------------- 2 files changed, 29 insertions(+), 95 deletions(-) diff --git a/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingApp.java b/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingApp.java index 08695b3631..1155644e1e 100644 --- a/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingApp.java +++ b/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingApp.java @@ -6,7 +6,6 @@ import static com.datastax.spark.connector.japi.CassandraJavaUtil.mapToRow; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; @@ -35,7 +34,6 @@ import scala.Tuple2; public class WordCountingApp { - @SuppressWarnings("serial") public static void main(String[] args) throws InterruptedException { Logger.getLogger("org") .setLevel(Level.OFF); @@ -61,52 +59,24 @@ public class WordCountingApp { JavaInputDStream> messages = KafkaUtils.createDirectStream(streamingContext, LocationStrategies.PreferConsistent(), ConsumerStrategies. Subscribe(topics, kafkaParams)); - JavaPairDStream results = messages.mapToPair(new PairFunction, String, String>() { - @Override - public Tuple2 call(ConsumerRecord record) { - return new Tuple2<>(record.key(), record.value()); - } - }); + JavaPairDStream results = messages.mapToPair((PairFunction, String, String>) record -> new Tuple2<>(record.key(), record.value())); - JavaDStream lines = results.map(new Function, String>() { - @Override - public String call(Tuple2 tuple2) { - return tuple2._2(); - } - }); + JavaDStream lines = results.map((Function, String>) tuple2 -> tuple2._2()); - JavaDStream words = lines.flatMap(new FlatMapFunction() { - @Override - public Iterator call(String x) { - return Arrays.asList(x.split("\\s+")) - .iterator(); - } - }); + JavaDStream words = lines.flatMap((FlatMapFunction) x -> Arrays.asList(x.split("\\s+")) + .iterator()); - JavaPairDStream wordCounts = words.mapToPair(new PairFunction() { - @Override - public Tuple2 call(String s) { - return new Tuple2<>(s, 1); - } - }) - .reduceByKey(new Function2() { - @Override - public Integer call(Integer i1, Integer i2) { - return i1 + i2; - } - }); + JavaPairDStream wordCounts = words.mapToPair((PairFunction) s -> new Tuple2<>(s, 1)) + .reduceByKey((Function2) (i1, i2) -> i1 + i2); - wordCounts.foreachRDD(new VoidFunction>() { - @Override - public void call(JavaPairRDD javaRdd) throws Exception { - Map wordCountMap = javaRdd.collectAsMap(); - for (String key : wordCountMap.keySet()) { - List words = Arrays.asList(new Word(key, wordCountMap.get(key))); - JavaRDD rdd = streamingContext.sparkContext() - .parallelize(words); - javaFunctions(rdd).writerBuilder("vocabulary", "words", mapToRow(Word.class)) - .saveToCassandra(); - } + wordCounts.foreachRDD((VoidFunction>) javaRdd -> { + Map wordCountMap = javaRdd.collectAsMap(); + for (String key : wordCountMap.keySet()) { + List wordList = Arrays.asList(new Word(key, wordCountMap.get(key))); + JavaRDD rdd = streamingContext.sparkContext() + .parallelize(wordList); + javaFunctions(rdd).writerBuilder("vocabulary", "words", mapToRow(Word.class)) + .saveToCassandra(); } }); diff --git a/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingAppWithCheckpoint.java b/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingAppWithCheckpoint.java index e20b910635..79e21f7209 100644 --- a/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingAppWithCheckpoint.java +++ b/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingAppWithCheckpoint.java @@ -6,7 +6,6 @@ import static com.datastax.spark.connector.japi.CassandraJavaUtil.mapToRow; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; @@ -15,7 +14,6 @@ import org.apache.kafka.common.serialization.StringDeserializer; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.spark.SparkConf; -import org.apache.spark.api.java.JavaPairRDD; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.api.java.Optional; @@ -43,7 +41,6 @@ public class WordCountingAppWithCheckpoint { public static JavaSparkContext sparkContext; - @SuppressWarnings("serial") public static void main(String[] args) throws InterruptedException { Logger.getLogger("org") @@ -74,63 +71,30 @@ public class WordCountingAppWithCheckpoint { JavaInputDStream> messages = KafkaUtils.createDirectStream(streamingContext, LocationStrategies.PreferConsistent(), ConsumerStrategies. Subscribe(topics, kafkaParams)); - JavaPairDStream results = messages.mapToPair(new PairFunction, String, String>() { - @Override - public Tuple2 call(ConsumerRecord record) { - return new Tuple2<>(record.key(), record.value()); - } - }); + JavaPairDStream results = messages.mapToPair((PairFunction, String, String>) record -> new Tuple2<>(record.key(), record.value())); - JavaDStream lines = results.map(new Function, String>() { - @Override - public String call(Tuple2 tuple2) { - return tuple2._2(); - } - }); + JavaDStream lines = results.map((Function, String>) tuple2 -> tuple2._2()); - JavaDStream words = lines.flatMap(new FlatMapFunction() { - @Override - public Iterator call(String x) { - return Arrays.asList(x.split("\\s+")) - .iterator(); - } - }); + JavaDStream words = lines.flatMap((FlatMapFunction) x -> Arrays.asList(x.split("\\s+")) + .iterator()); - JavaPairDStream wordCounts = words.mapToPair(new PairFunction() { - @Override - public Tuple2 call(String s) { - return new Tuple2<>(s, 1); - } - }) - .reduceByKey(new Function2() { - @Override - public Integer call(Integer i1, Integer i2) { - return i1 + i2; - } - }); + JavaPairDStream wordCounts = words.mapToPair((PairFunction) s -> new Tuple2<>(s, 1)) + .reduceByKey((Function2) (i1, i2) -> i1 + i2); - Function3, State, Tuple2> mappingFunc = (word, one, state) -> { + JavaMapWithStateDStream> cumulativeWordCounts = wordCounts.mapWithState(StateSpec.function((Function3, State, Tuple2>) (word, one, state) -> { int sum = one.orElse(0) + (state.exists() ? state.get() : 0); Tuple2 output = new Tuple2<>(word, sum); state.update(sum); return output; - }; + })); - JavaPairRDD initialRDD = JavaPairRDD.fromJavaRDD(sparkContext.emptyRDD()); - - JavaMapWithStateDStream> cumulativeWordCounts = wordCounts.mapWithState(StateSpec.function(mappingFunc) - .initialState(initialRDD)); - - cumulativeWordCounts.foreachRDD(new VoidFunction>>() { - @Override - public void call(JavaRDD> javaRdd) throws Exception { - List> wordCountList = javaRdd.collect(); - for (Tuple2 tuple : wordCountList) { - List words = Arrays.asList(new Word(tuple._1, tuple._2)); - JavaRDD rdd = sparkContext.parallelize(words); - javaFunctions(rdd).writerBuilder("vocabulary", "words", mapToRow(Word.class)) - .saveToCassandra(); - } + cumulativeWordCounts.foreachRDD((VoidFunction>>) javaRdd -> { + List> wordCountList = javaRdd.collect(); + for (Tuple2 tuple : wordCountList) { + List wordList = Arrays.asList(new Word(tuple._1, tuple._2)); + JavaRDD rdd = sparkContext.parallelize(wordList); + javaFunctions(rdd).writerBuilder("vocabulary", "words", mapToRow(Word.class)) + .saveToCassandra(); } }); From 731a3cd2298232d75ce41fd2ab194f091bca4e36 Mon Sep 17 00:00:00 2001 From: Corneil du Plessis Date: Sun, 6 Jan 2019 16:15:09 +0200 Subject: [PATCH 303/359] BAEL-2104: Spring Boot deployment to AWS Beanstalk (#5951) --- spring-boot-bootstrap/pom.xml | 21 +++++++++++++++++++ .../application-beanstalk.properties | 3 +++ 2 files changed, 24 insertions(+) create mode 100644 spring-boot-bootstrap/src/main/resources/application-beanstalk.properties diff --git a/spring-boot-bootstrap/pom.xml b/spring-boot-bootstrap/pom.xml index 7cafc5aa24..0ffc1820b8 100644 --- a/spring-boot-bootstrap/pom.xml +++ b/spring-boot-bootstrap/pom.xml @@ -57,6 +57,27 @@ + + beanstalk + + ${project.name}-eb + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + + **/cloud/config/*.java + + + + + + openshift diff --git a/spring-boot-bootstrap/src/main/resources/application-beanstalk.properties b/spring-boot-bootstrap/src/main/resources/application-beanstalk.properties new file mode 100644 index 0000000000..de03a3b5bb --- /dev/null +++ b/spring-boot-bootstrap/src/main/resources/application-beanstalk.properties @@ -0,0 +1,3 @@ +spring.datasource.url=jdbc:mysql://${rds.hostname}:${rds.port}/${rds.db.name} +spring.datasource.username=${rds.username} +spring.datasource.password=${rds.password} \ No newline at end of file From e89c0948d8b33be57cecf099b189748c2dc7cc29 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sat, 5 Jan 2019 19:58:09 +0530 Subject: [PATCH 304/359] [BAEL-11415] - Initial commit with sparing-kafka version and topic creation configuration onstatup --- spring-kafka/pom.xml | 2 +- .../spring/kafka/KafkaApplication.java | 18 +++++- .../spring/kafka/KafkaTopicConfig.java | 57 +++++++++++++++++++ .../org/baeldung/SpringContextLiveTest.java | 17 ++++++ 4 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaTopicConfig.java create mode 100644 spring-kafka/src/test/java/org/baeldung/SpringContextLiveTest.java diff --git a/spring-kafka/pom.xml b/spring-kafka/pom.xml index 5c370880b4..b76d4f10c0 100644 --- a/spring-kafka/pom.xml +++ b/spring-kafka/pom.xml @@ -33,7 +33,7 @@ - 1.1.3.RELEASE + 2.2.2.RELEASE 2.9.7 diff --git a/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaApplication.java b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaApplication.java index 4ee7f40335..b313eafdb9 100644 --- a/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaApplication.java +++ b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaApplication.java @@ -13,8 +13,11 @@ import org.springframework.kafka.annotation.KafkaListener; import org.springframework.kafka.annotation.TopicPartition; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.kafka.support.KafkaHeaders; +import org.springframework.kafka.support.SendResult; import org.springframework.messaging.handler.annotation.Header; import org.springframework.messaging.handler.annotation.Payload; +import org.springframework.util.concurrent.ListenableFuture; +import org.springframework.util.concurrent.ListenableFutureCallback; @SpringBootApplication public class KafkaApplication { @@ -98,7 +101,20 @@ public class KafkaApplication { private String greetingTopicName; public void sendMessage(String message) { - kafkaTemplate.send(topicName, message); + + ListenableFuture> future = kafkaTemplate.send(topicName, message); + + future.addCallback(new ListenableFutureCallback>() { + + @Override + public void onSuccess(SendResult result) { + System.out.println("Sent message=[" + message + "] with offset=[" + result.getRecordMetadata().offset() + "]"); + } + @Override + public void onFailure(Throwable ex) { + System.out.println("Unable to send message=[" + message + "] due to : " + ex.getMessage()); + } + }); } public void sendMessageToPartion(String message, int partition) { diff --git a/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaTopicConfig.java b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaTopicConfig.java new file mode 100644 index 0000000000..a3426e78a3 --- /dev/null +++ b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaTopicConfig.java @@ -0,0 +1,57 @@ +package com.baeldung.spring.kafka; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.kafka.clients.admin.AdminClientConfig; +import org.apache.kafka.clients.admin.NewTopic; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.core.KafkaAdmin; + +@Configuration +public class KafkaTopicConfig { + + @Value(value = "${kafka.bootstrapAddress}") + private String bootstrapAddress; + + @Value(value = "${message.topic.name}") + private String topicName; + + @Value(value = "${partitioned.topic.name}") + private String partionedTopicName; + + @Value(value = "${filtered.topic.name}") + private String filteredTopicName; + + @Value(value = "${greeting.topic.name}") + private String greetingTopicName; + + @Bean + public KafkaAdmin kafkaAdmin() { + Map configs = new HashMap<>(); + configs.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress); + return new KafkaAdmin(configs); + } + + @Bean + public NewTopic topic1() { + return new NewTopic(topicName, 1, (short) 1); + } + + @Bean + public NewTopic topic2() { + return new NewTopic(partionedTopicName, 6, (short) 1); + } + + @Bean + public NewTopic topic3() { + return new NewTopic(filteredTopicName, 1, (short) 1); + } + + @Bean + public NewTopic topic4() { + return new NewTopic(greetingTopicName, 1, (short) 1); + } +} diff --git a/spring-kafka/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-kafka/src/test/java/org/baeldung/SpringContextLiveTest.java new file mode 100644 index 0000000000..d8fb3131f5 --- /dev/null +++ b/spring-kafka/src/test/java/org/baeldung/SpringContextLiveTest.java @@ -0,0 +1,17 @@ +package org.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.spring.kafka.KafkaApplication; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = KafkaApplication.class) +public class SpringContextLiveTest { + + @Test + public void whenSpringContextIsBootstrapped_thenNoExceptions() { + } +} From 6f1e14b649b821cb1ab38c9ae3a3b3e24eb8d05d Mon Sep 17 00:00:00 2001 From: Andrey Shcherbakov Date: Sun, 6 Jan 2019 21:31:51 +0100 Subject: [PATCH 305/359] Code for article BAEL-2386 (#5958) * Add code for the article 'Java Primitives versus Objects' * Use JMH for benchmarking the primitive and wrapper classes * Uncomment the benchmarks and remove unused class * Add a binary search tree implementation * Add an example of how to use the binary tree class * Adjust the print statements * Add a code for article #BAEL-2386 --- .../flightrecorder/FlightRecorder.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/flightrecorder/FlightRecorder.java diff --git a/core-java/src/main/java/com/baeldung/flightrecorder/FlightRecorder.java b/core-java/src/main/java/com/baeldung/flightrecorder/FlightRecorder.java new file mode 100644 index 0000000000..02c3e96124 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/flightrecorder/FlightRecorder.java @@ -0,0 +1,32 @@ +package com.baeldung.flightrecorder; + +import java.util.ArrayList; +import java.util.List; + +/** + * Simple program that illustrates how to use Java Flight Recorder. + * + * This programs creates a list, inserts objects in it until + * an OutOfMemoryError is thrown. + * + */ +public class FlightRecorder { + + public static void main(String[] args) { + List items = new ArrayList<>(1); + try { + while (true) { + items.add(new Object()); + } + } catch (OutOfMemoryError e) { + System.out.println(e.getMessage()); + } + assert items.size() > 0; + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + System.out.println(e.getMessage()); + } + } + +} From 65b9909fed4ab0a002cdb8554e0b86c91ae714a1 Mon Sep 17 00:00:00 2001 From: Rajesh Bhojwani Date: Mon, 7 Jan 2019 14:01:13 +0530 Subject: [PATCH 306/359] username:rajeshbhojwani "Java toString() method" (#6047) * Check in code for Java toString method * fix formatting issues * Fix formatting issues * Fix formatting issues * Fix formatting issues * Fix formatting issues * Fix formatting issues * replacing orders with order * Update formatting * Fix formatting * Fix formatting * Fix formatting * Fix formatting * Fix formatting --- .../baeldung/string/tostring/Customer.java | 19 ++++++++ .../tostring/CustomerArrayToString.java | 19 ++++++++ .../CustomerComplexObjectToString.java | 19 ++++++++ .../tostring/CustomerPrimitiveToString.java | 19 ++++++++ .../tostring/CustomerReflectionToString.java | 41 +++++++++++++++++ .../CustomerWrapperCollectionToString.java | 39 ++++++++++++++++ .../com/baeldung/string/tostring/Order.java | 46 +++++++++++++++++++ .../tostring/CustomerArrayToStringTest.java | 26 +++++++++++ .../CustomerComplexObjectToStringTest.java | 25 ++++++++++ .../CustomerPrimitiveToStringTest.java | 22 +++++++++ .../CustomerReflectionToStringTest.java | 32 +++++++++++++ ...CustomerWrapperCollectionToStringTest.java | 33 +++++++++++++ 12 files changed, 340 insertions(+) create mode 100644 java-strings/src/main/java/com/baeldung/string/tostring/Customer.java create mode 100644 java-strings/src/main/java/com/baeldung/string/tostring/CustomerArrayToString.java create mode 100644 java-strings/src/main/java/com/baeldung/string/tostring/CustomerComplexObjectToString.java create mode 100644 java-strings/src/main/java/com/baeldung/string/tostring/CustomerPrimitiveToString.java create mode 100644 java-strings/src/main/java/com/baeldung/string/tostring/CustomerReflectionToString.java create mode 100644 java-strings/src/main/java/com/baeldung/string/tostring/CustomerWrapperCollectionToString.java create mode 100644 java-strings/src/main/java/com/baeldung/string/tostring/Order.java create mode 100644 java-strings/src/test/java/com/baeldung/string/tostring/CustomerArrayToStringTest.java create mode 100644 java-strings/src/test/java/com/baeldung/string/tostring/CustomerComplexObjectToStringTest.java create mode 100644 java-strings/src/test/java/com/baeldung/string/tostring/CustomerPrimitiveToStringTest.java create mode 100644 java-strings/src/test/java/com/baeldung/string/tostring/CustomerReflectionToStringTest.java create mode 100644 java-strings/src/test/java/com/baeldung/string/tostring/CustomerWrapperCollectionToStringTest.java diff --git a/java-strings/src/main/java/com/baeldung/string/tostring/Customer.java b/java-strings/src/main/java/com/baeldung/string/tostring/Customer.java new file mode 100644 index 0000000000..e914a83f0e --- /dev/null +++ b/java-strings/src/main/java/com/baeldung/string/tostring/Customer.java @@ -0,0 +1,19 @@ +package com.baeldung.string.tostring; + +public class Customer { + private String firstName; + private String lastName; + + public String getFirstName() { + return firstName; + } + public void setFirstName(String firstName) { + this.firstName = firstName; + } + public String getLastName() { + return lastName; + } + public void setLastName(String lastName) { + this.lastName = lastName; + } +} diff --git a/java-strings/src/main/java/com/baeldung/string/tostring/CustomerArrayToString.java b/java-strings/src/main/java/com/baeldung/string/tostring/CustomerArrayToString.java new file mode 100644 index 0000000000..1736657276 --- /dev/null +++ b/java-strings/src/main/java/com/baeldung/string/tostring/CustomerArrayToString.java @@ -0,0 +1,19 @@ +package com.baeldung.string.tostring; + +import java.util.Arrays; + +public class CustomerArrayToString extends Customer { + private Order[] orders; + + public Order[] getOrders() { + return orders; + } + public void setOrders(Order[] orders) { + this.orders = orders; + } + @Override + public String toString() { + return "Customer [orders=" + Arrays.toString(orders) + ", getFirstName()=" + getFirstName() + + ", getLastName()=" + getLastName() + "]"; + } +} diff --git a/java-strings/src/main/java/com/baeldung/string/tostring/CustomerComplexObjectToString.java b/java-strings/src/main/java/com/baeldung/string/tostring/CustomerComplexObjectToString.java new file mode 100644 index 0000000000..9bede1b3fc --- /dev/null +++ b/java-strings/src/main/java/com/baeldung/string/tostring/CustomerComplexObjectToString.java @@ -0,0 +1,19 @@ +package com.baeldung.string.tostring; + +public class CustomerComplexObjectToString extends Customer { + private Order order; + + public Order getOrder() { + return order; + } + + public void setOrder(Order order) { + this.order = order; + } + + @Override + public String toString() { + return "Customer [order=" + order + ", getFirstName()=" + getFirstName() + + ", getLastName()=" + getLastName() + "]"; + } +} \ No newline at end of file diff --git a/java-strings/src/main/java/com/baeldung/string/tostring/CustomerPrimitiveToString.java b/java-strings/src/main/java/com/baeldung/string/tostring/CustomerPrimitiveToString.java new file mode 100644 index 0000000000..86e08ca447 --- /dev/null +++ b/java-strings/src/main/java/com/baeldung/string/tostring/CustomerPrimitiveToString.java @@ -0,0 +1,19 @@ +package com.baeldung.string.tostring; + +public class CustomerPrimitiveToString extends Customer { + private long balance; + + public long getBalance() { + return balance; + } + + public void setBalance(long balance) { + this.balance = balance; + } + + @Override + public String toString() { + return "Customer [balance=" + balance + ", getFirstName()=" + getFirstName() + + ", getLastName()=" + getLastName() + "]"; + } +} diff --git a/java-strings/src/main/java/com/baeldung/string/tostring/CustomerReflectionToString.java b/java-strings/src/main/java/com/baeldung/string/tostring/CustomerReflectionToString.java new file mode 100644 index 0000000000..2da1163c63 --- /dev/null +++ b/java-strings/src/main/java/com/baeldung/string/tostring/CustomerReflectionToString.java @@ -0,0 +1,41 @@ +package com.baeldung.string.tostring; + +import java.util.List; + +import org.apache.commons.lang3.builder.ReflectionToStringBuilder; + +public class CustomerReflectionToString extends Customer{ + + private Integer score; + private List orders; + private StringBuffer fullname; + + public Integer getScore() { + return score; + } + + public void setScore(Integer score) { + this.score = score; + } + + public List getOrders() { + return orders; + } + + public void setOrders(List orders) { + this.orders = orders; + } + + public StringBuffer getFullname() { + return fullname; + } + + public void setFullname(StringBuffer fullname) { + this.fullname = fullname; + } + + @Override + public String toString() { + return ReflectionToStringBuilder.toString(this); + } +} diff --git a/java-strings/src/main/java/com/baeldung/string/tostring/CustomerWrapperCollectionToString.java b/java-strings/src/main/java/com/baeldung/string/tostring/CustomerWrapperCollectionToString.java new file mode 100644 index 0000000000..6c7b999045 --- /dev/null +++ b/java-strings/src/main/java/com/baeldung/string/tostring/CustomerWrapperCollectionToString.java @@ -0,0 +1,39 @@ +package com.baeldung.string.tostring; + +import java.util.List; + +public class CustomerWrapperCollectionToString extends Customer { + private Integer score; + private List orders; + private StringBuffer fullname; + + public Integer getScore() { + return score; + } + + public void setScore(Integer score) { + this.score = score; + } + + public List getOrders() { + return orders; + } + + public void setOrders(List orders) { + this.orders = orders; + } + + public StringBuffer getFullname() { + return fullname; + } + + public void setFullname(StringBuffer fullname) { + this.fullname = fullname; + } + + @Override + public String toString() { + return "Customer [score=" + score + ", orders=" + orders + ", fullname=" + fullname + + ", getFirstName()=" + getFirstName() + ", getLastName()=" + getLastName() + "]"; + } +} diff --git a/java-strings/src/main/java/com/baeldung/string/tostring/Order.java b/java-strings/src/main/java/com/baeldung/string/tostring/Order.java new file mode 100644 index 0000000000..017e2d9bc8 --- /dev/null +++ b/java-strings/src/main/java/com/baeldung/string/tostring/Order.java @@ -0,0 +1,46 @@ +package com.baeldung.string.tostring; + +public class Order { + + private String orderId; + private String desc; + private long value; + private String status; + + public String getOrderId() { + return orderId; + } + + public void setOrderId(String orderId) { + this.orderId = orderId; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public long getValue() { + return value; + } + + public void setValue(long value) { + this.value = value; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + @Override + public String toString() { + return "Order [orderId=" + orderId + ", desc=" + desc + ", value=" + value + "]"; + } + +} diff --git a/java-strings/src/test/java/com/baeldung/string/tostring/CustomerArrayToStringTest.java b/java-strings/src/test/java/com/baeldung/string/tostring/CustomerArrayToStringTest.java new file mode 100644 index 0000000000..31e268b4a3 --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/tostring/CustomerArrayToStringTest.java @@ -0,0 +1,26 @@ +package com.baeldung.string.tostring; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +public class CustomerArrayToStringTest { + private static final String CUSTOMER_ARRAY_TO_STRING + = "Customer [orders=[Order [orderId=A1111, desc=Game, value=0]], getFirstName()=Rajesh, getLastName()=Bhojwani]"; + + @Test + public void givenArray_whenToString_thenCustomerDetails() { + CustomerArrayToString customer = new CustomerArrayToString(); + customer.setFirstName("Rajesh"); + customer.setLastName("Bhojwani"); + Order[] orders = new Order[1]; + orders[0] = new Order(); + orders[0].setOrderId("A1111"); + orders[0].setDesc("Game"); + orders[0].setStatus("In-Shiping"); + customer.setOrders(orders); + + assertEquals(CUSTOMER_ARRAY_TO_STRING, customer.toString()); + } + +} diff --git a/java-strings/src/test/java/com/baeldung/string/tostring/CustomerComplexObjectToStringTest.java b/java-strings/src/test/java/com/baeldung/string/tostring/CustomerComplexObjectToStringTest.java new file mode 100644 index 0000000000..3c98394f85 --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/tostring/CustomerComplexObjectToStringTest.java @@ -0,0 +1,25 @@ +package com.baeldung.string.tostring; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +public class CustomerComplexObjectToStringTest { + private static final String CUSTOMER_COMPLEX_TO_STRING + = "Customer [order=Order [orderId=A1111, desc=Game, value=0], getFirstName()=Rajesh, getLastName()=Bhojwani]"; + + @Test + public void givenComplex_whenToString_thenCustomerDetails() { + CustomerComplexObjectToString customer = new CustomerComplexObjectToString(); + customer.setFirstName("Rajesh"); + customer.setLastName("Bhojwani"); + Order order = new Order(); + order.setOrderId("A1111"); + order.setDesc("Game"); + order.setStatus("In-Shiping"); + customer.setOrder(order); + + assertEquals(CUSTOMER_COMPLEX_TO_STRING, customer.toString()); + } + +} diff --git a/java-strings/src/test/java/com/baeldung/string/tostring/CustomerPrimitiveToStringTest.java b/java-strings/src/test/java/com/baeldung/string/tostring/CustomerPrimitiveToStringTest.java new file mode 100644 index 0000000000..2a29cb93d8 --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/tostring/CustomerPrimitiveToStringTest.java @@ -0,0 +1,22 @@ +package com.baeldung.string.tostring; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +public class CustomerPrimitiveToStringTest { + + private static final String CUSTOMER_PRIMITIVE_TO_STRING + = "Customer [balance=110, getFirstName()=Rajesh, getLastName()=Bhojwani]"; + + @Test + public void givenPrimitive_whenToString_thenCustomerDetails() { + CustomerPrimitiveToString customer = new CustomerPrimitiveToString(); + customer.setFirstName("Rajesh"); + customer.setLastName("Bhojwani"); + customer.setBalance(110); + + assertEquals(CUSTOMER_PRIMITIVE_TO_STRING, customer.toString()); + } +} + diff --git a/java-strings/src/test/java/com/baeldung/string/tostring/CustomerReflectionToStringTest.java b/java-strings/src/test/java/com/baeldung/string/tostring/CustomerReflectionToStringTest.java new file mode 100644 index 0000000000..290bef7133 --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/tostring/CustomerReflectionToStringTest.java @@ -0,0 +1,32 @@ +package com.baeldung.string.tostring; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.jupiter.api.Test; + +public class CustomerReflectionToStringTest { + private static final String CUSTOMER_REFLECTION_TO_STRING = "com.baeldung.string.tostring.CustomerReflectionToString"; + + @Test + public void givenWrapperCollectionStrBuffer_whenReflectionToString_thenCustomerDetails() { + CustomerReflectionToString customer = new CustomerReflectionToString(); + customer.setFirstName("Rajesh"); + customer.setLastName("Bhojwani"); + customer.setScore(8); + + List orders = new ArrayList(); + orders.add("Book"); + orders.add("Pen"); + customer.setOrders(orders); + + StringBuffer fullname = new StringBuffer(); + fullname.append(customer.getLastName()+", "+ customer.getFirstName()); + customer.setFullname(fullname); + + assertTrue(customer.toString().contains(CUSTOMER_REFLECTION_TO_STRING)); + } + +} diff --git a/java-strings/src/test/java/com/baeldung/string/tostring/CustomerWrapperCollectionToStringTest.java b/java-strings/src/test/java/com/baeldung/string/tostring/CustomerWrapperCollectionToStringTest.java new file mode 100644 index 0000000000..c80969d453 --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/tostring/CustomerWrapperCollectionToStringTest.java @@ -0,0 +1,33 @@ +package com.baeldung.string.tostring; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.jupiter.api.Test; + +public class CustomerWrapperCollectionToStringTest { + private static final String CUSTOMER_WRAPPER_COLLECTION_TO_STRING + = "Customer [score=8, orders=[Book, Pen], fullname=Bhojwani, Rajesh, getFirstName()=Rajesh, getLastName()=Bhojwani]"; + + @Test + public void givenWrapperCollectionStrBuffer_whenToString_thenCustomerDetails() { + CustomerWrapperCollectionToString customer = new CustomerWrapperCollectionToString(); + customer.setFirstName("Rajesh"); + customer.setLastName("Bhojwani"); + customer.setScore(8); + + List orders = new ArrayList(); + orders.add("Book"); + orders.add("Pen"); + customer.setOrders(orders); + + StringBuffer fullname = new StringBuffer(); + fullname.append(customer.getLastName()+", "+ customer.getFirstName()); + customer.setFullname(fullname); + + assertEquals(CUSTOMER_WRAPPER_COLLECTION_TO_STRING, customer.toString()); + } + +} From 04743892db4547edada008b617ff6202da583da2 Mon Sep 17 00:00:00 2001 From: Alejandro Gervasio Date: Mon, 7 Jan 2019 08:17:52 -0300 Subject: [PATCH 307/359] What is thread-safety and how to achieve it Issue: BAEL-2416 --- .../threadsafety/application/Application.java | 86 +++++++++++++++++++ .../callables/AtomicCounterCallable.java | 19 ++++ .../callables/CounterCallable.java | 19 ++++ .../ExtrinsicLockCounterCallable.java | 19 ++++ .../callables/MessageServiceCallable.java | 19 ++++ .../ReentranReadWriteLockCounterCallable.java | 20 +++++ .../ReentrantLockCounterCallable.java | 19 ++++ .../threadsafety/mathutils/MathUtils.java | 14 +++ .../threadsafety/services/AtomicCounter.java | 18 ++++ .../threadsafety/services/Counter.java | 18 ++++ .../services/ExtrinsicLockCounter.java | 23 +++++ .../threadsafety/services/MessageService.java | 14 +++ .../services/ReentrantLockCounter.java | 26 ++++++ .../ReentrantReadWriteLockCounter.java | 34 ++++++++ .../threadsafety/services/StateHolder.java | 14 +++ .../threadsafety/tests/CounterTest.java | 23 +++++ .../tests/ExtrinsicLockCounterTest.java | 23 +++++ .../threadsafety/tests/MathUtilsTest.java | 13 +++ .../tests/MessageServiceTest.java | 23 +++++ .../tests/ReentrantLockCounterTest.java | 23 +++++ .../ReentrantReadWriteLockCounterTest.java | 24 ++++++ 21 files changed, 491 insertions(+) create mode 100644 core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/application/Application.java create mode 100644 core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/AtomicCounterCallable.java create mode 100644 core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/CounterCallable.java create mode 100644 core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/ExtrinsicLockCounterCallable.java create mode 100644 core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/MessageServiceCallable.java create mode 100644 core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/ReentranReadWriteLockCounterCallable.java create mode 100644 core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/ReentrantLockCounterCallable.java create mode 100644 core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/mathutils/MathUtils.java create mode 100644 core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/AtomicCounter.java create mode 100644 core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/Counter.java create mode 100644 core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/ExtrinsicLockCounter.java create mode 100644 core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/MessageService.java create mode 100644 core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/ReentrantLockCounter.java create mode 100644 core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/ReentrantReadWriteLockCounter.java create mode 100644 core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/StateHolder.java create mode 100644 core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/CounterTest.java create mode 100644 core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ExtrinsicLockCounterTest.java create mode 100644 core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MathUtilsTest.java create mode 100644 core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MessageServiceTest.java create mode 100644 core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantLockCounterTest.java create mode 100644 core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantReadWriteLockCounterTest.java diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/application/Application.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/application/Application.java new file mode 100644 index 0000000000..0c5caba8a0 --- /dev/null +++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/application/Application.java @@ -0,0 +1,86 @@ +package com.baeldung.concurrent.threadsafety.application; + +import com.baeldung.concurrent.threadsafety.callables.AtomicCounterCallable; +import com.baeldung.concurrent.threadsafety.mathutils.MathUtils; +import com.baeldung.concurrent.threadsafety.callables.CounterCallable; +import com.baeldung.concurrent.threadsafety.callables.ExtrinsicLockCounterCallable; +import com.baeldung.concurrent.threadsafety.callables.MessageServiceCallable; +import com.baeldung.concurrent.threadsafety.callables.ReentranReadWriteLockCounterCallable; +import com.baeldung.concurrent.threadsafety.callables.ReentrantLockCounterCallable; +import com.baeldung.concurrent.threadsafety.services.AtomicCounter; +import com.baeldung.concurrent.threadsafety.services.Counter; +import com.baeldung.concurrent.threadsafety.services.ExtrinsicLockCounter; +import com.baeldung.concurrent.threadsafety.services.MessageService; +import com.baeldung.concurrent.threadsafety.services.ReentrantLockCounter; +import com.baeldung.concurrent.threadsafety.services.ReentrantReadWriteLockCounter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +public class Application { + + public static void main(String[] args) throws InterruptedException, ExecutionException { + + new Thread(() -> { + System.out.println(MathUtils.factorial(10)); + }).start(); + new Thread(() -> { + System.out.println(MathUtils.factorial(5)); + }).start(); + + ExecutorService executorService = Executors.newFixedThreadPool(10); + MessageService messageService = new MessageService("Welcome to Baeldung!"); + Future future1 = (Future) executorService.submit(new MessageServiceCallable(messageService)); + Future future2 = (Future) executorService.submit(new MessageServiceCallable(messageService)); + System.out.println(future1.get()); + System.out.println(future2.get()); + + Counter counter = new Counter(); + Future future3 = (Future) executorService.submit(new CounterCallable(counter)); + Future future4 = (Future) executorService.submit(new CounterCallable(counter)); + System.out.println(future3.get()); + System.out.println(future4.get()); + + ExtrinsicLockCounter extrinsicLockCounter = new ExtrinsicLockCounter(); + Future future5 = (Future) executorService.submit(new ExtrinsicLockCounterCallable(extrinsicLockCounter)); + Future future6 = (Future) executorService.submit(new ExtrinsicLockCounterCallable(extrinsicLockCounter)); + System.out.println(future5.get()); + System.out.println(future6.get()); + + ReentrantLockCounter reentrantLockCounter = new ReentrantLockCounter(); + Future future7 = (Future) executorService.submit(new ReentrantLockCounterCallable(reentrantLockCounter)); + Future future8 = (Future) executorService.submit(new ReentrantLockCounterCallable(reentrantLockCounter)); + System.out.println(future7.get()); + System.out.println(future8.get()); + + ReentrantReadWriteLockCounter reentrantReadWriteLockCounter = new ReentrantReadWriteLockCounter(); + Future future9 = (Future) executorService.submit(new ReentranReadWriteLockCounterCallable(reentrantReadWriteLockCounter)); + Future future10 = (Future) executorService.submit(new ReentranReadWriteLockCounterCallable(reentrantReadWriteLockCounter)); + System.out.println(future9.get()); + System.out.println(future10.get()); + + AtomicCounter atomicCounter = new AtomicCounter(); + Future future11 = (Future) executorService.submit(new AtomicCounterCallable(atomicCounter)); + Future future12 = (Future) executorService.submit(new AtomicCounterCallable(atomicCounter)); + System.out.println(future11.get()); + System.out.println(future12.get()); + + Collection syncCollection = Collections.synchronizedCollection(new ArrayList<>()); + Thread thread11 = new Thread(() -> syncCollection.addAll(Arrays.asList(1, 2, 3, 4, 5, 6))); + Thread thread12 = new Thread(() -> syncCollection.addAll(Arrays.asList(1, 2, 3, 4, 5, 6))); + thread11.start(); + thread12.start(); + + Map concurrentMap = new ConcurrentHashMap<>(); + concurrentMap.put("1", "one"); + concurrentMap.put("2", "two"); + concurrentMap.put("3", "three"); + } +} diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/AtomicCounterCallable.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/AtomicCounterCallable.java new file mode 100644 index 0000000000..d711299b5c --- /dev/null +++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/AtomicCounterCallable.java @@ -0,0 +1,19 @@ +package com.baeldung.concurrent.threadsafety.callables; + +import com.baeldung.concurrent.threadsafety.services.AtomicCounter; +import java.util.concurrent.Callable; + +public class AtomicCounterCallable implements Callable { + + private final AtomicCounter counter; + + public AtomicCounterCallable(AtomicCounter counter) { + this.counter = counter; + } + + @Override + public Integer call() throws Exception { + counter.incrementCounter(); + return counter.getCounter(); + } +} diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/CounterCallable.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/CounterCallable.java new file mode 100644 index 0000000000..cdcd84a17b --- /dev/null +++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/CounterCallable.java @@ -0,0 +1,19 @@ +package com.baeldung.concurrent.threadsafety.callables; + +import com.baeldung.concurrent.threadsafety.services.Counter; +import java.util.concurrent.Callable; + +public class CounterCallable implements Callable { + + private final Counter counter; + + public CounterCallable(Counter counter) { + this.counter = counter; + } + + @Override + public Integer call() throws Exception { + counter.incrementCounter(); + return counter.getCounter(); + } +} diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/ExtrinsicLockCounterCallable.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/ExtrinsicLockCounterCallable.java new file mode 100644 index 0000000000..29533e7630 --- /dev/null +++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/ExtrinsicLockCounterCallable.java @@ -0,0 +1,19 @@ +package com.baeldung.concurrent.threadsafety.callables; + +import com.baeldung.concurrent.threadsafety.services.ExtrinsicLockCounter; +import java.util.concurrent.Callable; + +public class ExtrinsicLockCounterCallable implements Callable { + + private final ExtrinsicLockCounter counter; + + public ExtrinsicLockCounterCallable(ExtrinsicLockCounter counter) { + this.counter = counter; + } + + @Override + public Integer call() throws Exception { + counter.incrementCounter(); + return counter.getCounter(); + } +} diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/MessageServiceCallable.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/MessageServiceCallable.java new file mode 100644 index 0000000000..84e8c7bb51 --- /dev/null +++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/MessageServiceCallable.java @@ -0,0 +1,19 @@ +package com.baeldung.concurrent.threadsafety.callables; + +import com.baeldung.concurrent.threadsafety.services.MessageService; +import java.util.concurrent.Callable; + +public class MessageServiceCallable implements Callable { + + private final MessageService messageService; + + public MessageServiceCallable(MessageService messageService) { + this.messageService = messageService; + + } + + @Override + public String call() { + return messageService.getMesssage(); + } +} diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/ReentranReadWriteLockCounterCallable.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/ReentranReadWriteLockCounterCallable.java new file mode 100644 index 0000000000..e806460d50 --- /dev/null +++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/ReentranReadWriteLockCounterCallable.java @@ -0,0 +1,20 @@ +package com.baeldung.concurrent.threadsafety.callables; + +import com.baeldung.concurrent.threadsafety.services.ReentrantReadWriteLockCounter; +import java.util.concurrent.Callable; + +public class ReentranReadWriteLockCounterCallable implements Callable { + + private final ReentrantReadWriteLockCounter counter; + + public ReentranReadWriteLockCounterCallable(ReentrantReadWriteLockCounter counter) { + this.counter = counter; + } + + @Override + public Integer call() throws Exception { + counter.incrementCounter(); + return counter.getCounter(); + } + +} diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/ReentrantLockCounterCallable.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/ReentrantLockCounterCallable.java new file mode 100644 index 0000000000..3511a98c60 --- /dev/null +++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/ReentrantLockCounterCallable.java @@ -0,0 +1,19 @@ +package com.baeldung.concurrent.threadsafety.callables; + +import com.baeldung.concurrent.threadsafety.services.ReentrantLockCounter; +import java.util.concurrent.Callable; + +public class ReentrantLockCounterCallable implements Callable { + + private final ReentrantLockCounter counter; + + public ReentrantLockCounterCallable(ReentrantLockCounter counter) { + this.counter = counter; + } + + @Override + public Integer call() throws Exception { + counter.incrementCounter(); + return counter.getCounter(); + } +} diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/mathutils/MathUtils.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/mathutils/MathUtils.java new file mode 100644 index 0000000000..f560cd4281 --- /dev/null +++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/mathutils/MathUtils.java @@ -0,0 +1,14 @@ +package com.baeldung.concurrent.threadsafety.mathutils; + +import java.math.BigInteger; + +public class MathUtils { + + public static BigInteger factorial(int number) { + BigInteger f = new BigInteger("1"); + for (int i = 2; i <= number; i++) { + f = f.multiply(BigInteger.valueOf(i)); + } + return f; + } +} diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/AtomicCounter.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/AtomicCounter.java new file mode 100644 index 0000000000..32a373495c --- /dev/null +++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/AtomicCounter.java @@ -0,0 +1,18 @@ +package com.baeldung.concurrent.threadsafety.services; + +import java.util.concurrent.atomic.AtomicInteger; + +public class AtomicCounter { + + private final AtomicInteger counter = new AtomicInteger(); + + public AtomicCounter() {} + + public void incrementCounter() { + counter.incrementAndGet(); + } + + public synchronized int getCounter() { + return counter.get(); + } +} diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/Counter.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/Counter.java new file mode 100644 index 0000000000..f7dbc05639 --- /dev/null +++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/Counter.java @@ -0,0 +1,18 @@ +package com.baeldung.concurrent.threadsafety.services; + +public class Counter { + + private volatile int counter; + + public Counter() { + this.counter = 0; + } + + public synchronized void incrementCounter() { + counter += 1; + } + + public int getCounter() { + return counter; + } +} diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/ExtrinsicLockCounter.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/ExtrinsicLockCounter.java new file mode 100644 index 0000000000..8ab431fbc3 --- /dev/null +++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/ExtrinsicLockCounter.java @@ -0,0 +1,23 @@ +package com.baeldung.concurrent.threadsafety.services; + +public class ExtrinsicLockCounter { + + private int counter; + private final Object lock = new Object(); + + public ExtrinsicLockCounter() { + this.counter = 0; + } + + public void incrementCounter() { + synchronized (lock) { + counter += 1; + } + } + + public int getCounter() { + synchronized (lock) { + return counter; + } + } +} diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/MessageService.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/MessageService.java new file mode 100644 index 0000000000..33981381ea --- /dev/null +++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/MessageService.java @@ -0,0 +1,14 @@ +package com.baeldung.concurrent.threadsafety.services; + +public class MessageService { + + private final String message; + + public MessageService(String message) { + this.message = message; + } + + public String getMesssage() { + return message; + } +} diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/ReentrantLockCounter.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/ReentrantLockCounter.java new file mode 100644 index 0000000000..717f0717af --- /dev/null +++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/ReentrantLockCounter.java @@ -0,0 +1,26 @@ +package com.baeldung.concurrent.threadsafety.services; + +import java.util.concurrent.locks.ReentrantLock; + +public class ReentrantLockCounter { + + private int counter; + private final ReentrantLock reLock = new ReentrantLock(true); + + public ReentrantLockCounter() { + this.counter = 0; + } + + public void incrementCounter() { + reLock.lock(); + try { + counter += 1; + } finally { + reLock.unlock(); + } + } + + public int getCounter() { + return counter; + } +} diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/ReentrantReadWriteLockCounter.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/ReentrantReadWriteLockCounter.java new file mode 100644 index 0000000000..f740c938b1 --- /dev/null +++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/ReentrantReadWriteLockCounter.java @@ -0,0 +1,34 @@ +package com.baeldung.concurrent.threadsafety.services; + +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +public class ReentrantReadWriteLockCounter { + + private int counter; + private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(); + private final Lock readLock = rwLock.readLock(); + private final Lock writeLock = rwLock.writeLock(); + + public ReentrantReadWriteLockCounter() { + this.counter = 0; + } + + public void incrementCounter() { + writeLock.lock(); + try { + counter += 1; + } finally { + writeLock.unlock(); + } + } + + public int getCounter() { + readLock.lock(); + try { + return counter; + } finally { + readLock.unlock(); + } + } +} diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/StateHolder.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/StateHolder.java new file mode 100644 index 0000000000..5bbff9f39c --- /dev/null +++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/StateHolder.java @@ -0,0 +1,14 @@ +package com.baeldung.concurrent.threadsafety.services; + +public class StateHolder { + + private final String state; + + public StateHolder(String state) { + this.state = state; + } + + public String getState() { + return state; + } +} diff --git a/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/CounterTest.java b/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/CounterTest.java new file mode 100644 index 0000000000..3abbb1bdad --- /dev/null +++ b/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/CounterTest.java @@ -0,0 +1,23 @@ +package com.baeldung.concurrent.threadsafety.tests; + +import org.junit.Test; +import static org.assertj.core.api.Assertions.assertThat; +import com.baeldung.concurrent.threadsafety.callables.CounterCallable; +import com.baeldung.concurrent.threadsafety.services.Counter; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +public class CounterTest { + + @Test + public void whenCalledIncrementCounter_thenCorrect() throws Exception { + ExecutorService executorService = Executors.newFixedThreadPool(2); + Counter counter = new Counter(); + Future future1 = (Future) executorService.submit(new CounterCallable(counter)); + Future future2 = (Future) executorService.submit(new CounterCallable(counter)); + + assertThat(future1.get()).isEqualTo(1); + assertThat(future2.get()).isEqualTo(2); + } +} diff --git a/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ExtrinsicLockCounterTest.java b/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ExtrinsicLockCounterTest.java new file mode 100644 index 0000000000..dba90f5b74 --- /dev/null +++ b/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ExtrinsicLockCounterTest.java @@ -0,0 +1,23 @@ +package com.baeldung.concurrent.threadsafety.tests; + +import org.junit.Test; +import static org.assertj.core.api.Assertions.assertThat; +import com.baeldung.concurrent.threadsafety.callables.ExtrinsicLockCounterCallable; +import com.baeldung.concurrent.threadsafety.services.ExtrinsicLockCounter; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +public class ExtrinsicLockCounterTest { + + @Test + public void whenCalledIncrementCounter_thenCorrect() throws Exception { + ExecutorService executorService = Executors.newFixedThreadPool(2); + ExtrinsicLockCounter counter = new ExtrinsicLockCounter(); + Future future1 = (Future) executorService.submit(new ExtrinsicLockCounterCallable(counter)); + Future future2 = (Future) executorService.submit(new ExtrinsicLockCounterCallable(counter)); + + assertThat(future1.get()).isEqualTo(1); + assertThat(future2.get()).isEqualTo(2); + } +} diff --git a/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MathUtilsTest.java b/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MathUtilsTest.java new file mode 100644 index 0000000000..8f3f574b03 --- /dev/null +++ b/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MathUtilsTest.java @@ -0,0 +1,13 @@ +package com.baeldung.concurrent.threadsafety.tests; + +import com.baeldung.concurrent.threadsafety.mathutils.MathUtils; +import org.junit.Test; +import static org.assertj.core.api.Assertions.assertThat; + +public class MathUtilsTest { + + @Test + public void whenCalledFactorialMethod_thenCorrect() { + assertThat(MathUtils.factorial(2)).isEqualTo(2); + } +} diff --git a/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MessageServiceTest.java b/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MessageServiceTest.java new file mode 100644 index 0000000000..8f1f1a8754 --- /dev/null +++ b/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MessageServiceTest.java @@ -0,0 +1,23 @@ +package com.baeldung.concurrent.threadsafety.tests; + +import org.junit.Test; +import static org.assertj.core.api.Assertions.assertThat; +import com.baeldung.concurrent.threadsafety.callables.MessageServiceCallable; +import com.baeldung.concurrent.threadsafety.services.MessageService; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +public class MessageServiceTest { + + @Test + public void whenCalledgetMessage_thenCorrect() throws Exception { + ExecutorService executorService = Executors.newFixedThreadPool(2); + MessageService messageService = new MessageService("Welcome to Baeldung!"); + Future future1 = (Future) executorService.submit(new MessageServiceCallable(messageService)); + Future future2 = (Future) executorService.submit(new MessageServiceCallable(messageService)); + + assertThat(future1.get()).isEqualTo("Welcome to Baeldung!"); + assertThat(future2.get()).isEqualTo("Welcome to Baeldung!"); + } +} diff --git a/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantLockCounterTest.java b/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantLockCounterTest.java new file mode 100644 index 0000000000..05c721ab26 --- /dev/null +++ b/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantLockCounterTest.java @@ -0,0 +1,23 @@ +package com.baeldung.concurrent.threadsafety.tests; + +import com.baeldung.concurrent.threadsafety.callables.ReentrantLockCounterCallable; +import com.baeldung.concurrent.threadsafety.services.ReentrantLockCounter; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import static org.assertj.core.api.Assertions.assertThat; +import org.junit.Test; + +public class ReentrantLockCounterTest { + + @Test + public void whenCalledIncrementCounter_thenCorrect() throws Exception { + ExecutorService executorService = Executors.newFixedThreadPool(2); + ReentrantLockCounter counter = new ReentrantLockCounter(); + Future future1 = (Future) executorService.submit(new ReentrantLockCounterCallable(counter)); + Future future2 = (Future) executorService.submit(new ReentrantLockCounterCallable(counter)); + + assertThat(future1.get()).isEqualTo(1); + assertThat(future2.get()).isEqualTo(2); + } +} diff --git a/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantReadWriteLockCounterTest.java b/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantReadWriteLockCounterTest.java new file mode 100644 index 0000000000..c56137ce04 --- /dev/null +++ b/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantReadWriteLockCounterTest.java @@ -0,0 +1,24 @@ +package com.baeldung.concurrent.threadsafety.tests; + +import com.baeldung.concurrent.threadsafety.callables.ReentranReadWriteLockCounterCallable; +import com.baeldung.concurrent.threadsafety.services.ReentrantReadWriteLockCounter; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import static org.assertj.core.api.Assertions.assertThat; +import org.junit.Test; + +public class ReentrantReadWriteLockCounterTest { + + @Test + public void whenCalledIncrementCounter_thenCorrect() throws Exception { + ExecutorService executorService = Executors.newFixedThreadPool(2); + ReentrantReadWriteLockCounter counter = new ReentrantReadWriteLockCounter(); + Future future1 = (Future) executorService.submit(new ReentranReadWriteLockCounterCallable(counter)); + Future future2 = (Future) executorService.submit(new ReentranReadWriteLockCounterCallable(counter)); + + assertThat(future1.get()).isEqualTo(1); + assertThat(future2.get()).isEqualTo(2); + } + +} From 0e69cd5ab47d61ac4c18cac73e9d516e1c7ca8db Mon Sep 17 00:00:00 2001 From: Surapaneni Venkata Kiran Date: Mon, 7 Jan 2019 09:02:58 -0500 Subject: [PATCH 308/359] Changes to enable TLSv1.2 on Java 7 Issue: BAEL-2500 --- .../java/com/baeldung/ssl/EnableTLSv12.java | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 core-java-security/src/main/java/com/baeldung/ssl/EnableTLSv12.java diff --git a/core-java-security/src/main/java/com/baeldung/ssl/EnableTLSv12.java b/core-java-security/src/main/java/com/baeldung/ssl/EnableTLSv12.java new file mode 100644 index 0000000000..aa70b11584 --- /dev/null +++ b/core-java-security/src/main/java/com/baeldung/ssl/EnableTLSv12.java @@ -0,0 +1,115 @@ +package com.baeldung.ssl; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.net.URL; +import java.net.UnknownHostException; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; + +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLParameters; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class EnableTLSv12 { + + private final Logger logger = LoggerFactory.getLogger(EnableTLSv12.class); + + public String url = ""; + public Integer port = null; + + public EnableTLSv12() { + } + + public static void main(String[] args) throws IOException, KeyManagementException, NoSuchAlgorithmException { + EnableTLSv12 enableTLSv12 = new EnableTLSv12(); + if (args.length != 2) { + System.out.println("Provide the server url and the secure port:"); + System.exit(-1); + } + enableTLSv12.setHost(args); + enableTLSv12.setPort(args); + enableTLSv12.enableTLSv12UsingHttpConnection(); + enableTLSv12.enableTLSv12UsingProtocol(); + enableTLSv12.enableTLSv12UsingSSLContext(); + enableTLSv12.enableTLSv12UsingSSLParameters(); + } + + private void setPort(String[] args) { + url = args[0]; + } + + private void setHost(String[] args) { + String portNumber = args[1]; + port = Integer.parseInt(portNumber); + } + + private void handleCommunication(SSLSocket socket, String usedTLSProcess) throws IOException { + logger.debug("Enabled TLS v1.2 on " + usedTLSProcess); + try (PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) { + out.println("GET / HTTP/1.0"); + out.println(); + out.flush(); + if (out.checkError()) { + logger.error("SSLSocketClient: java.io.PrintWriter error"); + return; + } + + String inputLine; + while ((inputLine = in.readLine()) != null) + logger.info(inputLine); + } + } + + public void enableTLSv12UsingSSLParameters() throws UnknownHostException, IOException { + SSLSocketFactory socketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); + SSLSocket sslSocket = (SSLSocket) socketFactory.createSocket(url.trim(), port); + SSLParameters params = new SSLParameters(); + params.setProtocols(new String[] { "TLSv1.2" }); + sslSocket.setSSLParameters(params); + sslSocket.startHandshake(); + handleCommunication(sslSocket, "SSLSocketFactory-SSLParameters"); + } + + public void enableTLSv12UsingProtocol() throws IOException { + SSLSocketFactory socketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); + SSLSocket sslSocket = (SSLSocket) socketFactory.createSocket(url, port); + sslSocket.setEnabledProtocols(new String[] { "TLSv1.2" }); + sslSocket.startHandshake(); + handleCommunication(sslSocket, "SSLSocketFactory-EnabledProtocols"); + } + + public void enableTLSv12UsingHttpConnection() throws IOException, NoSuchAlgorithmException, KeyManagementException { + URL urls = new URL("https://" + url + ":" + port); + SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); + sslContext.init(null, null, new SecureRandom()); + HttpsURLConnection connection = (HttpsURLConnection) urls.openConnection(); + connection.setSSLSocketFactory(sslContext.getSocketFactory()); + try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { + String input; + while ((input = br.readLine()) != null) { + logger.info(input); + } + } + logger.debug("Created TLSv1.2 connection on HttpsURLConnection"); + } + + public void enableTLSv12UsingSSLContext() throws NoSuchAlgorithmException, KeyManagementException, UnknownHostException, IOException { + SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); + sslContext.init(null, null, new SecureRandom()); + SSLSocketFactory socketFactory = sslContext.getSocketFactory(); + SSLSocket socket = (SSLSocket) socketFactory.createSocket(url, port); + handleCommunication(socket, "SSLContext"); + } + +} From 115a52a124ce455bbe1c844a6cea93ed3d56cae8 Mon Sep 17 00:00:00 2001 From: Urvy Agrawal Date: Mon, 7 Jan 2019 22:03:52 +0530 Subject: [PATCH 309/359] Adding files for BAEL-2543 --- .../java/com/baeldung/keyword/Circle.java | 4 ++ .../main/java/com/baeldung/keyword/Ring.java | 4 ++ .../main/java/com/baeldung/keyword/Round.java | 4 ++ .../main/java/com/baeldung/keyword/Shape.java | 4 ++ .../java/com/baeldung/keyword/Triangle.java | 4 ++ .../keyword/test/InstanceOfUnitTest.java | 49 +++++++++++++++++++ 6 files changed, 69 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/keyword/Circle.java create mode 100644 core-java/src/main/java/com/baeldung/keyword/Ring.java create mode 100644 core-java/src/main/java/com/baeldung/keyword/Round.java create mode 100644 core-java/src/main/java/com/baeldung/keyword/Shape.java create mode 100644 core-java/src/main/java/com/baeldung/keyword/Triangle.java create mode 100644 core-java/src/test/java/com/baeldung/keyword/test/InstanceOfUnitTest.java diff --git a/core-java/src/main/java/com/baeldung/keyword/Circle.java b/core-java/src/main/java/com/baeldung/keyword/Circle.java new file mode 100644 index 0000000000..4ec91d1b8a --- /dev/null +++ b/core-java/src/main/java/com/baeldung/keyword/Circle.java @@ -0,0 +1,4 @@ +package com.baeldung.keyword; + +public class Circle extends Round implements Shape { +} diff --git a/core-java/src/main/java/com/baeldung/keyword/Ring.java b/core-java/src/main/java/com/baeldung/keyword/Ring.java new file mode 100644 index 0000000000..99873f9640 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/keyword/Ring.java @@ -0,0 +1,4 @@ +package com.baeldung.keyword; + +public class Ring extends Round { +} diff --git a/core-java/src/main/java/com/baeldung/keyword/Round.java b/core-java/src/main/java/com/baeldung/keyword/Round.java new file mode 100644 index 0000000000..0e2cc2c8c7 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/keyword/Round.java @@ -0,0 +1,4 @@ +package com.baeldung.keyword; + +public class Round { +} diff --git a/core-java/src/main/java/com/baeldung/keyword/Shape.java b/core-java/src/main/java/com/baeldung/keyword/Shape.java new file mode 100644 index 0000000000..8d00c165a3 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/keyword/Shape.java @@ -0,0 +1,4 @@ +package com.baeldung.keyword; + +public interface Shape { +} diff --git a/core-java/src/main/java/com/baeldung/keyword/Triangle.java b/core-java/src/main/java/com/baeldung/keyword/Triangle.java new file mode 100644 index 0000000000..406b8f23e5 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/keyword/Triangle.java @@ -0,0 +1,4 @@ +package com.baeldung.keyword; + +public class Triangle implements Shape { +} diff --git a/core-java/src/test/java/com/baeldung/keyword/test/InstanceOfUnitTest.java b/core-java/src/test/java/com/baeldung/keyword/test/InstanceOfUnitTest.java new file mode 100644 index 0000000000..fbeec3a077 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/keyword/test/InstanceOfUnitTest.java @@ -0,0 +1,49 @@ +package com.baeldung.keyword.test; + +import org.junit.Assert; +import org.junit.jupiter.api.Test; + +import com.baeldung.keyword.Circle; +import com.baeldung.keyword.Ring; +import com.baeldung.keyword.Round; +import com.baeldung.keyword.Shape; +import com.baeldung.keyword.Triangle; + +public class InstanceOfUnitTest { + + @Test + public void giveWhenInstanceIsCorrect_thenReturnTrue() { + Ring ring = new Ring(); + Assert.assertTrue("ring is instance of Round ", ring instanceof Round); + } + + @Test + public void giveWhenObjectIsInstanceOfType_thenReturnTrue() { + Circle circle = new Circle(); + Assert.assertTrue("circle is instance of Circle ", circle instanceof Circle); + } + + + @Test + public void giveWhenInstanceIsOfSubtype_thenReturnTrue() { + Circle circle = new Circle(); + Assert.assertTrue("circle is instance of Round", circle instanceof Round); + } + + @Test + public void giveWhenTypeIsInterface_thenReturnTrue() { + Circle circle = new Circle(); + Assert.assertTrue("circle is instance of Shape", circle instanceof Shape); + } + + @Test + public void giveWhenInstanceValueIsNull_thenReturnFalse() { + Circle circle = null; + Assert.assertFalse("circle is instance of Round", circle instanceof Round); + } + + @Test + public void giveWhenComparingClassInDiffHierarchy_thenCompilationError() { + // Assert.assertFalse("circle is instance of Triangle", circle instanceof Triangle); + } +} From 43b0770e134802ad328b6282c86af8ac2a729954 Mon Sep 17 00:00:00 2001 From: Emily Cheyne Date: Mon, 7 Jan 2019 18:36:15 -0700 Subject: [PATCH 310/359] Update readme (#6095) --- algorithms-miscellaneous-1/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/algorithms-miscellaneous-1/README.md b/algorithms-miscellaneous-1/README.md index 59765588b0..6f18396005 100644 --- a/algorithms-miscellaneous-1/README.md +++ b/algorithms-miscellaneous-1/README.md @@ -14,3 +14,4 @@ - [Calculate Factorial in Java](https://www.baeldung.com/java-calculate-factorial) - [Find Substrings That Are Palindromes in Java](https://www.baeldung.com/java-palindrome-substrings) - [Find the Longest Substring without Repeating Characters](https://www.baeldung.com/java-longest-substring-without-repeated-characters) +- [Java Two Pointer Technique](https://www.baeldung.com/java-two-pointer-technique) From ea1a4678929221680fcf15005ff9c1cfad775bae Mon Sep 17 00:00:00 2001 From: eric-martin Date: Mon, 7 Jan 2019 20:32:55 -0600 Subject: [PATCH 311/359] BAEL-2386: Moved FlightRecorder from core-java to core-java-perf --- .../src/main/java/com/baeldung/flightrecorder/FlightRecorder.java | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {core-java => core-java-perf}/src/main/java/com/baeldung/flightrecorder/FlightRecorder.java (100%) diff --git a/core-java/src/main/java/com/baeldung/flightrecorder/FlightRecorder.java b/core-java-perf/src/main/java/com/baeldung/flightrecorder/FlightRecorder.java similarity index 100% rename from core-java/src/main/java/com/baeldung/flightrecorder/FlightRecorder.java rename to core-java-perf/src/main/java/com/baeldung/flightrecorder/FlightRecorder.java From 59fa72d45bdbed9936cd5e9e669f1c88bb5229a8 Mon Sep 17 00:00:00 2001 From: eric-martin Date: Mon, 7 Jan 2019 21:51:47 -0600 Subject: [PATCH 312/359] Fix PMD violations in java-strings *ToStringTest --- ...rrayToStringTest.java => CustomerArrayToStringUnitTest.java} | 2 +- ...ringTest.java => CustomerComplexObjectToStringUnitTest.java} | 2 +- ...ToStringTest.java => CustomerPrimitiveToStringUnitTest.java} | 2 +- ...oStringTest.java => CustomerReflectionToStringUnitTest.java} | 2 +- ...Test.java => CustomerWrapperCollectionToStringUnitTest.java} | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename java-strings/src/test/java/com/baeldung/string/tostring/{CustomerArrayToStringTest.java => CustomerArrayToStringUnitTest.java} (94%) rename java-strings/src/test/java/com/baeldung/string/tostring/{CustomerComplexObjectToStringTest.java => CustomerComplexObjectToStringUnitTest.java} (94%) rename java-strings/src/test/java/com/baeldung/string/tostring/{CustomerPrimitiveToStringTest.java => CustomerPrimitiveToStringUnitTest.java} (92%) rename java-strings/src/test/java/com/baeldung/string/tostring/{CustomerReflectionToStringTest.java => CustomerReflectionToStringUnitTest.java} (95%) rename java-strings/src/test/java/com/baeldung/string/tostring/{CustomerWrapperCollectionToStringTest.java => CustomerWrapperCollectionToStringUnitTest.java} (94%) diff --git a/java-strings/src/test/java/com/baeldung/string/tostring/CustomerArrayToStringTest.java b/java-strings/src/test/java/com/baeldung/string/tostring/CustomerArrayToStringUnitTest.java similarity index 94% rename from java-strings/src/test/java/com/baeldung/string/tostring/CustomerArrayToStringTest.java rename to java-strings/src/test/java/com/baeldung/string/tostring/CustomerArrayToStringUnitTest.java index 31e268b4a3..9a88416179 100644 --- a/java-strings/src/test/java/com/baeldung/string/tostring/CustomerArrayToStringTest.java +++ b/java-strings/src/test/java/com/baeldung/string/tostring/CustomerArrayToStringUnitTest.java @@ -4,7 +4,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; -public class CustomerArrayToStringTest { +public class CustomerArrayToStringUnitTest { private static final String CUSTOMER_ARRAY_TO_STRING = "Customer [orders=[Order [orderId=A1111, desc=Game, value=0]], getFirstName()=Rajesh, getLastName()=Bhojwani]"; diff --git a/java-strings/src/test/java/com/baeldung/string/tostring/CustomerComplexObjectToStringTest.java b/java-strings/src/test/java/com/baeldung/string/tostring/CustomerComplexObjectToStringUnitTest.java similarity index 94% rename from java-strings/src/test/java/com/baeldung/string/tostring/CustomerComplexObjectToStringTest.java rename to java-strings/src/test/java/com/baeldung/string/tostring/CustomerComplexObjectToStringUnitTest.java index 3c98394f85..5ffb0d0e58 100644 --- a/java-strings/src/test/java/com/baeldung/string/tostring/CustomerComplexObjectToStringTest.java +++ b/java-strings/src/test/java/com/baeldung/string/tostring/CustomerComplexObjectToStringUnitTest.java @@ -4,7 +4,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; -public class CustomerComplexObjectToStringTest { +public class CustomerComplexObjectToStringUnitTest { private static final String CUSTOMER_COMPLEX_TO_STRING = "Customer [order=Order [orderId=A1111, desc=Game, value=0], getFirstName()=Rajesh, getLastName()=Bhojwani]"; diff --git a/java-strings/src/test/java/com/baeldung/string/tostring/CustomerPrimitiveToStringTest.java b/java-strings/src/test/java/com/baeldung/string/tostring/CustomerPrimitiveToStringUnitTest.java similarity index 92% rename from java-strings/src/test/java/com/baeldung/string/tostring/CustomerPrimitiveToStringTest.java rename to java-strings/src/test/java/com/baeldung/string/tostring/CustomerPrimitiveToStringUnitTest.java index 2a29cb93d8..d43733bc60 100644 --- a/java-strings/src/test/java/com/baeldung/string/tostring/CustomerPrimitiveToStringTest.java +++ b/java-strings/src/test/java/com/baeldung/string/tostring/CustomerPrimitiveToStringUnitTest.java @@ -4,7 +4,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; -public class CustomerPrimitiveToStringTest { +public class CustomerPrimitiveToStringUnitTest { private static final String CUSTOMER_PRIMITIVE_TO_STRING = "Customer [balance=110, getFirstName()=Rajesh, getLastName()=Bhojwani]"; diff --git a/java-strings/src/test/java/com/baeldung/string/tostring/CustomerReflectionToStringTest.java b/java-strings/src/test/java/com/baeldung/string/tostring/CustomerReflectionToStringUnitTest.java similarity index 95% rename from java-strings/src/test/java/com/baeldung/string/tostring/CustomerReflectionToStringTest.java rename to java-strings/src/test/java/com/baeldung/string/tostring/CustomerReflectionToStringUnitTest.java index 290bef7133..77dcab52e6 100644 --- a/java-strings/src/test/java/com/baeldung/string/tostring/CustomerReflectionToStringTest.java +++ b/java-strings/src/test/java/com/baeldung/string/tostring/CustomerReflectionToStringUnitTest.java @@ -7,7 +7,7 @@ import java.util.List; import org.junit.jupiter.api.Test; -public class CustomerReflectionToStringTest { +public class CustomerReflectionToStringUnitTest { private static final String CUSTOMER_REFLECTION_TO_STRING = "com.baeldung.string.tostring.CustomerReflectionToString"; @Test diff --git a/java-strings/src/test/java/com/baeldung/string/tostring/CustomerWrapperCollectionToStringTest.java b/java-strings/src/test/java/com/baeldung/string/tostring/CustomerWrapperCollectionToStringUnitTest.java similarity index 94% rename from java-strings/src/test/java/com/baeldung/string/tostring/CustomerWrapperCollectionToStringTest.java rename to java-strings/src/test/java/com/baeldung/string/tostring/CustomerWrapperCollectionToStringUnitTest.java index c80969d453..e04512ff75 100644 --- a/java-strings/src/test/java/com/baeldung/string/tostring/CustomerWrapperCollectionToStringTest.java +++ b/java-strings/src/test/java/com/baeldung/string/tostring/CustomerWrapperCollectionToStringUnitTest.java @@ -7,7 +7,7 @@ import java.util.List; import org.junit.jupiter.api.Test; -public class CustomerWrapperCollectionToStringTest { +public class CustomerWrapperCollectionToStringUnitTest { private static final String CUSTOMER_WRAPPER_COLLECTION_TO_STRING = "Customer [score=8, orders=[Book, Pen], fullname=Bhojwani, Rajesh, getFirstName()=Rajesh, getLastName()=Bhojwani]"; From ffcb8f586625f20ada94658ebeba6cd92e965b80 Mon Sep 17 00:00:00 2001 From: Graham Cox Date: Tue, 8 Jan 2019 10:44:18 +0000 Subject: [PATCH 313/359] Kovert (#6092) * Kovert examples * Moved the Kovert examples to kotlin-libraries --- kotlin-libraries/pom.xml | 19 ++++- .../com/baeldung/kovert/AnnotatedServer.kt | 73 ++++++++++++++++++ .../kotlin/com/baeldung/kovert/ErrorServer.kt | 75 ++++++++++++++++++ .../kotlin/com/baeldung/kovert/JsonServer.kt | 76 +++++++++++++++++++ .../kotlin/com/baeldung/kovert/NoopServer.kt | 57 ++++++++++++++ .../com/baeldung/kovert/SecuredServer.kt | 68 +++++++++++++++++ .../com/baeldung/kovert/SimpleServer.kt | 65 ++++++++++++++++ .../src/main/resources/kovert.conf | 15 ++++ 8 files changed, 447 insertions(+), 1 deletion(-) create mode 100644 kotlin-libraries/src/main/kotlin/com/baeldung/kovert/AnnotatedServer.kt create mode 100644 kotlin-libraries/src/main/kotlin/com/baeldung/kovert/ErrorServer.kt create mode 100644 kotlin-libraries/src/main/kotlin/com/baeldung/kovert/JsonServer.kt create mode 100644 kotlin-libraries/src/main/kotlin/com/baeldung/kovert/NoopServer.kt create mode 100644 kotlin-libraries/src/main/kotlin/com/baeldung/kovert/SecuredServer.kt create mode 100644 kotlin-libraries/src/main/kotlin/com/baeldung/kovert/SimpleServer.kt create mode 100644 kotlin-libraries/src/main/resources/kovert.conf diff --git a/kotlin-libraries/pom.xml b/kotlin-libraries/pom.xml index ae77a9aa2d..507e5820d4 100644 --- a/kotlin-libraries/pom.xml +++ b/kotlin-libraries/pom.xml @@ -95,6 +95,23 @@ 0.7.3 + + uy.kohesive.kovert + kovert-vertx + [1.5.0,1.6.0) + + + nl.komponents.kovenant + kovenant + + + + + nl.komponents.kovenant + kovenant + 3.3.0 + pom + @@ -110,4 +127,4 @@ 0.10.4 - \ No newline at end of file + diff --git a/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/AnnotatedServer.kt b/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/AnnotatedServer.kt new file mode 100644 index 0000000000..da2bbe4208 --- /dev/null +++ b/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/AnnotatedServer.kt @@ -0,0 +1,73 @@ +package com.baeldung.kovert + +import io.vertx.ext.web.Router +import io.vertx.ext.web.RoutingContext +import nl.komponents.kovenant.functional.bind +import org.kodein.di.Kodein +import org.kodein.di.conf.global +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import uy.klutter.config.typesafe.ClassResourceConfig +import uy.klutter.config.typesafe.ReferenceConfig +import uy.klutter.config.typesafe.kodein.importConfig +import uy.klutter.config.typesafe.loadConfig +import uy.klutter.vertx.kodein.KodeinVertx +import uy.kohesive.kovert.core.HttpVerb +import uy.kohesive.kovert.core.Location +import uy.kohesive.kovert.core.Verb +import uy.kohesive.kovert.core.VerbAlias +import uy.kohesive.kovert.vertx.bindController +import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx +import uy.kohesive.kovert.vertx.boot.KovertVerticle +import uy.kohesive.kovert.vertx.boot.KovertVerticleModule +import uy.kohesive.kovert.vertx.boot.KovertVertx + + +class AnnotatedServer { + companion object { + private val LOG: Logger = LoggerFactory.getLogger(AnnotatedServer::class.java) + + @JvmStatic + fun main(args: Array) { + AnnotatedServer().start() + } + } + + @VerbAlias("show", HttpVerb.GET) + class AnnotatedController { + fun RoutingContext.showStringById(id: String) = id + + @Verb(HttpVerb.GET) + @Location("/ping/:id") + fun RoutingContext.ping(id: String) = id + } + + fun start() { + Kodein.global.addImport(Kodein.Module { + importConfig(loadConfig(ClassResourceConfig("/kovert.conf", AnnotatedServer::class.java), ReferenceConfig())) { + import("kovert.vertx", KodeinKovertVertx.configModule) + import("kovert.server", KovertVerticleModule.configModule) + } + + // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j + import(KodeinVertx.moduleWithLoggingToSlf4j) + // Kovert boot + import(KodeinKovertVertx.module) + import(KovertVerticleModule.module) + }) + + val initControllers = fun Router.() { + bindController(AnnotatedController(), "api") + } + + // startup asynchronously... + KovertVertx.start() bind { vertx -> + KovertVerticle.deploy(vertx, routerInit = initControllers) + } success { deploymentId -> + LOG.warn("Deployment complete.") + } fail { error -> + LOG.error("Deployment failed!", error) + } + + } +} diff --git a/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/ErrorServer.kt b/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/ErrorServer.kt new file mode 100644 index 0000000000..a596391ed8 --- /dev/null +++ b/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/ErrorServer.kt @@ -0,0 +1,75 @@ +package com.baeldung.kovert + +import io.vertx.ext.web.Router +import io.vertx.ext.web.RoutingContext +import nl.komponents.kovenant.functional.bind +import org.kodein.di.Kodein +import org.kodein.di.conf.global +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import uy.klutter.config.typesafe.ClassResourceConfig +import uy.klutter.config.typesafe.ReferenceConfig +import uy.klutter.config.typesafe.kodein.importConfig +import uy.klutter.config.typesafe.loadConfig +import uy.klutter.vertx.kodein.KodeinVertx +import uy.kohesive.kovert.core.HttpErrorCode +import uy.kohesive.kovert.core.HttpErrorCodeWithBody +import uy.kohesive.kovert.core.HttpErrorForbidden +import uy.kohesive.kovert.vertx.bindController +import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx +import uy.kohesive.kovert.vertx.boot.KovertVerticle +import uy.kohesive.kovert.vertx.boot.KovertVerticleModule +import uy.kohesive.kovert.vertx.boot.KovertVertx + + +class ErrorServer { + companion object { + private val LOG: Logger = LoggerFactory.getLogger(ErrorServer::class.java) + + @JvmStatic + fun main(args: Array) { + ErrorServer().start() + } + } + + class ErrorController { + fun RoutingContext.getForbidden() { + throw HttpErrorForbidden() + } + fun RoutingContext.getError() { + throw HttpErrorCode("Something went wrong", 590) + } + fun RoutingContext.getErrorbody() { + throw HttpErrorCodeWithBody("Something went wrong", 591, "Body here") + } + } + + fun start() { + Kodein.global.addImport(Kodein.Module { + importConfig(loadConfig(ClassResourceConfig("/kovert.conf", ErrorServer::class.java), ReferenceConfig())) { + import("kovert.vertx", KodeinKovertVertx.configModule) + import("kovert.server", KovertVerticleModule.configModule) + } + + // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j + import(KodeinVertx.moduleWithLoggingToSlf4j) + // Kovert boot + import(KodeinKovertVertx.module) + import(KovertVerticleModule.module) + }) + + val initControllers = fun Router.() { + bindController(ErrorController(), "api") + } + + // startup asynchronously... + KovertVertx.start() bind { vertx -> + KovertVerticle.deploy(vertx, routerInit = initControllers) + } success { deploymentId -> + LOG.warn("Deployment complete.") + } fail { error -> + LOG.error("Deployment failed!", error) + } + + } +} diff --git a/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/JsonServer.kt b/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/JsonServer.kt new file mode 100644 index 0000000000..310fe2a7a0 --- /dev/null +++ b/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/JsonServer.kt @@ -0,0 +1,76 @@ +package com.baeldung.kovert + +import com.fasterxml.jackson.annotation.JsonProperty +import io.vertx.ext.web.Router +import io.vertx.ext.web.RoutingContext +import nl.komponents.kovenant.functional.bind +import org.kodein.di.Kodein +import org.kodein.di.conf.global +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import uy.klutter.config.typesafe.ClassResourceConfig +import uy.klutter.config.typesafe.ReferenceConfig +import uy.klutter.config.typesafe.kodein.importConfig +import uy.klutter.config.typesafe.loadConfig +import uy.klutter.vertx.kodein.KodeinVertx +import uy.kohesive.kovert.vertx.bindController +import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx +import uy.kohesive.kovert.vertx.boot.KovertVerticle +import uy.kohesive.kovert.vertx.boot.KovertVerticleModule +import uy.kohesive.kovert.vertx.boot.KovertVertx + +class JsonServer { + companion object { + private val LOG: Logger = LoggerFactory.getLogger(JsonServer::class.java) + + @JvmStatic + fun main(args: Array) { + JsonServer().start() + } + } + + data class Person( + @JsonProperty("_id") + val id: String, + val name: String, + val job: String + ) + + class JsonController { + fun RoutingContext.getPersonById(id: String) = Person( + id = id, + name = "Tony Stark", + job = "Iron Man" + ) + fun RoutingContext.putPersonById(id: String, person: Person) = person + } + + fun start() { + Kodein.global.addImport(Kodein.Module { + importConfig(loadConfig(ClassResourceConfig("/kovert.conf", JsonServer::class.java), ReferenceConfig())) { + import("kovert.vertx", KodeinKovertVertx.configModule) + import("kovert.server", KovertVerticleModule.configModule) + } + + // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j + import(KodeinVertx.moduleWithLoggingToSlf4j) + // Kovert boot + import(KodeinKovertVertx.module) + import(KovertVerticleModule.module) + }) + + val initControllers = fun Router.() { + bindController(JsonController(), "api") + } + + // startup asynchronously... + KovertVertx.start() bind { vertx -> + KovertVerticle.deploy(vertx, routerInit = initControllers) + } success { deploymentId -> + LOG.warn("Deployment complete.") + } fail { error -> + LOG.error("Deployment failed!", error) + } + + } +} diff --git a/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/NoopServer.kt b/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/NoopServer.kt new file mode 100644 index 0000000000..98ce775e66 --- /dev/null +++ b/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/NoopServer.kt @@ -0,0 +1,57 @@ +package com.baeldung.kovert + +import io.vertx.ext.web.Router +import nl.komponents.kovenant.functional.bind +import org.kodein.di.Kodein +import org.kodein.di.conf.global +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import uy.klutter.config.typesafe.ClassResourceConfig +import uy.klutter.config.typesafe.ReferenceConfig +import uy.klutter.config.typesafe.kodein.importConfig +import uy.klutter.config.typesafe.loadConfig +import uy.klutter.vertx.kodein.KodeinVertx +import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx +import uy.kohesive.kovert.vertx.boot.KovertVerticle +import uy.kohesive.kovert.vertx.boot.KovertVerticleModule +import uy.kohesive.kovert.vertx.boot.KovertVertx + +class NoopServer { + companion object { + private val LOG: Logger = LoggerFactory.getLogger(NoopServer::class.java) + + @JvmStatic + fun main(args: Array) { + NoopServer().start() + } + } + + + fun start() { + Kodein.global.addImport(Kodein.Module { + importConfig(loadConfig(ClassResourceConfig("/kovert.conf", NoopServer::class.java), ReferenceConfig())) { + import("kovert.vertx", KodeinKovertVertx.configModule) + import("kovert.server", KovertVerticleModule.configModule) + } + + // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j + import(KodeinVertx.moduleWithLoggingToSlf4j) + // Kovert boot + import(KodeinKovertVertx.module) + import(KovertVerticleModule.module) + }) + + val initControllers = fun Router.() { + } + + // startup asynchronously... + KovertVertx.start() bind { vertx -> + KovertVerticle.deploy(vertx, routerInit = initControllers) + } success { deploymentId -> + LOG.warn("Deployment complete.") + } fail { error -> + LOG.error("Deployment failed!", error) + } + + } +} diff --git a/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/SecuredServer.kt b/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/SecuredServer.kt new file mode 100644 index 0000000000..86ca482808 --- /dev/null +++ b/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/SecuredServer.kt @@ -0,0 +1,68 @@ +package com.baeldung.kovert + +import io.vertx.ext.web.Router +import io.vertx.ext.web.RoutingContext +import nl.komponents.kovenant.functional.bind +import org.kodein.di.Kodein +import org.kodein.di.conf.global +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import uy.klutter.config.typesafe.ClassResourceConfig +import uy.klutter.config.typesafe.ReferenceConfig +import uy.klutter.config.typesafe.kodein.importConfig +import uy.klutter.config.typesafe.loadConfig +import uy.klutter.vertx.kodein.KodeinVertx +import uy.kohesive.kovert.vertx.bindController +import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx +import uy.kohesive.kovert.vertx.boot.KovertVerticle +import uy.kohesive.kovert.vertx.boot.KovertVerticleModule +import uy.kohesive.kovert.vertx.boot.KovertVertx + + +class SecuredServer { + companion object { + private val LOG: Logger = LoggerFactory.getLogger(SecuredServer::class.java) + + @JvmStatic + fun main(args: Array) { + SecuredServer().start() + } + } + + class SecuredContext(private val routingContext: RoutingContext) { + val authenticated = routingContext.request().getHeader("Authorization") == "Secure" + } + + class SecuredController { + fun SecuredContext.getSecured() = this.authenticated + } + + fun start() { + Kodein.global.addImport(Kodein.Module { + importConfig(loadConfig(ClassResourceConfig("/kovert.conf", SecuredServer::class.java), ReferenceConfig())) { + import("kovert.vertx", KodeinKovertVertx.configModule) + import("kovert.server", KovertVerticleModule.configModule) + } + + // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j + import(KodeinVertx.moduleWithLoggingToSlf4j) + // Kovert boot + import(KodeinKovertVertx.module) + import(KovertVerticleModule.module) + }) + + val initControllers = fun Router.() { + bindController(SecuredController(), "api") + } + + // startup asynchronously... + KovertVertx.start() bind { vertx -> + KovertVerticle.deploy(vertx, routerInit = initControllers) + } success { deploymentId -> + LOG.warn("Deployment complete.") + } fail { error -> + LOG.error("Deployment failed!", error) + } + + } +} diff --git a/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/SimpleServer.kt b/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/SimpleServer.kt new file mode 100644 index 0000000000..172469ab46 --- /dev/null +++ b/kotlin-libraries/src/main/kotlin/com/baeldung/kovert/SimpleServer.kt @@ -0,0 +1,65 @@ +package com.baeldung.kovert + +import io.vertx.ext.web.Router +import io.vertx.ext.web.RoutingContext +import nl.komponents.kovenant.functional.bind +import org.kodein.di.Kodein +import org.kodein.di.conf.global +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import uy.klutter.config.typesafe.ClassResourceConfig +import uy.klutter.config.typesafe.ReferenceConfig +import uy.klutter.config.typesafe.kodein.importConfig +import uy.klutter.config.typesafe.loadConfig +import uy.klutter.vertx.kodein.KodeinVertx +import uy.kohesive.kovert.vertx.bindController +import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx +import uy.kohesive.kovert.vertx.boot.KovertVerticle +import uy.kohesive.kovert.vertx.boot.KovertVerticleModule +import uy.kohesive.kovert.vertx.boot.KovertVertx + + +class SimpleServer { + companion object { + private val LOG: Logger = LoggerFactory.getLogger(SimpleServer::class.java) + + @JvmStatic + fun main(args: Array) { + SimpleServer().start() + } + } + + class SimpleController { + fun RoutingContext.getStringById(id: String) = id + fun RoutingContext.get_truncatedString_by_id(id: String, length: Int = 1) = id.subSequence(0, length) + } + + fun start() { + Kodein.global.addImport(Kodein.Module { + importConfig(loadConfig(ClassResourceConfig("/kovert.conf", SimpleServer::class.java), ReferenceConfig())) { + import("kovert.vertx", KodeinKovertVertx.configModule) + import("kovert.server", KovertVerticleModule.configModule) + } + + // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j + import(KodeinVertx.moduleWithLoggingToSlf4j) + // Kovert boot + import(KodeinKovertVertx.module) + import(KovertVerticleModule.module) + }) + + val initControllers = fun Router.() { + bindController(SimpleController(), "api") + } + + // startup asynchronously... + KovertVertx.start() bind { vertx -> + KovertVerticle.deploy(vertx, routerInit = initControllers) + } success { deploymentId -> + LOG.warn("Deployment complete.") + } fail { error -> + LOG.error("Deployment failed!", error) + } + + } +} diff --git a/kotlin-libraries/src/main/resources/kovert.conf b/kotlin-libraries/src/main/resources/kovert.conf new file mode 100644 index 0000000000..3b08641693 --- /dev/null +++ b/kotlin-libraries/src/main/resources/kovert.conf @@ -0,0 +1,15 @@ +{ + kovert: { + vertx: { + clustered: false + } + server: { + listeners: [ + { + host: "0.0.0.0" + port: "8000" + } + ] + } + } +} From 802e2b0398f46f9939308416066fe9bfe0bf3c6c Mon Sep 17 00:00:00 2001 From: Graham Cox Date: Tue, 8 Jan 2019 14:06:25 +0000 Subject: [PATCH 314/359] Removed Kovert from core-kotlin now it's in kotlin-libraries instead (#6101) --- core-kotlin/pom.xml | 11 --- .../com/baeldung/kovert/AnnotatedServer.kt | 73 ------------------ .../kotlin/com/baeldung/kovert/ErrorServer.kt | 75 ------------------ .../kotlin/com/baeldung/kovert/JsonServer.kt | 76 ------------------- .../kotlin/com/baeldung/kovert/NoopServer.kt | 57 -------------- .../com/baeldung/kovert/SecuredServer.kt | 68 ----------------- .../com/baeldung/kovert/SimpleServer.kt | 65 ---------------- core-kotlin/src/main/resources/kovert.conf | 15 ---- 8 files changed, 440 deletions(-) delete mode 100644 core-kotlin/src/main/kotlin/com/baeldung/kovert/AnnotatedServer.kt delete mode 100644 core-kotlin/src/main/kotlin/com/baeldung/kovert/ErrorServer.kt delete mode 100644 core-kotlin/src/main/kotlin/com/baeldung/kovert/JsonServer.kt delete mode 100644 core-kotlin/src/main/kotlin/com/baeldung/kovert/NoopServer.kt delete mode 100644 core-kotlin/src/main/kotlin/com/baeldung/kovert/SecuredServer.kt delete mode 100644 core-kotlin/src/main/kotlin/com/baeldung/kovert/SimpleServer.kt delete mode 100644 core-kotlin/src/main/resources/kovert.conf diff --git a/core-kotlin/pom.xml b/core-kotlin/pom.xml index 8b871f28ee..ed79ebc01b 100644 --- a/core-kotlin/pom.xml +++ b/core-kotlin/pom.xml @@ -72,17 +72,6 @@ injekt-core 1.16.1 - - uy.kohesive.kovert - kovert-vertx - [1.5.0,1.6.0) - - - nl.komponents.kovenant - kovenant - - - diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kovert/AnnotatedServer.kt b/core-kotlin/src/main/kotlin/com/baeldung/kovert/AnnotatedServer.kt deleted file mode 100644 index da2bbe4208..0000000000 --- a/core-kotlin/src/main/kotlin/com/baeldung/kovert/AnnotatedServer.kt +++ /dev/null @@ -1,73 +0,0 @@ -package com.baeldung.kovert - -import io.vertx.ext.web.Router -import io.vertx.ext.web.RoutingContext -import nl.komponents.kovenant.functional.bind -import org.kodein.di.Kodein -import org.kodein.di.conf.global -import org.slf4j.Logger -import org.slf4j.LoggerFactory -import uy.klutter.config.typesafe.ClassResourceConfig -import uy.klutter.config.typesafe.ReferenceConfig -import uy.klutter.config.typesafe.kodein.importConfig -import uy.klutter.config.typesafe.loadConfig -import uy.klutter.vertx.kodein.KodeinVertx -import uy.kohesive.kovert.core.HttpVerb -import uy.kohesive.kovert.core.Location -import uy.kohesive.kovert.core.Verb -import uy.kohesive.kovert.core.VerbAlias -import uy.kohesive.kovert.vertx.bindController -import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx -import uy.kohesive.kovert.vertx.boot.KovertVerticle -import uy.kohesive.kovert.vertx.boot.KovertVerticleModule -import uy.kohesive.kovert.vertx.boot.KovertVertx - - -class AnnotatedServer { - companion object { - private val LOG: Logger = LoggerFactory.getLogger(AnnotatedServer::class.java) - - @JvmStatic - fun main(args: Array) { - AnnotatedServer().start() - } - } - - @VerbAlias("show", HttpVerb.GET) - class AnnotatedController { - fun RoutingContext.showStringById(id: String) = id - - @Verb(HttpVerb.GET) - @Location("/ping/:id") - fun RoutingContext.ping(id: String) = id - } - - fun start() { - Kodein.global.addImport(Kodein.Module { - importConfig(loadConfig(ClassResourceConfig("/kovert.conf", AnnotatedServer::class.java), ReferenceConfig())) { - import("kovert.vertx", KodeinKovertVertx.configModule) - import("kovert.server", KovertVerticleModule.configModule) - } - - // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j - import(KodeinVertx.moduleWithLoggingToSlf4j) - // Kovert boot - import(KodeinKovertVertx.module) - import(KovertVerticleModule.module) - }) - - val initControllers = fun Router.() { - bindController(AnnotatedController(), "api") - } - - // startup asynchronously... - KovertVertx.start() bind { vertx -> - KovertVerticle.deploy(vertx, routerInit = initControllers) - } success { deploymentId -> - LOG.warn("Deployment complete.") - } fail { error -> - LOG.error("Deployment failed!", error) - } - - } -} diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kovert/ErrorServer.kt b/core-kotlin/src/main/kotlin/com/baeldung/kovert/ErrorServer.kt deleted file mode 100644 index a596391ed8..0000000000 --- a/core-kotlin/src/main/kotlin/com/baeldung/kovert/ErrorServer.kt +++ /dev/null @@ -1,75 +0,0 @@ -package com.baeldung.kovert - -import io.vertx.ext.web.Router -import io.vertx.ext.web.RoutingContext -import nl.komponents.kovenant.functional.bind -import org.kodein.di.Kodein -import org.kodein.di.conf.global -import org.slf4j.Logger -import org.slf4j.LoggerFactory -import uy.klutter.config.typesafe.ClassResourceConfig -import uy.klutter.config.typesafe.ReferenceConfig -import uy.klutter.config.typesafe.kodein.importConfig -import uy.klutter.config.typesafe.loadConfig -import uy.klutter.vertx.kodein.KodeinVertx -import uy.kohesive.kovert.core.HttpErrorCode -import uy.kohesive.kovert.core.HttpErrorCodeWithBody -import uy.kohesive.kovert.core.HttpErrorForbidden -import uy.kohesive.kovert.vertx.bindController -import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx -import uy.kohesive.kovert.vertx.boot.KovertVerticle -import uy.kohesive.kovert.vertx.boot.KovertVerticleModule -import uy.kohesive.kovert.vertx.boot.KovertVertx - - -class ErrorServer { - companion object { - private val LOG: Logger = LoggerFactory.getLogger(ErrorServer::class.java) - - @JvmStatic - fun main(args: Array) { - ErrorServer().start() - } - } - - class ErrorController { - fun RoutingContext.getForbidden() { - throw HttpErrorForbidden() - } - fun RoutingContext.getError() { - throw HttpErrorCode("Something went wrong", 590) - } - fun RoutingContext.getErrorbody() { - throw HttpErrorCodeWithBody("Something went wrong", 591, "Body here") - } - } - - fun start() { - Kodein.global.addImport(Kodein.Module { - importConfig(loadConfig(ClassResourceConfig("/kovert.conf", ErrorServer::class.java), ReferenceConfig())) { - import("kovert.vertx", KodeinKovertVertx.configModule) - import("kovert.server", KovertVerticleModule.configModule) - } - - // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j - import(KodeinVertx.moduleWithLoggingToSlf4j) - // Kovert boot - import(KodeinKovertVertx.module) - import(KovertVerticleModule.module) - }) - - val initControllers = fun Router.() { - bindController(ErrorController(), "api") - } - - // startup asynchronously... - KovertVertx.start() bind { vertx -> - KovertVerticle.deploy(vertx, routerInit = initControllers) - } success { deploymentId -> - LOG.warn("Deployment complete.") - } fail { error -> - LOG.error("Deployment failed!", error) - } - - } -} diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kovert/JsonServer.kt b/core-kotlin/src/main/kotlin/com/baeldung/kovert/JsonServer.kt deleted file mode 100644 index 310fe2a7a0..0000000000 --- a/core-kotlin/src/main/kotlin/com/baeldung/kovert/JsonServer.kt +++ /dev/null @@ -1,76 +0,0 @@ -package com.baeldung.kovert - -import com.fasterxml.jackson.annotation.JsonProperty -import io.vertx.ext.web.Router -import io.vertx.ext.web.RoutingContext -import nl.komponents.kovenant.functional.bind -import org.kodein.di.Kodein -import org.kodein.di.conf.global -import org.slf4j.Logger -import org.slf4j.LoggerFactory -import uy.klutter.config.typesafe.ClassResourceConfig -import uy.klutter.config.typesafe.ReferenceConfig -import uy.klutter.config.typesafe.kodein.importConfig -import uy.klutter.config.typesafe.loadConfig -import uy.klutter.vertx.kodein.KodeinVertx -import uy.kohesive.kovert.vertx.bindController -import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx -import uy.kohesive.kovert.vertx.boot.KovertVerticle -import uy.kohesive.kovert.vertx.boot.KovertVerticleModule -import uy.kohesive.kovert.vertx.boot.KovertVertx - -class JsonServer { - companion object { - private val LOG: Logger = LoggerFactory.getLogger(JsonServer::class.java) - - @JvmStatic - fun main(args: Array) { - JsonServer().start() - } - } - - data class Person( - @JsonProperty("_id") - val id: String, - val name: String, - val job: String - ) - - class JsonController { - fun RoutingContext.getPersonById(id: String) = Person( - id = id, - name = "Tony Stark", - job = "Iron Man" - ) - fun RoutingContext.putPersonById(id: String, person: Person) = person - } - - fun start() { - Kodein.global.addImport(Kodein.Module { - importConfig(loadConfig(ClassResourceConfig("/kovert.conf", JsonServer::class.java), ReferenceConfig())) { - import("kovert.vertx", KodeinKovertVertx.configModule) - import("kovert.server", KovertVerticleModule.configModule) - } - - // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j - import(KodeinVertx.moduleWithLoggingToSlf4j) - // Kovert boot - import(KodeinKovertVertx.module) - import(KovertVerticleModule.module) - }) - - val initControllers = fun Router.() { - bindController(JsonController(), "api") - } - - // startup asynchronously... - KovertVertx.start() bind { vertx -> - KovertVerticle.deploy(vertx, routerInit = initControllers) - } success { deploymentId -> - LOG.warn("Deployment complete.") - } fail { error -> - LOG.error("Deployment failed!", error) - } - - } -} diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kovert/NoopServer.kt b/core-kotlin/src/main/kotlin/com/baeldung/kovert/NoopServer.kt deleted file mode 100644 index 98ce775e66..0000000000 --- a/core-kotlin/src/main/kotlin/com/baeldung/kovert/NoopServer.kt +++ /dev/null @@ -1,57 +0,0 @@ -package com.baeldung.kovert - -import io.vertx.ext.web.Router -import nl.komponents.kovenant.functional.bind -import org.kodein.di.Kodein -import org.kodein.di.conf.global -import org.slf4j.Logger -import org.slf4j.LoggerFactory -import uy.klutter.config.typesafe.ClassResourceConfig -import uy.klutter.config.typesafe.ReferenceConfig -import uy.klutter.config.typesafe.kodein.importConfig -import uy.klutter.config.typesafe.loadConfig -import uy.klutter.vertx.kodein.KodeinVertx -import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx -import uy.kohesive.kovert.vertx.boot.KovertVerticle -import uy.kohesive.kovert.vertx.boot.KovertVerticleModule -import uy.kohesive.kovert.vertx.boot.KovertVertx - -class NoopServer { - companion object { - private val LOG: Logger = LoggerFactory.getLogger(NoopServer::class.java) - - @JvmStatic - fun main(args: Array) { - NoopServer().start() - } - } - - - fun start() { - Kodein.global.addImport(Kodein.Module { - importConfig(loadConfig(ClassResourceConfig("/kovert.conf", NoopServer::class.java), ReferenceConfig())) { - import("kovert.vertx", KodeinKovertVertx.configModule) - import("kovert.server", KovertVerticleModule.configModule) - } - - // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j - import(KodeinVertx.moduleWithLoggingToSlf4j) - // Kovert boot - import(KodeinKovertVertx.module) - import(KovertVerticleModule.module) - }) - - val initControllers = fun Router.() { - } - - // startup asynchronously... - KovertVertx.start() bind { vertx -> - KovertVerticle.deploy(vertx, routerInit = initControllers) - } success { deploymentId -> - LOG.warn("Deployment complete.") - } fail { error -> - LOG.error("Deployment failed!", error) - } - - } -} diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kovert/SecuredServer.kt b/core-kotlin/src/main/kotlin/com/baeldung/kovert/SecuredServer.kt deleted file mode 100644 index 86ca482808..0000000000 --- a/core-kotlin/src/main/kotlin/com/baeldung/kovert/SecuredServer.kt +++ /dev/null @@ -1,68 +0,0 @@ -package com.baeldung.kovert - -import io.vertx.ext.web.Router -import io.vertx.ext.web.RoutingContext -import nl.komponents.kovenant.functional.bind -import org.kodein.di.Kodein -import org.kodein.di.conf.global -import org.slf4j.Logger -import org.slf4j.LoggerFactory -import uy.klutter.config.typesafe.ClassResourceConfig -import uy.klutter.config.typesafe.ReferenceConfig -import uy.klutter.config.typesafe.kodein.importConfig -import uy.klutter.config.typesafe.loadConfig -import uy.klutter.vertx.kodein.KodeinVertx -import uy.kohesive.kovert.vertx.bindController -import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx -import uy.kohesive.kovert.vertx.boot.KovertVerticle -import uy.kohesive.kovert.vertx.boot.KovertVerticleModule -import uy.kohesive.kovert.vertx.boot.KovertVertx - - -class SecuredServer { - companion object { - private val LOG: Logger = LoggerFactory.getLogger(SecuredServer::class.java) - - @JvmStatic - fun main(args: Array) { - SecuredServer().start() - } - } - - class SecuredContext(private val routingContext: RoutingContext) { - val authenticated = routingContext.request().getHeader("Authorization") == "Secure" - } - - class SecuredController { - fun SecuredContext.getSecured() = this.authenticated - } - - fun start() { - Kodein.global.addImport(Kodein.Module { - importConfig(loadConfig(ClassResourceConfig("/kovert.conf", SecuredServer::class.java), ReferenceConfig())) { - import("kovert.vertx", KodeinKovertVertx.configModule) - import("kovert.server", KovertVerticleModule.configModule) - } - - // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j - import(KodeinVertx.moduleWithLoggingToSlf4j) - // Kovert boot - import(KodeinKovertVertx.module) - import(KovertVerticleModule.module) - }) - - val initControllers = fun Router.() { - bindController(SecuredController(), "api") - } - - // startup asynchronously... - KovertVertx.start() bind { vertx -> - KovertVerticle.deploy(vertx, routerInit = initControllers) - } success { deploymentId -> - LOG.warn("Deployment complete.") - } fail { error -> - LOG.error("Deployment failed!", error) - } - - } -} diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kovert/SimpleServer.kt b/core-kotlin/src/main/kotlin/com/baeldung/kovert/SimpleServer.kt deleted file mode 100644 index 172469ab46..0000000000 --- a/core-kotlin/src/main/kotlin/com/baeldung/kovert/SimpleServer.kt +++ /dev/null @@ -1,65 +0,0 @@ -package com.baeldung.kovert - -import io.vertx.ext.web.Router -import io.vertx.ext.web.RoutingContext -import nl.komponents.kovenant.functional.bind -import org.kodein.di.Kodein -import org.kodein.di.conf.global -import org.slf4j.Logger -import org.slf4j.LoggerFactory -import uy.klutter.config.typesafe.ClassResourceConfig -import uy.klutter.config.typesafe.ReferenceConfig -import uy.klutter.config.typesafe.kodein.importConfig -import uy.klutter.config.typesafe.loadConfig -import uy.klutter.vertx.kodein.KodeinVertx -import uy.kohesive.kovert.vertx.bindController -import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx -import uy.kohesive.kovert.vertx.boot.KovertVerticle -import uy.kohesive.kovert.vertx.boot.KovertVerticleModule -import uy.kohesive.kovert.vertx.boot.KovertVertx - - -class SimpleServer { - companion object { - private val LOG: Logger = LoggerFactory.getLogger(SimpleServer::class.java) - - @JvmStatic - fun main(args: Array) { - SimpleServer().start() - } - } - - class SimpleController { - fun RoutingContext.getStringById(id: String) = id - fun RoutingContext.get_truncatedString_by_id(id: String, length: Int = 1) = id.subSequence(0, length) - } - - fun start() { - Kodein.global.addImport(Kodein.Module { - importConfig(loadConfig(ClassResourceConfig("/kovert.conf", SimpleServer::class.java), ReferenceConfig())) { - import("kovert.vertx", KodeinKovertVertx.configModule) - import("kovert.server", KovertVerticleModule.configModule) - } - - // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j - import(KodeinVertx.moduleWithLoggingToSlf4j) - // Kovert boot - import(KodeinKovertVertx.module) - import(KovertVerticleModule.module) - }) - - val initControllers = fun Router.() { - bindController(SimpleController(), "api") - } - - // startup asynchronously... - KovertVertx.start() bind { vertx -> - KovertVerticle.deploy(vertx, routerInit = initControllers) - } success { deploymentId -> - LOG.warn("Deployment complete.") - } fail { error -> - LOG.error("Deployment failed!", error) - } - - } -} diff --git a/core-kotlin/src/main/resources/kovert.conf b/core-kotlin/src/main/resources/kovert.conf deleted file mode 100644 index 3b08641693..0000000000 --- a/core-kotlin/src/main/resources/kovert.conf +++ /dev/null @@ -1,15 +0,0 @@ -{ - kovert: { - vertx: { - clustered: false - } - server: { - listeners: [ - { - host: "0.0.0.0" - port: "8000" - } - ] - } - } -} From 5faa406cb062ae194f84a19ab029eb5176ecbcb4 Mon Sep 17 00:00:00 2001 From: myluckagain Date: Tue, 8 Jan 2019 19:36:42 +0500 Subject: [PATCH 315/359] BAEL-2474 (#5997) * BAEL-2474 * rename UserRepositoryImpl.java into UserRepositoryCustomImpl.java --- .../dao/repositories/user/UserRepository.java | 3 +- .../user/UserRepositoryCustom.java | 10 ++++ .../user/UserRepositoryCustomImpl.java | 43 +++++++++++++++ .../UserRepositoryIntegrationTest.java | 55 +++++++++++++------ 4 files changed, 93 insertions(+), 18 deletions(-) create mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepositoryCustom.java create mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepositoryCustomImpl.java diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepository.java index 5bb0232e4a..7f54254832 100644 --- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepository.java +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepository.java @@ -1,6 +1,7 @@ package com.baeldung.dao.repositories.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; @@ -13,7 +14,7 @@ import java.util.Collection; import java.util.List; import java.util.stream.Stream; -public interface UserRepository extends JpaRepository { +public interface UserRepository extends JpaRepository , UserRepositoryCustom{ Stream findAllByName(String name); diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepositoryCustom.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepositoryCustom.java new file mode 100644 index 0000000000..72c1fd5d00 --- /dev/null +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepositoryCustom.java @@ -0,0 +1,10 @@ +package com.baeldung.dao.repositories.user; + +import java.util.List; +import java.util.Set; + +import com.baeldung.domain.user.User; + +public interface UserRepositoryCustom { + List findUserByEmails(Set emails); +} diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepositoryCustomImpl.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepositoryCustomImpl.java new file mode 100644 index 0000000000..9f841caf68 --- /dev/null +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepositoryCustomImpl.java @@ -0,0 +1,43 @@ +package com.baeldung.dao.repositories.user; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Path; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; + +import com.baeldung.domain.user.User; + +public class UserRepositoryCustomImpl implements UserRepositoryCustom { + + @PersistenceContext + private EntityManager entityManager; + + @Override + public List findUserByEmails(Set emails) { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery query = cb.createQuery(User.class); + Root user = query.from(User.class); + + Path emailPath = user.get("email"); + + List predicates = new ArrayList<>(); + for (String email : emails) { + + predicates.add(cb.like(emailPath, email)); + + } + query.select(user) + .where(cb.or(predicates.toArray(new Predicate[predicates.size()]))); + + return entityManager.createQuery(query) + .getResultList(); + } + +} diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/UserRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/UserRepositoryIntegrationTest.java index e29161394b..b05086d00e 100644 --- a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/UserRepositoryIntegrationTest.java +++ b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/UserRepositoryIntegrationTest.java @@ -18,7 +18,9 @@ import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; import java.util.Collection; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; @@ -274,9 +276,8 @@ public class UserRepositoryIntegrationTest { List usersSortByName = userRepository.findAll(new Sort(Sort.Direction.ASC, "name")); - assertThat(usersSortByName - .get(0) - .getName()).isEqualTo(USER_NAME_ADAM); + assertThat(usersSortByName.get(0) + .getName()).isEqualTo(USER_NAME_ADAM); } @Test(expected = PropertyReferenceException.class) @@ -289,9 +290,8 @@ public class UserRepositoryIntegrationTest { List usersSortByNameLength = userRepository.findAll(new Sort("LENGTH(name)")); - assertThat(usersSortByNameLength - .get(0) - .getName()).isEqualTo(USER_NAME_ADAM); + assertThat(usersSortByNameLength.get(0) + .getName()).isEqualTo(USER_NAME_ADAM); } @Test @@ -304,9 +304,8 @@ public class UserRepositoryIntegrationTest { List usersSortByNameLength = userRepository.findAllUsers(JpaSort.unsafe("LENGTH(name)")); - assertThat(usersSortByNameLength - .get(0) - .getName()).isEqualTo(USER_NAME_ADAM); + assertThat(usersSortByNameLength.get(0) + .getName()).isEqualTo(USER_NAME_ADAM); } @Test @@ -320,10 +319,9 @@ public class UserRepositoryIntegrationTest { Page usersPage = userRepository.findAllUsersWithPagination(new PageRequest(1, 3)); - assertThat(usersPage - .getContent() - .get(0) - .getName()).isEqualTo("SAMPLE1"); + assertThat(usersPage.getContent() + .get(0) + .getName()).isEqualTo("SAMPLE1"); } @Test @@ -337,10 +335,9 @@ public class UserRepositoryIntegrationTest { Page usersSortByNameLength = userRepository.findAllUsersWithPaginationNative(new PageRequest(1, 3)); - assertThat(usersSortByNameLength - .getContent() - .get(0) - .getName()).isEqualTo("SAMPLE1"); + assertThat(usersSortByNameLength.getContent() + .get(0) + .getName()).isEqualTo("SAMPLE1"); } @Test @@ -370,6 +367,30 @@ public class UserRepositoryIntegrationTest { assertThat(updatedUsersSize).isEqualTo(2); } + @Test + public void givenUsersInDBWhenFindByEmailsWithDynamicQueryThenReturnCollection() { + + User user1 = new User(); + user1.setEmail(USER_EMAIL); + userRepository.save(user1); + + User user2 = new User(); + user2.setEmail(USER_EMAIL2); + userRepository.save(user2); + + User user3 = new User(); + user3.setEmail(USER_EMAIL3); + userRepository.save(user3); + + Set emails = new HashSet<>(); + emails.add(USER_EMAIL2); + emails.add(USER_EMAIL3); + + Collection usersWithEmails = userRepository.findUserByEmails(emails); + + assertThat(usersWithEmails.size()).isEqualTo(2); + } + @After public void cleanUp() { userRepository.deleteAll(); From 26101769311c7de0285f23e34f00c90187e53f64 Mon Sep 17 00:00:00 2001 From: Urvy Agrawal Date: Tue, 8 Jan 2019 20:09:51 +0530 Subject: [PATCH 316/359] Review comments added --- .../java/com/baeldung/keyword/test/InstanceOfUnitTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core-java/src/test/java/com/baeldung/keyword/test/InstanceOfUnitTest.java b/core-java/src/test/java/com/baeldung/keyword/test/InstanceOfUnitTest.java index fbeec3a077..4c010e3a16 100644 --- a/core-java/src/test/java/com/baeldung/keyword/test/InstanceOfUnitTest.java +++ b/core-java/src/test/java/com/baeldung/keyword/test/InstanceOfUnitTest.java @@ -35,6 +35,12 @@ public class InstanceOfUnitTest { Circle circle = new Circle(); Assert.assertTrue("circle is instance of Shape", circle instanceof Shape); } + + @Test + public void giveWhenTypeIsOfObjectType_thenReturnTrue() { + Thread thread = new Thread(); + Assert.assertTrue("thread is instance of Object", thread instanceof Object); + } @Test public void giveWhenInstanceValueIsNull_thenReturnFalse() { From f1fa9c8253a9db826ad4de40dd71be2ec2ac7527 Mon Sep 17 00:00:00 2001 From: pandachris Date: Tue, 8 Jan 2019 22:18:47 +0700 Subject: [PATCH 317/359] BAEL-2565 move code to different project (#6099) * BAEL-2565 * BAEL-2565 Test code consistency * BAEL-2565 Move code to different project --- .../src/main/java/com/baeldung/enums/values/Element1.java | 0 .../src/main/java/com/baeldung/enums/values/Element2.java | 0 .../src/main/java/com/baeldung/enums/values/Element3.java | 0 .../src/main/java/com/baeldung/enums/values/Element4.java | 0 .../src/main/java/com/baeldung/enums/values/Labeled.java | 0 .../src/test/java/com/baeldung/enums/values/Element1UnitTest.java | 0 .../src/test/java/com/baeldung/enums/values/Element2UnitTest.java | 0 .../src/test/java/com/baeldung/enums/values/Element3UnitTest.java | 0 .../src/test/java/com/baeldung/enums/values/Element4UnitTest.java | 0 9 files changed, 0 insertions(+), 0 deletions(-) rename {core-java-8 => core-java-lang}/src/main/java/com/baeldung/enums/values/Element1.java (100%) rename {core-java-8 => core-java-lang}/src/main/java/com/baeldung/enums/values/Element2.java (100%) rename {core-java-8 => core-java-lang}/src/main/java/com/baeldung/enums/values/Element3.java (100%) rename {core-java-8 => core-java-lang}/src/main/java/com/baeldung/enums/values/Element4.java (100%) rename {core-java-8 => core-java-lang}/src/main/java/com/baeldung/enums/values/Labeled.java (100%) rename {core-java-8 => core-java-lang}/src/test/java/com/baeldung/enums/values/Element1UnitTest.java (100%) rename {core-java-8 => core-java-lang}/src/test/java/com/baeldung/enums/values/Element2UnitTest.java (100%) rename {core-java-8 => core-java-lang}/src/test/java/com/baeldung/enums/values/Element3UnitTest.java (100%) rename {core-java-8 => core-java-lang}/src/test/java/com/baeldung/enums/values/Element4UnitTest.java (100%) diff --git a/core-java-8/src/main/java/com/baeldung/enums/values/Element1.java b/core-java-lang/src/main/java/com/baeldung/enums/values/Element1.java similarity index 100% rename from core-java-8/src/main/java/com/baeldung/enums/values/Element1.java rename to core-java-lang/src/main/java/com/baeldung/enums/values/Element1.java diff --git a/core-java-8/src/main/java/com/baeldung/enums/values/Element2.java b/core-java-lang/src/main/java/com/baeldung/enums/values/Element2.java similarity index 100% rename from core-java-8/src/main/java/com/baeldung/enums/values/Element2.java rename to core-java-lang/src/main/java/com/baeldung/enums/values/Element2.java diff --git a/core-java-8/src/main/java/com/baeldung/enums/values/Element3.java b/core-java-lang/src/main/java/com/baeldung/enums/values/Element3.java similarity index 100% rename from core-java-8/src/main/java/com/baeldung/enums/values/Element3.java rename to core-java-lang/src/main/java/com/baeldung/enums/values/Element3.java diff --git a/core-java-8/src/main/java/com/baeldung/enums/values/Element4.java b/core-java-lang/src/main/java/com/baeldung/enums/values/Element4.java similarity index 100% rename from core-java-8/src/main/java/com/baeldung/enums/values/Element4.java rename to core-java-lang/src/main/java/com/baeldung/enums/values/Element4.java diff --git a/core-java-8/src/main/java/com/baeldung/enums/values/Labeled.java b/core-java-lang/src/main/java/com/baeldung/enums/values/Labeled.java similarity index 100% rename from core-java-8/src/main/java/com/baeldung/enums/values/Labeled.java rename to core-java-lang/src/main/java/com/baeldung/enums/values/Labeled.java diff --git a/core-java-8/src/test/java/com/baeldung/enums/values/Element1UnitTest.java b/core-java-lang/src/test/java/com/baeldung/enums/values/Element1UnitTest.java similarity index 100% rename from core-java-8/src/test/java/com/baeldung/enums/values/Element1UnitTest.java rename to core-java-lang/src/test/java/com/baeldung/enums/values/Element1UnitTest.java diff --git a/core-java-8/src/test/java/com/baeldung/enums/values/Element2UnitTest.java b/core-java-lang/src/test/java/com/baeldung/enums/values/Element2UnitTest.java similarity index 100% rename from core-java-8/src/test/java/com/baeldung/enums/values/Element2UnitTest.java rename to core-java-lang/src/test/java/com/baeldung/enums/values/Element2UnitTest.java diff --git a/core-java-8/src/test/java/com/baeldung/enums/values/Element3UnitTest.java b/core-java-lang/src/test/java/com/baeldung/enums/values/Element3UnitTest.java similarity index 100% rename from core-java-8/src/test/java/com/baeldung/enums/values/Element3UnitTest.java rename to core-java-lang/src/test/java/com/baeldung/enums/values/Element3UnitTest.java diff --git a/core-java-8/src/test/java/com/baeldung/enums/values/Element4UnitTest.java b/core-java-lang/src/test/java/com/baeldung/enums/values/Element4UnitTest.java similarity index 100% rename from core-java-8/src/test/java/com/baeldung/enums/values/Element4UnitTest.java rename to core-java-lang/src/test/java/com/baeldung/enums/values/Element4UnitTest.java From c0e36d5b10ca8716390ac1954218b037e9775b83 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 9 Jan 2019 00:30:54 +0530 Subject: [PATCH 318/359] BAEL-10925 New module spring-boot-rest --- pom.xml | 6 ++- spring-boot-rest/pom.xml | 43 +++++++++++++++++++ .../web/SpringBootRestApplication.java | 13 ++++++ .../com/baeldung/web/config/WebConfig.java | 8 ++++ .../src/main/resources/application.properties | 0 .../SpringBootRestApplicationUnitTest.java | 16 +++++++ 6 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 spring-boot-rest/pom.xml create mode 100644 spring-boot-rest/src/main/java/com/baeldung/web/SpringBootRestApplication.java create mode 100644 spring-boot-rest/src/main/java/com/baeldung/web/config/WebConfig.java create mode 100644 spring-boot-rest/src/main/resources/application.properties create mode 100644 spring-boot-rest/src/test/java/com/baeldung/web/SpringBootRestApplicationUnitTest.java diff --git a/pom.xml b/pom.xml index 4dba0da173..cf7eb1f394 100644 --- a/pom.xml +++ b/pom.xml @@ -645,6 +645,7 @@ spring-boot-mvc spring-boot-ops spring-boot-property-exp + spring-boot-rest spring-boot-security spring-boot-testing spring-boot-vue @@ -1356,8 +1357,11 @@ spring-boot-mvc spring-boot-ops spring-boot-property-exp + spring-boot-rest spring-boot-security + spring-boot-testing spring-boot-vue + spring-boot-libraries spring-cloud spring-cloud-bus @@ -1372,7 +1376,7 @@ spring-dispatcher-servlet spring-drools - spring-ehcache + spring-ehcache spring-ejb spring-exceptions diff --git a/spring-boot-rest/pom.xml b/spring-boot-rest/pom.xml new file mode 100644 index 0000000000..baf9d35a09 --- /dev/null +++ b/spring-boot-rest/pom.xml @@ -0,0 +1,43 @@ + + + 4.0.0 + com.baeldung.web + spring-boot-rest + spring-boot-rest + Spring Boot Rest Module + war + + + parent-boot-2 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + com.baeldung.SpringBootRestApplication + + diff --git a/spring-boot-rest/src/main/java/com/baeldung/web/SpringBootRestApplication.java b/spring-boot-rest/src/main/java/com/baeldung/web/SpringBootRestApplication.java new file mode 100644 index 0000000000..62aae7619d --- /dev/null +++ b/spring-boot-rest/src/main/java/com/baeldung/web/SpringBootRestApplication.java @@ -0,0 +1,13 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringBootRestApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringBootRestApplication.class, args); + } + +} diff --git a/spring-boot-rest/src/main/java/com/baeldung/web/config/WebConfig.java b/spring-boot-rest/src/main/java/com/baeldung/web/config/WebConfig.java new file mode 100644 index 0000000000..808e946218 --- /dev/null +++ b/spring-boot-rest/src/main/java/com/baeldung/web/config/WebConfig.java @@ -0,0 +1,8 @@ +package com.baeldung.web.config; + +import org.springframework.context.annotation.Configuration; + +@Configuration +public class WebConfig { + +} \ No newline at end of file diff --git a/spring-boot-rest/src/main/resources/application.properties b/spring-boot-rest/src/main/resources/application.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/spring-boot-rest/src/test/java/com/baeldung/web/SpringBootRestApplicationUnitTest.java b/spring-boot-rest/src/test/java/com/baeldung/web/SpringBootRestApplicationUnitTest.java new file mode 100644 index 0000000000..747e08f6f8 --- /dev/null +++ b/spring-boot-rest/src/test/java/com/baeldung/web/SpringBootRestApplicationUnitTest.java @@ -0,0 +1,16 @@ +package com.baeldung.spring.boot.rest; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class SpringBootRestApplicationUnitTest { + + @Test + public void contextLoads() { + } + +} From 842d8573af8bef74a34b3b65d3f7bae59ffa5742 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 9 Jan 2019 00:38:14 +0530 Subject: [PATCH 319/359] Revert parent pom.xml --- pom.xml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index cf7eb1f394..4dba0da173 100644 --- a/pom.xml +++ b/pom.xml @@ -645,7 +645,6 @@ spring-boot-mvc spring-boot-ops spring-boot-property-exp - spring-boot-rest spring-boot-security spring-boot-testing spring-boot-vue @@ -1357,11 +1356,8 @@ spring-boot-mvc spring-boot-ops spring-boot-property-exp - spring-boot-rest spring-boot-security - spring-boot-testing spring-boot-vue - spring-boot-libraries spring-cloud spring-cloud-bus @@ -1376,7 +1372,7 @@ spring-dispatcher-servlet spring-drools - spring-ehcache + spring-ehcache spring-ejb spring-exceptions From 6cd561d91a1ef1d8b5fc52f2d10ceff16e4bcf1f Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 9 Jan 2019 00:41:57 +0530 Subject: [PATCH 320/359] Fixed pom.xml --- pom.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pom.xml b/pom.xml index 4dba0da173..324f6129db 100644 --- a/pom.xml +++ b/pom.xml @@ -644,6 +644,7 @@ spring-boot-logging-log4j2 spring-boot-mvc spring-boot-ops + spring-boot-rest spring-boot-property-exp spring-boot-security spring-boot-testing @@ -1355,6 +1356,7 @@ spring-boot-logging-log4j2 spring-boot-mvc spring-boot-ops + spring-boot-rest spring-boot-property-exp spring-boot-security spring-boot-vue From e6f28c61a3484d5cd488c1160981ac36c35e8b05 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Wed, 9 Jan 2019 00:09:02 +0200 Subject: [PATCH 321/359] Create README.md --- spring-boot-rest/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 spring-boot-rest/README.md diff --git a/spring-boot-rest/README.md b/spring-boot-rest/README.md new file mode 100644 index 0000000000..0a8d13cf76 --- /dev/null +++ b/spring-boot-rest/README.md @@ -0,0 +1,3 @@ +Module for the articles that are part of the Spring REST E-book: + +1. [Bootstrap a Web Application with Spring 5](https://www.baeldung.com/bootstraping-a-web-application-with-spring-and-java-based-configuration) From 58ed9e47b204652bae2ced49cb0b541840272f8f Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Wed, 9 Jan 2019 00:12:40 +0200 Subject: [PATCH 322/359] Update and rename SpringBootRestApplicationUnitTest.java to SpringContextIntegrationTest.java --- ...plicationUnitTest.java => SpringContextIntegrationTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-boot-rest/src/test/java/com/baeldung/web/{SpringBootRestApplicationUnitTest.java => SpringContextIntegrationTest.java} (86%) diff --git a/spring-boot-rest/src/test/java/com/baeldung/web/SpringBootRestApplicationUnitTest.java b/spring-boot-rest/src/test/java/com/baeldung/web/SpringContextIntegrationTest.java similarity index 86% rename from spring-boot-rest/src/test/java/com/baeldung/web/SpringBootRestApplicationUnitTest.java rename to spring-boot-rest/src/test/java/com/baeldung/web/SpringContextIntegrationTest.java index 747e08f6f8..0c1fdf372b 100644 --- a/spring-boot-rest/src/test/java/com/baeldung/web/SpringBootRestApplicationUnitTest.java +++ b/spring-boot-rest/src/test/java/com/baeldung/web/SpringContextIntegrationTest.java @@ -7,7 +7,7 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest -public class SpringBootRestApplicationUnitTest { +public class SpringContextIntegrationTest { @Test public void contextLoads() { From a094e49a6292aaad494f6d66194066c69a81c43f Mon Sep 17 00:00:00 2001 From: Mikhail Chugunov Date: Wed, 9 Jan 2019 19:53:12 +0300 Subject: [PATCH 323/359] BAEL-2475: Changes after first review --- .../deserialization/immutable/Employee.java | 24 ++++++++ .../immutable/MaritalAwarePerson.java | 58 ------------------- .../deserialization/immutable/Person.java | 32 ++++++++-- ...mmutableObjectDeserializationUnitTest.java | 22 ++++--- 4 files changed, 60 insertions(+), 76 deletions(-) create mode 100644 jackson/src/main/java/com/baeldung/jackson/deserialization/immutable/Employee.java delete mode 100644 jackson/src/main/java/com/baeldung/jackson/deserialization/immutable/MaritalAwarePerson.java diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/immutable/Employee.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/immutable/Employee.java new file mode 100644 index 0000000000..44b10ee39b --- /dev/null +++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/immutable/Employee.java @@ -0,0 +1,24 @@ +package com.baeldung.jackson.deserialization.immutable; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class Employee { + + private final long id; + private final String name; + + @JsonCreator(mode = JsonCreator.Mode.PROPERTIES) + public Employee(@JsonProperty("id") long id, @JsonProperty("name") String name) { + this.id = id; + this.name = name; + } + + public long getId() { + return id; + } + + public String getName() { + return name; + } +} diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/immutable/MaritalAwarePerson.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/immutable/MaritalAwarePerson.java deleted file mode 100644 index cb593b3bb7..0000000000 --- a/jackson/src/main/java/com/baeldung/jackson/deserialization/immutable/MaritalAwarePerson.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.baeldung.jackson.deserialization.immutable; - -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; - -@JsonDeserialize(builder = MaritalAwarePerson.Builder.class) -public class MaritalAwarePerson { - - private final String name; - private final int age; - private final Boolean married; - - private MaritalAwarePerson(String name, int age, Boolean married) { - this.name = name; - this.age = age; - this.married = married; - } - - public String getName() { - return name; - } - - public int getAge() { - return age; - } - - public Boolean getMarried() { - return married; - } - - @JsonPOJOBuilder - static class Builder { - String name; - int age; - Boolean married; - - Builder withName(String name) { - this.name = name; - return this; - } - - Builder withAge(int age) { - this.age = age; - return this; - } - - Builder withMarried(boolean married) { - this.married = married; - return this; - } - - public MaritalAwarePerson build() { - return new MaritalAwarePerson(name, age, married); - } - - - } -} diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/immutable/Person.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/immutable/Person.java index 0214f93ca9..d9041720b6 100644 --- a/jackson/src/main/java/com/baeldung/jackson/deserialization/immutable/Person.java +++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/immutable/Person.java @@ -1,15 +1,15 @@ package com.baeldung.jackson.deserialization.immutable; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; +@JsonDeserialize(builder = Person.Builder.class) public class Person { private final String name; - private final int age; + private final Integer age; - @JsonCreator(mode = JsonCreator.Mode.PROPERTIES) - public Person(@JsonProperty("name") String name, @JsonProperty("age") int age) { + private Person(String name, Integer age) { this.name = name; this.age = age; } @@ -18,7 +18,27 @@ public class Person { return name; } - public int getAge() { + public Integer getAge() { return age; } + + @JsonPOJOBuilder + static class Builder { + String name; + Integer age; + + Builder withName(String name) { + this.name = name; + return this; + } + + Builder withAge(Integer age) { + this.age = age; + return this; + } + + Person build() { + return new Person(name, age); + } + } } diff --git a/jackson/src/test/java/com/baeldung/jackson/deserialization/immutable/ImmutableObjectDeserializationUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/deserialization/immutable/ImmutableObjectDeserializationUnitTest.java index 5c33a2da26..1252179e3a 100644 --- a/jackson/src/test/java/com/baeldung/jackson/deserialization/immutable/ImmutableObjectDeserializationUnitTest.java +++ b/jackson/src/test/java/com/baeldung/jackson/deserialization/immutable/ImmutableObjectDeserializationUnitTest.java @@ -11,30 +11,28 @@ public class ImmutableObjectDeserializationUnitTest { @Test public void whenPublicConstructorIsUsed_thenObjectIsDeserialized() throws IOException { - final String json = "{\"name\":\"Frank\",\"age\":50}"; - Person person = new ObjectMapper().readValue(json, Person.class); + final String json = "{\"name\":\"Frank\",\"id\":5000}"; + Employee employee = new ObjectMapper().readValue(json, Employee.class); - assertEquals("Frank", person.getName()); - assertEquals(50, person.getAge()); + assertEquals("Frank", employee.getName()); + assertEquals(5000, employee.getId()); } @Test public void whenBuilderIsUsedAndFieldIsNull_thenObjectIsDeserialized() throws IOException { - final String json = "{\"name\":\"Frank\",\"age\":50}"; - MaritalAwarePerson person = new ObjectMapper().readValue(json, MaritalAwarePerson.class); + final String json = "{\"name\":\"Frank\"}"; + Person person = new ObjectMapper().readValue(json, Person.class); assertEquals("Frank", person.getName()); - assertEquals(50, person.getAge()); - assertNull(person.getMarried()); + assertNull(person.getAge()); } @Test public void whenBuilderIsUsedAndAllFieldsPresent_thenObjectIsDeserialized() throws IOException { - final String json = "{\"name\":\"Frank\",\"age\":50,\"married\":true}"; - MaritalAwarePerson person = new ObjectMapper().readValue(json, MaritalAwarePerson.class); + final String json = "{\"name\":\"Frank\",\"age\":50}"; + Person person = new ObjectMapper().readValue(json, Person.class); assertEquals("Frank", person.getName()); - assertEquals(50, person.getAge()); - assertTrue(person.getMarried()); + assertEquals(50, (int) person.getAge()); } } From 44490a052ff0760b5115ba5764e53553c41ccf44 Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Wed, 9 Jan 2019 18:06:47 +0000 Subject: [PATCH 324/359] BAEL2526 queue interface code (#6115) * BAEL2526 queue interface code * renamed test class to end with 'UnitTest', removed camel case from package name --- .../queueInterface/CustomBaeldungQueue.java | 48 +++++++++++++++++ .../queueInterface/PriorityQueueUnitTest.java | 53 +++++++++++++++++++ .../CustomBaeldungQueueUnitTest.java | 30 +++++++++++ 3 files changed, 131 insertions(+) create mode 100644 core-java-collections/src/main/java/com/baeldung/queueInterface/CustomBaeldungQueue.java create mode 100644 core-java-collections/src/test/java/com/baeldung/queueInterface/PriorityQueueUnitTest.java create mode 100644 core-java-collections/src/test/java/com/baeldung/queueinterface/CustomBaeldungQueueUnitTest.java diff --git a/core-java-collections/src/main/java/com/baeldung/queueInterface/CustomBaeldungQueue.java b/core-java-collections/src/main/java/com/baeldung/queueInterface/CustomBaeldungQueue.java new file mode 100644 index 0000000000..6b088a5079 --- /dev/null +++ b/core-java-collections/src/main/java/com/baeldung/queueInterface/CustomBaeldungQueue.java @@ -0,0 +1,48 @@ +package com.baeldung.queueinterface; + +import java.util.AbstractQueue; +import java.util.Iterator; +import java.util.LinkedList; + +public class CustomBaeldungQueue extends AbstractQueue { + + private LinkedList elements; + + public CustomBaeldungQueue() { + this.elements = new LinkedList(); + } + + @Override + public Iterator iterator() { + return elements.iterator(); + } + + @Override + public int size() { + return elements.size(); + } + + @Override + public boolean offer(T t) { + if(t == null) return false; + elements.add(t); + return true; + } + + @Override + public T poll() { + + Iterator iter = elements.iterator(); + T t = iter.next(); + if(t != null){ + iter.remove(); + return t; + } + return null; + } + + @Override + public T peek() { + return elements.getFirst(); + } +} diff --git a/core-java-collections/src/test/java/com/baeldung/queueInterface/PriorityQueueUnitTest.java b/core-java-collections/src/test/java/com/baeldung/queueInterface/PriorityQueueUnitTest.java new file mode 100644 index 0000000000..c5b564b55b --- /dev/null +++ b/core-java-collections/src/test/java/com/baeldung/queueInterface/PriorityQueueUnitTest.java @@ -0,0 +1,53 @@ +package com.baeldung.queueinterface; + +import org.junit.Before; +import org.junit.Test; + +import java.util.PriorityQueue; + +import static org.junit.Assert.assertEquals; + +public class PriorityQueueUnitTest { + + + + @Test + public void givenIntegerQueue_whenIntegersOutOfOrder_checkRetrievalOrderIsNatural() { + + PriorityQueue integerQueue = new PriorityQueue<>(); + + integerQueue.add(9); + integerQueue.add(2); + integerQueue.add(4); + + int first = integerQueue.poll(); + int second = integerQueue.poll(); + int third = integerQueue.poll(); + + assertEquals(2, first); + assertEquals(4, second); + assertEquals(9, third); + + + } + + @Test + public void givenStringQueue_whenStringsAddedOutOfNaturalOrder_checkRetrievalOrderNatural() { + + PriorityQueue stringQueue = new PriorityQueue<>(); + + stringQueue.add("banana"); + stringQueue.add("apple"); + stringQueue.add("cherry"); + + String first = stringQueue.poll(); + String second = stringQueue.poll(); + String third = stringQueue.poll(); + + assertEquals("apple", first); + assertEquals("banana", second); + assertEquals("cherry", third); + + + } +} diff --git a/core-java-collections/src/test/java/com/baeldung/queueinterface/CustomBaeldungQueueUnitTest.java b/core-java-collections/src/test/java/com/baeldung/queueinterface/CustomBaeldungQueueUnitTest.java new file mode 100644 index 0000000000..6dec768542 --- /dev/null +++ b/core-java-collections/src/test/java/com/baeldung/queueinterface/CustomBaeldungQueueUnitTest.java @@ -0,0 +1,30 @@ +package com.baeldung.queueinterface; + +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class CustomBaeldungQueueUnitTest { + + private CustomBaeldungQueue customQueue; + + @Before + public void setUp() throws Exception { + customQueue = new CustomBaeldungQueue<>(); + } + + @Test + public void givenQueueWithTwoElements_whenElementsRetrieved_checkRetrievalCorrect() { + + customQueue.add(7); + customQueue.add(5); + + int first = customQueue.poll(); + int second = customQueue.poll(); + + assertEquals(7, first); + assertEquals(5, second); + + } +} From 128817cfebe533b21c4248f6d14099579108a52d Mon Sep 17 00:00:00 2001 From: Amy DeGregorio Date: Wed, 9 Jan 2019 15:20:47 -0500 Subject: [PATCH 325/359] example code for Article How to Write to a CSV File in Java (#6102) --- .../com/baeldung/csv/WriteCsvFileExample.java | 29 ++++++ .../csv/WriteCsvFileExampleUnitTest.java | 90 +++++++++++++++++++ .../src/test/resources/exampleOutput.csv | 2 + 3 files changed, 121 insertions(+) create mode 100644 core-java-io/src/main/java/com/baeldung/csv/WriteCsvFileExample.java create mode 100644 core-java-io/src/test/java/com/baeldung/csv/WriteCsvFileExampleUnitTest.java create mode 100644 core-java-io/src/test/resources/exampleOutput.csv diff --git a/core-java-io/src/main/java/com/baeldung/csv/WriteCsvFileExample.java b/core-java-io/src/main/java/com/baeldung/csv/WriteCsvFileExample.java new file mode 100644 index 0000000000..fd3678d2c5 --- /dev/null +++ b/core-java-io/src/main/java/com/baeldung/csv/WriteCsvFileExample.java @@ -0,0 +1,29 @@ +package com.baeldung.csv; + +import java.io.BufferedWriter; +import java.io.IOException; + +public class WriteCsvFileExample { + + public void writeLine(BufferedWriter writer, String[] data) throws IOException { + StringBuilder csvLine = new StringBuilder(); + + for (int i = 0; i < data.length; i++) { + if (i > 0) { + csvLine.append(","); + } + csvLine.append(escapeSpecialCharacters(data[i])); + } + + writer.write(csvLine.toString()); + } + + public String escapeSpecialCharacters(String data) { + String escapedData = data.replaceAll("\\R", " "); + if (data.contains(",") || data.contains("\"") || data.contains("'")) { + data = data.replace("\"", "\"\""); + escapedData = "\"" + data + "\""; + } + return escapedData; + } +} diff --git a/core-java-io/src/test/java/com/baeldung/csv/WriteCsvFileExampleUnitTest.java b/core-java-io/src/test/java/com/baeldung/csv/WriteCsvFileExampleUnitTest.java new file mode 100644 index 0000000000..4ac84f939d --- /dev/null +++ b/core-java-io/src/test/java/com/baeldung/csv/WriteCsvFileExampleUnitTest.java @@ -0,0 +1,90 @@ +package com.baeldung.csv; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class WriteCsvFileExampleUnitTest { + private static final Logger LOG = LoggerFactory.getLogger(WriteCsvFileExampleUnitTest.class); + + private static final String CSV_FILE_NAME = "src/test/resources/exampleOutput.csv"; + private WriteCsvFileExample csvExample; + + @Before + public void setupClass() { + csvExample = new WriteCsvFileExample(); + } + + @Test + public void givenCommaContainingData_whenEscapeSpecialCharacters_stringReturnedInQuotes() { + String data = "three,two,one"; + String escapedData = csvExample.escapeSpecialCharacters(data); + + String expectedData = "\"three,two,one\""; + assertEquals(expectedData, escapedData); + } + + @Test + public void givenQuoteContainingData_whenEscapeSpecialCharacters_stringReturnedFormatted() { + String data = "She said \"Hello\""; + String escapedData = csvExample.escapeSpecialCharacters(data); + + String expectedData = "\"She said \"\"Hello\"\"\""; + assertEquals(expectedData, escapedData); + } + + @Test + public void givenNewlineContainingData_whenEscapeSpecialCharacters_stringReturnedInQuotes() { + String dataNewline = "This contains\na newline"; + String dataCarriageReturn = "This contains\r\na newline and carriage return"; + String escapedDataNl = csvExample.escapeSpecialCharacters(dataNewline); + String escapedDataCr = csvExample.escapeSpecialCharacters(dataCarriageReturn); + + String expectedData = "This contains a newline"; + assertEquals(expectedData, escapedDataNl); + String expectedDataCr = "This contains a newline and carriage return"; + assertEquals(expectedDataCr, escapedDataCr); + } + + @Test + public void givenNonSpecialData_whenEscapeSpecialCharacters_stringReturnedUnchanged() { + String data = "This is nothing special"; + String returnedData = csvExample.escapeSpecialCharacters(data); + + assertEquals(data, returnedData); + } + + @Test + public void givenBufferedWriter_whenWriteLine_thenOutputCreated() { + List dataLines = new ArrayList(); + dataLines.add(new String[] { "John", "Doe", "38", "Comment Data\nAnother line of comment data" }); + dataLines.add(new String[] { "Jane", "Doe, Jr.", "19", "She said \"I'm being quoted\"" }); + + File csvOutputFile = new File(CSV_FILE_NAME); + try (BufferedWriter writer = new BufferedWriter(new FileWriter(csvOutputFile))) { + for (Iterator dataIterator = dataLines.iterator(); dataIterator.hasNext();) { + csvExample.writeLine(writer, dataIterator.next()); + if (dataIterator.hasNext()) { + writer.newLine(); + } + } + writer.flush(); + } catch (IOException e) { + LOG.error("IOException " + e.getMessage()); + } + + assertTrue(csvOutputFile.exists()); + } +} diff --git a/core-java-io/src/test/resources/exampleOutput.csv b/core-java-io/src/test/resources/exampleOutput.csv new file mode 100644 index 0000000000..45c37f3a3b --- /dev/null +++ b/core-java-io/src/test/resources/exampleOutput.csv @@ -0,0 +1,2 @@ +John,Doe,38,Comment Data Another line of comment data +Jane,"Doe, Jr.",19,"She said ""I'm being quoted""" \ No newline at end of file From 70a7aaa4fc25ad2d40e314d3f1c3ae8d8b760101 Mon Sep 17 00:00:00 2001 From: Kumar Chandrakant Date: Thu, 10 Jan 2019 02:20:46 +0530 Subject: [PATCH 326/359] Kafka spark cassandra (#6089) * Adding files for the tutorial BAEL-2301 * Incorporating review comments on the article. * Incorporated additional review comments on the article. --- .../data/pipeline/WordCountingApp.java | 18 ++++++------------ .../WordCountingAppWithCheckpoint.java | 19 ++++++------------- 2 files changed, 12 insertions(+), 25 deletions(-) diff --git a/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingApp.java b/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingApp.java index 1155644e1e..db2a73b411 100644 --- a/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingApp.java +++ b/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingApp.java @@ -14,13 +14,7 @@ import org.apache.kafka.common.serialization.StringDeserializer; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.spark.SparkConf; -import org.apache.spark.api.java.JavaPairRDD; import org.apache.spark.api.java.JavaRDD; -import org.apache.spark.api.java.function.FlatMapFunction; -import org.apache.spark.api.java.function.Function; -import org.apache.spark.api.java.function.Function2; -import org.apache.spark.api.java.function.PairFunction; -import org.apache.spark.api.java.function.VoidFunction; import org.apache.spark.streaming.Durations; import org.apache.spark.streaming.api.java.JavaDStream; import org.apache.spark.streaming.api.java.JavaInputDStream; @@ -59,17 +53,17 @@ public class WordCountingApp { JavaInputDStream> messages = KafkaUtils.createDirectStream(streamingContext, LocationStrategies.PreferConsistent(), ConsumerStrategies. Subscribe(topics, kafkaParams)); - JavaPairDStream results = messages.mapToPair((PairFunction, String, String>) record -> new Tuple2<>(record.key(), record.value())); + JavaPairDStream results = messages.mapToPair(record -> new Tuple2<>(record.key(), record.value())); - JavaDStream lines = results.map((Function, String>) tuple2 -> tuple2._2()); + JavaDStream lines = results.map(tuple2 -> tuple2._2()); - JavaDStream words = lines.flatMap((FlatMapFunction) x -> Arrays.asList(x.split("\\s+")) + JavaDStream words = lines.flatMap(x -> Arrays.asList(x.split("\\s+")) .iterator()); - JavaPairDStream wordCounts = words.mapToPair((PairFunction) s -> new Tuple2<>(s, 1)) - .reduceByKey((Function2) (i1, i2) -> i1 + i2); + JavaPairDStream wordCounts = words.mapToPair(s -> new Tuple2<>(s, 1)) + .reduceByKey((i1, i2) -> i1 + i2); - wordCounts.foreachRDD((VoidFunction>) javaRdd -> { + wordCounts.foreachRDD(javaRdd -> { Map wordCountMap = javaRdd.collectAsMap(); for (String key : wordCountMap.keySet()) { List wordList = Arrays.asList(new Word(key, wordCountMap.get(key))); diff --git a/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingAppWithCheckpoint.java b/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingAppWithCheckpoint.java index 79e21f7209..efbe5f3851 100644 --- a/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingAppWithCheckpoint.java +++ b/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingAppWithCheckpoint.java @@ -16,15 +16,8 @@ import org.apache.log4j.Logger; import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; -import org.apache.spark.api.java.Optional; -import org.apache.spark.api.java.function.FlatMapFunction; -import org.apache.spark.api.java.function.Function; import org.apache.spark.api.java.function.Function2; -import org.apache.spark.api.java.function.Function3; -import org.apache.spark.api.java.function.PairFunction; -import org.apache.spark.api.java.function.VoidFunction; import org.apache.spark.streaming.Durations; -import org.apache.spark.streaming.State; import org.apache.spark.streaming.StateSpec; import org.apache.spark.streaming.api.java.JavaDStream; import org.apache.spark.streaming.api.java.JavaInputDStream; @@ -71,24 +64,24 @@ public class WordCountingAppWithCheckpoint { JavaInputDStream> messages = KafkaUtils.createDirectStream(streamingContext, LocationStrategies.PreferConsistent(), ConsumerStrategies. Subscribe(topics, kafkaParams)); - JavaPairDStream results = messages.mapToPair((PairFunction, String, String>) record -> new Tuple2<>(record.key(), record.value())); + JavaPairDStream results = messages.mapToPair(record -> new Tuple2<>(record.key(), record.value())); - JavaDStream lines = results.map((Function, String>) tuple2 -> tuple2._2()); + JavaDStream lines = results.map(tuple2 -> tuple2._2()); - JavaDStream words = lines.flatMap((FlatMapFunction) x -> Arrays.asList(x.split("\\s+")) + JavaDStream words = lines.flatMap(x -> Arrays.asList(x.split("\\s+")) .iterator()); - JavaPairDStream wordCounts = words.mapToPair((PairFunction) s -> new Tuple2<>(s, 1)) + JavaPairDStream wordCounts = words.mapToPair(s -> new Tuple2<>(s, 1)) .reduceByKey((Function2) (i1, i2) -> i1 + i2); - JavaMapWithStateDStream> cumulativeWordCounts = wordCounts.mapWithState(StateSpec.function((Function3, State, Tuple2>) (word, one, state) -> { + JavaMapWithStateDStream> cumulativeWordCounts = wordCounts.mapWithState(StateSpec.function((word, one, state) -> { int sum = one.orElse(0) + (state.exists() ? state.get() : 0); Tuple2 output = new Tuple2<>(word, sum); state.update(sum); return output; })); - cumulativeWordCounts.foreachRDD((VoidFunction>>) javaRdd -> { + cumulativeWordCounts.foreachRDD(javaRdd -> { List> wordCountList = javaRdd.collect(); for (Tuple2 tuple : wordCountList) { List wordList = Arrays.asList(new Word(tuple._1, tuple._2)); From 288fc3db8af02097cd1cb7bca13aa5a2569af9de Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Thu, 10 Jan 2019 01:04:16 +0200 Subject: [PATCH 327/359] Update pom.xml --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 324f6129db..07e90cca94 100644 --- a/pom.xml +++ b/pom.xml @@ -436,7 +436,7 @@ java-collections-conversions java-collections-maps - java-ee-8-security-api + java-lite java-numbers java-rmi From c7ba38ffcd805b088e9e44d7145eb393ef162025 Mon Sep 17 00:00:00 2001 From: geroza Date: Tue, 8 Jan 2019 16:16:51 -0200 Subject: [PATCH 328/359] migrated the following modules using parent-spring-5 to spring 5.1: spring-mvc-simple spring-security-mvc-custom spring-security-mvc-login spring-security-rest spring-security-rest-basic-auth spring-static-resources spring-thymeleaf --- ethereum/pom.xml | 4 +- parent-spring-5-1/README.md | 1 + parent-spring-5-1/pom.xml | 39 +++++++++++++++++++ parent-spring-5/pom.xml | 4 +- .../spring-data-elasticsearch/pom.xml | 4 +- .../spring-data-mongodb/pom.xml | 5 +-- pom.xml | 6 +++ spring-dispatcher-servlet/pom.xml | 4 +- spring-mvc-forms-jsp/pom.xml | 4 +- spring-mvc-java/pom.xml | 4 +- spring-mvc-simple/pom.xml | 19 --------- .../java/com/baeldung/spring/MvcConfig.java | 1 - .../baeldung/client/RestTemplateFactory.java | 4 +- .../java/org/baeldung/spring/WebConfig.java | 1 - .../SpringContextIntegrationTest.java | 2 +- .../java/org/baeldung/web/FooLiveTest.java | 2 +- 16 files changed, 64 insertions(+), 40 deletions(-) create mode 100644 parent-spring-5-1/README.md create mode 100644 parent-spring-5-1/pom.xml diff --git a/ethereum/pom.xml b/ethereum/pom.xml index 85cb260670..334840edaf 100644 --- a/ethereum/pom.xml +++ b/ethereum/pom.xml @@ -7,10 +7,10 @@ ethereum - parent-spring-5 + parent-spring-5-1 com.baeldung 0.0.1-SNAPSHOT - ../parent-spring-5 + ../parent-spring-5-1 diff --git a/parent-spring-5-1/README.md b/parent-spring-5-1/README.md new file mode 100644 index 0000000000..ff12555376 --- /dev/null +++ b/parent-spring-5-1/README.md @@ -0,0 +1 @@ +## Relevant articles: diff --git a/parent-spring-5-1/pom.xml b/parent-spring-5-1/pom.xml new file mode 100644 index 0000000000..983e5e63eb --- /dev/null +++ b/parent-spring-5-1/pom.xml @@ -0,0 +1,39 @@ + + 4.0.0 + com.baeldung + parent-spring-5-1 + 0.0.1-SNAPSHOT + pom + parent-spring-5-1 + Parent for all spring 5 core modules + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + org.springframework + spring-core + ${spring.version} + + + org.junit.jupiter + junit-jupiter-engine + ${junit.jupiter.version} + test + + + + + 5.0.6.RELEASE + 5.0.2 + 2.9.6 + 2.9.6 + 5.0.6.RELEASE + + + diff --git a/parent-spring-5/pom.xml b/parent-spring-5/pom.xml index 6a15f38884..51a2c1fd1f 100644 --- a/parent-spring-5/pom.xml +++ b/parent-spring-5/pom.xml @@ -29,11 +29,11 @@ - 5.0.6.RELEASE + 5.1.2.RELEASE 5.0.2 2.9.6 2.9.6 - 5.0.6.RELEASE + 5.1.2.RELEASE \ No newline at end of file diff --git a/persistence-modules/spring-data-elasticsearch/pom.xml b/persistence-modules/spring-data-elasticsearch/pom.xml index ee9e71a1cb..c5ad9b64f9 100644 --- a/persistence-modules/spring-data-elasticsearch/pom.xml +++ b/persistence-modules/spring-data-elasticsearch/pom.xml @@ -9,9 +9,9 @@ com.baeldung - parent-spring-5 + parent-spring-5-1 0.0.1-SNAPSHOT - ../../parent-spring-5 + ../../parent-spring-5-1 diff --git a/persistence-modules/spring-data-mongodb/pom.xml b/persistence-modules/spring-data-mongodb/pom.xml index 63b9c3c1b0..4da0526ca6 100644 --- a/persistence-modules/spring-data-mongodb/pom.xml +++ b/persistence-modules/spring-data-mongodb/pom.xml @@ -6,9 +6,9 @@ com.baeldung - parent-spring-5 + parent-spring-5-1 0.0.1-SNAPSHOT - ../../parent-spring-5 + ../../parent-spring-5-1 @@ -99,7 +99,6 @@ 2.1.2.RELEASE 4.1.4 1.1.3 - 5.1.0.RELEASE 1.9.2 3.2.0.RELEASE diff --git a/pom.xml b/pom.xml index 324f6129db..13b866b968 100644 --- a/pom.xml +++ b/pom.xml @@ -329,6 +329,7 @@ parent-boot-2 parent-spring-4 parent-spring-5 + parent-spring-5-1 parent-java parent-kotlin @@ -600,6 +601,7 @@ parent-boot-2 parent-spring-4 parent-spring-5 + parent-spring-5-1 parent-java parent-kotlin @@ -993,6 +995,7 @@ parent-boot-2 parent-spring-4 parent-spring-5 + parent-spring-5-1 parent-java parent-kotlin @@ -1045,6 +1048,7 @@ parent-boot-2 parent-spring-4 parent-spring-5 + parent-spring-5-1 parent-java parent-kotlin @@ -1312,6 +1316,7 @@ parent-boot-2 parent-spring-4 parent-spring-5 + parent-spring-5-1 parent-java parent-kotlin @@ -1544,6 +1549,7 @@ parent-boot-2 parent-spring-4 parent-spring-5 + parent-spring-5-1 parent-java parent-kotlin diff --git a/spring-dispatcher-servlet/pom.xml b/spring-dispatcher-servlet/pom.xml index 7ac291740e..ea5eb8845e 100644 --- a/spring-dispatcher-servlet/pom.xml +++ b/spring-dispatcher-servlet/pom.xml @@ -10,9 +10,9 @@ com.baeldung - parent-spring-5 + parent-spring-5-1 0.0.1-SNAPSHOT - ../parent-spring-5 + ../parent-spring-5-1 diff --git a/spring-mvc-forms-jsp/pom.xml b/spring-mvc-forms-jsp/pom.xml index 5536314086..80818f4e88 100644 --- a/spring-mvc-forms-jsp/pom.xml +++ b/spring-mvc-forms-jsp/pom.xml @@ -11,9 +11,9 @@ com.baeldung - parent-spring-5 + parent-spring-5-1 0.0.1-SNAPSHOT - ../parent-spring-5 + ../parent-spring-5-1 diff --git a/spring-mvc-java/pom.xml b/spring-mvc-java/pom.xml index 9d3e0ca1b2..b0b187ee84 100644 --- a/spring-mvc-java/pom.xml +++ b/spring-mvc-java/pom.xml @@ -8,10 +8,10 @@ war - parent-spring-5 + parent-spring-5-1 com.baeldung 0.0.1-SNAPSHOT - ../parent-spring-5 + ../parent-spring-5-1 diff --git a/spring-mvc-simple/pom.xml b/spring-mvc-simple/pom.xml index 65fa4339d6..087ffea46d 100644 --- a/spring-mvc-simple/pom.xml +++ b/spring-mvc-simple/pom.xml @@ -154,25 +154,6 @@ ${deploy-path} - - maven-surefire-plugin - ${maven-surefire-plugin.version} - - - default-test - - true - - - - - - org.junit.platform - junit-platform-surefire-provider - ${junit.platform.version} - - - spring-mvc-simple diff --git a/spring-security-mvc-login/src/main/java/com/baeldung/spring/MvcConfig.java b/spring-security-mvc-login/src/main/java/com/baeldung/spring/MvcConfig.java index a9c7e0cf15..082477c98c 100644 --- a/spring-security-mvc-login/src/main/java/com/baeldung/spring/MvcConfig.java +++ b/spring-security-mvc-login/src/main/java/com/baeldung/spring/MvcConfig.java @@ -1,7 +1,6 @@ package com.baeldung.spring; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; diff --git a/spring-security-rest-basic-auth/src/main/java/org/baeldung/client/RestTemplateFactory.java b/spring-security-rest-basic-auth/src/main/java/org/baeldung/client/RestTemplateFactory.java index 5e15648e9b..3ed0bc82b7 100644 --- a/spring-security-rest-basic-auth/src/main/java/org/baeldung/client/RestTemplateFactory.java +++ b/spring-security-rest-basic-auth/src/main/java/org/baeldung/client/RestTemplateFactory.java @@ -4,7 +4,7 @@ import org.apache.http.HttpHost; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.http.client.ClientHttpRequestFactory; -import org.springframework.http.client.support.BasicAuthorizationInterceptor; +import org.springframework.http.client.support.BasicAuthenticationInterceptor; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; @@ -38,7 +38,7 @@ public class RestTemplateFactory implements FactoryBean, Initializ HttpHost host = new HttpHost("localhost", 8082, "http"); final ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactoryBasicAuth(host); restTemplate = new RestTemplate(requestFactory); - restTemplate.getInterceptors().add(new BasicAuthorizationInterceptor("user1", "user1Pass")); + restTemplate.getInterceptors().add(new BasicAuthenticationInterceptor("user1", "user1Pass")); } } \ No newline at end of file diff --git a/spring-security-rest-basic-auth/src/main/java/org/baeldung/spring/WebConfig.java b/spring-security-rest-basic-auth/src/main/java/org/baeldung/spring/WebConfig.java index 2305a7b6c2..5876e1307b 100644 --- a/spring-security-rest-basic-auth/src/main/java/org/baeldung/spring/WebConfig.java +++ b/spring-security-rest-basic-auth/src/main/java/org/baeldung/spring/WebConfig.java @@ -8,7 +8,6 @@ import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration @EnableWebMvc diff --git a/spring-security-rest-basic-auth/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-security-rest-basic-auth/src/test/java/org/baeldung/SpringContextIntegrationTest.java index 6cf624c179..31b3f2be87 100644 --- a/spring-security-rest-basic-auth/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ b/spring-security-rest-basic-auth/src/test/java/org/baeldung/SpringContextIntegrationTest.java @@ -6,7 +6,7 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration({ "/WebSecurityConfig.xml" }) +@ContextConfiguration({ "/webSecurityConfig.xml" }) public class SpringContextIntegrationTest { @Test diff --git a/spring-security-rest/src/test/java/org/baeldung/web/FooLiveTest.java b/spring-security-rest/src/test/java/org/baeldung/web/FooLiveTest.java index 0a53da674a..86beeb46a9 100644 --- a/spring-security-rest/src/test/java/org/baeldung/web/FooLiveTest.java +++ b/spring-security-rest/src/test/java/org/baeldung/web/FooLiveTest.java @@ -29,7 +29,7 @@ public class FooLiveTest { // } // return RestAssured.given().cookie("JSESSIONID", cookie); return RestAssured.given() - .auth() + .auth().preemptive() .basic("user", "userPass"); } From cde1d1c7ad72c3d3608b97aa45c933b4ded0b86b Mon Sep 17 00:00:00 2001 From: geroza Date: Tue, 8 Jan 2019 17:17:28 -0200 Subject: [PATCH 329/359] Fixed usage of deprecated GzipResourceResolver in spring-static-resources added back spring-version modification in module that hasnt been worked yet cleaned unused classes --- persistence-modules/spring-data-mongodb/pom.xml | 1 + .../src/main/java/com/baeldung/spring/MvcConfig.java | 1 - .../src/main/java/org/baeldung/spring/MvcConfig.java | 6 +++--- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/persistence-modules/spring-data-mongodb/pom.xml b/persistence-modules/spring-data-mongodb/pom.xml index 4da0526ca6..86e4b275e7 100644 --- a/persistence-modules/spring-data-mongodb/pom.xml +++ b/persistence-modules/spring-data-mongodb/pom.xml @@ -96,6 +96,7 @@ + 5.1.0.RELEASE 2.1.2.RELEASE 4.1.4 1.1.3 diff --git a/spring-security-mvc-login/src/main/java/com/baeldung/spring/MvcConfig.java b/spring-security-mvc-login/src/main/java/com/baeldung/spring/MvcConfig.java index 082477c98c..629e203b56 100644 --- a/spring-security-mvc-login/src/main/java/com/baeldung/spring/MvcConfig.java +++ b/spring-security-mvc-login/src/main/java/com/baeldung/spring/MvcConfig.java @@ -1,7 +1,6 @@ package com.baeldung.spring; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; diff --git a/spring-static-resources/src/main/java/org/baeldung/spring/MvcConfig.java b/spring-static-resources/src/main/java/org/baeldung/spring/MvcConfig.java index dbc548e028..7bd03617be 100644 --- a/spring-static-resources/src/main/java/org/baeldung/spring/MvcConfig.java +++ b/spring-static-resources/src/main/java/org/baeldung/spring/MvcConfig.java @@ -18,7 +18,7 @@ import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.i18n.CookieLocaleResolver; import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; -import org.springframework.web.servlet.resource.GzipResourceResolver; +import org.springframework.web.servlet.resource.EncodedResourceResolver; import org.springframework.web.servlet.resource.PathResourceResolver; import org.springframework.web.servlet.resource.ResourceUrlEncodingFilter; import org.springframework.web.servlet.view.InternalResourceViewResolver; @@ -57,10 +57,10 @@ public class MvcConfig implements WebMvcConfigurer { public void addResourceHandlers(ResourceHandlerRegistry registry) { // For examples using Spring 4.1.0 if ((env.getProperty("resource.handler.conf")).equals("4.1.0")) { - registry.addResourceHandler("/js/**").addResourceLocations("/js/").setCachePeriod(3600).resourceChain(true).addResolver(new GzipResourceResolver()).addResolver(new PathResourceResolver()); + registry.addResourceHandler("/js/**").addResourceLocations("/js/").setCachePeriod(3600).resourceChain(true).addResolver(new EncodedResourceResolver()).addResolver(new PathResourceResolver()); registry.addResourceHandler("/resources/**").addResourceLocations("/resources/", "classpath:/other-resources/").setCachePeriod(3600).resourceChain(true).addResolver(new PathResourceResolver()); registry.addResourceHandler("/files/**").addResourceLocations("file:/Users/Elena/").setCachePeriod(3600).resourceChain(true).addResolver(new PathResourceResolver()); - registry.addResourceHandler("/other-files/**").addResourceLocations("file:/Users/Elena/").setCachePeriod(3600).resourceChain(true).addResolver(new GzipResourceResolver()); + registry.addResourceHandler("/other-files/**").addResourceLocations("file:/Users/Elena/").setCachePeriod(3600).resourceChain(true).addResolver(new EncodedResourceResolver()); } // For examples using Spring 4.0.7 else if ((env.getProperty("resource.handler.conf")).equals("4.0.7")) { From 74df0da304af2152a45ecf60a5f65ae77e0bc474 Mon Sep 17 00:00:00 2001 From: geroza Date: Wed, 9 Jan 2019 12:28:21 -0200 Subject: [PATCH 330/359] fixed removed import by mistake --- .../src/main/java/com/baeldung/spring/MvcConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-security-mvc-login/src/main/java/com/baeldung/spring/MvcConfig.java b/spring-security-mvc-login/src/main/java/com/baeldung/spring/MvcConfig.java index 629e203b56..082477c98c 100644 --- a/spring-security-mvc-login/src/main/java/com/baeldung/spring/MvcConfig.java +++ b/spring-security-mvc-login/src/main/java/com/baeldung/spring/MvcConfig.java @@ -1,6 +1,7 @@ package com.baeldung.spring; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; From 63258737ceb25dd435d3437920b2e8d8fff709aa Mon Sep 17 00:00:00 2001 From: geroza Date: Wed, 9 Jan 2019 13:33:39 -0200 Subject: [PATCH 331/359] modified readme file to kick off travis build --- ethereum/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ethereum/README.md b/ethereum/README.md index d06ca09636..0c7ae3d4d2 100644 --- a/ethereum/README.md +++ b/ethereum/README.md @@ -4,3 +4,4 @@ - [Introduction to EthereumJ](http://www.baeldung.com/ethereumj) - [Creating and Deploying Smart Contracts with Solidity](http://www.baeldung.com/smart-contracts-ethereum-solidity) - [Lightweight Ethereum Clients Using Web3j](http://www.baeldung.com/web3j) + From 04a4c339b767267739690c633901f911a621b46f Mon Sep 17 00:00:00 2001 From: geroza Date: Wed, 9 Jan 2019 14:53:44 -0200 Subject: [PATCH 332/359] change to kick off build --- ethereum/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/ethereum/README.md b/ethereum/README.md index 0c7ae3d4d2..d06ca09636 100644 --- a/ethereum/README.md +++ b/ethereum/README.md @@ -4,4 +4,3 @@ - [Introduction to EthereumJ](http://www.baeldung.com/ethereumj) - [Creating and Deploying Smart Contracts with Solidity](http://www.baeldung.com/smart-contracts-ethereum-solidity) - [Lightweight Ethereum Clients Using Web3j](http://www.baeldung.com/web3j) - From 39bfa04d11d34b8b3fe98deb43936854eaea9fcf Mon Sep 17 00:00:00 2001 From: geroza Date: Wed, 9 Jan 2019 23:51:39 -0200 Subject: [PATCH 333/359] change to kick off build --- ethereum/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ethereum/README.md b/ethereum/README.md index d06ca09636..7accb4cd53 100644 --- a/ethereum/README.md +++ b/ethereum/README.md @@ -4,3 +4,4 @@ - [Introduction to EthereumJ](http://www.baeldung.com/ethereumj) - [Creating and Deploying Smart Contracts with Solidity](http://www.baeldung.com/smart-contracts-ethereum-solidity) - [Lightweight Ethereum Clients Using Web3j](http://www.baeldung.com/web3j) + \ No newline at end of file From 57228dfc6b9ec1af0658f9b616056708c070bb28 Mon Sep 17 00:00:00 2001 From: Rodolfo Felipe Date: Wed, 9 Jan 2019 22:29:44 -0400 Subject: [PATCH 334/359] BAEL-2446 Unit tests for new added examples. --- .../StringReplaceAndRemoveUnitTest.java | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/java-strings/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java b/java-strings/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java index d952d2383b..d54bf09b35 100644 --- a/java-strings/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java +++ b/java-strings/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java @@ -1,15 +1,16 @@ package com.baeldung.string; - import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.RegExUtils; import org.junit.Test; +import com.sun.source.tree.AssertTree; + import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; public class StringReplaceAndRemoveUnitTest { - @Test public void givenTestStrings_whenReplace_thenProcessedString() { @@ -26,7 +27,7 @@ public class StringReplaceAndRemoveUnitTest { public void givenTestStrings_whenReplaceAll_thenProcessedString() { String master2 = "Welcome to Baeldung, Hello World Baeldung"; - String regexTarget= "(Baeldung)$"; + String regexTarget = "(Baeldung)$"; String replacement = "Java"; String processed2 = master2.replaceAll(regexTarget, replacement); assertTrue(processed2.endsWith("Java")); @@ -45,18 +46,16 @@ public class StringReplaceAndRemoveUnitTest { StringBuilder builder = new StringBuilder(master); - builder.delete(startIndex, stopIndex); - assertFalse(builder.toString().contains(target)); - + assertFalse(builder.toString() + .contains(target)); builder.replace(startIndex, stopIndex, replacement); - assertTrue(builder.toString().contains(replacement)); - + assertTrue(builder.toString() + .contains(replacement)); } - @Test public void givenTestStrings_whenStringUtilsMethods_thenProcessedStrings() { @@ -74,10 +73,20 @@ public class StringReplaceAndRemoveUnitTest { } + @Test + public void givenTestStrings_whenReplaceExactWord_thenProcessedString() { + String sentence = "A car is not the same as a carriage, and some planes can carry cars inside them!"; + String regexTarget = "\\bcar\\b"; + String exactWordReplaced = sentence.replaceAll(regexTarget, "truck"); + assertTrue("A truck is not the same as a carriage, and some planes can carry cars inside them!".equals(exactWordReplaced)); + } - - - - + @Test + public void givenTestStrings_whenReplaceExactWordUsingRegExUtilsMethod_thenProcessedString() { + String sentence = "A car is not the same as a carriage, and some planes can carry cars inside them!"; + String regexTarget = "\\bcar\\b"; + String exactWordReplaced = RegExUtils.replaceAll(sentence, regexTarget, "truck"); + assertTrue("A truck is not the same as a carriage, and some planes can carry cars inside them!".equals(exactWordReplaced)); + } } From 44a796b9e66aa8ff28fa464ecaca486bdbcf0277 Mon Sep 17 00:00:00 2001 From: Rodolfo Felipe Date: Wed, 9 Jan 2019 23:16:44 -0400 Subject: [PATCH 335/359] Deleting invalid package Package added by eclipse. Nonexistent. --- .../com/baeldung/string/StringReplaceAndRemoveUnitTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/java-strings/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java b/java-strings/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java index d54bf09b35..4d2b54241b 100644 --- a/java-strings/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java +++ b/java-strings/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java @@ -4,8 +4,6 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.RegExUtils; import org.junit.Test; -import com.sun.source.tree.AssertTree; - import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; From bb966c8e1461083cc6d3617242bc7cf9ac7c0fac Mon Sep 17 00:00:00 2001 From: dupirefr Date: Thu, 10 Jan 2019 08:51:53 +0100 Subject: [PATCH 336/359] [BAEL-2531] Directories creation tests --- .../directories/NewDirectoryUnitTest.java | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 core-java-io/src/test/java/com/baeldung/directories/NewDirectoryUnitTest.java diff --git a/core-java-io/src/test/java/com/baeldung/directories/NewDirectoryUnitTest.java b/core-java-io/src/test/java/com/baeldung/directories/NewDirectoryUnitTest.java new file mode 100644 index 0000000000..e0111c2702 --- /dev/null +++ b/core-java-io/src/test/java/com/baeldung/directories/NewDirectoryUnitTest.java @@ -0,0 +1,100 @@ +package com.baeldung.directories; + +import org.junit.Before; +import org.junit.Test; + +import java.io.File; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class NewDirectoryUnitTest { + + private static final File TEMP_DIRECTORY = new File(System.getProperty("java.io.tmpdir")); + + @Before + public void beforeEach() { + File newDirectory = new File(TEMP_DIRECTORY, "new_directory"); + File nestedInNewDirectory = new File(newDirectory, "nested_directory"); + File existingDirectory = new File(TEMP_DIRECTORY, "existing_directory"); + File existingNestedDirectory = new File(existingDirectory, "existing_nested_directory"); + File nestedInExistingDirectory = new File(existingDirectory, "nested_directory"); + + nestedInNewDirectory.delete(); + newDirectory.delete(); + nestedInExistingDirectory.delete(); + existingDirectory.mkdir(); + existingNestedDirectory.mkdir(); + } + + @Test + public void givenUnexistingDirectory_whenMkdir_thenTrue() { + File newDirectory = new File(TEMP_DIRECTORY, "new_directory"); + assertFalse(newDirectory.exists()); + + boolean directoryCreated = newDirectory.mkdir(); + + assertTrue(directoryCreated); + } + + @Test + public void givenExistingDirectory_whenMkdir_thenFalse() { + File newDirectory = new File(TEMP_DIRECTORY, "new_directory"); + newDirectory.mkdir(); + assertTrue(newDirectory.exists()); + + boolean directoryCreated = newDirectory.mkdir(); + + assertFalse(directoryCreated); + } + + @Test + public void givenUnexistingNestedDirectories_whenMkdir_thenFalse() { + File newDirectory = new File(TEMP_DIRECTORY, "new_directory"); + File nestedDirectory = new File(newDirectory, "nested_directory"); + assertFalse(newDirectory.exists()); + assertFalse(nestedDirectory.exists()); + + boolean directoriesCreated = nestedDirectory.mkdir(); + + assertFalse(directoriesCreated); + } + + @Test + public void givenUnexistingNestedDirectories_whenMkdirs_thenTrue() { + File newDirectory = new File(TEMP_DIRECTORY, "new_directory"); + File nestedDirectory = new File(newDirectory, "nested_directory"); + assertFalse(newDirectory.exists()); + assertFalse(nestedDirectory.exists()); + + boolean directoriesCreated = nestedDirectory.mkdirs(); + + assertTrue(directoriesCreated); + } + + @Test + public void givenExistingParentDirectories_whenMkdirs_thenTrue() { + File newDirectory = new File(TEMP_DIRECTORY, "existing_directory"); + newDirectory.mkdir(); + File nestedDirectory = new File(newDirectory, "nested_directory"); + assertTrue(newDirectory.exists()); + assertFalse(nestedDirectory.exists()); + + boolean directoriesCreated = nestedDirectory.mkdirs(); + + assertTrue(directoriesCreated); + } + + @Test + public void givenExistingNestedDirectories_whenMkdirs_thenFalse() { + File existingDirectory = new File(TEMP_DIRECTORY, "existing_directory"); + File existingNestedDirectory = new File(existingDirectory, "existing_nested_directory"); + assertTrue(existingDirectory.exists()); + assertTrue(existingNestedDirectory.exists()); + + boolean directoriesCreated = existingNestedDirectory.mkdirs(); + + assertFalse(directoriesCreated); + } + +} From 9b550e6554f0432f9e93a1f20273398909f17369 Mon Sep 17 00:00:00 2001 From: mherbaghinyan Date: Thu, 10 Jan 2019 15:00:38 +0400 Subject: [PATCH 337/359] localdate converter --- .../com/baeldung/util/LocalDateConverter.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/util/LocalDateConverter.java diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/util/LocalDateConverter.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/util/LocalDateConverter.java new file mode 100644 index 0000000000..341492d1fd --- /dev/null +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/util/LocalDateConverter.java @@ -0,0 +1,25 @@ +package com.baeldung.util; + +import javax.persistence.AttributeConverter; +import javax.persistence.Converter; +import java.sql.Date; +import java.time.LocalDate; +import java.util.Optional; + +@Converter(autoApply = true) +public class LocalDateConverter implements AttributeConverter { + + @Override + public Date convertToDatabaseColumn(LocalDate localDateTime) { + return Optional.ofNullable(localDateTime) + .map(Date::valueOf) + .orElse(null); + } + + @Override + public LocalDate convertToEntityAttribute(Date timestamp) { + return Optional.ofNullable(timestamp) + .map(Date::toLocalDate) + .orElse(null); + } +} \ No newline at end of file From 6202b7caab30ba5db67e992925efa60c21c2a881 Mon Sep 17 00:00:00 2001 From: mherbaghinyan Date: Thu, 10 Jan 2019 15:18:21 +0400 Subject: [PATCH 338/359] localdate converter --- .../main/java/com/baeldung/util/LocalDateConverter.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/util/LocalDateConverter.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/util/LocalDateConverter.java index 341492d1fd..00fd378b05 100644 --- a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/util/LocalDateConverter.java +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/util/LocalDateConverter.java @@ -10,15 +10,15 @@ import java.util.Optional; public class LocalDateConverter implements AttributeConverter { @Override - public Date convertToDatabaseColumn(LocalDate localDateTime) { - return Optional.ofNullable(localDateTime) + public Date convertToDatabaseColumn(LocalDate localDate) { + return Optional.ofNullable(localDate) .map(Date::valueOf) .orElse(null); } @Override - public LocalDate convertToEntityAttribute(Date timestamp) { - return Optional.ofNullable(timestamp) + public LocalDate convertToEntityAttribute(Date date) { + return Optional.ofNullable(date) .map(Date::toLocalDate) .orElse(null); } From 1ca15e59190955a5bb53c1466d7aac68a8d79859 Mon Sep 17 00:00:00 2001 From: geroza Date: Wed, 9 Jan 2019 12:23:10 -0200 Subject: [PATCH 339/359] Migrated modules using parent-spring-5: ethereum persistence-modules/spring-data-elasticsearch persistence-modules/spring-data-mongodb spring-dispatcher-servlet spring-mvc-forms-jsp spring-mvc-java --- ethereum/pom.xml | 15 ++--- .../spring-data-elasticsearch/pom.xml | 4 +- .../ElasticSearchManualTest.java | 7 ++ ...ionTest.java => GeoQueriesManualTest.java} | 10 ++- ...Test.java => ElasticSearchManualTest.java} | 9 ++- ...java => ElasticSearchQueryManualTest.java} | 9 ++- ...Test.java => SpringContextManualTest.java} | 8 ++- .../spring-data-mongodb/pom.xml | 5 +- .../aggregation/ZipsAggregationLiveTest.java | 6 ++ .../com/baeldung/gridfs/GridFSLiveTest.java | 6 ++ .../mongotemplate/DocumentQueryLiveTest.java | 6 ++ .../MongoTemplateProjectionLiveTest.java | 6 ++ .../MongoTemplateQueryLiveTest.java | 6 ++ .../repository/ActionRepositoryLiveTest.java | 6 ++ .../repository/BaseQueryLiveTest.java | 6 ++ .../baeldung/repository/DSLQueryLiveTest.java | 8 ++- .../repository/JSONQueryLiveTest.java | 6 ++ .../repository/QueryMethodsLiveTest.java | 6 ++ .../repository/UserRepositoryLiveTest.java | 6 ++ .../UserRepositoryProjectionLiveTest.java | 6 ++ .../MongoTransactionReactiveLiveTest.java | 6 ++ .../MongoTransactionTemplateLiveTest.java | 6 ++ .../MongoTransactionalLiveTest.java | 6 ++ spring-4/README.md | 1 + spring-4/pom.xml | 16 +++++ .../com/baeldung/flips/ApplicationConfig.java | 8 ++- .../com/baeldung/jsonp/JsonPApplication.java | 27 ++++++++ .../com/baeldung/jsonp/model/Company.java | 38 +++++++++++ .../web/controller/CompanyController.java | 27 ++++++++ .../jsonp/web/controller/IndexController.java | 13 ++++ .../advice/JsonpControllerAdvice.java | 5 +- .../src/main/resources/application.properties | 2 +- .../resources/jsonp-application.properties | 2 + .../src/main/webapp/WEB-INF/jsp/index.jsp | 66 +++++++++++++++++++ spring-dispatcher-servlet/pom.xml | 4 +- spring-mvc-forms-jsp/pom.xml | 4 +- spring-mvc-java/README.md | 1 - spring-mvc-java/pom.xml | 20 +++++- .../web/controller/CompanyController.java | 13 ---- .../config/HandlerMappingDefaultConfig.java | 9 +-- .../com/baeldung/htmlunit/TestConfig.java | 1 - .../ClassValidationMvcIntegrationTest.java | 1 - .../GreetControllerIntegrationTest.java | 1 - 43 files changed, 366 insertions(+), 52 deletions(-) rename persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/{GeoQueriesIntegrationTest.java => GeoQueriesManualTest.java} (97%) rename persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/{ElasticSearchIntegrationTest.java => ElasticSearchManualTest.java} (97%) rename persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/{ElasticSearchQueryIntegrationTest.java => ElasticSearchQueryManualTest.java} (98%) rename persistence-modules/spring-data-elasticsearch/src/test/java/org/baeldung/{SpringContextIntegrationTest.java => SpringContextManualTest.java} (77%) create mode 100644 spring-4/src/main/java/com/baeldung/jsonp/JsonPApplication.java create mode 100644 spring-4/src/main/java/com/baeldung/jsonp/model/Company.java create mode 100644 spring-4/src/main/java/com/baeldung/jsonp/web/controller/CompanyController.java create mode 100644 spring-4/src/main/java/com/baeldung/jsonp/web/controller/IndexController.java rename {spring-mvc-java/src/main/java/com/baeldung => spring-4/src/main/java/com/baeldung/jsonp}/web/controller/advice/JsonpControllerAdvice.java (53%) create mode 100644 spring-4/src/main/resources/jsonp-application.properties create mode 100644 spring-4/src/main/webapp/WEB-INF/jsp/index.jsp diff --git a/ethereum/pom.xml b/ethereum/pom.xml index 334840edaf..c7f82eaf22 100644 --- a/ethereum/pom.xml +++ b/ethereum/pom.xml @@ -7,10 +7,10 @@ ethereum - parent-spring-5-1 + parent-spring-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-spring-5-1 + ../parent-spring-5 @@ -37,17 +37,17 @@ org.springframework spring-core - ${springframework.version} + ${spring.version} org.springframework spring-web - ${springframework.version} + ${spring.version} org.springframework spring-webmvc - ${springframework.version} + ${spring.version} @@ -123,12 +123,12 @@ org.springframework spring-context - ${springframework.version} + ${spring.version} org.springframework spring-test - ${springframework.version} + ${spring.version} test @@ -212,7 +212,6 @@ 8.5.4 1.5.0-RELEASE 3.3.1 - 5.0.5.RELEASE 1.5.6.RELEASE 2.21.0 2.9.7 diff --git a/persistence-modules/spring-data-elasticsearch/pom.xml b/persistence-modules/spring-data-elasticsearch/pom.xml index c5ad9b64f9..ee9e71a1cb 100644 --- a/persistence-modules/spring-data-elasticsearch/pom.xml +++ b/persistence-modules/spring-data-elasticsearch/pom.xml @@ -9,9 +9,9 @@ com.baeldung - parent-spring-5-1 + parent-spring-5 0.0.1-SNAPSHOT - ../../parent-spring-5-1 + ../../parent-spring-5 diff --git a/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/ElasticSearchManualTest.java b/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/ElasticSearchManualTest.java index fbf4e5ab99..e43dcdf43e 100644 --- a/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/ElasticSearchManualTest.java +++ b/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/ElasticSearchManualTest.java @@ -30,6 +30,13 @@ import org.junit.Test; import com.alibaba.fastjson.JSON; +/** + * + * This Manual test requires: + * * Elasticsearch instance running on host + * * with cluster name = elasticsearch + * + */ public class ElasticSearchManualTest { private List listOfPersons = new ArrayList<>(); private Client client = null; diff --git a/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/GeoQueriesIntegrationTest.java b/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/GeoQueriesManualTest.java similarity index 97% rename from persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/GeoQueriesIntegrationTest.java rename to persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/GeoQueriesManualTest.java index 1f55379418..f9a42050b6 100644 --- a/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/GeoQueriesIntegrationTest.java +++ b/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/GeoQueriesManualTest.java @@ -31,9 +31,17 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.baeldung.spring.data.es.config.Config; import com.vividsolutions.jts.geom.Coordinate; +/** + * + * This Manual test requires: + * * Elasticsearch instance running on host + * * with cluster name = elasticsearch + * * and further configurations + * + */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = Config.class) -public class GeoQueriesIntegrationTest { +public class GeoQueriesManualTest { private static final String WONDERS_OF_WORLD = "wonders-of-world"; private static final String WONDERS = "Wonders"; diff --git a/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchIntegrationTest.java b/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchManualTest.java similarity index 97% rename from persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchIntegrationTest.java rename to persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchManualTest.java index 6ecb11cdbe..bed2e2ff25 100644 --- a/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchIntegrationTest.java +++ b/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchManualTest.java @@ -27,9 +27,16 @@ import com.baeldung.spring.data.es.model.Article; import com.baeldung.spring.data.es.model.Author; import com.baeldung.spring.data.es.service.ArticleService; +/** + * + * This Manual test requires: + * * Elasticsearch instance running on host + * * with cluster name = elasticsearch + * + */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = Config.class) -public class ElasticSearchIntegrationTest { +public class ElasticSearchManualTest { @Autowired private ElasticsearchTemplate elasticsearchTemplate; diff --git a/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchQueryIntegrationTest.java b/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchQueryManualTest.java similarity index 98% rename from persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchQueryIntegrationTest.java rename to persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchQueryManualTest.java index 2348c49830..5e24d8398c 100644 --- a/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchQueryIntegrationTest.java +++ b/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchQueryManualTest.java @@ -41,9 +41,16 @@ import com.baeldung.spring.data.es.model.Article; import com.baeldung.spring.data.es.model.Author; import com.baeldung.spring.data.es.service.ArticleService; +/** + * + * This Manual test requires: + * * Elasticsearch instance running on host + * * with cluster name = elasticsearch + * + */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = Config.class) -public class ElasticSearchQueryIntegrationTest { +public class ElasticSearchQueryManualTest { @Autowired private ElasticsearchTemplate elasticsearchTemplate; diff --git a/persistence-modules/spring-data-elasticsearch/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/persistence-modules/spring-data-elasticsearch/src/test/java/org/baeldung/SpringContextManualTest.java similarity index 77% rename from persistence-modules/spring-data-elasticsearch/src/test/java/org/baeldung/SpringContextIntegrationTest.java rename to persistence-modules/spring-data-elasticsearch/src/test/java/org/baeldung/SpringContextManualTest.java index 6f45039c96..c6f095eae9 100644 --- a/persistence-modules/spring-data-elasticsearch/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ b/persistence-modules/spring-data-elasticsearch/src/test/java/org/baeldung/SpringContextManualTest.java @@ -7,9 +7,15 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.baeldung.spring.data.es.config.Config; +/** + * + * This Manual test requires: + * * Elasticsearch instance running on host + * + */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = Config.class) -public class SpringContextIntegrationTest { +public class SpringContextManualTest { @Test public void whenSpringContextIsBootstrapped_thenNoExceptions() { diff --git a/persistence-modules/spring-data-mongodb/pom.xml b/persistence-modules/spring-data-mongodb/pom.xml index 86e4b275e7..c1faf72103 100644 --- a/persistence-modules/spring-data-mongodb/pom.xml +++ b/persistence-modules/spring-data-mongodb/pom.xml @@ -6,9 +6,9 @@ com.baeldung - parent-spring-5-1 + parent-spring-5 0.0.1-SNAPSHOT - ../../parent-spring-5-1 + ../../parent-spring-5 @@ -96,7 +96,6 @@ - 5.1.0.RELEASE 2.1.2.RELEASE 4.1.4 1.1.3 diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/aggregation/ZipsAggregationLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/aggregation/ZipsAggregationLiveTest.java index 1da50d7cb4..1002dc79eb 100644 --- a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/aggregation/ZipsAggregationLiveTest.java +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/aggregation/ZipsAggregationLiveTest.java @@ -44,6 +44,12 @@ import com.mongodb.MongoClient; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; +/** + * + * This test requires: + * * mongodb instance running on the environment + * + */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) public class ZipsAggregationLiveTest { diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/gridfs/GridFSLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/gridfs/GridFSLiveTest.java index 3a88a1e654..d25b9ece4f 100644 --- a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/gridfs/GridFSLiveTest.java +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/gridfs/GridFSLiveTest.java @@ -31,6 +31,12 @@ import com.mongodb.BasicDBObject; import com.mongodb.DBObject; import com.mongodb.client.gridfs.model.GridFSFile; +/** + * + * This test requires: + * * mongodb instance running on the environment + * + */ @ContextConfiguration("file:src/main/resources/mongoConfig.xml") @RunWith(SpringJUnit4ClassRunner.class) public class GridFSLiveTest { diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/mongotemplate/DocumentQueryLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/mongotemplate/DocumentQueryLiveTest.java index d05bde0f1b..e5e4a188ec 100644 --- a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/mongotemplate/DocumentQueryLiveTest.java +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/mongotemplate/DocumentQueryLiveTest.java @@ -24,6 +24,12 @@ import com.baeldung.config.MongoConfig; import com.baeldung.model.EmailAddress; import com.baeldung.model.User; +/** + * + * This test requires: + * * mongodb instance running on the environment + * + */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) public class DocumentQueryLiveTest { diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/mongotemplate/MongoTemplateProjectionLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/mongotemplate/MongoTemplateProjectionLiveTest.java index 309f14e995..9e12997c67 100644 --- a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/mongotemplate/MongoTemplateProjectionLiveTest.java +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/mongotemplate/MongoTemplateProjectionLiveTest.java @@ -16,6 +16,12 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +/** + * + * This test requires: + * * mongodb instance running on the environment + * + */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = SimpleMongoConfig.class) public class MongoTemplateProjectionLiveTest { diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/mongotemplate/MongoTemplateQueryLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/mongotemplate/MongoTemplateQueryLiveTest.java index fc78921b75..4f62f0d7a7 100644 --- a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/mongotemplate/MongoTemplateQueryLiveTest.java +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/mongotemplate/MongoTemplateQueryLiveTest.java @@ -27,6 +27,12 @@ import com.baeldung.config.MongoConfig; import com.baeldung.model.EmailAddress; import com.baeldung.model.User; +/** + * + * This test requires: + * * mongodb instance running on the environment + * + */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) public class MongoTemplateQueryLiveTest { diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/ActionRepositoryLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/ActionRepositoryLiveTest.java index 096015ca0a..79648f1a20 100644 --- a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/ActionRepositoryLiveTest.java +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/ActionRepositoryLiveTest.java @@ -15,6 +15,12 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.time.ZoneOffset; import java.time.ZonedDateTime; +/** + * + * This test requires: + * * mongodb instance running on the environment + * + */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) public class ActionRepositoryLiveTest { diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/BaseQueryLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/BaseQueryLiveTest.java index e4849181e5..c94bb2ae4c 100644 --- a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/BaseQueryLiveTest.java +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/BaseQueryLiveTest.java @@ -7,6 +7,12 @@ import org.junit.Before; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoOperations; +/** + * + * This test requires: + * * mongodb instance running on the environment + * + */ public class BaseQueryLiveTest { @Autowired diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/DSLQueryLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/DSLQueryLiveTest.java index f87ca5cbb5..0ccf677b3e 100644 --- a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/DSLQueryLiveTest.java +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/DSLQueryLiveTest.java @@ -15,8 +15,12 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.querydsl.core.types.Predicate; - - +/** + * + * This test requires: + * * mongodb instance running on the environment + * + */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) public class DSLQueryLiveTest extends BaseQueryLiveTest { diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/JSONQueryLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/JSONQueryLiveTest.java index 4e99c0b140..3a99407350 100644 --- a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/JSONQueryLiveTest.java +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/JSONQueryLiveTest.java @@ -12,6 +12,12 @@ import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +/** + * + * This test requires: + * * mongodb instance running on the environment + * + */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) public class JSONQueryLiveTest extends BaseQueryLiveTest { diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/QueryMethodsLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/QueryMethodsLiveTest.java index 47e67a6b4c..ef8ce10dd1 100644 --- a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/QueryMethodsLiveTest.java +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/QueryMethodsLiveTest.java @@ -12,6 +12,12 @@ import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +/** + * + * This test requires: + * * mongodb instance running on the environment + * + */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) public class QueryMethodsLiveTest extends BaseQueryLiveTest { diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/UserRepositoryLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/UserRepositoryLiveTest.java index 901610e42d..dd7215af7e 100644 --- a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/UserRepositoryLiveTest.java +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/UserRepositoryLiveTest.java @@ -23,6 +23,12 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.baeldung.config.MongoConfig; import com.baeldung.model.User; +/** + * + * This test requires: + * * mongodb instance running on the environment + * + */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) public class UserRepositoryLiveTest { diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/UserRepositoryProjectionLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/UserRepositoryProjectionLiveTest.java index 80f4275794..8972246041 100644 --- a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/UserRepositoryProjectionLiveTest.java +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/UserRepositoryProjectionLiveTest.java @@ -13,6 +13,12 @@ import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +/** + * + * This test requires: + * * mongodb instance running on the environment + * + */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) public class UserRepositoryProjectionLiveTest { diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionReactiveLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionReactiveLiveTest.java index 70908552fe..3fc8dcf977 100644 --- a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionReactiveLiveTest.java +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionReactiveLiveTest.java @@ -12,6 +12,12 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.baeldung.config.MongoReactiveConfig; import com.baeldung.model.User; +/** + * + * This test requires: + * * mongodb instance running on the environment + * + */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoReactiveConfig.class) public class MongoTransactionReactiveLiveTest { diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionTemplateLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionTemplateLiveTest.java index 20ac6974bc..53b2c7a0e7 100644 --- a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionTemplateLiveTest.java +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionTemplateLiveTest.java @@ -24,6 +24,12 @@ import org.springframework.transaction.support.TransactionTemplate; import com.baeldung.config.MongoConfig; import com.baeldung.model.User; +/** + * + * This test requires: + * * mongodb instance running on the environment + * + */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) public class MongoTransactionTemplateLiveTest { diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionalLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionalLiveTest.java index 0cf86aa43e..bafcd770ec 100644 --- a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionalLiveTest.java +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionalLiveTest.java @@ -24,6 +24,12 @@ import com.baeldung.model.User; import com.baeldung.repository.UserRepository; import com.mongodb.MongoCommandException; +/** + * + * This test requires: + * * mongodb instance running on the environment + * + */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) diff --git a/spring-4/README.md b/spring-4/README.md index 402557eb41..57cb8c3eeb 100644 --- a/spring-4/README.md +++ b/spring-4/README.md @@ -1,3 +1,4 @@ ### Relevant Articles: - [A Guide to Flips for Spring](http://www.baeldung.com/flips-spring) - [Configuring a Hikari Connection Pool with Spring Boot](https://www.baeldung.com/spring-boot-hikari) +- [Spring JSON-P with Jackson](http://www.baeldung.com/spring-jackson-jsonp) diff --git a/spring-4/pom.xml b/spring-4/pom.xml index 78939bba95..60f1555d8f 100644 --- a/spring-4/pom.xml +++ b/spring-4/pom.xml @@ -52,6 +52,21 @@ provided + + javax.servlet + jstl + + + + org.springframework.boot + spring-boot-starter-tomcat + provided + + + org.apache.tomcat.embed + tomcat-embed-jasper + provided + @@ -71,6 +86,7 @@ + com.baeldung.flips.ApplicationConfig 1.0.1 1.16.18 1.4.197 diff --git a/spring-4/src/main/java/com/baeldung/flips/ApplicationConfig.java b/spring-4/src/main/java/com/baeldung/flips/ApplicationConfig.java index 7001aeb991..1bd6ffa336 100644 --- a/spring-4/src/main/java/com/baeldung/flips/ApplicationConfig.java +++ b/spring-4/src/main/java/com/baeldung/flips/ApplicationConfig.java @@ -3,9 +3,15 @@ package com.baeldung.flips; import org.flips.describe.config.FlipWebContextConfiguration; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; +import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; import org.springframework.context.annotation.Import; -@SpringBootApplication +@SpringBootApplication(exclude = { + DataSourceAutoConfiguration.class, + DataSourceTransactionManagerAutoConfiguration.class, + HibernateJpaAutoConfiguration.class }) @Import(FlipWebContextConfiguration.class) public class ApplicationConfig { diff --git a/spring-4/src/main/java/com/baeldung/jsonp/JsonPApplication.java b/spring-4/src/main/java/com/baeldung/jsonp/JsonPApplication.java new file mode 100644 index 0000000000..a8f3c0e102 --- /dev/null +++ b/spring-4/src/main/java/com/baeldung/jsonp/JsonPApplication.java @@ -0,0 +1,27 @@ +package com.baeldung.jsonp; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; +import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.context.annotation.PropertySource; + +@SpringBootApplication(exclude = { + DataSourceAutoConfiguration.class, + DataSourceTransactionManagerAutoConfiguration.class, + HibernateJpaAutoConfiguration.class }) +@PropertySource("classpath:jsonp-application.properties") +public class JsonPApplication extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(JsonPApplication.class); + } + + public static void main(String[] args) throws Exception { + SpringApplication.run(JsonPApplication.class, args); + } +} diff --git a/spring-4/src/main/java/com/baeldung/jsonp/model/Company.java b/spring-4/src/main/java/com/baeldung/jsonp/model/Company.java new file mode 100644 index 0000000000..b11a216e52 --- /dev/null +++ b/spring-4/src/main/java/com/baeldung/jsonp/model/Company.java @@ -0,0 +1,38 @@ +package com.baeldung.jsonp.model; + +public class Company { + + private long id; + private String name; + + public Company() { + super(); + } + + public Company(final long id, final String name) { + this.id = id; + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public long getId() { + return id; + } + + public void setId(final long id) { + this.id = id; + } + + @Override + public String toString() { + return "Company [id=" + id + ", name=" + name + "]"; + } + +} diff --git a/spring-4/src/main/java/com/baeldung/jsonp/web/controller/CompanyController.java b/spring-4/src/main/java/com/baeldung/jsonp/web/controller/CompanyController.java new file mode 100644 index 0000000000..8710359365 --- /dev/null +++ b/spring-4/src/main/java/com/baeldung/jsonp/web/controller/CompanyController.java @@ -0,0 +1,27 @@ +package com.baeldung.jsonp.web.controller; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.baeldung.jsonp.model.Company; + +@Controller +public class CompanyController { + + @RequestMapping(value = "/companyResponseBody", produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseBody + public Company getCompanyResponseBody() { + final Company company = new Company(2, "ABC"); + return company; + } + + @RequestMapping(value = "/companyResponseEntity", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity getCompanyResponseEntity() { + final Company company = new Company(3, "123"); + return new ResponseEntity(company, HttpStatus.OK); + } +} diff --git a/spring-4/src/main/java/com/baeldung/jsonp/web/controller/IndexController.java b/spring-4/src/main/java/com/baeldung/jsonp/web/controller/IndexController.java new file mode 100644 index 0000000000..8469e19458 --- /dev/null +++ b/spring-4/src/main/java/com/baeldung/jsonp/web/controller/IndexController.java @@ -0,0 +1,13 @@ +package com.baeldung.jsonp.web.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class IndexController { + + @RequestMapping() + public String retrieveIndex() { + return "index"; + } +} diff --git a/spring-mvc-java/src/main/java/com/baeldung/web/controller/advice/JsonpControllerAdvice.java b/spring-4/src/main/java/com/baeldung/jsonp/web/controller/advice/JsonpControllerAdvice.java similarity index 53% rename from spring-mvc-java/src/main/java/com/baeldung/web/controller/advice/JsonpControllerAdvice.java rename to spring-4/src/main/java/com/baeldung/jsonp/web/controller/advice/JsonpControllerAdvice.java index 7b2c6870df..be7c65cb1e 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/web/controller/advice/JsonpControllerAdvice.java +++ b/spring-4/src/main/java/com/baeldung/jsonp/web/controller/advice/JsonpControllerAdvice.java @@ -1,8 +1,11 @@ -package com.baeldung.web.controller.advice; +package com.baeldung.jsonp.web.controller.advice; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.AbstractJsonpResponseBodyAdvice; +// AbstractJsonpResponseBodyAdvice was deprecated in favor of configuring CORS properly +// We still want to cover the usage of JSON-P in our articles, therefore we don't care that it was deprecated. +@SuppressWarnings("deprecation") @ControllerAdvice public class JsonpControllerAdvice extends AbstractJsonpResponseBodyAdvice { diff --git a/spring-4/src/main/resources/application.properties b/spring-4/src/main/resources/application.properties index 274896be15..e67700b7be 100644 --- a/spring-4/src/main/resources/application.properties +++ b/spring-4/src/main/resources/application.properties @@ -2,4 +2,4 @@ feature.foo.by.id=Y feature.new.foo=Y last.active.after=2018-03-14T00:00:00Z first.active.after=2999-03-15T00:00:00Z -logging.level.org.flips=info \ No newline at end of file +logging.level.org.flips=info diff --git a/spring-4/src/main/resources/jsonp-application.properties b/spring-4/src/main/resources/jsonp-application.properties new file mode 100644 index 0000000000..94e7fcc026 --- /dev/null +++ b/spring-4/src/main/resources/jsonp-application.properties @@ -0,0 +1,2 @@ +spring.mvc.view.prefix=/WEB-INF/jsp/ +spring.mvc.view.suffix=.jsp diff --git a/spring-4/src/main/webapp/WEB-INF/jsp/index.jsp b/spring-4/src/main/webapp/WEB-INF/jsp/index.jsp new file mode 100644 index 0000000000..fa5498c966 --- /dev/null +++ b/spring-4/src/main/webapp/WEB-INF/jsp/index.jsp @@ -0,0 +1,66 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1" %> + + + + + Company Data + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/spring-dispatcher-servlet/pom.xml b/spring-dispatcher-servlet/pom.xml index ea5eb8845e..7ac291740e 100644 --- a/spring-dispatcher-servlet/pom.xml +++ b/spring-dispatcher-servlet/pom.xml @@ -10,9 +10,9 @@ com.baeldung - parent-spring-5-1 + parent-spring-5 0.0.1-SNAPSHOT - ../parent-spring-5-1 + ../parent-spring-5 diff --git a/spring-mvc-forms-jsp/pom.xml b/spring-mvc-forms-jsp/pom.xml index 80818f4e88..5536314086 100644 --- a/spring-mvc-forms-jsp/pom.xml +++ b/spring-mvc-forms-jsp/pom.xml @@ -11,9 +11,9 @@ com.baeldung - parent-spring-5-1 + parent-spring-5 0.0.1-SNAPSHOT - ../parent-spring-5-1 + ../parent-spring-5 diff --git a/spring-mvc-java/README.md b/spring-mvc-java/README.md index c7fcbd400b..851a3689ab 100644 --- a/spring-mvc-java/README.md +++ b/spring-mvc-java/README.md @@ -11,7 +11,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Introduction to Advice Types in Spring](http://www.baeldung.com/spring-aop-advice-tutorial) - [A Guide to the ViewResolver in Spring MVC](http://www.baeldung.com/spring-mvc-view-resolver-tutorial) - [Integration Testing in Spring](http://www.baeldung.com/integration-testing-in-spring) -- [Spring JSON-P with Jackson](http://www.baeldung.com/spring-jackson-jsonp) - [A Quick Guide to Spring MVC Matrix Variables](http://www.baeldung.com/spring-mvc-matrix-variables) - [Intro to WebSockets with Spring](http://www.baeldung.com/websockets-spring) - [File Upload with Spring MVC](http://www.baeldung.com/spring-file-upload) diff --git a/spring-mvc-java/pom.xml b/spring-mvc-java/pom.xml index b0b187ee84..562df30318 100644 --- a/spring-mvc-java/pom.xml +++ b/spring-mvc-java/pom.xml @@ -8,10 +8,10 @@ war - parent-spring-5-1 + parent-spring-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-spring-5-1 + ../parent-spring-5 @@ -60,6 +60,12 @@ commons-fileupload commons-fileupload ${commons-fileupload.version} + + + commons-io + commons-io + + net.sourceforge.htmlunit @@ -70,8 +76,17 @@ commons-logging commons-logging + + commons-io + commons-io + + + commons-io + commons-io + ${commons-io.version} + @@ -255,6 +270,7 @@ 19.0 3.5 1.3.2 + 2.5 2.2.0 diff --git a/spring-mvc-java/src/main/java/com/baeldung/web/controller/CompanyController.java b/spring-mvc-java/src/main/java/com/baeldung/web/controller/CompanyController.java index e92abfdc47..af1e729c13 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/web/controller/CompanyController.java +++ b/spring-mvc-java/src/main/java/com/baeldung/web/controller/CompanyController.java @@ -60,17 +60,4 @@ public class CompanyController { result.put("name", name); return new ResponseEntity<>(result, HttpStatus.OK); } - - @RequestMapping(value = "/companyResponseBody", produces = MediaType.APPLICATION_JSON_VALUE) - @ResponseBody - public Company getCompanyResponseBody() { - final Company company = new Company(2, "ABC"); - return company; - } - - @RequestMapping(value = "/companyResponseEntity", produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity getCompanyResponseEntity() { - final Company company = new Company(3, "123"); - return new ResponseEntity(company, HttpStatus.OK); - } } diff --git a/spring-mvc-java/src/test/java/com/baeldung/config/HandlerMappingDefaultConfig.java b/spring-mvc-java/src/test/java/com/baeldung/config/HandlerMappingDefaultConfig.java index 9190d07d6b..d3a329a387 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/config/HandlerMappingDefaultConfig.java +++ b/spring-mvc-java/src/test/java/com/baeldung/config/HandlerMappingDefaultConfig.java @@ -1,15 +1,10 @@ package com.baeldung.config; -import com.baeldung.web.controller.handlermapping.BeanNameHandlerMappingController; -import com.baeldung.web.controller.handlermapping.SimpleUrlMappingController; -import com.baeldung.web.controller.handlermapping.WelcomeController; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping; -import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; -import java.util.HashMap; -import java.util.Map; +import com.baeldung.web.controller.handlermapping.BeanNameHandlerMappingController; +import com.baeldung.web.controller.handlermapping.WelcomeController; @Configuration diff --git a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/TestConfig.java b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/TestConfig.java index 5b86b59095..529879fada 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/TestConfig.java +++ b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/TestConfig.java @@ -9,7 +9,6 @@ import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.thymeleaf.spring4.SpringTemplateEngine; import org.thymeleaf.spring4.view.ThymeleafViewResolver; import org.thymeleaf.templateresolver.ServletContextTemplateResolver; diff --git a/spring-mvc-java/src/test/java/com/baeldung/web/controller/ClassValidationMvcIntegrationTest.java b/spring-mvc-java/src/test/java/com/baeldung/web/controller/ClassValidationMvcIntegrationTest.java index a86f71011c..2cd225a775 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/web/controller/ClassValidationMvcIntegrationTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/web/controller/ClassValidationMvcIntegrationTest.java @@ -1,6 +1,5 @@ package com.baeldung.web.controller; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; diff --git a/spring-mvc-java/src/test/java/com/baeldung/web/controller/GreetControllerIntegrationTest.java b/spring-mvc-java/src/test/java/com/baeldung/web/controller/GreetControllerIntegrationTest.java index 384bd85ec6..bce5ab0a8c 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/web/controller/GreetControllerIntegrationTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/web/controller/GreetControllerIntegrationTest.java @@ -20,7 +20,6 @@ import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -import com.baeldung.spring.web.config.WebConfig; import com.baeldung.spring.web.config.WebConfig; @RunWith(SpringJUnit4ClassRunner.class) From 8c34b3e93ba35f8d06cbda55d9e46f048997abe4 Mon Sep 17 00:00:00 2001 From: geroza Date: Wed, 9 Jan 2019 12:43:11 -0200 Subject: [PATCH 340/359] * removed temporary parent module parent-spring-5 --- parent-spring-5-1/README.md | 1 - parent-spring-5-1/pom.xml | 39 ------------------------------------- pom.xml | 6 ------ 3 files changed, 46 deletions(-) delete mode 100644 parent-spring-5-1/README.md delete mode 100644 parent-spring-5-1/pom.xml diff --git a/parent-spring-5-1/README.md b/parent-spring-5-1/README.md deleted file mode 100644 index ff12555376..0000000000 --- a/parent-spring-5-1/README.md +++ /dev/null @@ -1 +0,0 @@ -## Relevant articles: diff --git a/parent-spring-5-1/pom.xml b/parent-spring-5-1/pom.xml deleted file mode 100644 index 983e5e63eb..0000000000 --- a/parent-spring-5-1/pom.xml +++ /dev/null @@ -1,39 +0,0 @@ - - 4.0.0 - com.baeldung - parent-spring-5-1 - 0.0.1-SNAPSHOT - pom - parent-spring-5-1 - Parent for all spring 5 core modules - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - - org.springframework - spring-core - ${spring.version} - - - org.junit.jupiter - junit-jupiter-engine - ${junit.jupiter.version} - test - - - - - 5.0.6.RELEASE - 5.0.2 - 2.9.6 - 2.9.6 - 5.0.6.RELEASE - - - diff --git a/pom.xml b/pom.xml index 13b866b968..324f6129db 100644 --- a/pom.xml +++ b/pom.xml @@ -329,7 +329,6 @@ parent-boot-2 parent-spring-4 parent-spring-5 - parent-spring-5-1 parent-java parent-kotlin @@ -601,7 +600,6 @@ parent-boot-2 parent-spring-4 parent-spring-5 - parent-spring-5-1 parent-java parent-kotlin @@ -995,7 +993,6 @@ parent-boot-2 parent-spring-4 parent-spring-5 - parent-spring-5-1 parent-java parent-kotlin @@ -1048,7 +1045,6 @@ parent-boot-2 parent-spring-4 parent-spring-5 - parent-spring-5-1 parent-java parent-kotlin @@ -1316,7 +1312,6 @@ parent-boot-2 parent-spring-4 parent-spring-5 - parent-spring-5-1 parent-java parent-kotlin @@ -1549,7 +1544,6 @@ parent-boot-2 parent-spring-4 parent-spring-5 - parent-spring-5-1 parent-java parent-kotlin From 94c146e245c78b2ddaf941f0f6e43fb1eff3a1b4 Mon Sep 17 00:00:00 2001 From: Ger Roza Date: Thu, 10 Jan 2019 14:21:27 -0200 Subject: [PATCH 341/359] just to trigger the Travis build --- ethereum/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ethereum/README.md b/ethereum/README.md index 7accb4cd53..0c7ae3d4d2 100644 --- a/ethereum/README.md +++ b/ethereum/README.md @@ -4,4 +4,4 @@ - [Introduction to EthereumJ](http://www.baeldung.com/ethereumj) - [Creating and Deploying Smart Contracts with Solidity](http://www.baeldung.com/smart-contracts-ethereum-solidity) - [Lightweight Ethereum Clients Using Web3j](http://www.baeldung.com/web3j) - \ No newline at end of file + From 4fb05ab3a27bc4267db4d344a3987e875d55537d Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Thu, 10 Jan 2019 21:22:46 +0200 Subject: [PATCH 342/359] Update pom.xml --- java-numbers/pom.xml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/java-numbers/pom.xml b/java-numbers/pom.xml index bb63c8cfe1..0f5140ea5e 100644 --- a/java-numbers/pom.xml +++ b/java-numbers/pom.xml @@ -72,16 +72,6 @@ - - org.apache.maven.plugins - maven-surefire-plugin - - - **/*IntegrationTest.java - - true - - org.apache.maven.plugins From dfbff7aa19384117e758e12ae1eab870d183f097 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Thu, 10 Jan 2019 21:32:08 +0200 Subject: [PATCH 343/359] Update pom.xml --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 07e90cca94..a9b4b3f119 100644 --- a/pom.xml +++ b/pom.xml @@ -232,6 +232,7 @@ ${maven-war-plugin.version} + com.vackosar.gitflowincrementalbuilder From a15045f8a7f46a72268a088e4d0c7943cd17b456 Mon Sep 17 00:00:00 2001 From: Ger Roza Date: Thu, 10 Jan 2019 18:17:59 -0200 Subject: [PATCH 344/359] edit readme to trigger travis build --- ethereum/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/ethereum/README.md b/ethereum/README.md index 0c7ae3d4d2..d06ca09636 100644 --- a/ethereum/README.md +++ b/ethereum/README.md @@ -4,4 +4,3 @@ - [Introduction to EthereumJ](http://www.baeldung.com/ethereumj) - [Creating and Deploying Smart Contracts with Solidity](http://www.baeldung.com/smart-contracts-ethereum-solidity) - [Lightweight Ethereum Clients Using Web3j](http://www.baeldung.com/web3j) - From 7f501f169f7f7d22362e7e28cdb1331ad020ef55 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Thu, 10 Jan 2019 22:32:12 +0200 Subject: [PATCH 345/359] Update Circle.java --- core-java/src/main/java/com/baeldung/keyword/Circle.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java/src/main/java/com/baeldung/keyword/Circle.java b/core-java/src/main/java/com/baeldung/keyword/Circle.java index 4ec91d1b8a..231b2f5a59 100644 --- a/core-java/src/main/java/com/baeldung/keyword/Circle.java +++ b/core-java/src/main/java/com/baeldung/keyword/Circle.java @@ -1,4 +1,5 @@ package com.baeldung.keyword; public class Circle extends Round implements Shape { + } From b8dbc9d053a6f56eb2884baa7c811b713ce7a2ae Mon Sep 17 00:00:00 2001 From: Laurentiu Delcea Date: Thu, 10 Jan 2019 23:21:06 +0200 Subject: [PATCH 346/359] BAEL-2480 Java Map to String conversion (#6075) * BAEL-2480 Java Map to String conversion * BAEL-2480 Java Map to String conversion * BAEL-2480 Java Map to String conversion * BAEL-2480 Java Map to String conversion --- .../com/baeldung/convert/MapToString.java | 34 +++++++++++++ .../com/baeldung/convert/StringToMap.java | 21 ++++++++ .../baeldung/convert/MapToStringUnitTest.java | 48 +++++++++++++++++++ .../baeldung/convert/StringToMapUnitTest.java | 23 +++++++++ 4 files changed, 126 insertions(+) create mode 100644 java-collections-maps/src/main/java/com/baeldung/convert/MapToString.java create mode 100644 java-collections-maps/src/main/java/com/baeldung/convert/StringToMap.java create mode 100644 java-collections-maps/src/test/java/com/baeldung/convert/MapToStringUnitTest.java create mode 100644 java-collections-maps/src/test/java/com/baeldung/convert/StringToMapUnitTest.java diff --git a/java-collections-maps/src/main/java/com/baeldung/convert/MapToString.java b/java-collections-maps/src/main/java/com/baeldung/convert/MapToString.java new file mode 100644 index 0000000000..aca0d05ef1 --- /dev/null +++ b/java-collections-maps/src/main/java/com/baeldung/convert/MapToString.java @@ -0,0 +1,34 @@ +package com.baeldung.convert; + +import com.google.common.base.Joiner; +import org.apache.commons.lang3.StringUtils; + +import java.util.Map; +import java.util.stream.Collectors; + +public class MapToString { + + public static String convertWithIteration(Map map) { + StringBuilder mapAsString = new StringBuilder("{"); + for (Integer key : map.keySet()) { + mapAsString.append(key + "=" + map.get(key) + ", "); + } + mapAsString.delete(mapAsString.length()-2, mapAsString.length()).append("}"); + return mapAsString.toString(); + } + + public static String convertWithStream(Map map) { + String mapAsString = map.keySet().stream() + .map(key -> key + "=" + map.get(key)) + .collect(Collectors.joining(", ", "{", "}")); + return mapAsString; + } + + public static String convertWithGuava(Map map) { + return Joiner.on(",").withKeyValueSeparator("=").join(map); + } + + public static String convertWithApache(Map map) { + return StringUtils.join(map); + } +} diff --git a/java-collections-maps/src/main/java/com/baeldung/convert/StringToMap.java b/java-collections-maps/src/main/java/com/baeldung/convert/StringToMap.java new file mode 100644 index 0000000000..caabca4a09 --- /dev/null +++ b/java-collections-maps/src/main/java/com/baeldung/convert/StringToMap.java @@ -0,0 +1,21 @@ +package com.baeldung.convert; + +import com.google.common.base.Splitter; + +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +public class StringToMap { + + public static Map convertWithStream(String mapAsString) { + Map map = Arrays.stream(mapAsString.split(",")) + .map(entry -> entry.split("=")) + .collect(Collectors.toMap(entry -> entry[0], entry -> entry[1])); + return map; + } + + public static Map convertWithGuava(String mapAsString) { + return Splitter.on(',').withKeyValueSeparator('=').split(mapAsString); + } +} diff --git a/java-collections-maps/src/test/java/com/baeldung/convert/MapToStringUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/convert/MapToStringUnitTest.java new file mode 100644 index 0000000000..d9923e74a0 --- /dev/null +++ b/java-collections-maps/src/test/java/com/baeldung/convert/MapToStringUnitTest.java @@ -0,0 +1,48 @@ +package com.baeldung.convert; + +import org.apache.commons.collections4.MapUtils; +import org.junit.Assert; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.Map; + +public class MapToStringUnitTest { + + private Map wordsByKey = new HashMap<>(); + + @BeforeEach + public void setup() { + wordsByKey.clear(); + wordsByKey.put(1, "one"); + wordsByKey.put(2, "two"); + wordsByKey.put(3, "three"); + wordsByKey.put(4, "four"); + } + + @Test + public void givenMap_WhenUsingIteration_ThenResultingMapIsCorrect() { + String mapAsString = MapToString.convertWithIteration(wordsByKey); + Assert.assertEquals("{1=one, 2=two, 3=three, 4=four}", mapAsString); + } + + @Test + public void givenMap_WhenUsingStream_ThenResultingMapIsCorrect() { + String mapAsString = MapToString.convertWithStream(wordsByKey); + Assert.assertEquals("{1=one, 2=two, 3=three, 4=four}", mapAsString); + } + + @Test + public void givenMap_WhenUsingGuava_ThenResultingMapIsCorrect() { + String mapAsString = MapToString.convertWithGuava(wordsByKey); + Assert.assertEquals("1=one,2=two,3=three,4=four", mapAsString); + } + + @Test + public void givenMap_WhenUsingApache_ThenResultingMapIsCorrect() { + String mapAsString = MapToString.convertWithApache(wordsByKey); + Assert.assertEquals("{1=one, 2=two, 3=three, 4=four}", mapAsString); + MapUtils.debugPrint(System.out, "Map as String", wordsByKey); + } +} \ No newline at end of file diff --git a/java-collections-maps/src/test/java/com/baeldung/convert/StringToMapUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/convert/StringToMapUnitTest.java new file mode 100644 index 0000000000..8fb906efd0 --- /dev/null +++ b/java-collections-maps/src/test/java/com/baeldung/convert/StringToMapUnitTest.java @@ -0,0 +1,23 @@ +package com.baeldung.convert; + +import org.junit.Assert; +import org.junit.jupiter.api.Test; + +import java.util.Map; + +public class StringToMapUnitTest { + + @Test + public void givenString_WhenUsingStream_ThenResultingStringIsCorrect() { + Map wordsByKey = StringToMap.convertWithStream("1=one,2=two,3=three,4=four"); + Assert.assertEquals(4, wordsByKey.size()); + Assert.assertEquals("one", wordsByKey.get("1")); + } + + @Test + void givenString_WhenUsingGuava_ThenResultingStringIsCorrect() { + Map wordsByKey = StringToMap.convertWithGuava("1=one,2=two,3=three,4=four"); + Assert.assertEquals(4, wordsByKey.size()); + Assert.assertEquals("one", wordsByKey.get("1")); + } +} \ No newline at end of file From c65180c74f75f2cbb0d21b787d12b9098865a703 Mon Sep 17 00:00:00 2001 From: Emily Cheyne Date: Thu, 10 Jan 2019 15:05:00 -0700 Subject: [PATCH 347/359] BAEL-2535 Remove CustomerReflectionToStringUnitTest --- .../CustomerReflectionToStringUnitTest.java | 32 ------------------- 1 file changed, 32 deletions(-) delete mode 100644 java-strings/src/test/java/com/baeldung/string/tostring/CustomerReflectionToStringUnitTest.java diff --git a/java-strings/src/test/java/com/baeldung/string/tostring/CustomerReflectionToStringUnitTest.java b/java-strings/src/test/java/com/baeldung/string/tostring/CustomerReflectionToStringUnitTest.java deleted file mode 100644 index 77dcab52e6..0000000000 --- a/java-strings/src/test/java/com/baeldung/string/tostring/CustomerReflectionToStringUnitTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.string.tostring; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.util.ArrayList; -import java.util.List; - -import org.junit.jupiter.api.Test; - -public class CustomerReflectionToStringUnitTest { - private static final String CUSTOMER_REFLECTION_TO_STRING = "com.baeldung.string.tostring.CustomerReflectionToString"; - - @Test - public void givenWrapperCollectionStrBuffer_whenReflectionToString_thenCustomerDetails() { - CustomerReflectionToString customer = new CustomerReflectionToString(); - customer.setFirstName("Rajesh"); - customer.setLastName("Bhojwani"); - customer.setScore(8); - - List orders = new ArrayList(); - orders.add("Book"); - orders.add("Pen"); - customer.setOrders(orders); - - StringBuffer fullname = new StringBuffer(); - fullname.append(customer.getLastName()+", "+ customer.getFirstName()); - customer.setFullname(fullname); - - assertTrue(customer.toString().contains(CUSTOMER_REFLECTION_TO_STRING)); - } - -} From c5415eecac1322a79f30e6ecf9bcd946d231233d Mon Sep 17 00:00:00 2001 From: "Erick Audet M.Sc" Date: Thu, 10 Jan 2019 17:16:53 -0500 Subject: [PATCH 348/359] BAEL-2059 * New section in InputStream to byte array article and recreating branch. * Minor typo * Code reformat using intellij formatter. * Code reformat using intellij formatter. * guava implementation to be completed * guava implementation * Added assert to guava test * Fix formatting --- .../io/InputStreamToByteBufferUnitTest.java | 60 ++++++++++++++++++ .../resources/frontenac-2257154_960_720.jpg | Bin 0 -> 194684 bytes parent-java/pom.xml | 4 +- 3 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 core-java-io/src/test/java/org/baeldung/java/io/InputStreamToByteBufferUnitTest.java create mode 100644 core-java-io/src/test/resources/frontenac-2257154_960_720.jpg diff --git a/core-java-io/src/test/java/org/baeldung/java/io/InputStreamToByteBufferUnitTest.java b/core-java-io/src/test/java/org/baeldung/java/io/InputStreamToByteBufferUnitTest.java new file mode 100644 index 0000000000..fedadde04b --- /dev/null +++ b/core-java-io/src/test/java/org/baeldung/java/io/InputStreamToByteBufferUnitTest.java @@ -0,0 +1,60 @@ +package org.baeldung.java.io; + + +import com.google.common.io.ByteStreams; +import org.apache.commons.io.IOUtils; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.ReadableByteChannel; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class InputStreamToByteBufferUnitTest { + + @Test + public void givenUsingCoreClasses_whenWritingAFileIntoAByteBuffer_thenBytesLengthMustMatch() throws IOException { + File inputFile = getFile(); + ByteBuffer bufferByte = ByteBuffer.allocate((int) inputFile.length()); + FileInputStream in = new FileInputStream(inputFile); + in.getChannel().read(bufferByte); + + assertEquals(bufferByte.position(), inputFile.length()); + } + + @Test + public void givenUsingCommonsIo_whenWritingAFileIntoAByteBuffer_thenBytesLengthMustMatch() throws IOException { + File inputFile = getFile(); + ByteBuffer bufferByte = ByteBuffer.allocateDirect((int) inputFile.length()); + ReadableByteChannel readableByteChannel = new FileInputStream(inputFile).getChannel(); + IOUtils.readFully(readableByteChannel, bufferByte); + + assertEquals(bufferByte.position(), inputFile.length()); + } + + @Test + public void givenUsingGuava_whenWritingAFileIntoAByteBuffer_thenBytesLengthMustMatch() throws IOException { + File inputFile = getFile(); + FileInputStream in = new FileInputStream(inputFile); + byte[] targetArray = ByteStreams.toByteArray(in); + ByteBuffer bufferByte = ByteBuffer.wrap(targetArray); + bufferByte.rewind(); + while (bufferByte.hasRemaining()) { + bufferByte.get(); + } + + assertEquals(bufferByte.position(), inputFile.length()); + } + + private File getFile() { + ClassLoader classLoader = new InputStreamToByteBufferUnitTest().getClass().getClassLoader(); + + String fileName = "frontenac-2257154_960_720.jpg"; + + return new File(classLoader.getResource(fileName).getFile()); + } + +} diff --git a/core-java-io/src/test/resources/frontenac-2257154_960_720.jpg b/core-java-io/src/test/resources/frontenac-2257154_960_720.jpg new file mode 100644 index 0000000000000000000000000000000000000000..77c459b0e39604cbac6d0bd59e6ef3fceb22061b GIT binary patch literal 194684 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 - 22.0 + 23.0 - \ No newline at end of file + From c4edb95d4ef6733a1e520249861950743c0fa54c Mon Sep 17 00:00:00 2001 From: Olaniyi Anjola Date: Thu, 10 Jan 2019 18:51:30 -0500 Subject: [PATCH 349/359] BAEL-2452: Using curl from Java (#6113) * Renamed from Unit Test to Live Test * Update JavaCurlExamplesLiveTest.java --- ...est.java => JavaCurlExamplesLiveTest.java} | 29 ++++++++----------- 1 file changed, 12 insertions(+), 17 deletions(-) rename core-java/src/test/java/com/baeldung/curltojava/{JavaCurlExamplesUnitTest.java => JavaCurlExamplesLiveTest.java} (56%) diff --git a/core-java/src/test/java/com/baeldung/curltojava/JavaCurlExamplesUnitTest.java b/core-java/src/test/java/com/baeldung/curltojava/JavaCurlExamplesLiveTest.java similarity index 56% rename from core-java/src/test/java/com/baeldung/curltojava/JavaCurlExamplesUnitTest.java rename to core-java/src/test/java/com/baeldung/curltojava/JavaCurlExamplesLiveTest.java index 4e82059f2b..2ec62cbbf9 100644 --- a/core-java/src/test/java/com/baeldung/curltojava/JavaCurlExamplesUnitTest.java +++ b/core-java/src/test/java/com/baeldung/curltojava/JavaCurlExamplesLiveTest.java @@ -3,19 +3,16 @@ package com.baeldung.curltojava; import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.URL; import org.junit.Assert; import org.junit.Test; -public class JavaCurlExamplesUnitTest { - +public class JavaCurlExamplesLiveTest { @Test public void givenCommand_whenCalled_thenProduceZeroExitCode() throws IOException { - String command = "curl --location --request GET \"https://postman-echo.com/get?foo1=bar1&foo2=bar2\""; - ProcessBuilder processBuilder = new ProcessBuilder(command.replaceAll("\"", "").split(" ")); + String command = "curl -X GET https://postman-echo.com/get?foo1=bar1&foo2=bar2"; + ProcessBuilder processBuilder = new ProcessBuilder(command.split(" ")); processBuilder.directory(new File("/home/")); Process process = processBuilder.start(); InputStream inputStream = process.getInputStream(); @@ -28,8 +25,8 @@ public class JavaCurlExamplesUnitTest { @Test public void givenNewCommands_whenCalled_thenCheckIfIsAlive() throws IOException { - String command = "curl --location --request GET \"https://postman-echo.com/get?foo1=bar1&foo2=bar2\""; - ProcessBuilder processBuilder = new ProcessBuilder(command.replaceAll("\"", "").split(" ")); + String command = "curl -X GET https://postman-echo.com/get?foo1=bar1&foo2=bar2"; + ProcessBuilder processBuilder = new ProcessBuilder(command.split(" ")); processBuilder.directory(new File("/home/")); Process process = processBuilder.start(); @@ -40,16 +37,14 @@ public class JavaCurlExamplesUnitTest { } @Test - public void whenRequestGet_thenReturnSuccessResponseCode() throws IOException { - String url = "https://postman-echo.com/get?foo1=bar1&foo2=bar2"; - URL urlObj = new URL(url); - HttpURLConnection connection = (HttpURLConnection) urlObj.openConnection(); - connection.setDoOutput(true); - connection.setInstanceFollowRedirects(false); - connection.setRequestMethod("GET"); - connection.connect(); + public void whenRequestPost_thenCheckIfReturnContent() throws IOException { + String command = "curl -X POST https://postman-echo.com/post --data foo1=bar1&foo2=bar2"; + Process process = Runtime.getRuntime().exec(command); - Assert.assertEquals(HttpURLConnection.HTTP_OK, connection.getResponseCode()); + // Get the POST result + String content = JavaCurlExamples.inputStreamToString(process.getInputStream()); + + Assert.assertTrue(null != content && !content.isEmpty()); } } From 36e48924468b9030ec382bf537084635785fc5e1 Mon Sep 17 00:00:00 2001 From: Upendra Chintala Date: Fri, 11 Jan 2019 18:13:27 +0530 Subject: [PATCH 350/359] Check if a year/date is a leap year in Java (#6086) * Hexagonal architecture implementation in Java - upendra.chintala@gmail.com * An example program to find a leap year using java 8 java.time.Year API * Changed to add assertions * Remvoed evaluation article code * Added unit test suite for leap year testing using java.time.Year and java.util.GregorianCalendar * Update LeapYearUnitTest.java * Update LeapYearUnitTest.java --- .../baeldung/leapyear/LeapYearUnitTest.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 core-java/src/test/java/com/baeldung/leapyear/LeapYearUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/leapyear/LeapYearUnitTest.java b/core-java/src/test/java/com/baeldung/leapyear/LeapYearUnitTest.java new file mode 100644 index 0000000000..9fb3d03838 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/leapyear/LeapYearUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.leapyear; + +import java.time.Year; +import java.util.GregorianCalendar; + +import org.junit.Assert; +import org.junit.Test; + +public class LeapYearUnitTest { + + //Before Java8 + @Test + public void testLeapYearUsingGregorianCalendar () { + Assert.assertFalse(new GregorianCalendar().isLeapYear(2018)); + } + + //Java 8 and above + @Test + public void testLeapYearUsingJavaTimeYear () { + Assert.assertTrue(Year.isLeap(2012)); + } + + @Test + public void testBCYearUsingJavaTimeYear () { + Assert.assertTrue(Year.isLeap(-4)); + } + + @Test + public void testWrongLeapYearUsingJavaTimeYear () { + Assert.assertFalse(Year.isLeap(2018)); + } + + @Test + public void testLeapYearInDateUsingJavaTimeYear () { + LocalDate date = LocalDate.parse("2020-01-05", DateTimeFormatter.ISO_LOCAL_DATE); + Assert.assertTrue(Year.from(date).isLeap()); + } + +} From 583969b59d09e3a975e3da06823270a217103e41 Mon Sep 17 00:00:00 2001 From: Amy DeGregorio Date: Fri, 11 Jan 2019 13:28:10 -0500 Subject: [PATCH 351/359] BAEL-2499 Write to CSV in Java - Updated PR (#6122) * example code for Article How to Write to a CSV File in Java * Updated to use a Stream --- .../com/baeldung/csv/WriteCsvFileExample.java | 7 ++----- .../csv/WriteCsvFileExampleUnitTest.java | 20 +++++++------------ 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/core-java-io/src/main/java/com/baeldung/csv/WriteCsvFileExample.java b/core-java-io/src/main/java/com/baeldung/csv/WriteCsvFileExample.java index fd3678d2c5..e1237481b1 100644 --- a/core-java-io/src/main/java/com/baeldung/csv/WriteCsvFileExample.java +++ b/core-java-io/src/main/java/com/baeldung/csv/WriteCsvFileExample.java @@ -1,11 +1,8 @@ package com.baeldung.csv; -import java.io.BufferedWriter; -import java.io.IOException; - public class WriteCsvFileExample { - public void writeLine(BufferedWriter writer, String[] data) throws IOException { + public String convertToCSV(String[] data) { StringBuilder csvLine = new StringBuilder(); for (int i = 0; i < data.length; i++) { @@ -15,7 +12,7 @@ public class WriteCsvFileExample { csvLine.append(escapeSpecialCharacters(data[i])); } - writer.write(csvLine.toString()); + return csvLine.toString(); } public String escapeSpecialCharacters(String data) { diff --git a/core-java-io/src/test/java/com/baeldung/csv/WriteCsvFileExampleUnitTest.java b/core-java-io/src/test/java/com/baeldung/csv/WriteCsvFileExampleUnitTest.java index 4ac84f939d..e30ec0818c 100644 --- a/core-java-io/src/test/java/com/baeldung/csv/WriteCsvFileExampleUnitTest.java +++ b/core-java-io/src/test/java/com/baeldung/csv/WriteCsvFileExampleUnitTest.java @@ -3,12 +3,10 @@ package com.baeldung.csv; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import java.io.BufferedWriter; import java.io.File; -import java.io.FileWriter; -import java.io.IOException; +import java.io.FileNotFoundException; +import java.io.PrintWriter; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import org.junit.Before; @@ -73,15 +71,11 @@ public class WriteCsvFileExampleUnitTest { dataLines.add(new String[] { "Jane", "Doe, Jr.", "19", "She said \"I'm being quoted\"" }); File csvOutputFile = new File(CSV_FILE_NAME); - try (BufferedWriter writer = new BufferedWriter(new FileWriter(csvOutputFile))) { - for (Iterator dataIterator = dataLines.iterator(); dataIterator.hasNext();) { - csvExample.writeLine(writer, dataIterator.next()); - if (dataIterator.hasNext()) { - writer.newLine(); - } - } - writer.flush(); - } catch (IOException e) { + try (PrintWriter pw = new PrintWriter(csvOutputFile)) { + dataLines.stream() + .map(csvExample::convertToCSV) + .forEach(pw::println); + } catch (FileNotFoundException e) { LOG.error("IOException " + e.getMessage()); } From 4b47306e913180c1c4da86f6f507a3d1724b28f5 Mon Sep 17 00:00:00 2001 From: Emily Cheyne Date: Fri, 11 Jan 2019 12:48:28 -0700 Subject: [PATCH 352/359] BAEL-2535 --- java-strings/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/java-strings/README.md b/java-strings/README.md index 08fbec35ab..b72a378d06 100644 --- a/java-strings/README.md +++ b/java-strings/README.md @@ -49,3 +49,4 @@ - [Add a Character to a String at a Given Position](https://www.baeldung.com/java-add-character-to-string) - [Remove Leading and Trailing Characters from a String](https://www.baeldung.com/java-remove-trailing-characters) - [Concatenating Strings In Java](https://www.baeldung.com/java-strings-concatenation) +- [Java toString() Method](https://www.baeldung.com/java-tostring) From 2cb4faddb0edf2f05edb8d2cc77560e6205396fc Mon Sep 17 00:00:00 2001 From: Loredana Date: Fri, 11 Jan 2019 23:03:38 +0200 Subject: [PATCH 353/359] fix core-java test and back to build --- core-java/pom.xml | 1 + .../src/test/java/com/baeldung/leapyear/LeapYearUnitTest.java | 2 ++ pom.xml | 4 ++-- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/core-java/pom.xml b/core-java/pom.xml index 6c58653d5a..d21c624997 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -13,6 +13,7 @@ ../parent-java + commons-io diff --git a/core-java/src/test/java/com/baeldung/leapyear/LeapYearUnitTest.java b/core-java/src/test/java/com/baeldung/leapyear/LeapYearUnitTest.java index 9fb3d03838..e710eecc66 100644 --- a/core-java/src/test/java/com/baeldung/leapyear/LeapYearUnitTest.java +++ b/core-java/src/test/java/com/baeldung/leapyear/LeapYearUnitTest.java @@ -1,6 +1,8 @@ package com.baeldung.leapyear; +import java.time.LocalDate; import java.time.Year; +import java.time.format.DateTimeFormatter; import java.util.GregorianCalendar; import org.junit.Assert; diff --git a/pom.xml b/pom.xml index a9b4b3f119..1c0738cafb 100644 --- a/pom.xml +++ b/pom.xml @@ -391,6 +391,7 @@ core-java-networking core-java-perf core-java-sun + core-java core-scala couchbase custom-pmd @@ -996,8 +997,7 @@ parent-spring-5 parent-java parent-kotlin - - core-java + core-java-concurrency-advanced core-kotlin From 469e36f07a93156664dd05dfb7efee58a7689c6b Mon Sep 17 00:00:00 2001 From: Juan Moreno Date: Sat, 12 Jan 2019 15:59:25 -0300 Subject: [PATCH 354/359] BAEL-2444 Extra examples (#6087) --- .../com/baeldung/time/InstantUnitTest.java | 42 +++++++++++++++++ .../time/InstantWithJMockUnitTest.java | 47 +++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 core-java-8/src/test/java/com/baeldung/time/InstantUnitTest.java create mode 100644 core-java-8/src/test/java/com/baeldung/time/InstantWithJMockUnitTest.java diff --git a/core-java-8/src/test/java/com/baeldung/time/InstantUnitTest.java b/core-java-8/src/test/java/com/baeldung/time/InstantUnitTest.java new file mode 100644 index 0000000000..8400748710 --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/time/InstantUnitTest.java @@ -0,0 +1,42 @@ +package com.baeldung.time; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.time.Clock; +import java.time.Instant; +import java.time.ZoneId; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; +import static org.powermock.api.mockito.PowerMockito.mockStatic; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({ Instant.class }) +public class InstantUnitTest { + + @Test + public void givenInstantMock_whenNow_thenGetFixedInstant() { + String instantExpected = "2014-12-22T10:15:30Z"; + Clock clock = Clock.fixed(Instant.parse(instantExpected), ZoneId.of("UTC")); + Instant instant = Instant.now(clock); + mockStatic(Instant.class); + when(Instant.now()).thenReturn(instant); + + Instant now = Instant.now(); + + assertThat(now.toString()).isEqualTo(instantExpected); + } + + @Test + public void givenFixedClock_whenNow_thenGetFixedInstant() { + String instantExpected = "2014-12-22T10:15:30Z"; + Clock clock = Clock.fixed(Instant.parse(instantExpected), ZoneId.of("UTC")); + + Instant instant = Instant.now(clock); + + assertThat(instant.toString()).isEqualTo(instantExpected); + } +} diff --git a/core-java-8/src/test/java/com/baeldung/time/InstantWithJMockUnitTest.java b/core-java-8/src/test/java/com/baeldung/time/InstantWithJMockUnitTest.java new file mode 100644 index 0000000000..8f83b91101 --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/time/InstantWithJMockUnitTest.java @@ -0,0 +1,47 @@ +package com.baeldung.time; + +import mockit.Expectations; +import mockit.Mock; +import mockit.MockUp; +import org.junit.jupiter.api.Test; + +import java.time.Clock; +import java.time.Instant; +import java.time.ZoneId; + +import static org.assertj.core.api.Assertions.assertThat; + +public class InstantWithJMockUnitTest { + + @Test + public void givenInstantWithJMock_whenNow_thenGetFixedInstant() { + String instantExpected = "2014-12-21T10:15:30Z"; + Clock clock = Clock.fixed(Instant.parse(instantExpected), ZoneId.of("UTC")); + new MockUp() { + @Mock + public Instant now() { + return Instant.now(clock); + } + }; + + Instant now = Instant.now(); + + assertThat(now.toString()).isEqualTo(instantExpected); + } + + @Test + public void givenInstantWithExpectations_whenNow_thenGetFixedInstant() { + Clock clock = Clock.fixed(Instant.parse("2014-12-23T10:15:30.00Z"), ZoneId.of("UTC")); + Instant instantExpected = Instant.now(clock); + new Expectations(Instant.class) { + { + Instant.now(); + result = instantExpected; + } + }; + + Instant now = Instant.now(); + + assertThat(now).isEqualTo(instantExpected); + } +} From b395dc1d418f5077ffe76c17d7d59fda9328c2ac Mon Sep 17 00:00:00 2001 From: Ger Roza Date: Sat, 12 Jan 2019 18:57:19 -0200 Subject: [PATCH 355/359] Now using Auth and Resource servers from Baeldung/spring-security-oauth (#6128) --- .../OauthClientApplication.java | 4 +-- .../web/ClientRestController.java | 2 +- ....java => OauthClientLoginApplication.java} | 8 ++--- .../web/ClientRestController.java | 2 +- .../ClientCredentialsOauthApplication.java | 4 +-- .../service/WebClientChonJob.java | 6 ++-- .../ManualRequestApplication.java | 5 ++-- .../web/ManualOauthRequestController.java | 20 ++++++++----- ...nt-auth-code-client-application.properties | 8 ++--- ...ent-auth-code-login-application.properties | 12 ++++---- ...t-credentials-oauth-application.properties | 6 ++-- ...anual-request-oauth-application.properties | 3 ++ .../OAuth2ClientCredentialsLiveTest.java | 6 ++-- .../OAuth2ManualRequestLiveTest.java | 5 ++-- .../AuthorizationServerApplication.java | 17 ----------- .../configuration/WebSecurityConfig.java | 26 ----------------- .../ResourceServerApplication.java | 17 ----------- .../configuration/AuthorizationConfigs.java | 29 ------------------- .../web/ResourceRestController.java | 23 --------------- ...lient-authorization-application.properties | 13 --------- ...webclient-resources-application.properties | 6 ---- 21 files changed, 48 insertions(+), 174 deletions(-) rename spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/{OauthClientApplication.java => OauthClientLoginApplication.java} (62%) create mode 100644 spring-5-reactive-oauth/src/main/resources/webclient-manual-request-oauth-application.properties delete mode 100644 spring-5-security-oauth/src/main/java/com/baeldung/webclient/authorizationserver/AuthorizationServerApplication.java delete mode 100644 spring-5-security-oauth/src/main/java/com/baeldung/webclient/authorizationserver/configuration/WebSecurityConfig.java delete mode 100644 spring-5-security-oauth/src/main/java/com/baeldung/webclient/resourceserver/ResourceServerApplication.java delete mode 100644 spring-5-security-oauth/src/main/java/com/baeldung/webclient/resourceserver/configuration/AuthorizationConfigs.java delete mode 100644 spring-5-security-oauth/src/main/java/com/baeldung/webclient/resourceserver/web/ResourceRestController.java delete mode 100644 spring-5-security-oauth/src/main/resources/webclient-authorization-application.properties delete mode 100644 spring-5-security-oauth/src/main/resources/webclient-resources-application.properties diff --git a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/OauthClientApplication.java b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/OauthClientApplication.java index 7bae78bb14..843d3f251f 100644 --- a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/OauthClientApplication.java +++ b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/OauthClientApplication.java @@ -6,9 +6,9 @@ import org.springframework.context.annotation.PropertySource; /** * - * Note: This app is configured to use the authorization service and the resource service located in module spring-5-security-oauth + * Note: This app is configured to use the authorization service and the resource service located in Baeldung/spring-security-oauth repo * - * As we usually do with other well-known auth providers (github/facebook/...) we have to log-in using user credentials (bael-user/bael-password) and client configurations (bael-client-id/bael-secret) handled by the auth server + * As we usually do with other well-known auth providers (github/facebook/...) we have to log-in using user credentials (john/123) and client configurations handled by the auth server * * @author rozagerardo * diff --git a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/web/ClientRestController.java b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/web/ClientRestController.java index c36b7d1dea..9994a1255a 100644 --- a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/web/ClientRestController.java +++ b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodeclient/web/ClientRestController.java @@ -15,7 +15,7 @@ import reactor.core.publisher.Mono; @RestController public class ClientRestController { - private static final String RESOURCE_URI = "http://localhost:8084/retrieve-resource"; + private static final String RESOURCE_URI = "http://localhost:8082/spring-security-oauth-resource/foos/1"; @Autowired WebClient webClient; diff --git a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/OauthClientApplication.java b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/OauthClientLoginApplication.java similarity index 62% rename from spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/OauthClientApplication.java rename to spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/OauthClientLoginApplication.java index 9dd6dd1bde..e71e549ea4 100644 --- a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/OauthClientApplication.java +++ b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/OauthClientLoginApplication.java @@ -6,19 +6,19 @@ import org.springframework.context.annotation.PropertySource; /** * - * Note: This app is configured to use the authorization service and the resource service located in module spring-5-security-oauth + * Note: This app is configured to use the authorization service and the resource service located in Baeldung/spring-security-oauth repo * - * As we usually do with other well-known auth providers (github/facebook/...) we have to log-in using user credentials (bael-user/bael-password) and client configurations (bael-client-id/bael-secret) handled by the auth server + * As we usually do with other well-known auth providers (github/facebook/...) we have to log-in using user credentials (john/123) and client configurations handled by the auth server * * @author rozagerardo * */ @PropertySource("classpath:webclient-auth-code-login-application.properties") @SpringBootApplication -public class OauthClientApplication { +public class OauthClientLoginApplication { public static void main(String[] args) { - SpringApplication.run(OauthClientApplication.class, args); + SpringApplication.run(OauthClientLoginApplication.class, args); } } diff --git a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/web/ClientRestController.java b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/web/ClientRestController.java index 55e0096525..24e5377f36 100644 --- a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/web/ClientRestController.java +++ b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/authorizationcodelogin/web/ClientRestController.java @@ -16,7 +16,7 @@ import reactor.core.publisher.Mono; @RestController public class ClientRestController { - private static final String RESOURCE_URI = "http://localhost:8084/retrieve-resource"; + private static final String RESOURCE_URI = "http://localhost:8082/spring-security-oauth-resource/foos/1"; @Autowired WebClient webClient; diff --git a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/clientcredentials/ClientCredentialsOauthApplication.java b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/clientcredentials/ClientCredentialsOauthApplication.java index d1b9f7f744..4356581819 100644 --- a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/clientcredentials/ClientCredentialsOauthApplication.java +++ b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/clientcredentials/ClientCredentialsOauthApplication.java @@ -7,9 +7,7 @@ import org.springframework.scheduling.annotation.EnableScheduling; /** * - * Note: This app is configured to use the authorization service and the resource service located in module spring-5-security-oauth - * - * As we usually do with other well-known auth providers (github/facebook/...) we have to log-in using credentials handled by the auth server (bael-user/bael-password) + * Note: This app is configured to use the authorization service and the resource service located in Baeldung/spring-security-oauth repo * * @author rozagerardo * diff --git a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/clientcredentials/service/WebClientChonJob.java b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/clientcredentials/service/WebClientChonJob.java index dc38ce3f9e..ef39222933 100644 --- a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/clientcredentials/service/WebClientChonJob.java +++ b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/clientcredentials/service/WebClientChonJob.java @@ -4,8 +4,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.security.oauth2.client.OAuth2AuthorizedClient; -import org.springframework.security.oauth2.client.annotation.RegisteredOAuth2AuthorizedClient; import org.springframework.stereotype.Component; import org.springframework.web.reactive.function.client.WebClient; @@ -14,12 +12,12 @@ public class WebClientChonJob { Logger logger = LoggerFactory.getLogger(WebClientChonJob.class); - private static final String RESOURCE_URI = "http://localhost:8084/retrieve-resource"; + private static final String RESOURCE_URI = "localhost:8082/spring-security-oauth-resource/foos/1"; @Autowired private WebClient webClient; - @Scheduled(fixedRate = 1000) + @Scheduled(fixedRate = 5000) public void logResourceServiceResponse() { webClient.get() diff --git a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/ManualRequestApplication.java b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/ManualRequestApplication.java index c2762ad559..59a63355f7 100644 --- a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/ManualRequestApplication.java +++ b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/ManualRequestApplication.java @@ -6,13 +6,12 @@ import org.springframework.context.annotation.PropertySource; /** * - * Note: This app is configured to use the authorization service and the resource service located in module spring-5-security-oauth - * - * As we usually do with other well-known auth providers (github/facebook/...) we have to log-in using user credentials (bael-user/bael-password) and client configurations (bael-client-id/bael-secret) handled by the auth server + * Note: This app is configured to use the authorization service and the resource service located in Baeldung/spring-security-oauth repo * * @author rozagerardo * */ +@PropertySource("classpath:webclient-manual-request-oauth-application.properties") @SpringBootApplication public class ManualRequestApplication { diff --git a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/web/ManualOauthRequestController.java b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/web/ManualOauthRequestController.java index 9f9d6d3167..d54d811032 100644 --- a/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/web/ManualOauthRequestController.java +++ b/spring-5-reactive-oauth/src/main/java/com/baeldung/webclient/manualrequest/web/ManualOauthRequestController.java @@ -3,8 +3,8 @@ package com.baeldung.webclient.manualrequest.web; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; import org.springframework.util.Base64Utils; import org.springframework.web.bind.annotation.GetMapping; @@ -22,10 +22,16 @@ public class ManualOauthRequestController { private static Logger logger = LoggerFactory.getLogger(ManualOauthRequestController.class); - private static final String TOKEN_ENDPOINT = "localhost:8085/oauth/token"; - private static final String RESOURCE_ENDPOINT = "localhost:8084/retrieve-resource"; - private static final String CLIENT_ID = "bael-client-id"; - private static final String CLIENT_SECRET = "bael-secret"; + private static final String RESOURCE_ENDPOINT = "localhost:8082/spring-security-oauth-resource/foos/1"; + + @Value("${the.authorization.client-id}") + private String clientId; + + @Value("${the.authorization.client-secret}") + private String clientSecret; + + @Value("${the.authorization.token-uri}") + private String tokenUri; @Autowired WebClient client; @@ -34,8 +40,8 @@ public class ManualOauthRequestController { public Mono obtainSecuredResource() { logger.info("Creating web client..."); Mono resource = client.post() - .uri(TOKEN_ENDPOINT) - .header(HttpHeaders.AUTHORIZATION, "Basic " + Base64Utils.encodeToString((CLIENT_ID + ":" + CLIENT_SECRET).getBytes())) + .uri(tokenUri) + .header(HttpHeaders.AUTHORIZATION, "Basic " + Base64Utils.encodeToString((clientId + ":" + clientSecret).getBytes())) .body(BodyInserters.fromFormData(OAuth2ParameterNames.GRANT_TYPE, GrantType.CLIENT_CREDENTIALS.getValue())) .retrieve() .bodyToMono(JsonNode.class) diff --git a/spring-5-reactive-oauth/src/main/resources/webclient-auth-code-client-application.properties b/spring-5-reactive-oauth/src/main/resources/webclient-auth-code-client-application.properties index 612777a06d..ac96aae6d6 100644 --- a/spring-5-reactive-oauth/src/main/resources/webclient-auth-code-client-application.properties +++ b/spring-5-reactive-oauth/src/main/resources/webclient-auth-code-client-application.properties @@ -1,10 +1,10 @@ spring.security.oauth2.client.registration.bael.client-name=bael -spring.security.oauth2.client.registration.bael.client-id=bael-client-id -spring.security.oauth2.client.registration.bael.client-secret=bael-secret +spring.security.oauth2.client.registration.bael.client-id=fooClientIdPassword +spring.security.oauth2.client.registration.bael.client-secret=secret spring.security.oauth2.client.registration.bael.authorization-grant-type=authorization_code spring.security.oauth2.client.registration.bael.redirect-uri=http://localhost:8080/authorize/oauth2/code/bael -spring.security.oauth2.client.provider.bael.token-uri=http://localhost:8085/oauth/token -spring.security.oauth2.client.provider.bael.authorization-uri=http://localhost:8085/oauth/authorize +spring.security.oauth2.client.provider.bael.token-uri=http://localhost:8081/spring-security-oauth-server/oauth/token +spring.security.oauth2.client.provider.bael.authorization-uri=http://localhost:8081/spring-security-oauth-server/oauth/authorize spring.security.user.password=pass diff --git a/spring-5-reactive-oauth/src/main/resources/webclient-auth-code-login-application.properties b/spring-5-reactive-oauth/src/main/resources/webclient-auth-code-login-application.properties index edd5b80b13..e4dd0a532d 100644 --- a/spring-5-reactive-oauth/src/main/resources/webclient-auth-code-login-application.properties +++ b/spring-5-reactive-oauth/src/main/resources/webclient-auth-code-login-application.properties @@ -1,10 +1,10 @@ spring.security.oauth2.client.registration.bael.client-name=bael -spring.security.oauth2.client.registration.bael.client-id=bael-client-id -spring.security.oauth2.client.registration.bael.client-secret=bael-secret +spring.security.oauth2.client.registration.bael.client-id=fooClientIdPassword +spring.security.oauth2.client.registration.bael.client-secret=secret spring.security.oauth2.client.registration.bael.authorization-grant-type=authorization_code spring.security.oauth2.client.registration.bael.redirect-uri=http://localhost:8080/login/oauth2/code/bael -spring.security.oauth2.client.provider.bael.token-uri=http://localhost:8085/oauth/token -spring.security.oauth2.client.provider.bael.authorization-uri=http://localhost:8085/oauth/authorize -spring.security.oauth2.client.provider.bael.user-info-uri=http://localhost:8084/user -spring.security.oauth2.client.provider.bael.user-name-attribute=name +spring.security.oauth2.client.provider.bael.token-uri=http://localhost:8081/spring-security-oauth-server/oauth/token +spring.security.oauth2.client.provider.bael.authorization-uri=http://localhost:8081/spring-security-oauth-server/oauth/authorize +spring.security.oauth2.client.provider.bael.user-info-uri=http://localhost:8082/spring-security-oauth-resource/users/extra +spring.security.oauth2.client.provider.bael.user-name-attribute=user_name diff --git a/spring-5-reactive-oauth/src/main/resources/webclient-client-credentials-oauth-application.properties b/spring-5-reactive-oauth/src/main/resources/webclient-client-credentials-oauth-application.properties index f82f74ec48..14c5b97605 100644 --- a/spring-5-reactive-oauth/src/main/resources/webclient-client-credentials-oauth-application.properties +++ b/spring-5-reactive-oauth/src/main/resources/webclient-client-credentials-oauth-application.properties @@ -1,4 +1,4 @@ spring.security.oauth2.client.registration.bael.authorization-grant-type=client_credentials -spring.security.oauth2.client.registration.bael.client-id=bael-client-id -spring.security.oauth2.client.registration.bael.client-secret=bael-secret -spring.security.oauth2.client.provider.bael.token-uri=http://localhost:8085/oauth/token +spring.security.oauth2.client.registration.bael.client-id=fooClientIdPassword +spring.security.oauth2.client.registration.bael.client-secret=secret +spring.security.oauth2.client.provider.bael.token-uri=http://localhost:8081/spring-security-oauth-server/oauth/token diff --git a/spring-5-reactive-oauth/src/main/resources/webclient-manual-request-oauth-application.properties b/spring-5-reactive-oauth/src/main/resources/webclient-manual-request-oauth-application.properties new file mode 100644 index 0000000000..36ec3defd1 --- /dev/null +++ b/spring-5-reactive-oauth/src/main/resources/webclient-manual-request-oauth-application.properties @@ -0,0 +1,3 @@ +the.authorization.client-id=fooClientIdPassword +the.authorization.client-secret=secret +the.authorization.token-uri=http://localhost:8081/spring-security-oauth-server/oauth/token diff --git a/spring-5-reactive-oauth/src/test/java/com/baeldung/webclient/clientcredentials/OAuth2ClientCredentialsLiveTest.java b/spring-5-reactive-oauth/src/test/java/com/baeldung/webclient/clientcredentials/OAuth2ClientCredentialsLiveTest.java index e31815c3f8..ef913ba055 100644 --- a/spring-5-reactive-oauth/src/test/java/com/baeldung/webclient/clientcredentials/OAuth2ClientCredentialsLiveTest.java +++ b/spring-5-reactive-oauth/src/test/java/com/baeldung/webclient/clientcredentials/OAuth2ClientCredentialsLiveTest.java @@ -19,9 +19,9 @@ import ch.qos.logback.classic.spi.ILoggingEvent; /** * - * Note: this Live test requires the Authorization Service and the Resource service located in the spring-5-security-oauth module + * Note: this Live test requires the Authorization Service and the Resource service located in the Baeldung/spring-security-oauth repo * - * @author ger + * @author rozagerardo * */ @RunWith(SpringRunner.class) @@ -46,7 +46,7 @@ public class OAuth2ClientCredentialsLiveTest { .stream() .map(ILoggingEvent::getFormattedMessage) .collect(Collectors.toList()); - assertThat(allLoggedEntries).anyMatch(entry -> entry.contains("We retrieved the following resource using Client Credentials Grant Type: This is the resource!")); + assertThat(allLoggedEntries).anyMatch(entry -> entry.contains("We retrieved the following resource using Client Credentials Grant Type: {\"id\"")); } } diff --git a/spring-5-reactive-oauth/src/test/java/com/baeldung/webclient/manualrequest/OAuth2ManualRequestLiveTest.java b/spring-5-reactive-oauth/src/test/java/com/baeldung/webclient/manualrequest/OAuth2ManualRequestLiveTest.java index 94aa580f0a..2381264926 100644 --- a/spring-5-reactive-oauth/src/test/java/com/baeldung/webclient/manualrequest/OAuth2ManualRequestLiveTest.java +++ b/spring-5-reactive-oauth/src/test/java/com/baeldung/webclient/manualrequest/OAuth2ManualRequestLiveTest.java @@ -1,5 +1,6 @@ package com.baeldung.webclient.manualrequest; +import org.hamcrest.Matchers; import org.junit.Before; import org.junit.Test; import org.springframework.test.web.reactive.server.WebTestClient; @@ -8,7 +9,7 @@ import org.springframework.test.web.reactive.server.WebTestClient.ResponseSpec; /** * * Note: this Live test requires not only the corresponding application running, - * but also the Authorization Service and the Resource service located in the spring-5-security-oauth module. + * but also the Authorization Service and the Resource service located in the Baeldung/spring-security-oauth repo * * * @author ger @@ -37,7 +38,7 @@ public class OAuth2ManualRequestLiveTest { response.expectStatus() .isOk() .expectBody(String.class) - .isEqualTo("Retrieved the resource using a manual approach: This is the resource!"); + .value(Matchers.containsString("Retrieved the resource using a manual approach: {\"id\"")); } } diff --git a/spring-5-security-oauth/src/main/java/com/baeldung/webclient/authorizationserver/AuthorizationServerApplication.java b/spring-5-security-oauth/src/main/java/com/baeldung/webclient/authorizationserver/AuthorizationServerApplication.java deleted file mode 100644 index d72704386c..0000000000 --- a/spring-5-security-oauth/src/main/java/com/baeldung/webclient/authorizationserver/AuthorizationServerApplication.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.webclient.authorizationserver; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.PropertySource; -import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; - -@EnableAuthorizationServer -@PropertySource("classpath:webclient-authorization-application.properties") -@SpringBootApplication -public class AuthorizationServerApplication { - - public static void main(String[] args) { - SpringApplication.run(AuthorizationServerApplication.class, args); - } - -} diff --git a/spring-5-security-oauth/src/main/java/com/baeldung/webclient/authorizationserver/configuration/WebSecurityConfig.java b/spring-5-security-oauth/src/main/java/com/baeldung/webclient/authorizationserver/configuration/WebSecurityConfig.java deleted file mode 100644 index 5dd15f1b8c..0000000000 --- a/spring-5-security-oauth/src/main/java/com/baeldung/webclient/authorizationserver/configuration/WebSecurityConfig.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.baeldung.webclient.authorizationserver.configuration; - -import org.springframework.context.annotation.Configuration; -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; - -@EnableWebSecurity -@Configuration -public class WebSecurityConfig extends WebSecurityConfigurerAdapter { - - @Override - protected void configure(HttpSecurity http) throws Exception { - http.authorizeRequests() - .antMatchers("/login", "/user") - .permitAll() - .and() - .authorizeRequests() - .anyRequest() - .authenticated() - .and() - .formLogin() - .and() - .httpBasic(); - } -} diff --git a/spring-5-security-oauth/src/main/java/com/baeldung/webclient/resourceserver/ResourceServerApplication.java b/spring-5-security-oauth/src/main/java/com/baeldung/webclient/resourceserver/ResourceServerApplication.java deleted file mode 100644 index 50ad293ef8..0000000000 --- a/spring-5-security-oauth/src/main/java/com/baeldung/webclient/resourceserver/ResourceServerApplication.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.webclient.resourceserver; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.PropertySource; -import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; - -@EnableResourceServer -@PropertySource("webclient-resources-application.properties") -@SpringBootApplication -public class ResourceServerApplication { - - public static void main(String[] args) { - SpringApplication.run(ResourceServerApplication.class, args); - } - -} diff --git a/spring-5-security-oauth/src/main/java/com/baeldung/webclient/resourceserver/configuration/AuthorizationConfigs.java b/spring-5-security-oauth/src/main/java/com/baeldung/webclient/resourceserver/configuration/AuthorizationConfigs.java deleted file mode 100644 index 5aea1983db..0000000000 --- a/spring-5-security-oauth/src/main/java/com/baeldung/webclient/resourceserver/configuration/AuthorizationConfigs.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.baeldung.webclient.resourceserver.configuration; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.oauth2.provider.token.RemoteTokenServices; -import org.springframework.security.oauth2.provider.token.ResourceServerTokenServices; - -@Configuration -public class AuthorizationConfigs { - - @Value("${oauth.authserver.client-id}") - String clientId; - - @Value("${oauth.authserver.client-secret}") - String clientSecret; - - @Value("${oauth.authserver.check-token-endpoint}") - String checkTokenEndpoint; - - @Bean - public ResourceServerTokenServices tokenSvc() { - RemoteTokenServices remoteService = new RemoteTokenServices(); - remoteService.setCheckTokenEndpointUrl(checkTokenEndpoint); - remoteService.setClientId(clientId); - remoteService.setClientSecret(clientSecret); - return remoteService; - } -} diff --git a/spring-5-security-oauth/src/main/java/com/baeldung/webclient/resourceserver/web/ResourceRestController.java b/spring-5-security-oauth/src/main/java/com/baeldung/webclient/resourceserver/web/ResourceRestController.java deleted file mode 100644 index aef0fb4d7d..0000000000 --- a/spring-5-security-oauth/src/main/java/com/baeldung/webclient/resourceserver/web/ResourceRestController.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.webclient.resourceserver.web; - -import java.security.Principal; - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class ResourceRestController { - - @GetMapping("/retrieve-resource") - public String retrieveResource() { - return "This is the resource!"; - } - - @GetMapping("/user") - @ResponseBody - public Principal user(Principal user) { - return user; - } - -} diff --git a/spring-5-security-oauth/src/main/resources/webclient-authorization-application.properties b/spring-5-security-oauth/src/main/resources/webclient-authorization-application.properties deleted file mode 100644 index 9531045359..0000000000 --- a/spring-5-security-oauth/src/main/resources/webclient-authorization-application.properties +++ /dev/null @@ -1,13 +0,0 @@ -server.port=8085 - -security.oauth2.client.client-id=bael-client-id -security.oauth2.client.client-secret=bael-secret -security.oauth2.client.scope=read,write - -security.oauth2.authorization.check-token-access=isAuthenticated() - -spring.security.user.name=bael-user -spring.security.user.password=bael-password - -security.oauth2.client.registered-redirect-uri=http://localhost:8080/login/oauth2/code/bael, http://localhost:8080/authorize/oauth2/code/bael -security.oauth2.client.use-current-uri=false \ No newline at end of file diff --git a/spring-5-security-oauth/src/main/resources/webclient-resources-application.properties b/spring-5-security-oauth/src/main/resources/webclient-resources-application.properties deleted file mode 100644 index 1cfb9ca12d..0000000000 --- a/spring-5-security-oauth/src/main/resources/webclient-resources-application.properties +++ /dev/null @@ -1,6 +0,0 @@ -server.port=8084 - -#spring.security.oauth2.resourceserver.jwt.issuer-uri=localhost:8085 -oauth.authserver.client-id=bael-client-id -oauth.authserver.client-secret=bael-secret -oauth.authserver.check-token-endpoint=http://localhost:8085/oauth/check_token From dcc1cd3850cdb3dbbfa6df343604ac4b720cd424 Mon Sep 17 00:00:00 2001 From: chandra Date: Sat, 12 Jan 2019 16:52:52 -0500 Subject: [PATCH 356/359] BAEL-2088 Common Hibernate Exceptions Commin Hibernate Exceptions unit tests --- .../hibernate/exception/EntityWithNoId.java | 16 + .../hibernate/exception/HibernateUtil.java | 63 +++ .../baeldung/hibernate/exception/Product.java | 40 ++ .../exception/HibernateExceptionUnitTest.java | 425 ++++++++++++++++++ .../resources/hibernate-exception.properties | 16 + 5 files changed, 560 insertions(+) create mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/exception/EntityWithNoId.java create mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/exception/HibernateUtil.java create mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/exception/Product.java create mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java create mode 100644 persistence-modules/hibernate5/src/test/resources/hibernate-exception.properties diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/exception/EntityWithNoId.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/exception/EntityWithNoId.java new file mode 100644 index 0000000000..989fa1281a --- /dev/null +++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/exception/EntityWithNoId.java @@ -0,0 +1,16 @@ +package com.baeldung.hibernate.exception; + +import javax.persistence.Entity; + +@Entity +public class EntityWithNoId { + private int id; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } +} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/exception/HibernateUtil.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/exception/HibernateUtil.java new file mode 100644 index 0000000000..ae5174ac9c --- /dev/null +++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/exception/HibernateUtil.java @@ -0,0 +1,63 @@ +package com.baeldung.hibernate.exception; + +import java.io.FileInputStream; +import java.io.IOException; +import java.net.URL; +import java.util.Properties; + +import org.apache.commons.lang3.StringUtils; +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.service.ServiceRegistry; + +public class HibernateUtil { + private static SessionFactory sessionFactory; + private static String PROPERTY_FILE_NAME; + + public static SessionFactory getSessionFactory() throws IOException { + return getSessionFactory(null); + } + + public static SessionFactory getSessionFactory(String propertyFileName) + throws IOException { + PROPERTY_FILE_NAME = propertyFileName; + if (sessionFactory == null) { + ServiceRegistry serviceRegistry = configureServiceRegistry(); + sessionFactory = makeSessionFactory(serviceRegistry); + } + return sessionFactory; + } + + private static SessionFactory makeSessionFactory( + ServiceRegistry serviceRegistry) { + MetadataSources metadataSources = new MetadataSources(serviceRegistry); + metadataSources.addAnnotatedClass(Product.class); + Metadata metadata = metadataSources.getMetadataBuilder() + .build(); + return metadata.getSessionFactoryBuilder() + .build(); + + } + + private static ServiceRegistry configureServiceRegistry() + throws IOException { + Properties properties = getProperties(); + return new StandardServiceRegistryBuilder().applySettings(properties) + .build(); + } + + private static Properties getProperties() throws IOException { + Properties properties = new Properties(); + URL propertiesURL = Thread.currentThread() + .getContextClassLoader() + .getResource(StringUtils.defaultString(PROPERTY_FILE_NAME, + "hibernate-exception.properties")); + try (FileInputStream inputStream = new FileInputStream( + propertiesURL.getFile())) { + properties.load(inputStream); + } + return properties; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/exception/Product.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/exception/Product.java new file mode 100644 index 0000000000..031fa38de0 --- /dev/null +++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/exception/Product.java @@ -0,0 +1,40 @@ +package com.baeldung.hibernate.exception; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class Product { + + private int id; + + private String name; + private String description; + + @Id + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + @Column(nullable=false) + 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; + } +} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java new file mode 100644 index 0000000000..3581c81daa --- /dev/null +++ b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java @@ -0,0 +1,425 @@ +package com.baeldung.hibernate.exception; + +import static org.hamcrest.CoreMatchers.isA; +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import java.util.List; + +import javax.persistence.OptimisticLockException; +import javax.persistence.PersistenceException; + +import org.hibernate.AnnotationException; +import org.hibernate.HibernateException; +import org.hibernate.MappingException; +import org.hibernate.NonUniqueObjectException; +import org.hibernate.PropertyValueException; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.StaleObjectStateException; +import org.hibernate.StaleStateException; +import org.hibernate.Transaction; +import org.hibernate.TransactionException; +import org.hibernate.cfg.AvailableSettings; +import org.hibernate.cfg.Configuration; +import org.hibernate.exception.ConstraintViolationException; +import org.hibernate.exception.DataException; +import org.hibernate.exception.SQLGrammarException; +import org.hibernate.query.NativeQuery; +import org.hibernate.tool.schema.spi.CommandAcceptanceException; +import org.hibernate.tool.schema.spi.SchemaManagementException; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class HibernateExceptionUnitTest { + + private static final Logger logger = LoggerFactory + .getLogger(HibernateExceptionUnitTest.class); + private SessionFactory sessionFactory; + + @Before + public void setUp() throws IOException { + sessionFactory = HibernateUtil.getSessionFactory(); + } + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + private Configuration getConfiguration() { + Configuration cfg = new Configuration(); + cfg.setProperty(AvailableSettings.DIALECT, + "org.hibernate.dialect.H2Dialect"); + cfg.setProperty(AvailableSettings.HBM2DDL_AUTO, "none"); + cfg.setProperty(AvailableSettings.DRIVER, "org.h2.Driver"); + cfg.setProperty(AvailableSettings.URL, + "jdbc:h2:mem:myexceptiondb2;DB_CLOSE_DELAY=-1"); + cfg.setProperty(AvailableSettings.USER, "sa"); + cfg.setProperty(AvailableSettings.PASS, ""); + return cfg; + } + + @Test + public void whenQueryExecutedWithUnmappedEntity_thenMappingException() { + thrown.expectCause(isA(MappingException.class)); + thrown.expectMessage("Unknown entity: java.lang.String"); + + Session session = sessionFactory.openSession(); + NativeQuery query = session + .createNativeQuery("select name from PRODUCT", String.class); + query.getResultList(); + } + + @Test + @SuppressWarnings("rawtypes") + public void whenQueryExecuted_thenOK() { + Session session = sessionFactory.openSession(); + NativeQuery query = session + .createNativeQuery("select name from PRODUCT"); + List results = query.getResultList(); + assertNotNull(results); + } + + @Test + public void givenEntityWithoutId_whenSessionFactoryCreated_thenAnnotationException() { + thrown.expect(AnnotationException.class); + thrown.expectMessage("No identifier specified for entity"); + + Configuration cfg = getConfiguration(); + cfg.addAnnotatedClass(EntityWithNoId.class); + cfg.buildSessionFactory(); + } + + @Test + public void givenMissingTable_whenSchemaValidated_thenSchemaManagementException() { + thrown.expect(SchemaManagementException.class); + thrown.expectMessage("Schema-validation: missing table"); + + Configuration cfg = getConfiguration(); + cfg.setProperty(AvailableSettings.HBM2DDL_AUTO, "validate"); + cfg.addAnnotatedClass(Product.class); + cfg.buildSessionFactory(); + } + + @Test + public void whenWrongDialectSpecified_thenCommandAcceptanceException() { + thrown.expect(SchemaManagementException.class); + thrown.expectCause(isA(CommandAcceptanceException.class)); + thrown.expectMessage("Halting on error : Error executing DDL"); + + Configuration cfg = getConfiguration(); + cfg.setProperty(AvailableSettings.DIALECT, + "org.hibernate.dialect.MySQLDialect"); + cfg.setProperty(AvailableSettings.HBM2DDL_AUTO, "update"); + + // This does not work due to hibernate bug + // cfg.setProperty(AvailableSettings.HBM2DDL_HALT_ON_ERROR,"true"); + cfg.getProperties() + .put(AvailableSettings.HBM2DDL_HALT_ON_ERROR, true); + + cfg.addAnnotatedClass(Product.class); + cfg.buildSessionFactory(); + } + + @Test + public void givenMissingTable_whenEntitySaved_thenSQLGrammarException() { + thrown.expect(isA(PersistenceException.class)); + thrown.expectCause(isA(SQLGrammarException.class)); + thrown + .expectMessage("SQLGrammarException: could not prepare statement"); + + Configuration cfg = getConfiguration(); + cfg.addAnnotatedClass(Product.class); + + SessionFactory sessionFactory = cfg.buildSessionFactory(); + Session session = null; + Transaction transaction = null; + try { + + session = sessionFactory.openSession(); + transaction = session.beginTransaction(); + Product product = new Product(); + product.setId(1); + product.setName("Product 1"); + session.save(product); + transaction.commit(); + } catch (Exception e) { + rollbackTransactionQuietly(transaction); + throw (e); + } finally { + closeSessionQuietly(session); + closeSessionFactoryQuietly(sessionFactory); + } + } + + @Test + public void givenMissingTable_whenQueryExecuted_thenSQLGrammarException() { + thrown.expect(isA(PersistenceException.class)); + thrown.expectCause(isA(SQLGrammarException.class)); + thrown + .expectMessage("SQLGrammarException: could not prepare statement"); + + Session session = sessionFactory.openSession(); + NativeQuery query = session.createNativeQuery( + "select * from NON_EXISTING_TABLE", Product.class); + query.getResultList(); + } + + @Test + public void whenDuplicateIdSaved_thenConstraintViolationException() { + thrown.expect(isA(PersistenceException.class)); + thrown.expectCause(isA(ConstraintViolationException.class)); + thrown.expectMessage( + "ConstraintViolationException: could not execute statement"); + + Session session = null; + Transaction transaction = null; + + for (int i = 1; i <= 2; i++) { + try { + session = sessionFactory.openSession(); + transaction = session.beginTransaction(); + Product product = new Product(); + product.setId(1); + product.setName("Product " + i); + session.save(product); + transaction.commit(); + } catch (Exception e) { + rollbackTransactionQuietly(transaction); + throw (e); + } finally { + closeSessionQuietly(session); + } + } + } + + @Test + public void givenNotNullPropertyNotSet_whenEntityIdSaved_thenPropertyValueException() { + thrown.expect(isA(PropertyValueException.class)); + thrown.expectMessage( + "not-null property references a null or transient value"); + + Session session = null; + Transaction transaction = null; + + try { + session = sessionFactory.openSession(); + transaction = session.beginTransaction(); + + Product product = new Product(); + product.setId(1); + session.save(product); + transaction.commit(); + } catch (Exception e) { + rollbackTransactionQuietly(transaction); + throw (e); + } finally { + closeSessionQuietly(session); + } + + } + + @Test + public void givenQueryWithDataTypeMismatch_WhenQueryExecuted_thenDataException() { + thrown.expectCause(isA(DataException.class)); + thrown.expectMessage( + "org.hibernate.exception.DataException: could not prepare statement"); + + Session session = sessionFactory.openSession(); + NativeQuery query = session.createNativeQuery( + "select * from PRODUCT where id='wrongTypeId'", Product.class); + query.getResultList(); + } + + @Test + public void givenSessionContainingAnId_whenIdAssociatedAgain_thenNonUniqueObjectException() { + thrown.expect(isA(NonUniqueObjectException.class)); + thrown.expectMessage( + "A different object with the same identifier value was already associated with the session"); + + Session session = null; + Transaction transaction = null; + + try { + session = sessionFactory.openSession(); + transaction = session.beginTransaction(); + + Product product1 = new Product(); + product1.setId(1); + product1.setName("Product 1"); + session.save(product1); + + Product product2 = new Product(); + product2.setId(1); + product2.setName("Product 2"); + session.save(product2); + + transaction.commit(); + } catch (Exception e) { + rollbackTransactionQuietly(transaction); + throw (e); + } finally { + closeSessionQuietly(session); + } + } + + @Test + public void whenDeletingADeletedObject_thenOptimisticLockException() { + thrown.expect(isA(OptimisticLockException.class)); + thrown.expectMessage( + "Batch update returned unexpected row count from update"); + thrown.expectCause(isA(StaleStateException.class)); + + Session session = null; + Transaction transaction = null; + + try { + session = sessionFactory.openSession(); + transaction = session.beginTransaction(); + + Product product1 = new Product(); + product1.setId(12); + product1.setName("Product 12"); + session.save(product1); + transaction.commit(); + session.close(); + + session = sessionFactory.openSession(); + transaction = session.beginTransaction(); + Product product2 = session.get(Product.class, 12); + session.createNativeQuery("delete from Product where id=12") + .executeUpdate(); + // We need to refresh to fix the error. + // session.refresh(product2); + session.delete(product2); + transaction.commit(); + } catch (Exception e) { + rollbackTransactionQuietly(transaction); + throw (e); + } finally { + closeSessionQuietly(session); + } + } + + @Test + public void whenUpdatingNonExistingObject_thenStaleStateException() { + thrown.expect(isA(OptimisticLockException.class)); + thrown + .expectMessage("Row was updated or deleted by another transaction"); + thrown.expectCause(isA(StaleObjectStateException.class)); + + Session session = null; + Transaction transaction = null; + + try { + session = sessionFactory.openSession(); + transaction = session.beginTransaction(); + + Product product1 = new Product(); + product1.setId(15); + product1.setName("Product1"); + session.update(product1); + transaction.commit(); + } catch (Exception e) { + rollbackTransactionQuietly(transaction); + throw (e); + } finally { + closeSessionQuietly(session); + } + } + + @Test + public void givenTxnMarkedRollbackOnly_whenCommitted_thenTransactionException() { + thrown.expect(isA(TransactionException.class)); + + Session session = null; + Transaction transaction = null; + try { + session = sessionFactory.openSession(); + transaction = session.beginTransaction(); + + Product product1 = new Product(); + product1.setId(15); + product1.setName("Product1"); + session.save(product1); + transaction.setRollbackOnly(); + + transaction.commit(); + } catch (Exception e) { + rollbackTransactionQuietly(transaction); + throw (e); + } finally { + closeSessionQuietly(session); + } + } + + private void rollbackTransactionQuietly(Transaction transaction) { + if (transaction != null && transaction.isActive()) { + try { + transaction.rollback(); + } catch (Exception e) { + logger.error("Exception while rolling back transaction", e); + } + } + } + + private void closeSessionQuietly(Session session) { + if (session != null) { + try { + session.close(); + } catch (Exception e) { + logger.error("Exception while closing session", e); + } + } + } + + private void closeSessionFactoryQuietly(SessionFactory sessionFactory) { + if (sessionFactory != null) { + try { + sessionFactory.close(); + } catch (Exception e) { + logger.error("Exception while closing sessionFactory", e); + } + } + } + + @Test + public void givenExistingEntity_whenIdUpdated_thenHibernateException() { + thrown.expect(isA(PersistenceException.class)); + thrown.expectCause(isA(HibernateException.class)); + thrown.expectMessage( + "identifier of an instance of com.baeldung.hibernate.exception.Product was altered"); + + Session session = null; + Transaction transaction = null; + + try { + session = sessionFactory.openSession(); + transaction = session.beginTransaction(); + + Product product1 = new Product(); + product1.setId(222); + product1.setName("Product 222"); + session.save(product1); + transaction.commit(); + closeSessionQuietly(session); + + session = sessionFactory.openSession(); + transaction = session.beginTransaction(); + + Product product2 = session.get(Product.class, 222); + product2.setId(333); + session.save(product2); + + transaction.commit(); + } catch (Exception e) { + rollbackTransactionQuietly(transaction); + throw (e); + } finally { + closeSessionQuietly(session); + } + } +} diff --git a/persistence-modules/hibernate5/src/test/resources/hibernate-exception.properties b/persistence-modules/hibernate5/src/test/resources/hibernate-exception.properties new file mode 100644 index 0000000000..e08a23166d --- /dev/null +++ b/persistence-modules/hibernate5/src/test/resources/hibernate-exception.properties @@ -0,0 +1,16 @@ +hibernate.connection.driver_class=org.h2.Driver +hibernate.connection.url=jdbc:h2:mem:myexceptiondb1;DB_CLOSE_DELAY=-1 +hibernate.connection.username=sa +hibernate.connection.autocommit=true +jdbc.password= + +hibernate.dialect=org.hibernate.dialect.H2Dialect +hibernate.show_sql=true +hibernate.hbm2ddl.auto=create-drop + +hibernate.c3p0.min_size=5 +hibernate.c3p0.max_size=20 +hibernate.c3p0.acquire_increment=5 +hibernate.c3p0.timeout=1800 + +hibernate.transaction.factory_class=org.hibernate.transaction.JTATransactionFactory From 4f103eeb278324ad943e8b5ad17542fc04902ea5 Mon Sep 17 00:00:00 2001 From: Loredana Date: Sun, 13 Jan 2019 10:32:02 +0200 Subject: [PATCH 357/359] move instanceof code --- .../src/main/java/com/baeldung/keyword/Circle.java | 0 .../src/main/java/com/baeldung/keyword/Ring.java | 0 .../src/main/java/com/baeldung/keyword/Round.java | 0 .../src/main/java/com/baeldung/keyword/Shape.java | 0 .../src/main/java/com/baeldung/keyword/Triangle.java | 0 .../test/java/com/baeldung/keyword/test/InstanceOfUnitTest.java | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename {core-java => core-java-lang-syntax}/src/main/java/com/baeldung/keyword/Circle.java (100%) rename {core-java => core-java-lang-syntax}/src/main/java/com/baeldung/keyword/Ring.java (100%) rename {core-java => core-java-lang-syntax}/src/main/java/com/baeldung/keyword/Round.java (100%) rename {core-java => core-java-lang-syntax}/src/main/java/com/baeldung/keyword/Shape.java (100%) rename {core-java => core-java-lang-syntax}/src/main/java/com/baeldung/keyword/Triangle.java (100%) rename {core-java => core-java-lang-syntax}/src/test/java/com/baeldung/keyword/test/InstanceOfUnitTest.java (100%) diff --git a/core-java/src/main/java/com/baeldung/keyword/Circle.java b/core-java-lang-syntax/src/main/java/com/baeldung/keyword/Circle.java similarity index 100% rename from core-java/src/main/java/com/baeldung/keyword/Circle.java rename to core-java-lang-syntax/src/main/java/com/baeldung/keyword/Circle.java diff --git a/core-java/src/main/java/com/baeldung/keyword/Ring.java b/core-java-lang-syntax/src/main/java/com/baeldung/keyword/Ring.java similarity index 100% rename from core-java/src/main/java/com/baeldung/keyword/Ring.java rename to core-java-lang-syntax/src/main/java/com/baeldung/keyword/Ring.java diff --git a/core-java/src/main/java/com/baeldung/keyword/Round.java b/core-java-lang-syntax/src/main/java/com/baeldung/keyword/Round.java similarity index 100% rename from core-java/src/main/java/com/baeldung/keyword/Round.java rename to core-java-lang-syntax/src/main/java/com/baeldung/keyword/Round.java diff --git a/core-java/src/main/java/com/baeldung/keyword/Shape.java b/core-java-lang-syntax/src/main/java/com/baeldung/keyword/Shape.java similarity index 100% rename from core-java/src/main/java/com/baeldung/keyword/Shape.java rename to core-java-lang-syntax/src/main/java/com/baeldung/keyword/Shape.java diff --git a/core-java/src/main/java/com/baeldung/keyword/Triangle.java b/core-java-lang-syntax/src/main/java/com/baeldung/keyword/Triangle.java similarity index 100% rename from core-java/src/main/java/com/baeldung/keyword/Triangle.java rename to core-java-lang-syntax/src/main/java/com/baeldung/keyword/Triangle.java diff --git a/core-java/src/test/java/com/baeldung/keyword/test/InstanceOfUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/keyword/test/InstanceOfUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/keyword/test/InstanceOfUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/keyword/test/InstanceOfUnitTest.java From e7412182a9e7f8d5e5ab13760b23580aad940d24 Mon Sep 17 00:00:00 2001 From: fanatixan Date: Sun, 13 Jan 2019 22:27:07 +0100 Subject: [PATCH 358/359] bael-2508 - Stream.peek() examples (#6132) * bael-2508 - Stream.peek() examples * beal-2508 additional example * bael-2508 moving examples --- .../com/baeldung/stream/PeekUnitTest.java | 118 ++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 java-streams/src/test/java/com/baeldung/stream/PeekUnitTest.java diff --git a/java-streams/src/test/java/com/baeldung/stream/PeekUnitTest.java b/java-streams/src/test/java/com/baeldung/stream/PeekUnitTest.java new file mode 100644 index 0000000000..a3a2816e9c --- /dev/null +++ b/java-streams/src/test/java/com/baeldung/stream/PeekUnitTest.java @@ -0,0 +1,118 @@ +package com.baeldung.stream; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.StringWriter; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class PeekUnitTest { + + private StringWriter out; + + @BeforeEach + void setup() { + out = new StringWriter(); + } + + @Test + void givenStringStream_whenCallingPeekOnly_thenNoElementProcessed() { + // given + Stream nameStream = Stream.of("Alice", "Bob", "Chuck"); + + // when + nameStream.peek(out::append); + + // then + assertThat(out.toString()).isEmpty(); + } + + @Test + void givenStringStream_whenCallingForEachOnly_thenElementsProcessed() { + // given + Stream nameStream = Stream.of("Alice", "Bob", "Chuck"); + + // when + nameStream.forEach(out::append); + + // then + assertThat(out.toString()).isEqualTo("AliceBobChuck"); + } + + @Test + void givenStringStream_whenCallingPeekAndNoopForEach_thenElementsProcessed() { + // given + Stream nameStream = Stream.of("Alice", "Bob", "Chuck"); + + // when + nameStream.peek(out::append) + .forEach(this::noop); + + // then + assertThat(out.toString()).isEqualTo("AliceBobChuck"); + } + + @Test + void givenStringStream_whenCallingPeekAndCollect_thenElementsProcessed() { + // given + Stream nameStream = Stream.of("Alice", "Bob", "Chuck"); + + // when + nameStream.peek(out::append) + .collect(Collectors.toList()); + + // then + assertThat(out.toString()).isEqualTo("AliceBobChuck"); + } + + @Test + void givenStringStream_whenCallingPeekAndForEach_thenElementsProcessedTwice() { + // given + Stream nameStream = Stream.of("Alice", "Bob", "Chuck"); + + // when + nameStream.peek(out::append) + .forEach(out::append); + + // then + assertThat(out.toString()).isEqualTo("AliceAliceBobBobChuckChuck"); + } + + @Test + void givenStringStream_whenCallingPeek_thenElementsProcessedTwice() { + // given + Stream userStream = Stream.of(new User("Alice"), new User("Bob"), new User("Chuck")); + + // when + userStream.peek(u -> u.setName(u.getName().toLowerCase())) + .map(User::getName) + .forEach(out::append); + + // then + assertThat(out.toString()).isEqualTo("alicebobchuck"); + } + + private static class User { + private String name; + + public User(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + } + + private void noop(String s) { + } + +} From 18e1a3067d660556d3c6e1b78debc64f525266d8 Mon Sep 17 00:00:00 2001 From: freddyaott Date: Tue, 15 Jan 2019 04:04:54 +0100 Subject: [PATCH 359/359] [BAEL-2270] Guide to XMPP Smack Client (#5959) Smack Library - Simple chat client --- libraries/log4j.properties | 4 + libraries/pom.xml | 25 ++++++ .../java/com/baeldung/smack/StanzaThread.java | 40 +++++++++ .../baeldung/smack/SmackIntegrationTest.java | 85 +++++++++++++++++++ 4 files changed, 154 insertions(+) create mode 100644 libraries/src/main/java/com/baeldung/smack/StanzaThread.java create mode 100644 libraries/src/test/java/com/baeldung/smack/SmackIntegrationTest.java diff --git a/libraries/log4j.properties b/libraries/log4j.properties index 2173c5d96f..ed367509d1 100644 --- a/libraries/log4j.properties +++ b/libraries/log4j.properties @@ -1 +1,5 @@ log4j.rootLogger=INFO, stdout +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n \ No newline at end of file diff --git a/libraries/pom.xml b/libraries/pom.xml index c7ef64bc59..301fa86c8d 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -675,6 +675,30 @@ ${mockftpserver.version} test + + + org.igniterealtime.smack + smack-tcp + ${smack.version} + + + + org.igniterealtime.smack + smack-im + ${smack.version} + + + + org.igniterealtime.smack + smack-extensions + ${smack.version} + + + + org.igniterealtime.smack + smack-java7 + ${smack.version} + @@ -896,6 +920,7 @@ 1.1.0 2.7.1 3.6 + 4.3.1 diff --git a/libraries/src/main/java/com/baeldung/smack/StanzaThread.java b/libraries/src/main/java/com/baeldung/smack/StanzaThread.java new file mode 100644 index 0000000000..72db258164 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/smack/StanzaThread.java @@ -0,0 +1,40 @@ +package com.baeldung.smack; + +import org.jivesoftware.smack.AbstractXMPPConnection; +import org.jivesoftware.smack.chat2.Chat; +import org.jivesoftware.smack.chat2.ChatManager; +import org.jivesoftware.smack.tcp.XMPPTCPConnection; +import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration; +import org.jxmpp.jid.impl.JidCreate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class StanzaThread implements Runnable { + + private Logger logger = LoggerFactory.getLogger(StanzaThread.class); + + @Override + public void run() { + XMPPTCPConnectionConfiguration config = null; + try { + config = XMPPTCPConnectionConfiguration.builder() + .setUsernameAndPassword("baeldung2","baeldung2") + .setXmppDomain("jabb3r.org") + .setHost("jabb3r.org") + .build(); + + AbstractXMPPConnection connection = new XMPPTCPConnection(config); + connection.connect(); + connection.login(); + + ChatManager chatManager = ChatManager.getInstanceFor(connection); + + Chat chat = chatManager.chatWith(JidCreate.from("baeldung@jabb3r.org").asEntityBareJidOrThrow()); + + chat.send("Hello!"); + + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + } +} diff --git a/libraries/src/test/java/com/baeldung/smack/SmackIntegrationTest.java b/libraries/src/test/java/com/baeldung/smack/SmackIntegrationTest.java new file mode 100644 index 0000000000..1e5e36ce24 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/smack/SmackIntegrationTest.java @@ -0,0 +1,85 @@ +package com.baeldung.smack; + +import org.jivesoftware.smack.AbstractXMPPConnection; +import org.jivesoftware.smack.SmackException; +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smack.chat2.ChatManager; +import org.jivesoftware.smack.filter.StanzaTypeFilter; +import org.jivesoftware.smack.packet.Message; +import org.jivesoftware.smack.tcp.XMPPTCPConnection; +import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.jxmpp.stringprep.XmppStringprepException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.concurrent.CountDownLatch; + +public class SmackIntegrationTest { + + private static AbstractXMPPConnection connection; + private Logger logger = LoggerFactory.getLogger(SmackIntegrationTest.class); + + @BeforeClass + public static void setup() throws IOException, InterruptedException, XMPPException, SmackException { + + XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder() + .setUsernameAndPassword("baeldung","baeldung") + .setXmppDomain("jabb3r.org") + .setHost("jabb3r.org") + .build(); + + XMPPTCPConnectionConfiguration config2 = XMPPTCPConnectionConfiguration.builder() + .setUsernameAndPassword("baeldung2","baeldung2") + .setXmppDomain("jabb3r.org") + .setHost("jabb3r.org") + .build(); + + connection = new XMPPTCPConnection(config); + connection.connect(); + connection.login(); + + } + + @Test + public void whenSendMessageWithChat_thenReceiveMessage() throws XmppStringprepException, InterruptedException { + + CountDownLatch latch = new CountDownLatch(1); + ChatManager chatManager = ChatManager.getInstanceFor(connection); + final String[] expected = {null}; + + new StanzaThread().run(); + + chatManager.addIncomingListener((entityBareJid, message, chat) -> { + logger.info("Message arrived: " + message.getBody()); + expected[0] = message.getBody(); + latch.countDown(); + }); + + latch.await(); + Assert.assertEquals("Hello!", expected[0]); + } + + @Test + public void whenSendMessage_thenReceiveMessageWithFilter() throws XmppStringprepException, InterruptedException { + + CountDownLatch latch = new CountDownLatch(1); + final String[] expected = {null}; + + new StanzaThread().run(); + + connection.addAsyncStanzaListener(stanza -> { + if (stanza instanceof Message) { + Message message = (Message) stanza; + expected[0] = message.getBody(); + latch.countDown(); + } + }, StanzaTypeFilter.MESSAGE); + + latch.await(); + Assert.assertEquals("Hello!", expected[0]); + } +}