From 46d18f796e744f92ddce91573f7edf34cd895739 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Tue, 25 Apr 2017 20:22:09 +0200 Subject: [PATCH 1/7] BAEL-850 ConcurentskipLIst --- .../baeldung/concurrent/skiplist/Event.java | 22 +++++ .../concurrent/skiplist/EventWindowSort.java | 33 +++++++ .../skiplist/ConcurrentSkipListSetTest.java | 90 +++++++++++++++++++ 3 files changed, 145 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/concurrent/skiplist/Event.java create mode 100644 core-java/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java create mode 100644 core-java/src/test/java/com/baeldung/concurrent/skiplist/ConcurrentSkipListSetTest.java diff --git a/core-java/src/main/java/com/baeldung/concurrent/skiplist/Event.java b/core-java/src/main/java/com/baeldung/concurrent/skiplist/Event.java new file mode 100644 index 000000000000..960c4e041994 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/concurrent/skiplist/Event.java @@ -0,0 +1,22 @@ +package com.baeldung.concurrent.skiplist; + + +import java.time.ZonedDateTime; + +public class Event { + private final ZonedDateTime eventTime; + private final String content; + + public Event(ZonedDateTime eventTime, String content) { + this.eventTime = eventTime; + this.content = content; + } + + public ZonedDateTime getEventTime() { + return eventTime; + } + + public String getContent() { + return content; + } +} diff --git a/core-java/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java b/core-java/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java new file mode 100644 index 000000000000..ffa9a35db1d9 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java @@ -0,0 +1,33 @@ +package com.baeldung.concurrent.skiplist; + + +import java.time.ZonedDateTime; +import java.util.Comparator; +import java.util.concurrent.ConcurrentNavigableMap; +import java.util.concurrent.ConcurrentSkipListMap; +import java.util.function.ToLongFunction; + +public class EventWindowSort { + private final ConcurrentSkipListMap events = new ConcurrentSkipListMap<>( + Comparator.comparingLong(new ToLongFunction() { + @Override + public long applyAsLong(ZonedDateTime value) { + return value.toInstant().toEpochMilli(); + } + })); + + + public void acceptEvent(Event event) { + events.put(event.getEventTime(), event.getContent()); + } + + public ConcurrentNavigableMap getEventsFromLastMinute() { + return events.tailMap(ZonedDateTime.now().minusMinutes(1)); + } + + public ConcurrentNavigableMap getEventsOlderThatOneMinute() { + return events.headMap(ZonedDateTime.now().minusMinutes(1)); + } + +} + diff --git a/core-java/src/test/java/com/baeldung/concurrent/skiplist/ConcurrentSkipListSetTest.java b/core-java/src/test/java/com/baeldung/concurrent/skiplist/ConcurrentSkipListSetTest.java new file mode 100644 index 000000000000..21125d9e63aa --- /dev/null +++ b/core-java/src/test/java/com/baeldung/concurrent/skiplist/ConcurrentSkipListSetTest.java @@ -0,0 +1,90 @@ +package com.baeldung.concurrent.skiplist; + +import org.junit.Test; + +import java.time.ZonedDateTime; +import java.util.UUID; +import java.util.concurrent.ConcurrentNavigableMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.stream.IntStream; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class ConcurrentSkipListSetTest { + + @Test + public void givenThreadsProducingEvents_whenGetForEventsFromLastMinute_thenReturnThoseEventsInTheLockFreeWay() throws InterruptedException { + //given + ExecutorService executorService = Executors.newFixedThreadPool(3); + EventWindowSort eventWindowSort = new EventWindowSort(); + int numberOfThreads = 2; + //when + Runnable producer = () -> IntStream.rangeClosed(0, 100) + .forEach(index -> eventWindowSort.acceptEvent( + new Event(ZonedDateTime.now().minusSeconds(index), UUID.randomUUID().toString())) + ); + + for (int i = 0; i < numberOfThreads; i++) { + executorService.execute(producer); + } + Thread.sleep(500); + ConcurrentNavigableMap eventsFromLastMinute = eventWindowSort.getEventsFromLastMinute(); + long eventsOlderThanOneMinute = eventsFromLastMinute + .entrySet() + .stream() + .filter(e -> e.getKey().isBefore(ZonedDateTime.now().minusMinutes(1))) + .count(); + assertEquals(eventsOlderThanOneMinute, 0); + + long eventYoungerThanOneMinute = eventsFromLastMinute + .entrySet() + .stream() + .filter(e -> e.getKey().isAfter(ZonedDateTime.now().minusMinutes(1))) + .count(); + assertTrue(eventYoungerThanOneMinute > 0); + + //then + executorService.awaitTermination(1, TimeUnit.SECONDS); + executorService.shutdown(); + } + + @Test + public void givenThreadsProducingEvents_whenGetForEventsOlderThanOneMinute_thenReturnThoseEventsInTheLockFreeWay() throws InterruptedException { + //given + ExecutorService executorService = Executors.newFixedThreadPool(3); + EventWindowSort eventWindowSort = new EventWindowSort(); + int numberOfThreads = 2; + //when + Runnable producer = () -> IntStream.rangeClosed(0, 100) + .forEach(index -> eventWindowSort.acceptEvent( + new Event(ZonedDateTime.now().minusSeconds(index), UUID.randomUUID().toString())) + ); + + for (int i = 0; i < numberOfThreads; i++) { + executorService.execute(producer); + } + Thread.sleep(500); + ConcurrentNavigableMap eventsFromLastMinute = eventWindowSort.getEventsOlderThatOneMinute(); + long eventsOlderThanOneMinute = eventsFromLastMinute + .entrySet() + .stream() + .filter(e -> e.getKey().isBefore(ZonedDateTime.now().minusMinutes(1))) + .count(); + assertTrue(eventsOlderThanOneMinute > 0); + + long eventYoungerThanOneMinute = eventsFromLastMinute + .entrySet() + .stream() + .filter(e -> e.getKey().isAfter(ZonedDateTime.now().minusMinutes(1))) + .count(); + assertEquals(eventYoungerThanOneMinute, 0); + + //then + executorService.awaitTermination(1, TimeUnit.SECONDS); + executorService.shutdown(); + } + +} \ No newline at end of file From 689f7dc361d2eb9484d6c7a23325458b8edfd0cb Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Tue, 25 Apr 2017 20:31:46 +0200 Subject: [PATCH 2/7] BAEL-850 formatting --- .../java/com/baeldung/concurrent/skiplist/EventWindowSort.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core-java/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java b/core-java/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java index ffa9a35db1d9..41158529783c 100644 --- a/core-java/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java +++ b/core-java/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java @@ -14,7 +14,8 @@ public class EventWindowSort { public long applyAsLong(ZonedDateTime value) { return value.toInstant().toEpochMilli(); } - })); + }) + ); public void acceptEvent(Event event) { From e329a14ac86393f96b17bd795e816ca1dcc7bb34 Mon Sep 17 00:00:00 2001 From: pedja4 Date: Thu, 27 Apr 2017 12:19:15 +0200 Subject: [PATCH 3/7] BAEL-850 Formatting --- .../baeldung/concurrent/skiplist/Event.java | 1 - .../concurrent/skiplist/EventWindowSort.java | 26 +++--- .../skiplist/ConcurrentSkipListSetTest.java | 82 +++++++++++++------ 3 files changed, 70 insertions(+), 39 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/concurrent/skiplist/Event.java b/core-java/src/main/java/com/baeldung/concurrent/skiplist/Event.java index 960c4e041994..ce1f57bb936c 100644 --- a/core-java/src/main/java/com/baeldung/concurrent/skiplist/Event.java +++ b/core-java/src/main/java/com/baeldung/concurrent/skiplist/Event.java @@ -1,6 +1,5 @@ package com.baeldung.concurrent.skiplist; - import java.time.ZonedDateTime; public class Event { diff --git a/core-java/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java b/core-java/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java index 41158529783c..9eef00bd3f24 100644 --- a/core-java/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java +++ b/core-java/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java @@ -1,6 +1,5 @@ package com.baeldung.concurrent.skiplist; - import java.time.ZonedDateTime; import java.util.Comparator; import java.util.concurrent.ConcurrentNavigableMap; @@ -8,26 +7,29 @@ import java.util.function.ToLongFunction; public class EventWindowSort { - private final ConcurrentSkipListMap events = new ConcurrentSkipListMap<>( - Comparator.comparingLong(new ToLongFunction() { - @Override - public long applyAsLong(ZonedDateTime value) { - return value.toInstant().toEpochMilli(); - } - }) - ); - + private final ConcurrentSkipListMap events = new ConcurrentSkipListMap<>(Comparator.comparingLong(new ToLongFunction() { + @Override + public long applyAsLong(ZonedDateTime value) { + return value + .toInstant() + .toEpochMilli(); + } + })); public void acceptEvent(Event event) { events.put(event.getEventTime(), event.getContent()); } public ConcurrentNavigableMap getEventsFromLastMinute() { - return events.tailMap(ZonedDateTime.now().minusMinutes(1)); + return events.tailMap(ZonedDateTime + .now() + .minusMinutes(1)); } public ConcurrentNavigableMap getEventsOlderThatOneMinute() { - return events.headMap(ZonedDateTime.now().minusMinutes(1)); + return events.headMap(ZonedDateTime + .now() + .minusMinutes(1)); } } diff --git a/core-java/src/test/java/com/baeldung/concurrent/skiplist/ConcurrentSkipListSetTest.java b/core-java/src/test/java/com/baeldung/concurrent/skiplist/ConcurrentSkipListSetTest.java index 21125d9e63aa..a2dbbae5200d 100644 --- a/core-java/src/test/java/com/baeldung/concurrent/skiplist/ConcurrentSkipListSetTest.java +++ b/core-java/src/test/java/com/baeldung/concurrent/skiplist/ConcurrentSkipListSetTest.java @@ -22,31 +22,46 @@ public void givenThreadsProducingEvents_whenGetForEventsFromLastMinute_thenRetur EventWindowSort eventWindowSort = new EventWindowSort(); int numberOfThreads = 2; //when - Runnable producer = () -> IntStream.rangeClosed(0, 100) - .forEach(index -> eventWindowSort.acceptEvent( - new Event(ZonedDateTime.now().minusSeconds(index), UUID.randomUUID().toString())) - ); + Runnable producer = () -> IntStream + .rangeClosed(0, 100) + .forEach(index -> eventWindowSort.acceptEvent(new Event(ZonedDateTime + .now() + .minusSeconds(index), UUID + .randomUUID() + .toString()))); for (int i = 0; i < numberOfThreads; i++) { executorService.execute(producer); } + Thread.sleep(500); + ConcurrentNavigableMap eventsFromLastMinute = eventWindowSort.getEventsFromLastMinute(); + long eventsOlderThanOneMinute = eventsFromLastMinute - .entrySet() - .stream() - .filter(e -> e.getKey().isBefore(ZonedDateTime.now().minusMinutes(1))) - .count(); + .entrySet() + .stream() + .filter(e -> e + .getKey() + .isBefore(ZonedDateTime + .now() + .minusMinutes(1))) + .count(); assertEquals(eventsOlderThanOneMinute, 0); long eventYoungerThanOneMinute = eventsFromLastMinute - .entrySet() - .stream() - .filter(e -> e.getKey().isAfter(ZonedDateTime.now().minusMinutes(1))) - .count(); - assertTrue(eventYoungerThanOneMinute > 0); + .entrySet() + .stream() + .filter(e -> e + .getKey() + .isAfter(ZonedDateTime + .now() + .minusMinutes(1))) + .count(); //then + assertTrue(eventYoungerThanOneMinute > 0); + executorService.awaitTermination(1, TimeUnit.SECONDS); executorService.shutdown(); } @@ -58,31 +73,46 @@ public void givenThreadsProducingEvents_whenGetForEventsOlderThanOneMinute_thenR EventWindowSort eventWindowSort = new EventWindowSort(); int numberOfThreads = 2; //when - Runnable producer = () -> IntStream.rangeClosed(0, 100) - .forEach(index -> eventWindowSort.acceptEvent( - new Event(ZonedDateTime.now().minusSeconds(index), UUID.randomUUID().toString())) - ); + Runnable producer = () -> IntStream + .rangeClosed(0, 100) + .forEach(index -> eventWindowSort.acceptEvent(new Event(ZonedDateTime + .now() + .minusSeconds(index), UUID + .randomUUID() + .toString()))); for (int i = 0; i < numberOfThreads; i++) { executorService.execute(producer); } + Thread.sleep(500); + ConcurrentNavigableMap eventsFromLastMinute = eventWindowSort.getEventsOlderThatOneMinute(); + long eventsOlderThanOneMinute = eventsFromLastMinute - .entrySet() - .stream() - .filter(e -> e.getKey().isBefore(ZonedDateTime.now().minusMinutes(1))) - .count(); + .entrySet() + .stream() + .filter(e -> e + .getKey() + .isBefore(ZonedDateTime + .now() + .minusMinutes(1))) + .count(); assertTrue(eventsOlderThanOneMinute > 0); long eventYoungerThanOneMinute = eventsFromLastMinute - .entrySet() - .stream() - .filter(e -> e.getKey().isAfter(ZonedDateTime.now().minusMinutes(1))) - .count(); - assertEquals(eventYoungerThanOneMinute, 0); + .entrySet() + .stream() + .filter(e -> e + .getKey() + .isAfter(ZonedDateTime + .now() + .minusMinutes(1))) + .count(); //then + assertEquals(eventYoungerThanOneMinute, 0); + executorService.awaitTermination(1, TimeUnit.SECONDS); executorService.shutdown(); } From 8db8455861562f1956d6440488f7eb42e1be61a9 Mon Sep 17 00:00:00 2001 From: eugenp Date: Thu, 27 Apr 2017 15:50:11 +0300 Subject: [PATCH 4/7] spring 5 work --- spring-5/pom.xml | 328 +++++++++--------- .../Spring5ReactiveServerClientTest.java | 86 ++--- spring-rest/pom.xml | 2 +- .../client/RestTemplateBasicLiveTest.java | 24 ++ 4 files changed, 233 insertions(+), 207 deletions(-) diff --git a/spring-5/pom.xml b/spring-5/pom.xml index ec55a878c784..466318a31a18 100644 --- a/spring-5/pom.xml +++ b/spring-5/pom.xml @@ -1,180 +1,182 @@ - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - com.baeldung - spring-5 - 0.0.1-SNAPSHOT - jar + com.baeldung + spring-5 + 0.0.1-SNAPSHOT + jar - spring-5 - spring 5 sample project about new features + spring-5 + spring 5 sample project about new features - - org.springframework.boot - spring-boot-starter-parent - 2.0.0.BUILD-SNAPSHOT - - + + org.springframework.boot + spring-boot-starter-parent + 2.0.0.BUILD-SNAPSHOT + + - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-validation - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-webflux - + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-webflux + - - - org.apache.commons - commons-lang3 - + + + org.apache.commons + commons-lang3 + - + - - org.springframework.boot - spring-boot-devtools - runtime - - - com.h2database - h2 - runtime - - - org.junit.jupiter - junit-jupiter-api - ${junit.jupiter.version} - - - org.springframework - spring-test - ${spring.test.version} - - - org.springframework.boot - spring-boot-starter-test - test - - - org.junit.jupiter - junit-jupiter-engine - ${junit.jupiter.version} - test - - - org.junit.platform - junit-platform-surefire-provider - ${junit.platform.version} - test - - - org.junit.platform - junit-platform-runner - ${junit.platform.version} - test - - + + org.springframework.boot + spring-boot-devtools + runtime + + + com.h2database + h2 + runtime + + + + org.springframework + spring-test + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.junit.jupiter + junit-jupiter-api + ${junit.jupiter.version} + + + org.junit.jupiter + junit-jupiter-engine + ${junit.jupiter.version} + test + + + org.junit.platform + junit-platform-surefire-provider + ${junit.platform.version} + test + + + org.junit.platform + junit-platform-runner + ${junit.platform.version} + test + + + - - - - org.springframework.boot - spring-boot-maven-plugin - - com.baeldung.Spring5Application - JAR - - + + + + org.springframework.boot + spring-boot-maven-plugin + + com.baeldung.Spring5Application + JAR + + - - org.apache.maven.plugins - maven-surefire-plugin - - 3 - true - - **/*IntegrationTest.java - **/*LiveTest.java - - - + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + 3 + true + + **/*IntegrationTest.java + **/*LiveTest.java + + + - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - methods - true - - + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + methods + true + + - - + + - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + - - UTF-8 - UTF-8 - 1.8 - 1.0.0-M3 - 5.0.0-M3 - 4.3.7.RELEASE - 2.19.1 - + + UTF-8 + UTF-8 + 1.8 + 1.0.0-M4 + 5.0.0-M4 + 2.20 + diff --git a/spring-5/src/test/java/com/baeldung/jupiter/Spring5ReactiveServerClientTest.java b/spring-5/src/test/java/com/baeldung/jupiter/Spring5ReactiveServerClientTest.java index 2252c255eeb7..d3e194d10d87 100644 --- a/spring-5/src/test/java/com/baeldung/jupiter/Spring5ReactiveServerClientTest.java +++ b/spring-5/src/test/java/com/baeldung/jupiter/Spring5ReactiveServerClientTest.java @@ -56,49 +56,49 @@ public static void shutDown() { nettyContext.dispose(); } - @Test - public void givenCheckTask_whenServerHandle_thenServerResponseALiveString() throws Exception { - WebClient client = WebClient.create("http://localhost:8080"); - Mono result = client - .get() - .uri("/task") - .exchange() - .then(response -> response.bodyToMono(String.class)); - - assertThat(result.block()).isInstanceOf(String.class); - } - - @Test - public void givenThreeTasks_whenServerHandleTheTasks_thenServerResponseATask() throws Exception { - URI uri = URI.create("http://localhost:8080/task/process"); - ExchangeFunction exchange = ExchangeFunctions.create(new ReactorClientHttpConnector()); - ClientRequest request = ClientRequest - .method(HttpMethod.POST, uri) - .body(BodyInserters.fromPublisher(getLatLngs(), Task.class)) - .build(); - - Flux taskResponse = exchange - .exchange(request) - .flatMap(response -> response.bodyToFlux(Task.class)); - - assertThat(taskResponse.blockFirst()).isInstanceOf(Task.class); - } - - @Test - public void givenCheckTask_whenServerHandle_thenOragicServerResponseALiveString() throws Exception { - URI uri = URI.create("http://localhost:8080/task"); - ExchangeFunction exchange = ExchangeFunctions.create(new ReactorClientHttpConnector()); - ClientRequest request = ClientRequest - .method(HttpMethod.GET, uri) - .body(BodyInserters.fromPublisher(getLatLngs(), Task.class)) - .build(); - - Flux taskResponse = exchange - .exchange(request) - .flatMap(response -> response.bodyToFlux(String.class)); - - assertThat(taskResponse.blockFirst()).isInstanceOf(String.class); - } +// @Test +// public void givenCheckTask_whenServerHandle_thenServerResponseALiveString() throws Exception { +// WebClient client = WebClient.create("http://localhost:8080"); +// Mono result = client +// .get() +// .uri("/task") +// .exchange() +// .then(response -> response.bodyToMono(String.class)); +// +// assertThat(result.block()).isInstanceOf(String.class); +// } + +// @Test +// public void givenThreeTasks_whenServerHandleTheTasks_thenServerResponseATask() throws Exception { +// URI uri = URI.create("http://localhost:8080/task/process"); +// ExchangeFunction exchange = ExchangeFunctions.create(new ReactorClientHttpConnector()); +// ClientRequest request = ClientRequest +// .method(HttpMethod.POST, uri) +// .body(BodyInserters.fromPublisher(getLatLngs(), Task.class)) +// .build(); +// +// Flux taskResponse = exchange +// .exchange(request) +// .flatMap(response -> response.bodyToFlux(Task.class)); +// +// assertThat(taskResponse.blockFirst()).isInstanceOf(Task.class); +// } + +// @Test +// public void givenCheckTask_whenServerHandle_thenOragicServerResponseALiveString() throws Exception { +// URI uri = URI.create("http://localhost:8080/task"); +// ExchangeFunction exchange = ExchangeFunctions.create(new ReactorClientHttpConnector()); +// ClientRequest request = ClientRequest +// .method(HttpMethod.GET, uri) +// .body(BodyInserters.fromPublisher(getLatLngs(), Task.class)) +// .build(); +// +// Flux taskResponse = exchange +// .exchange(request) +// .flatMap(response -> response.bodyToFlux(String.class)); +// +// assertThat(taskResponse.blockFirst()).isInstanceOf(String.class); +// } private static Flux getLatLngs() { return Flux diff --git a/spring-rest/pom.xml b/spring-rest/pom.xml index 9b1b9a28474e..bbd4a9a11988 100644 --- a/spring-rest/pom.xml +++ b/spring-rest/pom.xml @@ -10,7 +10,7 @@ org.springframework.boot spring-boot-starter-parent - 1.4.3.RELEASE + 1.4.6.RELEASE diff --git a/spring-rest/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java b/spring-rest/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java index a47c60e9d879..c9dad8ccf00b 100644 --- a/spring-rest/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java +++ b/spring-rest/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java @@ -163,6 +163,30 @@ public void givenFooService_whenPutExistingEntityWithCallback_thenItIsUpdated() assertThat(foo.getName(), is(updatedInstance.getName())); } + // PATCH + + @Test + public void givenFooService_whenPatchExistingEntity_thenItIsUpdated() { + final RestTemplate template = new RestTemplate(); + final HttpHeaders headers = prepareBasicAuthHeaders(); + final HttpEntity request = new HttpEntity<>(new Foo("bar"), headers); + + // Create Resource + final ResponseEntity createResponse = template.exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class); + + // Update Resource + final Foo updatedResource = new Foo("newName"); + updatedResource.setId(createResponse.getBody().getId()); + final String resourceUrl = fooResourceUrl + '/' + createResponse.getBody().getId(); + final HttpEntity requestUpdate = new HttpEntity<>(updatedResource, headers); + template.patchForObject(resourceUrl, requestUpdate, Void.class); + + // Check that Resource was updated + final ResponseEntity updateResponse = template.exchange(resourceUrl, HttpMethod.GET, new HttpEntity<>(headers), Foo.class); + final Foo foo = updateResponse.getBody(); + assertThat(foo.getName(), is(updatedResource.getName())); + } + // DELETE @Test From 84d7f4cdbb0de1bf1a4cf6d15cd0851850272ab9 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Thu, 27 Apr 2017 16:58:13 +0200 Subject: [PATCH 5/7] SetTest refactor (#1724) --- .../java/com/baeldung/java/set/SetTest.java | 51 ++++++++++--------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/java/set/SetTest.java b/core-java/src/test/java/com/baeldung/java/set/SetTest.java index 59e135283f00..32a5c7e07ee9 100644 --- a/core-java/src/test/java/com/baeldung/java/set/SetTest.java +++ b/core-java/src/test/java/com/baeldung/java/set/SetTest.java @@ -1,15 +1,11 @@ package com.baeldung.java.set; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import org.junit.Test; -import java.util.ConcurrentModificationException; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; -import java.util.TreeSet; +import java.util.*; -import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; public class SetTest { @@ -44,22 +40,22 @@ public void givenHashSet_whenAddNullObject_thenOK() { @Test public void givenHashSetAndTreeSet_whenAddObjects_thenHashSetIsFaster() { - Set set = new HashSet<>(); - long startTime = System.nanoTime(); - set.add("Baeldung"); - set.add("is"); - set.add("Awesome"); - long endTime = System.nanoTime(); - long duration1 = (endTime - startTime); - Set set2 = new TreeSet<>(); - startTime = System.nanoTime(); - set2.add("Baeldung"); - set2.add("is"); - set2.add("Awesome"); - endTime = System.nanoTime(); - long duration2 = (endTime - startTime); - assertTrue(duration1 < duration2); + long hashSetInsertionTime = measureExecution(() -> { + Set set = new HashSet<>(); + set.add("Baeldung"); + set.add("is"); + set.add("Awesome"); + }); + + long TreeSetInsertionTime = measureExecution(() -> { + Set set = new TreeSet<>(); + set.add("Baeldung"); + set.add("is"); + set.add("Awesome"); + }); + + assertTrue(hashSetInsertionTime < TreeSetInsertionTime); } @Test @@ -86,4 +82,13 @@ public void givenHashSet_whenModifyWhenIterator_thenFailFast() { it.next(); } } + + private static long measureExecution(Runnable task) { + long startTime = System.nanoTime(); + task.run(); + long endTime = System.nanoTime(); + long executionTime = endTime - startTime; + System.out.println(executionTime); + return executionTime; + } } From af17a567c0980cea12767eb2deac0c4fd65e7dac Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Thu, 27 Apr 2017 18:41:51 +0200 Subject: [PATCH 6/7] BAEL-850 use lambda --- .../baeldung/concurrent/skiplist/EventWindowSort.java | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java b/core-java/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java index 9eef00bd3f24..ba623bf8b6d2 100644 --- a/core-java/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java +++ b/core-java/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java @@ -7,14 +7,9 @@ import java.util.function.ToLongFunction; public class EventWindowSort { - private final ConcurrentSkipListMap events = new ConcurrentSkipListMap<>(Comparator.comparingLong(new ToLongFunction() { - @Override - public long applyAsLong(ZonedDateTime value) { - return value - .toInstant() - .toEpochMilli(); - } - })); + private final ConcurrentSkipListMap events = new ConcurrentSkipListMap<>(Comparator.comparingLong((ToLongFunction) value -> value + .toInstant() + .toEpochMilli())); public void acceptEvent(Event event) { events.put(event.getEventTime(), event.getContent()); From 4681e59948019f737539e7a5309b3b2a649f2074 Mon Sep 17 00:00:00 2001 From: Tomasz Lelek Date: Thu, 27 Apr 2017 19:02:55 +0200 Subject: [PATCH 7/7] BAEL-850 no need to casting --- .../concurrent/skiplist/EventWindowSort.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java b/core-java/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java index ba623bf8b6d2..3aca6b01470a 100644 --- a/core-java/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java +++ b/core-java/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java @@ -4,12 +4,10 @@ import java.util.Comparator; import java.util.concurrent.ConcurrentNavigableMap; import java.util.concurrent.ConcurrentSkipListMap; -import java.util.function.ToLongFunction; public class EventWindowSort { - private final ConcurrentSkipListMap events = new ConcurrentSkipListMap<>(Comparator.comparingLong((ToLongFunction) value -> value - .toInstant() - .toEpochMilli())); + private final ConcurrentSkipListMap events + = new ConcurrentSkipListMap<>(Comparator.comparingLong(value -> value.toInstant().toEpochMilli())); public void acceptEvent(Event event) { events.put(event.getEventTime(), event.getContent()); @@ -17,14 +15,14 @@ public void acceptEvent(Event event) { public ConcurrentNavigableMap getEventsFromLastMinute() { return events.tailMap(ZonedDateTime - .now() - .minusMinutes(1)); + .now() + .minusMinutes(1)); } public ConcurrentNavigableMap getEventsOlderThatOneMinute() { return events.headMap(ZonedDateTime - .now() - .minusMinutes(1)); + .now() + .minusMinutes(1)); } }