From a8f2e70e0a2718d222a250d15dc4dd91caf2ea20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Wed, 13 Sep 2017 08:22:29 +0300 Subject: [PATCH 001/100] Alter Throttling pattern display name --- throttling/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/throttling/README.md b/throttling/README.md index efc966d04..a9ec69d76 100644 --- a/throttling/README.md +++ b/throttling/README.md @@ -1,6 +1,6 @@ --- layout: pattern -title: Throttling pattern +title: Throttling folder: throttling permalink: /patterns/throttling/ tags: From 263534caab0e507bee38211a33829a2006d4332b Mon Sep 17 00:00:00 2001 From: Gopinath Langote Date: Wed, 13 Sep 2017 22:34:26 +0530 Subject: [PATCH 002/100] #631 - Partial Response : Added module to project. --- partial-response/pom.xml | 15 +++++++++++++++ pom.xml | 3 ++- 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 partial-response/pom.xml diff --git a/partial-response/pom.xml b/partial-response/pom.xml new file mode 100644 index 000000000..0afd5bddc --- /dev/null +++ b/partial-response/pom.xml @@ -0,0 +1,15 @@ + + + + java-design-patterns + com.iluwatar + 1.17.0-SNAPSHOT + + 4.0.0 + + partial-response + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index f2b6b7ccb..59b7cf078 100644 --- a/pom.xml +++ b/pom.xml @@ -146,7 +146,8 @@ event-sourcing data-transfer-object throttling - + partial-response + From 7ca5342819493538708cb59f01426b631b9d6546 Mon Sep 17 00:00:00 2001 From: Gopinath Langote Date: Wed, 13 Sep 2017 22:58:34 +0530 Subject: [PATCH 003/100] #631 - Partial Response : Add video model. --- .../com/iluwatar/partialresponse/Video.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 partial-response/src/main/java/com/iluwatar/partialresponse/Video.java diff --git a/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java b/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java new file mode 100644 index 000000000..656ab091b --- /dev/null +++ b/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java @@ -0,0 +1,55 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2017 Gopinath Langote + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.iluwatar.partialresponse; + +/** + * {@link Video} is a entity to serve from server.It contains all video related information.. + *

+ */ +public class Video { + private String id; + private String title; + private Long length; + private String description; + private String publisher; + private String status; + + /** + * @param id video unique id + * @param title video title + * @param length video length in seconds + * @param description video description by publisher + * @param publisher video publisher name + * @param status video status {private, public} + */ + public Video(String id, String title, Long length, String description, String publisher, String status) { + this.id = id; + this.title = title; + this.length = length; + this.description = description; + this.publisher = publisher; + this.status = status; + } +} From f9d1e9aa3fb649be90c9a2e22312a70558a7726d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Wed, 13 Sep 2017 20:39:31 +0300 Subject: [PATCH 004/100] Update Throttling pattern readme --- throttling/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/throttling/README.md b/throttling/README.md index a9ec69d76..73d982bff 100644 --- a/throttling/README.md +++ b/throttling/README.md @@ -3,15 +3,14 @@ layout: pattern title: Throttling folder: throttling permalink: /patterns/throttling/ +categories: Behavioral tags: - Java - Difficulty-Beginner - - Throttling --- ## Intent Ensure that a given client is not able to access service resources more than the assigned limit. -![alt text](./etc/throttling-patern.png "Throttling pattern") ## Applicability The Throttling pattern should be used: From 2e90f82cabb6c7f50e5330acff6db0b8810c2e79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Wed, 13 Sep 2017 21:07:10 +0300 Subject: [PATCH 005/100] #590 Add explanation for Proxy pattern --- proxy/README.md | 92 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 91 insertions(+), 1 deletion(-) diff --git a/proxy/README.md b/proxy/README.md index 17f23de50..615c02ced 100644 --- a/proxy/README.md +++ b/proxy/README.md @@ -18,7 +18,97 @@ Surrogate Provide a surrogate or placeholder for another object to control access to it. -![alt text](./etc/proxy.png "Proxy") +## Explanation +Real world example + +> Imagine a tower where the local wizards go to study their spells. The ivory tower can only be accessed through a proxy which ensures that only the first three wizards can enter. Here the proxy represents the functionality of the tower and adds access control to it. + +In plain words + +> Using the proxy pattern, a class represents the functionality of another class. + +Wikipedia says + +> A proxy, in its most general form, is a class functioning as an interface to something else. A proxy is a wrapper or agent object that is being called by the client to access the real serving object behind the scenes. Use of the proxy can simply be forwarding to the real object, or can provide additional logic. In the proxy extra functionality can be provided, for example caching when operations on the real object are resource intensive, or checking preconditions before operations on the real object are invoked. + +**Programmatic Example** + +Taking our wizard tower example from above. Firstly we have the wizard tower interface and the ivory tower class + +``` +public interface WizardTower { + + void enter(Wizard wizard); +} + +public class IvoryTower implements WizardTower { + + private static final Logger LOGGER = LoggerFactory.getLogger(IvoryTower.class); + + public void enter(Wizard wizard) { + LOGGER.info("{} enters the tower.", wizard); + } + +} +``` + +Then a simple wizard class + +``` +public class Wizard { + + private final String name; + + public Wizard(String name) { + this.name = name; + } + + @Override + public String toString() { + return name; + } +} +``` + +Then we have the proxy to add access control to wizard tower + +``` +public class WizardTowerProxy implements WizardTower { + + private static final Logger LOGGER = LoggerFactory.getLogger(WizardTowerProxy.class); + + private static final int NUM_WIZARDS_ALLOWED = 3; + + private int numWizards; + + private final WizardTower tower; + + public WizardTowerProxy(WizardTower tower) { + this.tower = tower; + } + + @Override + public void enter(Wizard wizard) { + if (numWizards < NUM_WIZARDS_ALLOWED) { + tower.enter(wizard); + numWizards++; + } else { + LOGGER.info("{} is not allowed to enter!", wizard); + } + } +} +``` + +And here is tower entering scenario + +``` +WizardTowerProxy proxy = new WizardTowerProxy(new IvoryTower()); +proxy.enter(new Wizard("Red wizard")); // Red wizard enters the tower. +proxy.enter(new Wizard("White wizard")); // White wizard enters the tower. +proxy.enter(new Wizard("Black wizard")); // Black wizard enters the tower. +proxy.enter(new Wizard("Green wizard")); // Green wizard is not allowed to enter! +proxy.enter(new Wizard("Brown wizard")); // Brown wizard is not allowed to enter! +``` ## Applicability Proxy is applicable whenever there is a need for a more From 6a560f7d15c21065ed9c823fecb6c635328aecc5 Mon Sep 17 00:00:00 2001 From: "OCN.Yang" Date: Thu, 14 Sep 2017 10:20:20 +0800 Subject: [PATCH 006/100] Delete duplicate declared objects:ClubbedTroll Trolls should not be re-declared: if I had a troll called Zac, one day I gave him a weapon.I can not because he now has a weapon called him Trundle. He is still Zac. --- decorator/README.md | 6 +++--- decorator/src/main/java/com/iluwatar/decorator/App.java | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/decorator/README.md b/decorator/README.md index 5f86166fe..37cfd88df 100644 --- a/decorator/README.md +++ b/decorator/README.md @@ -105,9 +105,9 @@ troll.attack(); // The troll tries to grab you! troll.fleeBattle(); // The troll shrieks in horror and runs away! // change the behavior of the simple troll by adding a decorator -Troll clubbed = new ClubbedTroll(troll); -clubbed.attack(); // The troll tries to grab you! The troll swings at you with a club! -clubbed.fleeBattle(); // The troll shrieks in horror and runs away! +troll = new ClubbedTroll(troll); +troll.attack(); // The troll tries to grab you! The troll swings at you with a club! +troll.fleeBattle(); // The troll shrieks in horror and runs away! ``` ## Applicability diff --git a/decorator/src/main/java/com/iluwatar/decorator/App.java b/decorator/src/main/java/com/iluwatar/decorator/App.java index 14cb8aa89..5b072b9c2 100644 --- a/decorator/src/main/java/com/iluwatar/decorator/App.java +++ b/decorator/src/main/java/com/iluwatar/decorator/App.java @@ -57,9 +57,9 @@ public class App { // change the behavior of the simple troll by adding a decorator LOGGER.info("A troll with huge club surprises you."); - Troll clubbed = new ClubbedTroll(troll); - clubbed.attack(); - clubbed.fleeBattle(); - LOGGER.info("Clubbed troll power {}.\n", clubbed.getAttackPower()); + troll = new ClubbedTroll(troll); + troll.attack(); + troll.fleeBattle(); + LOGGER.info("Clubbed troll power {}.\n", troll.getAttackPower()); } } From 5828ef9dd144b7c3c298f875806aa641135137be Mon Sep 17 00:00:00 2001 From: Gopinath Langote Date: Thu, 14 Sep 2017 10:08:56 +0530 Subject: [PATCH 007/100] #631 - Partial Response : Get video details by id. --- .../java/com/iluwatar/partialresponse/VideoResource.java | 4 ++++ .../java/com/iluwatar/partialresponse/VideoResourceTest.java | 5 +++++ 2 files changed, 9 insertions(+) create mode 100644 partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java create mode 100644 partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java diff --git a/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java b/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java new file mode 100644 index 000000000..c3d526187 --- /dev/null +++ b/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java @@ -0,0 +1,4 @@ +package com.iluwatar.partialresponse; + +public class VideoResource { +} diff --git a/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java b/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java new file mode 100644 index 000000000..cd304c81d --- /dev/null +++ b/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java @@ -0,0 +1,5 @@ +import static org.junit.Assert.*; + +public class VideoResourceTest { + +} \ No newline at end of file From f38119c565d9e5c46c3437fbc4b6ecda094515d2 Mon Sep 17 00:00:00 2001 From: Gopinath Langote Date: Thu, 14 Sep 2017 10:09:02 +0530 Subject: [PATCH 008/100] #631 - Partial Response : Get video details by id. --- partial-response/pom.xml | 6 +++ .../com/iluwatar/partialresponse/Video.java | 12 +++++ .../partialresponse/VideoResource.java | 35 ++++++++++++++ .../partialresponse/VideoResourceTest.java | 47 ++++++++++++++++++- 4 files changed, 99 insertions(+), 1 deletion(-) diff --git a/partial-response/pom.xml b/partial-response/pom.xml index 0afd5bddc..e4f4db4ae 100644 --- a/partial-response/pom.xml +++ b/partial-response/pom.xml @@ -10,6 +10,12 @@ 4.0.0 partial-response + + + junit + junit + + \ No newline at end of file diff --git a/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java b/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java index 656ab091b..2879b96ed 100644 --- a/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java +++ b/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java @@ -52,4 +52,16 @@ public class Video { this.publisher = publisher; this.status = status; } + + @Override + public String toString() { + return "Video{" + + "id='" + id + '\'' + + ", title='" + title + '\'' + + ", length=" + length + + ", description='" + description + '\'' + + ", publisher='" + publisher + '\'' + + ", status='" + status + '\'' + + '}'; + } } diff --git a/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java b/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java index c3d526187..546377b16 100644 --- a/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java +++ b/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java @@ -1,4 +1,39 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2017 Gopinath Langote + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + package com.iluwatar.partialresponse; +import java.util.Map; + public class VideoResource { + private Map videos; + + public VideoResource(Map videos) { + this.videos = videos; + } + + public String getDenials(String id) { + return videos.get(id).toString(); + } } diff --git a/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java b/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java index cd304c81d..43d670f9f 100644 --- a/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java +++ b/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java @@ -1,5 +1,50 @@ -import static org.junit.Assert.*; +/* + * The MIT License (MIT) + * + * Copyright (c) 2017 Gopinath Langote + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.iluwatar.partialresponse; + +import org.junit.Before; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; public class VideoResourceTest { + private VideoResource resource; + @Before + public void setUp() { + Map videos = new HashMap<>(); + videos.put("1", new Video("1", "title 1", 100L, "", "", "")); + videos.put("1", new Video("2", "title 2", 100L, "", "", "")); + videos.put("1", new Video("3", "title 3", 100L, "", "", "")); + resource = new VideoResource(videos); + } + + @Test + public void shouldGiveVideoDetailsById() { + String details = resource.getDenials("1"); + System.out.println(details); + } } \ No newline at end of file From 87d485384630d4e8a525ddef24359651d509488a Mon Sep 17 00:00:00 2001 From: Gopinath Langote Date: Thu, 14 Sep 2017 18:47:46 +0530 Subject: [PATCH 009/100] #631 - Partial Response : [Refactor] Rename GetDetails method by id. --- .../main/java/com/iluwatar/partialresponse/VideoResource.java | 2 +- .../java/com/iluwatar/partialresponse/VideoResourceTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java b/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java index 546377b16..fb95e05c7 100644 --- a/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java +++ b/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java @@ -33,7 +33,7 @@ public class VideoResource { this.videos = videos; } - public String getDenials(String id) { + public String getDetails(String id) { return videos.get(id).toString(); } } diff --git a/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java b/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java index 43d670f9f..6f3524611 100644 --- a/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java +++ b/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java @@ -44,7 +44,7 @@ public class VideoResourceTest { @Test public void shouldGiveVideoDetailsById() { - String details = resource.getDenials("1"); + String details = resource.getDetails("1"); System.out.println(details); } } \ No newline at end of file From b7dbb4049c853ba66a5262831100aca0cabc9935 Mon Sep 17 00:00:00 2001 From: Gopinath Langote Date: Thu, 14 Sep 2017 19:15:44 +0530 Subject: [PATCH 010/100] #631 - Partial Response : [Refactor] Modify video model fields. --- .../com/iluwatar/partialresponse/Video.java | 22 +++++++++---------- .../partialresponse/VideoResourceTest.java | 6 ++--- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java b/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java index 2879b96ed..3717d8db2 100644 --- a/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java +++ b/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java @@ -31,26 +31,26 @@ package com.iluwatar.partialresponse; public class Video { private String id; private String title; - private Long length; + private Integer length; private String description; - private String publisher; - private String status; + private String director; + private String language; /** * @param id video unique id * @param title video title - * @param length video length in seconds + * @param length video length in minutes * @param description video description by publisher - * @param publisher video publisher name - * @param status video status {private, public} + * @param director video director name + * @param language video language {private, public} */ - public Video(String id, String title, Long length, String description, String publisher, String status) { + public Video(String id, String title, Integer length, String description, String director, String language) { this.id = id; this.title = title; this.length = length; this.description = description; - this.publisher = publisher; - this.status = status; + this.director = director; + this.language = language; } @Override @@ -60,8 +60,8 @@ public class Video { ", title='" + title + '\'' + ", length=" + length + ", description='" + description + '\'' + - ", publisher='" + publisher + '\'' + - ", status='" + status + '\'' + + ", director='" + director + '\'' + + ", language='" + language + '\'' + '}'; } } diff --git a/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java b/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java index 6f3524611..67d34edba 100644 --- a/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java +++ b/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java @@ -36,9 +36,9 @@ public class VideoResourceTest { @Before public void setUp() { Map videos = new HashMap<>(); - videos.put("1", new Video("1", "title 1", 100L, "", "", "")); - videos.put("1", new Video("2", "title 2", 100L, "", "", "")); - videos.put("1", new Video("3", "title 3", 100L, "", "", "")); + videos.put("1", new Video("1", "Avatar", 178, "epic science fiction film", "James Cameron", "English")); + videos.put("1", new Video("2", "Godzilla Resurgence", 120, "Action & drama movie|", "Hideaki Anno", "Japanese")); + videos.put("1", new Video("3", "Interstellar", 169, "Adventure & Sci-Fi", "Christopher Nolan", "English")); resource = new VideoResource(videos); } From a0c081f5eabc58432c7a58044d9d0593c9cade68 Mon Sep 17 00:00:00 2001 From: Gopinath Langote Date: Thu, 14 Sep 2017 19:27:46 +0530 Subject: [PATCH 011/100] #631 - Partial Response : Return video details as json string. --- .../com/iluwatar/partialresponse/Video.java | 23 +++++++++---------- .../partialresponse/VideoResource.java | 6 ++--- .../partialresponse/VideoResourceTest.java | 16 ++++++++----- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java b/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java index 3717d8db2..de6239911 100644 --- a/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java +++ b/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java @@ -29,7 +29,7 @@ package com.iluwatar.partialresponse; *

*/ public class Video { - private String id; + private Integer id; private String title; private Integer length; private String description; @@ -41,10 +41,10 @@ public class Video { * @param title video title * @param length video length in minutes * @param description video description by publisher - * @param director video director name - * @param language video language {private, public} + * @param director video director name + * @param language video language {private, public} */ - public Video(String id, String title, Integer length, String description, String director, String language) { + public Video(Integer id, String title, Integer length, String description, String director, String language) { this.id = id; this.title = title; this.length = length; @@ -55,13 +55,12 @@ public class Video { @Override public String toString() { - return "Video{" + - "id='" + id + '\'' + - ", title='" + title + '\'' + - ", length=" + length + - ", description='" + description + '\'' + - ", director='" + director + '\'' + - ", language='" + language + '\'' + - '}'; + return "{" + + "\"id\": \"" + id + "\"," + + "\"title\": \"" + title + "\"," + + "\"description\": \"" + description + "\"," + + "\"director\": \"" + director + "\"," + + "\"language\": \"" + language + "\"," + + "}"; } } diff --git a/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java b/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java index fb95e05c7..b233c42d3 100644 --- a/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java +++ b/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java @@ -27,13 +27,13 @@ package com.iluwatar.partialresponse; import java.util.Map; public class VideoResource { - private Map videos; + private Map videos; - public VideoResource(Map videos) { + public VideoResource(Map videos) { this.videos = videos; } - public String getDetails(String id) { + public String getDetails(Integer id) { return videos.get(id).toString(); } } diff --git a/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java b/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java index 67d34edba..4fcf2b718 100644 --- a/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java +++ b/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java @@ -30,21 +30,25 @@ import org.junit.Test; import java.util.HashMap; import java.util.Map; +import static org.junit.Assert.assertEquals; + public class VideoResourceTest { private VideoResource resource; @Before public void setUp() { - Map videos = new HashMap<>(); - videos.put("1", new Video("1", "Avatar", 178, "epic science fiction film", "James Cameron", "English")); - videos.put("1", new Video("2", "Godzilla Resurgence", 120, "Action & drama movie|", "Hideaki Anno", "Japanese")); - videos.put("1", new Video("3", "Interstellar", 169, "Adventure & Sci-Fi", "Christopher Nolan", "English")); + Map videos = new HashMap<>(); + videos.put(1, new Video(1, "Avatar", 178, "epic science fiction film", "James Cameron", "English")); + videos.put(2, new Video(2, "Godzilla Resurgence", 120, "Action & drama movie|", "Hideaki Anno", "Japanese")); + videos.put(3, new Video(3, "Interstellar", 169, "Adventure & Sci-Fi", "Christopher Nolan", "English")); resource = new VideoResource(videos); } @Test public void shouldGiveVideoDetailsById() { - String details = resource.getDetails("1"); - System.out.println(details); + String details = resource.getDetails(1); + + String expectedDetails = "{\"id\": \"1\",\"title\": \"Avatar\",\"description\": \"epic science fiction film\",\"director\": \"James Cameron\",\"language\": \"English\",}"; + assertEquals(details, expectedDetails); } } \ No newline at end of file From d0ad0f7ea93c18f9a9ea79758d6dc91372a1517c Mon Sep 17 00:00:00 2001 From: Gopinath Langote Date: Thu, 14 Sep 2017 19:35:52 +0530 Subject: [PATCH 012/100] #631 - Partial Response : Add missing length in video details --- .../src/main/java/com/iluwatar/partialresponse/Video.java | 1 + .../java/com/iluwatar/partialresponse/VideoResourceTest.java | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java b/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java index de6239911..d8d80fd00 100644 --- a/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java +++ b/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java @@ -58,6 +58,7 @@ public class Video { return "{" + "\"id\": \"" + id + "\"," + "\"title\": \"" + title + "\"," + + "\"length\": " + length + "," + "\"description\": \"" + description + "\"," + "\"director\": \"" + director + "\"," + "\"language\": \"" + language + "\"," + diff --git a/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java b/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java index 4fcf2b718..329b10087 100644 --- a/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java +++ b/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java @@ -48,7 +48,7 @@ public class VideoResourceTest { public void shouldGiveVideoDetailsById() { String details = resource.getDetails(1); - String expectedDetails = "{\"id\": \"1\",\"title\": \"Avatar\",\"description\": \"epic science fiction film\",\"director\": \"James Cameron\",\"language\": \"English\",}"; - assertEquals(details, expectedDetails); + String expectedDetails = "{\"id\": \"1\",\"title\": \"Avatar\",\"length\": 178,\"description\": \"epic science fiction film\",\"director\": \"James Cameron\",\"language\": \"English\",}"; + assertEquals(expectedDetails, details); } } \ No newline at end of file From 6d3dce065d14c24dde2342c5ccdb031ef4132c63 Mon Sep 17 00:00:00 2001 From: Gopinath Langote Date: Thu, 14 Sep 2017 19:45:56 +0530 Subject: [PATCH 013/100] #631 - Partial Response : Get specified fields response. --- partial-response/pom.xml | 4 +++ .../partialresponse/FieldJsonMapper.java | 31 +++++++++++++++++++ .../partialresponse/VideoResource.java | 11 +++++-- .../partialresponse/VideoResourceTest.java | 28 +++++++++++++++-- 4 files changed, 68 insertions(+), 6 deletions(-) create mode 100644 partial-response/src/main/java/com/iluwatar/partialresponse/FieldJsonMapper.java diff --git a/partial-response/pom.xml b/partial-response/pom.xml index e4f4db4ae..7ce36ecec 100644 --- a/partial-response/pom.xml +++ b/partial-response/pom.xml @@ -15,6 +15,10 @@ junit junit + + org.mockito + mockito-core + diff --git a/partial-response/src/main/java/com/iluwatar/partialresponse/FieldJsonMapper.java b/partial-response/src/main/java/com/iluwatar/partialresponse/FieldJsonMapper.java new file mode 100644 index 000000000..32e9ae83d --- /dev/null +++ b/partial-response/src/main/java/com/iluwatar/partialresponse/FieldJsonMapper.java @@ -0,0 +1,31 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2017 Gopinath Langote + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.iluwatar.partialresponse; + +public class FieldJsonMapper { + public String toJson(Video video, String[] fields) { + return null; + } +} diff --git a/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java b/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java index b233c42d3..8c571e6d6 100644 --- a/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java +++ b/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java @@ -27,13 +27,18 @@ package com.iluwatar.partialresponse; import java.util.Map; public class VideoResource { + private FieldJsonMapper fieldJsonMapper; private Map videos; - public VideoResource(Map videos) { + public VideoResource(FieldJsonMapper fieldJsonMapper, Map videos) { + this.fieldJsonMapper = fieldJsonMapper; this.videos = videos; } - public String getDetails(Integer id) { - return videos.get(id).toString(); + public String getDetails(Integer id, String... fields) { + if (fields.length == 0) { + return videos.get(id).toString(); + } + return fieldJsonMapper.toJson(videos.get(id), fields); } } diff --git a/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java b/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java index 329b10087..df25c2dea 100644 --- a/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java +++ b/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java @@ -26,13 +26,23 @@ package com.iluwatar.partialresponse; import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; import java.util.HashMap; import java.util.Map; import static org.junit.Assert.assertEquals; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.when; +@RunWith(MockitoJUnitRunner.class) public class VideoResourceTest { + @Mock + private FieldJsonMapper fieldJsonMapper; + private VideoResource resource; @Before @@ -41,14 +51,26 @@ public class VideoResourceTest { videos.put(1, new Video(1, "Avatar", 178, "epic science fiction film", "James Cameron", "English")); videos.put(2, new Video(2, "Godzilla Resurgence", 120, "Action & drama movie|", "Hideaki Anno", "Japanese")); videos.put(3, new Video(3, "Interstellar", 169, "Adventure & Sci-Fi", "Christopher Nolan", "English")); - resource = new VideoResource(videos); + resource = new VideoResource(fieldJsonMapper, videos); } @Test public void shouldGiveVideoDetailsById() { - String details = resource.getDetails(1); + String actualDetails = resource.getDetails(1); String expectedDetails = "{\"id\": \"1\",\"title\": \"Avatar\",\"length\": 178,\"description\": \"epic science fiction film\",\"director\": \"James Cameron\",\"language\": \"English\",}"; - assertEquals(expectedDetails, details); + assertEquals(expectedDetails, actualDetails); + } + + @Test + public void shouldGiveSpecifiedFieldsInformationOfVideo() { + String[] fields = new String[]{"title", "length"}; + + String expectedDetails = "{\"id\": \"1\",\"title\": \"Avatar\",\"length\": 178}"; + when(fieldJsonMapper.toJson(any(Video.class), eq(fields))).thenReturn(expectedDetails); + + String actualFieldsDetails = resource.getDetails(2, fields); + + assertEquals(expectedDetails, actualFieldsDetails); } } \ No newline at end of file From c89bf0eb44d905c1d0322af41c3c44d863573d0a Mon Sep 17 00:00:00 2001 From: Gopinath Langote Date: Thu, 14 Sep 2017 21:50:40 +0530 Subject: [PATCH 014/100] #631 - Partial Response : Add java doc --- .../partialresponse/FieldJsonMapper.java | 9 +++++++++ .../com/iluwatar/partialresponse/Video.java | 19 +++++++++++-------- .../partialresponse/VideoResource.java | 13 +++++++++++++ .../partialresponse/VideoResourceTest.java | 6 +++++- 4 files changed, 38 insertions(+), 9 deletions(-) diff --git a/partial-response/src/main/java/com/iluwatar/partialresponse/FieldJsonMapper.java b/partial-response/src/main/java/com/iluwatar/partialresponse/FieldJsonMapper.java index 32e9ae83d..dce164f0d 100644 --- a/partial-response/src/main/java/com/iluwatar/partialresponse/FieldJsonMapper.java +++ b/partial-response/src/main/java/com/iluwatar/partialresponse/FieldJsonMapper.java @@ -24,7 +24,16 @@ package com.iluwatar.partialresponse; +/** + * Map a video to json + */ public class FieldJsonMapper { + + /** + * @param video object containing video information + * @param fields fields information to get + * @return json of required fields from video + */ public String toJson(Video video, String[] fields) { return null; } diff --git a/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java b/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java index d8d80fd00..7310f26b0 100644 --- a/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java +++ b/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java @@ -53,15 +53,18 @@ public class Video { this.language = language; } + /** + * @return json representaion of video + */ @Override public String toString() { - return "{" + - "\"id\": \"" + id + "\"," + - "\"title\": \"" + title + "\"," + - "\"length\": " + length + "," + - "\"description\": \"" + description + "\"," + - "\"director\": \"" + director + "\"," + - "\"language\": \"" + language + "\"," + - "}"; + return "{" + + "\"id\": \"" + id + "\"," + + "\"title\": \"" + title + "\"," + + "\"length\": " + length + "," + + "\"description\": \"" + description + "\"," + + "\"director\": \"" + director + "\"," + + "\"language\": \"" + language + "\"," + + "}"; } } diff --git a/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java b/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java index 8c571e6d6..457ecec00 100644 --- a/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java +++ b/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java @@ -26,15 +26,28 @@ package com.iluwatar.partialresponse; import java.util.Map; +/** + * The resource class which serves video information. + * This class act as server in the demo. Which has all video details. + */ public class VideoResource { private FieldJsonMapper fieldJsonMapper; private Map videos; + /** + * @param fieldJsonMapper map object to json. + * @param videos initialize resource with existing videos. Act as database. + */ public VideoResource(FieldJsonMapper fieldJsonMapper, Map videos) { this.fieldJsonMapper = fieldJsonMapper; this.videos = videos; } + /** + * @param id video id + * @param fields fields to get information about + * @return json of specified fields of particular video by id + */ public String getDetails(Integer id, String... fields) { if (fields.length == 0) { return videos.get(id).toString(); diff --git a/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java b/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java index df25c2dea..d420863a8 100644 --- a/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java +++ b/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java @@ -38,6 +38,9 @@ import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.when; +/** + * tests {@link VideoResource}. + */ @RunWith(MockitoJUnitRunner.class) public class VideoResourceTest { @Mock @@ -58,7 +61,8 @@ public class VideoResourceTest { public void shouldGiveVideoDetailsById() { String actualDetails = resource.getDetails(1); - String expectedDetails = "{\"id\": \"1\",\"title\": \"Avatar\",\"length\": 178,\"description\": \"epic science fiction film\",\"director\": \"James Cameron\",\"language\": \"English\",}"; + String expectedDetails = "{\"id\": \"1\",\"title\": \"Avatar\",\"length\": 178,\"description\": " + + "\"epic science fiction film\",\"director\": \"James Cameron\",\"language\": \"English\",}"; assertEquals(expectedDetails, actualDetails); } From c5b9c63b39a5948a50795740be28450cdd436172 Mon Sep 17 00:00:00 2001 From: Gopinath Langote Date: Thu, 14 Sep 2017 21:52:07 +0530 Subject: [PATCH 015/100] #631 - Partial Response : Add puml file --- .../etc/partial-response.urm.puml | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 partial-response/etc/partial-response.urm.puml diff --git a/partial-response/etc/partial-response.urm.puml b/partial-response/etc/partial-response.urm.puml new file mode 100644 index 000000000..8331ad086 --- /dev/null +++ b/partial-response/etc/partial-response.urm.puml @@ -0,0 +1,25 @@ +@startuml +package com.iluwatar.partialresponse { + class FieldJsonMapper { + + FieldJsonMapper() + + toJson(video : Video, fields : String[]) : String + } + class Video { + - description : String + - director : String + - id : Integer + - language : String + - length : Integer + - title : String + + Video(id : Integer, title : String, length : Integer, description : String, director : String, language : String) + + toString() : String + } + class VideoResource { + - fieldJsonMapper : FieldJsonMapper + - videos : Map + + VideoResource(fieldJsonMapper : FieldJsonMapper, videos : Map) + + getDetails(id : Integer, fields : String[]) : String + } +} +VideoResource --> "-fieldJsonMapper" FieldJsonMapper +@enduml \ No newline at end of file From 44e4b3c803178304e56eeecbf741c3758ec98532 Mon Sep 17 00:00:00 2001 From: Gopinath Langote Date: Thu, 14 Sep 2017 22:34:02 +0530 Subject: [PATCH 016/100] #631 - Partial Response : Implement Field to json conversion --- .../partialresponse/FieldJsonMapper.java | 24 ++++++++- .../com/iluwatar/partialresponse/Video.java | 2 +- .../partialresponse/VideoResource.java | 2 +- .../partialresponse/FieldJsonMapperTest.java | 53 +++++++++++++++++++ .../partialresponse/VideoResourceTest.java | 10 ++-- 5 files changed, 82 insertions(+), 9 deletions(-) create mode 100644 partial-response/src/test/java/com/iluwatar/partialresponse/FieldJsonMapperTest.java diff --git a/partial-response/src/main/java/com/iluwatar/partialresponse/FieldJsonMapper.java b/partial-response/src/main/java/com/iluwatar/partialresponse/FieldJsonMapper.java index dce164f0d..8a8ae087a 100644 --- a/partial-response/src/main/java/com/iluwatar/partialresponse/FieldJsonMapper.java +++ b/partial-response/src/main/java/com/iluwatar/partialresponse/FieldJsonMapper.java @@ -24,6 +24,8 @@ package com.iluwatar.partialresponse; +import java.lang.reflect.Field; + /** * Map a video to json */ @@ -34,7 +36,25 @@ public class FieldJsonMapper { * @param fields fields information to get * @return json of required fields from video */ - public String toJson(Video video, String[] fields) { - return null; + public String toJson(Video video, String[] fields) throws Exception { + StringBuilder json = new StringBuilder().append("{"); + + for (int i = 0, fieldsLength = fields.length; i < fieldsLength; i++) { + json.append(getString(video, Video.class.getDeclaredField(fields[i]))); + if (i != fieldsLength - 1) { + json.append(","); + } + } + json.append("}"); + return json.toString(); + } + + private String getString(Video video, Field declaredField) throws IllegalAccessException { + declaredField.setAccessible(true); + Object value = declaredField.get(video); + if (declaredField.get(video) instanceof Integer) { + return "\"" + declaredField.getName() + "\"" + ": " + value; + } + return "\"" + declaredField.getName() + "\"" + ": " + "\"" + value.toString() + "\""; } } diff --git a/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java b/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java index 7310f26b0..d5d56f4fd 100644 --- a/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java +++ b/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java @@ -59,7 +59,7 @@ public class Video { @Override public String toString() { return "{" - + "\"id\": \"" + id + "\"," + + "\"id\": " + id + "," + "\"title\": \"" + title + "\"," + "\"length\": " + length + "," + "\"description\": \"" + description + "\"," diff --git a/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java b/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java index 457ecec00..ed5bc4db3 100644 --- a/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java +++ b/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java @@ -48,7 +48,7 @@ public class VideoResource { * @param fields fields to get information about * @return json of specified fields of particular video by id */ - public String getDetails(Integer id, String... fields) { + public String getDetails(Integer id, String... fields) throws Exception { if (fields.length == 0) { return videos.get(id).toString(); } diff --git a/partial-response/src/test/java/com/iluwatar/partialresponse/FieldJsonMapperTest.java b/partial-response/src/test/java/com/iluwatar/partialresponse/FieldJsonMapperTest.java new file mode 100644 index 000000000..d8ddd5881 --- /dev/null +++ b/partial-response/src/test/java/com/iluwatar/partialresponse/FieldJsonMapperTest.java @@ -0,0 +1,53 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2017 Gopinath Langote + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.iluwatar.partialresponse; + +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * tests {@link FieldJsonMapper}. + */ +public class FieldJsonMapperTest { + private FieldJsonMapper mapper; + + @Before + public void setUp() { + mapper = new FieldJsonMapper(); + } + + @Test + public void shouldReturnJsonForSpecifiedFieldsInVideo() throws Exception { + String[] fields = new String[]{"id", "title", "length"}; + Video video = new Video(2, "Godzilla Resurgence", 120, "Action & drama movie|", "Hideaki Anno", "Japanese"); + + String jsonFieldResponse = mapper.toJson(video, fields); + + String expectedDetails = "{\"id\": 2,\"title\": \"Godzilla Resurgence\",\"length\": 120}"; + assertEquals(expectedDetails, jsonFieldResponse); + } +} \ No newline at end of file diff --git a/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java b/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java index d420863a8..1415e77b2 100644 --- a/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java +++ b/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java @@ -58,19 +58,19 @@ public class VideoResourceTest { } @Test - public void shouldGiveVideoDetailsById() { + public void shouldGiveVideoDetailsById() throws Exception { String actualDetails = resource.getDetails(1); - String expectedDetails = "{\"id\": \"1\",\"title\": \"Avatar\",\"length\": 178,\"description\": " + String expectedDetails = "{\"id\": 1,\"title\": \"Avatar\",\"length\": 178,\"description\": " + "\"epic science fiction film\",\"director\": \"James Cameron\",\"language\": \"English\",}"; assertEquals(expectedDetails, actualDetails); } @Test - public void shouldGiveSpecifiedFieldsInformationOfVideo() { - String[] fields = new String[]{"title", "length"}; + public void shouldGiveSpecifiedFieldsInformationOfVideo() throws Exception { + String[] fields = new String[]{"id", "title", "length"}; - String expectedDetails = "{\"id\": \"1\",\"title\": \"Avatar\",\"length\": 178}"; + String expectedDetails = "{\"id\": 1,\"title\": \"Avatar\",\"length\": 178}"; when(fieldJsonMapper.toJson(any(Video.class), eq(fields))).thenReturn(expectedDetails); String actualFieldsDetails = resource.getDetails(2, fields); From 711f3faf675d9ff52bf21ddb111ea383f3a79f97 Mon Sep 17 00:00:00 2001 From: Gopinath Langote Date: Thu, 14 Sep 2017 22:51:16 +0530 Subject: [PATCH 017/100] #631 - Partial Response : Implement video partial response consuming client. --- .../partialresponse/VideoClientApp.java | 75 +++++++++++++++++++ .../partialresponse/VideoResource.java | 2 +- 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 partial-response/src/main/java/com/iluwatar/partialresponse/VideoClientApp.java diff --git a/partial-response/src/main/java/com/iluwatar/partialresponse/VideoClientApp.java b/partial-response/src/main/java/com/iluwatar/partialresponse/VideoClientApp.java new file mode 100644 index 000000000..af1d48029 --- /dev/null +++ b/partial-response/src/main/java/com/iluwatar/partialresponse/VideoClientApp.java @@ -0,0 +1,75 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2017 Gopinath Langote + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.iluwatar.partialresponse; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.Map; + +/** + * The Partial response pattern is a design pattern in which client specifies fields to fetch to serve. + * Here {@link VideoClientApp} is playing as client for {@link VideoResource} server. + * Client ask for specific fields information in video to server. + *

+ *

+ * {@link VideoResource} act as server to serve video information. + */ + +public class VideoClientApp { + private static final Logger LOGGER = LoggerFactory.getLogger(VideoClientApp.class); + + /** + * Method as act client and request to server for video details. + * + * @param args program argument. + */ + public static void main(String[] args) throws Exception { + Map videos = new HashMap<>(); + videos.put(1, new Video(1, "Avatar", 178, "epic science fiction film", "James Cameron", "English")); + videos.put(2, new Video(2, "Godzilla Resurgence", 120, "Action & drama movie|", "Hideaki Anno", "Japanese")); + videos.put(3, new Video(3, "Interstellar", 169, "Adventure & Sci-Fi", "Christopher Nolan", "English")); + FieldJsonMapper fieldJsonMapper = new FieldJsonMapper(); + VideoResource videoResource = new VideoResource(fieldJsonMapper, videos); + + + LOGGER.info("Retrieving full response from server:-"); + LOGGER.info("Get all video information:"); + String videoDetails = videoResource.getDetails(1); + LOGGER.info(videoDetails); + + LOGGER.info("----------------------------------------------------------"); + + LOGGER.info("Retrieving partial response from server:-"); + LOGGER.info("Get video @id, @title, @director:"); + String specificFieldsDetails = videoResource.getDetails(3, "id", "title", "director"); + LOGGER.info(specificFieldsDetails); + + LOGGER.info("Get video @id, @length:"); + String videoLength = videoResource.getDetails(3, "id", "length"); + LOGGER.info(videoLength); + } +} diff --git a/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java b/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java index ed5bc4db3..fefb7277c 100644 --- a/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java +++ b/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java @@ -46,7 +46,7 @@ public class VideoResource { /** * @param id video id * @param fields fields to get information about - * @return json of specified fields of particular video by id + * @return full response if no fields specified else partial response for given field. */ public String getDetails(Integer id, String... fields) throws Exception { if (fields.length == 0) { From fb3a998c04d344b8e0b668c8960d3eddbda1d4d9 Mon Sep 17 00:00:00 2001 From: Gopinath Langote Date: Thu, 14 Sep 2017 22:52:29 +0530 Subject: [PATCH 018/100] #631 - Partial Response : Modified puml digram --- partial-response/etc/partial-response.urm.puml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/partial-response/etc/partial-response.urm.puml b/partial-response/etc/partial-response.urm.puml index 8331ad086..69efd0454 100644 --- a/partial-response/etc/partial-response.urm.puml +++ b/partial-response/etc/partial-response.urm.puml @@ -2,6 +2,7 @@ package com.iluwatar.partialresponse { class FieldJsonMapper { + FieldJsonMapper() + - getString(video : Video, declaredField : Field) : String + toJson(video : Video, fields : String[]) : String } class Video { @@ -14,6 +15,11 @@ package com.iluwatar.partialresponse { + Video(id : Integer, title : String, length : Integer, description : String, director : String, language : String) + toString() : String } + class VideoClientApp { + - LOGGER : Logger {static} + + VideoClientApp() + + main(args : String[]) {static} + } class VideoResource { - fieldJsonMapper : FieldJsonMapper - videos : Map From 91048a49b47168a137283f1d58fc6d300081fa2f Mon Sep 17 00:00:00 2001 From: Gopinath Langote Date: Thu, 14 Sep 2017 23:07:40 +0530 Subject: [PATCH 019/100] #631 - Partial Response : Add Readme. --- partial-response/README.md | 29 ++++++++++++++++++ partial-response/etc/partial-response.urm.png | Bin 0 -> 27781 bytes 2 files changed, 29 insertions(+) create mode 100644 partial-response/README.md create mode 100644 partial-response/etc/partial-response.urm.png diff --git a/partial-response/README.md b/partial-response/README.md new file mode 100644 index 000000000..5d03cb359 --- /dev/null +++ b/partial-response/README.md @@ -0,0 +1,29 @@ +--- +layout: pattern +title: Partial Response +folder: partial-response +permalink: /patterns/partial-response/ +categories: Architectural +tags: + - Java + - KISS + - YAGNI + - Difficulty-Beginner +--- + +## Intent +Send partial response from server to client on need basis. Client will specify the the fields +that it need to server, instead of serving all details for resource. + +![alt text](./etc/partial-response.urm.png "partial-response") + +## Applicability +Use the Partial Response pattern when + +* Client need only subset of data from resource. +* To avoid too much data transfer over wire + +## Credits + +* [Common Design Patterns](https://cloud.google.com/apis/design/design_patterns) +* [Partial Response in RESTful API Design](http://yaoganglian.com/2013/07/01/partial-response/) diff --git a/partial-response/etc/partial-response.urm.png b/partial-response/etc/partial-response.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..17dbd5f1b60df743f40c23a87deb70bc8d952806 GIT binary patch literal 27781 zcmdqIg;$ho+cu8D20;W1kQ7jm2I*E(KtS4|kr)`dJ48Z6x}>{7V(1zHrMpW)I)?82 zT?2bR`+48*_x%IkEY@Py%suyg#TmzOoag2LPF4a3iwFx14Gl-~ji>?|8oCV{+6{Ni zo8S|wrIV?Fp)Hz(fw_UTuC0Oo(+^Hhjcjc#d6}6lO?Ay}?aWM> z^eoKov+$6hq1~i#R(fyy&*x}pj`2Qb7(JS+Wa zR{xb%>GY5PSXk)1slgs%Q@=%0FBt!B$^OPhU5!h9zb~!g;+Vf;(Gh|4{SPsRjw%<1 z-g{WWJROf#g|Py+4u9VG%$CV9Y1tW874@O*%S~mR8}Vf~M)E$QDX@piYou>P(Y&DW zE)#Hj6Cy?THur7yciCXA)ve5;&~g}`lisI&!J~=8xu4OW{?MiLJ;BQhddz$`I#o=J zP?eB4hZn8l#N4Ohk+MxRYiN|cEpq0r7|h-N;ax5W-${PdQa$ySdZ>F=>g6=k*>`tD zUO!)_T}4y{4ObgC)^62{dsG^eU4{dX4H)%f)o?=+?gncIsf{mHxirUH&AyBzD@5Aa z$GQ5bMbS0iI?P-^6q(gh7wrTXq^`-GRw*kp2YYjpY}90&a|LWnJZsWU)8!v1D68Lu zI0v2H^OE))NPdnio!EQ)CH*8N!9}ggNrOozKuX=?uJh7)LnT+GWtze(Z}dGsmSw** zU2c-5xu)9;8$289?l<_RyiNM|mDD~tb;p}M$(Pb~45AoiKGa=#&2Gk|OINNT89LCO zaO@1hXizmy6^^Al`XjRCL!7Fbjy>E_y<9y^7}jc4csb|#h#yD1o3u;s@*I~bZJW_Xw#HRG~Oa4XJ#2Q7}M+nP)P8~rc^0ll`Ui3ruoqc@RS={@d&FaPl z7K6^xk64KUiSo7|_&>dw`Z|F5^@pF>qSo8<&xXlL@5nIjE17+`lj`PS)xR%$kSO4C zuvmV$xa(Ap+f#JV8Ovc}xCvR~gS+Q7A%LAj;G#z*`GYh$$*lKE$s$yS1DI?MF zVTHv~x0m1H4`hHJT&Gp&^0?>6k5@eNot>Sjsi|MSe2I;XJvni9e|kNHcn6BO%DSvT z-yaa8s6S;*szM413iBZkA3U%}j_;pNUta934BY*EeR0vCkLjNS-|j|_^AV3gav{NI z&z?Pf`jnTKmy1i)ZErEo;vNzEi)HGPrCm5GW%2E^f%%Q!+;SGR=9?D!L|U`X)E-bxy$>qC1EN$hbyVgR%=?wSV0sdEsX3~O$R+B(y57%M6WrL!%F6v7;pR?uc4cQS z8Cs_h|MnFD?!d(FQAcoM~_t zz2>_RtqSvm>#0kSyKa44wYdC4fOtpz{e7|UT7wjZx?t=}gD+{C+?q~XGYuXm14$%_ z!ExDiQg7abcpM@pmb4aSB}CryFg3+bJFhW%czCRgUM?_ugg$&m+|H|BZrUeE%A(_W zmKSqV+jZN=cFw?t9>Zt>>j}4Ia>V?}{@S>4m>bXU94BKA)W}S3QKrkLbGCPMJi)s* zzFyAm#t;gTXA4`iO$YQXEiD}qt3$USAs!ewMCqGcu-~dHT&tIl&n*7r!twC%W{hOI z3f{=dMlD3rtHQ|Jyw2$TOBm?6$2H%)`RotZsox>L*uvP|m&t7%>eT!KpINTFYZE0~ z^DOrez5Z-R`dpoCyiH;A(|e&;^s1jvlxp4#D(jXg?)KA(2a(XO1Ph+LxJ7wwh~xc` zUa~W(!X9^nm8A&>+fQCzclqiTFV$@E(^-OsBOXXOd42k1;51sKTY^VK#Or!wd8`_> zKxK#7PbKsAZG={Ztwt9HL1lHxaq*~XXkJVlA2z-XTPK7sk~3Sj{@}z@<&u?^mCdm8 zXgBH7bOBAXTG&+KtvyUj?bli%f@#HJ+Kua@-z7g6wbq&Wrus&^&{FgPp4>UZ#5oVeZTSMn(n+9AdROFO-3CiQ(Hi zu)8mEg2$q45H07G=YNS_&$cuMK4Z)7?X3NKOVfeA+v`_wsaEQ$+{K~CWkr|o+DPFD zC1&gNh?a}l$al>W7Te`_$Mob+h$uadn#em{elr!UFTW>ImVd}rAzAz_PPcm;B4|0| zdAwkS94~V_Jy`L}_(q;At@=5wWNdTrgYl)^F7h$NW_`5yAHO$ZgT4-!A$;;AXCD{k zLZzkbNGe9AG~21YzEdUcPlgWoAN2GLoc33TO3t!`&L!8%R=M~cHsYOGFDyJx<07O2 zu|t9fVPHwsA{v+xX9_M|uMPSO)VUxR9oiQk3=Gz~y<{Hep!tC%(&j&hq4whVXnW2& zDlIit@Zw1CSXJtD+@w$vC-35Ts?O#4gvamrh}WFK0ReDpPbN(YPFiX{4(0+fMmqh= zi}U{&uwi#2!dwuR$Zho@nn`m$&Hemjtdo~kp!&y;AD*6`uRr~jQ*_BV%Mj1!AnP1g z!i@4Eeb@ljxUEcC6^$~1?aYsl2gT>N1Bk*Ij5z6=v-nj8R{sP{CU_ zZ*rQB{_w=SwyLZd2DH%!q@;|hc4}%w|J*d*3y!AKu|5Vb8)N!s8D}2Fqob+Q(bF&F z-n)BuveHWL_3PIlCYqTs4qcB^=Z#{54^5J*!if&9z+SH_8hNV8$aia9KR>_VCv1j) ze)_Mhtbp*Jrgru0AF8zU^d@Z3*%Uvr)$7rqp-sJ2Y^G!%f&iz8d~lbH-|>bgF00u% zdsXhjPIJ|D=$+0)Ciooxg#7)REwxhjb7uGLfbsG1>gwu_Xy%cTk(!8G-PfZ+dvz+d zHX^h?s5mq<1nrK`DJZCOJuZ>v0W-gTm1=_<$brz>-`^h&LOhR6=J)U286=kYe_t@p ztcDQe;i*baPA)Ai1i6CoPZ+Z*7eVHZarM&~6XOjc;WRz*Jc_ESepi5y8yho)I%m5h7Zs`|kbPrj=FT^4%vpx(9qhg-yiAYuSYL^+ zq&Xm&n447TwasNYOtJE7;TIXA@P>Q-Gqo~@1o!=gcr7Z1x`M4PE`ps6DgNklDR{I5 z@4fg(-j?{+h6lYtvDv%toBMm(=_gBhqs6cw0qJR-?8k&Nz7rwtKPgVk%!FGrZk((H z2jW32F^nH}7t!@v?p4T<3%Pr{&bPisO&faSpLy&Mom*X&$JeK=oB7PQ>G4kf+@vm< zneNlRSWKkrEmXk^*HEu*l3xrAR2FcVa=$pc;g$+=_s;!Iu;>2{-l=XXo?p*loP=0i zcX5ZO-+8mYtfNq+rz3BQ{sg(0Q86_o^S~x|2T{DUJ{|7}%apv3j(Qu%wj}BH1>DXV zBc=XA6tkTB zSb@0_FWm&&h4Nk01J{hBJth;wk2$-&IL{jXJiEVxWSjn#4|y2H?4hFG-5JlL*UTL! zk1OCjnJNBuaIiL|f1ipL^-Sq#_0ol+B6S0fGWWv`O`c$2E2z5yCmIy*7WRAZg7|?B zovowH0%YQXiqe^#Qw7X7=4SirqC5G?a=3Tb(^v9d;a<4=u3_A^o&WD;Am+g)#hHRE zKRGrtu4DEP=%D^>_`>^_1HLFNZIk_m1|1RGV#~ojuQonx0;Y)ZC47AQJa@OLD~mvl z0eT~abD(~cW}*dhbnInoT<1_%u*MwKJt)j+&KGtbPAhkGe9Sm@;N{-c7_a(elWf73 zIWm$@@52Te%Tp=*^#pXr?#4)Zi-54Ozw-7BIx=afn>}{gUPAZx~ST-KsfC(8J9 z9IJLlryZv*G;i)HQ3-QnUj=29DVz>ft*h>AzHOzSUI;6A=jhsVu_;J5q44p)g8)+V z@mxPPIbqGxC|O>)u-$Bmgu6=Uj!o`8Fwh=5e4-0?u~d{2 zT*5z_Q`qTKVN+0BV7VNc6p7=eP@cMq*9h6tfW9^%2a$J&_k4egZ_gSyH3c&VK~SLF z^aPF7CA|rW6V~x20cqRRkvKwvUco)6z!R_A%Yhr4yr4aT`lc`@MPaW5B!(LsOd|yM zr^e_spRV@avIyKmvDQY!-QXhe@XJBHx^1?O&9Mzafbg`^Rmv0{greFuNV1zJp0JjK zO(O&iJ?O@TC#Y7Px z1VE1_jbSDxfDXOQLQNM8Cm#JO*Qi*?R$;5)KYrYnusGiqZVk`L%S#&oD-Lde*L}15 z=1wNpA>DvG#C227`W6PvVgrc`f4>cfK2P8}#DgWo4FqX3qw?;H7a?&nc6N3EjU;HH z0w2Xy91S5@);ORSbD*9-bYZs`kFPCQJBUA{8}Ch2^l=&^wt;qctzEu_Ggvma*aMcm}e+!6^1|bCxmI@|+(ysDC&M|lE zW3kgh&0ABSLOWBr4UxHf_Yys;JVPwFvERyeYNVHMGSpUj@k)SsFs#lg)1!VU^{-(q zm3w6>`c&Zt(#yEV=8Cieuwnji%38TJ7XIV;M=-+s(2oZ)rrn2#s; z*>wkcV@&&T0Sf_b^lh+v-tbqaXjS>Z4)CXTvs0|L;>vo&THFg2b!aYwE^vb!jix%V z|KfK{>f)_BCqEsyFbjG)UF*~^THJ&jXbC2#Am_2ho3zL0J&Q|D{y`zKA>_szyc=MN zul9$t@5o>X16}=I`UT}?qJ+b_i}`ph-$SWpnbV{{$WECFYgIA&POSJceOSA5HntfW7cA&1dzfYr} zD1rW${pwWR+Rj4Hs=AKNlHg+^z~G4Z?2kYcHt|<2BunD8duwSK@&_Q5Zu*Xyx*X`tP9XQ~t=?2To*S%zewkPBj7q5;MBPAt2731Ow zf1Y6Pz6slGUm-l)r;%Wt-nwqJdodFI`WH?Q*tel+uly`dGexyx`2UNE&we;J!ny%eY zugHk}Xdi3>sRF3^Cd1o!ZUxdAn;w}bf@e3zqS<*DDm$?~LkM`V_qF3E`SgWlCm#aK zF;DQBlb^1Lo~1f>Ki{}}cb(m0N`GIGRtPTQJ4ue$TWm3nxe{pN@8lG-Qy5t1a&h+Y zNh;(2MgzXF#0d0fYae%1-A)i^Iqrj3pBfNZShOu4YHEvq9+2KUaLsQ8R$!!lT7 zX=jOiL_t~h$n4GoK8}3WD<|W|ZjF1U`q{1U74d}*YfxGh{3#Gw8^M0UI$~njpq+%! z0i(6PInJTMyc{Qyj5P@b*9#{xut7#0{ZGS(22TK9Dzg~%@$<_uBVC|cd(%-^UM{Mw z7T!t9gMC7sNfI!w(IyY}krJwVsVBGeQ((4#vb2VrNL$d5j%F}A9zBaT)!Q3`faz?t zmRT(#)16LH!FOS)Fv5pQqI?fYobvoH42-%{^Ps@GxNn5aq^9SedD@;aBCSrjTJ>Ke z-`K-m5`8$@!YJif*euc&Qc7yCleD+pnyLQ$nQXYnXOdf3gpY>i@{Kt(R=}*%M8cqa zI_Ht(y@t$Y5RgzX`DvjCv;iI3Fvf?icBwHg*B|nr&1=b z9FjoicPmM5_HT$_K0bM!yP^2VZ>&O5?)B_80Rbawos%DC%^u)@9j@TU&eC?{$r{1r z0>)ZHzYT&t+0mDpk^Sk~RtP2*)}ZT0UtcNZp7FvYU-$L*rt1QVnfxj$<&u};o-$9# z#zaeAo*gUmg(bvtW7Ek&6r;>I393%uuG@cR&(0zt5cnyO#D??l_||YT!`-udIefuX zP?*{&{O%mX-q*7O)gEQ7o)S_)Gqy*K!tv<)rLd*$49bLEMqJsPo|xjc>w?Gr)q=n|U@-w4nsISKsPu#K$*t@>M=>%?UUw~2X zbx%1@73ofeP#kucHU5NH>aTP5L5xn&sU4osKOxexfIR`|;W|5xbXb~yPGWu&O<%BP zrs+{^n~7gyH4(a=^wz1dr^lkLoFKmkCq)TT#YVljapP91enY){#xF?7M)eC?<02{T za#QCIAI@l!NFo;4pa+?mLH&iyfl6j>5-E7;X_PoB;ja3xZEm!8aQXS#bM|OpUH%EM zN#Ayu70%fUAhDA!<;E@v672R$yZLnfad#v6p+(0EUwhq(o+vtNTiGu@CG!G)gHHd4 ze9n87GA_@w)YVh9sw|u@y9E98TFNCP4)Iq!mI-lE&K4xY!{+_u-N}Y5X1+d|6FglH zVW_=yH-Gb{XnfM0-8)UI`rHU}Wl6i%arBQ7<{=YHl>~`EwX)P`@4J{t4!)N=_rf*R zt?&npK0lYvoJEn`EAS!ZrcwgmN|Zoq>yiBzYTe+9_qhl@H@@Vg=ObcYKBa7miYn!x zks~9;>y@uQW4sRUtTyY%-1F--j_UlMXV7Lbx>()J{m^P_?wV`z$`47 zK~!u%>|9FjRiLkB#Bt5$;?JLxj6B|cesyO%8sQj;HjDgENJ#YAxV&|NV`D*QyV}_7 zv%0J-PQDegpK{S8#^&@Cab$g!l)dN+A`Osny^+P!ffdIoK%?z?To6KjgOSNorczL5 zCm=M2M^P#-xSx*xO)80xKD|UbxueCmja%J~WAM{?3FTaRDk|k6IlzXb+F2Oir=8$T z7U?Fc6z?eJi|OLI0cd}`Qtm&qygb>)R61?R=rtD@ci*Nglz^-LNrU{(ASL&Ba4XxB z*2QJUZ%0Qi8Q!m7e-!b%m>J9&k+C=X1?i>amfD^VNKP91540oFw8$QJfC@MG5+J*L zGA5#1a7YOsk<2eG9VX2Rgej0u*guA zA-sLM@HAUo2mJg_oIco2UCSw0v8=mR|HSDITc*>A35~Bh~UR%&k}j3dX`6IX45Q+60poGatWZ zQWE~xDEhGD25m4mS6drs`37mPKX4Noqwe{5$>+BP&gh5NqU#bQ|IkpJc?OCeTAF`?RsI3bJN?8 zN^cbh!*!B2^tx}dkphRi0!!m*-3AB+Td1%*LSi?w>o}J=MIf7B`CD`ytHa`C?M3k8 zJtB&=ck-BJ7lZ3i65jWXt+u_F=v6gy^{0Gs! zs_OhRx5-GShP2fte163#xTjllL3~C9hL_0bUxyd^sx91A-lFJr;!0=hW8;5FJ8yq{ z=VF6DkD=S+5I*@$P+W2QJh($nqDCN2R^*NIxbkewCPS%cv>;uss^Mbi$;m??xwHhC z$w?7?MNzG*{DKP5YU#vIbty25dCXlag&^B&PFf0;=m)7h04|#-P*bRl;JbB;uPcsg zj74EFmg9-8ZUv0>C9}p0(wFlW0FIs*-|tQmVzJcmV6^oq_ZL28M}Zd6i`@5*Imgs; zV6?iLnlb0?CvIc0eP{oBUg}D>@Vj@(hFI+EN<_Ta zVc#9z?>&TNi`EtB3{0pdNeQ+m7q<<_Tdb3oDym zP5r0YxI?^8u&P0O3MJs(SZ)!KD<8YPq-_Q^1myo_=V6limiX(Z^PHRJ8r8NxFMRHS zypXB1Ih5Ce121{Gl&#i`@=)^u!3|VK+2M7Hg(t^gw=`#MBEu^$BRPWjea;R8g7ht1 z)27oN(+ahy7$tRk4fNriL;_?c6C0tV?eVA4M}cD?YhH(qNVxi(fSHVw9A_358ANuz z)t9DjzzlFQfGJc|n?=*n(%oJ}IK}#H>?m&ihZ7lqB9X$^VuLVwq1tRrx7U}dBEZ(` zm;3w-FEbsNe9zho7c+mKn)ju6buILqALy*l?atk+xeRa2P@*3)=^V;FB zuC^;E_)0tD=tgN`#xZxDy?ZdMr|9?Ej_ zI8oaSoRq_L49qc0jR$P3tojCT31eEtU9BvTB`xtoOt9{*KkM&F_WzrQT&WA-D_|o) zW*El+HzyC9xUGu*H+Ag=_6cMp6qWZ`8*jGnoM8eQs8F zali+_1KEVTTTptp)1|d*C^y7a>Bval{X$C4q|o+=dXQMSwJ8Dpr$&0$sI^hG=0>y3 zL*Oq!v9X0VoG{i7Ik$op1gvZQW4ACHXXChB9fkKe5YMP-44D+}O__MM)m;_Jn?yBA+#4}(kCb zng?4}aoyq!#`E0Z+n%h!Y-=c^b$IzP`+qtAfx!ICOtQmtSD*Rr$_lO8pRHM3qqx>- z-6r>JPDuUPSaWmkCyWtE2es!>(H6sGhz@O9Pq%^e66-8?H)TTFZ<48LpQNN+&Q^!! zx?U1_Ig0@5@O0A-Kfjcu(*nj+2P($)nZxY0H`;!`J1~N4n=4<%W&S=0CeTZryW3Y( zlm0?Sm*RVcPeeqAbZG?z%i`k0w=p~KA!F2$aQ$q~P=hl6s23$;(jPv!0x24#)|2?d zO>L?!bjU!a5*_q<5Mg$)N8L30zF<3FA-fIRSs)P zPgdq)AP(^&&J$}70HJotc5pDPFl3Xu!=papt0}k**13%A>~xhpg^X25=kJBc+{>+s zM+Yl^WyK7<*o*$YTu&vsZ&uJy?6wCv44b2V)cv$IJ7{ zkPw~Sij%ImN1U`_>IMt4#&Y`l>8m3Z7b=Lh*Bk-xSHRRreHCb;;%zq33vPk;|K#BY;ML%xL`KV-+30J-c^`gva(D z-EiWN>$nnds13#jG!nCTpX%zDRgxxsw}&)*Pm*PTnP zwQ^@20gJAzG-7<9E7L{1u^*CgPL}{ID9RP8`{OjR^cEMNN)c|0iZWmCn=AkGrwruE)b{oSQ0QaouVSJy&00A&`&PK{)?p4kxU6{n{%1GdgUd`e+mEmyv zfaH7xwwNoc+!|ja0rQpd%#VwV3}WE247B6cu4i?yn?%GhuJe0KZ}!Q4vw7gqjIqXR zC*#nNZlzXH@Jj&TNI*c)C5MFyHa_^a_-cw26b(Qn(QsBTdyl=R0(F;B! z78dX>{m}V3mK8dnw9{FJ(NPRe*^g}!K~s?4&;C{Fbw)FZa2-Od5f&^RVp(3G@m^ha zRjh+CcQ+=#o*oJIeL+8wE-un4@%;H34j0#Pt3LZrP$KcgIn~vj%`LYB>Q4WSD^V8g zuO>J4*B^(st?+^I8`(f9n3>rqQ(FK(X)QU6G$p_oAR~$Ob(Gr>1P`D93VM_B6V)gn#YoKk1%~kUb}#Qsu-p4I zq@Xd1LriSHy)z!7?UDK)@vEu{paZZ(3gO%Bkrg5$e0j5JK)lkdo=o*nGk3dSY~rcg z0fCzo$wxRRBa6OX27R}`7D_qCQ^XoC`*hMqU zaoTpCVRXs(yxc?#B(7Eg`HfmO!>PWZC3yyxzkn{1*i;RQs z)IxFWw6xEjz2}UM@{@5;n-+ZsPhPPZ5E?5ILXAGZ))j7e`^}Pel-ZZQpYUYK{tU8o zPS9zTZg^yes<@W*o_9T57mM`_wGX9lvxn%sFHn^UfU< zf`ZZq{>?g+M9f7!{k6Vs`7z?Y_z!-BrXD4h~BpkXLK-v z_oJJ_L{Cs4mS;5TTa@WUxfoz9t7-D=BM@$9+dL8%U^tSY<2vlOg^|6GBS+=T^+!%6 zpmAZ37xc-Hj=9S;of_)Tlm7Z;Vz3M7O5C+cq)7-dIEat=Oya>y45eAuH!qlYuzi1t z0PBYLZp5R@19Ko^a-54RzLl2d0!oX6(=#|=0`UVTO})G_jG!wdvTUk=Dvh3oB4YPANr2ITP@6|0_Ya8 zhh2-mCkNEfuUxnm1SnP5Ihl*Pj5G?dJng=z>cge=K&IBh`N%9<<;MR6&8U3h4gYa0 zj!AJ6GD%%Yr*;u$6iBpcoMp5Rk}D+ZLElElUELF?r1(_@FLx4A_a)u%vPmD7^3Nsv4vRNE+UN9j`Ecmr3ZLmP`7z*KPXVcy zj6js+KbJ~Efav7p(3jCN#~GYMOhi{>TeZ*`QwQuBl#vEiP+7(xD$K-h?u9&WHjI8n z0RXJoUBEgYolAzUDwGu@&Ucj9Zk8ED5UI@A!7qAq`uv$j_sRiR&uGWo1|I;5nLCwS1=l&>uB>OPx>mR#Az_;!aug)DGc0gPM*LZkeoiVI zk4_Ao?a!c6Nu_yjg+J+X{EMH97}`)@3iR{cIWVMuB@5Nn^ABGP>5bIhRhLeW-#N&O z1a#x8=WG-CyG?>`hlDuf$5N?kigtYkeAvU}!D}v_ckbZAHeb$zg2>K<>GS8IJ8{qc zFmRLNuo^2UfTjdcZ5n!azlp4#$hHV@>~o$v$8F01UhET1!l>aQ9ob-PK#~H11VG(J zW06O<;qW)fwEo&fSe>uw?`)E!U2N};f0yRb79Nzs(aNjjF*`alnX%&|K-!`~K?{MO zBt|T_!(oe`AM9In;iw_x**HBdw<+NYK!0?+Pire5A&#!KJz(PVSka0P@Arvpq)^j{ z5pz7m>$L(E!$@s5kBfm=UHxB>q6ZCqg7OILrhX#)&K0XGR{8^S>8 zR)`^LK6{3sFRKg2(Vqo3D)!S%%E+v3Z7uc-8C;U#ys_?_sX#72-v+j(TaNZ7=UoeHQY$c6h&_TuU8IzZSJ~uDlAfKPQ&Me?mYap9Y5%nr+%lxM3hEz0WWRG&xUKaA4#s_4 zpJhaby=mLOPl9|1s!|{(X~u}Iy3aOsdqq}JOoqol3Kc}l@@v(@zN#5D#KrqW1)UaH z9ON9{#o_Ad=orjok5)-@e!0jl=eDLO)K{9%4|F=D!29ro+{)>o#5%q&;^qoGu!an( zlB5>(2O0PCIg$afmwGt1_+w$&`JfhsTj+j$D78_AuG*j6%XP!r&-CCY1BKzbUyOBW zOq%9>LW~xFR6C2R84~L=RU@<%3|ES!1rMgXIFt12Gdz~lsTW2K+)g!#>xDOYY(z|R z)uvtS+C3Pgmf_C%RO%@S!JV<(R_R^6JmmIQeH-3z9m_Lyxw;2ctNzJicc!&?49_L~ zyZ$(g_sD|1B3z53+R*0FAI> zame@N(P;vZ!$`!axN=C!X8P~*U|A%7BTS0rm0H8hxe^l2NsxhePYG9K^};wt-u|ZE zWO!%c>~;-H^$h2gK#g3z)XuNFfVYu*SjhLmvUv2M zKoJGR={_{2qhFqLz#pAa%2G*@k>F5W=tGso^k*P1NW}GgW0j4=T|Ymx$s&|*@#FR@Ox_mR1?FP zoQZVr!MMP52)|M9p;)`N$@juNCaG^JvaFa2<25$^sy9fZF}S1dWg=Q1C0r8&LAd zEJJA+oJD6YJ!$j2tmJY3VOOBDacx>Gtg3SQMEpkwbI*{Pl5ZT?BxZj8x17-j-kjxQ z@`?Ri;Tx|(1BX9+tBnT3K*a5~1aOr(cjEFdooS)ODnUfLy62xYkQCAwk|*v8w>SlC z0{Xf&6LKa3F@uohQ*U$S?@5V0F>3yIZgr)YL92nD<+1ux^N&g=aesT>kPo8dCX#*8 zO9m1qS+aZc^swq0Kd$NxBhx4x8p^s^0UHrQ-w`WXtdhttk(&tzFB)A(PL>O(<@GGM zKlgvRnjW_W`TFULQ$C2CK8Z%rQP(dUY4_8F{FVv1NsH+8Kki%spaU^CsjaYUVtcCJ zeJ94*WcR6MJ(uP9kmRBO@)4n6%u)jS`By|i;jk0gM(gg&_|JnjsQv_|Kwp--pI|7C z=k04R3#ys`mF;4m0X#ZwS8NE7I8f)ip`P*>66fUj`GI5K5z8rP`9M;GR8*=0DM`Xc=4}?I1qnK%fl6|oI7xr;#byrbKLk>#kQImPfgyQ$|?p;d| z#P{yM$7w2w^?O~G+LuNy2uRmpu2N1s^?sD!tX4i~A$YBOAI134lkD*0r#8Eq{9Wv9 zC}@^^Hh$Nr@!T%FmoxK*sq5Qk@c03XhYbM_O*8SZwD|k~+*&2Z&!puT6BU{(JYHPH zjsG2IU1pc)ce-VS>2_PCsVIL@_g%qc)t7*g=9cNT%}p9RKHFtn*#zg``phcbp}Oy` z`qxp~B6?g+*;B5g<>e`pk&9e^_m7e~9&wqzSTs|6Q)S2P1=I4IKn%nc>U5|voqFj} znYZ0PQC^C<-R-3as26(%b=)%ajAMFo{v-VFiA(Sh%8EKSxh(o_*;f%g!oS)hBP-}^ zGeV+ST;kCEc%iDRUz$sMz?j>r&>lbbz4U+G__zqJBhc-2T#^Q?gR`&a$fUli?H05m zOT#Q-X*S531(>f$Jofd$L@%L}D81EO$@LmKiDq zA|ssgE#k-u&tF$5S)35g0ouN}KSuT^qr%MiKIo(o#xT0JdDNsF@T(a}4Ib|C8OeJA zx_nMD7!>aV8bPE-y8rkNr+uElI3MJ0ViLSI)>NTnk$9 z)^mHA{82?cGL(($i;)``lxss%rpLEWlBatf8H#?FVkO5(!G)P|W0dJmu0N!)2Mrnu z_em1Wjaa`_>h@Z=ac?h@;^>ZMs2XtczgXKJegvK-^6#>MdXyaRRrjj3GI9{odRd69 zsN1sZ-GpMX>GPbPt6Fde%@{o#9Jjm&i>n+PKRxDrD8l`__roKrrsU}p%ReVCd=>tJ zC|W4LcQW`;<@fu5BX5q5E=|a}`vLszFZs5xW$JTC8nwm)W1{O5ca$^7?MO zzLN2e-Z-XtMA74bAF?TMca{S*E~5Bn!8}9d;D|vObhW?^oYiw&iGTOAD~Fa{E2Gn_ezPVaE$ymFw;7+OaqH<&j8^x~`7VPS`QbDR!O&H^Vfva?_C@ww1Da#{z? zzim6t&Bp=BmjgG<4a`7GGWW9`fk!ay6G9gu<=n{aR0a_R>5LaS};SI|#wu)=3tLX?e zMMayx_#gA|{k>L&g@>gM_=a7vA(0&F=OD2eel=;P{{7RR3J3c1KmeNJQ|)@)lQ}$+ zWMrDpYj5hJ&_6TG|2`f)7&%kcNHzhEuCA>0a>3dr5`2bp1gbDHGJ{~j-8Ww&LM^0E zZ&HB;K`WSJ02!Un&<(cqJS|n*-TKh@6T}(@n_3>A(Kw%|u=okOg!XXwjw}AtaR7O) zRr!urzxDja4buJa&G`S8A;d-ZLR8XZ^!ixj=(`Ng(>ks@3;cY3$3{ozWV|4W>^&)N z%|ewR7eOZ~wVCrd*^u_BsDw+gb*ln6#q~0)W;l8{Jt|+RUN?tiC@k^}DQ$v?97%AC zeiewAxg6Zl=M>L(NIRxspH-je8yz$2(2K;fm@w(FG?1`c zSSFCvZsL6IprjfkTj%E?QfAPGfc8v)n%^AkBB)mAl)pgxAW_i;bkPQXtxXf)#lC(1 z*R**352c$d*l4fTxUp;GENa}2^}=_T7(h6!4HK(V$smly20aV?Q;!%Ke;Zx4{@nrr zV~)uEdENPNRUqw;7<}Ld`W@62ulgMr<;P5Gww2JD|!%5mYfFEU4)D= zvSOzhZgHM>pM+#@qlQNfgF!$*O#1EHuhHGXBtDV5+4j%)II24DB0ia`I!*v<9Lm$~ z-5eY zFK@SS(vZ-QDY}ewd*Wt=z1KNxVIi)}w~W2aU@UVVAE-tgT|jtJPA%;pWP84EDfeI~ zHunj1nSpR|1vaf!s1 z1n3|6*eR*1$kt)Fi=gVen$Ae{z)TMjnVnMiF&8D|ECb#iu`Ay3O~pGuuASgEv+O(2 zT0irP3TMLpKdOu-nsJ6Es>7pBKXjd#2|#O*REihuH>wNzMKyW#624-7R)`v1Q1krcXu^0c2ThX_+Tz zdk$@oMx>y4n5*vCaNwD8j|QSjH<3y6fK0*VtMAigt|RIl^vnmI;OwAU3*>XFv&Ln2 zBgpJe>fukv%gy9LTQ}@>Wn>>-IQ8?PktEQ2swCF@(zWKjpz?i^I0trbAhrMb)kOVV ziMgE#^0MpfJwucfLZa!zx6NN)#Dm?Bmir3&Rib>YRfbK61UV-IBGq2z-=<^=>J#78K=qtDh>`G542|^AZP>Cb2(j^pGO~_nT{XIM6-ncn3<7@NiE>B zisG&>tY1=bNGkDr^A=n#Ug**onV})^e9+6K&3&oUNdaeoMPoo-eOUZNfC#^-wmE-Y zn2ts8Ld(Mg0owUfL_9242iK@wiWQ`NBWFq*6NbZ_E`p@ihM?0Ys(PSuFgvSTVyL9V zY{p%^4EkZ(4}Vd6rKQb9YPK$x@G*k7bR1{*sx@cLT#!#x3e&1z=G&hV4M$HJYdVc^ z*@Ef^V9P+6l})1|T-1JFNeAkDV;Y;lQH;-B=6T9!7P#V5v)y>G(dzwNKjz#<^BlIq z7mdpuKGaIsArE+Pl25kQs$yg;6VKg0kjXnyy27)f^j>?~^6U2sY3)0VR-WHgUP7l; zq4=ifCc$bjAB*f3_XcDDm-`uJlN~r^h&pKaBNy(u?&41=p_nFrr(Uy7%lW`9XS0i- z7o$Ff%>6+D0WLT}2>!susN{a=0|&?AzzMQ{&gh__4u;M!xGKWf^J8OhuaGr3-ikWm zit2(fcC7?b^>gZG40QCrZrgqhMpR@Ql}%U;$|z~n+P8%n(?vLdmanyma@jiolwF;s zL>;J{VW=Ev0n%S&3=bTf7}V1nD%P6_5BsY^bjkJ4&rsM07Ko*>!rm|~#TDWJXTZRp zCn!^`3)UfPOj@Q(xQnN&{e9uG_PthfizJ(%2gJyxwxa~AOjA|Wus-EX6HZM9798v~ z@pQbkD-adHZtTbdGU)s(8Kk-A6QJ=Xj{{UU2S<{6qkuwB_Qc80?qRx})Rhv0I#~(+ zlEMA}LCkt$H(0hi2@crs%ITsz&6<_OqL&((;Mqr1Tb$P!Dd)PMTB>a;s1bu6c_UCa zJ9&+Df@8qLh};HoW5V?rc1N_(#OQmw>xO!@)cIN?`B=`?*9A}Tdi#(u2WnZ~SJe0K zeFN1(ysFhZT`Ilo74sG6!?G+6_~}B-Zl(|;qwK*$B=i4naVwf;iW^;`#a8pBL>k=>*Ia2@=&U9h?V8XSw8H3T!iCxQJc}{zggy9X+~TEz%cvA`^43Q z7OHwUQ4BGe4-^$8fEEnOd758lMtT2_TQY8%_O?JU9q^#2;#&sBcS>&1bY^m&!~{0= z?)(h&mz|%VdwJdTyLaA@qgXg$v8;g53cfa$z%^hxs$$_^)xt?jq(=H>uL&~ zwesH=ZaoGE1h+?;HjQ|{mC-shw1eZ))#s|x>1C*!Q?S)llU|!3T0QC@J~)nTZ-1Zy zT(ih`l51gu_OLfL7Igp`s;shey7n#XFkD+Ha9!_>wZHY5xaVN)RfWz5FYs9bpQPr@S$t}DW)2kk(Z}Aa09^T zkf2mGlT%&PcG{5a1e>9$Y1n}t0S~_KfEDk~00{?NKkohC|NeJMLjKBfkCFZAY`;!x zW@>g_jWvVBI@q3*N3FV|8u8Q;CL}Zucw!h%QpQnv{rAbGOW%XC>;5YGUda$R-h=h? zi~aWQ-MKIkk^dB{O*Qc(NYgkvIzB&j{tn-@_-?*w!`g{=`B89wxv&!1p1y$|Si zl9H1A{r%1ALP>Skb|09rdT&mk0FBa;)%yIfLC)O=L^!LY1K=ex)PM2fMIYKCBxa+{ zZ`XOIE3-!8E!C!h?P>*%BqSpv1K5jTuu07Nhz=f52eHVw7w~s~PzYR`AI@G|!lx&~ zczJ>KY6$-NoOX|3x|bzxT;`M-rE!8|qKjC6X?Wb-)DxdtP;dzlha9xE8XSjHm^s(@ zdej6^-Mo3zZ+j4zcdtU+V`+S4#U++rL`3997@N-~41J#ncOmp>c=gJAZd)&3b)Hl$ zu@(Sr;~{zU53dq>Q>WO$7NITI9#;kEhS0aQwKfZQ=`QitFTs`GMCL!Ar0J%ltrwQSz4FF0P5*JvRZdb~6m>;_8h2)fx z*-1s2YypOw9Gt=3yYF&xNZ)@Yc@;-{|yq;yAmEW7XllLxs! zN+~tIh^+;FOaIYEO&sEOOz@V*}Jhe$a z>FrL)Emc%fS~a>?<&79rV+XY$9CR%k5X#QyuK8B_D(T5=OVX_2HNzMoT@NmZ!2uxq z6$mye*RKQM`Z^J3DkK(55BQCm0A0qhBS%zmBMx@d{oMTgYWgoiL-kWQcQ@Po($dq9 zjc^MJYKT}R7jaxwxp6~{^Xu2Iy}3r|xZ7%}Evp9;4!<~4wu2J`2#l6=a)spn+>Zvs z1m>xS;>|e2KQ%_N29^31#1~rzM7Z%quc8HGauq~kpa6cWRWt%2lYG$^?YCRj@lf^J5~6;jKdF$rr+`9pkZtr zNpd1LrTS|Pf?|Q%^_cA4mAP-SxUF_jvMiphzQV$x;pt1=eLd(d2TTK-!bDVRh19ng zlKcC$CB+)sz4fy5fB&aMO|hSG%VJokO^|FnyHGjTXl?P0tbOGn!wy!aR?=)8{(Vsa zQ94D=xFq_-{%GX`^IWa7QCBzRN;19HH^GQvWW@oV72SP`9Cs?H@^AiLcU+&m$n~D| z$l4c4B|xwfKa3I$grYEk-X?pPooqaB8^$#}>k%!)%;Gyl?ji62lA^;kUx-t(bB7@ z@;cv-!&#dLbb-wWp|fihz=Q+CJ6U=P`Z6^AAb&(ZJ_tnULSDTZN3MgY*;12{fkB=9 zd8i0f!w1_-_})z?%JlfFF^T7L1dE+6L)Pkj>-;Q6kK~Oq^O{F5I5bGc7xQDyr1+ zi6-%_@=Gn!^75E2GaygmMEXwl4=mWe+y^XSFEDRw3+a7}*2<>)h)+(;j^o<* zYR=HMczM)3Jw_~gSyr$u9j1CpQfIFc|4|5iJaqQxY$AqUYb zkiP-l#8L5j0$jy%r=OLXK(n!&N?xAOy^0;{)ym2lOft?6Slqc`?#t=?rdZ4Q=CbFt zsTHGVrq52b`tXZ>f&d5yv@9(r_L1lf=^#h}F}HXjlRmrKf_w}FC&&&4`K_P6fvt>I zycA4QQk5Gp-|Y@RTUaOnI3y5C!2)2hTB3yg62K`I`+~2VWtsa0sv4mJ|W>@k>ZUTGt=#~rsXczxoOr~6-(`K{Co&u znvPL}*fs!AG0!fE@axv^NJR~ciR<5-GR35G;34Ei=zK0o0FP{))vK89CAOxhls3Zd zsPbt6-jm|!Dx0OZ9_0-+ngEo}bn;-T?N5!$8&}Vdt;IE$Ix>73rDfoK8P05{78jHt zYmXAblB+aj1?4qN)^?~g5j4~ytnOU+a zDWztdSpd-sNcsd@sOKlQleo05mz+3$yl4B2wJ>1KbBPSh%@!E5J|N55pAE#wt}u)# zWd2Ov(u3m*V@0s5(J)nZ-dJ~_P+6p#?F77b$mVzK>cSXs5)YE@gN^znLB@`NFpd?Z zM`YyKMDBKiUW0Qy77*_Hi)$@N6c-{lymSA|?^97q}ybDY; zcOi(p>h)26rH`vB`T*geG3PmGwsKbh{CS%W;0OTZx~VE$Svea75iJnAGo?;4iap9yw32-3fs3%h}og1Af`&C!B7Lsho)(3?7T+)vLo(l5X zg474HW_vPtgOpRYX2yC$OKtwXN?W}>Q6}awAg&qAY!i31qsH5-TwhsOUnk)9@<3|u z>{ReO84nkEc@_Lfb{Qu$jEALtNCV2PG$4>~9t2K3twp~93>iqa{^WSf$|_79rs2rI zJqWVDK0X5xCvYaJhK;7X8B0(&k%G#>FXXJM>VWliOOPx)OqK#!pC0HxlPR=mKh90J#;C&BnE_~C zV(i7ilBp~mE)jSd*Kc|W*HyTP$NIS|jxNgT+Xm?b1u4N;eSS{qo(EJj&;@C8`SiSd zvYS2i>Argl&oJ~J`Xl-mSw%)$*fpYZGoCQ?X%j|Dy)=6f{x9^S|2cXj&!IAc@D++)ki(DF#926S+t)Jki ze&1z)tR)l`AQyz@4q$&8)BCG~Q-Ru};ukv`*)tG_40sjy{#VHM&=!QUOviZ9M=nNJPZyiu-~7fp#DPG@Aark~I7HyP@~3U%;6eEt_$=V3Q)y z)1H;T#vutD_iW2GvK2VqnMzHmT6db6?;I4AqT-+Um37<)4!}V8(N<2@%heRj`=du) z-%Hq|F-74h6rWK;`k6Db&}kIUK`w5??cGN7fcbtz5hS=b>hoWQP1?;B2kqlN@J)P8 z;Mfb$tX28#F-MC4`ZKgNUj$t%AkDPOH3!#%(w(jHXlRXTIuP+zd*_PLezUYh25Y>A*7;PB)(L}sfEc=mx%bO6joa;&Yub_%P9WWl|<7(=DRoZ!SyxClcX_>TeT2s?p{G@9vSYjaZF4f*$sKInsYwcXw(_V?QpDrSc^l}&Li zG>mIE)$d8?Iq4=qkkH>TPReR5dfYfN!8r%q=VDFPF4Sf%R*JR3$4A0qv>~#m z+8nSsyZ7W|X6yTO4S9d>OD0rIyWX2m)>qrK%-bcYoS7M{t z5HQO^k-or)!D){O_-$^oifo{4_#%i@&I_gAtr%2vPAz))AfrJMnairk4IJR-pN1o-U8{mC+_Y{k`w>kri&|!NRqpr>PDFUp>(bIh_+6QcdU*WURpx+S zeey&vsIAu3`Y`mwlgu)<;dFH7`FGz6%etzlM9PIEwWM&WsiR~)S0dp@q`en6YsLY!z^-=36W+FUjCs*IF{P^%yzH`pRG9) z<)5rdRtOP6oKbL9(q?1A@rrAk-K8`gZj5o2Ml5q_(|v`+*Qi&oEfA(OS1M_=vVy*R zq54!o*8nLpdGw|0kwJH3nkJg--~Cu*4Q=Yt&_dV$#mE-{`MOWd{mnTaL{Po@rxvRJ z+y|v+D9X0f$hYR6#$1v6=G#}V$u--4!FM<0ke#+EMYK7jl{padtPxaZZEHVj`YS8p z&$+JhSzXuf`J>cJ3#(yvj%2R%b)>OTY;n%8qCz-~X*pnL#i+9%|I%VmMl~V`xoe7L zVcyW8>lchcp+v>!OR=kcm2EenPRpY~^XVdkUcWxBr)RphW7aAXVT=Z$>ui=OD{uuyVN40>^ktIM1-z$mIz$8qt(cFNzAKALFoL5c{f zh#-acaN{O-u7X?G=y;Kd?(uP?guO}Tc4}y7+U7D6#`ET#D4zy1KQ=$K+k(-%$}%J$ z)txUUX2Hjo@|>1^vNzstu%vausWDMAJ`4TshT(vu)l50)8S|<)GF>G%YA%#@GtLop zD3(@X1|-fSTi){vOr*mHXVt-=pXE)PF}0BIPhPA&6DNO8_zm+~yjxnsvJLYgfD*({ zp!|I1jo+AXph&6@R+#QJcqk-?w`_0_A+U4j$oHto9- z4NI!sUu~?nnM5fO6FVf`?o*Mmue-ie4tF(~l z4`FiCZefcF36IN-mI1lwZQE$a4_DPl zlq)NA#O{2$y6LaQ@%q8xDRI}?5dITyS&q<9->UnA3sKJS>Kqo@9So5FeF^WVY27|!^b%i=_5vSJ8_hr_vD z(H}JVP*I`}$71R5q|@{Nxb=aU~cm3_SXtb(nJh_|KDjzX)VtyP!z_KIiQa~B>;E8%pl zM4JH&tpjBZfYA4u`j&BgeV1UoJ(s4S?dbj65OGEV1$p!)*$hBy4*Vs9 zg!F$_pabg!TZi(IWNomb!Q3b`GyQbszACTettkGB^)NAxU)6N}1z#CN-^fb0ebfga zSFox%7q|6^%Vs9wiN24eq-EO^sy{ml4_6r2Bl|A4jMoGffu(gy#pzDRi<}%LyY&QL zl~ZOZZ97^&oIE^knvLz&h#MU=#_yx`dySLwu6+AE*PkkeT*ynq8E$v60 z={?AjqH*bcEJvR?)CEh`AwIU{l`Tk(Gkgjv(#%cMzoJ*&vqKrXddNsdyA~Vz3lFa zYRDG%-ncY&J54wPzY@Sh1N@zi&N|wX{)hvcU7*GgI z6*wpePmMQ&-#;jZ*SF2imXhp#xJcRI@^nZG1I1K5ZvAD;Ayrkej6$=KNAKoF?IHwo zOh|>IzSanaaf2~^Cuf}AVPLVQqp7I+S63^{YsRj^eTx51o9l|;A!f@i$G)$k-4T&d zJ9|m4t>>#@+qV_H0-cU$z)V!itU;Ri@Yx-h{vGtE^r`o_#9OAfJ?cd+WARk#47ztO z^;xQu?NvCunjfKxBfWe@uj|vjF&Bkt%9S?3lRmOX2JvbcK4H(Wzpbw?14cwITh7`} zu8(-HOO0>U2Yngw*)3mAOibC1gNJ5j_OPeGDHSx^?fj^>tEg^I`A&_&Om)<$Ob!lS zWGH-FwizgLQN*S5J)W?%{D2nEosEY+q`cph@XLl0$|%(%u$7T#m95ntP)I6>$i$ia8= zN{G*+68)E7cN_tu=f5u}>S9mNJOuWxKc>6|ALJ=|-5dFjI5;S`;i_$G8;i=)DoRl? zLS8G=yok@vQy-fqJ~=avIRSI;b5y0&t8J*vUN!z|(cokaHPEW-z;~E_)WJ*n$Mz%Y z%z=TWsHpbZWxDHLlt3XL!@`1T3H7DHa?B=jzPXMgZ_%NHCg{ zC%u%U0?q#IJqP6!q7OacT&z_k#RI5c{+fw;WOP)Sd`xQWhly?jUz(eH&8yMqhZwLVVqnJcB?WnQ&;L%dHPKQq>;Zxy_)Kz1 z`rl^}^U=KZyg1<{KKuTZcGGfVw3yk(!h=&POUKwN0dM!qY6*E&Ot}YE2|=c59oxO1eDrj?~##$$u8_x<>u-BpknYbo_L!2m=(}N92D-wxPX~C!FV2 zJvaA`9=LpWA3c5?*^39i$I=nrMX74O#22$)YItO%bx#76g6!S5fJ#LPyP>eOkBkTj-!U>WQdd_$`}8_2@!=-CiPuoB7jUuf z_(8`Mz@#X`Rkuf%H$T!YdSccOaf@uyH6aml?Mr2Vi+5s=1r&m;75ImO;+)~ZO||^C zCt00SP@MKP)gsH1g5nF2Kz4?KJG|i|OV-d76x7&!Uh?2lP>imx?vDWl$4-^pZbQHc zM)GInA8KomJ{){nKHwD+{e5UC$2nB%8p)+0f`^?P=6L!HZPl4JRu@(=JRcLokl)MF zXb6e`qYYpbNBWNmHjGY<_Uq?@0I=Of7#aX6|93!lfVtb!A} z^-XU_bq4cgTR4|CajL^{{qlUB~K6hbZS0vW@ct??v2qw jzk`|ok%ip Date: Fri, 15 Sep 2017 17:39:01 -0400 Subject: [PATCH 020/100] #587 SonarQube reports bugs in dao module --- .../com/iluwatar/dao/CustomException.java | 43 +++++++++++++++++++ .../java/com/iluwatar/dao/DbCustomerDao.java | 33 +++++++++----- 2 files changed, 65 insertions(+), 11 deletions(-) create mode 100644 dao/src/main/java/com/iluwatar/dao/CustomException.java diff --git a/dao/src/main/java/com/iluwatar/dao/CustomException.java b/dao/src/main/java/com/iluwatar/dao/CustomException.java new file mode 100644 index 000000000..fd291b605 --- /dev/null +++ b/dao/src/main/java/com/iluwatar/dao/CustomException.java @@ -0,0 +1,43 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.dao; + +/** + * + * Custom exception + * + */ +public class CustomException extends Exception { + + private static final long serialVersionUID = 1L; + + public CustomException() {} + + public CustomException(String message) { + super(message); + } + + public CustomException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/dao/src/main/java/com/iluwatar/dao/DbCustomerDao.java b/dao/src/main/java/com/iluwatar/dao/DbCustomerDao.java index 6e93207cc..fa2e411da 100644 --- a/dao/src/main/java/com/iluwatar/dao/DbCustomerDao.java +++ b/dao/src/main/java/com/iluwatar/dao/DbCustomerDao.java @@ -36,12 +36,16 @@ import java.util.stream.StreamSupport; import javax.sql.DataSource; +import org.apache.log4j.Logger; + /** - * An implementation of {@link CustomerDao} that persists customers in RDBMS. + * An implementation of {@link CustomerDao} that persists customers in RDBMS. * */ public class DbCustomerDao implements CustomerDao { + private static final Logger LOGGER = Logger.getLogger(DbCustomerDao.class); + private final DataSource dataSource; /** @@ -65,8 +69,8 @@ public class DbCustomerDao implements CustomerDao { Connection connection; try { connection = getConnection(); - PreparedStatement statement = connection.prepareStatement("SELECT * FROM CUSTOMERS"); //NOSONAR - ResultSet resultSet = statement.executeQuery(); //NOSONAR + PreparedStatement statement = connection.prepareStatement("SELECT * FROM CUSTOMERS"); // NOSONAR + ResultSet resultSet = statement.executeQuery(); // NOSONAR return StreamSupport.stream(new Spliterators.AbstractSpliterator(Long.MAX_VALUE, Spliterator.ORDERED) { @@ -79,12 +83,12 @@ public class DbCustomerDao implements CustomerDao { action.accept(createCustomer(resultSet)); return true; } catch (SQLException e) { - throw new RuntimeException(e); + throw new RuntimeException(e); // NOSONAR } } }, false).onClose(() -> mutedClose(connection, statement, resultSet)); } catch (SQLException e) { - throw new Exception(e.getMessage(), e); + throw new CustomException(e.getMessage(), e); } } @@ -98,7 +102,7 @@ public class DbCustomerDao implements CustomerDao { statement.close(); connection.close(); } catch (SQLException e) { - e.printStackTrace(); + LOGGER.info("Exception thrown " + e.getMessage()); } } @@ -113,19 +117,26 @@ public class DbCustomerDao implements CustomerDao { */ @Override public Optional getById(int id) throws Exception { + + ResultSet resultSet = null; + try (Connection connection = getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM CUSTOMERS WHERE ID = ?")) { statement.setInt(1, id); - ResultSet resultSet = statement.executeQuery(); + resultSet = statement.executeQuery(); if (resultSet.next()) { return Optional.of(createCustomer(resultSet)); } else { return Optional.empty(); } } catch (SQLException ex) { - throw new Exception(ex.getMessage(), ex); + throw new CustomException(ex.getMessage(), ex); + } finally { + if (resultSet != null) { + resultSet.close(); + } } } @@ -147,7 +158,7 @@ public class DbCustomerDao implements CustomerDao { statement.execute(); return true; } catch (SQLException ex) { - throw new Exception(ex.getMessage(), ex); + throw new CustomException(ex.getMessage(), ex); } } @@ -164,7 +175,7 @@ public class DbCustomerDao implements CustomerDao { statement.setInt(3, customer.getId()); return statement.executeUpdate() > 0; } catch (SQLException ex) { - throw new Exception(ex.getMessage(), ex); + throw new CustomException(ex.getMessage(), ex); } } @@ -179,7 +190,7 @@ public class DbCustomerDao implements CustomerDao { statement.setInt(1, customer.getId()); return statement.executeUpdate() > 0; } catch (SQLException ex) { - throw new Exception(ex.getMessage(), ex); + throw new CustomException(ex.getMessage(), ex); } } } From 286f187df47f66ced7574976b908e3d4f4782523 Mon Sep 17 00:00:00 2001 From: "mahendran.mookkiah" Date: Fri, 15 Sep 2017 18:26:59 -0400 Subject: [PATCH 021/100] #587SonarQube reports bugs in promise module --- .../main/java/com/iluwatar/promise/App.java | 2 +- .../com/iluwatar/promise/PromiseSupport.java | 49 +++++++++---------- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/promise/src/main/java/com/iluwatar/promise/App.java b/promise/src/main/java/com/iluwatar/promise/App.java index df4d0cc79..dd40ec15b 100644 --- a/promise/src/main/java/com/iluwatar/promise/App.java +++ b/promise/src/main/java/com/iluwatar/promise/App.java @@ -65,7 +65,7 @@ public class App { private static final Logger LOGGER = LoggerFactory.getLogger(App.class); - private static final String DEFAULT_URL = "https://raw.githubusercontent.com/iluwatar/java-design-patterns/Promise/promise/README.md"; + private static final String DEFAULT_URL = "https://raw.githubusercontent.com/iluwatar/java-design-patterns/master/promise/README.md"; private final ExecutorService executor; private final CountDownLatch stopLatch; diff --git a/promise/src/main/java/com/iluwatar/promise/PromiseSupport.java b/promise/src/main/java/com/iluwatar/promise/PromiseSupport.java index 3629b4b5d..ae90a927e 100644 --- a/promise/src/main/java/com/iluwatar/promise/PromiseSupport.java +++ b/promise/src/main/java/com/iluwatar/promise/PromiseSupport.java @@ -27,11 +27,16 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** * A really simplified implementation of future that allows completing it successfully with a value * or exceptionally with an exception. */ class PromiseSupport implements Future { + + private static final Logger LOGGER = LoggerFactory.getLogger(PromiseSupport.class); private static final int RUNNING = 1; private static final int FAILED = 2; @@ -80,40 +85,34 @@ class PromiseSupport implements Future { @Override public T get() throws InterruptedException, ExecutionException { - if (state == COMPLETED) { - return value; - } else if (state == FAILED) { - throw new ExecutionException(exception); - } else { - synchronized (lock) { + synchronized (lock) { + while (state == RUNNING) { lock.wait(); - if (state == COMPLETED) { - return value; - } else { - throw new ExecutionException(exception); - } } } + if (state == COMPLETED) { + return value; + } + throw new ExecutionException(exception); } @Override public T get(long timeout, TimeUnit unit) - throws InterruptedException, ExecutionException, TimeoutException { - if (state == COMPLETED) { - return value; - } else if (state == FAILED) { - throw new ExecutionException(exception); - } else { - synchronized (lock) { - lock.wait(unit.toMillis(timeout)); - if (state == COMPLETED) { - return value; - } else if (state == FAILED) { - throw new ExecutionException(exception); - } else { - throw new TimeoutException(); + throws ExecutionException, TimeoutException { + synchronized (lock) { + while (state == RUNNING) { + try { + lock.wait(unit.toMillis(timeout)); + } catch (InterruptedException e) { + LOGGER.warn("Interrupted!", e); + Thread.currentThread().interrupt(); } } } + + if (state == COMPLETED) { + return value; + } + throw new ExecutionException(exception); } } \ No newline at end of file From 4ecc337c7d4d2d6a4194f7938e14946cb52aac7d Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sat, 16 Sep 2017 17:20:51 +0530 Subject: [PATCH 022/100] #352- Unit Of Work : Added module to project. --- pom.xml | 3 ++- unitofwork/pom.xml | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 unitofwork/pom.xml diff --git a/pom.xml b/pom.xml index f2b6b7ccb..e29b2f99a 100644 --- a/pom.xml +++ b/pom.xml @@ -146,7 +146,8 @@ event-sourcing data-transfer-object throttling - + unitofwork + diff --git a/unitofwork/pom.xml b/unitofwork/pom.xml new file mode 100644 index 000000000..e790c8168 --- /dev/null +++ b/unitofwork/pom.xml @@ -0,0 +1,15 @@ + + + + java-design-patterns + com.iluwatar + 1.17.0-SNAPSHOT + + 4.0.0 + + unit-of-work + + + \ No newline at end of file From e43b6f13fd58ee64f04bc0592170ccb1e3ca812c Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sat, 16 Sep 2017 18:11:00 +0530 Subject: [PATCH 023/100] #352- Unit Of Work : Add Student model and puml diagram --- unitofwork/etc/unit-of-work.urm.puml | 10 ++++ .../java/com/iluwatar/unitofwork/Student.java | 46 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 unitofwork/etc/unit-of-work.urm.puml create mode 100644 unitofwork/src/main/java/com/iluwatar/unitofwork/Student.java diff --git a/unitofwork/etc/unit-of-work.urm.puml b/unitofwork/etc/unit-of-work.urm.puml new file mode 100644 index 000000000..329185e30 --- /dev/null +++ b/unitofwork/etc/unit-of-work.urm.puml @@ -0,0 +1,10 @@ +@startuml +package com.iluwatar.unitofwork { + class Student { + - address : String + - id : Integer + - name : String + + Student(id : Integer, name : String, address : String) + } +} +@enduml \ No newline at end of file diff --git a/unitofwork/src/main/java/com/iluwatar/unitofwork/Student.java b/unitofwork/src/main/java/com/iluwatar/unitofwork/Student.java new file mode 100644 index 000000000..fa80089f2 --- /dev/null +++ b/unitofwork/src/main/java/com/iluwatar/unitofwork/Student.java @@ -0,0 +1,46 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2017 Piyush Chaudhari + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.iluwatar.unitofwork; + +/** + * {@link Student} is an entity. + */ +public class Student { + private Integer id; + private String name; + private String address; + + /** + * @param id student unique id + * @param name name of student + * @param address address of student + */ + public Student(Integer id, String name, String address) { + this.id = id; + this.name = name; + this.address = address; + } + +} From 8a53a2626edde047877e765ad0353e884e31fa0d Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sat, 16 Sep 2017 18:38:48 +0530 Subject: [PATCH 024/100] #352- Unit Of Work : Unit of work contract. --- .../com/iluwatar/unitofwork/IUnitOfWork.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java diff --git a/unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java b/unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java new file mode 100644 index 000000000..9e0d4138d --- /dev/null +++ b/unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java @@ -0,0 +1,37 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2017 Piyush Chaudhari + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.iluwatar.unitofwork; + +/** + * @param Any generic entity + */ +public interface IUnitOfWork { + public void registerNew(T entity); + + public void registerModified(T entity); + + public void registerDeleted(T entity); + +} \ No newline at end of file From acc2fad818f1ea27cb4140c7e78051046632357e Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sat, 16 Sep 2017 18:43:35 +0530 Subject: [PATCH 025/100] #352- Unit Of Work : Added commit contract in Unit of work. --- .../src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java b/unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java index 9e0d4138d..9fb2e362b 100644 --- a/unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java +++ b/unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java @@ -34,4 +34,6 @@ public interface IUnitOfWork { public void registerDeleted(T entity); + public void commit(); + } \ No newline at end of file From 68ed2a47268380c7a4275be907975acf6e3550b2 Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sat, 16 Sep 2017 21:35:27 +0530 Subject: [PATCH 026/100] #352- Unit Of Work : Impement unit of work contract. --- unitofwork/pom.xml | 10 ++ .../com/iluwatar/unitofwork/IUnitOfWork.java | 12 +- .../java/com/iluwatar/unitofwork/Student.java | 2 +- .../iluwatar/unitofwork/StudentDatabase.java | 43 +++++ .../unitofwork/StudentRepository.java | 110 +++++++++++++ .../unitofwork/StudentRepositoryTest.java | 147 ++++++++++++++++++ 6 files changed, 319 insertions(+), 5 deletions(-) create mode 100644 unitofwork/src/main/java/com/iluwatar/unitofwork/StudentDatabase.java create mode 100644 unitofwork/src/main/java/com/iluwatar/unitofwork/StudentRepository.java create mode 100644 unitofwork/src/test/java/com/iluwatar/unitofwork/StudentRepositoryTest.java diff --git a/unitofwork/pom.xml b/unitofwork/pom.xml index e790c8168..38b0e1b42 100644 --- a/unitofwork/pom.xml +++ b/unitofwork/pom.xml @@ -10,6 +10,16 @@ 4.0.0 unit-of-work + + + junit + junit + + + org.mockito + mockito-core + + \ No newline at end of file diff --git a/unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java b/unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java index 9fb2e362b..d63a6d8c7 100644 --- a/unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java +++ b/unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java @@ -28,12 +28,16 @@ package com.iluwatar.unitofwork; * @param Any generic entity */ public interface IUnitOfWork { - public void registerNew(T entity); + String INSERT = "INSERT"; + String DELETE = "DELETE"; + String MODIFY = "MODIFY"; - public void registerModified(T entity); + void registerNew(T entity); - public void registerDeleted(T entity); + void registerModified(T entity); - public void commit(); + void registerDeleted(T entity); + + void commit(); } \ No newline at end of file diff --git a/unitofwork/src/main/java/com/iluwatar/unitofwork/Student.java b/unitofwork/src/main/java/com/iluwatar/unitofwork/Student.java index fa80089f2..9b77717ec 100644 --- a/unitofwork/src/main/java/com/iluwatar/unitofwork/Student.java +++ b/unitofwork/src/main/java/com/iluwatar/unitofwork/Student.java @@ -42,5 +42,5 @@ public class Student { this.name = name; this.address = address; } - + } diff --git a/unitofwork/src/main/java/com/iluwatar/unitofwork/StudentDatabase.java b/unitofwork/src/main/java/com/iluwatar/unitofwork/StudentDatabase.java new file mode 100644 index 000000000..678fe4026 --- /dev/null +++ b/unitofwork/src/main/java/com/iluwatar/unitofwork/StudentDatabase.java @@ -0,0 +1,43 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2017 Piyush Chaudhari + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.iluwatar.unitofwork; + +/** + * Act as Database for student records. + */ +public class StudentDatabase { + + public void insert(Student student) { + //Some insert logic to DB + } + + public void modify(Student student) { + //Some modify logic to DB + } + + public void delete(Student student) { + //Some delete logic to DB + } +} diff --git a/unitofwork/src/main/java/com/iluwatar/unitofwork/StudentRepository.java b/unitofwork/src/main/java/com/iluwatar/unitofwork/StudentRepository.java new file mode 100644 index 000000000..a2cff4ada --- /dev/null +++ b/unitofwork/src/main/java/com/iluwatar/unitofwork/StudentRepository.java @@ -0,0 +1,110 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2017 Piyush Chaudhari + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.iluwatar.unitofwork; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * {@link StudentRepository} Student database repository. + * supports unit of work for student data. + */ +public class StudentRepository implements IUnitOfWork { + private Map> context; + private StudentDatabase studentDatabase; + + /** + * @param context set of operations to be perform during commit. + * @param studentDatabase Database for student records. + */ + public StudentRepository(Map> context, StudentDatabase studentDatabase) { + this.context = context; + this.studentDatabase = studentDatabase; + } + + @Override + public void registerNew(Student student) { + register(student, IUnitOfWork.INSERT); + } + + @Override + public void registerModified(Student student) { + register(student, IUnitOfWork.MODIFY); + + } + + @Override + public void registerDeleted(Student student) { + register(student, IUnitOfWork.DELETE); + } + + private void register(Student student, String operation) { + List studentsToOperate = context.get(operation); + if (studentsToOperate == null) { + studentsToOperate = new ArrayList<>(); + } + studentsToOperate.add(student); + context.put(operation, studentsToOperate); + } + + @Override + public void commit() { + if (context == null || context.size() == 0) { + return; + } + if (context.containsKey(IUnitOfWork.INSERT)) { + commitInsert(); + } + + if (context.containsKey(IUnitOfWork.MODIFY)) { + commitModify(); + } + if (context.containsKey(IUnitOfWork.DELETE)) { + commitDelete(); + } + } + + private void commitDelete() { + List deletedStudents = context.get(IUnitOfWork.DELETE); + for (Student student : deletedStudents) { + studentDatabase.delete(student); + } + } + + private void commitModify() { + List modifiedStudents = context.get(IUnitOfWork.MODIFY); + for (Student student : modifiedStudents) { + studentDatabase.modify(student); + } + } + + private void commitInsert() { + List studentsToBeInserted = context.get(IUnitOfWork.INSERT); + for (Student student : studentsToBeInserted) { + studentDatabase.insert(student); + } + } +} diff --git a/unitofwork/src/test/java/com/iluwatar/unitofwork/StudentRepositoryTest.java b/unitofwork/src/test/java/com/iluwatar/unitofwork/StudentRepositoryTest.java new file mode 100644 index 000000000..9a71dcbbc --- /dev/null +++ b/unitofwork/src/test/java/com/iluwatar/unitofwork/StudentRepositoryTest.java @@ -0,0 +1,147 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2017 Piyush Chaudhari + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.iluwatar.unitofwork; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.*; + +/** + * tests {@link StudentRepository} + */ +@RunWith(MockitoJUnitRunner.class) +public class StudentRepositoryTest { + private final Student student1 = new Student(1, "Ram", "street 9, cupertino"); + private final Student student2 = new Student(1, "Sham", "Z bridge, pune"); + + private Map> context; + @Mock + private StudentDatabase studentDatabase; + private StudentRepository studentRepository; + + @Before + public void setUp() throws Exception { + context = new HashMap<>(); + studentRepository = new StudentRepository(context, studentDatabase); + } + + @Test + public void shouldSaveNewStudentWithoutWritingToDb() throws Exception { + studentRepository.registerNew(student1); + studentRepository.registerNew(student2); + + assertEquals(2, context.get(IUnitOfWork.INSERT).size()); + verifyNoMoreInteractions(studentDatabase); + } + + @Test + public void shouldSaveDeletedStudentWithoutWritingToDb() throws Exception { + studentRepository.registerDeleted(student1); + studentRepository.registerDeleted(student2); + + assertEquals(2, context.get(IUnitOfWork.DELETE).size()); + verifyNoMoreInteractions(studentDatabase); + } + + @Test + public void shouldSaveModifiedStudentWithoutWritingToDb() throws Exception { + studentRepository.registerModified(student1); + studentRepository.registerModified(student2); + + assertEquals(2, context.get(IUnitOfWork.MODIFY).size()); + verifyNoMoreInteractions(studentDatabase); + } + + @Test + public void shouldSaveAllLocalChangesToDb() throws Exception { + context.put(IUnitOfWork.INSERT, Collections.singletonList(student1)); + context.put(IUnitOfWork.MODIFY, Collections.singletonList(student1)); + context.put(IUnitOfWork.DELETE, Collections.singletonList(student1)); + + studentRepository.commit(); + + verify(studentDatabase, times(1)).insert(student1); + verify(studentDatabase, times(1)).modify(student1); + verify(studentDatabase, times(1)).delete(student1); + } + + @Test + public void shouldNotWriteToDbIfContextIsNull() throws Exception { + StudentRepository studentRepository = new StudentRepository(null, studentDatabase); + + studentRepository.commit(); + + verifyNoMoreInteractions(studentDatabase); + } + + @Test + public void shouldNotWriteToDbIfNothingToCommit() throws Exception { + StudentRepository studentRepository = new StudentRepository(new HashMap<>(), studentDatabase); + + studentRepository.commit(); + + verifyZeroInteractions(studentDatabase); + } + + @Test + public void shouldNotInsertToDbIfNoRegisteredStudentsToBeCommitted() throws Exception { + context.put(IUnitOfWork.MODIFY, Collections.singletonList(student1)); + context.put(IUnitOfWork.DELETE, Collections.singletonList(student1)); + + studentRepository.commit(); + + verify(studentDatabase, never()).insert(student1); + } + + @Test + public void shouldNotModifyToDbIfNotRegisteredStudentsToBeCommitted() throws Exception { + context.put(IUnitOfWork.INSERT, Collections.singletonList(student1)); + context.put(IUnitOfWork.DELETE, Collections.singletonList(student1)); + + studentRepository.commit(); + + verify(studentDatabase, never()).modify(student1); + } + + @Test + public void shouldNotDeleteFromDbIfNotRegisteredStudentsToBeCommitted() throws Exception { + context.put(IUnitOfWork.INSERT, Collections.singletonList(student1)); + context.put(IUnitOfWork.MODIFY, Collections.singletonList(student1)); + + studentRepository.commit(); + + verify(studentDatabase, never()).delete(student1); + } +} \ No newline at end of file From 5fe9d2be6c7aed9a30b8f7814bf1d208ed03389d Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sat, 16 Sep 2017 21:39:09 +0530 Subject: [PATCH 027/100] #352- Unit Of Work : [Refactor] Change module name to unit-of-work. --- pom.xml | 4 ++-- {unitofwork => unit-of-work}/etc/unit-of-work.urm.puml | 0 {unitofwork => unit-of-work}/pom.xml | 0 .../src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java | 0 .../src/main/java/com/iluwatar/unitofwork/Student.java | 0 .../main/java/com/iluwatar/unitofwork/StudentDatabase.java | 0 .../main/java/com/iluwatar/unitofwork/StudentRepository.java | 0 .../java/com/iluwatar/unitofwork/StudentRepositoryTest.java | 0 8 files changed, 2 insertions(+), 2 deletions(-) rename {unitofwork => unit-of-work}/etc/unit-of-work.urm.puml (100%) rename {unitofwork => unit-of-work}/pom.xml (100%) rename {unitofwork => unit-of-work}/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java (100%) rename {unitofwork => unit-of-work}/src/main/java/com/iluwatar/unitofwork/Student.java (100%) rename {unitofwork => unit-of-work}/src/main/java/com/iluwatar/unitofwork/StudentDatabase.java (100%) rename {unitofwork => unit-of-work}/src/main/java/com/iluwatar/unitofwork/StudentRepository.java (100%) rename {unitofwork => unit-of-work}/src/test/java/com/iluwatar/unitofwork/StudentRepositoryTest.java (100%) diff --git a/pom.xml b/pom.xml index e29b2f99a..f4c8dbabc 100644 --- a/pom.xml +++ b/pom.xml @@ -113,7 +113,6 @@ layers message-channel fluentinterface - reactor caching publish-subscribe delegation @@ -146,7 +145,7 @@ event-sourcing data-transfer-object throttling - unitofwork + unit-of-work @@ -304,6 +303,7 @@ prepare-agent + diff --git a/unitofwork/etc/unit-of-work.urm.puml b/unit-of-work/etc/unit-of-work.urm.puml similarity index 100% rename from unitofwork/etc/unit-of-work.urm.puml rename to unit-of-work/etc/unit-of-work.urm.puml diff --git a/unitofwork/pom.xml b/unit-of-work/pom.xml similarity index 100% rename from unitofwork/pom.xml rename to unit-of-work/pom.xml diff --git a/unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java similarity index 100% rename from unitofwork/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java rename to unit-of-work/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java diff --git a/unitofwork/src/main/java/com/iluwatar/unitofwork/Student.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java similarity index 100% rename from unitofwork/src/main/java/com/iluwatar/unitofwork/Student.java rename to unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java diff --git a/unitofwork/src/main/java/com/iluwatar/unitofwork/StudentDatabase.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentDatabase.java similarity index 100% rename from unitofwork/src/main/java/com/iluwatar/unitofwork/StudentDatabase.java rename to unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentDatabase.java diff --git a/unitofwork/src/main/java/com/iluwatar/unitofwork/StudentRepository.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java similarity index 100% rename from unitofwork/src/main/java/com/iluwatar/unitofwork/StudentRepository.java rename to unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java diff --git a/unitofwork/src/test/java/com/iluwatar/unitofwork/StudentRepositoryTest.java b/unit-of-work/src/test/java/com/iluwatar/unitofwork/StudentRepositoryTest.java similarity index 100% rename from unitofwork/src/test/java/com/iluwatar/unitofwork/StudentRepositoryTest.java rename to unit-of-work/src/test/java/com/iluwatar/unitofwork/StudentRepositoryTest.java From 2c9098aecc62f2396e2fabe4ae7b15aaa0156ffa Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Mon, 18 Sep 2017 22:31:13 +0530 Subject: [PATCH 028/100] #352- Unit Of Work : added the launching point of the module --- .../java/com/iluwatar/unitofwork/Student.java | 11 ++++ .../unitofwork/StudentManagementApp.java | 52 +++++++++++++++++++ .../unitofwork/StudentRepository.java | 29 ++++++++--- 3 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentManagementApp.java diff --git a/unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java index 9b77717ec..648a70462 100644 --- a/unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java +++ b/unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java @@ -43,4 +43,15 @@ public class Student { this.address = address; } + public String getName() { + return name; + } + + public Integer getId() { + return id; + } + + public String getAddress() { + return address; + } } diff --git a/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentManagementApp.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentManagementApp.java new file mode 100644 index 000000000..23d3b251b --- /dev/null +++ b/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentManagementApp.java @@ -0,0 +1,52 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2017 Piyush Chaudhari + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.iluwatar.unitofwork; + +import java.util.HashMap; +import java.util.List; + +/** + * {@link StudentManagementApp} Application for managing student data. + */ +public class StudentManagementApp { + /** + * + * @param args no argument sent + */ + public static void main(String[] args) { + Student ram = new Student(1, "Ram", "Street 9, Cupertino"); + Student shyam = new Student(2, "Shyam", "Z bridge, Pune"); + Student gopi = new Student(3, "Gopi", "Street 10, Mumbai"); + + HashMap> context = new HashMap<>(); + StudentDatabase studentDatabase = new StudentDatabase(); + StudentRepository studentRepository = new StudentRepository(context, studentDatabase); + + studentRepository.registerNew(ram); + studentRepository.registerModified(shyam); + studentRepository.registerDeleted(gopi); + studentRepository.commit(); + } +} diff --git a/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java index a2cff4ada..e26f0b7a4 100644 --- a/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java +++ b/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java @@ -24,6 +24,9 @@ package com.iluwatar.unitofwork; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -33,6 +36,8 @@ import java.util.Map; * supports unit of work for student data. */ public class StudentRepository implements IUnitOfWork { + private static final Logger LOGGER = LoggerFactory.getLogger(StudentRepository.class); + private Map> context; private StudentDatabase studentDatabase; @@ -47,17 +52,20 @@ public class StudentRepository implements IUnitOfWork { @Override public void registerNew(Student student) { + LOGGER.info("Registering {} for insert in context.", student.getName()); register(student, IUnitOfWork.INSERT); } @Override public void registerModified(Student student) { + LOGGER.info("Registering {} for modify in context.", student.getName()); register(student, IUnitOfWork.MODIFY); } @Override public void registerDeleted(Student student) { + LOGGER.info("Registering {} for delete in context.", student.getName()); register(student, IUnitOfWork.DELETE); } @@ -75,6 +83,7 @@ public class StudentRepository implements IUnitOfWork { if (context == null || context.size() == 0) { return; } + LOGGER.info("Commit started"); if (context.containsKey(IUnitOfWork.INSERT)) { commitInsert(); } @@ -85,26 +94,30 @@ public class StudentRepository implements IUnitOfWork { if (context.containsKey(IUnitOfWork.DELETE)) { commitDelete(); } + LOGGER.info("Commit finished."); } - private void commitDelete() { - List deletedStudents = context.get(IUnitOfWork.DELETE); - for (Student student : deletedStudents) { - studentDatabase.delete(student); + private void commitInsert() { + List studentsToBeInserted = context.get(IUnitOfWork.INSERT); + for (Student student : studentsToBeInserted) { + LOGGER.info("Saving {} to database.", student.getName()); + studentDatabase.insert(student); } } private void commitModify() { List modifiedStudents = context.get(IUnitOfWork.MODIFY); for (Student student : modifiedStudents) { + LOGGER.info("Modifying {} to database.", student.getName()); studentDatabase.modify(student); } } - private void commitInsert() { - List studentsToBeInserted = context.get(IUnitOfWork.INSERT); - for (Student student : studentsToBeInserted) { - studentDatabase.insert(student); + private void commitDelete() { + List deletedStudents = context.get(IUnitOfWork.DELETE); + for (Student student : deletedStudents) { + LOGGER.info("Deleting {} to database.", student.getName()); + studentDatabase.delete(student); } } } From 06ba337b9061161d532c73308e0f09f9c17f12b9 Mon Sep 17 00:00:00 2001 From: Gopinath Langote Date: Tue, 19 Sep 2017 19:00:19 +0530 Subject: [PATCH 029/100] #631 - Partial Response : Add class diagram --- partial-response/etc/partial-response.ucls | 65 ++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 partial-response/etc/partial-response.ucls diff --git a/partial-response/etc/partial-response.ucls b/partial-response/etc/partial-response.ucls new file mode 100644 index 000000000..a0b029496 --- /dev/null +++ b/partial-response/etc/partial-response.ucls @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 530b9e966238c282db2dc3760384ae8326afb760 Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Tue, 19 Sep 2017 20:39:48 +0530 Subject: [PATCH 030/100] #352- Unit Of Work : added the readme file --- unit-of-work/README.md | 31 +++++++++++++++++ unit-of-work/etc/unit-of-work.ucls | 48 ++++++++++++++++++++++++++ unit-of-work/etc/unit-of-work.urm.png | Bin 0 -> 19132 bytes 3 files changed, 79 insertions(+) create mode 100644 unit-of-work/README.md create mode 100644 unit-of-work/etc/unit-of-work.ucls create mode 100644 unit-of-work/etc/unit-of-work.urm.png diff --git a/unit-of-work/README.md b/unit-of-work/README.md new file mode 100644 index 000000000..b04311df8 --- /dev/null +++ b/unit-of-work/README.md @@ -0,0 +1,31 @@ +--- +layout: pattern +title: Unit Of Work +folder: unit-of-work +permalink: /patterns/unit-of-work/ +pumlid: +categories: Architectural +tags: + - Java + - KISS + - YAGNI + - Difficulty-Beginner +--- + +## Intent +When a business transaction is completed all the these updates are sent as one + big unit of work to be persisted in a database in one go so as to minimize database trips. + +![alt text](etc/unit-of-work.urm.png "unit-of-work") + +## Applicability +Use the Unit Of Work pattern when + +* The client is asking to optimize the time taken for database transactions. +* When you want to boost the performance to get database records. +* You want reduce number of database calls. + +## Credits + +* [Design Pattern - Unit Of Work Pattern](https://www.codeproject.com/Articles/581487/Unit-of-Work-Design-Pattern) +* [Unit Of Work](https://martinfowler.com/eaaCatalog/unitOfWork.html) diff --git a/unit-of-work/etc/unit-of-work.ucls b/unit-of-work/etc/unit-of-work.ucls new file mode 100644 index 000000000..15f777aad --- /dev/null +++ b/unit-of-work/etc/unit-of-work.ucls @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/unit-of-work/etc/unit-of-work.urm.png b/unit-of-work/etc/unit-of-work.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..46facff8dee4c45b2c6bbafb7ea6c3b6be80dfc3 GIT binary patch literal 19132 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 R(&9dol~j_*6aUNm{{y~+`I`U$ literal 0 HcmV?d00001 From 1dc143abca645a27c5ff7d05864cc7cd9ad1a955 Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Tue, 19 Sep 2017 22:49:09 +0530 Subject: [PATCH 031/100] #352- Unit Of Work : Update puml diagram. --- unit-of-work/etc/unit-of-work.ucls | 48 ------------------------- unit-of-work/etc/unit-of-work.urm.png | Bin 19132 -> 41952 bytes unit-of-work/etc/unit-of-work.urm.puml | 38 ++++++++++++++++++++ 3 files changed, 38 insertions(+), 48 deletions(-) delete mode 100644 unit-of-work/etc/unit-of-work.ucls diff --git a/unit-of-work/etc/unit-of-work.ucls b/unit-of-work/etc/unit-of-work.ucls deleted file mode 100644 index 15f777aad..000000000 --- a/unit-of-work/etc/unit-of-work.ucls +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/unit-of-work/etc/unit-of-work.urm.png b/unit-of-work/etc/unit-of-work.urm.png index 46facff8dee4c45b2c6bbafb7ea6c3b6be80dfc3..3a7c0d377eb69d445bdbad1879470a11ba4f5c68 100644 GIT binary patch literal 41952 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 R(&9dol~j_*6aUNm{{y~+`I`U$ diff --git a/unit-of-work/etc/unit-of-work.urm.puml b/unit-of-work/etc/unit-of-work.urm.puml index 329185e30..7f7920daf 100644 --- a/unit-of-work/etc/unit-of-work.urm.puml +++ b/unit-of-work/etc/unit-of-work.urm.puml @@ -1,10 +1,48 @@ @startuml package com.iluwatar.unitofwork { + interface IUnitOfWork { + + DELETE : String {static} + + INSERT : String {static} + + MODIFY : String {static} + + commit() {abstract} + + registerDeleted(T) {abstract} + + registerModified(T) {abstract} + + registerNew(T) {abstract} + } class Student { - address : String - id : Integer - name : String + Student(id : Integer, name : String, address : String) + + getAddress() : String + + getId() : Integer + + getName() : String + } + class StudentDatabase { + + StudentDatabase() + + delete(student : Student) + + insert(student : Student) + + modify(student : Student) + } + class StudentManagementApp { + + StudentManagementApp() + + main(args : String[]) {static} + } + class StudentRepository { + - LOGGER : Logger {static} + - context : Map> + - studentDatabase : StudentDatabase + + StudentRepository(context : Map>, studentDatabase : StudentDatabase) + + commit() + - commitDelete() + - commitInsert() + - commitModify() + - register(student : Student, operation : String) + + registerDeleted(student : Student) + + registerModified(student : Student) + + registerNew(student : Student) } } +StudentRepository --> "-studentDatabase" StudentDatabase +StudentRepository ..|> IUnitOfWork @enduml \ No newline at end of file From acaccc1c539a820853b86daaeec47859919569fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20Reegn?= Date: Tue, 19 Sep 2017 19:59:52 +0200 Subject: [PATCH 032/100] Fix naked objects thesis url The commit fixes the URL, changing from a non-working URL to an actually working one. The URL was copied from the wikipedia page for Naked Objects. --- naked-objects/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/naked-objects/README.md b/naked-objects/README.md index 66e6ac2b0..eb1c083b1 100644 --- a/naked-objects/README.md +++ b/naked-objects/README.md @@ -29,4 +29,4 @@ Use the Naked Objects pattern when ## Credits -* [Richard Pawson - Naked Objects](https://isis.apache.org/resources/thesis/Pawson-Naked-Objects-thesis.pdf) +* [Richard Pawson - Naked Objects](http://downloads.nakedobjects.net/resources/Pawson%20thesis.pdf) From eb36033b833fe6bea0a9caf52842ece1cc743c62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Tue, 19 Sep 2017 23:20:40 +0300 Subject: [PATCH 033/100] #590 Add explanation for Chain of Responsibility --- chain/README.md | 126 ++++++++++++++++++++++++++++++++++++++- chain/etc/chain.png | Bin 31068 -> 0 bytes chain/etc/chain.ucls | 109 --------------------------------- chain/etc/chain.urm.puml | 61 ------------------- chain/etc/chain_1.png | Bin 61616 -> 0 bytes pom.xml | 2 + proxy/etc/proxy.png | Bin 22953 -> 0 bytes proxy/etc/proxy.ucls | 72 ---------------------- proxy/etc/proxy.urm.puml | 32 ---------- 9 files changed, 127 insertions(+), 275 deletions(-) delete mode 100644 chain/etc/chain.png delete mode 100644 chain/etc/chain.ucls delete mode 100644 chain/etc/chain.urm.puml delete mode 100644 chain/etc/chain_1.png delete mode 100644 proxy/etc/proxy.png delete mode 100644 proxy/etc/proxy.ucls delete mode 100644 proxy/etc/proxy.urm.puml diff --git a/chain/README.md b/chain/README.md index f5f6c9de9..1d7eb5b73 100644 --- a/chain/README.md +++ b/chain/README.md @@ -16,7 +16,131 @@ Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it. -![alt text](./etc/chain_1.png "Chain of Responsibility") +## Explanation + +Real world example + +> The Orc King gives loud orders to his army. The closest one to react is the commander, then officer and then soldier. The commander, officer and soldier here form a chain of responsibility. + +In plain words + +> It helps building a chain of objects. Request enters from one end and keeps going from object to object till it finds the suitable handler. + +Wikipedia says + +> In object-oriented design, the chain-of-responsibility pattern is a design pattern consisting of a source of command objects and a series of processing objects. Each processing object contains logic that defines the types of command objects that it can handle; the rest are passed to the next processing object in the chain. + +**Programmatic Example** + +Translating our example with orcs from above. First we have the request class + +``` +public class Request { + + private final RequestType requestType; + private final String requestDescription; + private boolean handled; + + public Request(final RequestType requestType, final String requestDescription) { + this.requestType = Objects.requireNonNull(requestType); + this.requestDescription = Objects.requireNonNull(requestDescription); + } + + public String getRequestDescription() { return requestDescription; } + + public RequestType getRequestType() { return requestType; } + + public void markHandled() { this.handled = true; } + + public boolean isHandled() { return this.handled; } + + @Override + public String toString() { return getRequestDescription(); } +} + +public enum RequestType { + DEFEND_CASTLE, TORTURE_PRISONER, COLLECT_TAX +} +``` + +Then the request handler hierarchy + +``` +public abstract class RequestHandler { + private static final Logger LOGGER = LoggerFactory.getLogger(RequestHandler.class); + private RequestHandler next; + + public RequestHandler(RequestHandler next) { + this.next = next; + } + + public void handleRequest(Request req) { + if (next != null) { + next.handleRequest(req); + } + } + + protected void printHandling(Request req) { + LOGGER.info("{} handling request \"{}\"", this, req); + } + + @Override + public abstract String toString(); +} + +public class OrcCommander extends RequestHandler { + public OrcCommander(RequestHandler handler) { + super(handler); + } + + @Override + public void handleRequest(Request req) { + if (req.getRequestType().equals(RequestType.DEFEND_CASTLE)) { + printHandling(req); + req.markHandled(); + } else { + super.handleRequest(req); + } + } + + @Override + public String toString() { + return "Orc commander"; + } +} + +// OrcOfficer and OrcSoldier are defined similarly as OrcCommander + +``` + +Then we have the Orc King who gives the orders and forms the chain + +``` +public class OrcKing { + RequestHandler chain; + + public OrcKing() { + buildChain(); + } + + private void buildChain() { + chain = new OrcCommander(new OrcOfficer(new OrcSoldier(null))); + } + + public void makeRequest(Request req) { + chain.handleRequest(req); + } +} +``` + +Then it is used as follows + +``` +OrcKing king = new OrcKing(); +king.makeRequest(new Request(RequestType.DEFEND_CASTLE, "defend castle")); // Orc commander handling request "defend castle" +king.makeRequest(new Request(RequestType.TORTURE_PRISONER, "torture prisoner")); // Orc officer handling request "torture prisoner" +king.makeRequest(new Request(RequestType.COLLECT_TAX, "collect tax")); // Orc soldier handling request "collect tax" +``` ## Applicability Use Chain of Responsibility when diff --git a/chain/etc/chain.png b/chain/etc/chain.png deleted file mode 100644 index 7316ff3d041770ea04e66cc4c2d14f796fb66941..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31068 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/chain/etc/chain.urm.puml b/chain/etc/chain.urm.puml deleted file mode 100644 index 4a2f6a188..000000000 --- a/chain/etc/chain.urm.puml +++ /dev/null @@ -1,61 +0,0 @@ -@startuml -package com.iluwatar.chain { - class App { - + App() - + main(args : String[]) {static} - } - class OrcCommander { - + OrcCommander(handler : RequestHandler) - + handleRequest(req : Request) - + toString() : String - } - class OrcKing { - ~ chain : RequestHandler - + OrcKing() - - buildChain() - + makeRequest(req : Request) - } - class OrcOfficer { - + OrcOfficer(handler : RequestHandler) - + handleRequest(req : Request) - + toString() : String - } - class OrcSoldier { - + OrcSoldier(handler : RequestHandler) - + handleRequest(req : Request) - + toString() : String - } - class Request { - - handled : boolean - - requestDescription : String - - requestType : RequestType - + Request(requestType : RequestType, requestDescription : String) - + getRequestDescription() : String - + getRequestType() : RequestType - + isHandled() : boolean - + markHandled() - + toString() : String - } - abstract class RequestHandler { - - LOGGER : Logger {static} - - next : RequestHandler - + RequestHandler(next : RequestHandler) - + handleRequest(req : Request) - # printHandling(req : Request) - + toString() : String {abstract} - } - enum RequestType { - + COLLECT_TAX {static} - + DEFEND_CASTLE {static} - + TORTURE_PRISONER {static} - + valueOf(name : String) : RequestType {static} - + values() : RequestType[] {static} - } -} -RequestHandler --> "-next" RequestHandler -Request --> "-requestType" RequestType -OrcKing --> "-chain" RequestHandler -OrcCommander --|> RequestHandler -OrcOfficer --|> RequestHandler -OrcSoldier --|> RequestHandler -@enduml \ No newline at end of file diff --git a/chain/etc/chain_1.png b/chain/etc/chain_1.png deleted file mode 100644 index fe9e3d6edcbce86f69ba5f60db935b249a54efca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61616 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 facade flyweight + proxy + chain diff --git a/proxy/etc/proxy.png b/proxy/etc/proxy.png deleted file mode 100644 index 300e58dd331166ed17916edc2719e137c54154f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22953 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/proxy/etc/proxy.urm.puml b/proxy/etc/proxy.urm.puml deleted file mode 100644 index ffe0fa446..000000000 --- a/proxy/etc/proxy.urm.puml +++ /dev/null @@ -1,32 +0,0 @@ -@startuml -package com.iluwatar.proxy { - class App { - + App() - + main(args : String[]) {static} - } - class IvoryTower { - - LOGGER : Logger {static} - + IvoryTower() - + enter(wizard : Wizard) - } - class Wizard { - - name : String - + Wizard(name : String) - + toString() : String - } - interface WizardTower { - + enter(Wizard) {abstract} - } - class WizardTowerProxy { - - LOGGER : Logger {static} - - NUM_WIZARDS_ALLOWED : int {static} - - numWizards : int - - tower : WizardTower - + WizardTowerProxy(tower : WizardTower) - + enter(wizard : Wizard) - } -} -WizardTowerProxy --> "-tower" WizardTower -IvoryTower ..|> WizardTower -WizardTowerProxy ..|> WizardTower -@enduml \ No newline at end of file From d8ac00536c2aea6b6384640c3ac1ac9fe9af300b Mon Sep 17 00:00:00 2001 From: Dos Debug Date: Thu, 21 Sep 2017 15:13:57 +0500 Subject: [PATCH 034/100] Fixes Checkstyle problems There are few checkstyles problems found in the which are required to be fixed --- .../main/java/com/iluwatar/model/view/presenter/FileLoader.java | 2 +- .../iluwatar/model/view/presenter/FileSelectorPresenter.java | 2 +- .../com/iluwatar/model/view/presenter/FileSelectorView.java | 2 +- mutex/src/test/java/com/iluwatar/mutex/AppTest.java | 2 +- semaphore/src/test/java/com/iluwatar/semaphore/AppTest.java | 2 +- .../java/com/iluwatar/throttling/timer/ThrottleTimerImpl.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileLoader.java b/model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileLoader.java index f5606e638..5952cf5f1 100644 --- a/model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileLoader.java +++ b/model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileLoader.java @@ -36,7 +36,7 @@ import org.slf4j.LoggerFactory; *

* It is responsible for reading and loading the contents of a given file. */ -public class FileLoader implements Serializable{ +public class FileLoader implements Serializable { /** * Generated serial version UID diff --git a/model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileSelectorPresenter.java b/model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileSelectorPresenter.java index 560a8d274..233b1dcf7 100644 --- a/model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileSelectorPresenter.java +++ b/model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileSelectorPresenter.java @@ -30,7 +30,7 @@ import java.io.Serializable; *

* It is responsible for reacting to the user's actions and update the View component. */ -public class FileSelectorPresenter implements Serializable{ +public class FileSelectorPresenter implements Serializable { /** * Generated serial version UID diff --git a/model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileSelectorView.java b/model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileSelectorView.java index 5272ea0b7..e6ab93f66 100644 --- a/model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileSelectorView.java +++ b/model-view-presenter/src/main/java/com/iluwatar/model/view/presenter/FileSelectorView.java @@ -28,7 +28,7 @@ import java.io.Serializable; * This interface represents the View component in the Model-View-Presenter pattern. It can be * implemented by either the GUI components, or by the Stub. */ -public interface FileSelectorView extends Serializable{ +public interface FileSelectorView extends Serializable { /** * Opens the view. diff --git a/mutex/src/test/java/com/iluwatar/mutex/AppTest.java b/mutex/src/test/java/com/iluwatar/mutex/AppTest.java index f224a56f5..530db835d 100644 --- a/mutex/src/test/java/com/iluwatar/mutex/AppTest.java +++ b/mutex/src/test/java/com/iluwatar/mutex/AppTest.java @@ -28,7 +28,7 @@ import java.io.IOException; /** * Application Test Entrypoint */ -public class AppTest{ +public class AppTest { @Test public void test() throws IOException { String[] args = {}; diff --git a/semaphore/src/test/java/com/iluwatar/semaphore/AppTest.java b/semaphore/src/test/java/com/iluwatar/semaphore/AppTest.java index 26d274262..5eaed3b2e 100644 --- a/semaphore/src/test/java/com/iluwatar/semaphore/AppTest.java +++ b/semaphore/src/test/java/com/iluwatar/semaphore/AppTest.java @@ -28,7 +28,7 @@ import java.io.IOException; /** * Application Test Entrypoint */ -public class AppTest{ +public class AppTest { @Test public void test() throws IOException { String[] args = {}; diff --git a/throttling/src/main/java/com/iluwatar/throttling/timer/ThrottleTimerImpl.java b/throttling/src/main/java/com/iluwatar/throttling/timer/ThrottleTimerImpl.java index 51c5e3c28..4ff4ce246 100644 --- a/throttling/src/main/java/com/iluwatar/throttling/timer/ThrottleTimerImpl.java +++ b/throttling/src/main/java/com/iluwatar/throttling/timer/ThrottleTimerImpl.java @@ -35,7 +35,7 @@ import com.iluwatar.throttling.CallsCount; * @author drastogi * */ -public class ThrottleTimerImpl implements Throttler{ +public class ThrottleTimerImpl implements Throttler { private int throttlePeriod; From c9f40483017e9d1bdd0b514929c6ebcf68256a63 Mon Sep 17 00:00:00 2001 From: Dos Debug Date: Thu, 21 Sep 2017 20:10:12 +0500 Subject: [PATCH 035/100] Removes unused size and visibility enumerations --- command/src/main/java/com/iluwatar/command/Size.java | 2 +- command/src/main/java/com/iluwatar/command/Visibility.java | 2 +- command/src/main/java/com/iluwatar/command/Wizard.java | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/command/src/main/java/com/iluwatar/command/Size.java b/command/src/main/java/com/iluwatar/command/Size.java index 1e72474cc..25f94a101 100644 --- a/command/src/main/java/com/iluwatar/command/Size.java +++ b/command/src/main/java/com/iluwatar/command/Size.java @@ -29,7 +29,7 @@ package com.iluwatar.command; */ public enum Size { - SMALL("small"), NORMAL("normal"), LARGE("large"), UNDEFINED(""); + SMALL("small"), NORMAL("normal"); private String title; diff --git a/command/src/main/java/com/iluwatar/command/Visibility.java b/command/src/main/java/com/iluwatar/command/Visibility.java index 802927b9d..8c360d534 100644 --- a/command/src/main/java/com/iluwatar/command/Visibility.java +++ b/command/src/main/java/com/iluwatar/command/Visibility.java @@ -29,7 +29,7 @@ package com.iluwatar.command; */ public enum Visibility { - VISIBLE("visible"), INVISIBLE("invisible"), UNDEFINED(""); + VISIBLE("visible"), INVISIBLE("invisible"); private String title; diff --git a/command/src/main/java/com/iluwatar/command/Wizard.java b/command/src/main/java/com/iluwatar/command/Wizard.java index 501676984..866ea0e0f 100644 --- a/command/src/main/java/com/iluwatar/command/Wizard.java +++ b/command/src/main/java/com/iluwatar/command/Wizard.java @@ -40,7 +40,9 @@ public class Wizard { private Deque undoStack = new LinkedList<>(); private Deque redoStack = new LinkedList<>(); - public Wizard() {} + public Wizard() { + // comment to ignore sonar issue: LEVEL critical + } /** * Cast spell From a59e0fa961ea3beeb201ed75208ee2ad96db41af Mon Sep 17 00:00:00 2001 From: Gopinath Langote Date: Fri, 22 Sep 2017 11:53:26 +0530 Subject: [PATCH 036/100] #631 - Partial Response : Update copyright header. --- .../main/java/com/iluwatar/partialresponse/FieldJsonMapper.java | 2 +- .../src/main/java/com/iluwatar/partialresponse/Video.java | 2 +- .../main/java/com/iluwatar/partialresponse/VideoClientApp.java | 2 +- .../main/java/com/iluwatar/partialresponse/VideoResource.java | 2 +- .../java/com/iluwatar/partialresponse/FieldJsonMapperTest.java | 2 +- .../java/com/iluwatar/partialresponse/VideoResourceTest.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/partial-response/src/main/java/com/iluwatar/partialresponse/FieldJsonMapper.java b/partial-response/src/main/java/com/iluwatar/partialresponse/FieldJsonMapper.java index 8a8ae087a..9283cfa69 100644 --- a/partial-response/src/main/java/com/iluwatar/partialresponse/FieldJsonMapper.java +++ b/partial-response/src/main/java/com/iluwatar/partialresponse/FieldJsonMapper.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2017 Gopinath Langote + * Copyright (c) 2014-2017 Gopinath Langote * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java b/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java index d5d56f4fd..050db71b5 100644 --- a/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java +++ b/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2017 Gopinath Langote + * Copyright (c) 2014-2017 Gopinath Langote * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/partial-response/src/main/java/com/iluwatar/partialresponse/VideoClientApp.java b/partial-response/src/main/java/com/iluwatar/partialresponse/VideoClientApp.java index af1d48029..0f2fb96e0 100644 --- a/partial-response/src/main/java/com/iluwatar/partialresponse/VideoClientApp.java +++ b/partial-response/src/main/java/com/iluwatar/partialresponse/VideoClientApp.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2017 Gopinath Langote + * Copyright (c) 2014-2017 Gopinath Langote * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java b/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java index fefb7277c..2bf7a73c1 100644 --- a/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java +++ b/partial-response/src/main/java/com/iluwatar/partialresponse/VideoResource.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2017 Gopinath Langote + * Copyright (c) 2014-2017 Gopinath Langote * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/partial-response/src/test/java/com/iluwatar/partialresponse/FieldJsonMapperTest.java b/partial-response/src/test/java/com/iluwatar/partialresponse/FieldJsonMapperTest.java index d8ddd5881..9bc078b57 100644 --- a/partial-response/src/test/java/com/iluwatar/partialresponse/FieldJsonMapperTest.java +++ b/partial-response/src/test/java/com/iluwatar/partialresponse/FieldJsonMapperTest.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2017 Gopinath Langote + * Copyright (c) 2014-2017 Gopinath Langote * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java b/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java index 1415e77b2..0453e8ffd 100644 --- a/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java +++ b/partial-response/src/test/java/com/iluwatar/partialresponse/VideoResourceTest.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2017 Gopinath Langote + * Copyright (c) 2014-2017 Gopinath Langote * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal From 5d8d312733b9de93bc0ce3cc25d30174cce47cc4 Mon Sep 17 00:00:00 2001 From: Gopinath Langote Date: Fri, 22 Sep 2017 11:55:21 +0530 Subject: [PATCH 037/100] #631 - Partial Response : Made final private variables in immutable class. --- .../java/com/iluwatar/partialresponse/Video.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java b/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java index 050db71b5..e242965e3 100644 --- a/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java +++ b/partial-response/src/main/java/com/iluwatar/partialresponse/Video.java @@ -29,12 +29,12 @@ package com.iluwatar.partialresponse; *

*/ public class Video { - private Integer id; - private String title; - private Integer length; - private String description; - private String director; - private String language; + private final Integer id; + private final String title; + private final Integer length; + private final String description; + private final String director; + private final String language; /** * @param id video unique id From 7f9789ce1dba6fd756a2a5cc876d6cf7cb8d852a Mon Sep 17 00:00:00 2001 From: Gopinath Langote Date: Fri, 22 Sep 2017 11:57:12 +0530 Subject: [PATCH 038/100] #631 - Partial Response : [Refactor] Made Main class name as App for consistancy. --- .../partialresponse/{VideoClientApp.java => App.java} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename partial-response/src/main/java/com/iluwatar/partialresponse/{VideoClientApp.java => App.java} (93%) diff --git a/partial-response/src/main/java/com/iluwatar/partialresponse/VideoClientApp.java b/partial-response/src/main/java/com/iluwatar/partialresponse/App.java similarity index 93% rename from partial-response/src/main/java/com/iluwatar/partialresponse/VideoClientApp.java rename to partial-response/src/main/java/com/iluwatar/partialresponse/App.java index 0f2fb96e0..0fe50594c 100644 --- a/partial-response/src/main/java/com/iluwatar/partialresponse/VideoClientApp.java +++ b/partial-response/src/main/java/com/iluwatar/partialresponse/App.java @@ -32,15 +32,15 @@ import java.util.Map; /** * The Partial response pattern is a design pattern in which client specifies fields to fetch to serve. - * Here {@link VideoClientApp} is playing as client for {@link VideoResource} server. + * Here {@link App} is playing as client for {@link VideoResource} server. * Client ask for specific fields information in video to server. *

*

* {@link VideoResource} act as server to serve video information. */ -public class VideoClientApp { - private static final Logger LOGGER = LoggerFactory.getLogger(VideoClientApp.class); +public class App { + private static final Logger LOGGER = LoggerFactory.getLogger(App.class); /** * Method as act client and request to server for video details. From c63494cef20024fce97830711f3349aab703a07f Mon Sep 17 00:00:00 2001 From: Gopinath Langote Date: Fri, 22 Sep 2017 12:01:38 +0530 Subject: [PATCH 039/100] #631 - Partial Response : Modify intendation. --- .../com/iluwatar/partialresponse/AppTest.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 partial-response/src/test/java/com/iluwatar/partialresponse/AppTest.java diff --git a/partial-response/src/test/java/com/iluwatar/partialresponse/AppTest.java b/partial-response/src/test/java/com/iluwatar/partialresponse/AppTest.java new file mode 100644 index 000000000..7e4f27b7d --- /dev/null +++ b/partial-response/src/test/java/com/iluwatar/partialresponse/AppTest.java @@ -0,0 +1,38 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2014-2017 Gopinath Langote + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.iluwatar.partialresponse; + +import org.junit.Test; + +/** + * Application test + */ +public class AppTest { + @Test + public void test() throws Exception { + String[] args = {}; + App.main(args); + } +} \ No newline at end of file From 06b5c671f5897b98fa9e713cdaf652d022f1ded3 Mon Sep 17 00:00:00 2001 From: Gopinath Langote Date: Fri, 22 Sep 2017 12:33:11 +0530 Subject: [PATCH 040/100] #631 - Partial Response : Modify AppTest. --- .../src/test/java/com/iluwatar/partialresponse/AppTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/partial-response/src/test/java/com/iluwatar/partialresponse/AppTest.java b/partial-response/src/test/java/com/iluwatar/partialresponse/AppTest.java index 7e4f27b7d..2ac34dd0d 100644 --- a/partial-response/src/test/java/com/iluwatar/partialresponse/AppTest.java +++ b/partial-response/src/test/java/com/iluwatar/partialresponse/AppTest.java @@ -30,9 +30,11 @@ import org.junit.Test; * Application test */ public class AppTest { + @Test - public void test() throws Exception { + public void main() throws Exception { String[] args = {}; App.main(args); } + } \ No newline at end of file From bf700fd995499c487ba65be34d1da47cd8123f68 Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sat, 23 Sep 2017 00:14:13 +0530 Subject: [PATCH 041/100] #352- Unit Of Work : Make final instance variable of immutable Student class. --- .../src/main/java/com/iluwatar/unitofwork/Student.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java index 648a70462..fbe825b31 100644 --- a/unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java +++ b/unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java @@ -28,9 +28,9 @@ package com.iluwatar.unitofwork; * {@link Student} is an entity. */ public class Student { - private Integer id; - private String name; - private String address; + private final Integer id; + private final String name; + private final String address; /** * @param id student unique id From 9ee2255c1fe9e35e6e03b3ba229198cab8cf5b68 Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sat, 23 Sep 2017 00:15:32 +0530 Subject: [PATCH 042/100] #352- Unit Of Work : [Refactor] Rename main class to App --- .../unitofwork/{StudentManagementApp.java => App.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename unit-of-work/src/main/java/com/iluwatar/unitofwork/{StudentManagementApp.java => App.java} (94%) diff --git a/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentManagementApp.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/App.java similarity index 94% rename from unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentManagementApp.java rename to unit-of-work/src/main/java/com/iluwatar/unitofwork/App.java index 23d3b251b..80c87d821 100644 --- a/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentManagementApp.java +++ b/unit-of-work/src/main/java/com/iluwatar/unitofwork/App.java @@ -28,9 +28,9 @@ import java.util.HashMap; import java.util.List; /** - * {@link StudentManagementApp} Application for managing student data. + * {@link App} Application for managing student data. */ -public class StudentManagementApp { +public class App { /** * * @param args no argument sent From 633d3a97a0a0638a70d7a24f04e290d17bb8cce9 Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sat, 23 Sep 2017 00:18:06 +0530 Subject: [PATCH 043/100] #352- Unit Of Work : Add AppTest --- .../java/com/iluwatar/unitofwork/AppTest.java | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 unit-of-work/src/test/java/com/iluwatar/unitofwork/AppTest.java diff --git a/unit-of-work/src/test/java/com/iluwatar/unitofwork/AppTest.java b/unit-of-work/src/test/java/com/iluwatar/unitofwork/AppTest.java new file mode 100644 index 000000000..942db781f --- /dev/null +++ b/unit-of-work/src/test/java/com/iluwatar/unitofwork/AppTest.java @@ -0,0 +1,40 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2014-2017 Piyush Chaudhari + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.iluwatar.unitofwork; + +import org.junit.Test; + +import java.io.IOException; + +/** + * AppTest + */ +public class AppTest { + @Test + public void test() throws IOException { + String[] args = {}; + App.main(args); + } +} From 1fb0525c6ef7d79481419335d71fd760918ef25f Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sat, 23 Sep 2017 00:30:18 +0530 Subject: [PATCH 044/100] #352- Unit Of Work : Remove affected lines. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f4c8dbabc..df3da6e3d 100644 --- a/pom.xml +++ b/pom.xml @@ -113,6 +113,7 @@ layers message-channel fluentinterface + reactor caching publish-subscribe delegation @@ -303,7 +304,6 @@ prepare-agent - From 00dcf24e16a1c1389c336bc8af0e71ec0034a291 Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sat, 23 Sep 2017 00:34:45 +0530 Subject: [PATCH 045/100] #352- Unit Of Work : Update licence. --- unit-of-work/src/main/java/com/iluwatar/unitofwork/App.java | 2 +- .../src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java | 2 +- unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java | 2 +- .../src/main/java/com/iluwatar/unitofwork/StudentDatabase.java | 2 +- .../main/java/com/iluwatar/unitofwork/StudentRepository.java | 2 +- .../java/com/iluwatar/unitofwork/StudentRepositoryTest.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/unit-of-work/src/main/java/com/iluwatar/unitofwork/App.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/App.java index 80c87d821..9b4b2f15c 100644 --- a/unit-of-work/src/main/java/com/iluwatar/unitofwork/App.java +++ b/unit-of-work/src/main/java/com/iluwatar/unitofwork/App.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2017 Piyush Chaudhari + * Copyright (c) 2014-2017 Piyush Chaudhari * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/unit-of-work/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java index d63a6d8c7..bd1fcbffa 100644 --- a/unit-of-work/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java +++ b/unit-of-work/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2017 Piyush Chaudhari + * Copyright (c) 2014-2017 Piyush Chaudhari * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java index fbe825b31..5a57ccdde 100644 --- a/unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java +++ b/unit-of-work/src/main/java/com/iluwatar/unitofwork/Student.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2017 Piyush Chaudhari + * Copyright (c) 2014-2017 Piyush Chaudhari * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentDatabase.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentDatabase.java index 678fe4026..6b0e85517 100644 --- a/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentDatabase.java +++ b/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentDatabase.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2017 Piyush Chaudhari + * Copyright (c) 2014-2017 Piyush Chaudhari * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java index e26f0b7a4..7bcccc61b 100644 --- a/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java +++ b/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2017 Piyush Chaudhari + * Copyright (c) 2014-2017 Piyush Chaudhari * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/unit-of-work/src/test/java/com/iluwatar/unitofwork/StudentRepositoryTest.java b/unit-of-work/src/test/java/com/iluwatar/unitofwork/StudentRepositoryTest.java index 9a71dcbbc..ee63442a5 100644 --- a/unit-of-work/src/test/java/com/iluwatar/unitofwork/StudentRepositoryTest.java +++ b/unit-of-work/src/test/java/com/iluwatar/unitofwork/StudentRepositoryTest.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2017 Piyush Chaudhari + * Copyright (c) 2014-2017 Piyush Chaudhari * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal From 677f020813a55858aa87df358a3b9c2340c8a5f8 Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sat, 23 Sep 2017 00:49:01 +0530 Subject: [PATCH 046/100] #352- Unit Of Work : Add class diagram. --- unit-of-work/etc/unit-of-work.ucls | 68 ++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 unit-of-work/etc/unit-of-work.ucls diff --git a/unit-of-work/etc/unit-of-work.ucls b/unit-of-work/etc/unit-of-work.ucls new file mode 100644 index 000000000..98181f805 --- /dev/null +++ b/unit-of-work/etc/unit-of-work.ucls @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From a1ee8859d6c887959f57b98b762eb2c9ba972d8a Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sat, 23 Sep 2017 00:53:45 +0530 Subject: [PATCH 047/100] #352- Unit Of Work : Update puml diagram. --- unit-of-work/etc/unit-of-work.urm.png | Bin 41952 -> 40804 bytes unit-of-work/etc/unit-of-work.urm.puml | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/unit-of-work/etc/unit-of-work.urm.png b/unit-of-work/etc/unit-of-work.urm.png index 3a7c0d377eb69d445bdbad1879470a11ba4f5c68..bb192af544775ca7e761292cdd7e127312c468f1 100644 GIT binary patch literal 40804 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 { + DELETE : String {static} + INSERT : String {static} @@ -24,10 +28,6 @@ package com.iluwatar.unitofwork { + insert(student : Student) + modify(student : Student) } - class StudentManagementApp { - + StudentManagementApp() - + main(args : String[]) {static} - } class StudentRepository { - LOGGER : Logger {static} - context : Map> From dba2d8aef7e8c7bd203c780dc3336f4bc8804071 Mon Sep 17 00:00:00 2001 From: Gopinath Langote Date: Sat, 23 Sep 2017 01:03:16 +0530 Subject: [PATCH 048/100] #631 - Partial Response : [Refactor] Inline object creation. --- .../src/main/java/com/iluwatar/partialresponse/App.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/partial-response/src/main/java/com/iluwatar/partialresponse/App.java b/partial-response/src/main/java/com/iluwatar/partialresponse/App.java index 0fe50594c..2977b50a7 100644 --- a/partial-response/src/main/java/com/iluwatar/partialresponse/App.java +++ b/partial-response/src/main/java/com/iluwatar/partialresponse/App.java @@ -52,8 +52,7 @@ public class App { videos.put(1, new Video(1, "Avatar", 178, "epic science fiction film", "James Cameron", "English")); videos.put(2, new Video(2, "Godzilla Resurgence", 120, "Action & drama movie|", "Hideaki Anno", "Japanese")); videos.put(3, new Video(3, "Interstellar", 169, "Adventure & Sci-Fi", "Christopher Nolan", "English")); - FieldJsonMapper fieldJsonMapper = new FieldJsonMapper(); - VideoResource videoResource = new VideoResource(fieldJsonMapper, videos); + VideoResource videoResource = new VideoResource(new FieldJsonMapper(), videos); LOGGER.info("Retrieving full response from server:-"); From fb4c0f77e50a2050d7309dca8eca116f8e5a3b70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 23 Sep 2017 09:39:13 +0300 Subject: [PATCH 049/100] #631 Add missing license header --- partial-response/pom.xml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/partial-response/pom.xml b/partial-response/pom.xml index 7ce36ecec..ed685eb6a 100644 --- a/partial-response/pom.xml +++ b/partial-response/pom.xml @@ -1,4 +1,28 @@ + From 8e73728fdeb06d22ec7e149620834be11d8c7063 Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sun, 24 Sep 2017 12:56:06 +0530 Subject: [PATCH 050/100] #352- Unit Of Work : modified readme. --- unit-of-work/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unit-of-work/README.md b/unit-of-work/README.md index b04311df8..c67c1bc02 100644 --- a/unit-of-work/README.md +++ b/unit-of-work/README.md @@ -3,7 +3,7 @@ layout: pattern title: Unit Of Work folder: unit-of-work permalink: /patterns/unit-of-work/ -pumlid: + categories: Architectural tags: - Java From a2a08a3a3e8c218758580fc7dca899fb9446a057 Mon Sep 17 00:00:00 2001 From: Amit Dash Date: Sun, 24 Sep 2017 13:15:42 +0530 Subject: [PATCH 051/100] Removed redundant times(1) params for verify() --- bridge/src/test/java/com/iluwatar/bridge/WeaponTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bridge/src/test/java/com/iluwatar/bridge/WeaponTest.java b/bridge/src/test/java/com/iluwatar/bridge/WeaponTest.java index daec1014a..0e62374be 100644 --- a/bridge/src/test/java/com/iluwatar/bridge/WeaponTest.java +++ b/bridge/src/test/java/com/iluwatar/bridge/WeaponTest.java @@ -44,15 +44,15 @@ public abstract class WeaponTest { assertNotNull(weapon.getEnchantment()); weapon.swing(); - verify(enchantment, times(1)).apply(); + verify(enchantment).apply(); verifyNoMoreInteractions(enchantment); weapon.wield(); - verify(enchantment, times(1)).onActivate(); + verify(enchantment).onActivate(); verifyNoMoreInteractions(enchantment); weapon.unwield(); - verify(enchantment, times(1)).onDeactivate(); + verify(enchantment).onDeactivate(); verifyNoMoreInteractions(enchantment); } From 7db7df38fd4e15cfaf8e45d0350722d3b672f3ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 24 Sep 2017 19:36:15 +0300 Subject: [PATCH 052/100] Fix error in Checkstyle rule definition --- checkstyle.xml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/checkstyle.xml b/checkstyle.xml index 37db7e711..b3fbf19a8 100644 --- a/checkstyle.xml +++ b/checkstyle.xml @@ -85,9 +85,7 @@ value="LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH"/> - - - + From 01b85b972160d6131207381708e39afa080aa70a Mon Sep 17 00:00:00 2001 From: Deepanshu Rastogi Date: Mon, 25 Sep 2017 12:59:39 +0200 Subject: [PATCH 053/100] Used AtomicLong for concurrenthashmap operations --- .../com/iluwatar/throttling/B2BService.java | 2 +- .../com/iluwatar/throttling/CallsCount.java | 23 +++++++++++-------- .../iluwatar/throttling/B2BServiceTest.java | 7 +++--- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/throttling/src/main/java/com/iluwatar/throttling/B2BService.java b/throttling/src/main/java/com/iluwatar/throttling/B2BService.java index c9acd4b73..51ed492eb 100644 --- a/throttling/src/main/java/com/iluwatar/throttling/B2BService.java +++ b/throttling/src/main/java/com/iluwatar/throttling/B2BService.java @@ -46,7 +46,7 @@ class B2BService { */ public int dummyCustomerApi(Tenant tenant) { String tenantName = tenant.getName(); - int count = CallsCount.getCount(tenantName); + long count = CallsCount.getCount(tenantName); LOGGER.debug("Counter for {} : {} ", tenant.getName(), count); if (count >= tenant.getAllowedCallsPerSecond()) { LOGGER.error("API access per second limit reached for: {}", tenantName); diff --git a/throttling/src/main/java/com/iluwatar/throttling/CallsCount.java b/throttling/src/main/java/com/iluwatar/throttling/CallsCount.java index 81195b074..25b3dedb3 100644 --- a/throttling/src/main/java/com/iluwatar/throttling/CallsCount.java +++ b/throttling/src/main/java/com/iluwatar/throttling/CallsCount.java @@ -22,9 +22,13 @@ */ package com.iluwatar.throttling; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicLong; /** * A class to keep track of the counter of different Tenants @@ -32,16 +36,16 @@ import java.util.concurrent.ConcurrentHashMap; * */ public final class CallsCount { - private static Map tenantCallsCount = new ConcurrentHashMap<>(); + + private static final Logger LOGGER = LoggerFactory.getLogger(CallsCount.class); + private static Map tenantCallsCount = new ConcurrentHashMap<>(); /** * Add a new tenant to the map. * @param tenantName name of the tenant. */ public static void addTenant(String tenantName) { - if (!tenantCallsCount.containsKey(tenantName)) { - tenantCallsCount.put(tenantName, 0); - } + tenantCallsCount.putIfAbsent(tenantName, new AtomicLong(0)); } /** @@ -49,7 +53,7 @@ public final class CallsCount { * @param tenantName name of the tenant. */ public static void incrementCount(String tenantName) { - tenantCallsCount.put(tenantName, tenantCallsCount.get(tenantName) + 1); + tenantCallsCount.get(tenantName).incrementAndGet(); } /** @@ -57,16 +61,17 @@ public final class CallsCount { * @param tenantName name of the tenant. * @return the count of the tenant. */ - public static int getCount(String tenantName) { - return tenantCallsCount.get(tenantName); + public static Long getCount(String tenantName) { + return tenantCallsCount.get(tenantName).get(); } /** * Resets the count of all the tenants in the map. */ public static void reset() { - for (Entry e : tenantCallsCount.entrySet()) { - tenantCallsCount.put(e.getKey(), 0); + LOGGER.debug("Resetting the map."); + for (Entry e : tenantCallsCount.entrySet()) { + tenantCallsCount.put(e.getKey(), new AtomicLong(0)); } } } diff --git a/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java b/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java index b9ca1a1d8..4ea540bcd 100644 --- a/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java +++ b/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java @@ -36,14 +36,15 @@ public class B2BServiceTest { @Test public void dummyCustomerApiTest() { Tenant tenant = new Tenant("testTenant", 2); - Throttler timer = new ThrottleTimerImpl(10); + Throttler timer = new ThrottleTimerImpl(100); B2BService service = new B2BService(timer); - + + long counter = 0; for (int i = 0; i < 5; i++) { service.dummyCustomerApi(tenant); + counter = CallsCount.getCount(tenant.getName()); } - int counter = CallsCount.getCount(tenant.getName()); Assert.assertTrue("Counter limit must be reached", counter == 2); } } From 244e9c7caa7fbfdb6022b847387ffacd6aec71ad Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Mon, 25 Sep 2017 21:23:12 +0530 Subject: [PATCH 054/100] #352- Unit Of Work : modified readme. --- unit-of-work/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unit-of-work/README.md b/unit-of-work/README.md index c67c1bc02..20788279d 100644 --- a/unit-of-work/README.md +++ b/unit-of-work/README.md @@ -22,8 +22,8 @@ When a business transaction is completed all the these updates are sent as one Use the Unit Of Work pattern when * The client is asking to optimize the time taken for database transactions. -* When you want to boost the performance to get database records. -* You want reduce number of database calls. +* To send changes to database as a unit of work which ensures atomicity of the transaction. +* You want to reduce number of database calls. ## Credits From b8491436dde5f68dd3f1043393ea26d1376997ec Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Tue, 26 Sep 2017 23:25:36 +0530 Subject: [PATCH 055/100] #352- Unit Of Work : modified readme. --- unit-of-work/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unit-of-work/README.md b/unit-of-work/README.md index 20788279d..b33ab9781 100644 --- a/unit-of-work/README.md +++ b/unit-of-work/README.md @@ -21,7 +21,7 @@ When a business transaction is completed all the these updates are sent as one ## Applicability Use the Unit Of Work pattern when -* The client is asking to optimize the time taken for database transactions. +* To optimize the time taken for database transactions. * To send changes to database as a unit of work which ensures atomicity of the transaction. * You want to reduce number of database calls. From b5eca2f85699426e5050492dcd55dd0427e130e4 Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Wed, 27 Sep 2017 00:04:06 +0530 Subject: [PATCH 056/100] #352- Unit Of Work : Updated applicability of pattern in README. --- unit-of-work/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unit-of-work/README.md b/unit-of-work/README.md index b33ab9781..25b96153f 100644 --- a/unit-of-work/README.md +++ b/unit-of-work/README.md @@ -23,7 +23,7 @@ Use the Unit Of Work pattern when * To optimize the time taken for database transactions. * To send changes to database as a unit of work which ensures atomicity of the transaction. -* You want to reduce number of database calls. +* To reduce number of database calls. ## Credits From 4abef6da331a67bc9b6878bb5c55601de5995d07 Mon Sep 17 00:00:00 2001 From: Peter-Morawski Date: Tue, 26 Sep 2017 20:51:32 +0200 Subject: [PATCH 057/100] added missing whitespace to the elements of the unordered list --- balking/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/balking/README.md b/balking/README.md index f720c0d02..fb5c83d5b 100644 --- a/balking/README.md +++ b/balking/README.md @@ -18,10 +18,10 @@ incomplete or inappropriate state ## Applicability Use the Balking pattern when -*you want to invoke an action on an object only when it is in a particular state -*objects are generally only in a state that is prone to balking temporarily +* you want to invoke an action on an object only when it is in a particular state +* objects are generally only in a state that is prone to balking temporarily but for an unknown amount of time ## Related patterns * Guarded Suspension Pattern -* Double Checked Locking Pattern \ No newline at end of file +* Double Checked Locking Pattern From 4e236f6da8118844e8c2cd23687d974f79753396 Mon Sep 17 00:00:00 2001 From: Deepanshu Rastogi Date: Thu, 28 Sep 2017 15:04:32 +0200 Subject: [PATCH 058/100] Minor modification of Long to long --- .../src/main/java/com/iluwatar/throttling/CallsCount.java | 2 +- .../src/test/java/com/iluwatar/throttling/B2BServiceTest.java | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/throttling/src/main/java/com/iluwatar/throttling/CallsCount.java b/throttling/src/main/java/com/iluwatar/throttling/CallsCount.java index 25b3dedb3..9b274849a 100644 --- a/throttling/src/main/java/com/iluwatar/throttling/CallsCount.java +++ b/throttling/src/main/java/com/iluwatar/throttling/CallsCount.java @@ -61,7 +61,7 @@ public final class CallsCount { * @param tenantName name of the tenant. * @return the count of the tenant. */ - public static Long getCount(String tenantName) { + public static long getCount(String tenantName) { return tenantCallsCount.get(tenantName).get(); } diff --git a/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java b/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java index 4ea540bcd..aaab62b3a 100644 --- a/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java +++ b/throttling/src/test/java/com/iluwatar/throttling/B2BServiceTest.java @@ -39,12 +39,10 @@ public class B2BServiceTest { Throttler timer = new ThrottleTimerImpl(100); B2BService service = new B2BService(timer); - long counter = 0; for (int i = 0; i < 5; i++) { service.dummyCustomerApi(tenant); - counter = CallsCount.getCount(tenant.getName()); } - + long counter = CallsCount.getCount(tenant.getName()); Assert.assertTrue("Counter limit must be reached", counter == 2); } } From ba7142ca97614e7af36a22610cbbd9e2722e6c34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 30 Sep 2017 22:26:44 +0300 Subject: [PATCH 059/100] Reach milestone 1.17.0 --- abstract-document/pom.xml | 2 +- abstract-factory/pom.xml | 2 +- adapter/pom.xml | 2 +- aggregator-microservices/aggregator-service/pom.xml | 2 +- aggregator-microservices/information-microservice/pom.xml | 2 +- aggregator-microservices/inventory-microservice/pom.xml | 2 +- aggregator-microservices/pom.xml | 2 +- api-gateway/api-gateway-service/pom.xml | 2 +- api-gateway/image-microservice/pom.xml | 2 +- api-gateway/pom.xml | 2 +- api-gateway/price-microservice/pom.xml | 2 +- async-method-invocation/pom.xml | 2 +- balking/pom.xml | 2 +- bridge/pom.xml | 2 +- builder/pom.xml | 2 +- business-delegate/pom.xml | 2 +- caching/pom.xml | 2 +- callback/pom.xml | 2 +- chain/pom.xml | 2 +- command/pom.xml | 2 +- composite/pom.xml | 2 +- converter/pom.xml | 2 +- cqrs/pom.xml | 2 +- dao/pom.xml | 2 +- data-bus/pom.xml | 2 +- data-mapper/pom.xml | 2 +- data-transfer-object/pom.xml | 2 +- decorator/pom.xml | 2 +- delegation/pom.xml | 2 +- dependency-injection/pom.xml | 2 +- double-checked-locking/pom.xml | 2 +- double-dispatch/pom.xml | 2 +- event-aggregator/pom.xml | 2 +- event-asynchronous/pom.xml | 2 +- event-driven-architecture/pom.xml | 2 +- event-queue/pom.xml | 2 +- event-sourcing/pom.xml | 2 +- execute-around/pom.xml | 2 +- extension-objects/pom.xml | 2 +- facade/pom.xml | 2 +- factory-kit/pom.xml | 2 +- factory-method/pom.xml | 2 +- feature-toggle/pom.xml | 2 +- fluentinterface/pom.xml | 2 +- flux/pom.xml | 2 +- flyweight/pom.xml | 2 +- front-controller/pom.xml | 2 +- guarded-suspension/pom.xml | 2 +- half-sync-half-async/pom.xml | 2 +- hexagonal/pom.xml | 2 +- intercepting-filter/pom.xml | 2 +- interpreter/pom.xml | 2 +- iterator/pom.xml | 2 +- layers/pom.xml | 2 +- lazy-loading/pom.xml | 2 +- marker/pom.xml | 2 +- mediator/pom.xml | 2 +- memento/pom.xml | 2 +- message-channel/pom.xml | 2 +- model-view-controller/pom.xml | 2 +- model-view-presenter/pom.xml | 2 +- module/pom.xml | 2 +- monad/pom.xml | 2 +- monostate/pom.xml | 2 +- multiton/pom.xml | 2 +- mute-idiom/pom.xml | 2 +- mutex/pom.xml | 2 +- naked-objects/dom/pom.xml | 2 +- naked-objects/fixture/pom.xml | 2 +- naked-objects/integtests/pom.xml | 2 +- naked-objects/pom.xml | 8 ++++---- naked-objects/webapp/pom.xml | 2 +- null-object/pom.xml | 2 +- object-mother/pom.xml | 2 +- object-pool/pom.xml | 2 +- observer/pom.xml | 2 +- page-object/pom.xml | 2 +- partial-response/pom.xml | 2 +- poison-pill/pom.xml | 2 +- pom.xml | 2 +- private-class-data/pom.xml | 2 +- producer-consumer/pom.xml | 2 +- promise/pom.xml | 2 +- property/pom.xml | 2 +- prototype/pom.xml | 2 +- proxy/pom.xml | 2 +- publish-subscribe/pom.xml | 2 +- queue-load-leveling/pom.xml | 2 +- reactor/pom.xml | 2 +- reader-writer-lock/pom.xml | 2 +- repository/pom.xml | 2 +- resource-acquisition-is-initialization/pom.xml | 2 +- semaphore/pom.xml | 2 +- servant/pom.xml | 2 +- service-layer/pom.xml | 2 +- service-locator/pom.xml | 2 +- singleton/pom.xml | 2 +- specification/pom.xml | 2 +- state/pom.xml | 2 +- step-builder/pom.xml | 2 +- strategy/pom.xml | 2 +- template-method/pom.xml | 2 +- thread-pool/pom.xml | 2 +- throttling/pom.xml | 2 +- tls/pom.xml | 2 +- tolerant-reader/pom.xml | 2 +- twin/pom.xml | 2 +- value-object/pom.xml | 2 +- visitor/pom.xml | 2 +- 109 files changed, 112 insertions(+), 112 deletions(-) diff --git a/abstract-document/pom.xml b/abstract-document/pom.xml index 42d439afd..fef78a82f 100644 --- a/abstract-document/pom.xml +++ b/abstract-document/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 abstract-document diff --git a/abstract-factory/pom.xml b/abstract-factory/pom.xml index 4c7e51be2..b606c5b22 100644 --- a/abstract-factory/pom.xml +++ b/abstract-factory/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 abstract-factory diff --git a/adapter/pom.xml b/adapter/pom.xml index 44259f1c6..644e609b8 100644 --- a/adapter/pom.xml +++ b/adapter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 adapter diff --git a/aggregator-microservices/aggregator-service/pom.xml b/aggregator-microservices/aggregator-service/pom.xml index 078e38d30..27c261f56 100644 --- a/aggregator-microservices/aggregator-service/pom.xml +++ b/aggregator-microservices/aggregator-service/pom.xml @@ -29,7 +29,7 @@ aggregator-microservices com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/aggregator-microservices/information-microservice/pom.xml b/aggregator-microservices/information-microservice/pom.xml index f379afa27..81105ed7d 100644 --- a/aggregator-microservices/information-microservice/pom.xml +++ b/aggregator-microservices/information-microservice/pom.xml @@ -29,7 +29,7 @@ aggregator-microservices com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/aggregator-microservices/inventory-microservice/pom.xml b/aggregator-microservices/inventory-microservice/pom.xml index 8db0814c9..a78ea5e6c 100644 --- a/aggregator-microservices/inventory-microservice/pom.xml +++ b/aggregator-microservices/inventory-microservice/pom.xml @@ -29,7 +29,7 @@ aggregator-microservices com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/aggregator-microservices/pom.xml b/aggregator-microservices/pom.xml index caf600e86..a62869c26 100644 --- a/aggregator-microservices/pom.xml +++ b/aggregator-microservices/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 aggregator-microservices diff --git a/api-gateway/api-gateway-service/pom.xml b/api-gateway/api-gateway-service/pom.xml index 372c4d0dd..87927eaee 100644 --- a/api-gateway/api-gateway-service/pom.xml +++ b/api-gateway/api-gateway-service/pom.xml @@ -29,7 +29,7 @@ api-gateway com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 api-gateway-service diff --git a/api-gateway/image-microservice/pom.xml b/api-gateway/image-microservice/pom.xml index 50fc12886..cf48bfbc3 100644 --- a/api-gateway/image-microservice/pom.xml +++ b/api-gateway/image-microservice/pom.xml @@ -29,7 +29,7 @@ api-gateway com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/api-gateway/pom.xml b/api-gateway/pom.xml index f474ba66a..82ca841d9 100644 --- a/api-gateway/pom.xml +++ b/api-gateway/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 api-gateway diff --git a/api-gateway/price-microservice/pom.xml b/api-gateway/price-microservice/pom.xml index ec6799674..57cbc8e44 100644 --- a/api-gateway/price-microservice/pom.xml +++ b/api-gateway/price-microservice/pom.xml @@ -29,7 +29,7 @@ api-gateway com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/async-method-invocation/pom.xml b/async-method-invocation/pom.xml index af169c14f..8083c4464 100644 --- a/async-method-invocation/pom.xml +++ b/async-method-invocation/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 async-method-invocation diff --git a/balking/pom.xml b/balking/pom.xml index a924eae43..8fbbfbf72 100644 --- a/balking/pom.xml +++ b/balking/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/bridge/pom.xml b/bridge/pom.xml index 5a807bbdd..f7c8108be 100644 --- a/bridge/pom.xml +++ b/bridge/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 bridge diff --git a/builder/pom.xml b/builder/pom.xml index 0c4d44bdc..c8fb5acea 100644 --- a/builder/pom.xml +++ b/builder/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 builder diff --git a/business-delegate/pom.xml b/business-delegate/pom.xml index db04484a4..0de9f0c4f 100644 --- a/business-delegate/pom.xml +++ b/business-delegate/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 business-delegate diff --git a/caching/pom.xml b/caching/pom.xml index 1da9a33d3..faea04dfe 100644 --- a/caching/pom.xml +++ b/caching/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 caching diff --git a/callback/pom.xml b/callback/pom.xml index b4ece4579..79be1fd4e 100644 --- a/callback/pom.xml +++ b/callback/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 callback diff --git a/chain/pom.xml b/chain/pom.xml index f35faf468..92778cdcc 100644 --- a/chain/pom.xml +++ b/chain/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 chain diff --git a/command/pom.xml b/command/pom.xml index 3612dd8aa..3a0db3d4f 100644 --- a/command/pom.xml +++ b/command/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 command diff --git a/composite/pom.xml b/composite/pom.xml index 62f07c8d5..d027606a1 100644 --- a/composite/pom.xml +++ b/composite/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 composite diff --git a/converter/pom.xml b/converter/pom.xml index 6bd1c5c16..ab4dad7d2 100644 --- a/converter/pom.xml +++ b/converter/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/cqrs/pom.xml b/cqrs/pom.xml index 6c036a933..da126bf19 100644 --- a/cqrs/pom.xml +++ b/cqrs/pom.xml @@ -21,7 +21,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 cqrs diff --git a/dao/pom.xml b/dao/pom.xml index e61eaba3c..e2ecbed36 100644 --- a/dao/pom.xml +++ b/dao/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 dao diff --git a/data-bus/pom.xml b/data-bus/pom.xml index a77b59106..d0f6bf9b4 100644 --- a/data-bus/pom.xml +++ b/data-bus/pom.xml @@ -33,7 +33,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 data-bus diff --git a/data-mapper/pom.xml b/data-mapper/pom.xml index 2d39ed042..57bb45960 100644 --- a/data-mapper/pom.xml +++ b/data-mapper/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 data-mapper diff --git a/data-transfer-object/pom.xml b/data-transfer-object/pom.xml index 2f4871cb6..ccbd3df5e 100644 --- a/data-transfer-object/pom.xml +++ b/data-transfer-object/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 data-transfer-object diff --git a/decorator/pom.xml b/decorator/pom.xml index 99a7b14c0..4638e3cf1 100644 --- a/decorator/pom.xml +++ b/decorator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 decorator diff --git a/delegation/pom.xml b/delegation/pom.xml index 67b1e599f..d8dde749b 100644 --- a/delegation/pom.xml +++ b/delegation/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/dependency-injection/pom.xml b/dependency-injection/pom.xml index e4e7765a3..27283c244 100644 --- a/dependency-injection/pom.xml +++ b/dependency-injection/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 dependency-injection diff --git a/double-checked-locking/pom.xml b/double-checked-locking/pom.xml index e82dcd559..e7dd3d2eb 100644 --- a/double-checked-locking/pom.xml +++ b/double-checked-locking/pom.xml @@ -27,7 +27,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 double-checked-locking diff --git a/double-dispatch/pom.xml b/double-dispatch/pom.xml index 90ea0a66d..d0bfd3835 100644 --- a/double-dispatch/pom.xml +++ b/double-dispatch/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 double-dispatch diff --git a/event-aggregator/pom.xml b/event-aggregator/pom.xml index 19e76af84..5ec3d7d90 100644 --- a/event-aggregator/pom.xml +++ b/event-aggregator/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 event-aggregator diff --git a/event-asynchronous/pom.xml b/event-asynchronous/pom.xml index 5a2d65bfe..5b7416759 100644 --- a/event-asynchronous/pom.xml +++ b/event-asynchronous/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 event-asynchronous diff --git a/event-driven-architecture/pom.xml b/event-driven-architecture/pom.xml index 4f2c34b5e..3759b28ee 100644 --- a/event-driven-architecture/pom.xml +++ b/event-driven-architecture/pom.xml @@ -31,7 +31,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 event-driven-architecture diff --git a/event-queue/pom.xml b/event-queue/pom.xml index 59dfa9119..e2ae489f2 100644 --- a/event-queue/pom.xml +++ b/event-queue/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 event-queue diff --git a/event-sourcing/pom.xml b/event-sourcing/pom.xml index 35d462cb1..213358415 100644 --- a/event-sourcing/pom.xml +++ b/event-sourcing/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 event-sourcing diff --git a/execute-around/pom.xml b/execute-around/pom.xml index c4b3ac504..c617d2127 100644 --- a/execute-around/pom.xml +++ b/execute-around/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 execute-around diff --git a/extension-objects/pom.xml b/extension-objects/pom.xml index c5ee535fe..3b66943ae 100644 --- a/extension-objects/pom.xml +++ b/extension-objects/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/facade/pom.xml b/facade/pom.xml index d699ac8fe..b6a2cae9e 100644 --- a/facade/pom.xml +++ b/facade/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 facade diff --git a/factory-kit/pom.xml b/factory-kit/pom.xml index 50942b3a0..3039790b4 100644 --- a/factory-kit/pom.xml +++ b/factory-kit/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 factory-kit diff --git a/factory-method/pom.xml b/factory-method/pom.xml index 61d0058ae..bc132c29e 100644 --- a/factory-method/pom.xml +++ b/factory-method/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 factory-method diff --git a/feature-toggle/pom.xml b/feature-toggle/pom.xml index b8201aa4f..79803895b 100644 --- a/feature-toggle/pom.xml +++ b/feature-toggle/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/fluentinterface/pom.xml b/fluentinterface/pom.xml index 9c352f1a9..886f9d534 100644 --- a/fluentinterface/pom.xml +++ b/fluentinterface/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/flux/pom.xml b/flux/pom.xml index 01e3c4a90..a4ea8efa6 100644 --- a/flux/pom.xml +++ b/flux/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 flux diff --git a/flyweight/pom.xml b/flyweight/pom.xml index d93f66681..51c46fee0 100644 --- a/flyweight/pom.xml +++ b/flyweight/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 flyweight diff --git a/front-controller/pom.xml b/front-controller/pom.xml index 720f6d2ee..dc0e971e6 100644 --- a/front-controller/pom.xml +++ b/front-controller/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 front-controller diff --git a/guarded-suspension/pom.xml b/guarded-suspension/pom.xml index 9b6d70ef8..895264d3b 100644 --- a/guarded-suspension/pom.xml +++ b/guarded-suspension/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 jar guarded-suspension diff --git a/half-sync-half-async/pom.xml b/half-sync-half-async/pom.xml index 16940cefa..d737a93a1 100644 --- a/half-sync-half-async/pom.xml +++ b/half-sync-half-async/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 half-sync-half-async diff --git a/hexagonal/pom.xml b/hexagonal/pom.xml index b18127f4b..a222f4b64 100644 --- a/hexagonal/pom.xml +++ b/hexagonal/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 hexagonal diff --git a/intercepting-filter/pom.xml b/intercepting-filter/pom.xml index 91f61489c..940ce55de 100644 --- a/intercepting-filter/pom.xml +++ b/intercepting-filter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 intercepting-filter diff --git a/interpreter/pom.xml b/interpreter/pom.xml index 2fda838ea..9c0ff40d4 100644 --- a/interpreter/pom.xml +++ b/interpreter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 interpreter diff --git a/iterator/pom.xml b/iterator/pom.xml index 5a751db9c..46f4ca9de 100644 --- a/iterator/pom.xml +++ b/iterator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 iterator diff --git a/layers/pom.xml b/layers/pom.xml index 084795acd..00f531f4b 100644 --- a/layers/pom.xml +++ b/layers/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 com.iluwatar.layers layers diff --git a/lazy-loading/pom.xml b/lazy-loading/pom.xml index 0e54e6869..4f321d3f1 100644 --- a/lazy-loading/pom.xml +++ b/lazy-loading/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 lazy-loading diff --git a/marker/pom.xml b/marker/pom.xml index ba68b825b..3e1113cee 100644 --- a/marker/pom.xml +++ b/marker/pom.xml @@ -24,7 +24,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/mediator/pom.xml b/mediator/pom.xml index a15134368..85552c7bd 100644 --- a/mediator/pom.xml +++ b/mediator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 mediator diff --git a/memento/pom.xml b/memento/pom.xml index 8d95f32bb..200cb72ff 100644 --- a/memento/pom.xml +++ b/memento/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 memento diff --git a/message-channel/pom.xml b/message-channel/pom.xml index f73214855..db8a212b4 100644 --- a/message-channel/pom.xml +++ b/message-channel/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 message-channel diff --git a/model-view-controller/pom.xml b/model-view-controller/pom.xml index 4aeb69715..f0b8f9e62 100644 --- a/model-view-controller/pom.xml +++ b/model-view-controller/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 model-view-controller diff --git a/model-view-presenter/pom.xml b/model-view-presenter/pom.xml index ec6f570ee..75871b656 100644 --- a/model-view-presenter/pom.xml +++ b/model-view-presenter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 model-view-presenter model-view-presenter diff --git a/module/pom.xml b/module/pom.xml index b86069b16..0307b0e5c 100644 --- a/module/pom.xml +++ b/module/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 module diff --git a/monad/pom.xml b/monad/pom.xml index 23d5e0c0e..3fdd1a172 100644 --- a/monad/pom.xml +++ b/monad/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 monad diff --git a/monostate/pom.xml b/monostate/pom.xml index 5343d2094..66ccc01db 100644 --- a/monostate/pom.xml +++ b/monostate/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 monostate diff --git a/multiton/pom.xml b/multiton/pom.xml index 2e5553588..9fadf6c23 100644 --- a/multiton/pom.xml +++ b/multiton/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 multiton diff --git a/mute-idiom/pom.xml b/mute-idiom/pom.xml index 92b36915d..4f171f955 100644 --- a/mute-idiom/pom.xml +++ b/mute-idiom/pom.xml @@ -21,7 +21,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 mute-idiom diff --git a/mutex/pom.xml b/mutex/pom.xml index 6ba6c74a3..6552a237d 100644 --- a/mutex/pom.xml +++ b/mutex/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 mutex diff --git a/naked-objects/dom/pom.xml b/naked-objects/dom/pom.xml index f26060fbf..5938c4376 100644 --- a/naked-objects/dom/pom.xml +++ b/naked-objects/dom/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.17.0-SNAPSHOT + 1.17.0 naked-objects-dom diff --git a/naked-objects/fixture/pom.xml b/naked-objects/fixture/pom.xml index 0fccbaf56..255ad02dc 100644 --- a/naked-objects/fixture/pom.xml +++ b/naked-objects/fixture/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.17.0-SNAPSHOT + 1.17.0 naked-objects-fixture diff --git a/naked-objects/integtests/pom.xml b/naked-objects/integtests/pom.xml index ba620c5be..aa58fc1ee 100644 --- a/naked-objects/integtests/pom.xml +++ b/naked-objects/integtests/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.17.0-SNAPSHOT + 1.17.0 naked-objects-integtests diff --git a/naked-objects/pom.xml b/naked-objects/pom.xml index 4dee87660..4b39329d7 100644 --- a/naked-objects/pom.xml +++ b/naked-objects/pom.xml @@ -15,7 +15,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 naked-objects @@ -367,17 +367,17 @@ ${project.groupId} naked-objects-dom - 1.17.0-SNAPSHOT + 1.17.0 ${project.groupId} naked-objects-fixture - 1.17.0-SNAPSHOT + 1.17.0 ${project.groupId} naked-objects-webapp - 1.17.0-SNAPSHOT + 1.17.0 diff --git a/naked-objects/webapp/pom.xml b/naked-objects/webapp/pom.xml index d318da81d..03ae903fb 100644 --- a/naked-objects/webapp/pom.xml +++ b/naked-objects/webapp/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.17.0-SNAPSHOT + 1.17.0 naked-objects-webapp diff --git a/null-object/pom.xml b/null-object/pom.xml index 0d4248dbc..c6dd24442 100644 --- a/null-object/pom.xml +++ b/null-object/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 null-object diff --git a/object-mother/pom.xml b/object-mother/pom.xml index 7b598ed9a..7f9afd45a 100644 --- a/object-mother/pom.xml +++ b/object-mother/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 object-mother diff --git a/object-pool/pom.xml b/object-pool/pom.xml index 66d694169..b3e6b98d8 100644 --- a/object-pool/pom.xml +++ b/object-pool/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 object-pool diff --git a/observer/pom.xml b/observer/pom.xml index e1f2cf6bd..a1ac7501a 100644 --- a/observer/pom.xml +++ b/observer/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 observer diff --git a/page-object/pom.xml b/page-object/pom.xml index ea17c372c..8b5c561b4 100644 --- a/page-object/pom.xml +++ b/page-object/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 page-object diff --git a/partial-response/pom.xml b/partial-response/pom.xml index ed685eb6a..6d9dbc002 100644 --- a/partial-response/pom.xml +++ b/partial-response/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/poison-pill/pom.xml b/poison-pill/pom.xml index 8c0935310..edd6409fc 100644 --- a/poison-pill/pom.xml +++ b/poison-pill/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 poison-pill diff --git a/pom.xml b/pom.xml index ed9981b34..17adf1263 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ 4.0.0 com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 pom 2014 diff --git a/private-class-data/pom.xml b/private-class-data/pom.xml index 98a60c3c7..a496d55bf 100644 --- a/private-class-data/pom.xml +++ b/private-class-data/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 private-class-data diff --git a/producer-consumer/pom.xml b/producer-consumer/pom.xml index 2680a973e..9ef742936 100644 --- a/producer-consumer/pom.xml +++ b/producer-consumer/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 producer-consumer diff --git a/promise/pom.xml b/promise/pom.xml index 3753e4c25..8df8685d9 100644 --- a/promise/pom.xml +++ b/promise/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 promise diff --git a/property/pom.xml b/property/pom.xml index 8b5d25c87..2425b1383 100644 --- a/property/pom.xml +++ b/property/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 property diff --git a/prototype/pom.xml b/prototype/pom.xml index de3571a77..faeace972 100644 --- a/prototype/pom.xml +++ b/prototype/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 prototype diff --git a/proxy/pom.xml b/proxy/pom.xml index b81611fa4..0152a7594 100644 --- a/proxy/pom.xml +++ b/proxy/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 proxy diff --git a/publish-subscribe/pom.xml b/publish-subscribe/pom.xml index c9a55a3ff..aba17eca1 100644 --- a/publish-subscribe/pom.xml +++ b/publish-subscribe/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 publish-subscribe diff --git a/queue-load-leveling/pom.xml b/queue-load-leveling/pom.xml index 0841357b3..eb65fac49 100644 --- a/queue-load-leveling/pom.xml +++ b/queue-load-leveling/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 queue-load-leveling diff --git a/reactor/pom.xml b/reactor/pom.xml index 2a50d5934..54e9e3bc4 100644 --- a/reactor/pom.xml +++ b/reactor/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 reactor diff --git a/reader-writer-lock/pom.xml b/reader-writer-lock/pom.xml index 70ff7afc9..fdb212d26 100644 --- a/reader-writer-lock/pom.xml +++ b/reader-writer-lock/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 reader-writer-lock diff --git a/repository/pom.xml b/repository/pom.xml index a167dd58c..f22268f4f 100644 --- a/repository/pom.xml +++ b/repository/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 repository diff --git a/resource-acquisition-is-initialization/pom.xml b/resource-acquisition-is-initialization/pom.xml index ae07196b7..2cf5ed93f 100644 --- a/resource-acquisition-is-initialization/pom.xml +++ b/resource-acquisition-is-initialization/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 resource-acquisition-is-initialization diff --git a/semaphore/pom.xml b/semaphore/pom.xml index dbab5325e..aecd30fd8 100644 --- a/semaphore/pom.xml +++ b/semaphore/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 semaphore diff --git a/servant/pom.xml b/servant/pom.xml index 4a0c753de..3dc53539d 100644 --- a/servant/pom.xml +++ b/servant/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 servant diff --git a/service-layer/pom.xml b/service-layer/pom.xml index 3174e95ed..ddcdd98bb 100644 --- a/service-layer/pom.xml +++ b/service-layer/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 service-layer diff --git a/service-locator/pom.xml b/service-locator/pom.xml index 23c54c08d..adf76c8b4 100644 --- a/service-locator/pom.xml +++ b/service-locator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 service-locator diff --git a/singleton/pom.xml b/singleton/pom.xml index 77226821d..5a87f45a6 100644 --- a/singleton/pom.xml +++ b/singleton/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 singleton diff --git a/specification/pom.xml b/specification/pom.xml index 3a4fd371b..9788429c6 100644 --- a/specification/pom.xml +++ b/specification/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 specification diff --git a/state/pom.xml b/state/pom.xml index 44404d5a9..6938ecfef 100644 --- a/state/pom.xml +++ b/state/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 state diff --git a/step-builder/pom.xml b/step-builder/pom.xml index fc7c7232e..a3a732d29 100644 --- a/step-builder/pom.xml +++ b/step-builder/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 step-builder diff --git a/strategy/pom.xml b/strategy/pom.xml index e6fc4cd53..79314e2fd 100644 --- a/strategy/pom.xml +++ b/strategy/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 strategy diff --git a/template-method/pom.xml b/template-method/pom.xml index 0bd5bdc43..3ad92a353 100644 --- a/template-method/pom.xml +++ b/template-method/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 template-method diff --git a/thread-pool/pom.xml b/thread-pool/pom.xml index f34238176..0d4088457 100644 --- a/thread-pool/pom.xml +++ b/thread-pool/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 thread-pool diff --git a/throttling/pom.xml b/throttling/pom.xml index 2cbd7bf9e..ec2f3f37e 100644 --- a/throttling/pom.xml +++ b/throttling/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.17.0 4.0.0 diff --git a/tls/pom.xml b/tls/pom.xml index 460c5e7ea..e61f7a4ff 100644 --- a/tls/pom.xml +++ b/tls/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 tls diff --git a/tolerant-reader/pom.xml b/tolerant-reader/pom.xml index 99a2cf880..8f5b91a12 100644 --- a/tolerant-reader/pom.xml +++ b/tolerant-reader/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 tolerant-reader diff --git a/twin/pom.xml b/twin/pom.xml index 013406215..3b264a606 100644 --- a/twin/pom.xml +++ b/twin/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 twin diff --git a/value-object/pom.xml b/value-object/pom.xml index 2db53f244..7798f1450 100644 --- a/value-object/pom.xml +++ b/value-object/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 value-object diff --git a/visitor/pom.xml b/visitor/pom.xml index 7105f6ba7..44282759b 100644 --- a/visitor/pom.xml +++ b/visitor/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0-SNAPSHOT + 1.17.0 visitor From 0d4a8db114ce1b4e7705db5679d4047f3eb603ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 30 Sep 2017 22:30:34 +0300 Subject: [PATCH 060/100] Set version for next development iteration --- abstract-document/pom.xml | 2 +- abstract-factory/pom.xml | 2 +- adapter/pom.xml | 2 +- aggregator-microservices/aggregator-service/pom.xml | 2 +- aggregator-microservices/information-microservice/pom.xml | 2 +- aggregator-microservices/inventory-microservice/pom.xml | 2 +- aggregator-microservices/pom.xml | 2 +- api-gateway/api-gateway-service/pom.xml | 2 +- api-gateway/image-microservice/pom.xml | 2 +- api-gateway/pom.xml | 2 +- api-gateway/price-microservice/pom.xml | 2 +- async-method-invocation/pom.xml | 2 +- balking/pom.xml | 2 +- bridge/pom.xml | 2 +- builder/pom.xml | 2 +- business-delegate/pom.xml | 2 +- caching/pom.xml | 2 +- callback/pom.xml | 2 +- chain/pom.xml | 2 +- command/pom.xml | 2 +- composite/pom.xml | 2 +- converter/pom.xml | 2 +- cqrs/pom.xml | 2 +- dao/pom.xml | 2 +- data-bus/pom.xml | 2 +- data-mapper/pom.xml | 2 +- data-transfer-object/pom.xml | 2 +- decorator/pom.xml | 2 +- delegation/pom.xml | 2 +- dependency-injection/pom.xml | 2 +- double-checked-locking/pom.xml | 2 +- double-dispatch/pom.xml | 2 +- event-aggregator/pom.xml | 2 +- event-asynchronous/pom.xml | 2 +- event-driven-architecture/pom.xml | 2 +- event-queue/pom.xml | 2 +- event-sourcing/pom.xml | 2 +- execute-around/pom.xml | 2 +- extension-objects/pom.xml | 2 +- facade/pom.xml | 2 +- factory-kit/pom.xml | 2 +- factory-method/pom.xml | 2 +- feature-toggle/pom.xml | 2 +- fluentinterface/pom.xml | 2 +- flux/pom.xml | 2 +- flyweight/pom.xml | 2 +- front-controller/pom.xml | 2 +- guarded-suspension/pom.xml | 2 +- half-sync-half-async/pom.xml | 2 +- hexagonal/pom.xml | 2 +- intercepting-filter/pom.xml | 2 +- interpreter/pom.xml | 2 +- iterator/pom.xml | 2 +- layers/pom.xml | 2 +- lazy-loading/pom.xml | 2 +- marker/pom.xml | 2 +- mediator/pom.xml | 2 +- memento/pom.xml | 2 +- message-channel/pom.xml | 2 +- model-view-controller/pom.xml | 2 +- model-view-presenter/pom.xml | 2 +- module/pom.xml | 2 +- monad/pom.xml | 2 +- monostate/pom.xml | 2 +- multiton/pom.xml | 2 +- mute-idiom/pom.xml | 2 +- mutex/pom.xml | 2 +- naked-objects/dom/pom.xml | 2 +- naked-objects/fixture/pom.xml | 2 +- naked-objects/integtests/pom.xml | 2 +- naked-objects/pom.xml | 8 ++++---- naked-objects/webapp/pom.xml | 2 +- null-object/pom.xml | 2 +- object-mother/pom.xml | 2 +- object-pool/pom.xml | 2 +- observer/pom.xml | 2 +- page-object/pom.xml | 2 +- partial-response/pom.xml | 2 +- poison-pill/pom.xml | 2 +- pom.xml | 2 +- private-class-data/pom.xml | 2 +- producer-consumer/pom.xml | 2 +- promise/pom.xml | 2 +- property/pom.xml | 2 +- prototype/pom.xml | 2 +- proxy/pom.xml | 2 +- publish-subscribe/pom.xml | 2 +- queue-load-leveling/pom.xml | 2 +- reactor/pom.xml | 2 +- reader-writer-lock/pom.xml | 2 +- repository/pom.xml | 2 +- resource-acquisition-is-initialization/pom.xml | 2 +- semaphore/pom.xml | 2 +- servant/pom.xml | 2 +- service-layer/pom.xml | 2 +- service-locator/pom.xml | 2 +- singleton/pom.xml | 2 +- specification/pom.xml | 2 +- state/pom.xml | 2 +- step-builder/pom.xml | 2 +- strategy/pom.xml | 2 +- template-method/pom.xml | 2 +- thread-pool/pom.xml | 2 +- throttling/pom.xml | 2 +- tls/pom.xml | 2 +- tolerant-reader/pom.xml | 2 +- twin/pom.xml | 2 +- value-object/pom.xml | 2 +- visitor/pom.xml | 2 +- 109 files changed, 112 insertions(+), 112 deletions(-) diff --git a/abstract-document/pom.xml b/abstract-document/pom.xml index fef78a82f..cf49544cd 100644 --- a/abstract-document/pom.xml +++ b/abstract-document/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT abstract-document diff --git a/abstract-factory/pom.xml b/abstract-factory/pom.xml index b606c5b22..f3a266f8e 100644 --- a/abstract-factory/pom.xml +++ b/abstract-factory/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT abstract-factory diff --git a/adapter/pom.xml b/adapter/pom.xml index 644e609b8..24245fad7 100644 --- a/adapter/pom.xml +++ b/adapter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT adapter diff --git a/aggregator-microservices/aggregator-service/pom.xml b/aggregator-microservices/aggregator-service/pom.xml index 27c261f56..32d5caa3f 100644 --- a/aggregator-microservices/aggregator-service/pom.xml +++ b/aggregator-microservices/aggregator-service/pom.xml @@ -29,7 +29,7 @@ aggregator-microservices com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/aggregator-microservices/information-microservice/pom.xml b/aggregator-microservices/information-microservice/pom.xml index 81105ed7d..8b24cdcc0 100644 --- a/aggregator-microservices/information-microservice/pom.xml +++ b/aggregator-microservices/information-microservice/pom.xml @@ -29,7 +29,7 @@ aggregator-microservices com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/aggregator-microservices/inventory-microservice/pom.xml b/aggregator-microservices/inventory-microservice/pom.xml index a78ea5e6c..06804343c 100644 --- a/aggregator-microservices/inventory-microservice/pom.xml +++ b/aggregator-microservices/inventory-microservice/pom.xml @@ -29,7 +29,7 @@ aggregator-microservices com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/aggregator-microservices/pom.xml b/aggregator-microservices/pom.xml index a62869c26..aae6b88d5 100644 --- a/aggregator-microservices/pom.xml +++ b/aggregator-microservices/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 aggregator-microservices diff --git a/api-gateway/api-gateway-service/pom.xml b/api-gateway/api-gateway-service/pom.xml index 87927eaee..a97c25cfc 100644 --- a/api-gateway/api-gateway-service/pom.xml +++ b/api-gateway/api-gateway-service/pom.xml @@ -29,7 +29,7 @@ api-gateway com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 api-gateway-service diff --git a/api-gateway/image-microservice/pom.xml b/api-gateway/image-microservice/pom.xml index cf48bfbc3..574623b3a 100644 --- a/api-gateway/image-microservice/pom.xml +++ b/api-gateway/image-microservice/pom.xml @@ -29,7 +29,7 @@ api-gateway com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/api-gateway/pom.xml b/api-gateway/pom.xml index 82ca841d9..124b3cf24 100644 --- a/api-gateway/pom.xml +++ b/api-gateway/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 api-gateway diff --git a/api-gateway/price-microservice/pom.xml b/api-gateway/price-microservice/pom.xml index 57cbc8e44..aed9fb38b 100644 --- a/api-gateway/price-microservice/pom.xml +++ b/api-gateway/price-microservice/pom.xml @@ -29,7 +29,7 @@ api-gateway com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/async-method-invocation/pom.xml b/async-method-invocation/pom.xml index 8083c4464..7e15aff73 100644 --- a/async-method-invocation/pom.xml +++ b/async-method-invocation/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT async-method-invocation diff --git a/balking/pom.xml b/balking/pom.xml index 8fbbfbf72..28fa0db61 100644 --- a/balking/pom.xml +++ b/balking/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/bridge/pom.xml b/bridge/pom.xml index f7c8108be..be0f5439c 100644 --- a/bridge/pom.xml +++ b/bridge/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT bridge diff --git a/builder/pom.xml b/builder/pom.xml index c8fb5acea..0f70791e4 100644 --- a/builder/pom.xml +++ b/builder/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT builder diff --git a/business-delegate/pom.xml b/business-delegate/pom.xml index 0de9f0c4f..c6ceb7e43 100644 --- a/business-delegate/pom.xml +++ b/business-delegate/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT business-delegate diff --git a/caching/pom.xml b/caching/pom.xml index faea04dfe..cd1784539 100644 --- a/caching/pom.xml +++ b/caching/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT caching diff --git a/callback/pom.xml b/callback/pom.xml index 79be1fd4e..c87e58f63 100644 --- a/callback/pom.xml +++ b/callback/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT callback diff --git a/chain/pom.xml b/chain/pom.xml index 92778cdcc..ffdb13821 100644 --- a/chain/pom.xml +++ b/chain/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT chain diff --git a/command/pom.xml b/command/pom.xml index 3a0db3d4f..397818f5c 100644 --- a/command/pom.xml +++ b/command/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT command diff --git a/composite/pom.xml b/composite/pom.xml index d027606a1..913db6989 100644 --- a/composite/pom.xml +++ b/composite/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT composite diff --git a/converter/pom.xml b/converter/pom.xml index ab4dad7d2..923b0e43c 100644 --- a/converter/pom.xml +++ b/converter/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/cqrs/pom.xml b/cqrs/pom.xml index da126bf19..2e5644bb6 100644 --- a/cqrs/pom.xml +++ b/cqrs/pom.xml @@ -21,7 +21,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT cqrs diff --git a/dao/pom.xml b/dao/pom.xml index e2ecbed36..4c4c8500d 100644 --- a/dao/pom.xml +++ b/dao/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT dao diff --git a/data-bus/pom.xml b/data-bus/pom.xml index d0f6bf9b4..318caf89a 100644 --- a/data-bus/pom.xml +++ b/data-bus/pom.xml @@ -33,7 +33,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT data-bus diff --git a/data-mapper/pom.xml b/data-mapper/pom.xml index 57bb45960..66a0e469e 100644 --- a/data-mapper/pom.xml +++ b/data-mapper/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT data-mapper diff --git a/data-transfer-object/pom.xml b/data-transfer-object/pom.xml index ccbd3df5e..b0fd66da3 100644 --- a/data-transfer-object/pom.xml +++ b/data-transfer-object/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT data-transfer-object diff --git a/decorator/pom.xml b/decorator/pom.xml index 4638e3cf1..8319c7a8f 100644 --- a/decorator/pom.xml +++ b/decorator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT decorator diff --git a/delegation/pom.xml b/delegation/pom.xml index d8dde749b..f2cb95dc1 100644 --- a/delegation/pom.xml +++ b/delegation/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/dependency-injection/pom.xml b/dependency-injection/pom.xml index 27283c244..e01d5b68d 100644 --- a/dependency-injection/pom.xml +++ b/dependency-injection/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT dependency-injection diff --git a/double-checked-locking/pom.xml b/double-checked-locking/pom.xml index e7dd3d2eb..f32a45d37 100644 --- a/double-checked-locking/pom.xml +++ b/double-checked-locking/pom.xml @@ -27,7 +27,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT double-checked-locking diff --git a/double-dispatch/pom.xml b/double-dispatch/pom.xml index d0bfd3835..44107f474 100644 --- a/double-dispatch/pom.xml +++ b/double-dispatch/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT double-dispatch diff --git a/event-aggregator/pom.xml b/event-aggregator/pom.xml index 5ec3d7d90..a3e7f96cf 100644 --- a/event-aggregator/pom.xml +++ b/event-aggregator/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT event-aggregator diff --git a/event-asynchronous/pom.xml b/event-asynchronous/pom.xml index 5b7416759..afb3213f1 100644 --- a/event-asynchronous/pom.xml +++ b/event-asynchronous/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT event-asynchronous diff --git a/event-driven-architecture/pom.xml b/event-driven-architecture/pom.xml index 3759b28ee..4db6b6c0c 100644 --- a/event-driven-architecture/pom.xml +++ b/event-driven-architecture/pom.xml @@ -31,7 +31,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT event-driven-architecture diff --git a/event-queue/pom.xml b/event-queue/pom.xml index e2ae489f2..cbfc0976d 100644 --- a/event-queue/pom.xml +++ b/event-queue/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT event-queue diff --git a/event-sourcing/pom.xml b/event-sourcing/pom.xml index 213358415..ac7745fbe 100644 --- a/event-sourcing/pom.xml +++ b/event-sourcing/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT event-sourcing diff --git a/execute-around/pom.xml b/execute-around/pom.xml index c617d2127..3da4dc440 100644 --- a/execute-around/pom.xml +++ b/execute-around/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT execute-around diff --git a/extension-objects/pom.xml b/extension-objects/pom.xml index 3b66943ae..2215834d7 100644 --- a/extension-objects/pom.xml +++ b/extension-objects/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/facade/pom.xml b/facade/pom.xml index b6a2cae9e..7a6021530 100644 --- a/facade/pom.xml +++ b/facade/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT facade diff --git a/factory-kit/pom.xml b/factory-kit/pom.xml index 3039790b4..eee0cd734 100644 --- a/factory-kit/pom.xml +++ b/factory-kit/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT factory-kit diff --git a/factory-method/pom.xml b/factory-method/pom.xml index bc132c29e..8c54f63a1 100644 --- a/factory-method/pom.xml +++ b/factory-method/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT factory-method diff --git a/feature-toggle/pom.xml b/feature-toggle/pom.xml index 79803895b..6536710ba 100644 --- a/feature-toggle/pom.xml +++ b/feature-toggle/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/fluentinterface/pom.xml b/fluentinterface/pom.xml index 886f9d534..11318e295 100644 --- a/fluentinterface/pom.xml +++ b/fluentinterface/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/flux/pom.xml b/flux/pom.xml index a4ea8efa6..779bd3e97 100644 --- a/flux/pom.xml +++ b/flux/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT flux diff --git a/flyweight/pom.xml b/flyweight/pom.xml index 51c46fee0..9814dc2df 100644 --- a/flyweight/pom.xml +++ b/flyweight/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT flyweight diff --git a/front-controller/pom.xml b/front-controller/pom.xml index dc0e971e6..b9080bda7 100644 --- a/front-controller/pom.xml +++ b/front-controller/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT front-controller diff --git a/guarded-suspension/pom.xml b/guarded-suspension/pom.xml index 895264d3b..bcc9ead06 100644 --- a/guarded-suspension/pom.xml +++ b/guarded-suspension/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT jar guarded-suspension diff --git a/half-sync-half-async/pom.xml b/half-sync-half-async/pom.xml index d737a93a1..ac8464d75 100644 --- a/half-sync-half-async/pom.xml +++ b/half-sync-half-async/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT half-sync-half-async diff --git a/hexagonal/pom.xml b/hexagonal/pom.xml index a222f4b64..940a7fc61 100644 --- a/hexagonal/pom.xml +++ b/hexagonal/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT hexagonal diff --git a/intercepting-filter/pom.xml b/intercepting-filter/pom.xml index 940ce55de..40888b7f3 100644 --- a/intercepting-filter/pom.xml +++ b/intercepting-filter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT intercepting-filter diff --git a/interpreter/pom.xml b/interpreter/pom.xml index 9c0ff40d4..8c0ab09a0 100644 --- a/interpreter/pom.xml +++ b/interpreter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT interpreter diff --git a/iterator/pom.xml b/iterator/pom.xml index 46f4ca9de..2233e0b32 100644 --- a/iterator/pom.xml +++ b/iterator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT iterator diff --git a/layers/pom.xml b/layers/pom.xml index 00f531f4b..d15b524de 100644 --- a/layers/pom.xml +++ b/layers/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT com.iluwatar.layers layers diff --git a/lazy-loading/pom.xml b/lazy-loading/pom.xml index 4f321d3f1..9d3652feb 100644 --- a/lazy-loading/pom.xml +++ b/lazy-loading/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT lazy-loading diff --git a/marker/pom.xml b/marker/pom.xml index 3e1113cee..91cf2c48a 100644 --- a/marker/pom.xml +++ b/marker/pom.xml @@ -24,7 +24,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/mediator/pom.xml b/mediator/pom.xml index 85552c7bd..978aa7da6 100644 --- a/mediator/pom.xml +++ b/mediator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT mediator diff --git a/memento/pom.xml b/memento/pom.xml index 200cb72ff..858b75544 100644 --- a/memento/pom.xml +++ b/memento/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT memento diff --git a/message-channel/pom.xml b/message-channel/pom.xml index db8a212b4..091c35f85 100644 --- a/message-channel/pom.xml +++ b/message-channel/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT message-channel diff --git a/model-view-controller/pom.xml b/model-view-controller/pom.xml index f0b8f9e62..385953d0a 100644 --- a/model-view-controller/pom.xml +++ b/model-view-controller/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT model-view-controller diff --git a/model-view-presenter/pom.xml b/model-view-presenter/pom.xml index 75871b656..5c91846bf 100644 --- a/model-view-presenter/pom.xml +++ b/model-view-presenter/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT model-view-presenter model-view-presenter diff --git a/module/pom.xml b/module/pom.xml index 0307b0e5c..1d45a77a5 100644 --- a/module/pom.xml +++ b/module/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT module diff --git a/monad/pom.xml b/monad/pom.xml index 3fdd1a172..26cb21b97 100644 --- a/monad/pom.xml +++ b/monad/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT monad diff --git a/monostate/pom.xml b/monostate/pom.xml index 66ccc01db..c4dc213da 100644 --- a/monostate/pom.xml +++ b/monostate/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT monostate diff --git a/multiton/pom.xml b/multiton/pom.xml index 9fadf6c23..af75e5ebe 100644 --- a/multiton/pom.xml +++ b/multiton/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT multiton diff --git a/mute-idiom/pom.xml b/mute-idiom/pom.xml index 4f171f955..41d660c73 100644 --- a/mute-idiom/pom.xml +++ b/mute-idiom/pom.xml @@ -21,7 +21,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT mute-idiom diff --git a/mutex/pom.xml b/mutex/pom.xml index 6552a237d..ff938604b 100644 --- a/mutex/pom.xml +++ b/mutex/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT mutex diff --git a/naked-objects/dom/pom.xml b/naked-objects/dom/pom.xml index 5938c4376..5a6f4e7ba 100644 --- a/naked-objects/dom/pom.xml +++ b/naked-objects/dom/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.17.0 + 1.18.0-SNAPSHOT naked-objects-dom diff --git a/naked-objects/fixture/pom.xml b/naked-objects/fixture/pom.xml index 255ad02dc..88c982dfd 100644 --- a/naked-objects/fixture/pom.xml +++ b/naked-objects/fixture/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.17.0 + 1.18.0-SNAPSHOT naked-objects-fixture diff --git a/naked-objects/integtests/pom.xml b/naked-objects/integtests/pom.xml index aa58fc1ee..e4006561a 100644 --- a/naked-objects/integtests/pom.xml +++ b/naked-objects/integtests/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.17.0 + 1.18.0-SNAPSHOT naked-objects-integtests diff --git a/naked-objects/pom.xml b/naked-objects/pom.xml index 4b39329d7..f770fe3a0 100644 --- a/naked-objects/pom.xml +++ b/naked-objects/pom.xml @@ -15,7 +15,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT naked-objects @@ -367,17 +367,17 @@ ${project.groupId} naked-objects-dom - 1.17.0 + 1.18.0-SNAPSHOT ${project.groupId} naked-objects-fixture - 1.17.0 + 1.18.0-SNAPSHOT ${project.groupId} naked-objects-webapp - 1.17.0 + 1.18.0-SNAPSHOT diff --git a/naked-objects/webapp/pom.xml b/naked-objects/webapp/pom.xml index 03ae903fb..244d1737d 100644 --- a/naked-objects/webapp/pom.xml +++ b/naked-objects/webapp/pom.xml @@ -16,7 +16,7 @@ com.iluwatar naked-objects - 1.17.0 + 1.18.0-SNAPSHOT naked-objects-webapp diff --git a/null-object/pom.xml b/null-object/pom.xml index c6dd24442..755db259e 100644 --- a/null-object/pom.xml +++ b/null-object/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT null-object diff --git a/object-mother/pom.xml b/object-mother/pom.xml index 7f9afd45a..9b9171888 100644 --- a/object-mother/pom.xml +++ b/object-mother/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT object-mother diff --git a/object-pool/pom.xml b/object-pool/pom.xml index b3e6b98d8..4ebb40385 100644 --- a/object-pool/pom.xml +++ b/object-pool/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT object-pool diff --git a/observer/pom.xml b/observer/pom.xml index a1ac7501a..7113306f3 100644 --- a/observer/pom.xml +++ b/observer/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT observer diff --git a/page-object/pom.xml b/page-object/pom.xml index 8b5c561b4..98842b387 100644 --- a/page-object/pom.xml +++ b/page-object/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT page-object diff --git a/partial-response/pom.xml b/partial-response/pom.xml index 6d9dbc002..94c583a98 100644 --- a/partial-response/pom.xml +++ b/partial-response/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/poison-pill/pom.xml b/poison-pill/pom.xml index edd6409fc..3bd0f0967 100644 --- a/poison-pill/pom.xml +++ b/poison-pill/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT poison-pill diff --git a/pom.xml b/pom.xml index 17adf1263..ec39a6914 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ 4.0.0 com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT pom 2014 diff --git a/private-class-data/pom.xml b/private-class-data/pom.xml index a496d55bf..3ac0cf532 100644 --- a/private-class-data/pom.xml +++ b/private-class-data/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT private-class-data diff --git a/producer-consumer/pom.xml b/producer-consumer/pom.xml index 9ef742936..893d7a4ff 100644 --- a/producer-consumer/pom.xml +++ b/producer-consumer/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT producer-consumer diff --git a/promise/pom.xml b/promise/pom.xml index 8df8685d9..05fd4c3ee 100644 --- a/promise/pom.xml +++ b/promise/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT promise diff --git a/property/pom.xml b/property/pom.xml index 2425b1383..db2ff8f60 100644 --- a/property/pom.xml +++ b/property/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT property diff --git a/prototype/pom.xml b/prototype/pom.xml index faeace972..62d4f0eb1 100644 --- a/prototype/pom.xml +++ b/prototype/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT prototype diff --git a/proxy/pom.xml b/proxy/pom.xml index 0152a7594..ea55330b7 100644 --- a/proxy/pom.xml +++ b/proxy/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT proxy diff --git a/publish-subscribe/pom.xml b/publish-subscribe/pom.xml index aba17eca1..ebd82f3a7 100644 --- a/publish-subscribe/pom.xml +++ b/publish-subscribe/pom.xml @@ -28,7 +28,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT publish-subscribe diff --git a/queue-load-leveling/pom.xml b/queue-load-leveling/pom.xml index eb65fac49..57741ed52 100644 --- a/queue-load-leveling/pom.xml +++ b/queue-load-leveling/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT queue-load-leveling diff --git a/reactor/pom.xml b/reactor/pom.xml index 54e9e3bc4..9ab44d2c0 100644 --- a/reactor/pom.xml +++ b/reactor/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT reactor diff --git a/reader-writer-lock/pom.xml b/reader-writer-lock/pom.xml index fdb212d26..d5ea9114c 100644 --- a/reader-writer-lock/pom.xml +++ b/reader-writer-lock/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT reader-writer-lock diff --git a/repository/pom.xml b/repository/pom.xml index f22268f4f..f12c40113 100644 --- a/repository/pom.xml +++ b/repository/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT repository diff --git a/resource-acquisition-is-initialization/pom.xml b/resource-acquisition-is-initialization/pom.xml index 2cf5ed93f..7a6716d7b 100644 --- a/resource-acquisition-is-initialization/pom.xml +++ b/resource-acquisition-is-initialization/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT resource-acquisition-is-initialization diff --git a/semaphore/pom.xml b/semaphore/pom.xml index aecd30fd8..4fa1733f4 100644 --- a/semaphore/pom.xml +++ b/semaphore/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT semaphore diff --git a/servant/pom.xml b/servant/pom.xml index 3dc53539d..daa44d223 100644 --- a/servant/pom.xml +++ b/servant/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT servant diff --git a/service-layer/pom.xml b/service-layer/pom.xml index ddcdd98bb..6edbeba44 100644 --- a/service-layer/pom.xml +++ b/service-layer/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT service-layer diff --git a/service-locator/pom.xml b/service-locator/pom.xml index adf76c8b4..7cd4028ff 100644 --- a/service-locator/pom.xml +++ b/service-locator/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT service-locator diff --git a/singleton/pom.xml b/singleton/pom.xml index 5a87f45a6..00794e25a 100644 --- a/singleton/pom.xml +++ b/singleton/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT singleton diff --git a/specification/pom.xml b/specification/pom.xml index 9788429c6..76732b964 100644 --- a/specification/pom.xml +++ b/specification/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT specification diff --git a/state/pom.xml b/state/pom.xml index 6938ecfef..256a5e9e2 100644 --- a/state/pom.xml +++ b/state/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT state diff --git a/step-builder/pom.xml b/step-builder/pom.xml index a3a732d29..432d5477a 100644 --- a/step-builder/pom.xml +++ b/step-builder/pom.xml @@ -30,7 +30,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT step-builder diff --git a/strategy/pom.xml b/strategy/pom.xml index 79314e2fd..cd2d7e9a0 100644 --- a/strategy/pom.xml +++ b/strategy/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT strategy diff --git a/template-method/pom.xml b/template-method/pom.xml index 3ad92a353..916d61b0b 100644 --- a/template-method/pom.xml +++ b/template-method/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT template-method diff --git a/thread-pool/pom.xml b/thread-pool/pom.xml index 0d4088457..94fce2b16 100644 --- a/thread-pool/pom.xml +++ b/thread-pool/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT thread-pool diff --git a/throttling/pom.xml b/throttling/pom.xml index ec2f3f37e..7c2ee8b9a 100644 --- a/throttling/pom.xml +++ b/throttling/pom.xml @@ -29,7 +29,7 @@ java-design-patterns com.iluwatar - 1.17.0 + 1.18.0-SNAPSHOT 4.0.0 diff --git a/tls/pom.xml b/tls/pom.xml index e61f7a4ff..40d6b2b21 100644 --- a/tls/pom.xml +++ b/tls/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT tls diff --git a/tolerant-reader/pom.xml b/tolerant-reader/pom.xml index 8f5b91a12..7e3561f80 100644 --- a/tolerant-reader/pom.xml +++ b/tolerant-reader/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT tolerant-reader diff --git a/twin/pom.xml b/twin/pom.xml index 3b264a606..62d138fd9 100644 --- a/twin/pom.xml +++ b/twin/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT twin diff --git a/value-object/pom.xml b/value-object/pom.xml index 7798f1450..fa4c06697 100644 --- a/value-object/pom.xml +++ b/value-object/pom.xml @@ -30,7 +30,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT value-object diff --git a/visitor/pom.xml b/visitor/pom.xml index 44282759b..5445a94cc 100644 --- a/visitor/pom.xml +++ b/visitor/pom.xml @@ -29,7 +29,7 @@ com.iluwatar java-design-patterns - 1.17.0 + 1.18.0-SNAPSHOT visitor From f80d903cfffe50a3b8957bb26c391908caca2345 Mon Sep 17 00:00:00 2001 From: adkm Date: Wed, 4 Oct 2017 17:04:32 +0200 Subject: [PATCH 061/100] Wire Tap EIP implementation and tests --- eip-wire-tap/pom.xml | 63 +++++++++++++++++++ .../java/com/iluwatar/eip/wiretap/App.java | 28 +++++++++ .../eip/wiretap/routes/WireTapRoute.java | 32 ++++++++++ .../src/main/resources/application.properties | 3 + .../eip/wiretap/WireTapRouteTest.java | 62 ++++++++++++++++++ .../resources/application-test.properties | 3 + pom.xml | 3 +- 7 files changed, 193 insertions(+), 1 deletion(-) create mode 100644 eip-wire-tap/pom.xml create mode 100644 eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java create mode 100644 eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java create mode 100644 eip-wire-tap/src/main/resources/application.properties create mode 100644 eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/WireTapRouteTest.java create mode 100644 eip-wire-tap/src/test/resources/application-test.properties diff --git a/eip-wire-tap/pom.xml b/eip-wire-tap/pom.xml new file mode 100644 index 000000000..b3bc678b0 --- /dev/null +++ b/eip-wire-tap/pom.xml @@ -0,0 +1,63 @@ + + + + 4.0.0 + eip-wire-tap + + com.iluwatar + java-design-patterns + 1.18.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.apache.camel + camel-core + ${camel.version} + + + + org.apache.camel + camel-spring-boot + ${camel.version} + + + + + org.springframework.boot + spring-boot-starter-test + + + + org.apache.camel + camel-test-spring + ${camel.version} + + + + \ No newline at end of file diff --git a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java new file mode 100644 index 000000000..ab3c280de --- /dev/null +++ b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java @@ -0,0 +1,28 @@ +package com.iluwatar.eip.wiretap; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * In most integration cases there is a need to monitor the messages flowing through the system. It is usually achieved + * by intercepting the message and redirecting it to a different location like console, filesystem or the database. + * It is important that such functionality should not modify the original message and influence the processing path. + * + *

+ * Wire Tap allows you to route messages to a separate location while they are being forwarded to the ultimate + * destination. It basically consumes messages of the input channel and publishes the unmodified message to both + * output channels. + *

+ */ +@SpringBootApplication +public class App { + + /** + * Program entry point. It starts Spring Boot application and using Apache Camel it auto-configures routes. + * + * @param args command line args + */ + public static void main(String[] args) { + SpringApplication.run(App.class, args); + } +} diff --git a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java new file mode 100644 index 000000000..a01b1892c --- /dev/null +++ b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java @@ -0,0 +1,32 @@ +package com.iluwatar.eip.wiretap.routes; + +import org.apache.camel.builder.RouteBuilder; +import org.springframework.stereotype.Component; + +/** + * Sample wire tap route definition. + * + *

+ * It consumes messages out of the direct:entry entry point and forwards them to direct:endpoint. + * Wire Tap intercepts the message and sends it to direct:wireTap, which in turn forwards it to + * direct:wireTapEndpoint. + *

+ * + * In this example input/output endpoints names are stored in application.properties file. + */ +@Component +public class WireTapRoute extends RouteBuilder { + + /** + * Configures the route + * @throws Exception in case of exception during configuration + */ + @Override + public void configure() throws Exception { + // Main route + from("{{entry}}").wireTap("direct:wireTap").to("{{endpoint}}"); + + // Wire tap route + from("direct:wireTap").to("{{wireTapEndpoint}}"); + } +} diff --git a/eip-wire-tap/src/main/resources/application.properties b/eip-wire-tap/src/main/resources/application.properties new file mode 100644 index 000000000..6dabe6ccc --- /dev/null +++ b/eip-wire-tap/src/main/resources/application.properties @@ -0,0 +1,3 @@ +entry=direct:entry +endpoint=direct:endpoint +wireTapEndpoint=direct:wireTapEndpoint \ No newline at end of file diff --git a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/WireTapRouteTest.java b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/WireTapRouteTest.java new file mode 100644 index 000000000..93e6dda2a --- /dev/null +++ b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/WireTapRouteTest.java @@ -0,0 +1,62 @@ +package com.iluwatar.eip.wiretap; + +import org.apache.camel.EndpointInject; +import org.apache.camel.Message; +import org.apache.camel.ProducerTemplate; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import static org.junit.Assert.assertEquals; + +/** + * Test class for WireTapRoute. + *

+ * In order for it to work we have to mock endpoints we want to read/write to. To mock those we need to substitute + * original endpoint names to mocks. + *

+ */ +@RunWith(SpringJUnit4ClassRunner.class) +@SpringApplicationConfiguration(classes = WireTapRouteTest.class) +@ActiveProfiles("test") +@EnableAutoConfiguration +@ComponentScan +public class WireTapRouteTest { + + @EndpointInject(uri = "{{entry}}") + private ProducerTemplate entry; + + @EndpointInject(uri = "{{endpoint}}") + private MockEndpoint endpoint; + + @EndpointInject(uri = "{{wireTapEndpoint}}") + private MockEndpoint wireTapEndpoint; + + /** + * Test if both endpoints receive exactly one message containing the same, unchanged body. + * @throws Exception in case of en exception during the test + */ + @Test + @DirtiesContext + public void testWireTap() throws Exception { + entry.sendBody("TEST"); + + endpoint.expectedMessageCount(1); + wireTapEndpoint.expectedMessageCount(1); + + endpoint.assertIsSatisfied(); + wireTapEndpoint.assertIsSatisfied(); + + Message endpointIn = endpoint.getExchanges().get(0).getIn(); + Message wireTapEndpointIn = wireTapEndpoint.getExchanges().get(0).getIn(); + + assertEquals("TEST", endpointIn.getBody()); + assertEquals("TEST", wireTapEndpointIn.getBody()); + } +} diff --git a/eip-wire-tap/src/test/resources/application-test.properties b/eip-wire-tap/src/test/resources/application-test.properties new file mode 100644 index 000000000..1719c8ca4 --- /dev/null +++ b/eip-wire-tap/src/test/resources/application-test.properties @@ -0,0 +1,3 @@ +entry=direct:entry +endpoint=mock:endpoint +wireTapEndpoint=mock:wireTapEndpoint \ No newline at end of file diff --git a/pom.xml b/pom.xml index ec39a6914..774b14019 100644 --- a/pom.xml +++ b/pom.xml @@ -145,8 +145,9 @@ cqrs event-sourcing data-transfer-object - throttling + throttling partial-response + eip-wire-tap From 522721559bcb2d106cab572c5a0d15db9828ffc3 Mon Sep 17 00:00:00 2001 From: adkm Date: Wed, 4 Oct 2017 17:20:29 +0200 Subject: [PATCH 062/100] #176 pattern description and diagram --- eip-wire-tap/README.md | 29 +++++++++++++++++++++++++++++ eip-wire-tap/etc/wiretap.gif | Bin 0 -> 3067 bytes 2 files changed, 29 insertions(+) create mode 100644 eip-wire-tap/README.md create mode 100644 eip-wire-tap/etc/wiretap.gif diff --git a/eip-wire-tap/README.md b/eip-wire-tap/README.md new file mode 100644 index 000000000..d2742aa31 --- /dev/null +++ b/eip-wire-tap/README.md @@ -0,0 +1,29 @@ +--- +layout: pattern +title: EIP Wire Tap +folder: eip-wire-tap +permalink: /patterns/eip-wire-tap/ +categories: Enterprise integration +tags: + - Java + - Difficulty-Intermittent + - Enterprise integration +--- + +## Intent +In most integration cases there is a need to monitor the messages flowing through the system. It is usually achieved +by intercepting the message and redirecting it to a different location like console, filesystem or the database. +It is important that such functionality should not modify the original message and influence the processing path. + +![alt text](./etc/wiretap.gif "Wire Tap") + +## Applicability +Use the Wire Tap pattern when + +* You need to monitor messages flowing through the system +* You need to redirect the same, unchanged message to two different endpoints/paths + +## Credits + +* [Gregor Hohpe, Bobby Woolf - Enterprise Integration Patterns](http://www.enterpriseintegrationpatterns.com/patterns/messaging/WireTap.html) +* [Apache Camel - Documentation](http://camel.apache.org/wire-tap.html) diff --git a/eip-wire-tap/etc/wiretap.gif b/eip-wire-tap/etc/wiretap.gif new file mode 100644 index 0000000000000000000000000000000000000000..4141737167ca7c590baaef807534a74ec6e46c8d GIT binary patch literal 3067 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 Date: Sat, 7 Oct 2017 20:33:24 +0700 Subject: [PATCH 063/100] fix test message --- .../java/com/iluwatar/factory/method/FactoryMethodTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/factory-method/src/test/java/com/iluwatar/factory/method/FactoryMethodTest.java b/factory-method/src/test/java/com/iluwatar/factory/method/FactoryMethodTest.java index 4f3a5930d..69736855c 100644 --- a/factory-method/src/test/java/com/iluwatar/factory/method/FactoryMethodTest.java +++ b/factory-method/src/test/java/com/iluwatar/factory/method/FactoryMethodTest.java @@ -95,7 +95,7 @@ public class FactoryMethodTest { */ private void verifyWeapon(Weapon weapon, WeaponType expectedWeaponType, Class clazz) { assertTrue("Weapon must be an object of: " + clazz.getName(), clazz.isInstance(weapon)); - assertEquals("Weapon must be of weaponType: " + clazz.getName(), expectedWeaponType, + assertEquals("Weapon must be of weaponType: " + expectedWeaponType, expectedWeaponType, weapon.getWeaponType()); } } From ed1852a789daeef03ab260ef4f962bca9160d13e Mon Sep 17 00:00:00 2001 From: Yosfik Alqadri Date: Sun, 8 Oct 2017 20:41:28 +0700 Subject: [PATCH 064/100] Fix unused generic type in PrototypeTest --- .../src/test/java/com/iluwatar/prototype/PrototypeTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/prototype/src/test/java/com/iluwatar/prototype/PrototypeTest.java b/prototype/src/test/java/com/iluwatar/prototype/PrototypeTest.java index add5617b1..839f27bc7 100644 --- a/prototype/src/test/java/com/iluwatar/prototype/PrototypeTest.java +++ b/prototype/src/test/java/com/iluwatar/prototype/PrototypeTest.java @@ -56,7 +56,7 @@ public class PrototypeTest

{ /** * The tested prototype instance */ - private final Prototype testedPrototype; + private final P testedPrototype; /** * The expected {@link Prototype#toString()} value @@ -69,7 +69,7 @@ public class PrototypeTest

{ * @param testedPrototype The tested prototype instance * @param expectedToString The expected {@link Prototype#toString()} value */ - public PrototypeTest(final Prototype testedPrototype, final String expectedToString) { + public PrototypeTest(final P testedPrototype, final String expectedToString) { this.expectedToString = expectedToString; this.testedPrototype = testedPrototype; } From 60f07d194084f2c057a60740984a3fa0ef3b7591 Mon Sep 17 00:00:00 2001 From: adkm Date: Thu, 12 Oct 2017 17:33:03 +0200 Subject: [PATCH 065/100] Added test class for App --- .../java/com/iluwatar/eip/wiretap/AppTest.java | 15 +++++++++++++++ .../wiretap/{ => routes}/WireTapRouteTest.java | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java rename eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/{ => routes}/WireTapRouteTest.java (97%) diff --git a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java new file mode 100644 index 000000000..fb254ead2 --- /dev/null +++ b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java @@ -0,0 +1,15 @@ +package com.iluwatar.eip.wiretap; + +import org.junit.Test; + +/** + * Test for App class + */ +public class AppTest { + + @Test + public void testMain() { + String[] args = {}; + App.main(args); + } +} diff --git a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/WireTapRouteTest.java b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/routes/WireTapRouteTest.java similarity index 97% rename from eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/WireTapRouteTest.java rename to eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/routes/WireTapRouteTest.java index 93e6dda2a..a7b15f45e 100644 --- a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/WireTapRouteTest.java +++ b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/routes/WireTapRouteTest.java @@ -1,4 +1,4 @@ -package com.iluwatar.eip.wiretap; +package com.iluwatar.eip.wiretap.routes; import org.apache.camel.EndpointInject; import org.apache.camel.Message; From 0453ba1315320a267ad182637c6ee5317890d75f Mon Sep 17 00:00:00 2001 From: adkm Date: Fri, 13 Oct 2017 14:02:03 +0200 Subject: [PATCH 066/100] #176 Test run, app shutdown, minor refactoring --- .../java/com/iluwatar/eip/wiretap/App.java | 27 +++++++++++++++++-- .../eip/wiretap/routes/WireTapRoute.java | 2 +- .../com/iluwatar/eip/wiretap/AppTest.java | 2 +- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java index ab3c280de..73ae094fa 100644 --- a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java +++ b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java @@ -1,7 +1,10 @@ package com.iluwatar.eip.wiretap; +import org.apache.camel.CamelContext; +import org.apache.camel.builder.RouteBuilder; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; /** * In most integration cases there is a need to monitor the messages flowing through the system. It is usually achieved @@ -22,7 +25,27 @@ public class App { * * @param args command line args */ - public static void main(String[] args) { - SpringApplication.run(App.class, args); + public static void main(String[] args) throws Exception{ + // Run Spring Boot application and obtain ApplicationContext + ConfigurableApplicationContext context = SpringApplication.run(App.class, args); + + // Get CamelContext from ApplicationContext + CamelContext camelContext = (CamelContext) context.getBean("camelContext"); + + // Add a new routes that will handle endpoints form WireTapRoute class. + camelContext.addRoutes(new RouteBuilder() { + + @Override + public void configure() throws Exception { + from("{{endpoint}}").log("ENDPOINT: ${body}"); + from("{{wireTapEndpoint}}").log("WIRETAPPED ENDPOINT: ${body}"); + } + + }); + + // Add producer that will send test message to an entry point in WireTapRoute + camelContext.createProducerTemplate().sendBody("{{entry}}", "Test message"); + + SpringApplication.exit(context); } } diff --git a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java index a01b1892c..c744295ee 100644 --- a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java +++ b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java @@ -27,6 +27,6 @@ public class WireTapRoute extends RouteBuilder { from("{{entry}}").wireTap("direct:wireTap").to("{{endpoint}}"); // Wire tap route - from("direct:wireTap").to("{{wireTapEndpoint}}"); + from("direct:wireTap").log("Message: ${body}").to("{{wireTapEndpoint}}"); } } diff --git a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java index fb254ead2..25b9d8550 100644 --- a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java +++ b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java @@ -8,7 +8,7 @@ import org.junit.Test; public class AppTest { @Test - public void testMain() { + public void testMain() throws Exception { String[] args = {}; App.main(args); } From 624a4ef8574b2947d10a5390e3d1a11869037b78 Mon Sep 17 00:00:00 2001 From: adkm Date: Fri, 13 Oct 2017 14:22:48 +0200 Subject: [PATCH 067/100] #176 Fixed CheckStyle issue --- eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java index 73ae094fa..7bf4ce0d4 100644 --- a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java +++ b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java @@ -25,7 +25,7 @@ public class App { * * @param args command line args */ - public static void main(String[] args) throws Exception{ + public static void main(String[] args) throws Exception { // Run Spring Boot application and obtain ApplicationContext ConfigurableApplicationContext context = SpringApplication.run(App.class, args); From 141d448c17a13df9aa7cfd01870a3582f045270d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=B3=E9=98=B3?= <260893248@qq.com> Date: Mon, 16 Oct 2017 15:37:13 +0800 Subject: [PATCH 068/100] maybe it should be "Let's" here --- decorator/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/decorator/README.md b/decorator/README.md index 37cfd88df..f3d6347e4 100644 --- a/decorator/README.md +++ b/decorator/README.md @@ -35,7 +35,7 @@ Wikipedia says **Programmatic Example** -Lets take the troll example. First of all we have a simple troll implementing the troll interface +Let's take the troll example. First of all we have a simple troll implementing the troll interface ``` public interface Troll { From 9c7ee5ed1d221c8519c9671996687ad15f37ae17 Mon Sep 17 00:00:00 2001 From: adkm Date: Mon, 16 Oct 2017 19:33:15 +0200 Subject: [PATCH 069/100] #173 Added new pattern, tests --- eip-splitter/README.md | 20 ++++++ eip-splitter/pom.xml | 68 +++++++++++++++++++ .../java/com/iluwatar/eip/splitter/App.java | 45 ++++++++++++ .../eip/splitter/routes/SplitterRoute.java | 26 +++++++ .../src/main/resources/application.properties | 2 + .../com/iluwatar/eip/splitter/AppTest.java | 15 ++++ .../splitter/routes/SplitterRouteTest.java | 53 +++++++++++++++ .../resources/application-test.properties | 2 + 8 files changed, 231 insertions(+) create mode 100644 eip-splitter/README.md create mode 100644 eip-splitter/pom.xml create mode 100644 eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java create mode 100644 eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java create mode 100644 eip-splitter/src/main/resources/application.properties create mode 100644 eip-splitter/src/test/java/com/iluwatar/eip/splitter/AppTest.java create mode 100644 eip-splitter/src/test/java/com/iluwatar/eip/splitter/routes/SplitterRouteTest.java create mode 100644 eip-splitter/src/test/resources/application-test.properties diff --git a/eip-splitter/README.md b/eip-splitter/README.md new file mode 100644 index 000000000..92ade7cb4 --- /dev/null +++ b/eip-splitter/README.md @@ -0,0 +1,20 @@ +--- +layout: pattern +title: EIP Splitter +folder: eip-splitter +permalink: /patterns/eip-splitter/ +categories: Enterprise integration +tags: + - Java + - Difficulty-Intermittent + - Enterprise integration +--- + +## Intent + + +## Applicability + + +## Credits + diff --git a/eip-splitter/pom.xml b/eip-splitter/pom.xml new file mode 100644 index 000000000..dd9f23e63 --- /dev/null +++ b/eip-splitter/pom.xml @@ -0,0 +1,68 @@ + + + + 4.0.0 + eip-splitter + + com.iluwatar + java-design-patterns + 1.18.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.apache.camel + camel-core + ${camel.version} + + + org.apache.camel + camel-csv + ${camel.version} + + + + org.apache.camel + camel-spring-boot + ${camel.version} + + + + + org.springframework.boot + spring-boot-starter-test + + + + org.apache.camel + camel-test-spring + ${camel.version} + + + + \ No newline at end of file diff --git a/eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java b/eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java new file mode 100644 index 000000000..9d7c1fc16 --- /dev/null +++ b/eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java @@ -0,0 +1,45 @@ +package com.iluwatar.eip.splitter; + +import org.apache.camel.CamelContext; +import org.apache.camel.builder.RouteBuilder; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; + +/** + * + *

+ *

+ */ +@SpringBootApplication +public class App { + + /** + * Program entry point. It starts Spring Boot application and using Apache Camel it auto-configures routes. + * + * @param args command line args + */ + public static void main(String[] args) throws Exception { + // Run Spring Boot application and obtain ApplicationContext + ConfigurableApplicationContext context = SpringApplication.run(App.class, args); + + // Get CamelContext from ApplicationContext + CamelContext camelContext = (CamelContext) context.getBean("camelContext"); + + // Add a new routes that will handle endpoints form SplitterRoute class. + camelContext.addRoutes(new RouteBuilder() { + + @Override + public void configure() throws Exception { + from("{{endpoint}}").log("ENDPOINT: ${body}"); + } + + }); + + // Add producer that will send test message to an entry point in WireTapRoute + String[] stringArray = {"Test item #1", "Test item #2", "Test item #3"}; + camelContext.createProducerTemplate().sendBody("{{entry}}", stringArray); + + SpringApplication.exit(context); + } +} diff --git a/eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java b/eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java new file mode 100644 index 000000000..61ec80631 --- /dev/null +++ b/eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java @@ -0,0 +1,26 @@ +package com.iluwatar.eip.splitter.routes; + +import org.apache.camel.builder.RouteBuilder; +import org.springframework.stereotype.Component; + +/** + * Sample splitter route definition. + * + *

+ *

+ * + * In this example input/output endpoints names are stored in application.properties file. + */ +@Component +public class SplitterRoute extends RouteBuilder { + + /** + * Configures the route + * @throws Exception in case of exception during configuration + */ + @Override + public void configure() throws Exception { + // Main route + from("{{entry}}").split().body().to("{{endpoint}}"); + } +} diff --git a/eip-splitter/src/main/resources/application.properties b/eip-splitter/src/main/resources/application.properties new file mode 100644 index 000000000..cb879e6e2 --- /dev/null +++ b/eip-splitter/src/main/resources/application.properties @@ -0,0 +1,2 @@ +entry=direct:entry +endpoint=direct:endpoint diff --git a/eip-splitter/src/test/java/com/iluwatar/eip/splitter/AppTest.java b/eip-splitter/src/test/java/com/iluwatar/eip/splitter/AppTest.java new file mode 100644 index 000000000..bff2cf0b1 --- /dev/null +++ b/eip-splitter/src/test/java/com/iluwatar/eip/splitter/AppTest.java @@ -0,0 +1,15 @@ +package com.iluwatar.eip.splitter; + +import org.junit.Test; + +/** + * Test for App class + */ +public class AppTest { + + @Test + public void testMain() throws Exception { + String[] args = {}; + App.main(args); + } +} diff --git a/eip-splitter/src/test/java/com/iluwatar/eip/splitter/routes/SplitterRouteTest.java b/eip-splitter/src/test/java/com/iluwatar/eip/splitter/routes/SplitterRouteTest.java new file mode 100644 index 000000000..78fc37d91 --- /dev/null +++ b/eip-splitter/src/test/java/com/iluwatar/eip/splitter/routes/SplitterRouteTest.java @@ -0,0 +1,53 @@ +package com.iluwatar.eip.splitter.routes; + +import org.apache.camel.EndpointInject; +import org.apache.camel.Message; +import org.apache.camel.ProducerTemplate; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import static org.junit.Assert.assertEquals; + +/** + * Test class for SplitterRoute. + *

+ * In order for it to work we have to mock endpoints we want to read/write to. To mock those we need to substitute + * original endpoint names to mocks. + *

+ */ +@RunWith(SpringJUnit4ClassRunner.class) +@SpringApplicationConfiguration(classes = SplitterRouteTest.class) +@ActiveProfiles("test") +@EnableAutoConfiguration +@ComponentScan +public class SplitterRouteTest { + + @EndpointInject(uri = "{{entry}}") + private ProducerTemplate entry; + + @EndpointInject(uri = "{{endpoint}}") + private MockEndpoint endpoint; + + /** + * Test if endpoint receives three separate messages. + * @throws Exception in case of en exception during the test + */ + @Test + @DirtiesContext + public void testSplitter() throws Exception { + + // Three items in one entry message + entry.sendBody(new String[] {"TEST1", "TEST2", "TEST3"}); + + // Endpoint should have three different messages in the end order of the messages is not important + endpoint.expectedMessageCount(3); + endpoint.assertIsSatisfied(); + } +} diff --git a/eip-splitter/src/test/resources/application-test.properties b/eip-splitter/src/test/resources/application-test.properties new file mode 100644 index 000000000..f657ea5a1 --- /dev/null +++ b/eip-splitter/src/test/resources/application-test.properties @@ -0,0 +1,2 @@ +entry=direct:entry +endpoint=mock:endpoint From 767f41ad905b83f8b2807a199f2cf748f6e618fc Mon Sep 17 00:00:00 2001 From: adkm Date: Tue, 17 Oct 2017 00:12:41 +0200 Subject: [PATCH 070/100] #173 Removed unneeded dependencies --- eip-splitter/pom.xml | 5 ----- .../src/main/java/com/iluwatar/eip/splitter/App.java | 8 ++++++++ .../com/iluwatar/eip/splitter/routes/SplitterRoute.java | 3 +++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/eip-splitter/pom.xml b/eip-splitter/pom.xml index dd9f23e63..fb7e4ca9b 100644 --- a/eip-splitter/pom.xml +++ b/eip-splitter/pom.xml @@ -40,11 +40,6 @@ camel-core ${camel.version} - - org.apache.camel - camel-csv - ${camel.version} - org.apache.camel diff --git a/eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java b/eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java index 9d7c1fc16..1f52e9569 100644 --- a/eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java +++ b/eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java @@ -7,9 +7,17 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; /** + * It is very common in integration systems that incoming messages consists of many items bundled together. For example + * an invoice document contains multiple invoice lines describing transaction (quantity, name of provided + * service/sold goods, price etc.). Such bundled messages may not be accepted by other systems. This is where splitter + * pattern comes in handy. It will take the whole document, split it based on given criteria and send individual + * items to the endpoint. * *

+ * Splitter allows you to split messages based on defined criteria. It takes original message, process it and send + * multiple parts to the output channel. It is not defined if it should keep the order of items though. *

+ * */ @SpringBootApplication public class App { diff --git a/eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java b/eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java index 61ec80631..064ad1f68 100644 --- a/eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java +++ b/eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java @@ -7,6 +7,9 @@ import org.springframework.stereotype.Component; * Sample splitter route definition. * *

+ * It consumes messages out of the direct:entry entry point and forwards them to direct:endpoint. + * Route accepts messages having body of array or collection of objects. Splitter component split message body and + * forwards single objects to the endpoint. *

* * In this example input/output endpoints names are stored in application.properties file. From 0aa84e37f20e42172b80f04396eda431d743e01c Mon Sep 17 00:00:00 2001 From: adkm Date: Tue, 17 Oct 2017 12:42:41 +0200 Subject: [PATCH 071/100] #173 Pattern description --- eip-splitter/README.md | 12 ++++++++++++ eip-splitter/etc/sequencer.gif | Bin 0 -> 2298 bytes 2 files changed, 12 insertions(+) create mode 100644 eip-splitter/etc/sequencer.gif diff --git a/eip-splitter/README.md b/eip-splitter/README.md index 92ade7cb4..b59147504 100644 --- a/eip-splitter/README.md +++ b/eip-splitter/README.md @@ -11,10 +11,22 @@ tags: --- ## Intent +It is very common in integration systems that incoming messages consists of many items bundled together. For example +an invoice document contains multiple invoice lines describing transaction (quantity, name of provided +service/sold goods, price etc.). Such bundled messages may not be accepted by other systems. This is where splitter +pattern comes in handy. It will take the whole document, split it based on given criteria and send individual +items to the endpoint. +![alt text](./etc/sequencer.gif "Splitter") ## Applicability +Use the Splitter pattern when +* You need to split received data into smaller pieces to process them individually +* You need to control the size of data batches you are able to process ## Credits +* [Gregor Hohpe, Bobby Woolf - Enterprise Integration Patterns](http://www.enterpriseintegrationpatterns.com/patterns/messaging/Sequencer.html) +* [Apache Camel - Documentation](http://camel.apache.org/splitter.html) + diff --git a/eip-splitter/etc/sequencer.gif b/eip-splitter/etc/sequencer.gif new file mode 100644 index 0000000000000000000000000000000000000000..a925fa2098777dadbf4c9e9a2006e9513421b8dc GIT binary patch literal 2298 zcmVM)j$~<` zXsWJk>%Q9|%W!Sqc&_h!@BbtjVK}4#kI1BQ$!t1p2coq2tXi+wtajUpPNxU1cuX#v z&mZp>jBdN%@c2%>CWhtsynfF|(Cc=6f`f#GOn-m`cZQ6Oj*lmZfQyiomY0>1b(EN$ zo}Y4>Yn-5^rl(n=QlzM@uCG3-fv~i-wlK1+x4XQ(9HP3u!o$8otHH#{%Cs{^%g@lZ z$kEi*nA6tT+J)HL-ru3%;^TVV>7`uiUB1OEd82n6^~ zU;udh61wwOa3Dd00}v{lc#a{&hYlrD-1yDkMSvgwHF6wjt=`9m0SJmD$?}=Wlo(+G zT-mbbFp~rWIs{4c3cjB}g9;r=bf`^nKy#kd*;8H7r%jak)f_n&c7g2gjG43R*KIxHkwrxb?a;PC*FN(S zuW zGOk7Ab2;Xw+l?_4x#B4t`uHM{{Sh%(X{05BB#u^2*rSt%eF&w8B!0GuV`D=0*mGNQ z`6P%zsx_o!f53G}oL8nnr*;=am7kg;;uGZ%gJ6Y)pgw68$4dnyny5jFCR%3>P4cPW zn_E>i#-mW=$!MdSI=ZK%E>e2vrKHZ5X91lqDv+X>q5vock%Fq8s7|~JLaWV{S}6qw zs2V_{sIFQ7t|my4XPYzf=Vq*(DSH_ItxXu4hOS!>>q0$>rW)+8){^i=1CFvy@|imVsZtfuyhwh@Nb;r(A1l zfB^!HT{hVPjGeR}MSs0*qicTvhy)Qg9W%w{o(1!`09SqQ$9Zb)8$?LXTj4#t})~t8`-e~O|V&7s|9z)<+SC;s}k{f+GxQ(CfdgGACn>yHK zuzUH-&UQXSvK3=Yb?8&{6Zldg1r4sRhnu`QudO%FxZ04#`?lA^+WR}Nm_ zRxDx~JEX-MI--aC1B@K!__i^wPlI^`1r|ZL#@O7CiK$u2APH#@Lzc0MXVjwu{Ux;s zJ<^SVq@Z#vcrr^0k%*V;S#UPFx!z4}iEiv*Ut|d$S}I3zm&D^LS$Q2U9;Fv1AtNGp z$xGt+@|U{^<{@9WKocyon4WASGMAyuTpG}W(6r7mr&)_?p7K-Kgv~a&2@7uu^P02S zV>q8CO>*7@m*2e1ROU&~dA8G?#Yo{fhsc_G`tzScxhFoUc}H~WA!i89*+923ziGRmD^p>*)oOLs2xuLvUj0xftMXN^ zcr`0rYv9+w{*|nVl~Y}LQCPu}HLQ*;D_|Y_Rmx_{t%(&ZWcRvQlHS#_d==}X8oO7t ziuSTk%`9MrO4rU746~bkY@TBA+0t@0ve&AuYU`l_PEbXtSMvm+bgK-e+IF(XJxyv= zE8FC@HMyJrjcr)giUQ*X_Zpa;?Q&aNDC(wCt=2t_SP>gq@Gh6I<4vk)y<1)82BE7v z!|r*r>s;3|gSn@zZ)5YSUdVE{1iDCTbVEyExtjIA_N51M2dv+_R`#&FMKFNjV%P^u zSF;jMFku&LS+@E$wHH2ah8YN23xl?~8t#ODeB%OJ%?25_FV-<6)a%^X(pShKrf~>-JJ{wv7{5JMac(8cK*iR$x8r^9 zb}5YH@17U9`6Yy)1Z?EPwz$O`%CZQ&+}5Uqx3_W*S)Sb~Ws&V!cvreIp6l}GDYLZC zmRhf;fAbpOuqpb$jJ|GO3QTD>L%7i+MYLV9>}Ej^`La=FG*!18>MGwy(@Ms{l^N{b zPj8shLWb|8VSQrlrn(iY&T)Oq{A%zTw$;3@v9DJh>?Ge>k-LtytLuzpWfxk^PKK^l zk6lD*b6VD_wzjk9L+m5p_RiG)M5NOk?P8PKyw?6ModI0sO4pjj;f}Yw=S}Z=+xy=5 U&bPkz&F_Bu``-ZHY6JiPJ08586aWAK literal 0 HcmV?d00001 From dd828bcd6c1415c27fe198c465de5f7a882b1cc7 Mon Sep 17 00:00:00 2001 From: adkm Date: Tue, 17 Oct 2017 12:46:28 +0200 Subject: [PATCH 072/100] #173 Update pom --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 774b14019..0c03909de 100644 --- a/pom.xml +++ b/pom.xml @@ -148,6 +148,7 @@ throttling partial-response eip-wire-tap + eip-splitter From df04e19994d86e55521751b8656f52f07d8af91d Mon Sep 17 00:00:00 2001 From: Bartek Date: Fri, 20 Oct 2017 13:59:42 +0200 Subject: [PATCH 073/100] Use UserConverter instead of rewriting its ctor --- converter/src/main/java/com/iluwatar/converter/App.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/converter/src/main/java/com/iluwatar/converter/App.java b/converter/src/main/java/com/iluwatar/converter/App.java index fbae0309d..6e436706d 100644 --- a/converter/src/main/java/com/iluwatar/converter/App.java +++ b/converter/src/main/java/com/iluwatar/converter/App.java @@ -41,10 +41,7 @@ public class App { * @param args command line args */ public static void main(String[] args) { - Converter userConverter = new Converter<>( - userDto -> new User(userDto.getFirstName(), userDto.getLastName(), userDto.isActive(), - userDto.getEmail()), - user -> new UserDto(user.getFirstName(), user.getLastName(), user.isActive(), user.getUserId())); + Converter userConverter = new UserConverter(); UserDto dtoUser = new UserDto("John", "Doe", true, "whatever[at]wherever.com"); User user = userConverter.convertFromDto(dtoUser); From e289779dd334e4a5ac7c6ed7d10508daf2806cf2 Mon Sep 17 00:00:00 2001 From: Vadym Pechenoha Date: Mon, 30 Oct 2017 19:54:31 +0200 Subject: [PATCH 074/100] Fix a typo --- facade/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/facade/README.md b/facade/README.md index 66ca84256..d50841e84 100644 --- a/facade/README.md +++ b/facade/README.md @@ -203,7 +203,7 @@ Use the Facade pattern when * you want to provide a simple interface to a complex subsystem. Subsystems often get more complex as they evolve. Most patterns, when applied, result in more and smaller classes. This makes the subsystem more reusable and easier to customize, but it also becomes harder to use for clients that don't need to customize it. A facade can provide a simple default view of the subsystem that is good enough for most clients. Only clients needing more customizability will need to look beyond the facade. * there are many dependencies between clients and the implementation classes of an abstraction. Introduce a facade to decouple the subsystem from clients and other subsystems, thereby promoting subsystem independence and portability. -* you want to layer your subsystems. Use a facade to define an entry point to each subsystem level. If subsystems are dependent, the you can simplify the dependencies between them by making them communicate with each other solely through their facades +* you want to layer your subsystems. Use a facade to define an entry point to each subsystem level. If subsystems are dependent, then you can simplify the dependencies between them by making them communicate with each other solely through their facades. ## Credits From 89bfaf876eb97aaefd4f632d0fe130983c33b638 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=B9ng=20=28Huka=29=20L=2E=20K=2E=20Nguy=E1=BB=85n?= Date: Tue, 31 Oct 2017 17:32:11 +0700 Subject: [PATCH 075/100] Fix typo --- converter/src/main/java/com/iluwatar/converter/Converter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/converter/src/main/java/com/iluwatar/converter/Converter.java b/converter/src/main/java/com/iluwatar/converter/Converter.java index eeabc4102..918d2d503 100644 --- a/converter/src/main/java/com/iluwatar/converter/Converter.java +++ b/converter/src/main/java/com/iluwatar/converter/Converter.java @@ -68,7 +68,7 @@ public class Converter { /** * @param dtoUsers collection of DTO entities * @return List of domain representation of provided entities retrieved by - * mapping each of them with the convertion function + * mapping each of them with the conversion function */ public final List createFromDtos(final Collection dtoUsers) { return dtoUsers.stream().map(this::convertFromDto).collect(Collectors.toList()); @@ -77,7 +77,7 @@ public class Converter { /** * @param users collection of domain entities * @return List of domain representation of provided entities retrieved by - * mapping each of them with the convertion function + * mapping each of them with the conversion function */ public final List createFromEntities(final Collection users) { return users.stream().map(this::convertFromEntity).collect(Collectors.toList()); From ec6eea61a51b762b98dc6717ac6fecf2da9a3e06 Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Tue, 31 Oct 2017 16:26:24 +0530 Subject: [PATCH 076/100] #352- Unit Of Work : Updated applicability of pattern in README. --- unit-of-work/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unit-of-work/README.md b/unit-of-work/README.md index 25b96153f..b2fbde8ff 100644 --- a/unit-of-work/README.md +++ b/unit-of-work/README.md @@ -13,7 +13,7 @@ tags: --- ## Intent -When a business transaction is completed all the these updates are sent as one +When a business transaction is completed, all the these updates are sent as one big unit of work to be persisted in a database in one go so as to minimize database trips. ![alt text](etc/unit-of-work.urm.png "unit-of-work") From 6e0bf59e5a7e2a768f0ddc923178e8153ba3c0ce Mon Sep 17 00:00:00 2001 From: "adam.kaczmmarek@gmail.com" Date: Sat, 4 Nov 2017 22:38:51 +0100 Subject: [PATCH 077/100] #114 Aggregator pattern; tests; description --- eip-aggregator/README.md | 33 +++++++++ eip-aggregator/etc/aggregator.gif | Bin 0 -> 2413 bytes eip-aggregator/pom.xml | 63 ++++++++++++++++++ .../java/com/iluwatar/eip/aggregator/App.java | 51 ++++++++++++++ .../aggregator/routes/AggregatorRoute.java | 37 ++++++++++ .../routes/MessageAggregationStrategy.java | 27 ++++++++ .../src/main/resources/application.properties | 2 + .../com/iluwatar/eip/aggregator/AppTest.java | 15 +++++ .../routes/AggregatorRouteTest.java | 62 +++++++++++++++++ .../MessageAggregationStrategyTest.java | 42 ++++++++++++ .../resources/application-test.properties | 2 + pom.xml | 1 + 12 files changed, 335 insertions(+) create mode 100644 eip-aggregator/README.md create mode 100644 eip-aggregator/etc/aggregator.gif create mode 100644 eip-aggregator/pom.xml create mode 100644 eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/App.java create mode 100644 eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java create mode 100644 eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategy.java create mode 100644 eip-aggregator/src/main/resources/application.properties create mode 100644 eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/AppTest.java create mode 100644 eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/AggregatorRouteTest.java create mode 100644 eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategyTest.java create mode 100644 eip-aggregator/src/test/resources/application-test.properties diff --git a/eip-aggregator/README.md b/eip-aggregator/README.md new file mode 100644 index 000000000..ec8454f63 --- /dev/null +++ b/eip-aggregator/README.md @@ -0,0 +1,33 @@ +--- +layout: pattern +title: EIP Aggregator +folder: eip-aggregator +permalink: /patterns/eip-aggregator/ +categories: Enterprise integration +tags: + - Java + - Difficulty-Intermittent + - Enterprise integration +--- + +## Intent +Sometimes in enterprise systems there is a need to group incoming data in order to process it as a whole. For example +you may need to gather offers and after defined number of offers has been received you would like to choose the one with +the best parameters. + +Aggregator allows you to merge messages based on defined criteria and parameters. It gathers original messages, +applies aggregation strategy and upon fulfilling given criteria, releasing merged messages. + +![alt text](./etc/aggregator.gif "Splitter") + +## Applicability +Use the Aggregator pattern when + +* You need to combine multiple incoming messages +* You want to process grouped data + +## Credits + +* [Gregor Hohpe, Bobby Woolf - Enterprise Integration Patterns](http://www.enterpriseintegrationpatterns.com/patterns/messaging/Aggregator.html) +* [Apache Camel - Documentation](http://camel.apache.org/aggregator2.html) + diff --git a/eip-aggregator/etc/aggregator.gif b/eip-aggregator/etc/aggregator.gif new file mode 100644 index 0000000000000000000000000000000000000000..b06cdfb0c920bd2e8f9257ebcae452e81dac6acd GIT binary patch literal 2413 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 literal 0 HcmV?d00001 diff --git a/eip-aggregator/pom.xml b/eip-aggregator/pom.xml new file mode 100644 index 000000000..7467cb3a8 --- /dev/null +++ b/eip-aggregator/pom.xml @@ -0,0 +1,63 @@ + + + + 4.0.0 + eip-aggregator + + com.iluwatar + java-design-patterns + 1.18.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.apache.camel + camel-core + ${camel.version} + + + + org.apache.camel + camel-spring-boot + ${camel.version} + + + + + org.springframework.boot + spring-boot-starter-test + + + + org.apache.camel + camel-test-spring + ${camel.version} + + + + \ No newline at end of file diff --git a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/App.java b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/App.java new file mode 100644 index 000000000..fbff1a28a --- /dev/null +++ b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/App.java @@ -0,0 +1,51 @@ +package com.iluwatar.eip.aggregator; + +import org.apache.camel.CamelContext; +import org.apache.camel.builder.RouteBuilder; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; + +/** + * Sometimes in enterprise systems there is a need to group incoming data in order to process it as a whole. For example + * you may need to gather offers and after defined number of offers has been received you would like to choose the one + * with the best parameters. + * + *

+ * Aggregator allows you to merge messages based on defined criteria and parameters. It gathers original messages, + * applies aggregation strategy and upon fulfilling given criteria, releasing merged messages. + *

+ * + */ +@SpringBootApplication +public class App { + + /** + * Program entry point. It starts Spring Boot application and using Apache Camel it auto-configures routes. + * + * @param args command line args + */ + public static void main(String[] args) throws Exception { + // Run Spring Boot application and obtain ApplicationContext + ConfigurableApplicationContext context = SpringApplication.run(App.class, args); + + // Get CamelContext from ApplicationContext + CamelContext camelContext = (CamelContext) context.getBean("camelContext"); + + // Add a new routes that will handle endpoints form SplitterRoute class. + camelContext.addRoutes(new RouteBuilder() { + + @Override + public void configure() throws Exception { + from("{{endpoint}}").log("ENDPOINT: ${body}"); + } + + }); + + // Add producer that will send test message to an entry point in WireTapRoute + String[] stringArray = {"Test item #1", "Test item #2", "Test item #3"}; + camelContext.createProducerTemplate().sendBody("{{entry}}", stringArray); + + SpringApplication.exit(context); + } +} diff --git a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java new file mode 100644 index 000000000..78a0abd42 --- /dev/null +++ b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java @@ -0,0 +1,37 @@ +package com.iluwatar.eip.aggregator.routes; + +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.processor.aggregate.AggregationStrategy; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * Sample aggregator route definition. + * + *

+ * It consumes messages out of the direct:entry entry point and forwards them to direct:endpoint. + * Route accepts messages containing String as a body, it aggregates the messages based on the settings and forwards + * them as CSV to the output chanel. + * + * Settings for the aggregation are: aggregate until 3 messages are bundled or wait 2000ms before sending bundled + * messages further. + *

+ * + * In this example input/output endpoints names are stored in application.properties file. + */ +@Component +public class AggregatorRoute extends RouteBuilder { + + @Autowired + private MessageAggregationStrategy aggregator; + + /** + * Configures the route + * @throws Exception in case of exception during configuration + */ + @Override + public void configure() throws Exception { + // Main route + from("{{entry}}").aggregate(constant(true), aggregator).completionSize(3).completionInterval(2000).to("{{endpoint}}"); + } +} diff --git a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategy.java b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategy.java new file mode 100644 index 000000000..a2c90c609 --- /dev/null +++ b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategy.java @@ -0,0 +1,27 @@ +package com.iluwatar.eip.aggregator.routes; + +import org.apache.camel.Exchange; +import org.apache.camel.processor.aggregate.AggregationStrategy; +import org.springframework.stereotype.Component; + +/** + * Aggregation strategy joining bodies of messages. If message is first one oldMessage is null. All changes are + * made on IN messages. + */ +@Component +public class MessageAggregationStrategy implements AggregationStrategy { + + @Override + public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { + if (oldExchange == null) { + return newExchange; + } + + String in1 = (String) oldExchange.getIn().getBody(); + String in2 = (String) newExchange.getIn().getBody(); + + oldExchange.getIn().setBody(in1 + ";" + in2); + + return oldExchange; + } +} diff --git a/eip-aggregator/src/main/resources/application.properties b/eip-aggregator/src/main/resources/application.properties new file mode 100644 index 000000000..cb879e6e2 --- /dev/null +++ b/eip-aggregator/src/main/resources/application.properties @@ -0,0 +1,2 @@ +entry=direct:entry +endpoint=direct:endpoint diff --git a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/AppTest.java b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/AppTest.java new file mode 100644 index 000000000..5eee0986f --- /dev/null +++ b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/AppTest.java @@ -0,0 +1,15 @@ +package com.iluwatar.eip.aggregator; + +import org.junit.Test; + +/** + * Test for App class + */ +public class AppTest { + + @Test + public void testMain() throws Exception { + String[] args = {}; + App.main(args); + } +} diff --git a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/AggregatorRouteTest.java b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/AggregatorRouteTest.java new file mode 100644 index 000000000..449c4aad0 --- /dev/null +++ b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/AggregatorRouteTest.java @@ -0,0 +1,62 @@ +package com.iluwatar.eip.aggregator.routes; + +import org.apache.camel.EndpointInject; +import org.apache.camel.ProducerTemplate; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import static org.junit.Assert.assertEquals; + +/** + * Test class for AggregatorRoute. + *

+ * In order for it to work we have to mock endpoints we want to read/write to. To mock those we need to substitute + * original endpoint names to mocks. + *

+ */ +@RunWith(SpringJUnit4ClassRunner.class) +@SpringApplicationConfiguration(classes = AggregatorRouteTest.class) +@ActiveProfiles("test") +@EnableAutoConfiguration +@ComponentScan +public class AggregatorRouteTest { + + @EndpointInject(uri = "{{entry}}") + private ProducerTemplate entry; + + @EndpointInject(uri = "{{endpoint}}") + private MockEndpoint endpoint; + + /** + * Test if endpoint receives three separate messages. + * @throws Exception in case of en exception during the test + */ + @Test + @DirtiesContext + public void testSplitter() throws Exception { + + // Three items in one entry message + entry.sendBody("TEST1"); + entry.sendBody("TEST2"); + entry.sendBody("TEST3"); + entry.sendBody("TEST4"); + entry.sendBody("TEST5"); + + // Endpoint should have three different messages in the end order of the messages is not important + endpoint.expectedMessageCount(2); + endpoint.assertIsSatisfied(); + + String body = (String) endpoint.getReceivedExchanges().get(0).getIn().getBody(); + assertEquals(3, body.split(";").length); + + String body2 = (String) endpoint.getReceivedExchanges().get(1).getIn().getBody(); + assertEquals(2, body2.split(";").length); + } +} diff --git a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategyTest.java b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategyTest.java new file mode 100644 index 000000000..f4685e334 --- /dev/null +++ b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategyTest.java @@ -0,0 +1,42 @@ +package com.iluwatar.eip.aggregator.routes; + +import org.apache.camel.CamelContext; +import org.apache.camel.Exchange; +import org.apache.camel.impl.DefaultExchange; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * Tests MessageAggregationStrategy + */ +public class MessageAggregationStrategyTest { + + @Test + public void testAggregate() { + MessageAggregationStrategy mas = new MessageAggregationStrategy(); + Exchange oldExchange = new DefaultExchange((CamelContext) null); + oldExchange.getIn().setBody("TEST1"); + + Exchange newExchange = new DefaultExchange((CamelContext) null); + newExchange.getIn().setBody("TEST2"); + + Exchange output = mas.aggregate(oldExchange, newExchange); + String outputBody = (String) output.getIn().getBody(); + assertEquals("TEST1;TEST2", outputBody); + } + + @Test + public void testAggregateOldNull() { + MessageAggregationStrategy mas = new MessageAggregationStrategy(); + + Exchange newExchange = new DefaultExchange((CamelContext) null); + newExchange.getIn().setBody("TEST2"); + + Exchange output = mas.aggregate(null, newExchange); + String outputBody = (String) output.getIn().getBody(); + + assertEquals(newExchange, output); + assertEquals("TEST2", outputBody); + } +} diff --git a/eip-aggregator/src/test/resources/application-test.properties b/eip-aggregator/src/test/resources/application-test.properties new file mode 100644 index 000000000..f657ea5a1 --- /dev/null +++ b/eip-aggregator/src/test/resources/application-test.properties @@ -0,0 +1,2 @@ +entry=direct:entry +endpoint=mock:endpoint diff --git a/pom.xml b/pom.xml index 0c03909de..2d84d5064 100644 --- a/pom.xml +++ b/pom.xml @@ -149,6 +149,7 @@ partial-response eip-wire-tap eip-splitter + eip-aggregator From c45e9a1faf24dd58929b957b7b3e3f4c8ca8de04 Mon Sep 17 00:00:00 2001 From: codinghog Date: Tue, 7 Nov 2017 07:24:31 +0100 Subject: [PATCH 078/100] #114 Fixed checkstyle issue --- .../com/iluwatar/eip/aggregator/routes/AggregatorRoute.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java index 78a0abd42..8e09d4e95 100644 --- a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java +++ b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java @@ -32,6 +32,8 @@ public class AggregatorRoute extends RouteBuilder { @Override public void configure() throws Exception { // Main route - from("{{entry}}").aggregate(constant(true), aggregator).completionSize(3).completionInterval(2000).to("{{endpoint}}"); + from("{{entry}}").aggregate(constant(true), aggregator) + .completionSize(3).completionInterval(2000) + .to("{{endpoint}}"); } } From 87ee97a1126b170b764eca90787ca221161706f8 Mon Sep 17 00:00:00 2001 From: codinghog Date: Tue, 7 Nov 2017 07:37:12 +0100 Subject: [PATCH 079/100] #114 Fixed checkstyle issue --- .../java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java | 1 - 1 file changed, 1 deletion(-) diff --git a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java index 8e09d4e95..5aba0ef27 100644 --- a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java +++ b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java @@ -1,7 +1,6 @@ package com.iluwatar.eip.aggregator.routes; import org.apache.camel.builder.RouteBuilder; -import org.apache.camel.processor.aggregate.AggregationStrategy; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; From d37922bf823900f9ce319736927dfb2203808ded Mon Sep 17 00:00:00 2001 From: Tschis Date: Tue, 7 Nov 2017 21:05:04 -0300 Subject: [PATCH 080/100] add factory of factories --- .../com/iluwatar/abstractfactory/App.java | 37 ++++++++++++++++--- .../abstractfactory/AbstractFactoryTest.java | 7 +++- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java index d7cb296c0..663018588 100644 --- a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java +++ b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java @@ -25,6 +25,8 @@ package com.iluwatar.abstractfactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.iluwatar.abstractfactory.App.FactoryMaker.KingdomType; + /** * * The Abstract Factory pattern provides a way to encapsulate a group of individual factories that have a common theme @@ -56,7 +58,7 @@ public class App { setCastle(factory.createCastle()); setArmy(factory.createArmy()); } - + King getKing(final KingdomFactory factory) { return factory.createKing(); } @@ -92,6 +94,31 @@ public class App { private void setArmy(final Army army) { this.army = army; } + + /** + * The factory of kingdom factories. + */ + public static class FactoryMaker { + + private FactoryMaker() {} + + public enum KingdomType { + ELF, + ORC + } + + public static KingdomFactory makeFactory(KingdomType type) { + + switch (type) { + case ELF: + return new ElfKingdomFactory(); + case ORC: + return new OrcKingdomFactory(); + default: + throw new IllegalArgumentException("KingdomType not supported."); + } + } + } /** * Program entry point @@ -104,17 +131,15 @@ public class App { App app = new App(); LOGGER.info("Elf Kingdom"); - app.createKingdom(new ElfKingdomFactory()); + app.createKingdom(FactoryMaker.makeFactory(KingdomType.ELF)); LOGGER.info(app.getArmy().getDescription()); LOGGER.info(app.getCastle().getDescription()); LOGGER.info(app.getKing().getDescription()); LOGGER.info("Orc Kingdom"); - app.createKingdom(new OrcKingdomFactory()); + app.createKingdom(FactoryMaker.makeFactory(KingdomType.ORC)); LOGGER.info(app.getArmy().getDescription()); LOGGER.info(app.getCastle().getDescription()); LOGGER.info(app.getKing().getDescription()); - } - -} +} \ No newline at end of file diff --git a/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java b/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java index b6fca8b23..67ecd43f4 100644 --- a/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java +++ b/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java @@ -28,6 +28,9 @@ import static org.junit.Assert.assertTrue; import org.junit.Before; import org.junit.Test; +import com.iluwatar.abstractfactory.App.FactoryMaker; +import com.iluwatar.abstractfactory.App.FactoryMaker.KingdomType; + /** * Test for abstract factory */ @@ -39,8 +42,8 @@ public class AbstractFactoryTest { @Before public void setUp() { - elfFactory = new ElfKingdomFactory(); - orcFactory = new OrcKingdomFactory(); + elfFactory = FactoryMaker.makeFactory(KingdomType.ELF); + orcFactory = FactoryMaker.makeFactory(KingdomType.ORC); } @Test From 3634b3338cc2fab6cfa147c9475b986165471b73 Mon Sep 17 00:00:00 2001 From: Tschis Date: Tue, 7 Nov 2017 22:19:10 -0300 Subject: [PATCH 081/100] Fix checkstyle validations --- .../com/iluwatar/abstractfactory/App.java | 45 +++++++++---------- .../abstractfactory/AbstractFactoryTest.java | 6 +-- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java index 663018588..4cc1bcc0d 100644 --- a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java +++ b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java @@ -95,33 +95,32 @@ public class App { this.army = army; } - /** - * The factory of kingdom factories. - */ public static class FactoryMaker { - - private FactoryMaker() {} - - public enum KingdomType { - ELF, - ORC - } - - public static KingdomFactory makeFactory(KingdomType type) { - switch (type) { - case ELF: - return new ElfKingdomFactory(); - case ORC: - return new OrcKingdomFactory(); - default: - throw new IllegalArgumentException("KingdomType not supported."); - } - } + private FactoryMaker() { + } + + public enum KingdomType { + ELF, ORC + } + + /** + * The factory of kingdom factories. + */ + public static KingdomFactory makeFactory(KingdomType type) { + switch (type) { + case ELF: + return new ElfKingdomFactory(); + case ORC: + return new OrcKingdomFactory(); + default: + throw new IllegalArgumentException("KingdomType not supported."); + } + } } - + /** - * Program entry point + * Program entry point. * * @param args * command line args diff --git a/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java b/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java index 67ecd43f4..7613edf65 100644 --- a/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java +++ b/abstract-factory/src/test/java/com/iluwatar/abstractfactory/AbstractFactoryTest.java @@ -25,12 +25,12 @@ package com.iluwatar.abstractfactory; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import org.junit.Before; -import org.junit.Test; - import com.iluwatar.abstractfactory.App.FactoryMaker; import com.iluwatar.abstractfactory.App.FactoryMaker.KingdomType; +import org.junit.Before; +import org.junit.Test; + /** * Test for abstract factory */ From 933c84ff1c82ee4c0e3faa147f6160380e2bb817 Mon Sep 17 00:00:00 2001 From: Tschis Date: Tue, 7 Nov 2017 22:32:36 -0300 Subject: [PATCH 082/100] Fix checkstyle validations --- .../main/java/com/iluwatar/abstractfactory/App.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java index 4cc1bcc0d..4d6043abc 100644 --- a/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java +++ b/abstract-factory/src/main/java/com/iluwatar/abstractfactory/App.java @@ -95,17 +95,20 @@ public class App { this.army = army; } + /** + * The factory of kingdom factories. + */ public static class FactoryMaker { - private FactoryMaker() { - } - + /** + * Enumeration for the different types of Kingdoms. + */ public enum KingdomType { ELF, ORC } /** - * The factory of kingdom factories. + * The factory method to create KingdomFactory concrete objects. */ public static KingdomFactory makeFactory(KingdomType type) { switch (type) { From f3f1f54ccc9d551f39afa08071380b35262e23ff Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sun, 12 Nov 2017 15:19:49 +0530 Subject: [PATCH 083/100] #352- Unit Of Work : Update parent module version in unit of work module. --- unit-of-work/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unit-of-work/pom.xml b/unit-of-work/pom.xml index 38b0e1b42..0d7fbf5a2 100644 --- a/unit-of-work/pom.xml +++ b/unit-of-work/pom.xml @@ -5,7 +5,7 @@ java-design-patterns com.iluwatar - 1.17.0-SNAPSHOT + 1.18.0-SNAPSHOT 4.0.0 From 51096ec44511463bc0803a0ca32b2235b301dada Mon Sep 17 00:00:00 2001 From: Piyush Chaudhari Date: Sun, 12 Nov 2017 15:50:12 +0530 Subject: [PATCH 084/100] #352- Unit Of Work : Update java doc for methods. --- .../java/com/iluwatar/unitofwork/IUnitOfWork.java | 12 ++++++++++++ .../com/iluwatar/unitofwork/StudentRepository.java | 3 +++ 2 files changed, 15 insertions(+) diff --git a/unit-of-work/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java index bd1fcbffa..e0b453498 100644 --- a/unit-of-work/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java +++ b/unit-of-work/src/main/java/com/iluwatar/unitofwork/IUnitOfWork.java @@ -32,12 +32,24 @@ public interface IUnitOfWork { String DELETE = "DELETE"; String MODIFY = "MODIFY"; + /** + * Any register new operation occurring on UnitOfWork is only going to be performed on commit. + */ void registerNew(T entity); + /** + * Any register modify operation occurring on UnitOfWork is only going to be performed on commit. + */ void registerModified(T entity); + /** + * Any register delete operation occurring on UnitOfWork is only going to be performed on commit. + */ void registerDeleted(T entity); + /*** + * All UnitOfWork operations batched together executed in commit only. + */ void commit(); } \ No newline at end of file diff --git a/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java b/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java index 7bcccc61b..ff1136620 100644 --- a/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java +++ b/unit-of-work/src/main/java/com/iluwatar/unitofwork/StudentRepository.java @@ -78,6 +78,9 @@ public class StudentRepository implements IUnitOfWork { context.put(operation, studentsToOperate); } + /** + * All UnitOfWork operations are batched and executed together on commit only. + */ @Override public void commit() { if (context == null || context.size() == 0) { From 5c953d7d005551352d5c7b1d76d77f18037a5def Mon Sep 17 00:00:00 2001 From: Krandelbord Date: Sun, 19 Nov 2017 12:01:39 +0100 Subject: [PATCH 085/100] added synchronized keyword to method that reads from server poll --- .../main/java/com/iluwatar/monostate/LoadBalancer.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/monostate/src/main/java/com/iluwatar/monostate/LoadBalancer.java b/monostate/src/main/java/com/iluwatar/monostate/LoadBalancer.java index e440dfba2..b280de767 100644 --- a/monostate/src/main/java/com/iluwatar/monostate/LoadBalancer.java +++ b/monostate/src/main/java/com/iluwatar/monostate/LoadBalancer.java @@ -35,10 +35,10 @@ import java.util.List; public class LoadBalancer { private static List servers = new ArrayList<>(); - private static int id; private static int lastServedId; static { + int id = 0; servers.add(new Server("localhost", 8081, ++id)); servers.add(new Server("localhost", 8080, ++id)); servers.add(new Server("localhost", 8082, ++id)); @@ -67,14 +67,12 @@ public class LoadBalancer { /** * Handle request */ - public void serverRequest(Request request) { + public synchronized void serverRequest(Request request) { if (lastServedId >= servers.size()) { lastServedId = 0; } Server server = servers.get(lastServedId++); server.serve(request); } - - - + } From 071cde8d705df9f471866f14c8fcbdce37686dde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 19 Nov 2017 20:17:57 +0200 Subject: [PATCH 086/100] Add license headers --- eip-aggregator/etc/eip-aggregator.urm.puml | 14 +++++++++++ .../java/com/iluwatar/eip/aggregator/App.java | 22 ++++++++++++++++++ .../aggregator/routes/AggregatorRoute.java | 22 ++++++++++++++++++ .../routes/MessageAggregationStrategy.java | 22 ++++++++++++++++++ .../src/main/resources/application.properties | 23 +++++++++++++++++++ .../com/iluwatar/eip/aggregator/AppTest.java | 22 ++++++++++++++++++ .../routes/AggregatorRouteTest.java | 22 ++++++++++++++++++ .../MessageAggregationStrategyTest.java | 22 ++++++++++++++++++ .../resources/application-test.properties | 23 +++++++++++++++++++ eip-splitter/etc/eip-splitter.urm.puml | 8 +++++++ .../java/com/iluwatar/eip/splitter/App.java | 22 ++++++++++++++++++ .../eip/splitter/routes/SplitterRoute.java | 22 ++++++++++++++++++ .../src/main/resources/application.properties | 23 +++++++++++++++++++ .../com/iluwatar/eip/splitter/AppTest.java | 22 ++++++++++++++++++ .../splitter/routes/SplitterRouteTest.java | 22 ++++++++++++++++++ .../resources/application-test.properties | 23 +++++++++++++++++++ eip-wire-tap/etc/eip-wire-tap.urm.puml | 8 +++++++ .../java/com/iluwatar/eip/wiretap/App.java | 22 ++++++++++++++++++ .../eip/wiretap/routes/WireTapRoute.java | 22 ++++++++++++++++++ .../src/main/resources/application.properties | 23 +++++++++++++++++++ .../com/iluwatar/eip/wiretap/AppTest.java | 22 ++++++++++++++++++ .../eip/wiretap/routes/WireTapRouteTest.java | 22 ++++++++++++++++++ .../resources/application-test.properties | 23 +++++++++++++++++++ 23 files changed, 476 insertions(+) create mode 100644 eip-aggregator/etc/eip-aggregator.urm.puml create mode 100644 eip-splitter/etc/eip-splitter.urm.puml create mode 100644 eip-wire-tap/etc/eip-wire-tap.urm.puml diff --git a/eip-aggregator/etc/eip-aggregator.urm.puml b/eip-aggregator/etc/eip-aggregator.urm.puml new file mode 100644 index 000000000..4d8661e21 --- /dev/null +++ b/eip-aggregator/etc/eip-aggregator.urm.puml @@ -0,0 +1,14 @@ +@startuml +package com.iluwatar.eip.aggregator { + class App { + + App() + + main(args : String[]) {static} + } +} +package com.iluwatar.eip.aggregator.routes { + class MessageAggregationStrategy { + + MessageAggregationStrategy() + + aggregate(oldExchange : Exchange, newExchange : Exchange) : Exchange + } +} +@enduml \ No newline at end of file diff --git a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/App.java b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/App.java index fbff1a28a..d55f24e3d 100644 --- a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/App.java +++ b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/App.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.eip.aggregator; import org.apache.camel.CamelContext; diff --git a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java index 5aba0ef27..536565339 100644 --- a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java +++ b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.eip.aggregator.routes; import org.apache.camel.builder.RouteBuilder; diff --git a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategy.java b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategy.java index a2c90c609..4b5e4cb2f 100644 --- a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategy.java +++ b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategy.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.eip.aggregator.routes; import org.apache.camel.Exchange; diff --git a/eip-aggregator/src/main/resources/application.properties b/eip-aggregator/src/main/resources/application.properties index cb879e6e2..044833fc1 100644 --- a/eip-aggregator/src/main/resources/application.properties +++ b/eip-aggregator/src/main/resources/application.properties @@ -1,2 +1,25 @@ +# +# The MIT License +# Copyright (c) 2014 Ilkka Seppälä +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# + entry=direct:entry endpoint=direct:endpoint diff --git a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/AppTest.java b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/AppTest.java index 5eee0986f..39a3c1ab3 100644 --- a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/AppTest.java +++ b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/AppTest.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.eip.aggregator; import org.junit.Test; diff --git a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/AggregatorRouteTest.java b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/AggregatorRouteTest.java index 449c4aad0..eb7846b9c 100644 --- a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/AggregatorRouteTest.java +++ b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/AggregatorRouteTest.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.eip.aggregator.routes; import org.apache.camel.EndpointInject; diff --git a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategyTest.java b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategyTest.java index f4685e334..59aa2955d 100644 --- a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategyTest.java +++ b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategyTest.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.eip.aggregator.routes; import org.apache.camel.CamelContext; diff --git a/eip-aggregator/src/test/resources/application-test.properties b/eip-aggregator/src/test/resources/application-test.properties index f657ea5a1..8d6ecbbd3 100644 --- a/eip-aggregator/src/test/resources/application-test.properties +++ b/eip-aggregator/src/test/resources/application-test.properties @@ -1,2 +1,25 @@ +# +# The MIT License +# Copyright (c) 2014 Ilkka Seppälä +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# + entry=direct:entry endpoint=mock:endpoint diff --git a/eip-splitter/etc/eip-splitter.urm.puml b/eip-splitter/etc/eip-splitter.urm.puml new file mode 100644 index 000000000..ad063b709 --- /dev/null +++ b/eip-splitter/etc/eip-splitter.urm.puml @@ -0,0 +1,8 @@ +@startuml +package com.iluwatar.eip.splitter { + class App { + + App() + + main(args : String[]) {static} + } +} +@enduml \ No newline at end of file diff --git a/eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java b/eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java index 1f52e9569..ceadb5f8d 100644 --- a/eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java +++ b/eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.eip.splitter; import org.apache.camel.CamelContext; diff --git a/eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java b/eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java index 064ad1f68..f7eb28dea 100644 --- a/eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java +++ b/eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.eip.splitter.routes; import org.apache.camel.builder.RouteBuilder; diff --git a/eip-splitter/src/main/resources/application.properties b/eip-splitter/src/main/resources/application.properties index cb879e6e2..044833fc1 100644 --- a/eip-splitter/src/main/resources/application.properties +++ b/eip-splitter/src/main/resources/application.properties @@ -1,2 +1,25 @@ +# +# The MIT License +# Copyright (c) 2014 Ilkka Seppälä +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# + entry=direct:entry endpoint=direct:endpoint diff --git a/eip-splitter/src/test/java/com/iluwatar/eip/splitter/AppTest.java b/eip-splitter/src/test/java/com/iluwatar/eip/splitter/AppTest.java index bff2cf0b1..264e39c46 100644 --- a/eip-splitter/src/test/java/com/iluwatar/eip/splitter/AppTest.java +++ b/eip-splitter/src/test/java/com/iluwatar/eip/splitter/AppTest.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.eip.splitter; import org.junit.Test; diff --git a/eip-splitter/src/test/java/com/iluwatar/eip/splitter/routes/SplitterRouteTest.java b/eip-splitter/src/test/java/com/iluwatar/eip/splitter/routes/SplitterRouteTest.java index 78fc37d91..5bc59cc1a 100644 --- a/eip-splitter/src/test/java/com/iluwatar/eip/splitter/routes/SplitterRouteTest.java +++ b/eip-splitter/src/test/java/com/iluwatar/eip/splitter/routes/SplitterRouteTest.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.eip.splitter.routes; import org.apache.camel.EndpointInject; diff --git a/eip-splitter/src/test/resources/application-test.properties b/eip-splitter/src/test/resources/application-test.properties index f657ea5a1..8d6ecbbd3 100644 --- a/eip-splitter/src/test/resources/application-test.properties +++ b/eip-splitter/src/test/resources/application-test.properties @@ -1,2 +1,25 @@ +# +# The MIT License +# Copyright (c) 2014 Ilkka Seppälä +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# + entry=direct:entry endpoint=mock:endpoint diff --git a/eip-wire-tap/etc/eip-wire-tap.urm.puml b/eip-wire-tap/etc/eip-wire-tap.urm.puml new file mode 100644 index 000000000..51ee99723 --- /dev/null +++ b/eip-wire-tap/etc/eip-wire-tap.urm.puml @@ -0,0 +1,8 @@ +@startuml +package com.iluwatar.eip.wiretap { + class App { + + App() + + main(args : String[]) {static} + } +} +@enduml \ No newline at end of file diff --git a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java index 7bf4ce0d4..ca605cb78 100644 --- a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java +++ b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.eip.wiretap; import org.apache.camel.CamelContext; diff --git a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java index c744295ee..994ceacdb 100644 --- a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java +++ b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.eip.wiretap.routes; import org.apache.camel.builder.RouteBuilder; diff --git a/eip-wire-tap/src/main/resources/application.properties b/eip-wire-tap/src/main/resources/application.properties index 6dabe6ccc..90a152425 100644 --- a/eip-wire-tap/src/main/resources/application.properties +++ b/eip-wire-tap/src/main/resources/application.properties @@ -1,3 +1,26 @@ +# +# The MIT License +# Copyright (c) 2014 Ilkka Seppälä +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# + entry=direct:entry endpoint=direct:endpoint wireTapEndpoint=direct:wireTapEndpoint \ No newline at end of file diff --git a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java index 25b9d8550..31b443660 100644 --- a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java +++ b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.eip.wiretap; import org.junit.Test; diff --git a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/routes/WireTapRouteTest.java b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/routes/WireTapRouteTest.java index a7b15f45e..71c487bd8 100644 --- a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/routes/WireTapRouteTest.java +++ b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/routes/WireTapRouteTest.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.eip.wiretap.routes; import org.apache.camel.EndpointInject; diff --git a/eip-wire-tap/src/test/resources/application-test.properties b/eip-wire-tap/src/test/resources/application-test.properties index 1719c8ca4..e76faa1fc 100644 --- a/eip-wire-tap/src/test/resources/application-test.properties +++ b/eip-wire-tap/src/test/resources/application-test.properties @@ -1,3 +1,26 @@ +# +# The MIT License +# Copyright (c) 2014 Ilkka Seppälä +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# + entry=direct:entry endpoint=mock:endpoint wireTapEndpoint=mock:wireTapEndpoint \ No newline at end of file From 14279278cd2c57942af6effd2e0126badfc74133 Mon Sep 17 00:00:00 2001 From: Rodolfo Forte Date: Sun, 19 Nov 2017 19:22:03 -0200 Subject: [PATCH 087/100] Sync readme.md with the new code --- abstract-factory/README.md | 39 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/abstract-factory/README.md b/abstract-factory/README.md index c049401fc..0fb3c3cb2 100644 --- a/abstract-factory/README.md +++ b/abstract-factory/README.md @@ -120,6 +120,45 @@ king.getDescription(); // Output: This is the Elven king! army.getDescription(); // Output: This is the Elven Army! ``` +Now, we can design a factory for our different kingdom factories. In this example, we created FactoryMaker, responsible for returning an instance of either ElfKingdomFactory or OrcKingdomFactory. +The client can use FactoryMaker to create the desired concrete factory which, in turn, will produce different concrete objects (Army, King, Castle). +In this example, we also used an enum to parameterize which type of kingdom factory the client will ask for. + +``` +public static class FactoryMaker { + + public enum KingdomType { + ELF, ORC + } + + public static KingdomFactory makeFactory(KingdomType type) { + switch (type) { + case ELF: + return new ElfKingdomFactory(); + case ORC: + return new OrcKingdomFactory(); + default: + throw new IllegalArgumentException("KingdomType not supported."); + } + } +} + +public static void main(String[] args) { + App app = new App(); + + LOGGER.info("Elf Kingdom"); + app.createKingdom(FactoryMaker.makeFactory(KingdomType.ELF)); + LOGGER.info(app.getArmy().getDescription()); + LOGGER.info(app.getCastle().getDescription()); + LOGGER.info(app.getKing().getDescription()); + + LOGGER.info("Orc Kingdom"); + app.createKingdom(FactoryMaker.makeFactory(KingdomType.ORC)); + -- similar use of the orc factory +} +``` + + ## Applicability Use the Abstract Factory pattern when From fb64d69347d145a8b1cd683d0aa8c3d728f4408c Mon Sep 17 00:00:00 2001 From: Zafar Khaydarov Date: Sat, 25 Nov 2017 00:03:34 -0500 Subject: [PATCH 088/100] Create PULL_REQUEST_TEMPLATE.md --- PULL_REQUEST_TEMPLATE.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 PULL_REQUEST_TEMPLATE.md diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..ba9d9ad69 --- /dev/null +++ b/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,9 @@ +### What this PR do? +- Describes the main changes that come with the pull request in present tense +- For instance - "Add correction to facade pattern" + +### Context +- + + +> DELETE ME| for detailed contributing instructions see https://github.com/iluwatar/java-design-patterns/wiki/01.-How-to-contribute From b0f9582824ba414805457243a8534310d6dbf0f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Tue, 28 Nov 2017 20:55:52 +0200 Subject: [PATCH 089/100] #190 Remove urm plugin --- .../etc/abstract-document.urm.puml | 59 ---- .../etc/aggregator-service.urm.puml | 43 --- .../etc/information-microservice.urm.puml | 12 - .../etc/inventory-microservice.urm.puml | 12 - aggregator-microservices/pom.xml | 21 -- api-gateway/etc/api-gateway-service.urm.puml | 48 --- api-gateway/etc/image-microservice.urm.puml | 12 - api-gateway/etc/price-microservice.urm.puml | 12 - api-gateway/pom.xml | 21 -- .../etc/async-method-invocation.urm.puml | 51 ---- balking/etc/balking.urm.puml | 24 -- .../etc/business-delegate.urm.puml | 57 ---- caching/etc/caching.urm.puml | 110 ------- callback/etc/callback.urm.puml | 28 -- command/etc/command.urm.puml | 86 ------ converter/etc/converter.urm.puml | 49 --- cqrs/etc/cqrs.urm.puml | 124 -------- dao/etc/dao.urm.puml | 66 ----- data-bus/etc/data-bus.urm.puml | 77 ----- data-mapper/etc/data-mapper.urm.puml | 42 --- .../etc/data-transfer-object.urm.puml | 26 -- delegation/etc/delegation.urm.puml | 39 --- .../etc/dependency-injection.urm.puml | 49 --- .../etc/double-checked-locking.urm.puml | 22 -- double-dispatch/etc/double-dispatch.urm.puml | 68 ----- eip-aggregator/etc/eip-aggregator.urm.puml | 14 - eip-splitter/etc/eip-splitter.urm.puml | 8 - eip-wire-tap/etc/eip-wire-tap.urm.puml | 8 - .../etc/event-aggregator.urm.puml | 74 ----- .../etc/event-asynchronous.urm.puml | 66 ----- .../etc/event-driven-architecture.urm.puml | 64 ---- event-queue/etc/event-queue.urm.puml | 26 -- event-sourcing/etc/event-sourcing.urm.puml | 184 ------------ execute-around/etc/execute-around.urm.puml | 14 - .../etc/extension-objects.urm.puml | 2 - factory-kit/etc/factory-kit.urm.puml | 46 --- feature-toggle/etc/feature-toggle.urm.puml | 48 --- fluentinterface/etc/fluentinterface.urm.puml | 72 ----- flux/etc/flux.urm.puml | 117 -------- .../etc/front-controller.urm.puml | 53 ---- .../etc/guarded-suspension.urm.puml | 15 - .../etc/half-sync-half-async.urm.puml | 31 -- hexagonal/etc/hexagonal.urm.puml | 279 ------------------ .../etc/intercepting-filter.urm.puml | 89 ------ interpreter/etc/interpreter.urm.puml | 52 ---- iterator/etc/iterator.urm.puml | 49 --- layers/etc/layers.urm.puml | 126 -------- lazy-loading/etc/lazy-loading.urm.puml | 40 --- marker/etc/marker.urm.puml | 2 - mediator/etc/mediator.urm.puml | 69 ----- memento/etc/memento.urm.puml | 49 --- message-channel/etc/message-channel.urm.puml | 9 - .../etc/model-view-controller.urm.puml | 70 ----- .../etc/model-view-presenter.urm.puml | 87 ------ module/etc/module.urm.puml | 43 --- monad/etc/monad.urm.puml | 36 --- monostate/etc/monostate.urm.puml | 33 --- multiton/etc/multiton.urm.puml | 30 -- mute-idiom/etc/mute-idiom.urm.puml | 24 -- mutex/etc/mutex.urm.puml | 27 -- naked-objects/etc/naked-objects-dom.urm.puml | 39 --- .../etc/naked-objects-fixture.urm.puml | 93 ------ .../etc/naked-objects-integtests.urm.puml | 93 ------ naked-objects/pom.xml | 17 -- null-object/etc/null-object.urm.puml | 41 --- object-mother/etc/object-mother.urm.puml | 45 --- object-pool/etc/object-pool.urm.puml | 30 -- observer/etc/observer.urm.puml | 81 ----- page-object/etc/page-object.urm.puml | 8 - .../etc/partial-response.urm.puml | 31 -- poison-pill/etc/poison-pill.urm.puml | 71 ----- pom.xml | 57 ---- .../etc/private-class-data.urm.puml | 36 --- .../etc/producer-consumer.urm.puml | 39 --- promise/etc/promise.urm.puml | 79 ----- property/etc/property.urm.puml | 54 ---- .../etc/publish-subscribe.urm.puml | 9 - .../etc/queue-load-leveling.urm.puml | 44 --- reactor/etc/reactor.urm.puml | 156 ---------- .../etc/reader-writer-lock.urm.puml | 61 ---- repository/etc/repository.urm.puml | 56 ---- ...rce-acquisition-is-initialization.urm.puml | 19 -- semaphore/etc/semaphore.urm.puml | 56 ---- servant/etc/servant.urm.puml | 56 ---- service-layer/etc/service-layer.urm.puml | 161 ---------- service-locator/etc/service-locator.urm.puml | 41 --- specification/etc/specification.urm.puml | 107 ------- state/etc/state.urm.puml | 39 --- step-builder/etc/step-builder.urm.puml | 91 ------ strategy/etc/strategy.urm.puml | 37 --- template-method/etc/template-method.urm.puml | 39 --- thread-pool/etc/thread-pool.urm.puml | 37 --- throttling/etc/throttling.urm.puml | 29 -- tls/etc/tls.urm.puml | 23 -- tolerant-reader/etc/tolerant-reader.urm.puml | 39 --- twin/etc/twin.urm.puml | 27 -- value-object/etc/value-object.urm.puml | 22 -- visitor/etc/visitor.urm.puml | 60 ---- 98 files changed, 5137 deletions(-) delete mode 100644 abstract-document/etc/abstract-document.urm.puml delete mode 100644 aggregator-microservices/etc/aggregator-service.urm.puml delete mode 100644 aggregator-microservices/etc/information-microservice.urm.puml delete mode 100644 aggregator-microservices/etc/inventory-microservice.urm.puml delete mode 100644 api-gateway/etc/api-gateway-service.urm.puml delete mode 100644 api-gateway/etc/image-microservice.urm.puml delete mode 100644 api-gateway/etc/price-microservice.urm.puml delete mode 100644 async-method-invocation/etc/async-method-invocation.urm.puml delete mode 100644 balking/etc/balking.urm.puml delete mode 100644 business-delegate/etc/business-delegate.urm.puml delete mode 100644 caching/etc/caching.urm.puml delete mode 100644 callback/etc/callback.urm.puml delete mode 100644 command/etc/command.urm.puml delete mode 100644 converter/etc/converter.urm.puml delete mode 100644 cqrs/etc/cqrs.urm.puml delete mode 100644 dao/etc/dao.urm.puml delete mode 100644 data-bus/etc/data-bus.urm.puml delete mode 100644 data-mapper/etc/data-mapper.urm.puml delete mode 100644 data-transfer-object/etc/data-transfer-object.urm.puml delete mode 100644 delegation/etc/delegation.urm.puml delete mode 100644 dependency-injection/etc/dependency-injection.urm.puml delete mode 100644 double-checked-locking/etc/double-checked-locking.urm.puml delete mode 100644 double-dispatch/etc/double-dispatch.urm.puml delete mode 100644 eip-aggregator/etc/eip-aggregator.urm.puml delete mode 100644 eip-splitter/etc/eip-splitter.urm.puml delete mode 100644 eip-wire-tap/etc/eip-wire-tap.urm.puml delete mode 100644 event-aggregator/etc/event-aggregator.urm.puml delete mode 100644 event-asynchronous/etc/event-asynchronous.urm.puml delete mode 100644 event-driven-architecture/etc/event-driven-architecture.urm.puml delete mode 100644 event-queue/etc/event-queue.urm.puml delete mode 100644 event-sourcing/etc/event-sourcing.urm.puml delete mode 100644 execute-around/etc/execute-around.urm.puml delete mode 100644 extension-objects/etc/extension-objects.urm.puml delete mode 100644 factory-kit/etc/factory-kit.urm.puml delete mode 100644 feature-toggle/etc/feature-toggle.urm.puml delete mode 100644 fluentinterface/etc/fluentinterface.urm.puml delete mode 100644 flux/etc/flux.urm.puml delete mode 100644 front-controller/etc/front-controller.urm.puml delete mode 100644 guarded-suspension/etc/guarded-suspension.urm.puml delete mode 100644 half-sync-half-async/etc/half-sync-half-async.urm.puml delete mode 100644 hexagonal/etc/hexagonal.urm.puml delete mode 100644 intercepting-filter/etc/intercepting-filter.urm.puml delete mode 100644 interpreter/etc/interpreter.urm.puml delete mode 100644 iterator/etc/iterator.urm.puml delete mode 100644 layers/etc/layers.urm.puml delete mode 100644 lazy-loading/etc/lazy-loading.urm.puml delete mode 100644 marker/etc/marker.urm.puml delete mode 100644 mediator/etc/mediator.urm.puml delete mode 100644 memento/etc/memento.urm.puml delete mode 100644 message-channel/etc/message-channel.urm.puml delete mode 100644 model-view-controller/etc/model-view-controller.urm.puml delete mode 100644 model-view-presenter/etc/model-view-presenter.urm.puml delete mode 100644 module/etc/module.urm.puml delete mode 100644 monad/etc/monad.urm.puml delete mode 100644 monostate/etc/monostate.urm.puml delete mode 100644 multiton/etc/multiton.urm.puml delete mode 100644 mute-idiom/etc/mute-idiom.urm.puml delete mode 100644 mutex/etc/mutex.urm.puml delete mode 100644 naked-objects/etc/naked-objects-dom.urm.puml delete mode 100644 naked-objects/etc/naked-objects-fixture.urm.puml delete mode 100644 naked-objects/etc/naked-objects-integtests.urm.puml delete mode 100644 null-object/etc/null-object.urm.puml delete mode 100644 object-mother/etc/object-mother.urm.puml delete mode 100644 object-pool/etc/object-pool.urm.puml delete mode 100644 observer/etc/observer.urm.puml delete mode 100644 page-object/etc/page-object.urm.puml delete mode 100644 partial-response/etc/partial-response.urm.puml delete mode 100644 poison-pill/etc/poison-pill.urm.puml delete mode 100644 private-class-data/etc/private-class-data.urm.puml delete mode 100644 producer-consumer/etc/producer-consumer.urm.puml delete mode 100644 promise/etc/promise.urm.puml delete mode 100644 property/etc/property.urm.puml delete mode 100644 publish-subscribe/etc/publish-subscribe.urm.puml delete mode 100644 queue-load-leveling/etc/queue-load-leveling.urm.puml delete mode 100644 reactor/etc/reactor.urm.puml delete mode 100644 reader-writer-lock/etc/reader-writer-lock.urm.puml delete mode 100644 repository/etc/repository.urm.puml delete mode 100644 resource-acquisition-is-initialization/etc/resource-acquisition-is-initialization.urm.puml delete mode 100644 semaphore/etc/semaphore.urm.puml delete mode 100644 servant/etc/servant.urm.puml delete mode 100644 service-layer/etc/service-layer.urm.puml delete mode 100644 service-locator/etc/service-locator.urm.puml delete mode 100644 specification/etc/specification.urm.puml delete mode 100644 state/etc/state.urm.puml delete mode 100644 step-builder/etc/step-builder.urm.puml delete mode 100644 strategy/etc/strategy.urm.puml delete mode 100644 template-method/etc/template-method.urm.puml delete mode 100644 thread-pool/etc/thread-pool.urm.puml delete mode 100644 throttling/etc/throttling.urm.puml delete mode 100644 tls/etc/tls.urm.puml delete mode 100644 tolerant-reader/etc/tolerant-reader.urm.puml delete mode 100644 twin/etc/twin.urm.puml delete mode 100644 value-object/etc/value-object.urm.puml delete mode 100644 visitor/etc/visitor.urm.puml diff --git a/abstract-document/etc/abstract-document.urm.puml b/abstract-document/etc/abstract-document.urm.puml deleted file mode 100644 index 0c6ffc5ec..000000000 --- a/abstract-document/etc/abstract-document.urm.puml +++ /dev/null @@ -1,59 +0,0 @@ -@startuml -package com.iluwatar.abstractdocument.domain { - class Car { - + Car(properties : Map) - } - interface HasModel { - + PROPERTY : String {static} - + getModel() : Optional - } - interface HasParts { - + PROPERTY : String {static} - + getParts() : Stream - } - interface HasPrice { - + PROPERTY : String {static} - + getPrice() : Optional - } - interface HasType { - + PROPERTY : String {static} - + getType() : Optional - } - class Part { - + Part(properties : Map) - } -} -package com.iluwatar.abstractdocument { - abstract class AbstractDocument { - - properties : Map - # AbstractDocument(properties : Map) - + children(key : String, constructor : Function, T>) : Stream - + get(key : String) : Object - + put(key : String, value : Object) - + toString() : String - } - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - interface Document { - + children(String, Function, T>) : Stream {abstract} - + get(String) : Object {abstract} - + put(String, Object) {abstract} - } -} -AbstractDocument ..|> Document -Car ..|> HasModel -Car ..|> HasPrice -Car ..|> HasParts -Car --|> AbstractDocument -HasModel --|> Document -HasParts --|> Document -HasPrice --|> Document -HasType --|> Document -Part ..|> HasType -Part ..|> HasModel -Part ..|> HasPrice -Part --|> AbstractDocument -@enduml \ No newline at end of file diff --git a/aggregator-microservices/etc/aggregator-service.urm.puml b/aggregator-microservices/etc/aggregator-service.urm.puml deleted file mode 100644 index ebb782f20..000000000 --- a/aggregator-microservices/etc/aggregator-service.urm.puml +++ /dev/null @@ -1,43 +0,0 @@ -@startuml -package com.iluwatar.aggregator.microservices { - class Aggregator { - - informationClient : ProductInformationClient - - inventoryClient : ProductInventoryClient - + Aggregator() - + getProduct() : Product - } - class App { - + App() - + main(args : String[]) {static} - } - class Product { - - productInventories : int - - title : String - + Product() - + getProductInventories() : int - + getTitle() : String - + setProductInventories(productInventories : int) - + setTitle(title : String) - } - interface ProductInformationClient { - + getProductTitle() : String {abstract} - } - class ProductInformationClientImpl { - - LOGGER : Logger {static} - + ProductInformationClientImpl() - + getProductTitle() : String - } - interface ProductInventoryClient { - + getProductInventories() : int {abstract} - } - class ProductInventoryClientImpl { - - LOGGER : Logger {static} - + ProductInventoryClientImpl() - + getProductInventories() : int - } -} -Aggregator --> "-informationClient" ProductInformationClient -Aggregator --> "-inventoryClient" ProductInventoryClient -ProductInformationClientImpl ..|> ProductInformationClient -ProductInventoryClientImpl ..|> ProductInventoryClient -@enduml \ No newline at end of file diff --git a/aggregator-microservices/etc/information-microservice.urm.puml b/aggregator-microservices/etc/information-microservice.urm.puml deleted file mode 100644 index e0a2ccb24..000000000 --- a/aggregator-microservices/etc/information-microservice.urm.puml +++ /dev/null @@ -1,12 +0,0 @@ -@startuml -package com.iluwatar.information.microservice { - class InformationApplication { - + InformationApplication() - + main(args : String[]) {static} - } - class InformationController { - + InformationController() - + getProductTitle() : String - } -} -@enduml \ No newline at end of file diff --git a/aggregator-microservices/etc/inventory-microservice.urm.puml b/aggregator-microservices/etc/inventory-microservice.urm.puml deleted file mode 100644 index 90f327e07..000000000 --- a/aggregator-microservices/etc/inventory-microservice.urm.puml +++ /dev/null @@ -1,12 +0,0 @@ -@startuml -package com.iluwatar.inventory.microservice { - class InventoryApplication { - + InventoryApplication() - + main(args : String[]) {static} - } - class InventoryController { - + InventoryController() - + getProductInventories() : int - } -} -@enduml \ No newline at end of file diff --git a/aggregator-microservices/pom.xml b/aggregator-microservices/pom.xml index aae6b88d5..9364ad999 100644 --- a/aggregator-microservices/pom.xml +++ b/aggregator-microservices/pom.xml @@ -34,27 +34,6 @@ 4.0.0 aggregator-microservices pom - - - - - com.github.markusmo3.urm - urm-maven-plugin - ${urm.version} - - ${project.basedir}/../etc - - com.iluwatar - - - - aggregator-microservices - - - - - - information-microservice aggregator-service diff --git a/api-gateway/etc/api-gateway-service.urm.puml b/api-gateway/etc/api-gateway-service.urm.puml deleted file mode 100644 index 5fabc6a0f..000000000 --- a/api-gateway/etc/api-gateway-service.urm.puml +++ /dev/null @@ -1,48 +0,0 @@ -@startuml -package com.iluwatar.api.gateway { - class ApiGateway { - - imageClient : ImageClient - - priceClient : PriceClient - + ApiGateway() - + getProductDesktop() : DesktopProduct - + getProductMobile() : MobileProduct - } - class App { - + App() - + main(args : String[]) {static} - } - class DesktopProduct { - - imagePath : String - - price : String - + DesktopProduct() - + getImagePath() : String - + getPrice() : String - + setImagePath(imagePath : String) - + setPrice(price : String) - } - interface ImageClient { - + getImagePath() : String {abstract} - } - class ImageClientImpl { - + ImageClientImpl() - + getImagePath() : String - } - class MobileProduct { - - price : String - + MobileProduct() - + getPrice() : String - + setPrice(price : String) - } - interface PriceClient { - + getPrice() : String {abstract} - } - class PriceClientImpl { - + PriceClientImpl() - + getPrice() : String - } -} -ApiGateway --> "-imageClient" ImageClient -ApiGateway --> "-priceClient" PriceClient -ImageClientImpl ..|> ImageClient -PriceClientImpl ..|> PriceClient -@enduml \ No newline at end of file diff --git a/api-gateway/etc/image-microservice.urm.puml b/api-gateway/etc/image-microservice.urm.puml deleted file mode 100644 index 130dac9de..000000000 --- a/api-gateway/etc/image-microservice.urm.puml +++ /dev/null @@ -1,12 +0,0 @@ -@startuml -package com.iluwatar.image.microservice { - class ImageApplication { - + ImageApplication() - + main(args : String[]) {static} - } - class ImageController { - + ImageController() - + getImagePath() : String - } -} -@enduml \ No newline at end of file diff --git a/api-gateway/etc/price-microservice.urm.puml b/api-gateway/etc/price-microservice.urm.puml deleted file mode 100644 index 9893c9c60..000000000 --- a/api-gateway/etc/price-microservice.urm.puml +++ /dev/null @@ -1,12 +0,0 @@ -@startuml -package com.iluwatar.price.microservice { - class PriceApplication { - + PriceApplication() - + main(args : String[]) {static} - } - class PriceController { - + PriceController() - + getPrice() : String - } -} -@enduml \ No newline at end of file diff --git a/api-gateway/pom.xml b/api-gateway/pom.xml index 124b3cf24..4334385dd 100644 --- a/api-gateway/pom.xml +++ b/api-gateway/pom.xml @@ -34,27 +34,6 @@ 4.0.0 api-gateway pom - - - - - com.github.markusmo3.urm - urm-maven-plugin - ${urm.version} - - ${project.basedir}/../etc - - com.iluwatar - - - - api-gateway - - - - - - image-microservice price-microservice diff --git a/async-method-invocation/etc/async-method-invocation.urm.puml b/async-method-invocation/etc/async-method-invocation.urm.puml deleted file mode 100644 index 6f5d0b27f..000000000 --- a/async-method-invocation/etc/async-method-invocation.urm.puml +++ /dev/null @@ -1,51 +0,0 @@ -@startuml -package com.iluwatar.async.method.invocation { - class App { - - LOGGER : Logger {static} - + App() - - callback(name : String) : AsyncCallback {static} - - lazyval(value : T, delayMillis : long) : Callable {static} - - log(msg : String) {static} - + main(args : String[]) {static} - } - interface AsyncCallback { - + onComplete(T, Optional) {abstract} - } - interface AsyncExecutor { - + endProcess(AsyncResult) : T {abstract} - + startProcess(Callable) : AsyncResult {abstract} - + startProcess(Callable, AsyncCallback) : AsyncResult {abstract} - } - interface AsyncResult { - + await() {abstract} - + getValue() : T {abstract} - + isCompleted() : boolean {abstract} - } - class ThreadAsyncExecutor { - - idx : AtomicInteger - + ThreadAsyncExecutor() - + endProcess(asyncResult : AsyncResult) : T - + startProcess(task : Callable) : AsyncResult - + startProcess(task : Callable, callback : AsyncCallback) : AsyncResult - } - -class CompletableResult { - ~ COMPLETED : int {static} - ~ FAILED : int {static} - ~ RUNNING : int {static} - ~ callback : Optional> - ~ exception : Exception - ~ lock : Object - ~ state : int - ~ value : T - ~ CompletableResult(callback : AsyncCallback) - + await() - + getValue() : T - + isCompleted() : boolean - ~ setException(exception : Exception) - ~ setValue(value : T) - } -} -CompletableResult ..+ ThreadAsyncExecutor -ThreadAsyncExecutor ..|> AsyncExecutor -CompletableResult ..|> AsyncResult -@enduml \ No newline at end of file diff --git a/balking/etc/balking.urm.puml b/balking/etc/balking.urm.puml deleted file mode 100644 index b0296b925..000000000 --- a/balking/etc/balking.urm.puml +++ /dev/null @@ -1,24 +0,0 @@ -@startuml -package com.iluwatar.balking { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class WashingMachine { - - LOGGER : Logger {static} - - washingMachineState : WashingMachineState - + WashingMachine() - + endOfWashing() - + getWashingMachineState() : WashingMachineState - + wash() - } - enum WashingMachineState { - + ENABLED {static} - + WASHING {static} - + valueOf(name : String) : WashingMachineState {static} - + values() : WashingMachineState[] {static} - } -} -WashingMachine --> "-washingMachineState" WashingMachineState -@enduml \ No newline at end of file diff --git a/business-delegate/etc/business-delegate.urm.puml b/business-delegate/etc/business-delegate.urm.puml deleted file mode 100644 index 40aa2d6f0..000000000 --- a/business-delegate/etc/business-delegate.urm.puml +++ /dev/null @@ -1,57 +0,0 @@ -@startuml -package com.iluwatar.business.delegate { - class App { - + App() - + main(args : String[]) {static} - } - class BusinessDelegate { - - businessService : BusinessService - - lookupService : BusinessLookup - - serviceType : ServiceType - + BusinessDelegate() - + doTask() - + setLookupService(businessLookup : BusinessLookup) - + setServiceType(serviceType : ServiceType) - } - class BusinessLookup { - - ejbService : EjbService - - jmsService : JmsService - + BusinessLookup() - + getBusinessService(serviceType : ServiceType) : BusinessService - + setEjbService(ejbService : EjbService) - + setJmsService(jmsService : JmsService) - } - interface BusinessService { - + doProcessing() {abstract} - } - class Client { - - businessDelegate : BusinessDelegate - + Client(businessDelegate : BusinessDelegate) - + doTask() - } - class EjbService { - - LOGGER : Logger {static} - + EjbService() - + doProcessing() - } - class JmsService { - - LOGGER : Logger {static} - + JmsService() - + doProcessing() - } - enum ServiceType { - + EJB {static} - + JMS {static} - + valueOf(name : String) : ServiceType {static} - + values() : ServiceType[] {static} - } -} -BusinessLookup --> "-ejbService" EjbService -BusinessDelegate --> "-serviceType" ServiceType -Client --> "-businessDelegate" BusinessDelegate -BusinessDelegate --> "-businessService" BusinessService -BusinessDelegate --> "-lookupService" BusinessLookup -BusinessLookup --> "-jmsService" JmsService -EjbService ..|> BusinessService -JmsService ..|> BusinessService -@enduml \ No newline at end of file diff --git a/caching/etc/caching.urm.puml b/caching/etc/caching.urm.puml deleted file mode 100644 index 6ac3fd4cc..000000000 --- a/caching/etc/caching.urm.puml +++ /dev/null @@ -1,110 +0,0 @@ -@startuml -package com.iluwatar.caching { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - + useCacheAsideStategy() - + useReadAndWriteThroughStrategy() - + useReadThroughAndWriteAroundStrategy() - + useReadThroughAndWriteBehindStrategy() - } - class AppManager { - - cachingPolicy : CachingPolicy {static} - - AppManager() - + find(userId : String) : UserAccount {static} - - findAside(userId : String) : UserAccount {static} - + initCacheCapacity(capacity : int) {static} - + initCachingPolicy(policy : CachingPolicy) {static} - + initDb(useMongoDb : boolean) {static} - + printCacheContent() : String {static} - + save(userAccount : UserAccount) {static} - - saveAside(userAccount : UserAccount) {static} - } - class CacheStore { - - LOGGER : Logger {static} - ~ cache : LruCache {static} - - CacheStore() - + clearCache() {static} - + flushCache() {static} - + get(userId : String) : UserAccount {static} - + initCapacity(capacity : int) {static} - + invalidate(userId : String) {static} - + print() : String {static} - + readThrough(userId : String) : UserAccount {static} - + readThroughWithWriteBackPolicy(userId : String) : UserAccount {static} - + set(userId : String, userAccount : UserAccount) {static} - + writeAround(userAccount : UserAccount) {static} - + writeBehind(userAccount : UserAccount) {static} - + writeThrough(userAccount : UserAccount) {static} - } - enum CachingPolicy { - + AROUND {static} - + ASIDE {static} - + BEHIND {static} - + THROUGH {static} - - policy : String - + getPolicy() : String - + valueOf(name : String) : CachingPolicy {static} - + values() : CachingPolicy[] {static} - } - class DbManager { - - db : MongoDatabase {static} - - mongoClient : MongoClient {static} - - useMongoDB : boolean {static} - - virtualDB : Map {static} - - DbManager() - + connect() {static} - + createVirtualDb() {static} - + readFromDb(userId : String) : UserAccount {static} - + updateDb(userAccount : UserAccount) {static} - + upsertDb(userAccount : UserAccount) {static} - + writeToDb(userAccount : UserAccount) {static} - } - class LruCache { - - LOGGER : Logger {static} - ~ cache : Map - ~ capacity : int - ~ end : Node - ~ head : Node - + LruCache(capacity : int) - + clear() - + contains(userId : String) : boolean - + get(userId : String) : UserAccount - + getCacheDataInListForm() : List - + getLruData() : UserAccount - + invalidate(userId : String) - + isFull() : boolean - + remove(node : Node) - + set(userId : String, userAccount : UserAccount) - + setCapacity(newCapacity : int) - + setHead(node : Node) - } - ~class Node { - ~ next : Node - ~ previous : Node - ~ userAccount : UserAccount - ~ userId : String - + Node(this$0 : String, userId : UserAccount) - } - class UserAccount { - - additionalInfo : String - - userId : String - - userName : String - + UserAccount(userId : String, userName : String, additionalInfo : String) - + getAdditionalInfo() : String - + getUserId() : String - + getUserName() : String - + setAdditionalInfo(additionalInfo : String) - + setUserId(userId : String) - + setUserName(userName : String) - + toString() : String - } -} -LruCache --> "-head" Node -Node --+ LruCache -Node --> "-previous" Node -AppManager --> "-cachingPolicy" CachingPolicy -Node --> "-userAccount" UserAccount -CacheStore --> "-cache" LruCache -@enduml \ No newline at end of file diff --git a/callback/etc/callback.urm.puml b/callback/etc/callback.urm.puml deleted file mode 100644 index 02545e80f..000000000 --- a/callback/etc/callback.urm.puml +++ /dev/null @@ -1,28 +0,0 @@ -@startuml -package com.iluwatar.callback { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - interface Callback { - + call() {abstract} - } - class LambdasApp { - - LOGGER : Logger {static} - + LambdasApp() - + main(args : String[]) {static} - } - class SimpleTask { - - LOGGER : Logger {static} - + SimpleTask() - + execute() - } - abstract class Task { - + Task() - + execute() {abstract} - + executeWith(callback : Callback) - } -} -SimpleTask --|> Task -@enduml \ No newline at end of file diff --git a/command/etc/command.urm.puml b/command/etc/command.urm.puml deleted file mode 100644 index 9bdbce64d..000000000 --- a/command/etc/command.urm.puml +++ /dev/null @@ -1,86 +0,0 @@ -@startuml -package com.iluwatar.command { - class App { - + App() - + main(args : String[]) {static} - } - abstract class Command { - + Command() - + execute(Target) {abstract} - + redo() {abstract} - + toString() : String {abstract} - + undo() {abstract} - } - class Goblin { - + Goblin() - + toString() : String - } - class InvisibilitySpell { - - target : Target - + InvisibilitySpell() - + execute(target : Target) - + redo() - + toString() : String - + undo() - } - class ShrinkSpell { - - oldSize : Size - - target : Target - + ShrinkSpell() - + execute(target : Target) - + redo() - + toString() : String - + undo() - } - enum Size { - + LARGE {static} - + NORMAL {static} - + SMALL {static} - + UNDEFINED {static} - - title : String - + toString() : String - + valueOf(name : String) : Size {static} - + values() : Size[] {static} - } - abstract class Target { - - LOGGER : Logger {static} - - size : Size - - visibility : Visibility - + Target() - + getSize() : Size - + getVisibility() : Visibility - + printStatus() - + setSize(size : Size) - + setVisibility(visibility : Visibility) - + toString() : String {abstract} - } - enum Visibility { - + INVISIBLE {static} - + UNDEFINED {static} - + VISIBLE {static} - - title : String - + toString() : String - + valueOf(name : String) : Visibility {static} - + values() : Visibility[] {static} - } - class Wizard { - - LOGGER : Logger {static} - - redoStack : Deque - - undoStack : Deque - + Wizard() - + castSpell(command : Command, target : Target) - + redoLastSpell() - + toString() : String - + undoLastSpell() - } -} -Target --> "-size" Size -Wizard --> "-undoStack" Command -ShrinkSpell --> "-oldSize" Size -InvisibilitySpell --> "-target" Target -ShrinkSpell --> "-target" Target -Target --> "-visibility" Visibility -Goblin --|> Target -InvisibilitySpell --|> Command -ShrinkSpell --|> Command -@enduml \ No newline at end of file diff --git a/converter/etc/converter.urm.puml b/converter/etc/converter.urm.puml deleted file mode 100644 index 5e0acf191..000000000 --- a/converter/etc/converter.urm.puml +++ /dev/null @@ -1,49 +0,0 @@ -@startuml -package com.iluwatar.converter { - class App { - + App() - + main(args : String[]) {static} - } - class Converter { - - fromDto : Function - - fromEntity : Function - + Converter(fromDto : Function, fromEntity : Function) - + convertFromDto(userDto : T) : U - + convertFromEntity(user : U) : T - + createFromDtos(dtoUsers : Collection) : List - + createFromEntities(users : Collection) : List - } - class User { - - firstName : String - - isActive : boolean - - lastName : String - - userId : String - + User(firstName : String, lastName : String, isActive : boolean, userId : String) - + equals(o : Object) : boolean - + getFirstName() : String - + getLastName() : String - + getUserId() : String - + hashCode() : int - + isActive() : boolean - + toString() : String - } - class UserConverter { - + UserConverter() - } - class UserDto { - - email : String - - firstName : String - - isActive : boolean - - lastName : String - + UserDto(firstName : String, lastName : String, isActive : boolean, email : String) - + equals(o : Object) : boolean - + getEmail() : String - + getFirstName() : String - + getLastName() : String - + hashCode() : int - + isActive() : boolean - + toString() : String - } -} -UserConverter --|> Converter -@enduml \ No newline at end of file diff --git a/cqrs/etc/cqrs.urm.puml b/cqrs/etc/cqrs.urm.puml deleted file mode 100644 index 6dd65dd3a..000000000 --- a/cqrs/etc/cqrs.urm.puml +++ /dev/null @@ -1,124 +0,0 @@ -@startuml -package com.iluwatar.cqrs.util { - class HibernateUtil { - - LOGGER : Logger {static} - - SESSIONFACTORY : SessionFactory {static} - + HibernateUtil() - - buildSessionFactory() : SessionFactory {static} - + getSessionFactory() : SessionFactory {static} - } -} -package com.iluwatar.cqrs.app { - class App { - + App() - + main(args : String[]) {static} - } -} -package com.iluwatar.cqrs.dto { - class Author { - - email : String - - name : String - - username : String - + Author() - + Author(name : String, email : String, username : String) - + equals(obj : Object) : boolean - + getEmail() : String - + getName() : String - + getUsername() : String - + hashCode() : int - + toString() : String - } - class Book { - - price : double - - title : String - + Book() - + Book(title : String, price : double) - + equals(obj : Object) : boolean - + getPrice() : double - + getTitle() : String - + hashCode() : int - + toString() : String - } -} -package com.iluwatar.cqrs.commandes { - class CommandServiceImpl { - - sessionFactory : SessionFactory - + CommandServiceImpl() - + authorCreated(username : String, name : String, email : String) - + authorEmailUpdated(username : String, email : String) - + authorNameUpdated(username : String, name : String) - + authorUsernameUpdated(oldUsername : String, newUsername : String) - + bookAddedToAuthor(title : String, price : double, username : String) - + bookPriceUpdated(title : String, price : double) - + bookTitleUpdated(oldTitle : String, newTitle : String) - - getAuthorByUsername(username : String) : Author - - getBookByTitle(title : String) : Book - } - interface ICommandService { - + authorCreated(String, String, String) {abstract} - + authorEmailUpdated(String, String) {abstract} - + authorNameUpdated(String, String) {abstract} - + authorUsernameUpdated(String, String) {abstract} - + bookAddedToAuthor(String, double, String) {abstract} - + bookPriceUpdated(String, double) {abstract} - + bookTitleUpdated(String, String) {abstract} - } -} -package com.iluwatar.cqrs.queries { - interface IQueryService { - + getAuthorBooks(String) : List {abstract} - + getAuthorBooksCount(String) : BigInteger {abstract} - + getAuthorByUsername(String) : Author {abstract} - + getAuthorsCount() : BigInteger {abstract} - + getBook(String) : Book {abstract} - } - class QueryServiceImpl { - - sessionFactory : SessionFactory - + QueryServiceImpl() - + getAuthorBooks(username : String) : List - + getAuthorBooksCount(username : String) : BigInteger - + getAuthorByUsername(username : String) : Author - + getAuthorsCount() : BigInteger - + getBook(title : String) : Book - } -} -package com.iluwatar.cqrs.domain.model { - class Author { - - email : String - - id : long - - name : String - - username : String - # Author() - + Author(username : String, name : String, email : String) - + getEmail() : String - + getId() : long - + getName() : String - + getUsername() : String - + setEmail(email : String) - + setId(id : long) - + setName(name : String) - + setUsername(username : String) - + toString() : String - } - class Book { - - author : Author - - id : long - - price : double - - title : String - # Book() - + Book(title : String, price : double, author : Author) - + getAuthor() : Author - + getId() : long - + getPrice() : double - + getTitle() : String - + setAuthor(author : Author) - + setId(id : long) - + setPrice(price : double) - + setTitle(title : String) - + toString() : String - } -} -Book --> "-author" Author -CommandServiceImpl ..|> ICommandService -QueryServiceImpl ..|> IQueryService -@enduml \ No newline at end of file diff --git a/dao/etc/dao.urm.puml b/dao/etc/dao.urm.puml deleted file mode 100644 index b0a5b2c54..000000000 --- a/dao/etc/dao.urm.puml +++ /dev/null @@ -1,66 +0,0 @@ -@startuml -package com.iluwatar.dao { - class App { - - DB_URL : String {static} - - log : Logger {static} - + App() - - addCustomers(customerDao : CustomerDao) {static} - - createDataSource() : DataSource {static} - - createSchema(dataSource : DataSource) {static} - - deleteSchema(dataSource : DataSource) {static} - + generateSampleCustomers() : List {static} - + main(args : String[]) {static} - - performOperationsUsing(customerDao : CustomerDao) {static} - } - class Customer { - - firstName : String - - id : int - - lastName : String - + Customer(id : int, firstName : String, lastName : String) - + equals(that : Object) : boolean - + getFirstName() : String - + getId() : int - + getLastName() : String - + hashCode() : int - + setFirstName(firstName : String) - + setId(id : int) - + setLastName(lastName : String) - + toString() : String - } - interface CustomerDao { - + add(Customer) : boolean {abstract} - + delete(Customer) : boolean {abstract} - + getAll() : Stream {abstract} - + getById(int) : Optional {abstract} - + update(Customer) : boolean {abstract} - } - class CustomerSchemaSql { - + CREATE_SCHEMA_SQL : String {static} - + DELETE_SCHEMA_SQL : String {static} - - CustomerSchemaSql() - } - class DbCustomerDao { - - dataSource : DataSource - + DbCustomerDao(dataSource : DataSource) - + add(customer : Customer) : boolean - - createCustomer(resultSet : ResultSet) : Customer - + delete(customer : Customer) : boolean - + getAll() : Stream - + getById(id : int) : Optional - - getConnection() : Connection - - mutedClose(connection : Connection) - + update(customer : Customer) : boolean - } - class InMemoryCustomerDao { - - idToCustomer : Map - + InMemoryCustomerDao() - + add(customer : Customer) : boolean - + delete(customer : Customer) : boolean - + getAll() : Stream - + getById(id : int) : Optional - + update(customer : Customer) : boolean - } -} -DbCustomerDao ..|> CustomerDao -InMemoryCustomerDao ..|> CustomerDao -@enduml \ No newline at end of file diff --git a/data-bus/etc/data-bus.urm.puml b/data-bus/etc/data-bus.urm.puml deleted file mode 100644 index 9ca0ab602..000000000 --- a/data-bus/etc/data-bus.urm.puml +++ /dev/null @@ -1,77 +0,0 @@ -@startuml -package com.iluwatar.databus { - class AbstractDataType { - - dataBus : DataBus - + AbstractDataType() - + getDataBus() : DataBus - + setDataBus(dataBus : DataBus) - } - ~class App { - - log : Logger {static} - ~ App() - + main(args : String[]) {static} - } - class DataBus { - - INSTANCE : DataBus {static} - - listeners : Set - + DataBus() - + getInstance() : DataBus {static} - + publish(event : DataType) - + subscribe(member : Member) - + unsubscribe(member : Member) - } - interface DataType { - + getDataBus() : DataBus {abstract} - + setDataBus(DataBus) {abstract} - } - interface Member { - + accept(DataType) {abstract} - } -} -package com.iluwatar.databus.data { - class MessageData { - - message : String - + MessageData(message : String) - + getMessage() : String - + of(message : String) : DataType {static} - } - class StartingData { - - when : LocalDateTime - + StartingData(when : LocalDateTime) - + getWhen() : LocalDateTime - + of(when : LocalDateTime) : DataType {static} - } - class StoppingData { - - when : LocalDateTime - + StoppingData(when : LocalDateTime) - + getWhen() : LocalDateTime - + of(when : LocalDateTime) : DataType {static} - } -} -package com.iluwatar.databus.members { - class CounterMember { - - log : Logger {static} - - name : String - + CounterMember(name : String) - + accept(data : DataType) - - handleEvent(data : MessageData) - } - class StatusMember { - - id : int - - log : Logger {static} - + StatusMember(id : int) - + accept(data : DataType) - - handleEvent(data : StartingData) - - handleEvent(data : StoppingData) - } -} -AbstractDataType --> "-dataBus" DataBus -DataBus --> "-INSTANCE" DataBus -DataBus --> "-listeners" Member -AbstractDataType ..|> DataType -MessageData --|> AbstractDataType -StartingData --|> AbstractDataType -StoppingData --|> AbstractDataType -CounterMember ..|> Member -StatusMember ..|> Member -@enduml \ No newline at end of file diff --git a/data-mapper/etc/data-mapper.urm.puml b/data-mapper/etc/data-mapper.urm.puml deleted file mode 100644 index 041cbb07b..000000000 --- a/data-mapper/etc/data-mapper.urm.puml +++ /dev/null @@ -1,42 +0,0 @@ -@startuml -package com.iluwatar.datamapper { - class App { - - log : Logger {static} - - App() - + main(args : String[]) {static} - } - class Student { - - grade : char - - name : String - - serialVersionUID : long {static} - - studentId : int - + Student(studentId : int, name : String, grade : char) - + equals(inputObject : Object) : boolean - + getGrade() : char - + getName() : String - + getStudentId() : int - + hashCode() : int - + setGrade(grade : char) - + setName(name : String) - + setStudentId(studentId : int) - + toString() : String - } - interface StudentDataMapper { - + delete(Student) {abstract} - + find(int) : Optional {abstract} - + insert(Student) {abstract} - + update(Student) {abstract} - } - class StudentDataMapperImpl { - - students : List - + StudentDataMapperImpl() - + delete(studentToBeDeleted : Student) - + find(studentId : int) : Optional - + getStudents() : List - + insert(studentToBeInserted : Student) - + update(studentToBeUpdated : Student) - } -} -StudentDataMapperImpl --> "-students" Student -StudentDataMapperImpl ..|> StudentDataMapper -@enduml \ No newline at end of file diff --git a/data-transfer-object/etc/data-transfer-object.urm.puml b/data-transfer-object/etc/data-transfer-object.urm.puml deleted file mode 100644 index 2c21dd21c..000000000 --- a/data-transfer-object/etc/data-transfer-object.urm.puml +++ /dev/null @@ -1,26 +0,0 @@ -@startuml -package com.iluwatar.datatransfer { - class CustomerClientApp { - + CustomerClientApp() - + main(args : String[]) {static} - - printCustomerDetails(allCustomers : List) {static} - } - class CustomerDto { - - firstName : String - - id : String - - lastName : String - + CustomerDto(id : String, firstName : String, lastName : String) - + getFirstName() : String - + getId() : String - + getLastName() : String - } - class CustomerResource { - - customers : List - + CustomerResource(customers : List) - + delete(customerId : String) - + getAllCustomers() : List - + save(customer : CustomerDto) - } -} -CustomerResource --> "-customers" CustomerDto -@enduml \ No newline at end of file diff --git a/delegation/etc/delegation.urm.puml b/delegation/etc/delegation.urm.puml deleted file mode 100644 index 419cf350b..000000000 --- a/delegation/etc/delegation.urm.puml +++ /dev/null @@ -1,39 +0,0 @@ -@startuml -package com.iluwatar.delegation.simple.printers { - class CanonPrinter { - - LOGGER : Logger {static} - + CanonPrinter() - + print(message : String) - } - class EpsonPrinter { - - LOGGER : Logger {static} - + EpsonPrinter() - + print(message : String) - } - class HpPrinter { - - LOGGER : Logger {static} - + HpPrinter() - + print(message : String) - } -} -package com.iluwatar.delegation.simple { - class App { - + MESSAGE_TO_PRINT : String {static} - + App() - + main(args : String[]) {static} - } - interface Printer { - + print(String) {abstract} - } - class PrinterController { - - printer : Printer - + PrinterController(printer : Printer) - + print(message : String) - } -} -PrinterController --> "-printer" Printer -PrinterController ..|> Printer -CanonPrinter ..|> Printer -EpsonPrinter ..|> Printer -HpPrinter ..|> Printer -@enduml \ No newline at end of file diff --git a/dependency-injection/etc/dependency-injection.urm.puml b/dependency-injection/etc/dependency-injection.urm.puml deleted file mode 100644 index 80f15fce3..000000000 --- a/dependency-injection/etc/dependency-injection.urm.puml +++ /dev/null @@ -1,49 +0,0 @@ -@startuml -package com.iluwatar.dependency.injection { - class AdvancedWizard { - - tobacco : Tobacco - + AdvancedWizard(tobacco : Tobacco) - + smoke() - } - class App { - + App() - + main(args : String[]) {static} - } - class GuiceWizard { - - tobacco : Tobacco - + GuiceWizard(tobacco : Tobacco) - + smoke() - } - class OldTobyTobacco { - + OldTobyTobacco() - } - class RivendellTobacco { - + RivendellTobacco() - } - class SecondBreakfastTobacco { - + SecondBreakfastTobacco() - } - class SimpleWizard { - - tobacco : OldTobyTobacco - + SimpleWizard() - + smoke() - } - abstract class Tobacco { - - LOGGER : Logger {static} - + Tobacco() - + smoke(wizard : Wizard) - } - interface Wizard { - + smoke() {abstract} - } -} -SimpleWizard --> "-tobacco" OldTobyTobacco -AdvancedWizard --> "-tobacco" Tobacco -GuiceWizard --> "-tobacco" Tobacco -AdvancedWizard ..|> Wizard -GuiceWizard ..|> Wizard -OldTobyTobacco --|> Tobacco -RivendellTobacco --|> Tobacco -SecondBreakfastTobacco --|> Tobacco -SimpleWizard ..|> Wizard -@enduml \ No newline at end of file diff --git a/double-checked-locking/etc/double-checked-locking.urm.puml b/double-checked-locking/etc/double-checked-locking.urm.puml deleted file mode 100644 index 242519fce..000000000 --- a/double-checked-locking/etc/double-checked-locking.urm.puml +++ /dev/null @@ -1,22 +0,0 @@ -@startuml -package com.iluwatar.doublechecked.locking { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class Inventory { - - LOGGER : Logger {static} - - inventorySize : int - - items : List - - lock : Lock - + Inventory(inventorySize : int) - + addItem(item : Item) : boolean - + getItems() : List - } - class Item { - + Item() - } -} -Inventory --> "-items" Item -@enduml \ No newline at end of file diff --git a/double-dispatch/etc/double-dispatch.urm.puml b/double-dispatch/etc/double-dispatch.urm.puml deleted file mode 100644 index 447cf3081..000000000 --- a/double-dispatch/etc/double-dispatch.urm.puml +++ /dev/null @@ -1,68 +0,0 @@ -@startuml -package com.iluwatar.doubledispatch { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class FlamingAsteroid { - + FlamingAsteroid(left : int, top : int, right : int, bottom : int) - + collision(gameObject : GameObject) - } - abstract class GameObject { - - damaged : boolean - - onFire : boolean - + GameObject(left : int, top : int, right : int, bottom : int) - + collision(GameObject) {abstract} - + collisionResolve(FlamingAsteroid) {abstract} - + collisionResolve(Meteoroid) {abstract} - + collisionResolve(SpaceStationIss) {abstract} - + collisionResolve(SpaceStationMir) {abstract} - + isDamaged() : boolean - + isOnFire() : boolean - + setDamaged(damaged : boolean) - + setOnFire(onFire : boolean) - + toString() : String - } - class Meteoroid { - - LOGGER : Logger {static} - + Meteoroid(left : int, top : int, right : int, bottom : int) - + collision(gameObject : GameObject) - + collisionResolve(asteroid : FlamingAsteroid) - + collisionResolve(iss : SpaceStationIss) - + collisionResolve(meteoroid : Meteoroid) - + collisionResolve(mir : SpaceStationMir) - } - class Rectangle { - - bottom : int - - left : int - - right : int - - top : int - + Rectangle(left : int, top : int, right : int, bottom : int) - + getBottom() : int - + getLeft() : int - + getRight() : int - + getTop() : int - ~ intersectsWith(r : Rectangle) : boolean - + toString() : String - } - class SpaceStationIss { - + SpaceStationIss(left : int, top : int, right : int, bottom : int) - + collision(gameObject : GameObject) - } - class SpaceStationMir { - - LOGGER : Logger {static} - + SpaceStationMir(left : int, top : int, right : int, bottom : int) - + collision(gameObject : GameObject) - + collisionResolve(asteroid : FlamingAsteroid) - + collisionResolve(iss : SpaceStationIss) - + collisionResolve(meteoroid : Meteoroid) - + collisionResolve(mir : SpaceStationMir) - } -} -FlamingAsteroid --|> Meteoroid -GameObject --|> Rectangle -Meteoroid --|> GameObject -SpaceStationIss --|> SpaceStationMir -SpaceStationMir --|> GameObject -@enduml \ No newline at end of file diff --git a/eip-aggregator/etc/eip-aggregator.urm.puml b/eip-aggregator/etc/eip-aggregator.urm.puml deleted file mode 100644 index 4d8661e21..000000000 --- a/eip-aggregator/etc/eip-aggregator.urm.puml +++ /dev/null @@ -1,14 +0,0 @@ -@startuml -package com.iluwatar.eip.aggregator { - class App { - + App() - + main(args : String[]) {static} - } -} -package com.iluwatar.eip.aggregator.routes { - class MessageAggregationStrategy { - + MessageAggregationStrategy() - + aggregate(oldExchange : Exchange, newExchange : Exchange) : Exchange - } -} -@enduml \ No newline at end of file diff --git a/eip-splitter/etc/eip-splitter.urm.puml b/eip-splitter/etc/eip-splitter.urm.puml deleted file mode 100644 index ad063b709..000000000 --- a/eip-splitter/etc/eip-splitter.urm.puml +++ /dev/null @@ -1,8 +0,0 @@ -@startuml -package com.iluwatar.eip.splitter { - class App { - + App() - + main(args : String[]) {static} - } -} -@enduml \ No newline at end of file diff --git a/eip-wire-tap/etc/eip-wire-tap.urm.puml b/eip-wire-tap/etc/eip-wire-tap.urm.puml deleted file mode 100644 index 51ee99723..000000000 --- a/eip-wire-tap/etc/eip-wire-tap.urm.puml +++ /dev/null @@ -1,8 +0,0 @@ -@startuml -package com.iluwatar.eip.wiretap { - class App { - + App() - + main(args : String[]) {static} - } -} -@enduml \ No newline at end of file diff --git a/event-aggregator/etc/event-aggregator.urm.puml b/event-aggregator/etc/event-aggregator.urm.puml deleted file mode 100644 index 341d7d65e..000000000 --- a/event-aggregator/etc/event-aggregator.urm.puml +++ /dev/null @@ -1,74 +0,0 @@ -@startuml -package com.iluwatar.event.aggregator { - class App { - + App() - + main(args : String[]) {static} - } - enum Event { - + STARK_SIGHTED {static} - + TRAITOR_DETECTED {static} - + WARSHIPS_APPROACHING {static} - - description : String - + toString() : String - + valueOf(name : String) : Event {static} - + values() : Event[] {static} - } - abstract class EventEmitter { - - observers : List - + EventEmitter() - + EventEmitter(obs : EventObserver) - # notifyObservers(e : Event) - + registerObserver(obs : EventObserver) - + timePasses(Weekday) {abstract} - } - interface EventObserver { - + onEvent(Event) {abstract} - } - class KingJoffrey { - - LOGGER : Logger {static} - + KingJoffrey() - + onEvent(e : Event) - } - class KingsHand { - + KingsHand() - + KingsHand(obs : EventObserver) - + onEvent(e : Event) - + timePasses(day : Weekday) - } - class LordBaelish { - + LordBaelish() - + LordBaelish(obs : EventObserver) - + timePasses(day : Weekday) - } - class LordVarys { - + LordVarys() - + LordVarys(obs : EventObserver) - + timePasses(day : Weekday) - } - class Scout { - + Scout() - + Scout(obs : EventObserver) - + timePasses(day : Weekday) - } - enum Weekday { - + FRIDAY {static} - + MONDAY {static} - + SATURDAY {static} - + SUNDAY {static} - + THURSDAY {static} - + TUESDAY {static} - + WEDNESDAY {static} - - description : String - + toString() : String - + valueOf(name : String) : Weekday {static} - + values() : Weekday[] {static} - } -} -EventEmitter --> "-observers" EventObserver -KingJoffrey ..|> EventObserver -KingsHand ..|> EventObserver -KingsHand --|> EventEmitter -LordBaelish --|> EventEmitter -LordVarys --|> EventEmitter -Scout --|> EventEmitter -@enduml \ No newline at end of file diff --git a/event-asynchronous/etc/event-asynchronous.urm.puml b/event-asynchronous/etc/event-asynchronous.urm.puml deleted file mode 100644 index 0d683d27d..000000000 --- a/event-asynchronous/etc/event-asynchronous.urm.puml +++ /dev/null @@ -1,66 +0,0 @@ -@startuml -package com.iluwatar.event.asynchronous { - class App { - - LOGGER : Logger {static} - + PROP_FILE_NAME : String {static} - ~ interactiveMode : boolean - + App() - + main(args : String[]) {static} - + quickRun() - + run() - + runInteractiveMode() - + setUp() - } - class Event { - - LOGGER : Logger {static} - - eventId : int - - eventListener : ThreadCompleteListener - - eventTime : int - - isComplete : boolean - - isSynchronous : boolean - - thread : Thread - + Event(eventId : int, eventTime : int, isSynchronous : boolean) - + addListener(listener : ThreadCompleteListener) - - completed() - + isSynchronous() : boolean - + removeListener(listener : ThreadCompleteListener) - + run() - + start() - + status() - + stop() - } - class EventManager { - + MAX_EVENT_TIME : int {static} - + MAX_ID : int {static} - + MAX_RUNNING_EVENTS : int {static} - + MIN_ID : int {static} - - currentlyRunningSyncEvent : int - - eventPool : Map - - rand : Random - + EventManager() - + cancel(eventId : int) - + completedEventHandler(eventId : int) - + create(eventTime : int) : int - + createAsync(eventTime : int) : int - - createEvent(eventTime : int, isSynchronous : boolean) : int - - generateId() : int - + getEventPool() : Map - + numOfCurrentlyRunningSyncEvent() : int - + shutdown() - + start(eventId : int) - + status(eventId : int) - + statusOfAllEvents() - } - interface IEvent { - + start() {abstract} - + status() {abstract} - + stop() {abstract} - } - interface ThreadCompleteListener { - + completedEventHandler(int) {abstract} - } -} -Event --> "-eventListener" ThreadCompleteListener -Event ..|> IEvent -EventManager ..|> ThreadCompleteListener -@enduml \ No newline at end of file diff --git a/event-driven-architecture/etc/event-driven-architecture.urm.puml b/event-driven-architecture/etc/event-driven-architecture.urm.puml deleted file mode 100644 index 2eb79e438..000000000 --- a/event-driven-architecture/etc/event-driven-architecture.urm.puml +++ /dev/null @@ -1,64 +0,0 @@ -@startuml -package com.iluwatar.eda.handler { - class UserCreatedEventHandler { - - LOGGER : Logger {static} - + UserCreatedEventHandler() - + onEvent(event : UserCreatedEvent) - } - class UserUpdatedEventHandler { - - LOGGER : Logger {static} - + UserUpdatedEventHandler() - + onEvent(event : UserUpdatedEvent) - } -} -package com.iluwatar.eda.event { - abstract class AbstractEvent { - + AbstractEvent() - + getType() : Class - } - class UserCreatedEvent { - - user : User - + UserCreatedEvent(user : User) - + getUser() : User - } - class UserUpdatedEvent { - - user : User - + UserUpdatedEvent(user : User) - + getUser() : User - } -} -package com.iluwatar.eda.framework { - interface Event { - + getType() : Class {abstract} - } - class EventDispatcher { - - handlers : Map, Handler> - + EventDispatcher() - + dispatch(event : E extends Event) - + registerHandler(eventType : Class, handler : Handler) - } - interface Handler { - + onEvent(E extends Event) {abstract} - } -} -package com.iluwatar.eda.model { - class User { - - username : String - + User(username : String) - + getUsername() : String - } -} -package com.iluwatar.eda { - class App { - + App() - + main(args : String[]) {static} - } -} -UserUpdatedEvent --> "-user" User -UserCreatedEvent --> "-user" User -AbstractEvent ..|> Event -UserCreatedEvent --|> AbstractEvent -UserUpdatedEvent --|> AbstractEvent -UserCreatedEventHandler ..|> Handler -UserUpdatedEventHandler ..|> Handler -@enduml \ No newline at end of file diff --git a/event-queue/etc/event-queue.urm.puml b/event-queue/etc/event-queue.urm.puml deleted file mode 100644 index e2aabee31..000000000 --- a/event-queue/etc/event-queue.urm.puml +++ /dev/null @@ -1,26 +0,0 @@ -@startuml -package com.iluwatar.event.queue { - class App { - + App() - + getAudioStream(filePath : String) : AudioInputStream {static} - + main(args : String[]) {static} - } - class Audio { - - MAX_PENDING : int {static} - - headIndex : int {static} - - pendingAudio : PlayMessage[] {static} - - tailIndex : int {static} - - updateThread : Thread {static} - + Audio() - + init() {static} - + playSound(stream : AudioInputStream, volume : float) {static} - + stopService() {static} - + update() {static} - } - class PlayMessage { - ~ stream : AudioInputStream - ~ volume : float - + PlayMessage() - } -} -@enduml \ No newline at end of file diff --git a/event-sourcing/etc/event-sourcing.urm.puml b/event-sourcing/etc/event-sourcing.urm.puml deleted file mode 100644 index 207d238e6..000000000 --- a/event-sourcing/etc/event-sourcing.urm.puml +++ /dev/null @@ -1,184 +0,0 @@ -@startuml -package com.iluwatar.event.sourcing.journal { - class JsonFileJournal { - - aFile : File - - events : List - - index : int - + JsonFileJournal() - + readNext() : DomainEvent - + reset() - + write(domainEvent : DomainEvent) - } -} -package com.iluwatar.event.sourcing.processor { - class DomainEventProcessor { - - precessorJournal : ProcessorJournal - + DomainEventProcessor() - + process(domainEvent : DomainEvent) - + recover() - + setPrecessorJournal(precessorJournal : ProcessorJournal) - } -} -package com.iluwatar.event.sourcing.service { - class AccountService { - - eventProcessor : EventProcessor - + AccountService(eventProcessor : EventProcessor) - + createAccount(accountNo : int, owner : String) - } - class MoneyTransactionService { - - eventProcessor : EventProcessor - + MoneyTransactionService(eventProcessor : EventProcessor) - + depositMoney(accountNo : int, money : BigDecimal) - + transferMoney(accountNoFrom : int, accountNoTo : int, money : BigDecimal) - + withdrawalMoney(accountNo : int, money : BigDecimal) - } - class SequenceIdGenerator { - - sequenceId : long {static} - + SequenceIdGenerator() - + nextSequenceId() : long {static} - } -} -package com.iluwatar.event.sourcing.event { - class AccountCreateEvent { - - accountNo : int - - owner : String - + AccountCreateEvent(sequenceId : long, createdTime : long, accountNo : int, owner : String) - + getAccountNo() : int - + getOwner() : String - + process() - } - class MoneyDepositEvent { - - accountNo : int - - money : BigDecimal - + MoneyDepositEvent(sequenceId : long, createdTime : long, accountNo : int, money : BigDecimal) - + getAccountNo() : int - + getMoney() : BigDecimal - + process() - } - class MoneyTransferEvent { - - accountNoFrom : int - - accountNoTo : int - - money : BigDecimal - + MoneyTransferEvent(sequenceId : long, createdTime : long, money : BigDecimal, accountNoFrom : int, accountNoTo : int) - + getAccountNoFrom() : int - + getAccountNoTo() : int - + getMoney() : BigDecimal - + process() - } - class MoneyWithdrawalEvent { - - accountNo : int - - money : BigDecimal - + MoneyWithdrawalEvent(sequenceId : long, createdTime : long, accountNo : int, money : BigDecimal) - + getAccountNo() : int - + getMoney() : BigDecimal - + process() - } -} -package com.iluwatar.event.sourcing.gateway { - class AccountCreateContractSender { - + AccountCreateContractSender() - + sendContractInfo(account : Account) - } - class Gateways { - - accountCreateContractSender : AccountCreateContractSender {static} - - transactionLogger : TransactionLogger {static} - + Gateways() - + getAccountCreateContractSender() : AccountCreateContractSender {static} - + getTransactionLogger() : TransactionLogger {static} - } - class TransactionLogger { - + TransactionLogger() - + log(transaction : Transaction) - } -} -package com.iluwatar.event.sourcing.app { - class App { - + App() - + main(args : String[]) {static} - } -} -package com.iluwatar.event.sourcing.state { - class AccountAggregate { - - accounts : Map {static} - + AccountAggregate() - + getAccount(accountNo : int) : Account {static} - + putAccount(account : Account) {static} - + resetState() {static} - } -} -package com.iluwatar.event.sourcing.domain { - class Account { - - accountNo : int - - money : BigDecimal - - owner : String - - transactions : List - + Account(accountNo : int, owner : String) - + copy() : Account - - depositMoney(money : BigDecimal) : Transaction - + getAccountNo() : int - + getMoney() : BigDecimal - + getOwner() : String - + getTransactions() : List - - handleDeposit(money : BigDecimal, realTime : boolean) - + handleEvent(accountCreateEvent : AccountCreateEvent) - + handleEvent(moneyDepositEvent : MoneyDepositEvent) - + handleEvent(moneyWithdrawalEvent : MoneyWithdrawalEvent) - + handleTransferFromEvent(moneyTransferEvent : MoneyTransferEvent) - + handleTransferToEvent(moneyTransferEvent : MoneyTransferEvent) - - handleWithdrawal(money : BigDecimal, realTime : boolean) - + setMoney(money : BigDecimal) - + setTransactions(transactions : List) - + toString() : String - - withdrawMoney(money : BigDecimal) : Transaction - } - class Transaction { - - accountNo : int - - lastBalance : BigDecimal - - moneyIn : BigDecimal - - moneyOut : BigDecimal - + Transaction(accountNo : int, moneyIn : BigDecimal, moneyOut : BigDecimal, lastBalance : BigDecimal) - + getAccountNo() : int - + getLastBalance() : BigDecimal - + getMoneyIn() : BigDecimal - + getMoneyOut() : BigDecimal - + toString() : String - } -} -package com.iluwatar.event.sourcing.api { - abstract class DomainEvent { - - createdTime : long - - eventClassName : String - - realTime : boolean - - sequenceId : long - + DomainEvent(sequenceId : long, createdTime : long, eventClassName : String) - + getCreatedTime() : long - + getEventClassName() : String - + getSequenceId() : long - + isRealTime() : boolean - + process() {abstract} - + setRealTime(realTime : boolean) - } - interface EventProcessor { - + process(DomainEvent) {abstract} - + recover() {abstract} - + setPrecessorJournal(ProcessorJournal) {abstract} - } - interface ProcessorJournal { - + readNext() : DomainEvent {abstract} - + reset() {abstract} - + write(DomainEvent) {abstract} - } -} -Gateways --> "-accountCreateContractSender" AccountCreateContractSender -DomainEventProcessor --> "-precessorJournal" ProcessorJournal -Account --> "-transactions" Transaction -Gateways --> "-transactionLogger" TransactionLogger -AccountService --> "-eventProcessor" EventProcessor -MoneyTransactionService --> "-eventProcessor" EventProcessor -AccountCreateEvent --|> DomainEvent -MoneyDepositEvent --|> DomainEvent -MoneyTransferEvent --|> DomainEvent -MoneyWithdrawalEvent --|> DomainEvent -JsonFileJournal ..|> ProcessorJournal -DomainEventProcessor ..|> EventProcessor -@enduml \ No newline at end of file diff --git a/execute-around/etc/execute-around.urm.puml b/execute-around/etc/execute-around.urm.puml deleted file mode 100644 index fd01a5fe1..000000000 --- a/execute-around/etc/execute-around.urm.puml +++ /dev/null @@ -1,14 +0,0 @@ -@startuml -package com.iluwatar.execute.around { - class App { - + App() - + main(args : String[]) {static} - } - interface FileWriterAction { - + writeFile(FileWriter) {abstract} - } - class SimpleFileWriter { - + SimpleFileWriter(filename : String, action : FileWriterAction) - } -} -@enduml \ No newline at end of file diff --git a/extension-objects/etc/extension-objects.urm.puml b/extension-objects/etc/extension-objects.urm.puml deleted file mode 100644 index 02af47ddf..000000000 --- a/extension-objects/etc/extension-objects.urm.puml +++ /dev/null @@ -1,2 +0,0 @@ -@startuml -@enduml \ No newline at end of file diff --git a/factory-kit/etc/factory-kit.urm.puml b/factory-kit/etc/factory-kit.urm.puml deleted file mode 100644 index 23cf658f4..000000000 --- a/factory-kit/etc/factory-kit.urm.puml +++ /dev/null @@ -1,46 +0,0 @@ -@startuml -package com.iluwatar.factorykit { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class Axe { - + Axe() - + toString() : String - } - class Bow { - + Bow() - + toString() : String - } - interface Builder { - + add(WeaponType, Supplier) {abstract} - } - class Spear { - + Spear() - + toString() : String - } - class Sword { - + Sword() - + toString() : String - } - interface Weapon { - } - interface WeaponFactory { - + create(WeaponType) : Weapon {abstract} - + factory(consumer : Consumer) : WeaponFactory {static} - } - enum WeaponType { - + AXE {static} - + BOW {static} - + SPEAR {static} - + SWORD {static} - + valueOf(name : String) : WeaponType {static} - + values() : WeaponType[] {static} - } -} -Axe ..|> Weapon -Bow ..|> Weapon -Spear ..|> Weapon -Sword ..|> Weapon -@enduml \ No newline at end of file diff --git a/feature-toggle/etc/feature-toggle.urm.puml b/feature-toggle/etc/feature-toggle.urm.puml deleted file mode 100644 index 0febb2631..000000000 --- a/feature-toggle/etc/feature-toggle.urm.puml +++ /dev/null @@ -1,48 +0,0 @@ -@startuml -package com.iluwatar.featuretoggle.pattern { - interface Service { - + getWelcomeMessage(User) : String {abstract} - + isEnhanced() : boolean {abstract} - } -} -package com.iluwatar.featuretoggle.user { - class User { - - name : String - + User(name : String) - + toString() : String - } - class UserGroup { - - freeGroup : List {static} - - paidGroup : List {static} - + UserGroup() - + addUserToFreeGroup(user : User) {static} - + addUserToPaidGroup(user : User) {static} - + isPaid(user : User) : boolean {static} - } -} -package com.iluwatar.featuretoggle.pattern.tieredversion { - class TieredFeatureToggleVersion { - + TieredFeatureToggleVersion() - + getWelcomeMessage(user : User) : String - + isEnhanced() : boolean - } -} -package com.iluwatar.featuretoggle.pattern.propertiesversion { - class PropertiesFeatureToggleVersion { - - isEnhanced : boolean - + PropertiesFeatureToggleVersion(properties : Properties) - + getWelcomeMessage(user : User) : String - + isEnhanced() : boolean - } -} -package com.iluwatar.featuretoggle { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } -} -UserGroup --> "-freeGroup" User -PropertiesFeatureToggleVersion ..|> Service -TieredFeatureToggleVersion ..|> Service -@enduml \ No newline at end of file diff --git a/fluentinterface/etc/fluentinterface.urm.puml b/fluentinterface/etc/fluentinterface.urm.puml deleted file mode 100644 index ef71a0f4b..000000000 --- a/fluentinterface/etc/fluentinterface.urm.puml +++ /dev/null @@ -1,72 +0,0 @@ -@startuml -package com.iluwatar.fluentinterface.fluentiterable.simple { - class SimpleFluentIterable { - - iterable : Iterable - # SimpleFluentIterable(iterable : Iterable) - + asList() : List - + filter(predicate : Predicate) : FluentIterable - + first() : Optional - + first(count : int) : FluentIterable - + forEach(action : Consumer) - + from(iterable : Iterable) : FluentIterable {static} - + fromCopyOf(iterable : Iterable) : FluentIterable {static} - + getRemainingElementsCount() : int - + iterator() : Iterator - + last() : Optional - + last(count : int) : FluentIterable - + map(function : Function) : FluentIterable - + spliterator() : Spliterator - + toList(iterator : Iterator) : List {static} - } -} -package com.iluwatar.fluentinterface.app { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - - negatives() : Predicate {static} - - positives() : Predicate {static} - - prettyPrint(delimiter : String, prefix : String, iterable : Iterable) {static} - - prettyPrint(prefix : String, iterable : Iterable) {static} - - transformToString() : Function {static} - } -} -package com.iluwatar.fluentinterface.fluentiterable.lazy { - abstract class DecoratingIterator { - # fromIterator : Iterator - - next : E - + DecoratingIterator(fromIterator : Iterator) - + computeNext() : E {abstract} - + hasNext() : boolean - + next() : E - } - class LazyFluentIterable { - - iterable : Iterable - # LazyFluentIterable() - # LazyFluentIterable(iterable : Iterable) - + asList() : List - + filter(predicate : Predicate) : FluentIterable - + first() : Optional - + first(count : int) : FluentIterable - + from(iterable : Iterable) : FluentIterable {static} - + iterator() : Iterator - + last() : Optional - + last(count : int) : FluentIterable - + map(function : Function) : FluentIterable - } -} -package com.iluwatar.fluentinterface.fluentiterable { - interface FluentIterable { - + asList() : List {abstract} - + copyToList(iterable : Iterable) : List {static} - + filter(Predicate) : FluentIterable {abstract} - + first() : Optional {abstract} - + first(int) : FluentIterable {abstract} - + last() : Optional {abstract} - + last(int) : FluentIterable {abstract} - + map(Function) : FluentIterable {abstract} - } -} -LazyFluentIterable ..|> FluentIterable -SimpleFluentIterable ..|> FluentIterable -@enduml \ No newline at end of file diff --git a/flux/etc/flux.urm.puml b/flux/etc/flux.urm.puml deleted file mode 100644 index 11ac26d60..000000000 --- a/flux/etc/flux.urm.puml +++ /dev/null @@ -1,117 +0,0 @@ -@startuml -package com.iluwatar.flux.view { - class ContentView { - - LOGGER : Logger {static} - - content : Content - + ContentView() - + render() - + storeChanged(store : Store) - } - class MenuView { - - LOGGER : Logger {static} - - selected : MenuItem - + MenuView() - + itemClicked(item : MenuItem) - + render() - + storeChanged(store : Store) - } - interface View { - + render() {abstract} - + storeChanged(Store) {abstract} - } -} -package com.iluwatar.flux.action { - abstract class Action { - - type : ActionType - + Action(type : ActionType) - + getType() : ActionType - } - enum ActionType { - + CONTENT_CHANGED {static} - + MENU_ITEM_SELECTED {static} - + valueOf(name : String) : ActionType {static} - + values() : ActionType[] {static} - } - enum Content { - + COMPANY {static} - + PRODUCTS {static} - - title : String - + toString() : String - + valueOf(name : String) : Content {static} - + values() : Content[] {static} - } - class ContentAction { - - content : Content - + ContentAction(content : Content) - + getContent() : Content - } - class MenuAction { - - menuItem : MenuItem - + MenuAction(menuItem : MenuItem) - + getMenuItem() : MenuItem - } - enum MenuItem { - + COMPANY {static} - + HOME {static} - + PRODUCTS {static} - - title : String - + toString() : String - + valueOf(name : String) : MenuItem {static} - + values() : MenuItem[] {static} - } -} -package com.iluwatar.flux.app { - class App { - + App() - + main(args : String[]) {static} - } -} -package com.iluwatar.flux.store { - class ContentStore { - - content : Content - + ContentStore() - + getContent() : Content - + onAction(action : Action) - } - class MenuStore { - - selected : MenuItem - + MenuStore() - + getSelected() : MenuItem - + onAction(action : Action) - } - abstract class Store { - - views : List - + Store() - # notifyChange() - + onAction(Action) {abstract} - + registerView(view : View) - } -} -package com.iluwatar.flux.dispatcher { - class Dispatcher { - - instance : Dispatcher {static} - - stores : List - - Dispatcher() - - dispatchAction(action : Action) - + getInstance() : Dispatcher {static} - + menuItemSelected(menuItem : MenuItem) - + registerStore(store : Store) - } -} -MenuAction --> "-menuItem" MenuItem -Action --> "-type" ActionType -Dispatcher --> "-instance" Dispatcher -MenuStore --> "-selected" MenuItem -ContentView --> "-content" Content -Dispatcher --> "-stores" Store -MenuView --> "-selected" MenuItem -Store --> "-views" View -ContentAction --> "-content" Content -ContentStore --> "-content" Content -ContentAction --|> Action -MenuAction --|> Action -ContentStore --|> Store -MenuStore --|> Store -ContentView ..|> View -MenuView ..|> View -@enduml \ No newline at end of file diff --git a/front-controller/etc/front-controller.urm.puml b/front-controller/etc/front-controller.urm.puml deleted file mode 100644 index 246e7657c..000000000 --- a/front-controller/etc/front-controller.urm.puml +++ /dev/null @@ -1,53 +0,0 @@ -@startuml -package com.iluwatar.front.controller { - class App { - + App() - + main(args : String[]) {static} - } - class ArcherCommand { - + ArcherCommand() - + process() - } - class ArcherView { - - LOGGER : Logger {static} - + ArcherView() - + display() - } - class CatapultCommand { - + CatapultCommand() - + process() - } - class CatapultView { - - LOGGER : Logger {static} - + CatapultView() - + display() - } - interface Command { - + process() {abstract} - } - class ErrorView { - - LOGGER : Logger {static} - + ErrorView() - + display() - } - class FrontController { - + FrontController() - - getCommand(request : String) : Command - - getCommandClass(request : String) : Class {static} - + handleRequest(request : String) - } - class UnknownCommand { - + UnknownCommand() - + process() - } - interface View { - + display() {abstract} - } -} -ArcherCommand ..|> Command -ArcherView ..|> View -CatapultCommand ..|> Command -CatapultView ..|> View -ErrorView ..|> View -UnknownCommand ..|> Command -@enduml \ No newline at end of file diff --git a/guarded-suspension/etc/guarded-suspension.urm.puml b/guarded-suspension/etc/guarded-suspension.urm.puml deleted file mode 100644 index 45a7d3790..000000000 --- a/guarded-suspension/etc/guarded-suspension.urm.puml +++ /dev/null @@ -1,15 +0,0 @@ -@startuml -package com.iluwatar.guarded.suspension { - class App { - + App() - + main(args : String[]) {static} - } - class GuardedQueue { - - LOGGER : Logger {static} - - sourceList : Queue - + GuardedQueue() - + get() : Integer - + put(e : Integer) - } -} -@enduml \ No newline at end of file diff --git a/half-sync-half-async/etc/half-sync-half-async.urm.puml b/half-sync-half-async/etc/half-sync-half-async.urm.puml deleted file mode 100644 index 1dd9c1d83..000000000 --- a/half-sync-half-async/etc/half-sync-half-async.urm.puml +++ /dev/null @@ -1,31 +0,0 @@ -@startuml -package com.iluwatar.halfsynchalfasync { - class App { - - LOGGER : Logger {static} - + App() - - ap(i : long) : long {static} - + main(args : String[]) {static} - } - ~class ArithmeticSumTask { - - n : long - + ArithmeticSumTask(n : long) - + call() : Long - + onError(throwable : Throwable) - + onPostCall(result : Long) - + onPreCall() - } - interface AsyncTask { - + call() : O {abstract} - + onError(Throwable) {abstract} - + onPostCall(O) {abstract} - + onPreCall() {abstract} - } - class AsynchronousService { - - service : ExecutorService - + AsynchronousService(workQueue : BlockingQueue) - + execute(task : AsyncTask) - } -} -ArithmeticSumTask ..+ App -ArithmeticSumTask ..|> AsyncTask -@enduml \ No newline at end of file diff --git a/hexagonal/etc/hexagonal.urm.puml b/hexagonal/etc/hexagonal.urm.puml deleted file mode 100644 index 9ca6e6f9f..000000000 --- a/hexagonal/etc/hexagonal.urm.puml +++ /dev/null @@ -1,279 +0,0 @@ -@startuml -package com.iluwatar.hexagonal.sampledata { - class SampleData { - - PLAYERS : List {static} - + SampleData() - - getRandomPlayerDetails() : PlayerDetails {static} - + submitTickets(lotteryService : LotteryService, numTickets : int) {static} - } -} -package com.iluwatar.hexagonal.service { - class ConsoleLottery { - - LOGGER : Logger {static} - + ConsoleLottery() - - addFundsToLotteryAccount(bank : WireTransfers, scanner : Scanner) {static} - - checkTicket(service : LotteryService, scanner : Scanner) {static} - + main(args : String[]) {static} - - printMainMenu() {static} - - queryLotteryAccountFunds(bank : WireTransfers, scanner : Scanner) {static} - - readString(scanner : Scanner) : String {static} - - submitTicket(service : LotteryService, scanner : Scanner) {static} - } -} -package com.iluwatar.hexagonal.mongo { - class MongoConnectionPropertiesLoader { - - DEFAULT_HOST : String {static} - - DEFAULT_PORT : int {static} - + MongoConnectionPropertiesLoader() - + load() {static} - } -} -package com.iluwatar.hexagonal.domain { - class LotteryAdministration { - - notifications : LotteryEventLog - - repository : LotteryTicketRepository - - wireTransfers : WireTransfers - + LotteryAdministration(repository : LotteryTicketRepository, notifications : LotteryEventLog, wireTransfers : WireTransfers) - + getAllSubmittedTickets() : Map - + performLottery() : LotteryNumbers - + resetLottery() - } - class LotteryConstants { - + PLAYER_MAX_SALDO : int {static} - + PRIZE_AMOUNT : int {static} - + SERVICE_BANK_ACCOUNT : String {static} - + SERVICE_BANK_ACCOUNT_SALDO : int {static} - + TICKET_PRIZE : int {static} - - LotteryConstants() - } - class LotteryNumbers { - + MAX_NUMBER : int {static} - + MIN_NUMBER : int {static} - + NUM_NUMBERS : int {static} - - numbers : Set - - LotteryNumbers() - - LotteryNumbers(givenNumbers : Set) - + create(givenNumbers : Set) : LotteryNumbers {static} - + createRandom() : LotteryNumbers {static} - + equals(obj : Object) : boolean - - generateRandomNumbers() - + getNumbers() : Set - + getNumbersAsString() : String - + hashCode() : int - + toString() : String - } - -class RandomNumberGenerator { - - randomIterator : OfInt - + RandomNumberGenerator(min : int, max : int) - + nextInt() : int - } - class LotteryService { - - notifications : LotteryEventLog - - repository : LotteryTicketRepository - - wireTransfers : WireTransfers - + LotteryService(repository : LotteryTicketRepository, notifications : LotteryEventLog, wireTransfers : WireTransfers) - + checkTicketForPrize(id : LotteryTicketId, winningNumbers : LotteryNumbers) : LotteryTicketCheckResult - + submitTicket(ticket : LotteryTicket) : Optional - } - class LotteryTicket { - - id : LotteryTicketId - - lotteryNumbers : LotteryNumbers - - playerDetails : PlayerDetails - + LotteryTicket(id : LotteryTicketId, details : PlayerDetails, numbers : LotteryNumbers) - + equals(obj : Object) : boolean - + getId() : LotteryTicketId - + getNumbers() : LotteryNumbers - + getPlayerDetails() : PlayerDetails - + hashCode() : int - + setId(id : LotteryTicketId) - + toString() : String - } - class LotteryTicketCheckResult { - - checkResult : CheckResult - - prizeAmount : int - + LotteryTicketCheckResult(result : CheckResult) - + LotteryTicketCheckResult(result : CheckResult, amount : int) - + equals(obj : Object) : boolean - + getPrizeAmount() : int - + getResult() : CheckResult - + hashCode() : int - } - enum CheckResult { - + NO_PRIZE {static} - + TICKET_NOT_SUBMITTED {static} - + WIN_PRIZE {static} - + valueOf(name : String) : CheckResult {static} - + values() : CheckResult[] {static} - } - class LotteryTicketId { - - id : int - - numAllocated : int {static} - + LotteryTicketId() - + LotteryTicketId(id : int) - + equals(o : Object) : boolean - + getId() : int - + hashCode() : int - + toString() : String - } - class LotteryUtils { - - LotteryUtils() - + checkTicketForPrize(repository : LotteryTicketRepository, id : LotteryTicketId, winningNumbers : LotteryNumbers) : LotteryTicketCheckResult {static} - } - class PlayerDetails { - - bankAccountNumber : String - - emailAddress : String - - phoneNumber : String - + PlayerDetails(email : String, bankAccount : String, phone : String) - + equals(obj : Object) : boolean - + getBankAccount() : String - + getEmail() : String - + getPhoneNumber() : String - + hashCode() : int - + toString() : String - } -} -package com.iluwatar.hexagonal.banking { - class InMemoryBank { - - accounts : Map {static} - + InMemoryBank() - + getFunds(bankAccount : String) : int - + setFunds(bankAccount : String, amount : int) - + transferFunds(amount : int, sourceBackAccount : String, destinationBankAccount : String) : boolean - } - class MongoBank { - - DEFAULT_ACCOUNTS_COLLECTION : String {static} - - DEFAULT_DB : String {static} - - accountsCollection : MongoCollection - - database : MongoDatabase - - mongoClient : MongoClient - + MongoBank() - + MongoBank(dbName : String, accountsCollectionName : String) - + connect() - + connect(dbName : String, accountsCollectionName : String) - + getAccountsCollection() : MongoCollection - + getFunds(bankAccount : String) : int - + getMongoClient() : MongoClient - + getMongoDatabase() : MongoDatabase - + setFunds(bankAccount : String, amount : int) - + transferFunds(amount : int, sourceBackAccount : String, destinationBankAccount : String) : boolean - } - interface WireTransfers { - + getFunds(String) : int {abstract} - + setFunds(String, int) {abstract} - + transferFunds(int, String, String) : boolean {abstract} - } -} -package com.iluwatar.hexagonal.database { - class InMemoryTicketRepository { - - tickets : Map {static} - + InMemoryTicketRepository() - + deleteAll() - + findAll() : Map - + findById(id : LotteryTicketId) : Optional - + save(ticket : LotteryTicket) : Optional - } - interface LotteryTicketRepository { - + deleteAll() {abstract} - + findAll() : Map {abstract} - + findById(LotteryTicketId) : Optional {abstract} - + save(LotteryTicket) : Optional {abstract} - } - class MongoTicketRepository { - - DEFAULT_COUNTERS_COLLECTION : String {static} - - DEFAULT_DB : String {static} - - DEFAULT_TICKETS_COLLECTION : String {static} - - countersCollection : MongoCollection - - database : MongoDatabase - - mongoClient : MongoClient - - ticketsCollection : MongoCollection - + MongoTicketRepository() - + MongoTicketRepository(dbName : String, ticketsCollectionName : String, countersCollectionName : String) - + connect() - + connect(dbName : String, ticketsCollectionName : String, countersCollectionName : String) - + deleteAll() - - docToTicket(doc : Document) : LotteryTicket - + findAll() : Map - + findById(id : LotteryTicketId) : Optional - + getCountersCollection() : MongoCollection - + getMongoClient() : MongoClient - + getMongoDatabase() : MongoDatabase - + getNextId() : int - + getTicketsCollection() : MongoCollection - - initCounters() - + save(ticket : LotteryTicket) : Optional - } -} -package com.iluwatar.hexagonal { - class App { - + App() - + main(args : String[]) {static} - } -} -package com.iluwatar.hexagonal.administration { - class ConsoleAdministration { - - LOGGER : Logger {static} - + ConsoleAdministration() - + main(args : String[]) {static} - - printMainMenu() {static} - - readString(scanner : Scanner) : String {static} - } -} -package com.iluwatar.hexagonal.eventlog { - interface LotteryEventLog { - + prizeError(PlayerDetails, int) {abstract} - + ticketDidNotWin(PlayerDetails) {abstract} - + ticketSubmitError(PlayerDetails) {abstract} - + ticketSubmitted(PlayerDetails) {abstract} - + ticketWon(PlayerDetails, int) {abstract} - } - class MongoEventLog { - - DEFAULT_DB : String {static} - - DEFAULT_EVENTS_COLLECTION : String {static} - - database : MongoDatabase - - eventsCollection : MongoCollection - - mongoClient : MongoClient - - stdOutEventLog : StdOutEventLog - + MongoEventLog() - + MongoEventLog(dbName : String, eventsCollectionName : String) - + connect() - + connect(dbName : String, eventsCollectionName : String) - + getEventsCollection() : MongoCollection - + getMongoClient() : MongoClient - + getMongoDatabase() : MongoDatabase - + prizeError(details : PlayerDetails, prizeAmount : int) - + ticketDidNotWin(details : PlayerDetails) - + ticketSubmitError(details : PlayerDetails) - + ticketSubmitted(details : PlayerDetails) - + ticketWon(details : PlayerDetails, prizeAmount : int) - } - class StdOutEventLog { - - LOGGER : Logger {static} - + StdOutEventLog() - + prizeError(details : PlayerDetails, prizeAmount : int) - + ticketDidNotWin(details : PlayerDetails) - + ticketSubmitError(details : PlayerDetails) - + ticketSubmitted(details : PlayerDetails) - + ticketWon(details : PlayerDetails, prizeAmount : int) - } -} -LotteryTicket --> "-playerDetails" PlayerDetails -MongoEventLog --> "-stdOutEventLog" StdOutEventLog -LotteryService --> "-wireTransfers" WireTransfers -LotteryAdministration --> "-notifications" LotteryEventLog -LotteryAdministration --> "-wireTransfers" WireTransfers -LotteryService --> "-notifications" LotteryEventLog -LotteryTicket --> "-id" LotteryTicketId -LotteryAdministration --> "-repository" LotteryTicketRepository -LotteryTicket --> "-lotteryNumbers" LotteryNumbers -SampleData --> "-PLAYERS" PlayerDetails -RandomNumberGenerator ..+ LotteryNumbers -LotteryService --> "-repository" LotteryTicketRepository -CheckResult ..+ LotteryTicketCheckResult -LotteryTicketCheckResult --> "-checkResult" CheckResult -InMemoryBank ..|> WireTransfers -MongoBank ..|> WireTransfers -InMemoryTicketRepository ..|> LotteryTicketRepository -MongoTicketRepository ..|> LotteryTicketRepository -MongoEventLog ..|> LotteryEventLog -StdOutEventLog ..|> LotteryEventLog -@enduml \ No newline at end of file diff --git a/intercepting-filter/etc/intercepting-filter.urm.puml b/intercepting-filter/etc/intercepting-filter.urm.puml deleted file mode 100644 index 74444c2d0..000000000 --- a/intercepting-filter/etc/intercepting-filter.urm.puml +++ /dev/null @@ -1,89 +0,0 @@ -@startuml -left to right direction -package com.iluwatar.intercepting.filter { - abstract class AbstractFilter { - - next : Filter - + AbstractFilter() - + AbstractFilter(next : Filter) - + execute(order : Order) : String - + getLast() : Filter - + getNext() : Filter - + setNext(filter : Filter) - } - class AddressFilter { - + AddressFilter() - + execute(order : Order) : String - } - class App { - + App() - + main(args : String[]) {static} - } - class ContactFilter { - + ContactFilter() - + execute(order : Order) : String - } - class DepositFilter { - + DepositFilter() - + execute(order : Order) : String - } - interface Filter { - + execute(Order) : String {abstract} - + getLast() : Filter {abstract} - + getNext() : Filter {abstract} - + setNext(Filter) {abstract} - } - class FilterChain { - - chain : Filter - + FilterChain() - + addFilter(filter : Filter) - + execute(order : Order) : String - } - class FilterManager { - - filterChain : FilterChain - + FilterManager() - + addFilter(filter : Filter) - + filterRequest(order : Order) : String - } - class NameFilter { - + NameFilter() - + execute(order : Order) : String - } - class Order { - - address : String - - contactNumber : String - - depositNumber : String - - name : String - - order : String - + Order() - + Order(name : String, contactNumber : String, address : String, depositNumber : String, order : String) - + getAddress() : String - + getContactNumber() : String - + getDepositNumber() : String - + getName() : String - + getOrder() : String - + setAddress(address : String) - + setContactNumber(contactNumber : String) - + setDepositNumber(depositNumber : String) - + setName(name : String) - + setOrder(order : String) - } - class OrderFilter { - + OrderFilter() - + execute(order : Order) : String - } - ~class DListener { - ~ DListener() - + actionPerformed(e : ActionEvent) - } -} -AbstractFilter --> "-next" Filter -DListener --+ Target -FilterChain --> "-chain" Filter -FilterManager --> "-filterChain" FilterChain -AbstractFilter ..|> Filter -AddressFilter --|> AbstractFilter -ContactFilter --|> AbstractFilter -DepositFilter --|> AbstractFilter -NameFilter --|> AbstractFilter -OrderFilter --|> AbstractFilter -@enduml diff --git a/interpreter/etc/interpreter.urm.puml b/interpreter/etc/interpreter.urm.puml deleted file mode 100644 index e1286a2a9..000000000 --- a/interpreter/etc/interpreter.urm.puml +++ /dev/null @@ -1,52 +0,0 @@ -@startuml -left to right direction -package com.iluwatar.interpreter { - class App { - - LOGGER : Logger {static} - + App() - + getOperatorInstance(s : String, left : Expression, right : Expression) : Expression {static} - + isOperator(s : String) : boolean {static} - + main(args : String[]) {static} - } - abstract class Expression { - + Expression() - + interpret() : int {abstract} - + toString() : String {abstract} - } - class MinusExpression { - - leftExpression : Expression - - rightExpression : Expression - + MinusExpression(leftExpression : Expression, rightExpression : Expression) - + interpret() : int - + toString() : String - } - class MultiplyExpression { - - leftExpression : Expression - - rightExpression : Expression - + MultiplyExpression(leftExpression : Expression, rightExpression : Expression) - + interpret() : int - + toString() : String - } - class NumberExpression { - - number : int - + NumberExpression(number : int) - + NumberExpression(s : String) - + interpret() : int - + toString() : String - } - class PlusExpression { - - leftExpression : Expression - - rightExpression : Expression - + PlusExpression(leftExpression : Expression, rightExpression : Expression) - + interpret() : int - + toString() : String - } -} -MultiplyExpression --> "-leftExpression" Expression -MinusExpression --> "-leftExpression" Expression -PlusExpression --> "-leftExpression" Expression -MinusExpression --|> Expression -MultiplyExpression --|> Expression -NumberExpression --|> Expression -PlusExpression --|> Expression -@enduml diff --git a/iterator/etc/iterator.urm.puml b/iterator/etc/iterator.urm.puml deleted file mode 100644 index 881b9a6d4..000000000 --- a/iterator/etc/iterator.urm.puml +++ /dev/null @@ -1,49 +0,0 @@ -@startuml -package com.iluwatar.iterator { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class Item { - - name : String - - type : ItemType - + Item(type : ItemType, name : String) - + getType() : ItemType - + setType(type : ItemType) - + toString() : String - } - interface ItemIterator { - + hasNext() : boolean {abstract} - + next() : Item {abstract} - } - enum ItemType { - + ANY {static} - + POTION {static} - + RING {static} - + WEAPON {static} - + valueOf(name : String) : ItemType {static} - + values() : ItemType[] {static} - } - class TreasureChest { - - items : List - + TreasureChest() - + getItems() : List - ~ iterator(itemType : ItemType) : ItemIterator - } - class TreasureChestItemIterator { - - chest : TreasureChest - - idx : int - - type : ItemType - + TreasureChestItemIterator(chest : TreasureChest, type : ItemType) - - findNextIdx() : int - + hasNext() : boolean - + next() : Item - } -} -Item --> "-type" ItemType -TreasureChest --> "-items" Item -TreasureChestItemIterator --> "-type" ItemType -TreasureChestItemIterator --> "-chest" TreasureChest -TreasureChestItemIterator ..|> ItemIterator -@enduml \ No newline at end of file diff --git a/layers/etc/layers.urm.puml b/layers/etc/layers.urm.puml deleted file mode 100644 index e597c7546..000000000 --- a/layers/etc/layers.urm.puml +++ /dev/null @@ -1,126 +0,0 @@ -@startuml -package com.iluwatar.layers { - class App { - - cakeBakingService : CakeBakingService {static} - + App() - - initializeData(cakeBakingService : CakeBakingService) {static} - + main(args : String[]) {static} - } - class Cake { - - id : Long - - layers : Set - - topping : CakeTopping - + Cake() - + addLayer(layer : CakeLayer) - + getId() : Long - + getLayers() : Set - + getTopping() : CakeTopping - + setId(id : Long) - + setLayers(layers : Set) - + setTopping(topping : CakeTopping) - + toString() : String - } - interface CakeBakingService { - + bakeNewCake(CakeInfo) {abstract} - + getAllCakes() : List {abstract} - + getAvailableLayers() : List {abstract} - + getAvailableToppings() : List {abstract} - + saveNewLayer(CakeLayerInfo) {abstract} - + saveNewTopping(CakeToppingInfo) {abstract} - } - class CakeBakingServiceImpl { - - context : AbstractApplicationContext - + CakeBakingServiceImpl() - + bakeNewCake(cakeInfo : CakeInfo) - + getAllCakes() : List - - getAvailableLayerEntities() : List - + getAvailableLayers() : List - - getAvailableToppingEntities() : List - + getAvailableToppings() : List - + saveNewLayer(layerInfo : CakeLayerInfo) - + saveNewTopping(toppingInfo : CakeToppingInfo) - } - interface CakeDao { - } - class CakeInfo { - + cakeLayerInfos : List - + cakeToppingInfo : CakeToppingInfo - + id : Optional - + CakeInfo(cakeToppingInfo : CakeToppingInfo, cakeLayerInfos : List) - + CakeInfo(id : Long, cakeToppingInfo : CakeToppingInfo, cakeLayerInfos : List) - + calculateTotalCalories() : int - + toString() : String - } - class CakeLayer { - - cake : Cake - - calories : int - - id : Long - - name : String - + CakeLayer() - + CakeLayer(name : String, calories : int) - + getCake() : Cake - + getCalories() : int - + getId() : Long - + getName() : String - + setCake(cake : Cake) - + setCalories(calories : int) - + setId(id : Long) - + setName(name : String) - + toString() : String - } - interface CakeLayerDao { - } - class CakeLayerInfo { - + calories : int - + id : Optional - + name : String - + CakeLayerInfo(id : Long, name : String, calories : int) - + CakeLayerInfo(name : String, calories : int) - + toString() : String - } - class CakeTopping { - - cake : Cake - - calories : int - - id : Long - - name : String - + CakeTopping() - + CakeTopping(name : String, calories : int) - + getCake() : Cake - + getCalories() : int - + getId() : Long - + getName() : String - + setCake(cake : Cake) - + setCalories(calories : int) - + setId(id : Long) - + setName(name : String) - + toString() : String - } - interface CakeToppingDao { - } - class CakeToppingInfo { - + calories : int - + id : Optional - + name : String - + CakeToppingInfo(id : Long, name : String, calories : int) - + CakeToppingInfo(name : String, calories : int) - + toString() : String - } - class CakeViewImpl { - - LOGGER : Logger {static} - - cakeBakingService : CakeBakingService - + CakeViewImpl(cakeBakingService : CakeBakingService) - + render() - } - interface View { - + render() {abstract} - } -} -CakeViewImpl --> "-cakeBakingService" CakeBakingService -CakeInfo --> "-cakeToppingInfo" CakeToppingInfo -CakeInfo --> "-cakeLayerInfos" CakeLayerInfo -App --> "-cakeBakingService" CakeBakingService -CakeLayer --> "-cake" Cake -Cake --> "-topping" CakeTopping -CakeBakingServiceImpl ..|> CakeBakingService -CakeViewImpl ..|> View -@enduml \ No newline at end of file diff --git a/lazy-loading/etc/lazy-loading.urm.puml b/lazy-loading/etc/lazy-loading.urm.puml deleted file mode 100644 index aaf49f1df..000000000 --- a/lazy-loading/etc/lazy-loading.urm.puml +++ /dev/null @@ -1,40 +0,0 @@ -@startuml -package com.iluwatar.lazy.loading { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class Heavy { - - LOGGER : Logger {static} - + Heavy() - } - class HolderNaive { - - LOGGER : Logger {static} - - heavy : Heavy - + HolderNaive() - + getHeavy() : Heavy - } - class HolderThreadSafe { - - LOGGER : Logger {static} - - heavy : Heavy - + HolderThreadSafe() - + getHeavy() : Heavy - } - class Java8Holder { - - LOGGER : Logger {static} - - heavy : Supplier - + Java8Holder() - - createAndCacheHeavy() : Heavy - + getHeavy() : Heavy - } - ~class HeavyFactory { - - heavyInstance : Heavy - ~ HeavyFactory() - + get() : Heavy - } -} -HolderThreadSafe --> "-heavy" Heavy -HolderNaive --> "-heavy" Heavy -HeavyFactory --> "-heavyInstance" Heavy -@enduml \ No newline at end of file diff --git a/marker/etc/marker.urm.puml b/marker/etc/marker.urm.puml deleted file mode 100644 index 02af47ddf..000000000 --- a/marker/etc/marker.urm.puml +++ /dev/null @@ -1,2 +0,0 @@ -@startuml -@enduml \ No newline at end of file diff --git a/mediator/etc/mediator.urm.puml b/mediator/etc/mediator.urm.puml deleted file mode 100644 index 04e75d2b8..000000000 --- a/mediator/etc/mediator.urm.puml +++ /dev/null @@ -1,69 +0,0 @@ -@startuml -package com.iluwatar.mediator { - enum Action { - + ENEMY {static} - + GOLD {static} - + HUNT {static} - + NONE {static} - + TALE {static} - - description : String - - title : String - + getDescription() : String - + toString() : String - + valueOf(name : String) : Action {static} - + values() : Action[] {static} - } - class App { - + App() - + main(args : String[]) {static} - } - class Hobbit { - + Hobbit() - + toString() : String - } - class Hunter { - + Hunter() - + toString() : String - } - interface Party { - + act(PartyMember, Action) {abstract} - + addMember(PartyMember) {abstract} - } - class PartyImpl { - - members : List - + PartyImpl() - + act(actor : PartyMember, action : Action) - + addMember(member : PartyMember) - } - interface PartyMember { - + act(Action) {abstract} - + joinedParty(Party) {abstract} - + partyAction(Action) {abstract} - } - abstract class PartyMemberBase { - - LOGGER : Logger {static} - # party : Party - + PartyMemberBase() - + act(action : Action) - + joinedParty(party : Party) - + partyAction(action : Action) - + toString() : String {abstract} - } - class Rogue { - + Rogue() - + toString() : String - } - class Wizard { - + Wizard() - + toString() : String - } -} -PartyImpl --> "-members" PartyMember -PartyMemberBase --> "-party" Party -Hobbit --|> PartyMemberBase -Hunter --|> PartyMemberBase -PartyImpl ..|> Party -PartyMemberBase ..|> PartyMember -Rogue --|> PartyMemberBase -Wizard --|> PartyMemberBase -@enduml \ No newline at end of file diff --git a/memento/etc/memento.urm.puml b/memento/etc/memento.urm.puml deleted file mode 100644 index 319227ad2..000000000 --- a/memento/etc/memento.urm.puml +++ /dev/null @@ -1,49 +0,0 @@ -@startuml -package com.iluwatar.memento { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class Star { - - ageYears : int - - massTons : int - - type : StarType - + Star(startType : StarType, startAge : int, startMass : int) - ~ getMemento() : StarMemento - ~ setMemento(memento : StarMemento) - + timePasses() - + toString() : String - } - -class StarMementoInternal { - - ageYears : int - - massTons : int - - type : StarType - - StarMementoInternal() - + getAgeYears() : int - + getMassTons() : int - + getType() : StarType - + setAgeYears(ageYears : int) - + setMassTons(massTons : int) - + setType(type : StarType) - } - interface StarMemento { - } - enum StarType { - + DEAD {static} - + RED_GIANT {static} - + SUN {static} - + SUPERNOVA {static} - + UNDEFINED {static} - + WHITE_DWARF {static} - - title : String - + toString() : String - + valueOf(name : String) : StarType {static} - + values() : StarType[] {static} - } -} -StarMementoInternal --> "-type" StarType -Star --> "-type" StarType -StarMementoInternal ..+ Star -StarMementoInternal ..|> StarMemento -@enduml \ No newline at end of file diff --git a/message-channel/etc/message-channel.urm.puml b/message-channel/etc/message-channel.urm.puml deleted file mode 100644 index 852f190b4..000000000 --- a/message-channel/etc/message-channel.urm.puml +++ /dev/null @@ -1,9 +0,0 @@ -@startuml -package com.iluwatar.message.channel { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } -} -@enduml \ No newline at end of file diff --git a/model-view-controller/etc/model-view-controller.urm.puml b/model-view-controller/etc/model-view-controller.urm.puml deleted file mode 100644 index 92ec1e949..000000000 --- a/model-view-controller/etc/model-view-controller.urm.puml +++ /dev/null @@ -1,70 +0,0 @@ -@startuml -package com.iluwatar.model.view.controller { - class App { - + App() - + main(args : String[]) {static} - } - enum Fatigue { - + ALERT {static} - + SLEEPING {static} - + TIRED {static} - - title : String - + toString() : String - + valueOf(name : String) : Fatigue {static} - + values() : Fatigue[] {static} - } - class GiantController { - - giant : GiantModel - - view : GiantView - + GiantController(giant : GiantModel, view : GiantView) - + getFatigue() : Fatigue - + getHealth() : Health - + getNourishment() : Nourishment - + setFatigue(fatigue : Fatigue) - + setHealth(health : Health) - + setNourishment(nourishment : Nourishment) - + updateView() - } - class GiantModel { - - fatigue : Fatigue - - health : Health - - nourishment : Nourishment - ~ GiantModel(health : Health, fatigue : Fatigue, nourishment : Nourishment) - + getFatigue() : Fatigue - + getHealth() : Health - + getNourishment() : Nourishment - + setFatigue(fatigue : Fatigue) - + setHealth(health : Health) - + setNourishment(nourishment : Nourishment) - + toString() : String - } - class GiantView { - - LOGGER : Logger {static} - + GiantView() - + displayGiant(giant : GiantModel) - } - enum Health { - + DEAD {static} - + HEALTHY {static} - + WOUNDED {static} - - title : String - + toString() : String - + valueOf(name : String) : Health {static} - + values() : Health[] {static} - } - enum Nourishment { - + HUNGRY {static} - + SATURATED {static} - + STARVING {static} - - title : String - + toString() : String - + valueOf(name : String) : Nourishment {static} - + values() : Nourishment[] {static} - } -} -GiantModel --> "-nourishment" Nourishment -GiantController --> "-giant" GiantModel -GiantModel --> "-fatigue" Fatigue -GiantModel --> "-health" Health -GiantController --> "-view" GiantView -@enduml \ No newline at end of file diff --git a/model-view-presenter/etc/model-view-presenter.urm.puml b/model-view-presenter/etc/model-view-presenter.urm.puml deleted file mode 100644 index 188b3fb4d..000000000 --- a/model-view-presenter/etc/model-view-presenter.urm.puml +++ /dev/null @@ -1,87 +0,0 @@ -@startuml -package com.iluwatar.model.view.presenter { - class App { - + App() - + main(args : String[]) {static} - } - class FileLoader { - - fileName : String - - loaded : boolean - + FileLoader() - + fileExists() : boolean - + getFileName() : String - + isLoaded() : boolean - + loadData() : String - + setFileName(fileName : String) - } - class FileSelectorJFrame { - - area : JTextArea - - cancel : JButton - - contents : JLabel - - fileName : String - - info : JLabel - - input : JTextField - - ok : JButton - - panel : JPanel - - presenter : FileSelectorPresenter - - serialVersionUID : long {static} - + FileSelectorJFrame() - + actionPerformed(e : ActionEvent) - + close() - + displayData(data : String) - + getFileName() : String - + getPresenter() : FileSelectorPresenter - + isOpened() : boolean - + open() - + setFileName(name : String) - + setPresenter(presenter : FileSelectorPresenter) - + showMessage(message : String) - } - class FileSelectorPresenter { - - loader : FileLoader - - view : FileSelectorView - + FileSelectorPresenter(view : FileSelectorView) - + cancelled() - + confirmed() - + fileNameChanged() - + setLoader(loader : FileLoader) - + start() - } - class FileSelectorStub { - - dataDisplayed : boolean - - name : String - - numOfMessageSent : int - - opened : boolean - - presenter : FileSelectorPresenter - + FileSelectorStub() - + close() - + dataDisplayed() : boolean - + displayData(data : String) - + getFileName() : String - + getMessagesSent() : int - + getPresenter() : FileSelectorPresenter - + isOpened() : boolean - + open() - + setFileName(name : String) - + setPresenter(presenter : FileSelectorPresenter) - + showMessage(message : String) - } - interface FileSelectorView { - + close() {abstract} - + displayData(String) {abstract} - + getFileName() : String {abstract} - + getPresenter() : FileSelectorPresenter {abstract} - + isOpened() : boolean {abstract} - + open() {abstract} - + setFileName(String) {abstract} - + setPresenter(FileSelectorPresenter) {abstract} - + showMessage(String) {abstract} - } -} -FileSelectorStub --> "-presenter" FileSelectorPresenter -FileSelectorJFrame --> "-presenter" FileSelectorPresenter -FileSelectorPresenter --> "-loader" FileLoader -FileSelectorPresenter --> "-view" FileSelectorView -FileSelectorJFrame ..|> FileSelectorView -FileSelectorStub ..|> FileSelectorView -@enduml \ No newline at end of file diff --git a/module/etc/module.urm.puml b/module/etc/module.urm.puml deleted file mode 100644 index 233691cf7..000000000 --- a/module/etc/module.urm.puml +++ /dev/null @@ -1,43 +0,0 @@ -@startuml -package com.iluwatar.module { - class App { - + consoleLoggerModule : ConsoleLoggerModule {static} - + fileLoggerModule : FileLoggerModule {static} - - App() - + execute(args : String[]) {static} - + main(args : String[]) {static} - + prepare() {static} - + unprepare() {static} - } - class ConsoleLoggerModule { - - LOGGER : Logger {static} - + error : PrintStream - + output : PrintStream - - singleton : ConsoleLoggerModule {static} - - ConsoleLoggerModule() - + getSingleton() : ConsoleLoggerModule {static} - + prepare() : ConsoleLoggerModule - + printErrorString(value : String) - + printString(value : String) - + unprepare() - } - class FileLoggerModule { - - ERROR_FILE : String {static} - - LOGGER : Logger {static} - - OUTPUT_FILE : String {static} - + error : PrintStream - + output : PrintStream - - singleton : FileLoggerModule {static} - - FileLoggerModule() - + getSingleton() : FileLoggerModule {static} - + prepare() : FileLoggerModule - + printErrorString(value : String) - + printString(value : String) - + unprepare() - } -} -FileLoggerModule --> "-singleton" FileLoggerModule -App --> "-consoleLoggerModule" ConsoleLoggerModule -ConsoleLoggerModule --> "-singleton" ConsoleLoggerModule -App --> "-fileLoggerModule" FileLoggerModule -@enduml \ No newline at end of file diff --git a/monad/etc/monad.urm.puml b/monad/etc/monad.urm.puml deleted file mode 100644 index c9dcc8db6..000000000 --- a/monad/etc/monad.urm.puml +++ /dev/null @@ -1,36 +0,0 @@ -@startuml -package com.iluwatar.monad { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - enum Sex { - + FEMALE {static} - + MALE {static} - + valueOf(name : String) : Sex {static} - + values() : Sex[] {static} - } - class User { - - age : int - - email : String - - name : String - - sex : Sex - + User(name : String, age : int, sex : Sex, email : String) - + getAge() : int - + getEmail() : String - + getName() : String - + getSex() : Sex - } - class Validator { - - exceptions : List - - t : T - - Validator(t : T) - + get() : T - + of(t : T) : Validator {static} - + validate(projection : Function, validation : Predicate, message : String) : Validator - + validate(validation : Predicate, message : String) : Validator - } -} -User --> "-sex" Sex -@enduml \ No newline at end of file diff --git a/monostate/etc/monostate.urm.puml b/monostate/etc/monostate.urm.puml deleted file mode 100644 index b7797d5e4..000000000 --- a/monostate/etc/monostate.urm.puml +++ /dev/null @@ -1,33 +0,0 @@ -@startuml -package com.iluwatar.monostate { - class App { - + App() - + main(args : String[]) {static} - } - class LoadBalancer { - - id : int {static} - - lastServedId : int {static} - - servers : List {static} - + LoadBalancer() - + addServer(server : Server) - + getLastServedId() : int {static} - + getNoOfServers() : int - + serverRequest(request : Request) - } - class Request { - + value : String - + Request(value : String) - } - class Server { - - LOGGER : Logger {static} - + host : String - + id : int - + port : int - + Server(host : String, port : int, id : int) - + getHost() : String - + getPort() : int - + serve(request : Request) - } -} -LoadBalancer --> "-servers" Server -@enduml \ No newline at end of file diff --git a/multiton/etc/multiton.urm.puml b/multiton/etc/multiton.urm.puml deleted file mode 100644 index 63a74b1f1..000000000 --- a/multiton/etc/multiton.urm.puml +++ /dev/null @@ -1,30 +0,0 @@ -@startuml -package com.iluwatar.multiton { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class Nazgul { - - name : NazgulName - - nazguls : Map {static} - - Nazgul(name : NazgulName) - + getInstance(name : NazgulName) : Nazgul {static} - + getName() : NazgulName - } - enum NazgulName { - + ADUNAPHEL {static} - + AKHORAHIL {static} - + DWAR {static} - + HOARMURATH {static} - + JI_INDUR {static} - + KHAMUL {static} - + MURAZOR {static} - + REN {static} - + UVATHA {static} - + valueOf(name : String) : NazgulName {static} - + values() : NazgulName[] {static} - } -} -Nazgul --> "-name" NazgulName -@enduml \ No newline at end of file diff --git a/mute-idiom/etc/mute-idiom.urm.puml b/mute-idiom/etc/mute-idiom.urm.puml deleted file mode 100644 index 32d036bc8..000000000 --- a/mute-idiom/etc/mute-idiom.urm.puml +++ /dev/null @@ -1,24 +0,0 @@ -@startuml -package com.iluwatar.mute { - class App { - - LOGGER : Logger {static} - + App() - - acquireResource() : Resource {static} - - closeResource(resource : Resource) {static} - + main(args : String[]) {static} - - useOfLoggedMute() {static} - - useOfMute() {static} - - utilizeResource(resource : Resource) {static} - } - interface CheckedRunnable { - + run() {abstract} - } - class Mute { - - Mute() - + loggedMute(runnable : CheckedRunnable) {static} - + mute(runnable : CheckedRunnable) {static} - } - interface Resource { - } -} -@enduml \ No newline at end of file diff --git a/mutex/etc/mutex.urm.puml b/mutex/etc/mutex.urm.puml deleted file mode 100644 index 08cf43b90..000000000 --- a/mutex/etc/mutex.urm.puml +++ /dev/null @@ -1,27 +0,0 @@ -@startuml -package com.iluwatar.mutex { - class App { - + App() - + main(args : String[]) {static} - } - class Jar { - - beans : int - - lock : Lock - + Jar(beans : int, lock : Lock) - + takeBean() : boolean - } - interface Lock { - + acquire() {abstract} - + release() {abstract} - } - class Mutex { - - owner : Object - + Mutex() - + acquire() - + getOwner() : Object - + release() - } -} -Jar --> "-lock" Lock -Mutex ..|> Lock -@enduml \ No newline at end of file diff --git a/naked-objects/etc/naked-objects-dom.urm.puml b/naked-objects/etc/naked-objects-dom.urm.puml deleted file mode 100644 index 462364099..000000000 --- a/naked-objects/etc/naked-objects-dom.urm.puml +++ /dev/null @@ -1,39 +0,0 @@ -@startuml -package domainapp.dom.app.homepage { - class HomePageService { - ~ container : DomainObjectContainer - + HomePageService() - + homePage() : HomePageViewModel - } - class HomePageViewModel { - ~ simpleObjects : SimpleObjects - + HomePageViewModel() - + getObjects() : List - + title() : String - } -} -package domainapp.dom.modules.simple { - class SimpleObject { - - container : DomainObjectContainer - - name : String - + SimpleObject() - + compareTo(other : SimpleObject) : int - + default0UpdateName() : String - + getName() : String - + getVersionSequence() : Long - + setName(name : String) - + title() : TranslatableString - + updateName(name : String) : SimpleObject - + validateUpdateName(name : String) : TranslatableString - } - class SimpleObjects { - ~ container : DomainObjectContainer - + SimpleObjects() - + create(name : String) : SimpleObject - + findByName(name : String) : List - + listAll() : List - + title() : TranslatableString - } -} -HomePageViewModel --> "-simpleObjects" SimpleObjects -@enduml \ No newline at end of file diff --git a/naked-objects/etc/naked-objects-fixture.urm.puml b/naked-objects/etc/naked-objects-fixture.urm.puml deleted file mode 100644 index 04b3b1350..000000000 --- a/naked-objects/etc/naked-objects-fixture.urm.puml +++ /dev/null @@ -1,93 +0,0 @@ -@startuml -package domainapp.dom.app.homepage { - class HomePageService { - ~ container : DomainObjectContainer - + HomePageService() - + homePage() : HomePageViewModel - } - class HomePageViewModel { - ~ simpleObjects : SimpleObjects - + HomePageViewModel() - + getObjects() : List - + title() : String - } -} -package domainapp.dom.modules.simple { - class SimpleObject { - - container : DomainObjectContainer - - dnFieldFlags : byte[] {static} - - dnFieldNames : String[] {static} - - dnFieldTypes : Class[] {static} - # dnFlags : byte - - dnInheritedFieldCount : int {static} - - dnPersistableSuperclass : Class {static} - # dnStateManager : StateManager - - name : String - + SimpleObject() - + ___dn$loadClass(className : String) : Class {static} - - __dnFieldFlagsInit() : byte[] {static} - - __dnFieldNamesInit() : String[] {static} - - __dnFieldTypesInit() : Class[] {static} - # __dnGetInheritedFieldCount() : int {static} - - __dnPersistableSuperclassInit() : Class {static} - + compareTo(other : SimpleObject) : int - + default0UpdateName() : String - # dnCopyField(obj : SimpleObject, index : int) - + dnCopyFields(obj : Object, indices : int[]) - + dnCopyKeyFieldsFromObjectId(fc : ObjectIdFieldConsumer, oid : Object) - # dnCopyKeyFieldsFromObjectId(oid : Object) - + dnCopyKeyFieldsToObjectId(fs : ObjectIdFieldSupplier, oid : Object) - + dnCopyKeyFieldsToObjectId(oid : Object) - + dnGetExecutionContext() : ExecutionContextReference - # dnGetManagedFieldCount() : int {static} - + dnGetObjectId() : Object - + dnGetTransactionalObjectId() : Object - + dnGetVersion() : Object - + dnGetname() : String - + dnIsDeleted() : boolean - + dnIsDetached() : boolean - + dnIsDirty() : boolean - + dnIsNew() : boolean - + dnIsPersistent() : boolean - + dnIsTransactional() : boolean - + dnMakeDirty(fieldName : String) - + dnNewInstance(sm : StateManager) : Persistable - + dnNewInstance(sm : StateManager, obj : Object) : Persistable - + dnNewObjectIdInstance() : Object - + dnNewObjectIdInstance(key : Object) : Object - # dnPreSerialize() - + dnProvideField(index : int) - + dnProvideFields(indices : int[]) - + dnReplaceField(index : int) - + dnReplaceFields(indices : int[]) - + dnReplaceFlags() - + dnReplaceStateManager(sm : StateManager) - + dnSetname(name : String) - - dnSuperClone() : Object - + getName() : String - + getVersionSequence() : Long - + setName(val : String) - + title() : TranslatableString - + updateName(name : String) : SimpleObject - + validateUpdateName(name : String) : TranslatableString - } - class SimpleObjects { - ~ container : DomainObjectContainer - + SimpleObjects() - + create(name : String) : SimpleObject - + findByName(name : String) : List - + listAll() : List - + title() : TranslatableString - } -} -package domainapp.fixture { - class DomainAppFixturesProvider { - + DomainAppFixturesProvider() - + getSpecification() : FixtureScriptsSpecification - } -} -Builder ..+ FixtureScriptsSpecification -DropDownPolicy ..+ FixtureScriptsSpecification -MultipleExecutionStrategy ..+ FixtureScripts -HomePageViewModel --> "-simpleObjects" SimpleObjects -@enduml \ No newline at end of file diff --git a/naked-objects/etc/naked-objects-integtests.urm.puml b/naked-objects/etc/naked-objects-integtests.urm.puml deleted file mode 100644 index 04b3b1350..000000000 --- a/naked-objects/etc/naked-objects-integtests.urm.puml +++ /dev/null @@ -1,93 +0,0 @@ -@startuml -package domainapp.dom.app.homepage { - class HomePageService { - ~ container : DomainObjectContainer - + HomePageService() - + homePage() : HomePageViewModel - } - class HomePageViewModel { - ~ simpleObjects : SimpleObjects - + HomePageViewModel() - + getObjects() : List - + title() : String - } -} -package domainapp.dom.modules.simple { - class SimpleObject { - - container : DomainObjectContainer - - dnFieldFlags : byte[] {static} - - dnFieldNames : String[] {static} - - dnFieldTypes : Class[] {static} - # dnFlags : byte - - dnInheritedFieldCount : int {static} - - dnPersistableSuperclass : Class {static} - # dnStateManager : StateManager - - name : String - + SimpleObject() - + ___dn$loadClass(className : String) : Class {static} - - __dnFieldFlagsInit() : byte[] {static} - - __dnFieldNamesInit() : String[] {static} - - __dnFieldTypesInit() : Class[] {static} - # __dnGetInheritedFieldCount() : int {static} - - __dnPersistableSuperclassInit() : Class {static} - + compareTo(other : SimpleObject) : int - + default0UpdateName() : String - # dnCopyField(obj : SimpleObject, index : int) - + dnCopyFields(obj : Object, indices : int[]) - + dnCopyKeyFieldsFromObjectId(fc : ObjectIdFieldConsumer, oid : Object) - # dnCopyKeyFieldsFromObjectId(oid : Object) - + dnCopyKeyFieldsToObjectId(fs : ObjectIdFieldSupplier, oid : Object) - + dnCopyKeyFieldsToObjectId(oid : Object) - + dnGetExecutionContext() : ExecutionContextReference - # dnGetManagedFieldCount() : int {static} - + dnGetObjectId() : Object - + dnGetTransactionalObjectId() : Object - + dnGetVersion() : Object - + dnGetname() : String - + dnIsDeleted() : boolean - + dnIsDetached() : boolean - + dnIsDirty() : boolean - + dnIsNew() : boolean - + dnIsPersistent() : boolean - + dnIsTransactional() : boolean - + dnMakeDirty(fieldName : String) - + dnNewInstance(sm : StateManager) : Persistable - + dnNewInstance(sm : StateManager, obj : Object) : Persistable - + dnNewObjectIdInstance() : Object - + dnNewObjectIdInstance(key : Object) : Object - # dnPreSerialize() - + dnProvideField(index : int) - + dnProvideFields(indices : int[]) - + dnReplaceField(index : int) - + dnReplaceFields(indices : int[]) - + dnReplaceFlags() - + dnReplaceStateManager(sm : StateManager) - + dnSetname(name : String) - - dnSuperClone() : Object - + getName() : String - + getVersionSequence() : Long - + setName(val : String) - + title() : TranslatableString - + updateName(name : String) : SimpleObject - + validateUpdateName(name : String) : TranslatableString - } - class SimpleObjects { - ~ container : DomainObjectContainer - + SimpleObjects() - + create(name : String) : SimpleObject - + findByName(name : String) : List - + listAll() : List - + title() : TranslatableString - } -} -package domainapp.fixture { - class DomainAppFixturesProvider { - + DomainAppFixturesProvider() - + getSpecification() : FixtureScriptsSpecification - } -} -Builder ..+ FixtureScriptsSpecification -DropDownPolicy ..+ FixtureScriptsSpecification -MultipleExecutionStrategy ..+ FixtureScripts -HomePageViewModel --> "-simpleObjects" SimpleObjects -@enduml \ No newline at end of file diff --git a/naked-objects/pom.xml b/naked-objects/pom.xml index f770fe3a0..3d89e5af1 100644 --- a/naked-objects/pom.xml +++ b/naked-objects/pom.xml @@ -317,23 +317,6 @@ org.apache.maven.plugins maven-surefire-report-plugin - - com.github.markusmo3.urm - urm-maven-plugin - ${urm.version} - - ${project.basedir}/../etc - - com.iluwatar - domainapp - - - - naked-objects - naked-objects-webapp - - - diff --git a/null-object/etc/null-object.urm.puml b/null-object/etc/null-object.urm.puml deleted file mode 100644 index a937a2b17..000000000 --- a/null-object/etc/null-object.urm.puml +++ /dev/null @@ -1,41 +0,0 @@ -@startuml -package com.iluwatar.nullobject { - class App { - + App() - + main(args : String[]) {static} - } - interface Node { - + getLeft() : Node {abstract} - + getName() : String {abstract} - + getRight() : Node {abstract} - + getTreeSize() : int {abstract} - + walk() {abstract} - } - class NodeImpl { - - LOGGER : Logger {static} - - left : Node - - name : String - - right : Node - + NodeImpl(name : String, left : Node, right : Node) - + getLeft() : Node - + getName() : String - + getRight() : Node - + getTreeSize() : int - + walk() - } - class NullNode { - - instance : NullNode {static} - - NullNode() - + getInstance() : NullNode {static} - + getLeft() : Node - + getName() : String - + getRight() : Node - + getTreeSize() : int - + walk() - } -} -NullNode --> "-instance" NullNode -NodeImpl --> "-left" Node -NodeImpl ..|> Node -NullNode ..|> Node -@enduml \ No newline at end of file diff --git a/object-mother/etc/object-mother.urm.puml b/object-mother/etc/object-mother.urm.puml deleted file mode 100644 index 1bb52f2ed..000000000 --- a/object-mother/etc/object-mother.urm.puml +++ /dev/null @@ -1,45 +0,0 @@ -@startuml -package com.iluwatar.objectmother { - class King { - ~ isDrunk : boolean - ~ isHappy : boolean - + King() - + flirt(queen : Queen) - + isHappy() : boolean - + makeDrunk() - + makeHappy() - + makeSober() - + makeUnhappy() - } - class Queen { - - isDrunk : boolean - - isFlirty : boolean - - isHappy : boolean - + Queen() - + getFlirted(king : King) : boolean - + isFlirty() : boolean - + makeDrunk() - + makeHappy() - + makeSober() - + makeUnhappy() - + setFlirtiness(flirtiness : boolean) - } - interface Royalty { - + makeDrunk() {abstract} - + makeHappy() {abstract} - + makeSober() {abstract} - + makeUnhappy() {abstract} - } - class RoyaltyObjectMother { - + RoyaltyObjectMother() - + createDrunkKing() : King {static} - + createFlirtyQueen() : Queen {static} - + createHappyDrunkKing() : King {static} - + createHappyKing() : King {static} - + createNotFlirtyQueen() : Queen {static} - + createSoberUnhappyKing() : King {static} - } -} -King ..|> Royalty -Queen ..|> Royalty -@enduml \ No newline at end of file diff --git a/object-pool/etc/object-pool.urm.puml b/object-pool/etc/object-pool.urm.puml deleted file mode 100644 index ca74f8cec..000000000 --- a/object-pool/etc/object-pool.urm.puml +++ /dev/null @@ -1,30 +0,0 @@ -@startuml -package com.iluwatar.object.pool { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - abstract class ObjectPool { - - available : Set - - inUse : Set - + ObjectPool() - + checkIn(instance : T) - + checkOut() : T - # create() : T {abstract} - + toString() : String - } - class Oliphaunt { - - counter : int {static} - - id : int - + Oliphaunt() - + getId() : int - + toString() : String - } - class OliphauntPool { - + OliphauntPool() - # create() : Oliphaunt - } -} -OliphauntPool --|> ObjectPool -@enduml \ No newline at end of file diff --git a/observer/etc/observer.urm.puml b/observer/etc/observer.urm.puml deleted file mode 100644 index 5d046d880..000000000 --- a/observer/etc/observer.urm.puml +++ /dev/null @@ -1,81 +0,0 @@ -@startuml -left to right direction -package com.iluwatar.observer { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class Hobbits { - - LOGGER : Logger {static} - + Hobbits() - + update(currentWeather : WeatherType) - } - class Orcs { - - LOGGER : Logger {static} - + Orcs() - + update(currentWeather : WeatherType) - } - class Weather { - - LOGGER : Logger {static} - - currentWeather : WeatherType - - observers : List - + Weather() - + addObserver(obs : WeatherObserver) - - notifyObservers() - + removeObserver(obs : WeatherObserver) - + timePasses() - } - interface WeatherObserver { - + update(WeatherType) {abstract} - } - enum WeatherType { - + COLD {static} - + RAINY {static} - + SUNNY {static} - + WINDY {static} - + toString() : String - + valueOf(name : String) : WeatherType {static} - + values() : WeatherType[] {static} - } -} -package com.iluwatar.observer.generic { - class GHobbits { - - LOGGER : Logger {static} - + GHobbits() - + update(weather : GWeather, weatherType : WeatherType) - } - class GOrcs { - - LOGGER : Logger {static} - + GOrcs() - + update(weather : GWeather, weatherType : WeatherType) - } - class GWeather { - - LOGGER : Logger {static} - - currentWeather : WeatherType - + GWeather() - + timePasses() - } - abstract class Observable, A> { - # observers : List> - + Observable, A>() - + addObserver(observer : O extends Observer) - + notifyObservers(argument : A) - + removeObserver(observer : O extends Observer) - } - interface Observer, O extends Observer, A> { - + update(S extends Observable, A) {abstract} - } - interface Race { - } -} -Weather --> "-currentWeather" WeatherType -GWeather --> "-currentWeather" WeatherType -Weather --> "-observers" WeatherObserver -Hobbits ..|> WeatherObserver -Orcs ..|> WeatherObserver -GHobbits ..|> Race -GOrcs ..|> Race -GWeather --|> Observable -Race --|> Observer -@enduml diff --git a/page-object/etc/page-object.urm.puml b/page-object/etc/page-object.urm.puml deleted file mode 100644 index 735cf2889..000000000 --- a/page-object/etc/page-object.urm.puml +++ /dev/null @@ -1,8 +0,0 @@ -@startuml -package com.iluwatar.pageobject { - class App { - - App() - + main(args : String[]) {static} - } -} -@enduml \ No newline at end of file diff --git a/partial-response/etc/partial-response.urm.puml b/partial-response/etc/partial-response.urm.puml deleted file mode 100644 index 69efd0454..000000000 --- a/partial-response/etc/partial-response.urm.puml +++ /dev/null @@ -1,31 +0,0 @@ -@startuml -package com.iluwatar.partialresponse { - class FieldJsonMapper { - + FieldJsonMapper() - - getString(video : Video, declaredField : Field) : String - + toJson(video : Video, fields : String[]) : String - } - class Video { - - description : String - - director : String - - id : Integer - - language : String - - length : Integer - - title : String - + Video(id : Integer, title : String, length : Integer, description : String, director : String, language : String) - + toString() : String - } - class VideoClientApp { - - LOGGER : Logger {static} - + VideoClientApp() - + main(args : String[]) {static} - } - class VideoResource { - - fieldJsonMapper : FieldJsonMapper - - videos : Map - + VideoResource(fieldJsonMapper : FieldJsonMapper, videos : Map) - + getDetails(id : Integer, fields : String[]) : String - } -} -VideoResource --> "-fieldJsonMapper" FieldJsonMapper -@enduml \ No newline at end of file diff --git a/poison-pill/etc/poison-pill.urm.puml b/poison-pill/etc/poison-pill.urm.puml deleted file mode 100644 index 5c2b9fa2b..000000000 --- a/poison-pill/etc/poison-pill.urm.puml +++ /dev/null @@ -1,71 +0,0 @@ -@startuml -package com.iluwatar.poison.pill { - class App { - + App() - + main(args : String[]) {static} - } - class Consumer { - - LOGGER : Logger {static} - - name : String - - queue : MqSubscribePoint - + Consumer(name : String, queue : MqSubscribePoint) - + consume() - } - interface Message { - + POISON_PILL : Message {static} - + addHeader(Headers, String) {abstract} - + getBody() : String {abstract} - + getHeader(Headers) : String {abstract} - + getHeaders() : Map {abstract} - + setBody(String) {abstract} - } - enum Headers { - + DATE {static} - + SENDER {static} - + valueOf(name : String) : Headers {static} - + values() : Headers[] {static} - } - interface MessageQueue { - } - interface MqPublishPoint { - + put(Message) {abstract} - } - interface MqSubscribePoint { - + take() : Message {abstract} - } - class Producer { - - LOGGER : Logger {static} - - isStopped : boolean - - name : String - - queue : MqPublishPoint - + Producer(name : String, queue : MqPublishPoint) - + send(body : String) - + stop() - } - class SimpleMessage { - - body : String - - headers : Map - + SimpleMessage() - + addHeader(header : Headers, value : String) - + getBody() : String - + getHeader(header : Headers) : String - + getHeaders() : Map - + setBody(body : String) - } - class SimpleMessageQueue { - - queue : BlockingQueue - + SimpleMessageQueue(bound : int) - + put(msg : Message) - + take() : Message - } -} -SimpleMessageQueue --> "-queue" Message -Consumer --> "-queue" MqSubscribePoint -Headers ..+ Message -Producer --> "-queue" MqPublishPoint -Message --> "-POISON_PILL" Message -MessageQueue --|> MqPublishPoint -MessageQueue --|> MqSubscribePoint -SimpleMessage ..|> Message -SimpleMessageQueue ..|> MessageQueue -@enduml \ No newline at end of file diff --git a/pom.xml b/pom.xml index 2d84d5064..4b1e47aec 100644 --- a/pom.xml +++ b/pom.xml @@ -42,7 +42,6 @@ 4.12.1 4.5.2 2.22 - 1.4.4 4.0 3.3.0 1.7.21 @@ -312,25 +311,6 @@ - - - - com.github.markusmo3.urm - - - urm-maven-plugin - - - [1.4.1,) - - - map - - - - - - @@ -445,43 +425,6 @@ - - - com.github.markusmo3.urm - urm-maven-plugin - ${urm.version} - - - process-classes - - map - - - - - ${project.basedir}/etc - - com.iluwatar - - - - java-design-patterns - singleton - factory-method - abstract-factory - builder - prototype - adapter - bridge - composite - decorator - facade - flyweight - proxy - chain - - - diff --git a/private-class-data/etc/private-class-data.urm.puml b/private-class-data/etc/private-class-data.urm.puml deleted file mode 100644 index 990b53342..000000000 --- a/private-class-data/etc/private-class-data.urm.puml +++ /dev/null @@ -1,36 +0,0 @@ -@startuml -package com.iluwatar.privateclassdata { - class App { - + App() - + main(args : String[]) {static} - } - class ImmutableStew { - - LOGGER : Logger {static} - - data : StewData - + ImmutableStew(numPotatoes : int, numCarrots : int, numMeat : int, numPeppers : int) - + mix() - } - class Stew { - - LOGGER : Logger {static} - - numCarrots : int - - numMeat : int - - numPeppers : int - - numPotatoes : int - + Stew(numPotatoes : int, numCarrots : int, numMeat : int, numPeppers : int) - + mix() - + taste() - } - class StewData { - - numCarrots : int - - numMeat : int - - numPeppers : int - - numPotatoes : int - + StewData(numPotatoes : int, numCarrots : int, numMeat : int, numPeppers : int) - + getNumCarrots() : int - + getNumMeat() : int - + getNumPeppers() : int - + getNumPotatoes() : int - } -} -ImmutableStew --> "-data" StewData -@enduml \ No newline at end of file diff --git a/producer-consumer/etc/producer-consumer.urm.puml b/producer-consumer/etc/producer-consumer.urm.puml deleted file mode 100644 index 05539a55e..000000000 --- a/producer-consumer/etc/producer-consumer.urm.puml +++ /dev/null @@ -1,39 +0,0 @@ -@startuml -package com.iluwatar.producer.consumer { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class Consumer { - - LOGGER : Logger {static} - - name : String - - queue : ItemQueue - + Consumer(name : String, queue : ItemQueue) - + consume() - } - class Item { - - id : int - - producer : String - + Item(producer : String, id : int) - + getId() : int - + getProducer() : String - } - class ItemQueue { - - queue : BlockingQueue - + ItemQueue() - + put(item : Item) - + take() : Item - } - class Producer { - - itemId : int - - name : String - - queue : ItemQueue - + Producer(name : String, queue : ItemQueue) - + produce() - } -} -Consumer --> "-queue" ItemQueue -Producer --> "-queue" ItemQueue -ItemQueue --> "-queue" Item -@enduml \ No newline at end of file diff --git a/promise/etc/promise.urm.puml b/promise/etc/promise.urm.puml deleted file mode 100644 index 8aabc1d2a..000000000 --- a/promise/etc/promise.urm.puml +++ /dev/null @@ -1,79 +0,0 @@ -@startuml -left to right direction -package com.iluwatar.promise { - class App { - - DEFAULT_URL : String {static} - - LOGGER : Logger {static} - - executor : ExecutorService - - stopLatch : CountDownLatch - - App() - - calculateLineCount() - - calculateLowestFrequencyChar() - - characterFrequency() : Promise> - - countLines() : Promise - - download(urlString : String) : Promise - - lowestFrequencyChar() : Promise - + main(args : String[]) {static} - - promiseUsage() - - stop() - - taskCompleted() - } - class Promise { - - exceptionHandler : Consumer - - fulfillmentAction : Runnable - + Promise() - + fulfill(value : T) - + fulfillExceptionally(exception : Exception) - + fulfillInAsync(task : Callable, executor : Executor) : Promise - - handleException(exception : Exception) - + onError(exceptionHandler : Consumer) : Promise - - postFulfillment() - + thenAccept(action : Consumer) : Promise - + thenApply(func : Function) : Promise - } - -class ConsumeAction { - - action : Consumer - - dest : Promise - - src : Promise - - ConsumeAction(src : Promise, dest : Promise, action : Consumer) - + run() - } - -class TransformAction { - - dest : Promise - - func : Function - - src : Promise - - TransformAction(src : Promise, dest : Promise, func : Function) - + run() - } - ~class PromiseSupport { - - COMPLETED : int {static} - - FAILED : int {static} - - RUNNING : int {static} - - exception : Exception - - lock : Object - - state : int - - value : T - ~ PromiseSupport() - + cancel(mayInterruptIfRunning : boolean) : boolean - ~ fulfill(value : T) - ~ fulfillExceptionally(exception : Exception) - + get() : T - + get(timeout : long, unit : TimeUnit) : T - + isCancelled() : boolean - + isDone() : boolean - } - class Utility { - - LOGGER : Logger {static} - + Utility() - + characterFrequency(fileLocation : String) : Map {static} - + countLines(fileLocation : String) : Integer {static} - + downloadFile(urlString : String) : String {static} - + lowestFrequencyChar(charFrequency : Map) : Character {static} - } -} -TransformAction --+ Promise -TransformAction --> "-src" Promise -ConsumeAction --+ Promise -ConsumeAction --> "-src" Promise -Promise --|> PromiseSupport -@enduml diff --git a/property/etc/property.urm.puml b/property/etc/property.urm.puml deleted file mode 100644 index f281cd873..000000000 --- a/property/etc/property.urm.puml +++ /dev/null @@ -1,54 +0,0 @@ -@startuml -package com.iluwatar.property { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class Character { - - name : String - - properties : Map - - prototype : Prototype - - type : Type - + Character() - + Character(name : String, prototype : Character) - + Character(type : Type, prototype : Prototype) - + get(stat : Stats) : Integer - + has(stat : Stats) : boolean - + name() : String - + remove(stat : Stats) - + set(stat : Stats, val : Integer) - + toString() : String - + type() : Type - } - enum Type { - + MAGE {static} - + ROGUE {static} - + WARRIOR {static} - + valueOf(name : String) : Type {static} - + values() : Type[] {static} - } - interface Prototype { - + get(Stats) : Integer {abstract} - + has(Stats) : boolean {abstract} - + remove(Stats) {abstract} - + set(Stats, Integer) {abstract} - } - enum Stats { - + AGILITY {static} - + ARMOR {static} - + ATTACK_POWER {static} - + ENERGY {static} - + INTELLECT {static} - + RAGE {static} - + SPIRIT {static} - + STRENGTH {static} - + valueOf(name : String) : Stats {static} - + values() : Stats[] {static} - } -} -Character --> "-prototype" Prototype -Type ..+ Character -Character --> "-type" Type -Character ..|> Prototype -@enduml \ No newline at end of file diff --git a/publish-subscribe/etc/publish-subscribe.urm.puml b/publish-subscribe/etc/publish-subscribe.urm.puml deleted file mode 100644 index 2e511c92d..000000000 --- a/publish-subscribe/etc/publish-subscribe.urm.puml +++ /dev/null @@ -1,9 +0,0 @@ -@startuml -package com.iluwatar.publish.subscribe { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } -} -@enduml \ No newline at end of file diff --git a/queue-load-leveling/etc/queue-load-leveling.urm.puml b/queue-load-leveling/etc/queue-load-leveling.urm.puml deleted file mode 100644 index ca90842d9..000000000 --- a/queue-load-leveling/etc/queue-load-leveling.urm.puml +++ /dev/null @@ -1,44 +0,0 @@ -@startuml -package com.iluwatar.queue.load.leveling { - class App { - - LOGGER : Logger {static} - - SHUTDOWN_TIME : int {static} - + App() - + main(args : String[]) {static} - } - class Message { - - msg : String - + Message(msg : String) - + getMsg() : String - + toString() : String - } - class MessageQueue { - - LOGGER : Logger {static} - - blkQueue : BlockingQueue - + MessageQueue() - + retrieveMsg() : Message - + submitMsg(msg : Message) - } - class ServiceExecutor { - - LOGGER : Logger {static} - - msgQueue : MessageQueue - + ServiceExecutor(msgQueue : MessageQueue) - + run() - } - interface Task { - + submit(Message) {abstract} - } - class TaskGenerator { - - LOGGER : Logger {static} - - msgCount : int - - msgQueue : MessageQueue - + TaskGenerator(msgQueue : MessageQueue, msgCount : int) - + run() - + submit(msg : Message) - } -} -MessageQueue --> "-blkQueue" Message -ServiceExecutor --> "-msgQueue" MessageQueue -TaskGenerator --> "-msgQueue" MessageQueue -TaskGenerator ..|> Task -@enduml \ No newline at end of file diff --git a/reactor/etc/reactor.urm.puml b/reactor/etc/reactor.urm.puml deleted file mode 100644 index 1ce92cab2..000000000 --- a/reactor/etc/reactor.urm.puml +++ /dev/null @@ -1,156 +0,0 @@ -@startuml -left to right direction -package com.iluwatar.reactor.framework { - abstract class AbstractNioChannel { - - channel : SelectableChannel - - channelToPendingWrites : Map> - - handler : ChannelHandler - - reactor : NioReactor - + AbstractNioChannel(handler : ChannelHandler, channel : SelectableChannel) - + bind() {abstract} - # doWrite(Object, SelectionKey) {abstract} - ~ flush(key : SelectionKey) - + getHandler() : ChannelHandler - + getInterestedOps() : int {abstract} - + getJavaChannel() : SelectableChannel - + read(SelectionKey) : Object {abstract} - ~ setReactor(reactor : NioReactor) - + write(data : Object, key : SelectionKey) - } - interface ChannelHandler { - + handleChannelRead(AbstractNioChannel, Object, SelectionKey) {abstract} - } - interface Dispatcher { - + onChannelReadEvent(AbstractNioChannel, Object, SelectionKey) {abstract} - + stop() {abstract} - } - class NioDatagramChannel { - - LOGGER : Logger {static} - - port : int - + NioDatagramChannel(port : int, handler : ChannelHandler) - + bind() - # doWrite(pendingWrite : Object, key : SelectionKey) - + getInterestedOps() : int - + getJavaChannel() : DatagramChannel - + read(key : SelectionKey) : DatagramPacket - + write(data : Object, key : SelectionKey) - } - class DatagramPacket { - - data : ByteBuffer - - receiver : SocketAddress - - sender : SocketAddress - + DatagramPacket(data : ByteBuffer) - + getData() : ByteBuffer - + getReceiver() : SocketAddress - + getSender() : SocketAddress - + setReceiver(receiver : SocketAddress) - + setSender(sender : SocketAddress) - } - class NioReactor { - - LOGGER : Logger {static} - - dispatcher : Dispatcher - - pendingCommands : Queue - - reactorMain : ExecutorService - - selector : Selector - + NioReactor(dispatcher : Dispatcher) - + changeOps(key : SelectionKey, interestedOps : int) - - dispatchReadEvent(key : SelectionKey, readObject : Object) - - eventLoop() - - onChannelAcceptable(key : SelectionKey) - - onChannelReadable(key : SelectionKey) - - onChannelWritable(key : SelectionKey) {static} - - processKey(key : SelectionKey) - - processPendingCommands() - + registerChannel(channel : AbstractNioChannel) : NioReactor - + start() - + stop() - } - ~class ChangeKeyOpsCommand { - - interestedOps : int - - key : SelectionKey - + ChangeKeyOpsCommand(this$0 : SelectionKey, key : int) - + run() - + toString() : String - } - class NioServerSocketChannel { - - LOGGER : Logger {static} - - port : int - + NioServerSocketChannel(port : int, handler : ChannelHandler) - + bind() - # doWrite(pendingWrite : Object, key : SelectionKey) - + getInterestedOps() : int - + getJavaChannel() : ServerSocketChannel - + read(key : SelectionKey) : ByteBuffer - } - class SameThreadDispatcher { - + SameThreadDispatcher() - + onChannelReadEvent(channel : AbstractNioChannel, readObject : Object, key : SelectionKey) - + stop() - } - class ThreadPoolDispatcher { - - executorService : ExecutorService - + ThreadPoolDispatcher(poolSize : int) - + onChannelReadEvent(channel : AbstractNioChannel, readObject : Object, key : SelectionKey) - + stop() - } -} -package com.iluwatar.reactor.app { - class App { - - channels : List - - dispatcher : Dispatcher - - reactor : NioReactor - + App(dispatcher : Dispatcher) - + main(args : String[]) {static} - + start() - + stop() - - tcpChannel(port : int, handler : ChannelHandler) : AbstractNioChannel - - udpChannel(port : int, handler : ChannelHandler) : AbstractNioChannel - } - class AppClient { - - LOGGER : Logger {static} - - service : ExecutorService - + AppClient() - - artificialDelayOf(millis : long) {static} - + main(args : String[]) {static} - + start() - + stop() - } - ~class TcpLoggingClient { - - clientName : String - - serverPort : int - + TcpLoggingClient(clientName : String, serverPort : int) - + run() - - sendLogRequests(writer : PrintWriter, inputStream : InputStream) - } - ~class UdpLoggingClient { - - clientName : String - - remoteAddress : InetSocketAddress - + UdpLoggingClient(clientName : String, port : int) - + run() - } - class LoggingHandler { - - ACK : byte[] {static} - - LOGGER : Logger {static} - + LoggingHandler() - - doLogging(data : ByteBuffer) {static} - + handleChannelRead(channel : AbstractNioChannel, readObject : Object, key : SelectionKey) - - sendReply(channel : AbstractNioChannel, incomingPacket : DatagramPacket, key : SelectionKey) {static} - - sendReply(channel : AbstractNioChannel, key : SelectionKey) {static} - } -} -AbstractNioChannel --> "-handler" ChannelHandler -UdpLoggingClient ..+ AppClient -TcpLoggingClient ..+ AppClient -AbstractNioChannel --> "-reactor" NioReactor -NioReactor --> "-dispatcher" Dispatcher -App --> "-reactor" NioReactor -App --> "-channels" AbstractNioChannel -DatagramPacket ..+ NioDatagramChannel -App --> "-dispatcher" Dispatcher -ChangeKeyOpsCommand --+ NioReactor -LoggingHandler ..|> ChannelHandler -NioDatagramChannel --|> AbstractNioChannel -NioServerSocketChannel --|> AbstractNioChannel -SameThreadDispatcher ..|> Dispatcher -ThreadPoolDispatcher ..|> Dispatcher -@enduml diff --git a/reader-writer-lock/etc/reader-writer-lock.urm.puml b/reader-writer-lock/etc/reader-writer-lock.urm.puml deleted file mode 100644 index b71cf73f6..000000000 --- a/reader-writer-lock/etc/reader-writer-lock.urm.puml +++ /dev/null @@ -1,61 +0,0 @@ -@startuml -package com.iluwatar.reader.writer.lock { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class Reader { - - LOGGER : Logger {static} - - name : String - - readLock : Lock - + Reader(name : String, readLock : Lock) - + read() - + run() - } - class ReaderWriterLock { - - currentReaderCount : int - - globalMutex : Set - - readerLock : ReadLock - - readerMutex : Object - - writerLock : WriteLock - + ReaderWriterLock() - - doesReaderOwnThisLock() : boolean - - doesWriterOwnThisLock() : boolean - - isLockFree() : boolean - + readLock() : Lock - - waitUninterruptibly(o : Object) {static} - + writeLock() : Lock - } - -class ReadLock { - - ReadLock() - + lock() - + lockInterruptibly() - + newCondition() : Condition - + tryLock() : boolean - + tryLock(time : long, unit : TimeUnit) : boolean - + unlock() - } - -class WriteLock { - - WriteLock() - + lock() - + lockInterruptibly() - + newCondition() : Condition - + tryLock() : boolean - + tryLock(time : long, unit : TimeUnit) : boolean - + unlock() - } - class Writer { - - LOGGER : Logger {static} - - name : String - - writeLock : Lock - + Writer(name : String, writeLock : Lock) - + run() - + write() - } -} -ReaderWriterLock --> "-readerLock" ReadLock -ReadLock --+ ReaderWriterLock -WriteLock --+ ReaderWriterLock -ReaderWriterLock --> "-writerLock" WriteLock -@enduml \ No newline at end of file diff --git a/repository/etc/repository.urm.puml b/repository/etc/repository.urm.puml deleted file mode 100644 index 10768260c..000000000 --- a/repository/etc/repository.urm.puml +++ /dev/null @@ -1,56 +0,0 @@ -@startuml -package com.iluwatar.repository { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class AppConfig { - - LOGGER : Logger {static} - + AppConfig() - + dataSource() : DataSource - + entityManagerFactory() : LocalContainerEntityManagerFactoryBean - - jpaProperties() : Properties {static} - + main(args : String[]) {static} - + transactionManager() : JpaTransactionManager - } - class Person { - - age : int - - id : Long - - name : String - - surname : String - + Person() - + Person(name : String, surname : String, age : int) - + equals(obj : Object) : boolean - + getAge() : int - + getId() : Long - + getName() : String - + getSurname() : String - + hashCode() : int - + setAge(age : int) - + setId(id : Long) - + setName(name : String) - + setSurname(surname : String) - + toString() : String - } - interface PersonRepository { - + findByName(String) : Person {abstract} - } - class PersonSpecifications { - + PersonSpecifications() - } - class AgeBetweenSpec { - - from : int - - to : int - + AgeBetweenSpec(from : int, to : int) - + toPredicate(root : Root, query : CriteriaQuery, cb : CriteriaBuilder) : Predicate - } - class NameEqualSpec { - + name : String - + NameEqualSpec(name : String) - + toPredicate(root : Root, query : CriteriaQuery, cb : CriteriaBuilder) : Predicate - } -} -NameEqualSpec ..+ PersonSpecifications -AgeBetweenSpec ..+ PersonSpecifications -@enduml \ No newline at end of file diff --git a/resource-acquisition-is-initialization/etc/resource-acquisition-is-initialization.urm.puml b/resource-acquisition-is-initialization/etc/resource-acquisition-is-initialization.urm.puml deleted file mode 100644 index 11309f0a6..000000000 --- a/resource-acquisition-is-initialization/etc/resource-acquisition-is-initialization.urm.puml +++ /dev/null @@ -1,19 +0,0 @@ -@startuml -package com.iluwatar.resource.acquisition.is.initialization { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class SlidingDoor { - - LOGGER : Logger {static} - + SlidingDoor() - + close() - } - class TreasureChest { - - LOGGER : Logger {static} - + TreasureChest() - + close() - } -} -@enduml \ No newline at end of file diff --git a/semaphore/etc/semaphore.urm.puml b/semaphore/etc/semaphore.urm.puml deleted file mode 100644 index 168fd17e7..000000000 --- a/semaphore/etc/semaphore.urm.puml +++ /dev/null @@ -1,56 +0,0 @@ -@startuml -package com.iluwatar.semaphore { - class App { - + App() - + main(args : String[]) {static} - } - class Fruit { - - type : FruitType - + Fruit(type : FruitType) - + getType() : FruitType - + toString() : String - } - enum FruitType { - + APPLE {static} - + LEMON {static} - + ORANGE {static} - + valueOf(name : String) : FruitType {static} - + values() : FruitType[] {static} - } - class FruitBowl { - - fruit : List - + FruitBowl() - + countFruit() : int - + put(f : Fruit) - + take() : Fruit - + toString() : String - } - class FruitShop { - - available : boolean[] - - bowls : FruitBowl[] - - semaphore : Semaphore - + FruitShop() - + countFruit() : int - + returnBowl(bowl : FruitBowl) - + takeBowl() : FruitBowl - } - interface Lock { - + acquire() {abstract} - + release() {abstract} - } - class Semaphore { - - counter : int - - licenses : int - + Semaphore(licenses : int) - + acquire() - + getAvailableLicenses() : int - + getNumLicenses() : int - + release() - } -} -FruitType ..+ Fruit -Fruit --> "-type" FruitType -FruitShop --> "-semaphore" Semaphore -FruitBowl --> "-fruit" Fruit -Semaphore ..|> Lock -@enduml \ No newline at end of file diff --git a/servant/etc/servant.urm.puml b/servant/etc/servant.urm.puml deleted file mode 100644 index 96dee04bc..000000000 --- a/servant/etc/servant.urm.puml +++ /dev/null @@ -1,56 +0,0 @@ -@startuml -package com.iluwatar.servant { - class App { - - LOGGER : Logger {static} - ~ jenkins : Servant {static} - ~ travis : Servant {static} - + App() - + main(args : String[]) {static} - + scenario(servant : Servant, compliment : int) {static} - } - class King { - - complimentReceived : boolean - - isDrunk : boolean - - isHappy : boolean - - isHungry : boolean - + King() - + changeMood() - + getDrink() - + getFed() - + getMood() : boolean - + receiveCompliments() - } - class Queen { - - complimentReceived : boolean - - isDrunk : boolean - - isFlirty : boolean - - isHappy : boolean - - isHungry : boolean - + Queen() - + changeMood() - + getDrink() - + getFed() - + getMood() : boolean - + receiveCompliments() - + setFlirtiness(f : boolean) - } - ~interface Royalty { - + changeMood() {abstract} - + getDrink() {abstract} - + getFed() {abstract} - + getMood() : boolean {abstract} - + receiveCompliments() {abstract} - } - class Servant { - + name : String - + Servant(name : String) - + checkIfYouWillBeHanged(tableGuests : List) : boolean - + feed(r : Royalty) - + giveCompliments(r : Royalty) - + giveWine(r : Royalty) - } -} -App --> "-jenkins" Servant -King ..|> Royalty -Queen ..|> Royalty -@enduml \ No newline at end of file diff --git a/service-layer/etc/service-layer.urm.puml b/service-layer/etc/service-layer.urm.puml deleted file mode 100644 index 6cf9b938d..000000000 --- a/service-layer/etc/service-layer.urm.puml +++ /dev/null @@ -1,161 +0,0 @@ -@startuml -left to right direction -package com.iluwatar.servicelayer.hibernate { - class HibernateUtil { - - LOGGER : Logger {static} - - sessionFactory : SessionFactory {static} - - HibernateUtil() - + dropSession() {static} - + getSessionFactory() : SessionFactory {static} - } -} -package com.iluwatar.servicelayer.common { - abstract class BaseEntity { - - version : Long - + BaseEntity() - + getId() : Long {abstract} - + getName() : String {abstract} - + setId(Long) {abstract} - + setName(String) {abstract} - } - interface Dao { - + delete(E extends BaseEntity) {abstract} - + find(Long) : E extends BaseEntity {abstract} - + findAll() : List {abstract} - + merge(E extends BaseEntity) : E extends BaseEntity {abstract} - + persist(E extends BaseEntity) {abstract} - } - abstract class DaoBaseImpl { - # persistentClass : Class - + DaoBaseImpl() - + delete(entity : E extends BaseEntity) - + find(id : Long) : E extends BaseEntity - + findAll() : List - # getSession() : Session - + merge(entity : E extends BaseEntity) : E extends BaseEntity - + persist(entity : E extends BaseEntity) - } -} -package com.iluwatar.servicelayer.magic { - interface MagicService { - + findAllSpellbooks() : List {abstract} - + findAllSpells() : List {abstract} - + findAllWizards() : List {abstract} - + findWizardsWithSpell(String) : List {abstract} - + findWizardsWithSpellbook(String) : List {abstract} - } - class MagicServiceImpl { - - spellDao : SpellDao - - spellbookDao : SpellbookDao - - wizardDao : WizardDao - + MagicServiceImpl(wizardDao : WizardDao, spellbookDao : SpellbookDao, spellDao : SpellDao) - + findAllSpellbooks() : List - + findAllSpells() : List - + findAllWizards() : List - + findWizardsWithSpell(name : String) : List - + findWizardsWithSpellbook(name : String) : List - } -} -package com.iluwatar.servicelayer.wizard { - class Wizard { - - id : Long - - name : String - - spellbooks : Set - + Wizard() - + Wizard(name : String) - + addSpellbook(spellbook : Spellbook) - + getId() : Long - + getName() : String - + getSpellbooks() : Set - + setId(id : Long) - + setName(name : String) - + setSpellbooks(spellbooks : Set) - + toString() : String - } - interface WizardDao { - + findByName(String) : Wizard {abstract} - } - class WizardDaoImpl { - + WizardDaoImpl() - + findByName(name : String) : Wizard - } -} -package com.iluwatar.servicelayer.spellbook { - class Spellbook { - - id : Long - - name : String - - spells : Set - - wizards : Set - + Spellbook() - + Spellbook(name : String) - + addSpell(spell : Spell) - + getId() : Long - + getName() : String - + getSpells() : Set - + getWizards() : Set - + setId(id : Long) - + setName(name : String) - + setSpells(spells : Set) - + setWizards(wizards : Set) - + toString() : String - } - interface SpellbookDao { - + findByName(String) : Spellbook {abstract} - } - class SpellbookDaoImpl { - + SpellbookDaoImpl() - + findByName(name : String) : Spellbook - } -} -package com.iluwatar.servicelayer.spell { - class Spell { - - id : Long - - name : String - - spellbook : Spellbook - + Spell() - + Spell(name : String) - + getId() : Long - + getName() : String - + getSpellbook() : Spellbook - + setId(id : Long) - + setName(name : String) - + setSpellbook(spellbook : Spellbook) - + toString() : String - } - interface SpellDao { - + findByName(String) : Spell {abstract} - } - class SpellDaoImpl { - + SpellDaoImpl() - + findByName(name : String) : Spell - } -} -package com.iluwatar.servicelayer.app { - class App { - - LOGGER : Logger {static} - + App() - + initData() {static} - + main(args : String[]) {static} - + queryData() {static} - } -} -MagicServiceImpl --> "-wizardDao" WizardDao -MagicServiceImpl --> "-spellbookDao" SpellbookDao -MagicServiceImpl --> "-spellDao" SpellDao -Spellbook --> "-spells" Spell -Spellbook --> "-wizards" Wizard -DaoBaseImpl ..|> Dao -MagicServiceImpl ..|> MagicService -Spell --|> BaseEntity -SpellDao --|> Dao -SpellDaoImpl ..|> SpellDao -SpellDaoImpl --|> DaoBaseImpl -Spellbook --|> BaseEntity -SpellbookDao --|> Dao -SpellbookDaoImpl ..|> SpellbookDao -SpellbookDaoImpl --|> DaoBaseImpl -Wizard --|> BaseEntity -WizardDao --|> Dao -WizardDaoImpl ..|> WizardDao -WizardDaoImpl --|> DaoBaseImpl -@enduml diff --git a/service-locator/etc/service-locator.urm.puml b/service-locator/etc/service-locator.urm.puml deleted file mode 100644 index 38fe7ea1b..000000000 --- a/service-locator/etc/service-locator.urm.puml +++ /dev/null @@ -1,41 +0,0 @@ -@startuml -package com.iluwatar.servicelocator { - class App { - + App() - + main(args : String[]) {static} - } - class InitContext { - - LOGGER : Logger {static} - + InitContext() - + lookup(serviceName : String) : Object - } - interface Service { - + execute() {abstract} - + getId() : int {abstract} - + getName() : String {abstract} - } - class ServiceCache { - - LOGGER : Logger {static} - - serviceCache : Map - + ServiceCache() - + addService(newService : Service) - + getService(serviceName : String) : Service - } - class ServiceImpl { - - LOGGER : Logger {static} - - id : int - - serviceName : String - + ServiceImpl(serviceName : String) - + execute() - + getId() : int - + getName() : String - } - class ServiceLocator { - - serviceCache : ServiceCache {static} - - ServiceLocator() - + getService(serviceJndiName : String) : Service {static} - } -} -ServiceLocator --> "-serviceCache" ServiceCache -ServiceImpl ..|> Service -@enduml \ No newline at end of file diff --git a/specification/etc/specification.urm.puml b/specification/etc/specification.urm.puml deleted file mode 100644 index fd3cbb20e..000000000 --- a/specification/etc/specification.urm.puml +++ /dev/null @@ -1,107 +0,0 @@ -@startuml -package com.iluwatar.specification.creature { - abstract class AbstractCreature { - - color : Color - - movement : Movement - - name : String - - size : Size - + AbstractCreature(name : String, size : Size, movement : Movement, color : Color) - + getColor() : Color - + getMovement() : Movement - + getName() : String - + getSize() : Size - + toString() : String - } - interface Creature { - + getColor() : Color {abstract} - + getMovement() : Movement {abstract} - + getName() : String {abstract} - + getSize() : Size {abstract} - } - class Dragon { - + Dragon() - } - class Goblin { - + Goblin() - } - class KillerBee { - + KillerBee() - } - class Octopus { - + Octopus() - } - class Shark { - + Shark() - } - class Troll { - + Troll() - } -} -package com.iluwatar.specification.property { - enum Color { - + DARK {static} - + GREEN {static} - + LIGHT {static} - + RED {static} - - title : String - + toString() : String - + valueOf(name : String) : Color {static} - + values() : Color[] {static} - } - enum Movement { - + FLYING {static} - + SWIMMING {static} - + WALKING {static} - - title : String - + toString() : String - + valueOf(name : String) : Movement {static} - + values() : Movement[] {static} - } - enum Size { - + LARGE {static} - + NORMAL {static} - + SMALL {static} - - title : String - + toString() : String - + valueOf(name : String) : Size {static} - + values() : Size[] {static} - } -} -package com.iluwatar.specification.selector { - class ColorSelector { - - c : Color - + ColorSelector(c : Color) - + test(t : Creature) : boolean - } - class MovementSelector { - - m : Movement - + MovementSelector(m : Movement) - + test(t : Creature) : boolean - } - class SizeSelector { - - s : Size - + SizeSelector(s : Size) - + test(t : Creature) : boolean - } -} -package com.iluwatar.specification.app { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } -} -SizeSelector --> "-s" Size -AbstractCreature --> "-color" Color -MovementSelector --> "-m" Movement -AbstractCreature --> "-movement" Movement -AbstractCreature --> "-size" Size -ColorSelector --> "-c" Color -AbstractCreature ..|> Creature -Dragon --|> AbstractCreature -Goblin --|> AbstractCreature -KillerBee --|> AbstractCreature -Octopus --|> AbstractCreature -Shark --|> AbstractCreature -Troll --|> AbstractCreature -@enduml \ No newline at end of file diff --git a/state/etc/state.urm.puml b/state/etc/state.urm.puml deleted file mode 100644 index 207a227d8..000000000 --- a/state/etc/state.urm.puml +++ /dev/null @@ -1,39 +0,0 @@ -@startuml -package com.iluwatar.state { - class AngryState { - - LOGGER : Logger {static} - - mammoth : Mammoth - + AngryState(mammoth : Mammoth) - + observe() - + onEnterState() - } - class App { - + App() - + main(args : String[]) {static} - } - class Mammoth { - - state : State - + Mammoth() - - changeStateTo(newState : State) - + observe() - + timePasses() - + toString() : String - } - class PeacefulState { - - LOGGER : Logger {static} - - mammoth : Mammoth - + PeacefulState(mammoth : Mammoth) - + observe() - + onEnterState() - } - interface State { - + observe() {abstract} - + onEnterState() {abstract} - } -} -PeacefulState --> "-mammoth" Mammoth -AngryState --> "-mammoth" Mammoth -Mammoth --> "-state" State -AngryState ..|> State -PeacefulState ..|> State -@enduml \ No newline at end of file diff --git a/step-builder/etc/step-builder.urm.puml b/step-builder/etc/step-builder.urm.puml deleted file mode 100644 index dc6087340..000000000 --- a/step-builder/etc/step-builder.urm.puml +++ /dev/null @@ -1,91 +0,0 @@ -@startuml -package com.iluwatar.stepbuilder { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class Character { - - abilities : List - - fighterClass : String - - name : String - - spell : String - - weapon : String - - wizardClass : String - + Character(name : String) - + getAbilities() : List - + getFighterClass() : String - + getName() : String - + getSpell() : String - + getWeapon() : String - + getWizardClass() : String - + setAbilities(abilities : List) - + setFighterClass(fighterClass : String) - + setName(name : String) - + setSpell(spell : String) - + setWeapon(weapon : String) - + setWizardClass(wizardClass : String) - + toString() : String - } - class CharacterStepBuilder { - - CharacterStepBuilder() - + newBuilder() : NameStep {static} - } - interface AbilityStep { - + noAbilities() : BuildStep {abstract} - + noMoreAbilities() : BuildStep {abstract} - + withAbility(String) : AbilityStep {abstract} - } - interface BuildStep { - + build() : Character {abstract} - } - -class CharacterSteps { - - abilities : List - - fighterClass : String - - name : String - - spell : String - - weapon : String - - wizardClass : String - - CharacterSteps() - + build() : Character - + fighterClass(fighterClass : String) : WeaponStep - + name(name : String) : ClassStep - + noAbilities() : BuildStep - + noMoreAbilities() : BuildStep - + noSpell() : BuildStep - + noWeapon() : BuildStep - + withAbility(ability : String) : AbilityStep - + withSpell(spell : String) : AbilityStep - + withWeapon(weapon : String) : AbilityStep - + wizardClass(wizardClass : String) : SpellStep - } - interface ClassStep { - + fighterClass(String) : WeaponStep {abstract} - + wizardClass(String) : SpellStep {abstract} - } - interface NameStep { - + name(String) : ClassStep {abstract} - } - interface SpellStep { - + noSpell() : BuildStep {abstract} - + withSpell(String) : AbilityStep {abstract} - } - interface WeaponStep { - + noWeapon() : BuildStep {abstract} - + withWeapon(String) : AbilityStep {abstract} - } -} -WeaponStep ..+ CharacterStepBuilder -CharacterSteps ..+ CharacterStepBuilder -AbilityStep ..+ CharacterStepBuilder -SpellStep ..+ CharacterStepBuilder -ClassStep ..+ CharacterStepBuilder -NameStep ..+ CharacterStepBuilder -BuildStep ..+ CharacterStepBuilder -CharacterSteps ..|> NameStep -CharacterSteps ..|> ClassStep -CharacterSteps ..|> WeaponStep -CharacterSteps ..|> SpellStep -CharacterSteps ..|> AbilityStep -CharacterSteps ..|> BuildStep -@enduml \ No newline at end of file diff --git a/strategy/etc/strategy.urm.puml b/strategy/etc/strategy.urm.puml deleted file mode 100644 index 8b9daabb9..000000000 --- a/strategy/etc/strategy.urm.puml +++ /dev/null @@ -1,37 +0,0 @@ -@startuml -package com.iluwatar.strategy { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class DragonSlayer { - - strategy : DragonSlayingStrategy - + DragonSlayer(strategy : DragonSlayingStrategy) - + changeStrategy(strategy : DragonSlayingStrategy) - + goToBattle() - } - interface DragonSlayingStrategy { - + execute() {abstract} - } - class MeleeStrategy { - - LOGGER : Logger {static} - + MeleeStrategy() - + execute() - } - class ProjectileStrategy { - - LOGGER : Logger {static} - + ProjectileStrategy() - + execute() - } - class SpellStrategy { - - LOGGER : Logger {static} - + SpellStrategy() - + execute() - } -} -DragonSlayer --> "-strategy" DragonSlayingStrategy -MeleeStrategy ..|> DragonSlayingStrategy -ProjectileStrategy ..|> DragonSlayingStrategy -SpellStrategy ..|> DragonSlayingStrategy -@enduml \ No newline at end of file diff --git a/template-method/etc/template-method.urm.puml b/template-method/etc/template-method.urm.puml deleted file mode 100644 index a6e2dc3d2..000000000 --- a/template-method/etc/template-method.urm.puml +++ /dev/null @@ -1,39 +0,0 @@ -@startuml -package com.iluwatar.templatemethod { - class App { - + App() - + main(args : String[]) {static} - } - class HalflingThief { - - method : StealingMethod - + HalflingThief(method : StealingMethod) - + changeMethod(method : StealingMethod) - + steal() - } - class HitAndRunMethod { - - LOGGER : Logger {static} - + HitAndRunMethod() - # confuseTarget(target : String) - # pickTarget() : String - # stealTheItem(target : String) - } - abstract class StealingMethod { - - LOGGER : Logger {static} - + StealingMethod() - # confuseTarget(String) {abstract} - # pickTarget() : String {abstract} - + steal() - # stealTheItem(String) {abstract} - } - class SubtleMethod { - - LOGGER : Logger {static} - + SubtleMethod() - # confuseTarget(target : String) - # pickTarget() : String - # stealTheItem(target : String) - } -} -HalflingThief --> "-method" StealingMethod -HitAndRunMethod --|> StealingMethod -SubtleMethod --|> StealingMethod -@enduml \ No newline at end of file diff --git a/thread-pool/etc/thread-pool.urm.puml b/thread-pool/etc/thread-pool.urm.puml deleted file mode 100644 index 251033c81..000000000 --- a/thread-pool/etc/thread-pool.urm.puml +++ /dev/null @@ -1,37 +0,0 @@ -@startuml -package com.iluwatar.threadpool { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class CoffeeMakingTask { - - TIME_PER_CUP : int {static} - + CoffeeMakingTask(numCups : int) - + toString() : String - } - class PotatoPeelingTask { - - TIME_PER_POTATO : int {static} - + PotatoPeelingTask(numPotatoes : int) - + toString() : String - } - abstract class Task { - - ID_GENERATOR : AtomicInteger {static} - - id : int - - timeMs : int - + Task(timeMs : int) - + getId() : int - + getTimeMs() : int - + toString() : String - } - class Worker { - - LOGGER : Logger {static} - - task : Task - + Worker(task : Task) - + run() - } -} -Worker --> "-task" Task -CoffeeMakingTask --|> Task -PotatoPeelingTask --|> Task -@enduml \ No newline at end of file diff --git a/throttling/etc/throttling.urm.puml b/throttling/etc/throttling.urm.puml deleted file mode 100644 index 8c97da50a..000000000 --- a/throttling/etc/throttling.urm.puml +++ /dev/null @@ -1,29 +0,0 @@ -@startuml -package com.iluwatar.tls { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - - makeServiceCalls(service : B2BService) {static} - } - ~class B2BService { - - LOGGER : Logger {static} - - callsCounter : int - - tenant : Tenant - + B2BService(tenant : Tenant) - + dummyCustomerApi() : int - + getCurrentCallsCount() : int - - getRandomCustomerId() : int - } - class Tenant { - - allowedCallsPerSecond : int - - name : String - + Tenant(name : String, allowedCallsPerSecond : int) - + getAllowedCallsPerSecond() : int - + getName() : String - + setAllowedCallsPerSecond(allowedCallsPerSecond : int) - + setName(name : String) - } -} -B2BService --> "-tenant" Tenant -@enduml \ No newline at end of file diff --git a/tls/etc/tls.urm.puml b/tls/etc/tls.urm.puml deleted file mode 100644 index d2eedb371..000000000 --- a/tls/etc/tls.urm.puml +++ /dev/null @@ -1,23 +0,0 @@ -@startuml -package com.iluwatar.tls { - class App { - + App() - + main(args : String[]) {static} - - printAndCountDates(res : Result) : int {static} - - printAndCountExceptions(res : Result) : int {static} - } - class DateFormatCallable { - - dateValue : String - - df : ThreadLocal - + DateFormatCallable(inDateFormat : String, inDateValue : String) - + call() : Result - } - class Result { - - dateList : List - - exceptionList : List - + Result() - + getDateList() : List - + getExceptionList() : List - } -} -@enduml \ No newline at end of file diff --git a/tolerant-reader/etc/tolerant-reader.urm.puml b/tolerant-reader/etc/tolerant-reader.urm.puml deleted file mode 100644 index a73394a4e..000000000 --- a/tolerant-reader/etc/tolerant-reader.urm.puml +++ /dev/null @@ -1,39 +0,0 @@ -@startuml -package com.iluwatar.tolerantreader { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class RainbowFish { - - age : int - - lengthMeters : int - - name : String - - serialVersionUID : long {static} - - weightTons : int - + RainbowFish(name : String, age : int, lengthMeters : int, weightTons : int) - + getAge() : int - + getLengthMeters() : int - + getName() : String - + getWeightTons() : int - } - class RainbowFishSerializer { - - RainbowFishSerializer() - + readV1(filename : String) : RainbowFish {static} - + writeV1(rainbowFish : RainbowFish, filename : String) {static} - + writeV2(rainbowFish : RainbowFishV2, filename : String) {static} - } - class RainbowFishV2 { - - angry : boolean - - hungry : boolean - - serialVersionUID : long {static} - - sleeping : boolean - + RainbowFishV2(name : String, age : int, lengthMeters : int, weightTons : int) - + RainbowFishV2(name : String, age : int, lengthMeters : int, weightTons : int, sleeping : boolean, hungry : boolean, angry : boolean) - + getAngry() : boolean - + getHungry() : boolean - + getSleeping() : boolean - } -} -RainbowFishV2 --|> RainbowFish -@enduml \ No newline at end of file diff --git a/twin/etc/twin.urm.puml b/twin/etc/twin.urm.puml deleted file mode 100644 index e48298f18..000000000 --- a/twin/etc/twin.urm.puml +++ /dev/null @@ -1,27 +0,0 @@ -@startuml -package com.iluwatar.twin { - class App { - + App() - + main(args : String[]) {static} - - waiting() {static} - } - class BallItem { - - LOGGER : Logger {static} - - isSuspended : boolean - - twin : BallThread - + BallItem() - + click() - + doDraw() - + move() - + setTwin(twin : BallThread) - } - abstract class GameItem { - - LOGGER : Logger {static} - + GameItem() - + click() {abstract} - + doDraw() {abstract} - + draw() - } -} -BallItem --|> GameItem -@enduml \ No newline at end of file diff --git a/value-object/etc/value-object.urm.puml b/value-object/etc/value-object.urm.puml deleted file mode 100644 index 6149ead9b..000000000 --- a/value-object/etc/value-object.urm.puml +++ /dev/null @@ -1,22 +0,0 @@ -@startuml -package com.iluwatar.value.object { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class HeroStat { - - intelligence : int - - luck : int - - strength : int - - HeroStat(strength : int, intelligence : int, luck : int) - + equals(obj : Object) : boolean - + getIntelligence() : int - + getLuck() : int - + getStrength() : int - + hashCode() : int - + toString() : String - + valueOf(strength : int, intelligence : int, luck : int) : HeroStat {static} - } -} -@enduml \ No newline at end of file diff --git a/visitor/etc/visitor.urm.puml b/visitor/etc/visitor.urm.puml deleted file mode 100644 index 36a67b415..000000000 --- a/visitor/etc/visitor.urm.puml +++ /dev/null @@ -1,60 +0,0 @@ -@startuml -package com.iluwatar.visitor { - class App { - + App() - + main(args : String[]) {static} - } - class Commander { - + Commander(children : Unit[]) - + accept(visitor : UnitVisitor) - + toString() : String - } - class CommanderVisitor { - - LOGGER : Logger {static} - + CommanderVisitor() - + visitCommander(commander : Commander) - + visitSergeant(sergeant : Sergeant) - + visitSoldier(soldier : Soldier) - } - class Sergeant { - + Sergeant(children : Unit[]) - + accept(visitor : UnitVisitor) - + toString() : String - } - class SergeantVisitor { - - LOGGER : Logger {static} - + SergeantVisitor() - + visitCommander(commander : Commander) - + visitSergeant(sergeant : Sergeant) - + visitSoldier(soldier : Soldier) - } - class Soldier { - + Soldier(children : Unit[]) - + accept(visitor : UnitVisitor) - + toString() : String - } - class SoldierVisitor { - - LOGGER : Logger {static} - + SoldierVisitor() - + visitCommander(commander : Commander) - + visitSergeant(sergeant : Sergeant) - + visitSoldier(soldier : Soldier) - } - abstract class Unit { - - children : Unit[] - + Unit(children : Unit[]) - + accept(visitor : UnitVisitor) - } - interface UnitVisitor { - + visitCommander(Commander) {abstract} - + visitSergeant(Sergeant) {abstract} - + visitSoldier(Soldier) {abstract} - } -} -Commander --|> Unit -CommanderVisitor ..|> UnitVisitor -Sergeant --|> Unit -SergeantVisitor ..|> UnitVisitor -Soldier --|> Unit -SoldierVisitor ..|> UnitVisitor -@enduml \ No newline at end of file From bf98299db229e1fe43ad011aa7fc43b13984516b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Tue, 28 Nov 2017 21:28:53 +0200 Subject: [PATCH 090/100] #190 Remove pumlids from readmes --- abstract-document/README.md | 1 - abstract-factory/README.md | 1 - adapter/README.md | 1 - aggregator-microservices/README.md | 1 - api-gateway/README.md | 1 - async-method-invocation/README.md | 1 - bridge/README.md | 1 - builder/README.md | 1 - business-delegate/README.md | 1 - caching/README.md | 1 - callback/README.md | 1 - chain/README.md | 1 - command/README.md | 1 - composite/README.md | 1 - cqrs/README.md | 1 - dao/README.md | 1 - data-mapper/README.md | 1 - data-transfer-object/README.md | 1 - decorator/README.md | 1 - delegation/README.md | 1 - dependency-injection/README.md | 1 - double-checked-locking/README.md | 1 - double-dispatch/README.md | 1 - event-aggregator/README.md | 1 - event-driven-architecture/README.md | 1 - execute-around/README.md | 1 - facade/README.md | 1 - factory-kit/README.md | 1 - factory-method/README.md | 1 - feature-toggle/README.md | 1 - fluentinterface/README.md | 1 - flux/README.md | 1 - flyweight/README.md | 1 - front-controller/README.md | 1 - guarded-suspension/README.md | 1 - half-sync-half-async/README.md | 1 - hexagonal/README.md | 1 - intercepting-filter/README.md | 1 - interpreter/README.md | 1 - iterator/README.md | 1 - layers/README.md | 1 - lazy-loading/README.md | 1 - mediator/README.md | 1 - memento/README.md | 1 - model-view-controller/README.md | 1 - model-view-presenter/README.md | 1 - module/README.md | 1 - monad/README.md | 1 - monostate/README.md | 1 - multiton/README.md | 1 - mute-idiom/README.md | 1 - mutex/README.md | 1 - null-object/README.md | 1 - object-mother/README.md | 1 - object-pool/README.md | 1 - observer/README.md | 1 - poison-pill/README.md | 1 - private-class-data/README.md | 1 - producer-consumer/README.md | 1 - promise/README.md | 1 - property/README.md | 1 - prototype/README.md | 1 - proxy/README.md | 1 - queue-load-leveling/README.md | 1 - reactor/README.md | 1 - reader-writer-lock/README.md | 1 - repository/README.md | 1 - resource-acquisition-is-initialization/README.md | 1 - semaphore/README.md | 1 - servant/README.md | 1 - service-layer/README.md | 1 - service-locator/README.md | 1 - singleton/README.md | 1 - specification/README.md | 1 - state/README.md | 1 - step-builder/README.md | 1 - strategy/README.md | 1 - template-method/README.md | 1 - thread-pool/README.md | 1 - tolerant-reader/README.md | 1 - twin/README.md | 1 - value-object/README.md | 1 - visitor/README.md | 1 - 83 files changed, 83 deletions(-) diff --git a/abstract-document/README.md b/abstract-document/README.md index c8755ce07..bf28ff999 100644 --- a/abstract-document/README.md +++ b/abstract-document/README.md @@ -3,7 +3,6 @@ layout: pattern title: Abstract Document folder: abstract-document permalink: /patterns/abstract-document/ -pumlid: PSjB3eCm34NHhPG599vtDyQn85L-ifzX-p3lxEf8Twj3MXGDQvyJMFubChxpKN767gucSq07iinEjSNDOACVNvoAUZr6MWoe3QVE_WRnxZ0Mf38b-hkIGlurX_MyehS7 categories: Structural tags: - Java diff --git a/abstract-factory/README.md b/abstract-factory/README.md index 0fb3c3cb2..842e88799 100644 --- a/abstract-factory/README.md +++ b/abstract-factory/README.md @@ -3,7 +3,6 @@ layout: pattern title: Abstract Factory folder: abstract-factory permalink: /patterns/abstract-factory/ -pumlid: PSZB3OD034NHLa81Czwd6sCC39gVxEUWT1_ssLmTtQLqgR5fM7sTmFGtaV6TZu8prd0r6HtQaMKqAZLk1XjT_E6qgPUZfyc0MdTgx0-8LuUn8ErFXdr98NypXxKyezKV categories: Creational tags: - Java diff --git a/adapter/README.md b/adapter/README.md index 6de04a72c..3344490ff 100644 --- a/adapter/README.md +++ b/adapter/README.md @@ -3,7 +3,6 @@ layout: pattern title: Adapter folder: adapter permalink: /patterns/adapter/ -pumlid: DSR14S8m30J0Lg20M7-wEMnDOiPMFDA9j0yyUEtUkzMHJTF7xI1NF4GSLzaxZtncgDVJgCPIpobzv0N2vOKtjgRHTziMI7KBcOXl10thfxB-Nz9dMJd71m00 categories: Structural tags: - Java diff --git a/aggregator-microservices/README.md b/aggregator-microservices/README.md index 75fe373fd..e65f26d9a 100644 --- a/aggregator-microservices/README.md +++ b/aggregator-microservices/README.md @@ -3,7 +3,6 @@ layout: pattern title: Aggregator Microservices folder: aggregator-microservices permalink: /patterns/aggregator-microservices/ -pumlid: JOov3SCm301NIGQGs7iRXYPa1g8ayB7NjuiKwGvtmBrbKC-Tq_hhY5Y-0HXUjKaS-Kbdepc2HrIQ2jBpma23BvvOTdPfeooCO1iEYlu0O6l63MDQKI6Rp-CKOWSE-ey_NzEqhjH-0m00 categories: Architectural tags: - Java diff --git a/api-gateway/README.md b/api-gateway/README.md index 93b975e13..23014ae0b 100644 --- a/api-gateway/README.md +++ b/api-gateway/README.md @@ -3,7 +3,6 @@ layout: pattern title: API Gateway folder: api-gateway permalink: /patterns/api-gateway/ -pumlid: JSox3SCm303HLP819FRUXg49cO542_nOyFPncUvUSszHwhbpMdyT4TCt0CDLcyIHdtGsEZLOez8vG7ek33JuueLbPvUcPM84cpeCz2S0fvI6mGjluA1_b-Tt2N5D6tNcw3y0 categories: Architectural tags: - Java diff --git a/async-method-invocation/README.md b/async-method-invocation/README.md index b96c1d77a..2d99820c5 100644 --- a/async-method-invocation/README.md +++ b/async-method-invocation/README.md @@ -3,7 +3,6 @@ layout: pattern title: Async Method Invocation folder: async-method-invocation permalink: /patterns/async-method-invocation/ -pumlid: TSdB3SCW303GLTe1mFTkunWhk0A3_4dKxTi5UdlIUuhIoCPfuz4Zjhy03EzwIlGyqjbeQR16fJL1HjuOQF362qjZbrFBnWWsTPZeFm3wHwbCZhvQ4RqMOSXIuA1_LzDctJd75m00 categories: Concurrency tags: - Java diff --git a/bridge/README.md b/bridge/README.md index a37c35174..882640725 100644 --- a/bridge/README.md +++ b/bridge/README.md @@ -3,7 +3,6 @@ layout: pattern title: Bridge folder: bridge permalink: /patterns/bridge/ -pumlid: BSR14SCm20J0Lf82BFxf1akCJ4R26ZZYzkE7zxLljJgoIVfu7S2A3v7pLRhYo3r3l9u6CPHwJjAH5uETllpZhKbejsqn86v1a-CExQwj2mdgqv8-oyev_W00 categories: Structural tags: - Java diff --git a/builder/README.md b/builder/README.md index d255ec2f6..51495619b 100644 --- a/builder/README.md +++ b/builder/README.md @@ -3,7 +3,6 @@ layout: pattern title: Builder folder: builder permalink: /patterns/builder/ -pumlid: DSR94O0m2030LhG0mzzkC64KXs26GzlNZw_TcRLADagJwOWOlW8OFcNdE79B9wkN1ccKUdLWoGS33KwySMdalEioC89C7Jhw5zYIfNrIrFybhPUHNLu0 categories: Creational tags: - Java diff --git a/business-delegate/README.md b/business-delegate/README.md index 8e6e3456c..e6e249122 100644 --- a/business-delegate/README.md +++ b/business-delegate/README.md @@ -3,7 +3,6 @@ layout: pattern title: Business Delegate folder: business-delegate permalink: /patterns/business-delegate/ -pumlid: POl13SCm3CHMQGU8zUysgYCuBcJ5a4x9-l6_Fu84tzsgvYxf-Zg06HyYvxkqZYE_6UBrD8YXr7DGrxmPxFJZYxTTeZVR9WFY5ZGu5j2wkad4wYgD8IIe_xQaZp9pw0C0 categories: Business Tier tags: - Java diff --git a/caching/README.md b/caching/README.md index b48d060f0..7184d51d4 100644 --- a/caching/README.md +++ b/caching/README.md @@ -3,7 +3,6 @@ layout: pattern title: Caching folder: caching permalink: /patterns/caching/ -pumlid: DSRB4OKm2030LhG0m_rrWyWaE0bc-6ZxpujxsbMKUXwSrfSMCVq7OFYKAj5oJsUZIuCr2bq3fEU3WGOdthWTx59rcnZ1fWu3_GqGKXEjm47VIzeeCqV_0m00 categories: Other tags: - Java diff --git a/callback/README.md b/callback/README.md index 278aa9b0a..a408fd5e0 100644 --- a/callback/README.md +++ b/callback/README.md @@ -3,7 +3,6 @@ layout: pattern title: Callback folder: callback permalink: /patterns/callback/ -pumlid: FSVB4S8m30N0Lg20M7UwUL4qYOciUFGXxSE9s-wp6sjjKgwF8tF6YyXnjxtdKMk5E5-MOjdu6jIrRYIStlXWsIJwRij4fhW53SGFn51TmIT9yZ-jVBHPGxy0 categories: Other tags: - Java diff --git a/chain/README.md b/chain/README.md index 1d7eb5b73..6bca81610 100644 --- a/chain/README.md +++ b/chain/README.md @@ -3,7 +3,6 @@ layout: pattern title: Chain of responsibility folder: chain permalink: /patterns/chain/ -pumlid: 9SR13SCm20NGLTe1OkxTXX0KKzd4Wa-pVYlrdTxJN4OTMZ4U7LZv8Wg-ssdejLTgoELGHvDhaesw6HpqvWzlXwQTlYq6D3nfSlv2qjcS5F9VgvXjrHnV categories: Behavioral tags: - Java diff --git a/command/README.md b/command/README.md index 3996d2842..987ec6a34 100644 --- a/command/README.md +++ b/command/README.md @@ -3,7 +3,6 @@ layout: pattern title: Command folder: command permalink: /patterns/command/ -pumlid: DSgn4OCm30NGLM00h3xR25i7vYpXaxx2-g59zugtTgiZcwIFvGHcV8YSdt9qdBbdYDVR88PIRwK-yc6mqyLVtff4FsoR38XRa7Aye3SgMoD1_RkaQvcfumS0 categories: Behavioral tags: - Java diff --git a/composite/README.md b/composite/README.md index fbb21ecb3..e4f45ddd0 100644 --- a/composite/README.md +++ b/composite/README.md @@ -3,7 +3,6 @@ layout: pattern title: Composite folder: composite permalink: /patterns/composite/ -pumlid: HSf13eCm30NHgy01YFUzZGaM62LEP7-NwvTTT_EaMTLgoqFIst81Cpv4payv5LVk6U9r6CHGwkYaBHy6EztyvUsGqDEsoO2u1NMED-WTvmY5aA3-LT9xcTdR3m00 categories: Structural tags: - Java diff --git a/cqrs/README.md b/cqrs/README.md index 3cdd429a1..111c1ccd4 100644 --- a/cqrs/README.md +++ b/cqrs/README.md @@ -3,7 +3,6 @@ layout: pattern title: CQRS folder: cqrs permalink: /patterns/cqrs/ -pumlid: 7SPR4a0m3030gt00pR_RH6I8QQFouFgC_TfHb6gkd5Q7FQBx363ub4rYpoMTZKuDrYXqDX37HIuuyCPfPPTDfuuHREhGqBy0NUR0GNzAMYizMtq1 categories: Architectural tags: - Java diff --git a/dao/README.md b/dao/README.md index b1b655edf..785a1c362 100644 --- a/dao/README.md +++ b/dao/README.md @@ -3,7 +3,6 @@ layout: pattern title: Data Access Object folder: dao permalink: /patterns/dao/ -pumlid: 5SR14OKW30N0LhG0oVrt4o6ZE12Ov4NR_thQNQlc5aN2sd82qtz4naywAixOmyNoK8WYvT6fjdWOR7JnpLiHhuTkam4nTUhiRwZm847-J64zpUZj3m00 categories: Persistence Tier tags: - Java diff --git a/data-mapper/README.md b/data-mapper/README.md index 362f19c51..075e8eece 100644 --- a/data-mapper/README.md +++ b/data-mapper/README.md @@ -3,7 +3,6 @@ layout: pattern title: Data Mapper folder: data-mapper permalink: /patterns/data-mapper/ -pumlid: JShB3OGm303HLg20nFVjnYGM1CN6ycTfVtFSsnjfzY5jPgUqkLqHwXy0mxUU8wuyqidQ8q4IjJqCO-QBWGOtVh5qyd5AKOmW4mT6Nu2-ZiAekapH_hkcSTNa-GC0 categories: Persistence Tier tags: - Java diff --git a/data-transfer-object/README.md b/data-transfer-object/README.md index 7fe2d9cdc..ad9b9f4e2 100644 --- a/data-transfer-object/README.md +++ b/data-transfer-object/README.md @@ -3,7 +3,6 @@ layout: pattern title: Data Transfer Object folder: data-transfer-object permalink: /patterns/data-transfer-object/ -pumlid: RSh14SCW30NHLk82GFTq8uDYum71I5zn-t41kUtCswrfwL4bhBzEOFcRoFZEHyCPUxXOcGfHv387jHutWuqk_dAguktGj1WGKwV1_WJLvqWmLl-8fRbVKa22yXTosCWhHly1 categories: Architectural tags: - Java diff --git a/decorator/README.md b/decorator/README.md index f3d6347e4..4b6bfe61f 100644 --- a/decorator/README.md +++ b/decorator/README.md @@ -3,7 +3,6 @@ layout: pattern title: Decorator folder: decorator permalink: /patterns/decorator/ -pumlid: HSV14SCm20J0Lk82BFxf1YF6LaP26ZZizfDVVhjRC-bPDRs_Bc35cyZvAMV3bKU6kao36ehCGQtdms2d3z-yLursshuOKBUWmV43LPNfZEcaaFzA-YWhH_y2 categories: Structural tags: - Java diff --git a/delegation/README.md b/delegation/README.md index b294607ec..e5c0c6376 100644 --- a/delegation/README.md +++ b/delegation/README.md @@ -3,7 +3,6 @@ layout: pattern title: Delegation folder: delegation permalink: /patterns/delegation/ -pumlid: JSV14GCX20NGLf82LkxfXbN69OFeu2VRVdBCxRsdUhLiac6F2rZxHHHybwwuyimjKQT37ANEGMfvCpZepHy-ccpjVYm697pJuFq3DJ7f39rEWlhNaZ7Aoc5V categories: Behavioral tags: - Java diff --git a/dependency-injection/README.md b/dependency-injection/README.md index b4ec12e6b..735f589b1 100644 --- a/dependency-injection/README.md +++ b/dependency-injection/README.md @@ -3,7 +3,6 @@ layout: pattern title: Dependency Injection folder: dependency-injection permalink: /patterns/dependency-injection/ -pumlid: RSdB3SCW303GLPe1mFTkunWhSGG6-PEesxS3zFQajubIpyPf_NL6B7y363xra3XpJsUZgS4QbUO0wVbWeC65DvR6BeUMXH5iwZ3GVu36YxMnqgU8NamXKu63_aPD6tNbw5y0 categories: Behavioral tags: - Java diff --git a/double-checked-locking/README.md b/double-checked-locking/README.md index 582e4aac6..da1fdd1a2 100644 --- a/double-checked-locking/README.md +++ b/double-checked-locking/README.md @@ -3,7 +3,6 @@ layout: pattern title: Double Checked Locking folder: double-checked-locking permalink: /patterns/double-checked-locking/ -pumlid: TSdH4SCW203GLTe1bFzkGv1J6qGFeLc_MI1_x-wzkv94uJ1vDVUrFm26LwxTMnonsMYgitgcEQ1BNEXeyCKVfiAxLqqBtTbqmy1z0ygCGpXHOpgv99bqTgt0JW-LmqPUCUGF categories: Concurrency tags: - Java diff --git a/double-dispatch/README.md b/double-dispatch/README.md index b0f2185f9..ae87208a2 100644 --- a/double-dispatch/README.md +++ b/double-dispatch/README.md @@ -3,7 +3,6 @@ layout: pattern title: Double Dispatch folder: double-dispatch permalink: /patterns/double-dispatch/ -pumlid: NSbB3iCW303HgpG70Ezx6yTOWSeOv4zp_MRTtUZDCPGa6wV9gqTiVmCOtlKQqVDCPwEbmHgLreGXUMEWmGU_M1hxkBHiZ61JXud-1BILft1fmvz37JZetshQh3kd_000 categories: Other tags: - Java diff --git a/event-aggregator/README.md b/event-aggregator/README.md index ce7f358de..ac07869e7 100644 --- a/event-aggregator/README.md +++ b/event-aggregator/README.md @@ -3,7 +3,6 @@ layout: pattern title: Event Aggregator folder: event-aggregator permalink: /patterns/event-aggregator/ -pumlid: PSf13iCW30NHgxG70Ezx6uTOX0eCih-JwvTzTwEdUJSjFKu9wwyBMFuXCdvoRRZY21ShKo6ANEQWrkDXiD6NRqwdUAkQ5WDYwZJOTv3SUqzSgqbbp0qeVvZ3Hbun-Wy0 categories: Structural tags: - Java diff --git a/event-driven-architecture/README.md b/event-driven-architecture/README.md index a263defec..e2f06cf5a 100644 --- a/event-driven-architecture/README.md +++ b/event-driven-architecture/README.md @@ -3,7 +3,6 @@ layout: pattern title: Event Driven Architecture folder: event-driven-architecture permalink: /patterns/event-driven-architecture/ -pumlid: TOhH3SCW30LNQGS0_tSRnrZ15H1adfFromBzkfFktZQaHT7mzgh0N1yYvoUVXXf7B7Mv1dGWozN9MZmCTlhopQdeidEaoO3wMDHvRI6zzvwAssPYbsfGGRYIGlxN7DxpZDv- categories: Architectural tags: - Java diff --git a/execute-around/README.md b/execute-around/README.md index e0ae128b5..f669f18ff 100644 --- a/execute-around/README.md +++ b/execute-around/README.md @@ -3,7 +3,6 @@ layout: pattern title: Execute Around folder: execute-around permalink: /patterns/execute-around/ -pumlid: NSZ14G8n20NGLhI0XBlT865suoGa0n_NylNixSsxTvEHJTF7xGHsF8YShtfqdFdCK9TbK4ELDQcFl1ZizE8tbwRH3okR0NKBcXm_a7vK4bhOLreZXVnLJPzrvnnV categories: Other tags: - Java diff --git a/facade/README.md b/facade/README.md index d50841e84..7caa89d94 100644 --- a/facade/README.md +++ b/facade/README.md @@ -3,7 +3,6 @@ layout: pattern title: Facade folder: facade permalink: /patterns/facade/ -pumlid: BSP15eCm20N0gxG7CEoz3ILKqvTW7dpq-hhehERTJ7fMJU-l7PYn4ZbVPMlOyvEXBeT13KMEGQtdnM2d7v-yL8sssJ8PKBUWmV64lYnSbHJoRqaVPUReDm00 categories: Structural tags: - Java diff --git a/factory-kit/README.md b/factory-kit/README.md index b47cbff76..c25701047 100644 --- a/factory-kit/README.md +++ b/factory-kit/README.md @@ -3,7 +3,6 @@ layout: pattern title: Factory Kit folder: factory-kit permalink: /patterns/factory-kit/ -pumlid: JST15i8m20N0g-W14lRU1YcsQ4BooCS-RwzBTpDNSscvQKQx7C1SDwBWi-w68--vD6Gur55bTBAM9uE3dlpcikcotSjaGCCNTLu_q8C58pxbPI25_Bzcz3gpjoy0 categories: Creational tags: - Java diff --git a/factory-method/README.md b/factory-method/README.md index 07c92d0e5..7432a3cb5 100644 --- a/factory-method/README.md +++ b/factory-method/README.md @@ -3,7 +3,6 @@ layout: pattern title: Factory Method folder: factory-method permalink: /patterns/factory-method/ -pumlid: NSZB3G8n30N0Lg20n7UwCOxPP9MVx6TMT0zdRgEvjoazYeRrMmMsFuYChtmqr7Y6gycQq8aiQr3hSJ7OwEGtfwBUZfas0shJQR3_G2yMBFkaeQYha4B-AeUDl6FqBm00 categories: Creational tags: - Java diff --git a/feature-toggle/README.md b/feature-toggle/README.md index 06d956178..c466b8a94 100644 --- a/feature-toggle/README.md +++ b/feature-toggle/README.md @@ -3,7 +3,6 @@ layout: pattern title: Feature Toggle folder: feature-toggle permalink: /patterns/feature-toggle/ -pumlid: NSZ14G8X30NGLhG0oDrk8XjPd12OvCTjNy_UthpxiAPvIBhUJc37WyZvgdtWp6U6U5i6CTIs9WtDYy5ER_vmEIH6jx8P4BUWoV43lOIHBWMhTnKIjB-gwRFkdFe5 categories: Behavioral tags: - Java diff --git a/fluentinterface/README.md b/fluentinterface/README.md index 8bf43d974..767792da7 100644 --- a/fluentinterface/README.md +++ b/fluentinterface/README.md @@ -3,7 +3,6 @@ layout: pattern title: Fluent Interface folder: fluentinterface permalink: /patterns/fluentinterface/ -pumlid: NOj93eCm302_KXv0VEzlN6F0bMCYB_3zvjpRQ3IpY97MnkNwEZD7l04SdtP8dlMfOAVBaYqRNHr4wy54Xo_Uk6uSSjWwC9FT0Zh61DYrPY_pyXs9WPF-NIllRLJN7m00 categories: Other tags: - Java diff --git a/flux/README.md b/flux/README.md index e36b73900..7ac312c44 100644 --- a/flux/README.md +++ b/flux/README.md @@ -3,7 +3,6 @@ layout: pattern title: Flux folder: flux permalink: /patterns/flux/ -pumlid: 7SP14eCm20NGg-W13FlU1YFLE0GpyAazVZk-rPkRLSrDqdKwW14l8kUxx0r7hXdYzJA8eTIhKzEy6UnqyeUNJQBjjWm6n2seS_n3Ryql2UgJajxBoAu_ categories: Presentation Tier tags: - Java diff --git a/flyweight/README.md b/flyweight/README.md index 9a0e13e19..d65995755 100644 --- a/flyweight/README.md +++ b/flyweight/README.md @@ -3,7 +3,6 @@ layout: pattern title: Flyweight folder: flyweight permalink: /patterns/flyweight/ -pumlid: HSV94S8m3030Lg20M7-w4OvYAoCh7Xtnq3ty-Eq-MQlaJcdow17JNm26gpIEdkzqidffa4Qfrm2MN1XeSEADsqxEJRU94MJgCD1_W4C-YxZr08hwNqaRPUQGBm00 categories: Structural tags: - Java diff --git a/front-controller/README.md b/front-controller/README.md index c832674dc..a462a08e0 100644 --- a/front-controller/README.md +++ b/front-controller/README.md @@ -3,7 +3,6 @@ layout: pattern title: Front Controller folder: front-controller permalink: /patterns/front-controller/ -pumlid: PSlB3OGm303HLfO24j-t6nCC13bEvC_IFk6yjz6JPgbIE3OAvS_fFkmBe7Zde_ePQnXfwU8adajlK3bkT5Iuy8Tf8wk7f87kf6BGq6R0hlD8xwQTUG9v-SCSslA8nWy0 categories: Presentation Tier tags: - Java diff --git a/guarded-suspension/README.md b/guarded-suspension/README.md index 3e00539a2..35044f9b2 100644 --- a/guarded-suspension/README.md +++ b/guarded-suspension/README.md @@ -3,7 +3,6 @@ layout: pattern title: Guarded Suspension folder: guarded-suspension permalink: /patterns/guarded-suspension/ -pumlid: ROux3W8n30LxJW47IDnJxLLCOcMD4YVoXxq-eQTwev56UeSvgiVejmTBwL4fjDzFzsLF0CKhD_OpNc6aPOgJU2vp0FUuSAVmnW-cIiPDqa9tKZ4OQ1kW1MgbcYniaHXF0VBoH-VGaTVlnK5Iztu1 categories: Concurrency tags: - Java diff --git a/half-sync-half-async/README.md b/half-sync-half-async/README.md index 55891e770..8a091f813 100644 --- a/half-sync-half-async/README.md +++ b/half-sync-half-async/README.md @@ -3,7 +3,6 @@ layout: pattern title: Half-Sync/Half-Async folder: half-sync-half-async permalink: /patterns/half-sync-half-async/ -pumlid: RScv3SCm3030LU819FRPXg5fIm552tnYPFiyjRi3RkbAaYkdoQr5JBy369vrxz7oaSv6XmPhL3e6TCaJ0msU-CAoilTToyG8DdKOw5z0GzcAlvNAN_WZSD1brBHHPmxv0000 categories: Concurrency tags: - Java diff --git a/hexagonal/README.md b/hexagonal/README.md index dc1566625..7d27f4b62 100644 --- a/hexagonal/README.md +++ b/hexagonal/README.md @@ -3,7 +3,6 @@ layout: pattern title: Hexagonal Architecture folder: hexagonal permalink: /patterns/hexagonal/ -pumlid: HSTB4W8X30N0g-W1XkozpPD90LO8L3wEnzUTk-xxq2fvSfhSUiJs1v7XAcr4psSwMrqQh57gcZGaBmICNdZZEDb7qsCZWasT9lm7wln1MmeXZlfVIPjbvvGl pumlformat: svg categories: Architectural tags: diff --git a/intercepting-filter/README.md b/intercepting-filter/README.md index 4981299ad..7d53472a0 100644 --- a/intercepting-filter/README.md +++ b/intercepting-filter/README.md @@ -3,7 +3,6 @@ layout: pattern title: Intercepting Filter folder: intercepting-filter permalink: /patterns/intercepting-filter/ -pumlid: RSfB3i8m303Hgy014k-vZN5DQkIuaJ_q-fGzkz7JtCL8Q-DolUsPAnu0ZcSVadizAzZfi6JBJiS4qJenqU6D7smRXmnh2pFPBM1YN05o_KwyKcoqb-ZFEEcVz_BPLqtz0W00 categories: Behavioral tags: - Java diff --git a/interpreter/README.md b/interpreter/README.md index 8600f0300..be6517962 100644 --- a/interpreter/README.md +++ b/interpreter/README.md @@ -3,7 +3,6 @@ layout: pattern title: Interpreter folder: interpreter permalink: /patterns/interpreter/ -pumlid: JSf13eCm30NHgz034E-vZGaM62Kcih_BzQ6xxjv8yr6hBJT9RzC1Z5Y8dE-oAuvSCyJhPH13gLSdRNapsEdaBy-RXEus3mR4BQXpl21zVnykFmlgVvVqNaRszW00 categories: Behavioral tags: - Java diff --git a/iterator/README.md b/iterator/README.md index 61bd8f6f5..723e7f03c 100644 --- a/iterator/README.md +++ b/iterator/README.md @@ -3,7 +3,6 @@ layout: pattern title: Iterator folder: iterator permalink: /patterns/iterator/ -pumlid: FSV13OGm30NHLg00uljsOu85HeaJsTzB-yjfBwCtgrfjUKXwMovWneV8-IcduiezGxmEWnXA7PsqvSDWfvk_l1qIUjes6H2teCxnWlGDOpW9wdzAUYypU_i1 categories: Behavioral tags: - Java diff --git a/layers/README.md b/layers/README.md index 62b562938..49b74c175 100644 --- a/layers/README.md +++ b/layers/README.md @@ -3,7 +3,6 @@ layout: pattern title: Layers folder: layers permalink: /patterns/layers/ -pumlid: BSR13OCm30NGLSe0n7UsCS62L8w9x6yGszD3t-bDpQhc9kdwEO0H2v7pNVQ68zSCyNeQn53gsQbftWns-lB5yoRHTfi70-8Mr3b-8UL7F4XG_otflOpi-W80 pumlformat: svg categories: Architectural tags: diff --git a/lazy-loading/README.md b/lazy-loading/README.md index 4b7a580c3..d40061293 100644 --- a/lazy-loading/README.md +++ b/lazy-loading/README.md @@ -3,7 +3,6 @@ layout: pattern title: Lazy Loading folder: lazy-loading permalink: /patterns/lazy-loading/ -pumlid: LSXB3W8X303Gg-W1e7jlqu66gIc5zED4JwzRTo_lpjeaEwN9xOpO_W0mlEhWEFD89sjBWpHgMnDOyi90WoU-i7Ho7besHf2fmqJ_0GG_xo8BE-i0YlONDMtMdLE- categories: Other tags: - Java diff --git a/mediator/README.md b/mediator/README.md index 084e59256..3452082ef 100644 --- a/mediator/README.md +++ b/mediator/README.md @@ -3,7 +3,6 @@ layout: pattern title: Mediator folder: mediator permalink: /patterns/mediator/ -pumlid: FSV14SCm20J0Lk82BFxf1akCJKOW3JhizfDNVhkRUktP9AE_Bc2kDr7mKqx5bKSkYJeSuYXr66dFXy517xvvRxBqz7qo8E6BZDSFPDAKCO84zP-IOMMczIy0 categories: Behavioral tags: - Java diff --git a/memento/README.md b/memento/README.md index f43849329..463b5fec0 100644 --- a/memento/README.md +++ b/memento/README.md @@ -3,7 +3,6 @@ layout: pattern title: Memento folder: memento permalink: /patterns/memento/ -pumlid: DSgn4OCm30NGLM00h3xR2AC3SvRiaxx2-g59zugtDgiz3qdlomNC-10vF-Lik7BF4A_388PIXrBh-J3OwUOlRuT4EssR38XRa7Ay81Lz_o11_RkaQvcf_GS0 categories: Behavioral tags: - Java diff --git a/model-view-controller/README.md b/model-view-controller/README.md index 9907b98bd..bc96f7ab1 100644 --- a/model-view-controller/README.md +++ b/model-view-controller/README.md @@ -3,7 +3,6 @@ layout: pattern title: Model-View-Controller folder: model-view-controller permalink: /patterns/model-view-controller/ -pumlid: ROl13SCm201NQGUm-NSRQgE42h258Lw_wR-_qvtkoTOaEwNBuuoOwmNWkEl1SUOx5taR5cHHsr1WoOs13X-yi7HQV5YP645k2nJN3Q2ZavIBQPVVwqFajXJjVwdfMcUgV040 categories: Presentation Tier tags: - Java diff --git a/model-view-presenter/README.md b/model-view-presenter/README.md index 04a1fa559..a3b921ce4 100644 --- a/model-view-presenter/README.md +++ b/model-view-presenter/README.md @@ -3,7 +3,6 @@ layout: pattern title: Model-View-Presenter folder: model-view-presenter permalink: /patterns/model-view-presenter/ -pumlid: ROlR3SGW3C1MkGu0-RzjKeXQJWcWFChwPO3xispvQBrmL0hbp-q-xGkWkFBL_8upZBICxjGzbo7GE1OwAlpmmLJ9sjNJH7VIRY1e6q169KvFevMcakrtI_BoD-HGoJE4Nm00 categories: Presentation Tier tags: - Java diff --git a/module/README.md b/module/README.md index 24bd3f543..39f4dbffd 100644 --- a/module/README.md +++ b/module/README.md @@ -3,7 +3,6 @@ layout: pattern title: Module folder: module permalink: /patterns/module/ -pumlid: JShB3OGm303HLg20nFVjnYGM1CN6ycTfVtFSsnjfzY5jPgUqkLqHwXy0mxUU8wuyqidQ8q4IjJqCO-QBWGOtVh5qyd5AKOmW4mT6Nu2-ZiAekapH_hkcSTNa-GC0 categories: Creational Pattern tags: - Java diff --git a/monad/README.md b/monad/README.md index bf6ee58b8..41edd3d92 100644 --- a/monad/README.md +++ b/monad/README.md @@ -3,7 +3,6 @@ layout: pattern title: Monad folder: monad permalink: /patterns/monad/ -pumlid: 9SR13SCm20NGLPe1OkxTXjWeSMMm1Pza_LRgExsjMntP97syBc35cyZvAMV7bKU6U9q6CPGwbVh8Xy5E7xvvRnBzj7qn86v1ol4BwJHk9AZ_bNGjAtLy0G00 categories: Other tags: - Java diff --git a/monostate/README.md b/monostate/README.md index 8c47b5da4..3576dc659 100644 --- a/monostate/README.md +++ b/monostate/README.md @@ -3,7 +3,6 @@ layout: pattern title: MonoState folder: monostate permalink: /patterns/monostate/ -pumlid: HSV14OGm20NGLjO23FVj1YEZsGaa0nzjVxrvUszfLdlkaju_9p3ZI-HybwFXp2r3l0w364eTIgtdpM2d7r-yxXBji7Ko86v1ol60TDW8C8G4zLr9rp9J-ny0 categories: Creational tags: - Java diff --git a/multiton/README.md b/multiton/README.md index a1154e7bb..0462ff0ec 100644 --- a/multiton/README.md +++ b/multiton/README.md @@ -3,7 +3,6 @@ layout: pattern title: Multiton folder: multiton permalink: /patterns/multiton/ -pumlid: FST14i8m20NGg-W16lRUXgPCYnD81Zxs-hfozzvJlOywf68yBc3bYoZuRgVYghrIea-7E5gVHZhgPd3Gcp-y7P9w-hOOaF0au_o1h0OKqqdG_saLrbRP-080 categories: Creational tags: - Java diff --git a/mute-idiom/README.md b/mute-idiom/README.md index 5c3dbf10b..bb674b648 100644 --- a/mute-idiom/README.md +++ b/mute-idiom/README.md @@ -3,7 +3,6 @@ layout: pattern title: Mute Idiom folder: mute-idiom permalink: /patterns/mute-idiom/ -pumlid: JSf13iCm20NHgxG7iDdtDjH62PKX5luarq-MtSsJvgtUHdR96AyTcEj357pLJR7dDvT4EnpYgEqmqf4NWuD-V7BfidJpCXcGy4N6wmcoX1Jj-lo2ziUQONMcZHi0 categories: Other tags: - Java diff --git a/mutex/README.md b/mutex/README.md index 78cda9060..84755872f 100644 --- a/mutex/README.md +++ b/mutex/README.md @@ -3,7 +3,6 @@ layout: pattern title: Mutex folder: mutex permalink: /patterns/mutex/ -pumlid: 9SR13OCm30NGLSe0n7UsCS62LB69x6zWV2hrdTxKhFRS9Br_3c34GkHybxtXo3L3l9u6CPHwAhMUDuETldpnl4cqtUR1WBW5ASSlf0bvI53_A-bQHcf_0G00 categories: Concurrency tags: - Java diff --git a/null-object/README.md b/null-object/README.md index bfaaeac66..0ed28a0af 100644 --- a/null-object/README.md +++ b/null-object/README.md @@ -3,7 +3,6 @@ layout: pattern title: Null Object folder: null-object permalink: /patterns/null-object/ -pumlid: JSV14SCm20J0Lk829Fxf1cF6bWSX3JhYzfDdVhjRSx4yDCDU5p3NcoZugMV3bNik3HaETLGPdPhbm-2WcpzS3btjz38PqF15dTSFv6bMndwhW1Jo_vhHwynkNm00 categories: Behavioral tags: - Java diff --git a/object-mother/README.md b/object-mother/README.md index cda3336cf..125ecdfe5 100644 --- a/object-mother/README.md +++ b/object-mother/README.md @@ -3,7 +3,6 @@ layout: pattern title: Object Mother folder: object-mother permalink: /patterns/object-mother/ -pumlid: LOr13iCW30JlVKNx0E3UKxxYW9KGWK7sklb-wR6dtLbfj9k15DxRurKbDo_isfudCEsTaj8TZuhJTpVMF0GiY7dqL9lVjDHqqOT2OQk7X4a0grZgPAkaiL-S4Vh0kOYH_vVeskFyVMyiPUKN categories: Creational tags: - Java diff --git a/object-pool/README.md b/object-pool/README.md index 15fee51aa..cf36d9880 100644 --- a/object-pool/README.md +++ b/object-pool/README.md @@ -3,7 +3,6 @@ layout: pattern title: Object Pool folder: object-pool permalink: /patterns/object-pool/ -pumlid: JSV94SCm2030Lk829Fxf1cF6bWU1XYDkFtdcjxiD9Qc3o-LrPQvu0pW-_HnvrLx1JgR9cfrimf1wCD7XnW-sWsESsXPcicl0nFW1RB-PiYqp0KxwVo-VVTMKBm00 categories: Creational tags: - Java diff --git a/observer/README.md b/observer/README.md index 3b3fcd2c5..38a28032f 100644 --- a/observer/README.md +++ b/observer/README.md @@ -3,7 +3,6 @@ layout: pattern title: Observer folder: observer permalink: /patterns/observer/ -pumlid: FSkn4OGm30NHLg00hFow4KO3PcpP8tr1-pYwx6smQz5Suv2mkbp0y1-HyPlEWYlsSB7S5Q98kJSgDLu66ztyy7Q8brEtmO2OEZNs2Uhxl9u9GVv72cjfHAiV categories: Behavioral tags: - Java diff --git a/poison-pill/README.md b/poison-pill/README.md index 8f673ad49..0815b376e 100644 --- a/poison-pill/README.md +++ b/poison-pill/README.md @@ -3,7 +3,6 @@ layout: pattern title: Poison Pill folder: poison-pill permalink: /patterns/poison-pill/ -pumlid: JSZ14SCm20NHLf82BExfXiYCJGOX3NpYzkDZRllsgTwjTgcmnmciV145N-rGdFMkbEZJ8OxMvo2rkXWSzE4lRxka7huj1YGyQN3UGMjgpdkh6Gdwlrl5QAk6_G00 categories: Other tags: - Java diff --git a/private-class-data/README.md b/private-class-data/README.md index 061cc9e77..981208fa3 100644 --- a/private-class-data/README.md +++ b/private-class-data/README.md @@ -3,7 +3,6 @@ layout: pattern title: Private Class Data folder: private-class-data permalink: /patterns/private-class-data/ -pumlid: RShR3SCm243HLTe1RFwx3S4eeSB4uf6itmpGlwkZ-nOZhS7b-ZeoLtm07E--InwrLR3JQScMdSu9edLZeiCNBso3GtPh2pFPBM1YF07BvSBaHeeHRJm_SD8VxkMphvhw0m00 categories: Other tags: - Java diff --git a/producer-consumer/README.md b/producer-consumer/README.md index b3cb56af1..1bb84c35f 100644 --- a/producer-consumer/README.md +++ b/producer-consumer/README.md @@ -3,7 +3,6 @@ layout: pattern title: Producer Consumer folder: producer-consumer permalink: /patterns/producer-consumer/ -pumlid: PSjB3iCW303HgxG70Ezx6zTO2HKso9_a-c7VtUX9y-vA8nkdZTSPiVm3O7ZNeyUPttGscXgiKMaAz94t1XhyyCBIsFkXPM44cpe8-WvODbiIMzcdfspXe7-jQL9NodW0 categories: Concurrency tags: - Java diff --git a/promise/README.md b/promise/README.md index 37fd214b7..fa9556547 100644 --- a/promise/README.md +++ b/promise/README.md @@ -3,7 +3,6 @@ layout: pattern title: Promise folder: promise permalink: /patterns/promise/ -pumlid: DOqv4i8m301xNW4FYDLJvIl2rYHYBDcZWtmVKr3jDZkxUw15IhyzM6lFHcdzVaPCVm8ONkNWEFELJbQ71ccKEWIuvuKhXJT-S6laVEWsCO9C7GHz2KmRmav0KVzUqgJCtsydROjV categories: Concurrency tags: - Java diff --git a/property/README.md b/property/README.md index c1502f75c..0ac5c7a6c 100644 --- a/property/README.md +++ b/property/README.md @@ -3,7 +3,6 @@ layout: pattern title: Property folder: property permalink: /patterns/property/ -pumlid: FSV13OCm30NGLTe1YEziumOBKYMEPN-3s9wUUdlltRJst2Izlmx0OYLolihUSEGdGxnEXIXAdODQpul1Jby-UTaasgwBCI2kGOFZ1pAV9ewR1FMVaZwAvUWF categories: Creational tags: - Java diff --git a/prototype/README.md b/prototype/README.md index 477cd6e6f..4bfeebe19 100644 --- a/prototype/README.md +++ b/prototype/README.md @@ -3,7 +3,6 @@ layout: pattern title: Prototype folder: prototype permalink: /patterns/prototype/ -pumlid: HSV13OCm30NGLM00udktCS62eCInxE-YRj_UUdjlRLfx7fBUbmkmU14vF-Lik7BF4AzJ8OfIvw3Mys6mqyrltWw9Tkfc38XhqE3uWSmd9Zuc9AZ_bVHHB4V_0W00 categories: Creational tags: - Java diff --git a/proxy/README.md b/proxy/README.md index 615c02ced..80593c75e 100644 --- a/proxy/README.md +++ b/proxy/README.md @@ -3,7 +3,6 @@ layout: pattern title: Proxy folder: proxy permalink: /patterns/proxy/ -pumlid: 9SR13OCm30NGLM00udktCS62eCI9x6yesrEfx_Jcehd69c5rEe3X7oBZE-q5HwpXOhahH95oRrHgt0msEldYPHClkow30J5rQko_qB3-VKYG_qjXBOrezGK0 categories: Structural tags: - Java diff --git a/queue-load-leveling/README.md b/queue-load-leveling/README.md index ca73ac34a..13821a54e 100644 --- a/queue-load-leveling/README.md +++ b/queue-load-leveling/README.md @@ -3,7 +3,6 @@ layout: pattern title: Queue based load leveling folder: queue-load-leveling permalink: /patterns/queue-load-leveling/ -pumlid: ROux3W8n30LxJW47IDnJxLLCOcM376VnP_VwX9xgZKOQwMtcg1w3RuykXQDIADztzyEU08fNRjttU8MHbYbEuhdC0PtZmfN26qzCbQmtIGUwauh1G5i0dw2Wn1DhOZg9kpGWB_zy3Xtv-FtOIEhQBm00 categories: Other tags: - Java diff --git a/reactor/README.md b/reactor/README.md index 68461cfdd..ba96f9c68 100644 --- a/reactor/README.md +++ b/reactor/README.md @@ -3,7 +3,6 @@ layout: pattern title: Reactor folder: reactor permalink: /patterns/reactor/ -pumlid: DSR14OGm20NGLjO23FVj1f7Hx2Ga0nzjVxtuJc-f9YrtJM-V4vZn9NA-or5nvfQXBiEWXYAZKsrvCzZfnnUlkqOzR9qCg5jGvtX2hYmOJWfvNz9xcTdR7m00 pumlformat: svg categories: Concurrency tags: diff --git a/reader-writer-lock/README.md b/reader-writer-lock/README.md index 556b9cd85..40b711361 100644 --- a/reader-writer-lock/README.md +++ b/reader-writer-lock/README.md @@ -3,7 +3,6 @@ layout: pattern title: Reader Writer Lock folder: reader-writer-lock permalink: /patterns/reader-writer-lock/ -pumlid: RSZB4S8m303HLg00MtUw4R8cCP5bZpwuVL80jttxx4gIZTFaSKOiVm4OxdhqEFETpaPJWpKgpG5TScEWmGU_M1fxFxGiZ61JXu5-1nXZOolR-gqYaoxWe3-xfeswSiWF categories: Concurrency tags: - Java diff --git a/repository/README.md b/repository/README.md index 501f39f9c..67b3ea44e 100644 --- a/repository/README.md +++ b/repository/README.md @@ -3,7 +3,6 @@ layout: pattern title: Repository folder: repository permalink: /patterns/repository/ -pumlid: JSV13OCm30NGLM00udktCS42eyI9xE-YRjyUUtjlLQij3qblomNCU14vF-LKNBbdYDTX44EfevEsV1ZiTFERjqD2Jzic0-8Mr3b-89SvGZ7yGuBwrvBUoypUlW00 categories: Persistence Tier tags: - Java diff --git a/resource-acquisition-is-initialization/README.md b/resource-acquisition-is-initialization/README.md index df7ee294b..821f220d7 100644 --- a/resource-acquisition-is-initialization/README.md +++ b/resource-acquisition-is-initialization/README.md @@ -3,7 +3,6 @@ layout: pattern title: Resource Acquisition Is Initialization folder: resource-acquisition-is-initialization permalink: /patterns/resource-acquisition-is-initialization/ -pumlid: ZShR3S8m343HLUW0YV_PnhXMQvGumOzMOdhA1lqxkhgBABLSEQqzzeZfJm33isuIUxxIsMXei4QbqK5QdXXeyCO3oyekcvQ94MpgqD4lWB6FDEA2z4bn2HbQn8leHMponNy13hgvrhHUP_Rs0m00 categories: Other tags: - Java diff --git a/semaphore/README.md b/semaphore/README.md index 071e061a7..46ccd7b8e 100644 --- a/semaphore/README.md +++ b/semaphore/README.md @@ -3,7 +3,6 @@ layout: pattern title: Semaphore folder: semaphore permalink: /patterns/semaphore/ -pumlid: HSV14SCm20J0Lk82BFxf1ikCfOn06ZZizfDVVhjRjphobFJnQi2ADv7pKwwEbaU6U9q6CPGwbVh8Xy5E7xvvFoNwPVjYGDo2bEC72b5URRgGeFvNqhMirF45 categories: Concurrency tags: - Java diff --git a/servant/README.md b/servant/README.md index d14d35edf..3e82ab2cf 100644 --- a/servant/README.md +++ b/servant/README.md @@ -3,7 +3,6 @@ layout: pattern title: Servant folder: servant permalink: /patterns/servant/ -pumlid: DSkn4O0m20NGLNG0G-ys63cDbv0SV7HzRUnUy-QYkSOkONKwWU4haV6JZe8pjd2nt1MYIBatAZKU1XjTVFEoYvT3by60c3erzW_qdPiL9CY_KrXB8rfz0G00 categories: Structural tags: - Java diff --git a/service-layer/README.md b/service-layer/README.md index af393947f..9b685d4e3 100644 --- a/service-layer/README.md +++ b/service-layer/README.md @@ -3,7 +3,6 @@ layout: pattern title: Service Layer folder: service-layer permalink: /patterns/service-layer/ -pumlid: LOl93SCm3C1MQGUmzUysgY8aAcJ5q96WszVV_aW2V8gHriRb-ZWoPxm07E--Inxrhc2dqv8jEvq3HEl6H8SFNjWs3jcjJSnaju21iG3MSmbnK_mkuwJ_qij7dpNq1m00 categories: Architectural tags: - Java diff --git a/service-locator/README.md b/service-locator/README.md index 479c9ed0f..974a2a5fe 100644 --- a/service-locator/README.md +++ b/service-locator/README.md @@ -3,7 +3,6 @@ layout: pattern title: Service Locator folder: service-locator permalink: /patterns/service-locator/ -pumlid: NSjB3iCm203HgxG7iDdtDeIWX0fZYqzo_MRTtUX9ynOZhPtBzNLchlW0EDxza3nhgs2dQScMdUO0qRenqU6B5xQTGmvh2pFPBM1WF07FSmbnqqcOqu6J_gsNZxvgw0y0 categories: Structural tags: - Java diff --git a/singleton/README.md b/singleton/README.md index 1be304d8e..90a845846 100644 --- a/singleton/README.md +++ b/singleton/README.md @@ -3,7 +3,6 @@ layout: pattern title: Singleton folder: singleton permalink: /patterns/singleton/ -pumlid: HSV14SCm20J0Lk82BFxf1ikCh0n26ZZizfDVVhjRjwfvIhg-Bc35cyZvAQtZoYD3l4w364gTWxhcms2d3z-ydnAzsRuO4BUWmV43HRUcWcaagF-Lz55M3lq2 categories: Creational tags: - Java diff --git a/specification/README.md b/specification/README.md index dc47f4970..564830653 100644 --- a/specification/README.md +++ b/specification/README.md @@ -3,7 +3,6 @@ layout: pattern title: Specification folder: specification permalink: /patterns/specification/ -pumlid: LSX14i8m20NGg-W16lRU1YcsE0d9mCTUNxVkthoxkVJQjQBVJc3bWoZuQeVXh6UbXao7EfhCGTRhOd3Gcp-yxPfs-BOOqF2amVa3vLAnbmd3ffD2_gTLZBPgz2y0 categories: Behavioral tags: - Java diff --git a/state/README.md b/state/README.md index 34ad8074c..549afa61f 100644 --- a/state/README.md +++ b/state/README.md @@ -3,7 +3,6 @@ layout: pattern title: State folder: state permalink: /patterns/state/ -pumlid: 9SRH3O0m20N0LNG0ox_RO2LQqz867hg-9jxNpKLpZLt2wdG2mrSYuoST1MTiuMAvAqIHSczKQZmCDhhuvcKNBuSkWm4nTMhiNyZ141BaVocifH6jlW00 categories: Behavioral tags: - Java diff --git a/step-builder/README.md b/step-builder/README.md index 65d356c2e..bc636e37a 100644 --- a/step-builder/README.md +++ b/step-builder/README.md @@ -3,7 +3,6 @@ layout: pattern title: Step Builder folder: step-builder permalink: /patterns/step-builder/ -pumlid: LOZ93SCm3C1MQGQmzUysYYqaAcJ5q96i7t_x8KXkh4soKvfypeZfNm33fnuSP-xfPEtI88tQhW4i-M2WmGzlB9sS3oqJ8yZKOQ0lWOLPzcJfAoZQtwXfeyuSyW80 categories: Creational tags: - Java diff --git a/strategy/README.md b/strategy/README.md index 697b6cc88..f07397f67 100644 --- a/strategy/README.md +++ b/strategy/README.md @@ -3,7 +3,6 @@ layout: pattern title: Strategy folder: strategy permalink: /patterns/strategy/ -pumlid: FSV13OCm30NGLM00udktCS4AGOaJsTz5tRwSkBstLiqj3WbhombC_n0PtwbKdB67Y-MX44NAerDjSJFOwE8lRuTuBRfD1iJKgRC_88SnfFn8aD-ai9vczFO7 categories: Behavioral tags: - Java diff --git a/template-method/README.md b/template-method/README.md index 65381d0ce..ad972f06b 100644 --- a/template-method/README.md +++ b/template-method/README.md @@ -3,7 +3,6 @@ layout: pattern title: Template method folder: template-method permalink: /patterns/template-method/ -pumlid: NSZ13SCW30NGLPe1mFTkuu0Lg6n0vZjPlpttzlIEFef6bN1zDM3jDv7paw-E5cTiyJ87P22NQTGr7WOxVVZcL6NtQwJ5WFZOPBn_88WjPKWoGPkL1EN_ShZb5QPV categories: Behavioral tags: - Java diff --git a/thread-pool/README.md b/thread-pool/README.md index 473494ef9..9806fa8e0 100644 --- a/thread-pool/README.md +++ b/thread-pool/README.md @@ -3,7 +3,6 @@ layout: pattern title: Thread Pool folder: thread-pool permalink: /patterns/thread-pool/ -pumlid: JSV14SCW30J0Lk82GFzq8uF6a1624IUx_UIPt-xHhMXK2TTN0zP-4pa_-UfeSSOMBzCWXbpceAxnCDZfmpUdAhjVbXO3uhPfyFw1q5oufZMdag3yFuUFl6Be5m00 categories: Concurrency tags: - Java diff --git a/tolerant-reader/README.md b/tolerant-reader/README.md index 5d1cf80fd..be0085f2c 100644 --- a/tolerant-reader/README.md +++ b/tolerant-reader/README.md @@ -3,7 +3,6 @@ layout: pattern title: Tolerant Reader folder: tolerant-reader permalink: /patterns/tolerant-reader/ -pumlid: NSZ14SCm20NHLf829ExfXaYChGn26lZ4xSVdtFRjSrZJx9AkZnFOyI9olkenSEOxGxmjWnXgMvE6viLWfmz_kNI9SLZP38XRqEIuWx1Kd0t5XVjjGVj_DNtMdLD_ categories: Integration tags: - Java diff --git a/twin/README.md b/twin/README.md index 092032a55..3795236bb 100644 --- a/twin/README.md +++ b/twin/README.md @@ -3,7 +3,6 @@ layout: pattern title: Twin folder: twin permalink: /patterns/twin/ -pumlid: 7SR13OCm30NGLUW0n7UsCS42eyH4zdUpFbNVwNtKQij3qjjo0ICs8kTPJiMLUuPuVGnYAFNff2qdWvrk_l9wIEXfws10t88wno-4gKQ2-az9xsLaRoy0 categories: Creational tags: - Java diff --git a/value-object/README.md b/value-object/README.md index a8e707b05..83223d8a2 100644 --- a/value-object/README.md +++ b/value-object/README.md @@ -3,7 +3,6 @@ layout: pattern title: Value Object folder: value-object permalink: /patterns/value-object/ -pumlid: LSZ13SCm20NGLTe1RExTXX2KECBOmfza_VRQszDxDnVBNJFiTG9pVOY2dteqdBdbqf3XK4ULqQbPFWmEklZcikjgXvV9W8Olwhn-e9ijjOpjKW4fv2zgHgypktq1 categories: Creational tags: - Java diff --git a/visitor/README.md b/visitor/README.md index 23ffc3af7..bda789a18 100644 --- a/visitor/README.md +++ b/visitor/README.md @@ -3,7 +3,6 @@ layout: pattern title: Visitor folder: visitor permalink: /patterns/visitor/ -pumlid: DSR14OGm20NGLhG0mtsxmSWeJa8oyD7sTo_xJczLgoqFIM_B1Spu43c_vLHSkMU8rs4GGwcZaxPy6UnqyyFR8Q6dRPC1SGlg7B_Gew4OJeBwVqdlPMPlNm00 categories: Behavioral tags: - Java From 171c4b30b9e584cb11e334ada4a090e6a7699e55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Tue, 28 Nov 2017 21:30:45 +0200 Subject: [PATCH 091/100] #190 Remove puml posting script --- _scripts/postPumlsToServer.py | 67 ----------------------------------- 1 file changed, 67 deletions(-) delete mode 100644 _scripts/postPumlsToServer.py diff --git a/_scripts/postPumlsToServer.py b/_scripts/postPumlsToServer.py deleted file mode 100644 index 107ea1988..000000000 --- a/_scripts/postPumlsToServer.py +++ /dev/null @@ -1,67 +0,0 @@ -# -# The MIT License -# Copyright (c) 2014-2016 Ilkka Seppälä -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# - -import requests, glob, re, os - -# taken from here: http://stackoverflow.com/a/13641746 -def replace(file, pattern, subst): - # Read contents from file as a single string - file_handle = open(file, 'r') - file_string = file_handle.read() - file_handle.close() - - # Use RE package to allow for replacement (also allowing for (multiline) REGEX) - file_string = (re.sub(pattern, subst, file_string)) - - # Write contents to file. - # Using mode 'w' truncates the file. - file_handle = open(file, 'w') - file_handle.write(file_string) - file_handle.close() - -# list of all puml files -fileList = glob.glob('*/etc/*.puml') -for puml in fileList: - pathSplit = puml.split("/") - # parent folder - parent = pathSplit[0] - # individual artifact/project name - artifact = pathSplit[2].replace(".urm.puml", "") - print "parent: " + parent + "; artifact: " + artifact - - # do a POST to the official plantuml hosting site with a little trick "!includeurl" and raw github content - data = { - 'text': "!includeurl https://raw.githubusercontent.com/iluwatar/java-design-patterns/master/" + puml - } - r = requests.post('http://plantuml.com/plantuml/uml', data=data) - pumlId = r.url.replace("http://plantuml.com/plantuml/uml/", "") - - # the only thing needed to get a png/svg/ascii from the server back - print "Puml Server ID: " + pumlId - - # add the id so jekyll/liquid can use it - if (parent == artifact): - replace("./" + parent + "/README.md", "categories:", "pumlid: {}\\ncategories:".format(pumlId)) - else: - print "I dont want to program this, just add the following lines to the README.md file that corresponds to this puml file '" + puml + "'\npumlid: {}".format(pumlId) - From 7cf897a051373919da850bf9cb2d87357e61573c Mon Sep 17 00:00:00 2001 From: Tschis Date: Thu, 30 Nov 2017 15:15:10 -0300 Subject: [PATCH 092/100] Add presentation for Abstract Factory --- abstract-factory/README.md | 4 + abstract-factory/etc/diagram1.png | Bin 0 -> 58018 bytes abstract-factory/etc/diagram2.png | Bin 0 -> 26347 bytes abstract-factory/etc/presentation.html | 190 +++++++++++++++++++++++++ 4 files changed, 194 insertions(+) create mode 100644 abstract-factory/etc/diagram1.png create mode 100644 abstract-factory/etc/diagram2.png create mode 100644 abstract-factory/etc/presentation.html diff --git a/abstract-factory/README.md b/abstract-factory/README.md index 842e88799..a08cbd35c 100644 --- a/abstract-factory/README.md +++ b/abstract-factory/README.md @@ -179,6 +179,10 @@ Use the Abstract Factory pattern when * Dependency injection in java hides the service class dependencies that can lead to runtime errors that would have been caught at compile time. +## Presentations + +* [Abstract Factory Pattern](etc/presentation.html) + ## Real world examples * [javax.xml.parsers.DocumentBuilderFactory](http://docs.oracle.com/javase/8/docs/api/javax/xml/parsers/DocumentBuilderFactory.html) diff --git a/abstract-factory/etc/diagram1.png b/abstract-factory/etc/diagram1.png new file mode 100644 index 0000000000000000000000000000000000000000..e9c3c84c212d84c26f73ea24a2668dc7a3b7bf21 GIT binary patch literal 58018 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 literal 0 HcmV?d00001 diff --git a/abstract-factory/etc/presentation.html b/abstract-factory/etc/presentation.html new file mode 100644 index 000000000..9e549faf8 --- /dev/null +++ b/abstract-factory/etc/presentation.html @@ -0,0 +1,190 @@ + + + + + Design Patterns - Abstract Factory Presentation + + + + + + + + + \ No newline at end of file From 8a9162f54202a1d086623724dcc9c4c56146f2d0 Mon Sep 17 00:00:00 2001 From: Zafar Khaydarov Date: Sat, 9 Dec 2017 16:25:27 -0500 Subject: [PATCH 093/100] Update PULL_REQUEST_TEMPLATE.md --- PULL_REQUEST_TEMPLATE.md | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md index ba9d9ad69..097054fe5 100644 --- a/PULL_REQUEST_TEMPLATE.md +++ b/PULL_REQUEST_TEMPLATE.md @@ -1,9 +1,15 @@ -### What this PR do? -- Describes the main changes that come with the pull request in present tense -- For instance - "Add correction to facade pattern" -### Context -- +Pull request title + +- Clearly and concisely describes what it does +- Refer to the issue that it solves, if available -> DELETE ME| for detailed contributing instructions see https://github.com/iluwatar/java-design-patterns/wiki/01.-How-to-contribute +Pull request description + +- Describes the main changes that come with the pull request +- Any relevant additional information is provided + + + +> For detailed contributing instructions see https://github.com/iluwatar/java-design-patterns/wiki/01.-How-to-contribute From 506d316529bba49c4ca88897844b0f4b578a832b Mon Sep 17 00:00:00 2001 From: Tschis Date: Mon, 11 Dec 2017 11:45:32 -0300 Subject: [PATCH 094/100] Add Factory Method presentation --- factory-method/README.md | 6 +- factory-method/etc/diagram1.png | Bin 0 -> 59865 bytes factory-method/etc/presentation.html | 185 +++++++++++++++++++++++++++ 3 files changed, 190 insertions(+), 1 deletion(-) create mode 100644 factory-method/etc/diagram1.png create mode 100644 factory-method/etc/presentation.html diff --git a/factory-method/README.md b/factory-method/README.md index 7432a3cb5..ab3739ac3 100644 --- a/factory-method/README.md +++ b/factory-method/README.md @@ -69,7 +69,11 @@ Use the Factory Method pattern when * a class wants its subclasses to specify the objects it creates * classes delegate responsibility to one of several helper subclasses, and you want to localize the knowledge of which helper subclass is the delegate -## Known uses +## Presentations + +* [Factory Method Pattern](etc/presentation.html) + +## Real world examples * [java.util.Calendar](http://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html#getInstance--) * [java.util.ResourceBundle](http://docs.oracle.com/javase/8/docs/api/java/util/ResourceBundle.html#getBundle-java.lang.String-) diff --git a/factory-method/etc/diagram1.png b/factory-method/etc/diagram1.png new file mode 100644 index 0000000000000000000000000000000000000000..fa325edf002a702f3c94e46f488c293df80d1ceb GIT binary patch literal 59865 zcmZ^L1yGw^*DWnYin|kBic4`TP@qLiaW7Wf-QBG~vEowPCAdqlV!<7P2Y2VD?|Z-b z{<-ttnPiejPtG~}?7j9{`$@zXMHzGy5)?Q%IP}k-K7NIRdz}vl_bLe)5w>So^;Qb@ z@yh9|j09Ze7}-8-Pk~-qz3yU#9MykP6642Pj~RU!eZ~E~|Iq8;LIk`EHX9Sz4JU?=)Ov#r zPc4g)uyJmaRaI)XW7}I0By!AufaKE(*3$v6@TjOHw)j}7Tad76h&&g&YU-*!Pc3l27U^?ieR0>)+wL?R!dvQqiM)kZ=f3p+Zu#?o-)O2cd^H}rD5c`r&CDWw8QyD=9bY-XTjHr^ghKmg;OQ3&r%56_3FWa%t) zPHj#*|AmF?nDrS|^}X!7kk}bXeli(ACJ z3@Q|U3aoPSf<~y^X{T;AQW8ckMp0XRI6BR&x<;p?#_FzeAUW<|o;v*m3P?3lU~%h7 zXDprf&{ovNTBMHF-I{x&X3l%NC@x_zJgt7Jqf7PPpz zg#vXd$)4{)tdSxyLM81Zun1>m`G#F1h4arA&^nscTTM;5F?o zP1SVo@Mz1K8NK;|Pl|<4)_PJT>(pSqsM4uyKY@jbb~c0iZ=ng$?xS{12B8o1Hzk`3Z3oxi7F<()a^q1ji2)LS=?u$>^)qn>sVn@CD zE$jrh4++pb3J3A2sy-P zT2ZXFjyxFI*2*_m`lvbu_pc>@%z)v^a}UW+j*z zk_G~K^sgLh0OYL|DZlb+qN7A*O~jN=TlCW9T2x7Ow=@S%+zdG7OiEAiU|rMvYu71} ztO;kOaZ&vQL+(dHA@kJe$=Euyy|AvEv>iY;S^p3KyNj#$-FdPmPQzJ$VHiaf2F>T~ zQv%He!&!O7aQ-vnF`@t88AlB8&ss+Q@nfwwtGA_X2tk+P_Pa>=czVV~dNdkza|;pn z4lNlsZIIPaPj>UMg>{S*w)hUr<#kS5R;;Ozb%cPDLYzE2oLf6BLa98=0lehqMNSKl z(lTR4M*CH;ho=7(^pk`&FpSnduU5j1 z4IxB26kS+1@OVDs%0?3tFQGC+7j_P8SkvmIgaQ4FJPvpbr(n+*dD6gcqM@ewKtUtc zg*=|C%tSH@vIPPUk1-_uV+gvHi;u0Ni=+!tTFDpR;?SiHQB|4urSEk3(VcprhB_Pw zQnKx=8`XvPG|VHPQ5aWpmej13!{(_o3vHt!9S

nEm})(v>`pZJ%UfS7zU9=-lRE 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 literal 0 HcmV?d00001 diff --git a/factory-method/etc/presentation.html b/factory-method/etc/presentation.html new file mode 100644 index 000000000..a78057836 --- /dev/null +++ b/factory-method/etc/presentation.html @@ -0,0 +1,185 @@ + + + + + Design Patterns - Factory Method Presentation + + + + + + + + + \ No newline at end of file From 4dbf646b37ddaec5da26a3892c1374e55b8e4aaa Mon Sep 17 00:00:00 2001 From: Tschis Date: Mon, 11 Dec 2017 13:45:10 -0300 Subject: [PATCH 095/100] Add Command presentation --- command/etc/diagram.png | Bin 0 -> 57571 bytes command/etc/presentation.html | 243 ++++++++++++++++++++++++++++++++++ 2 files changed, 243 insertions(+) create mode 100644 command/etc/diagram.png create mode 100644 command/etc/presentation.html diff --git a/command/etc/diagram.png b/command/etc/diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..1d3494292b82a5c7cbde7d5dc26c238ab5661bdb GIT binary patch literal 57571 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

_*pGf#8 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 + + + + Design Patterns - Command Presentation + + + + + + + + + \ No newline at end of file From 7e7a0c83f55c0243191d3b5453a3b3e73a3f2ef5 Mon Sep 17 00:00:00 2001 From: Tschis Date: Mon, 11 Dec 2017 13:48:29 -0300 Subject: [PATCH 096/100] Update readme with presentation link --- command/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/command/README.md b/command/README.md index 987ec6a34..614654f5b 100644 --- a/command/README.md +++ b/command/README.md @@ -36,6 +36,10 @@ Use the Command pattern when you want to * implement callback functionality * implement the undo functionality +## Presentations + +* [Command Pattern](etc/presentation.html) + ## Real world examples * [java.lang.Runnable](http://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html) From 176bb85f404b7140bdec5fda285505f341a079a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=B3=E9=98=B3?= <260893248@qq.com> Date: Tue, 12 Dec 2017 20:40:16 +0800 Subject: [PATCH 097/100] fix typo 'exepcted'->'expected' 'expectedVisibilty'->'expectedVisibility' --- command/src/test/java/com/iluwatar/command/CommandTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/command/src/test/java/com/iluwatar/command/CommandTest.java b/command/src/test/java/com/iluwatar/command/CommandTest.java index 5c3fa6fe1..9b8436a77 100644 --- a/command/src/test/java/com/iluwatar/command/CommandTest.java +++ b/command/src/test/java/com/iluwatar/command/CommandTest.java @@ -81,13 +81,13 @@ public class CommandTest { * @param goblin a goblin object whose state is to be verified against other parameters * @param expectedName expectedName of the goblin * @param expectedSize expected size of the goblin - * @param expectedVisibilty exepcted visibility of the goblin + * @param expectedVisibility expected visibility of the goblin */ private void verifyGoblin(Goblin goblin, String expectedName, Size expectedSize, - Visibility expectedVisibilty) { + Visibility expectedVisibility) { assertEquals("Goblin's name must be same as expectedName", expectedName, goblin.toString()); assertEquals("Goblin's size must be same as expectedSize", expectedSize, goblin.getSize()); - assertEquals("Goblin's visibility must be same as expectedVisibility", expectedVisibilty, + assertEquals("Goblin's visibility must be same as expectedVisibility", expectedVisibility, goblin.getVisibility()); } } From 8312e09f6eab6ca37f11e7f0c534cbc67542d967 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=B3=E9=98=B3?= <260893248@qq.com> Date: Thu, 14 Dec 2017 16:15:02 +0800 Subject: [PATCH 098/100] replace 'a' with 'an' [A or An](https://www.a-or-an.com/a_an/axe) --- .../java/com/iluwatar/factory/method/FactoryMethodTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/factory-method/src/test/java/com/iluwatar/factory/method/FactoryMethodTest.java b/factory-method/src/test/java/com/iluwatar/factory/method/FactoryMethodTest.java index 69736855c..71afc5549 100644 --- a/factory-method/src/test/java/com/iluwatar/factory/method/FactoryMethodTest.java +++ b/factory-method/src/test/java/com/iluwatar/factory/method/FactoryMethodTest.java @@ -53,7 +53,7 @@ public class FactoryMethodTest { } /** - * Testing {@link OrcBlacksmith} to produce a AXE asserting that the Weapon is an instance + * Testing {@link OrcBlacksmith} to produce an AXE asserting that the Weapon is an instance * of {@link OrcWeapon}. */ @Test From 6c4de3bcef978bbdec4e7bbb07e6f67d412385c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Mon, 25 Dec 2017 11:30:24 +0200 Subject: [PATCH 099/100] Fix some tags and categories --- converter/README.md | 2 +- eip-aggregator/README.md | 4 ++-- eip-splitter/README.md | 4 ++-- eip-wire-tap/README.md | 4 ++-- marker/README.md | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/converter/README.md b/converter/README.md index 190ae8bfc..79b539422 100644 --- a/converter/README.md +++ b/converter/README.md @@ -3,7 +3,7 @@ layout: pattern title: Converter folder: converter permalink: /patterns/converter/ -categories: +categories: Business Tier tags: - Java - Difficulty-Beginner diff --git a/eip-aggregator/README.md b/eip-aggregator/README.md index ec8454f63..a1dc18ea8 100644 --- a/eip-aggregator/README.md +++ b/eip-aggregator/README.md @@ -3,11 +3,11 @@ layout: pattern title: EIP Aggregator folder: eip-aggregator permalink: /patterns/eip-aggregator/ -categories: Enterprise integration +categories: Integration tags: - Java - Difficulty-Intermittent - - Enterprise integration + - EIP --- ## Intent diff --git a/eip-splitter/README.md b/eip-splitter/README.md index b59147504..51a917bad 100644 --- a/eip-splitter/README.md +++ b/eip-splitter/README.md @@ -3,11 +3,11 @@ layout: pattern title: EIP Splitter folder: eip-splitter permalink: /patterns/eip-splitter/ -categories: Enterprise integration +categories: Integration tags: - Java - Difficulty-Intermittent - - Enterprise integration + - EIP --- ## Intent diff --git a/eip-wire-tap/README.md b/eip-wire-tap/README.md index d2742aa31..31cbd9123 100644 --- a/eip-wire-tap/README.md +++ b/eip-wire-tap/README.md @@ -3,11 +3,11 @@ layout: pattern title: EIP Wire Tap folder: eip-wire-tap permalink: /patterns/eip-wire-tap/ -categories: Enterprise integration +categories: Integration tags: - Java - Difficulty-Intermittent - - Enterprise integration + - EIP --- ## Intent diff --git a/marker/README.md b/marker/README.md index 5bcdf9664..6f5fc1e91 100644 --- a/marker/README.md +++ b/marker/README.md @@ -3,7 +3,7 @@ layout: pattern title: Marker Interface folder: marker permalink: /patterns/marker/ -categories: Design +categories: Other tags: - Java - Difficulty-Beginner From 04f2be64c668762bd505828c730e56d7f48ff9a9 Mon Sep 17 00:00:00 2001 From: Zafar Khaydarov Date: Mon, 25 Dec 2017 08:52:52 -0500 Subject: [PATCH 100/100] Update README.md add CII Best Practices badge --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6eed9561b..d7f2f154c 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ [![License MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/iluwatar/java-design-patterns/master/LICENSE.md) [![Join the chat at https://gitter.im/iluwatar/java-design-patterns](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/iluwatar/java-design-patterns?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Quality Gate](https://sonarqube.com/api/badges/gate?key=com.iluwatar%3Ajava-design-patterns)](https://sonarqube.com/dashboard/index/com.iluwatar%3Ajava-design-patterns) +[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/1503/badge)](https://bestpractices.coreinfrastructure.org/projects/1503) # Introduction