From ca92c79c1541bdb6470bcad6cac3b2d58e7e7a03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Tue, 26 Mar 2024 20:12:36 +0200 Subject: [PATCH 001/580] docs: Improve Client-Session docs --- client-session/README.md | 76 +++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/client-session/README.md b/client-session/README.md index 82204eb3495d..c88c019fe00a 100644 --- a/client-session/README.md +++ b/client-session/README.md @@ -1,51 +1,33 @@ --- -title: Client Session Pattern -category: Architectural +title: Client Session +category: Behavioral language: en tags: -- Decoupling + - Session management + - Web development --- -## Name +## Also known as -[Client Session pattern](https://dzone.com/articles/practical-php-patterns/practical-php-patterns-client) +* User session ## Intent -- Create stateless servers that removes the problem of clustering, as users can switch between servers seamlessly. -- Makes data more resilient in case of server fail-over. -- Works well with smaller data sizes. +The Client Session design pattern aims to maintain a user's state and data across multiple requests within a web application, ensuring a continuous and personalized user experience. ## Explanation Real-World Example -> You're looking to create a data management app allowing users to send requests to the server to -> modify and make changes to data stored on their devices. These requests are small in size and the -> data is individual to each user, negating the need for a large scale database implementation. -> Using the client session pattern, you are able to handle multiple concurrent requests, load -> balancing clients across different servers with ease due to servers remaining stateless. You also -> remove the need to store session IDs on the server side due to clients providing all the -> information that a server needs to perform their process. +> You're looking to create a data management app allowing users to send requests to the server to modify and make changes to data stored on their devices. These requests are small and the data is individual to each user, negating the need for a large scale database implementation. Using the client session pattern, you are able to handle multiple concurrent requests, load balancing clients across different servers with ease due to servers remaining stateless. You also remove the need to store session IDs on the server side due to clients providing all the information that a server needs to perform their process. In Plain words -> Instead of storing information about the current client and the information being accessed on the -> server, it is maintained client side only. Client has to send session data with each request to -> the server and has to send an updated state back to the client, which is stored on the clients -> machine. The server doesn't have to store the client information. -> ([ref](https://dzone.com/articles/practical-php-patterns/practical-php-patterns-client)) +> Instead of storing information about the current client and the information being accessed on the server, it is maintained client side only. Client has to send session data with each request to the server and has to send an updated state back to the client, which is stored on the clients machine. The server doesn't have to store the client information. ([ref](https://dzone.com/articles/practical-php-patterns/practical-php-patterns-client)) **Programmatic Example** -Here is the sample code to describe the client-session pattern. In the below code we are first -creating an instance of the Server. This server instance will then be used to get Session objects -for two clients. As you can see from the code below the Session object can be used to store any -relevant information that are required by the server to process the client request. These session -objects will then be passed on with every Request to the server. The Request will have the Session -object that stores the relevant client details along with the required data for processing the -request. The session information in every request helps the server identify the client and process -the request accordingly. +Here is the sample code to describe the client-session pattern. In the below code we are first creating an instance of the Server. This server instance will then be used to get Session objects for two clients. As you can see from the code below the Session object can be used to store any relevant information that are required by the server to process the client request. These session objects will then be passed on with every Request to the server. The Request will have the Session object that stores the relevant client details along with the required data for processing the request. The session information in every request helps the server identify the client and process the request accordingly. ```java public class App { @@ -96,19 +78,39 @@ public class Request { Use the client state pattern when: -- Processing smaller amounts of data to prevent larger requests and response sizes. -- Remove the need for servers to save client states. Doing so also removes the need to store session IDs. -- Clustering is an issue and needs to be avoided. Stateless servers allow clients to be easily distributed across servers. -- Creates resilience from data losses due to server fails. +* Web applications requiring user authentication and authorization. +* Applications needing to track user activities and preferences over multiple requests or visits. +* Systems where server resources need to be optimized by offloading state management to the client side. + +## Known Uses + +* E-commerce websites to track shopping cart contents across sessions. +* Online platforms that offer personalized content based on user preferences and history. +* Web applications requiring user login to access personalized or secured content. ## Consequences -- The server is stateless. Any compute API will not store any data. -- Struggles to deal with large amounts of data. Creates longer send and receive times due to larger amounts of session data to manage. -- Security. All data is stored on the client's machine. This means that any vulnerabilities on the clients side can expose all data being sent and received by the server. +Benefits: + +* Improved server performance by reducing the need to store user state on the server. +* Enhanced user experience through personalized content and seamless navigation across different parts of the application. +* Flexibility in managing sessions through various client-side storage mechanisms (e.g., cookies, Web Storage API). + +Trade-offs: + +* Potential security risks if sensitive information is stored in client sessions without proper encryption and validation. +* Dependence on client-side capabilities and settings, such as cookie policies, which can vary across browsers and user configurations. +* Increased complexity in session management logic, especially in handling session expiration, renewal, and synchronization across multiple devices or tabs. + +## Related Patterns +* Server Session: Often used in conjunction with the Client Session pattern to provide a balance between client-side efficiency and server-side control. +* [Singleton](https://java-design-patterns.com/patterns/singleton/): Ensuring a single instance of a user's session throughout the application. +* [State](https://java-design-patterns.com/patterns/state/): Managing state transitions in a session, such as authenticated, guest, or expired states. ## Credits -- [Dzone - Practical PHP patterns](https://dzone.com/articles/practical-php-patterns/practical-php-patterns-client) -- [Client Session State Design Pattern - Ram N Java](https://www.youtube.com/watch?v=ycOSj9g41pc) +* [DZone - Practical PHP patterns](https://dzone.com/articles/practical-php-patterns/practical-php-patterns-client) +* [Client Session State Design Pattern - Ram N Java](https://www.youtube.com/watch?v=ycOSj9g41pc) +* [Professional Java for Web Applications](https://amzn.to/4aazY59) +* [Securing Web Applications with Spring Security](https://amzn.to/3PCCEA1) From 6816c34218b5e5d732bb2784e76fedfc8141d86b Mon Sep 17 00:00:00 2001 From: Jun Kang Date: Wed, 27 Mar 2024 03:23:06 +0900 Subject: [PATCH 002/580] deps: Updated the imports in code of the single table inheritance pattern for SpringBoot 3.x (#2847) * Updated the imports in code of the single table inheritance pattern for Spring Boot 3.x #2825 Change javax library to jakarta * add pom.xml --- single-table-inheritance/pom.xml | 16 +++++++++++++++- .../src/main/java/com/iluwatar/entity/Car.java | 4 ++-- .../main/java/com/iluwatar/entity/Freighter.java | 4 ++-- .../src/main/java/com/iluwatar/entity/Train.java | 4 ++-- .../src/main/java/com/iluwatar/entity/Truck.java | 4 ++-- .../main/java/com/iluwatar/entity/Vehicle.java | 14 +++++++------- 6 files changed, 30 insertions(+), 16 deletions(-) diff --git a/single-table-inheritance/pom.xml b/single-table-inheritance/pom.xml index 159a683bea21..2bef8842e07a 100644 --- a/single-table-inheritance/pom.xml +++ b/single-table-inheritance/pom.xml @@ -10,12 +10,26 @@ single-table-inheritance - + + + + org.springframework.boot + spring-boot-dependencies + pom + 3.2.3 + import + + + org.springframework.boot spring-boot-starter-data-jpa + + jakarta.xml.bind + jakarta.xml.bind-api + com.h2database h2 diff --git a/single-table-inheritance/src/main/java/com/iluwatar/entity/Car.java b/single-table-inheritance/src/main/java/com/iluwatar/entity/Car.java index c8d3185fdce9..10e7fb2f12fd 100644 --- a/single-table-inheritance/src/main/java/com/iluwatar/entity/Car.java +++ b/single-table-inheritance/src/main/java/com/iluwatar/entity/Car.java @@ -1,7 +1,7 @@ package com.iluwatar.entity; -import javax.persistence.DiscriminatorValue; -import javax.persistence.Entity; +import jakarta.persistence.DiscriminatorValue; +import jakarta.persistence.Entity; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; diff --git a/single-table-inheritance/src/main/java/com/iluwatar/entity/Freighter.java b/single-table-inheritance/src/main/java/com/iluwatar/entity/Freighter.java index ce35f3df37df..0c20aacefe1c 100644 --- a/single-table-inheritance/src/main/java/com/iluwatar/entity/Freighter.java +++ b/single-table-inheritance/src/main/java/com/iluwatar/entity/Freighter.java @@ -1,7 +1,7 @@ package com.iluwatar.entity; -import javax.persistence.DiscriminatorValue; -import javax.persistence.Entity; +import jakarta.persistence.DiscriminatorValue; +import jakarta.persistence.Entity; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; diff --git a/single-table-inheritance/src/main/java/com/iluwatar/entity/Train.java b/single-table-inheritance/src/main/java/com/iluwatar/entity/Train.java index 10a74f36ac5a..d7bc226bea27 100644 --- a/single-table-inheritance/src/main/java/com/iluwatar/entity/Train.java +++ b/single-table-inheritance/src/main/java/com/iluwatar/entity/Train.java @@ -1,7 +1,7 @@ package com.iluwatar.entity; -import javax.persistence.DiscriminatorValue; -import javax.persistence.Entity; +import jakarta.persistence.DiscriminatorValue; +import jakarta.persistence.Entity; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; diff --git a/single-table-inheritance/src/main/java/com/iluwatar/entity/Truck.java b/single-table-inheritance/src/main/java/com/iluwatar/entity/Truck.java index e389666e4dcc..26ae2724c7bc 100644 --- a/single-table-inheritance/src/main/java/com/iluwatar/entity/Truck.java +++ b/single-table-inheritance/src/main/java/com/iluwatar/entity/Truck.java @@ -1,7 +1,7 @@ package com.iluwatar.entity; -import javax.persistence.DiscriminatorValue; -import javax.persistence.Entity; +import jakarta.persistence.DiscriminatorValue; +import jakarta.persistence.Entity; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/single-table-inheritance/src/main/java/com/iluwatar/entity/Vehicle.java b/single-table-inheritance/src/main/java/com/iluwatar/entity/Vehicle.java index 901a37705455..814894d64d28 100644 --- a/single-table-inheritance/src/main/java/com/iluwatar/entity/Vehicle.java +++ b/single-table-inheritance/src/main/java/com/iluwatar/entity/Vehicle.java @@ -1,12 +1,12 @@ package com.iluwatar.entity; -import javax.persistence.DiscriminatorColumn; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Inheritance; -import javax.persistence.InheritanceType; +import jakarta.persistence.DiscriminatorColumn; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Inheritance; +import jakarta.persistence.InheritanceType; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; From be3a1844456fab4289fd2ef1b2d86e2f7e54d188 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 26 Mar 2024 20:23:57 +0200 Subject: [PATCH 003/580] docs: add junhkang as a contributor for code (#2849) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 24343881a7ba..8ed210af3585 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -3028,6 +3028,15 @@ "contributions": [ "code" ] + }, + { + "login": "junhkang", + "name": "Jun Kang", + "avatar_url": "https://avatars.githubusercontent.com/u/20232155?v=4", + "profile": "https://junhkang.tistory.com/", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 28ccb332fcf5..5f192ad7e4bf 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=iluwatar_java-design-patterns&metric=coverage)](https://sonarcloud.io/dashboard?id=iluwatar_java-design-patterns) [![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) -[![All Contributors](https://img.shields.io/badge/all_contributors-332-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-333-orange.svg?style=flat-square)](#contributors-)
@@ -502,6 +502,7 @@ This project is licensed under the terms of the MIT license. Sashir Estela
Sashir Estela

💻 omahs
omahs

📖 leif e.
leif e.

💻 + Jun Kang
Jun Kang

💻 From b5ddd621453a07f7530733c5834715cd457770db Mon Sep 17 00:00:00 2001 From: Kishalay Pandey Date: Tue, 26 Mar 2024 23:57:17 +0530 Subject: [PATCH 004/580] feat: Implemenation of the Serialized Lob Pattern (#2795) * #1596:Adding module for SLOB Pattern * #1596:Adding Interface for Serializers * #1596:Adding Objects * #1596:Adding BLOB Based Serializer * #1596:Implemented Clob Based Serializer * #1596:Implemented Service for DB operations * #1596:Implemented basic flow using Clob Serializer * #1596:Added H2 DB Dependency * #1596:Added Java Doc Stubs * Updating Objects * #1596:Completed Clob Serializer along with Tests * #1596:Completed Slob Serializer along with Tests * #1596:Completed Blob Serializer along with Tests * #1596:Updated DatabaseService to handle Blob and Clob Data * #1596:Added UML and updated README.md * #1596:Updated data types for DB * #1596:Code Style Formatting Cnames * Adding Java Docs * #1596:Reformatted as per Code Style * #1596:Updating Java Doc * #1596:Updating Main function to handle both Serializers * #1596:Updated Java Docs * #1596:Updated Java Docs * #1596:Updated Java Docs and formatting * #1596:Updated Java Docs and formatting * #1596:Adding Java Docs * #1596:Reformatted as per Code Style * #1596:Updating Java Doc * #1596:Updating Main function to handle both Serializers * #1596:Updated Java Docs * #1596:Updated Java Docs * #1596:Updated Java Docs and formatting * #1596:Updated Java Docs and formatting * #1596:Updated Java Docs and formatting * #1596:Updated Java Docs and formatting * #1596:Updated README.md * #1596:Updated Java Docs and README.md * #1596:Updated Extension * #1596:Updated README.md * #1596:Updated Documentation as per review comments * #1596:Updated Documentation as per review comments * #1596: Updated README.md * #1596:Updated Documentation as per review comments * #1596: Added SLOB Module --------- Co-authored-by: SHRADDHAP18 <87650482+SHRADDHAP18@users.noreply.github.com> --- pom.xml | 1 + slob/README.md | 354 ++++++++++++++++++ slob/etc/slob.urm.png | Bin 0 -> 40078 bytes slob/etc/slob.urm.uml | 49 +++ slob/pom.xml | 78 ++++ slob/src/main/java/com/iluwatar/slob/App.java | 144 +++++++ .../slob/dbservice/DatabaseService.java | 157 ++++++++ .../java/com/iluwatar/slob/lob/Animal.java | 131 +++++++ .../java/com/iluwatar/slob/lob/Forest.java | 121 ++++++ .../java/com/iluwatar/slob/lob/Plant.java | 80 ++++ .../slob/serializers/BlobSerializer.java | 83 ++++ .../slob/serializers/ClobSerializer.java | 107 ++++++ .../slob/serializers/LobSerializer.java | 115 ++++++ .../test/java/com/iluwatar/slob/AppTest.java | 143 +++++++ 14 files changed, 1563 insertions(+) create mode 100644 slob/README.md create mode 100644 slob/etc/slob.urm.png create mode 100644 slob/etc/slob.urm.uml create mode 100644 slob/pom.xml create mode 100644 slob/src/main/java/com/iluwatar/slob/App.java create mode 100644 slob/src/main/java/com/iluwatar/slob/dbservice/DatabaseService.java create mode 100644 slob/src/main/java/com/iluwatar/slob/lob/Animal.java create mode 100644 slob/src/main/java/com/iluwatar/slob/lob/Forest.java create mode 100644 slob/src/main/java/com/iluwatar/slob/lob/Plant.java create mode 100644 slob/src/main/java/com/iluwatar/slob/serializers/BlobSerializer.java create mode 100644 slob/src/main/java/com/iluwatar/slob/serializers/ClobSerializer.java create mode 100644 slob/src/main/java/com/iluwatar/slob/serializers/LobSerializer.java create mode 100644 slob/src/test/java/com/iluwatar/slob/AppTest.java diff --git a/pom.xml b/pom.xml index 44178fd1af54..2e1b3312b38b 100644 --- a/pom.xml +++ b/pom.xml @@ -215,6 +215,7 @@ single-table-inheritance dynamic-proxy gateway + slob diff --git a/slob/README.md b/slob/README.md new file mode 100644 index 000000000000..13ef6cb63863 --- /dev/null +++ b/slob/README.md @@ -0,0 +1,354 @@ +--- +title: Serialized LOB +category: Structural +language: en +tag: + - Data access +--- + +## Intent + +* Object models often contain complicated graphs of small objects. Much of the information in these + structures isn’t in the objects but in the links between them. +* Objects don’t have to be persisted as table rows related to each other. +* Another form of persistence is serialization, where a whole graph of objects is written out as a + single large object (LOB) in a table. + +## Explanation + +**In plain words** + +> The Forest here represents the object graph. +> A forest contains animals and plants. As is in real life the forest object contains plants and +> animals where some animals eat other animals and some eat only plants. +> * These relationships are maintained in the Forest Object. +> * There are 2 types of Serializers available ClobSerializer and BlobSerializer. +> * ClobSerializer uses character or textual based serialization, here the Object graph is converted +> * to XML and then stored as text in DB. +> * BlobSerializer uses binary data for serialization, here the Object graph is converted to Byte +> * Array and then stored as a blob in DB. + +**Programmatic Example** + +* Here is the `Animal` class. It represents the Animal object in the Forest. It contains the name of + the animals in the forest and details of what they eat from the forest plants/animals or both. + +```java +/** + * Creates an object Forest which contains animals and plants as its constituents. Animals may eat + * plants or other animals in the forest. + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Forest implements Serializable { + + private String name; + private final Set animals = new HashSet<>(); + private final Set plants = new HashSet<>(); + + /** + * Provides the representation of Forest in XML form. + * + * @return XML Element + */ + public Element toXmlElement() throws ParserConfigurationException { + Document xmlDoc = getXmlDoc(); + + Element forestXml = xmlDoc.createElement("Forest"); + forestXml.setAttribute("name", name); + + Element animalsXml = xmlDoc.createElement("Animals"); + for (Animal animal : animals) { + Element animalXml = animal.toXmlElement(xmlDoc); + animalsXml.appendChild(animalXml); + } + forestXml.appendChild(animalsXml); + + Element plantsXml = xmlDoc.createElement("Plants"); + for (Plant plant : plants) { + Element plantXml = plant.toXmlElement(xmlDoc); + plantsXml.appendChild(plantXml); + } + forestXml.appendChild(plantsXml); + return forestXml; + } + + /** + * Returns XMLDoc to use for XML creation. + * + * @return XML DOC Object + * @throws ParserConfigurationException {@inheritDoc} + */ + private Document getXmlDoc() throws ParserConfigurationException { + return DocumentBuilderFactory.newDefaultInstance().newDocumentBuilder().newDocument(); + } + + /** + * Parses the Forest Object from the input XML Document. + * + * @param document the XML document from which the Forest is to be parsed + */ + public void createObjectFromXml(Document document) { + name = document.getDocumentElement().getAttribute("name"); + NodeList nodeList = document.getElementsByTagName("*"); + iterateXmlForAnimalAndPlants(nodeList, animals, plants); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("\n"); + sb.append("Forest Name = ").append(name).append("\n"); + sb.append("Animals found in the ").append(name).append(" Forest: \n"); + for (Animal animal : animals) { + sb.append("\n--------------------------\n"); + sb.append(animal.toString()); + sb.append("\n--------------------------\n"); + } + sb.append("\n"); + sb.append("Plants in the ").append(name).append(" Forest: \n"); + for (Plant plant : plants) { + sb.append("\n--------------------------\n"); + sb.append(plant.toString()); + sb.append("\n--------------------------\n"); + } + return sb.toString(); + } +} +``` + +* Here is the `LobSerializer` abstract class. It provides the specification to serialize and + deserialize the input object and persist and load that object into a DB. + +```java +/** + * A LobSerializer can be used to create an instance of a serializer which can serialize and + * deserialize an object and persist and load that object into a DB. from their Binary + * Representation. + */ +public abstract class LobSerializer implements Serializable, Closeable { + + private final transient DatabaseService databaseService; + + /** + * Constructor initializes {@link LobSerializer#databaseService}. + * + * @param dataTypeDb Input provides type of Data to be stored by the Data Base Service + * @throws SQLException If any issue occurs during instantiation of DB Service or during startup. + */ + protected LobSerializer(String dataTypeDb) throws SQLException { + databaseService = new DatabaseService(dataTypeDb); + databaseService.startupService(); + } + + /** + * Provides the specification to Serialize the input object. + * + * @param toSerialize Input Object to serialize + * @return Serialized Object + * @throws ParserConfigurationException if any issue occurs during parsing of input object + * @throws TransformerException if any issue occurs during Transformation + * @throws IOException if any issues occur during reading object + */ + public abstract Object serialize(Forest toSerialize) + throws ParserConfigurationException, TransformerException, IOException; + + /** + * Saves the object to DB with the provided ID. + * + * @param id key to be sent to DB service + * @param name Object name to store in DB + * @param object Object to store in DB + * @return ID with which the object is stored in DB + * @throws SQLException if any issue occurs while saving to DB + */ + public int persistToDb(int id, String name, Object object) throws SQLException { + databaseService.insert(id, name, object); + return id; + } + + /** + * Loads the object from db using the ID and column name. + * + * @param id to query the DB + * @param columnName column from which object is to be extracted + * @return Object from DB + * @throws SQLException if any issue occurs while loading from DB + */ + public Object loadFromDb(int id, String columnName) throws SQLException { + return databaseService.select(id, columnName); + } + + /** + * Provides the specification to Deserialize the input object. + * + * @param toDeserialize object to deserialize + * @return Deserialized Object + * @throws ParserConfigurationException If issue occurs during parsing of input object + * @throws IOException if any issues occur during reading object + * @throws SAXException if any issues occur during reading object for XML parsing + */ + public abstract Forest deSerialize(Object toDeserialize) + throws ParserConfigurationException, IOException, SAXException, ClassNotFoundException; + + @Override + public void close() { + try { + databaseService.shutDownService(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } +} +``` + +* Here is the `ClobSerializer` class. It extends the `LobSerializer` abstract class and provides the + implementation to serialize and deserialize the input object and persist and load that object into + a DB using ClobSerializer. +* Objects are serialized using character or textual based serialization + using XML to represent the object graph. + +```java + +/** + * Creates a Serializer that uses Character based serialization and deserialization of objects graph + * to and from XML Representation. + */ +public class ClobSerializer extends LobSerializer { + + public static final String TYPE_OF_DATA_FOR_DB = "TEXT"; + + public ClobSerializer() { + super(TYPE_OF_DATA_FOR_DB); + } + + /** + * Converts the input node to its XML String Representation. + * + * @param node XML Node that is to be converted to string + * @return String representation of XML parsed from the Node + * @throws TransformerException If any issues occur in Transformation from Node to XML + */ + private static String elementToXmlString(Element node) throws TransformerException { + StringWriter sw = new StringWriter(); + Transformer t = TransformerFactory.newDefaultInstance().newTransformer(); + t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); + t.setOutputProperty(OutputKeys.INDENT, "yes"); + t.transform(new DOMSource(node), new StreamResult(sw)); + return sw.toString(); + } + + /** + * Serializes the input object graph to its XML Representation using DOM Elements. + * + * @param forest Object which is to be serialized + * @return Serialized object + * @throws ParserConfigurationException If any issues occur in parsing input object + * @throws TransformerException If any issues occur in Transformation from Node to XML + */ + @Override + public Object serialize(Forest forest) throws ParserConfigurationException, TransformerException { + Element xmlElement = forest.toXmlElement(); + return elementToXmlString(xmlElement); + } + + /** + * Deserializes the input XML string using DOM Parser and return its Object Graph Representation. + * + * @param toDeserialize Input Object to De-serialize + * @return Deserialized Object + * @throws ParserConfigurationException If any issues occur in parsing input object + * @throws IOException if any issues occur during reading object + * @throws SAXException If any issues occur in Transformation from Node to XML + */ + @Override + public Forest deSerialize(Object toDeserialize) + throws ParserConfigurationException, IOException, SAXException { + DocumentBuilder documentBuilder = DocumentBuilderFactory.newDefaultInstance() + .newDocumentBuilder(); + var stream = new ByteArrayInputStream(toDeserialize.toString().getBytes()); + Document parsed = documentBuilder.parse(stream); + Forest forest = new Forest(); + forest.createObjectFromXml(parsed); + return forest; + } +} +``` + +* Here is the `SlobSerializer` class. It extends the `LobSerializer` abstract class and provides the + implementation to serialize and deserialize the input object and persist and load that object into + a DB using ClobSerializer. +* Objects are serialized using binary data based serialization objects a persisted as a BINARY/BLOB + in DB. + +```java +/** + * Creates a Serializer that uses Binary serialization and deserialization of objects graph to and + * from their Binary Representation. + */ +public class BlobSerializer extends LobSerializer { + + public static final String TYPE_OF_DATA_FOR_DB = "BINARY"; + + public BlobSerializer() throws SQLException { + super(TYPE_OF_DATA_FOR_DB); + } + + /** + * Serializes the input object graph to its Binary Representation using Object Stream. + * + * @param toSerialize Object which is to be serialized + * @return Serialized object + * @throws IOException {@inheritDoc} + */ + @Override + public Object serialize(Forest toSerialize) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(baos); + oos.writeObject(toSerialize); + oos.close(); + return new ByteArrayInputStream(baos.toByteArray()); + } + + /** + * Deserializes the input Byte Array Stream using Object Stream and return its Object Graph + * Representation. + * + * @param toDeserialize Input Object to De-serialize + * @return Deserialized Object + * @throws ClassNotFoundException {@inheritDoc} + * @throws IOException {@inheritDoc} + */ + @Override + public Forest deSerialize(Object toDeserialize) throws IOException, ClassNotFoundException { + InputStream bis = (InputStream) toDeserialize; + Forest forest; + try (ObjectInput in = new ObjectInputStream(bis)) { + forest = (Forest) in.readObject(); + } + return forest; + } +} +``` + +## Class diagram + +![alt text](./etc/slob.urm.png "Serialized LOB") + +## Applicability + +* This pattern works best when you can chop out a piece of the object model and use it to represent + the LOB. +* Think of a LOB as a way to take a bunch of objects that aren’t likely to be queried from any SQL + route outside the application. +* This graph can then be hooked into the SQL schema. Serialized LOB works poorly when you have + objects outside the LOB reference objects buried in it. +* Serialized LOB isn’t considered as often as it might be. XML makes it much more attractive since + it yields an easy-to-implement textual approach. +* Its main disadvantage is that you can’t query the structure using SQL. +* SQL extensions appear to get at XML data within a field, but that’s still not the same (or + portable). + +## Credits + +* [Serialized LOB](https://martinfowler.com/eaaCatalog/serializedLOB.html) by Martin Fowler diff --git a/slob/etc/slob.urm.png b/slob/etc/slob.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..e852dfb21d0858e2b10fb712bce5a6606e0d267b GIT binary patch literal 40078 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 TXR63eH!w!jW)aO{m6-sq}){Pd|Xk=6F-9LzB8 zUCBP?F>gs~DsI7HixmG_b}P>HMirqdQ%m+MEFilCv!o!>w=-1Nh}MLj*M9lFSQKy% znMqx^{BT=m+Z|r1+t0pMm)5)3n} z_kj}^lloq%cD{~uu$EG&6j{|a7JwM_1LN7JF_+Zg+1@X_l3GW;$_UH@=)zaT8)$Tq~0IOq(=72hB8IrcB@Hmf`vJUGOKU zsMyKM8o70EEr?L2mT!vGnX;JPyB>kG%GA0)#!{{%#AByfp`G4s9Z7IPnRlZ1{u$#M zp#Re3E%n@OQ<=CCkuB`KxH{kMbxMTvY-pCY`kPv8fq}ba2oZ>po|>9e`-GyN1u>(^6|x|D==)YsRef+Ur_-j?mw zG%JVfDtXJCy&9n=&ukLsG~cE2a>UV0y^l`s-zXFwVDef?qsP;IA!h%3#k3n($?{Zv zEmi+=Z*sq*+`k=L-=7fo_jz7)t{%Ug5{ZU_s9XJZd5eDa&!Jl?epB$krS_77C4R_f zk^cMHzs&m5cX$0iJ8pfny^WMfv?|vK$qfug&81sf&*)KE=QqR1HOpE3bO>I~>_qsI z0p2-NA<5uoF6WC&eQlMsDgB5z0Wd#4wb0`F~pV!-UWb8yOeog zvns}_m-GJeQSMzj;R8Op$DqgyDUa9`eGXiWab#S9nHn31vLOavu3$@{;S=#Pw_3Stj<8p*0J>nKx~5=#Ey3((k9g~BwGzV z2&K%LiG9f&v-tQL&XeR_6rI#OCmKvE9;9Mm;TL~uE-1i56k;Az-b#=5s5R}%syO)c z5;7scOFKJ?-A6m*->Bj2UcLjBIFxjE8Q-um6%rD%^!a(n9sGw~KxsMi_7-q_B_lDN zSDBjCMZFq=)4mYLgvKkB)N|2x$+$6bdZ_spO1Tmz=fB^pic$hPiC{Xj+#cV<(n_#g zEG^#y;94u9`&BRVJc{iXHvjw0%<6*lj)oyd+TI6yLzlY>1u9gJO?T=ML;VU9XTwH9 zHs_u3+Pj>Y3{GI-ZOqaO9)}?%#^4GHKK

mA2!mP{u5l9)S15t+zWj-|K)fu0!sI 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 rbp1(wZRBN)BvL*V`g`pz@Eb literal 0 HcmV?d00001 diff --git a/slob/etc/slob.urm.uml b/slob/etc/slob.urm.uml new file mode 100644 index 000000000000..1d9de1e46d3b --- /dev/null +++ b/slob/etc/slob.urm.uml @@ -0,0 +1,49 @@ +@startuml + +!theme plain +top to bottom direction +skinparam linetype ortho + +class Animal { + - animalsEaten: Set + - name: String + - plantsEaten: Set + animalsEaten: Set + name: String + plantsEaten: Set +} +class App +class BlobSerializer +class ClobSerializer +class DatabaseService +class Forest { + - animals: Set + - name: String + - plants: Set + animals: Set + name: String + plants: Set + xmlDoc: Document +} +class LobSerializer +class Plant { + - name: String + - type: String + name: String + type: String +} + +Animal -[#595959,dashed]-> Plant : "«create»" +Animal "1" *-[#595959,plain]-> "plantsEaten\n*" Plant +App -[#595959,dashed]-> Animal : "«create»" +App -[#595959,dashed]-> ClobSerializer : "«create»" +App -[#595959,dashed]-> Forest : "«create»" +App -[#595959,dashed]-> Plant : "«create»" +BlobSerializer -[#000082,plain]-^ LobSerializer +ClobSerializer -[#595959,dashed]-> Forest : "«create»" +ClobSerializer -[#000082,plain]-^ LobSerializer +Forest "1" *-[#595959,plain]-> "animals\n*" Animal +Forest "1" *-[#595959,plain]-> "plants\n*" Plant +LobSerializer "1" *-[#595959,plain]-> "databaseService\n1" DatabaseService +LobSerializer -[#595959,dashed]-> DatabaseService : "«create»" +@enduml diff --git a/slob/pom.xml b/slob/pom.xml new file mode 100644 index 000000000000..5f95d4c1b2c2 --- /dev/null +++ b/slob/pom.xml @@ -0,0 +1,78 @@ + + + + + slob + 4.0.0 + + java-design-patterns + com.iluwatar + 1.26.0-SNAPSHOT + + + + + + maven-assembly-plugin + + + + + + com.iluwatar.slob.App + + + + + + org.apache.maven.plugins + + + + + + + junit-jupiter-engine + org.junit.jupiter + test + + + h2 + com.h2database + 2.2.220 + + + lombok + org.projectlombok + provided + + + + diff --git a/slob/src/main/java/com/iluwatar/slob/App.java b/slob/src/main/java/com/iluwatar/slob/App.java new file mode 100644 index 000000000000..743cc8293f1f --- /dev/null +++ b/slob/src/main/java/com/iluwatar/slob/App.java @@ -0,0 +1,144 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.slob; + +import com.iluwatar.slob.lob.Animal; +import com.iluwatar.slob.lob.Forest; +import com.iluwatar.slob.lob.Plant; +import com.iluwatar.slob.serializers.BlobSerializer; +import com.iluwatar.slob.serializers.ClobSerializer; +import com.iluwatar.slob.serializers.LobSerializer; +import java.io.IOException; +import java.sql.SQLException; +import java.util.Collections; +import java.util.Objects; +import java.util.Set; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.TransformerException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.xml.sax.SAXException; + +/** + * SLOB Application using {@link LobSerializer} and H2 DB. + */ +public class App { + + public static final String CLOB = "CLOB"; + private static final Logger LOGGER = LoggerFactory.getLogger(App.class); + + /** + * Main entry point to program. + *

In the SLOB pattern, the object graph is serialized into a single large object (a BLOB or + * CLOB, for Binary Large Object or Character Large Object, respectively) and stored in the + * database. When the object graph needs to be retrieved, it is read from the database and + * deserialized back into the original object graph.

+ * + *

A Forest is created using {@link #createForest()} with Animals and Plants along with their + * respective relationships.

+ * + *

Creates a {@link LobSerializer} using the method + * {@link #createLobSerializer(String[])}.

+ * + *

Once created the serializer is passed to the + * {@link #executeSerializer(Forest, LobSerializer)} which handles the serialization, + * deserialization and persisting and loading from DB.

+ * + * @param args if first arg is CLOB then ClobSerializer is used else BlobSerializer is used. + */ + public static void main(String[] args) throws SQLException { + Forest forest = createForest(); + LobSerializer serializer = createLobSerializer(args); + executeSerializer(forest, serializer); + } + + /** + *

Creates a {@link LobSerializer} on the basis of input args.

+ *

If input args are not empty and the value equals {@link App#CLOB} then a + * {@link ClobSerializer} is created else a {@link BlobSerializer} is created.

+ * + * @param args if first arg is {@link App#CLOB} then ClobSerializer is instantiated else + * BlobSerializer is instantiated. + */ + private static LobSerializer createLobSerializer(String[] args) throws SQLException { + LobSerializer serializer; + if (args.length > 0 && Objects.equals(args[0], CLOB)) { + serializer = new ClobSerializer(); + } else { + serializer = new BlobSerializer(); + } + return serializer; + } + + /** + * Creates a Forest with {@link Animal} and {@link Plant} along with their respective + * relationships. + * + *

The method creates a {@link Forest} with 2 Plants Grass and Oak of type Herb and tree + * respectively.

+ * + *

It also creates 3 animals Zebra and Buffalo which eat the plant grass. Lion consumes the + * Zebra and the Buffalo.

+ * + *

With the above animals and plants and their relationships a forest + * object is created which represents the Object Graph.

+ * + * @return Forest Object + */ + private static Forest createForest() { + Plant grass = new Plant("Grass", "Herb"); + Plant oak = new Plant("Oak", "Tree"); + + Animal zebra = new Animal("Zebra", Set.of(grass), Collections.emptySet()); + Animal buffalo = new Animal("Buffalo", Set.of(grass), Collections.emptySet()); + Animal lion = new Animal("Lion", Collections.emptySet(), Set.of(zebra, buffalo)); + + return new Forest("Amazon", Set.of(lion, buffalo, zebra), Set.of(grass, oak)); + } + + /** + * Serialize the input object using the input serializer and persist to DB. After this it loads + * the same object back from DB and deserializes using the same serializer. + * + * @param forest Object to Serialize and Persist + * @param lobSerializer Serializer to Serialize and Deserialize Object + */ + private static void executeSerializer(Forest forest, LobSerializer lobSerializer) { + try (LobSerializer serializer = lobSerializer) { + + Object serialized = serializer.serialize(forest); + int id = serializer.persistToDb(1, forest.getName(), serialized); + + Object fromDb = serializer.loadFromDb(id, Forest.class.getSimpleName()); + Forest forestFromDb = serializer.deSerialize(fromDb); + + LOGGER.info(forestFromDb.toString()); + } catch (SQLException | IOException | TransformerException | ParserConfigurationException + | SAXException + | ClassNotFoundException e) { + throw new RuntimeException(e); + } + } +} diff --git a/slob/src/main/java/com/iluwatar/slob/dbservice/DatabaseService.java b/slob/src/main/java/com/iluwatar/slob/dbservice/DatabaseService.java new file mode 100644 index 000000000000..ea54592c99d1 --- /dev/null +++ b/slob/src/main/java/com/iluwatar/slob/dbservice/DatabaseService.java @@ -0,0 +1,157 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.slob.dbservice; + +import java.sql.ResultSet; +import java.sql.SQLException; +import javax.sql.DataSource; +import lombok.extern.slf4j.Slf4j; +import org.h2.jdbcx.JdbcDataSource; + +/** + * Service to handle database operations. + */ +@Slf4j +public class DatabaseService { + + public static final String CREATE_BINARY_SCHEMA_DDL = + "CREATE TABLE IF NOT EXISTS FORESTS (ID NUMBER UNIQUE, NAME VARCHAR(30),FOREST VARBINARY)"; + public static final String CREATE_TEXT_SCHEMA_DDL = + "CREATE TABLE IF NOT EXISTS FORESTS (ID NUMBER UNIQUE, NAME VARCHAR(30),FOREST VARCHAR)"; + public static final String DELETE_SCHEMA_SQL = "DROP TABLE FORESTS IF EXISTS"; + public static final String BINARY_DATA = "BINARY"; + private static final String DB_URL = "jdbc:h2:~/test"; + private static final String INSERT = "insert into FORESTS (id,name, forest) values (?,?,?)"; + private static final String SELECT = "select FOREST from FORESTS where id = ?"; + private static final DataSource dataSource = createDataSource(); + public String dataTypeDb; + + /** + * Constructor initializes {@link DatabaseService#dataTypeDb}. + * + * @param dataTypeDb Type of data that is to be stored in DB can be 'TEXT' or 'BINARY'. + */ + public DatabaseService(String dataTypeDb) { + this.dataTypeDb = dataTypeDb; + } + + /** + * Initiates Data source. + * + * @return created data source + */ + private static DataSource createDataSource() { + var dataSource = new JdbcDataSource(); + dataSource.setURL(DB_URL); + return dataSource; + } + + /** + * Shutdown Sequence executes Query {@link DatabaseService#DELETE_SCHEMA_SQL}. + * + * @throws SQLException if any issue occurs while executing DROP Query + */ + public void shutDownService() + throws SQLException { + try (var connection = dataSource.getConnection(); + var statement = connection.createStatement()) { + statement.execute(DELETE_SCHEMA_SQL); + } + } + + /** + * Initaites startup sequence and executes the query + * {@link DatabaseService#CREATE_BINARY_SCHEMA_DDL} if {@link DatabaseService#dataTypeDb} is + * binary else will execute the query {@link DatabaseService#CREATE_TEXT_SCHEMA_DDL}. + * + * @throws SQLException if there are any issues during DDL execution + */ + public void startupService() + throws SQLException { + try (var connection = dataSource.getConnection(); + var statement = connection.createStatement()) { + if (dataTypeDb.equals("BINARY")) { + statement.execute(CREATE_BINARY_SCHEMA_DDL); + } else { + statement.execute(CREATE_TEXT_SCHEMA_DDL); + } + } + } + + /** + * Executes the insert query {@link DatabaseService#INSERT}. + * + * @param id with which row is to be inserted + * @param name name to be added in the row + * @param data object data to be saved in the row + * @throws SQLException if there are any issues in executing insert query + * {@link DatabaseService#INSERT} + */ + public void insert(int id, String name, Object data) + throws SQLException { + try (var connection = dataSource.getConnection(); + var insert = connection.prepareStatement(INSERT)) { + insert.setInt(1, id); + insert.setString(2, name); + insert.setObject(3, data); + insert.execute(); + } + } + + /** + * Runs the select query {@link DatabaseService#SELECT} form the result set returns an + * {@link java.io.InputStream} if {@link DatabaseService#dataTypeDb} is 'binary' else will return + * the object as a {@link String}. + * + * @param id with which row is to be selected + * @param columnsName column in which the object is stored + * @return object found from DB + * @throws SQLException if there are any issues in executing insert query * + * {@link DatabaseService#SELECT} + */ + public Object select(final long id, String columnsName) throws SQLException { + ResultSet resultSet = null; + try (var connection = dataSource.getConnection(); + var preparedStatement = + connection.prepareStatement(SELECT) + ) { + Object result = null; + preparedStatement.setLong(1, id); + resultSet = preparedStatement.executeQuery(); + while (resultSet.next()) { + if (dataTypeDb.equals(BINARY_DATA)) { + result = resultSet.getBinaryStream(columnsName); + } else { + result = resultSet.getString(columnsName); + } + } + return result; + } finally { + if (resultSet != null) { + resultSet.close(); + } + } + } +} diff --git a/slob/src/main/java/com/iluwatar/slob/lob/Animal.java b/slob/src/main/java/com/iluwatar/slob/lob/Animal.java new file mode 100644 index 000000000000..770543cc5cf3 --- /dev/null +++ b/slob/src/main/java/com/iluwatar/slob/lob/Animal.java @@ -0,0 +1,131 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.slob.lob; + +import java.io.Serializable; +import java.util.HashSet; +import java.util.Set; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +/** + * Creates an object Animal with a list of animals and/or plants it consumes. + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Animal implements Serializable { + + private String name; + private Set plantsEaten = new HashSet<>(); + private Set animalsEaten = new HashSet<>(); + + /** + * Iterates over the input nodes recursively and adds new plants to {@link Animal#plantsEaten} or + * animals to {@link Animal#animalsEaten} found to input sets respectively. + * + * @param childNodes contains the XML Node containing the Forest + * @param animalsEaten set of Animals eaten + * @param plantsEaten set of Plants eaten + */ + protected static void iterateXmlForAnimalAndPlants(NodeList childNodes, Set animalsEaten, + Set plantsEaten) { + for (int i = 0; i < childNodes.getLength(); i++) { + Node child = childNodes.item(i); + if (child.getNodeType() == Node.ELEMENT_NODE) { + if (child.getNodeName().equals(Animal.class.getSimpleName())) { + Animal animalEaten = new Animal(); + animalEaten.createObjectFromXml(child); + animalsEaten.add(animalEaten); + } else if (child.getNodeName().equals(Plant.class.getSimpleName())) { + Plant plant = new Plant(); + plant.createObjectFromXml(child); + plantsEaten.add(plant); + } + } + } + } + + /** + * Provides XML Representation of the Animal. + * + * @param xmlDoc object to which the XML representation is to be written to + * @return XML Element contain the Animal representation + */ + public Element toXmlElement(Document xmlDoc) { + Element root = xmlDoc.createElement(Animal.class.getSimpleName()); + root.setAttribute("name", name); + for (Plant plant : plantsEaten) { + Element xmlElement = plant.toXmlElement(xmlDoc); + if (xmlElement != null) { + root.appendChild(xmlElement); + } + } + for (Animal animal : animalsEaten) { + Element xmlElement = animal.toXmlElement(xmlDoc); + if (xmlElement != null) { + root.appendChild(xmlElement); + } + } + xmlDoc.appendChild(root); + return (Element) xmlDoc.getFirstChild(); + } + + /** + * Parses the Animal Object from the input XML Node. + * + * @param node the XML Node from which the Animal Object is to be parsed + */ + public void createObjectFromXml(Node node) { + name = node.getAttributes().getNamedItem("name").getNodeValue(); + NodeList childNodes = node.getChildNodes(); + iterateXmlForAnimalAndPlants(childNodes, animalsEaten, plantsEaten); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("\nAnimal Name = ").append(name); + if (!animalsEaten.isEmpty()) { + sb.append("\n\tAnimals Eaten by ").append(name).append(": "); + } + for (Animal animal : animalsEaten) { + sb.append("\n\t\t").append(animal); + } + sb.append("\n"); + if (!plantsEaten.isEmpty()) { + sb.append("\n\tPlants Eaten by ").append(name).append(": "); + } + for (Plant plant : plantsEaten) { + sb.append("\n\t\t").append(plant); + } + return sb.toString(); + } +} diff --git a/slob/src/main/java/com/iluwatar/slob/lob/Forest.java b/slob/src/main/java/com/iluwatar/slob/lob/Forest.java new file mode 100644 index 000000000000..1c14d55debd8 --- /dev/null +++ b/slob/src/main/java/com/iluwatar/slob/lob/Forest.java @@ -0,0 +1,121 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.slob.lob; + +import static com.iluwatar.slob.lob.Animal.iterateXmlForAnimalAndPlants; + +import java.io.Serializable; +import java.util.HashSet; +import java.util.Set; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +/** + * Creates an object Forest which contains animals and plants as its constituents. Animals may eat + * plants or other animals in the forest. + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Forest implements Serializable { + + private String name; + private Set animals = new HashSet<>(); + private Set plants = new HashSet<>(); + + /** + * Provides the representation of Forest in XML form. + * + * @return XML Element + */ + public Element toXmlElement() throws ParserConfigurationException { + Document xmlDoc = getXmlDoc(); + + Element forestXml = xmlDoc.createElement("Forest"); + forestXml.setAttribute("name", name); + + Element animalsXml = xmlDoc.createElement("Animals"); + for (Animal animal : animals) { + Element animalXml = animal.toXmlElement(xmlDoc); + animalsXml.appendChild(animalXml); + } + forestXml.appendChild(animalsXml); + + Element plantsXml = xmlDoc.createElement("Plants"); + for (Plant plant : plants) { + Element plantXml = plant.toXmlElement(xmlDoc); + plantsXml.appendChild(plantXml); + } + forestXml.appendChild(plantsXml); + return forestXml; + } + + /** + * Returns XMLDoc to use for XML creation. + * + * @return XML DOC Object + * @throws ParserConfigurationException {@inheritDoc} + */ + private Document getXmlDoc() throws ParserConfigurationException { + return DocumentBuilderFactory.newDefaultInstance().newDocumentBuilder().newDocument(); + } + + /** + * Parses the Forest Object from the input XML Document. + * + * @param document the XML document from which the Forest is to be parsed + */ + public void createObjectFromXml(Document document) { + name = document.getDocumentElement().getAttribute("name"); + NodeList nodeList = document.getElementsByTagName("*"); + iterateXmlForAnimalAndPlants(nodeList, animals, plants); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("\n"); + sb.append("Forest Name = ").append(name).append("\n"); + sb.append("Animals found in the ").append(name).append(" Forest: \n"); + for (Animal animal : animals) { + sb.append("\n--------------------------\n"); + sb.append(animal.toString()); + sb.append("\n--------------------------\n"); + } + sb.append("\n"); + sb.append("Plants in the ").append(name).append(" Forest: \n"); + for (Plant plant : plants) { + sb.append("\n--------------------------\n"); + sb.append(plant.toString()); + sb.append("\n--------------------------\n"); + } + return sb.toString(); + } +} diff --git a/slob/src/main/java/com/iluwatar/slob/lob/Plant.java b/slob/src/main/java/com/iluwatar/slob/lob/Plant.java new file mode 100644 index 000000000000..20aff543eacb --- /dev/null +++ b/slob/src/main/java/com/iluwatar/slob/lob/Plant.java @@ -0,0 +1,80 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.slob.lob; + +import java.io.Serializable; +import java.util.StringJoiner; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; + +/** + * Creates an object Plant which contains its name and type. + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Plant implements Serializable { + + private String name; + private String type; + + /** + * Provides XML Representation of the Plant. + * + * @param xmlDoc to which the XML representation is to be written to + * @return XML Element contain the Animal representation + */ + public Element toXmlElement(Document xmlDoc) { + Element root = xmlDoc.createElement(Plant.class.getSimpleName()); + root.setAttribute("name", name); + root.setAttribute("type", type); + xmlDoc.appendChild(root); + return xmlDoc.getDocumentElement(); + } + + /** + * Parses the Plant Object from the input XML Node. + * + * @param node the XML Node from which the Animal Object is to be parsed + */ + public void createObjectFromXml(Node node) { + NamedNodeMap attributes = node.getAttributes(); + name = attributes.getNamedItem("name").getNodeValue(); + type = attributes.getNamedItem("type").getNodeValue(); + } + + @Override + public String toString() { + StringJoiner stringJoiner = new StringJoiner(","); + stringJoiner.add("Name = " + name); + stringJoiner.add("Type = " + type); + return stringJoiner.toString(); + } +} diff --git a/slob/src/main/java/com/iluwatar/slob/serializers/BlobSerializer.java b/slob/src/main/java/com/iluwatar/slob/serializers/BlobSerializer.java new file mode 100644 index 000000000000..c3858a84a9b6 --- /dev/null +++ b/slob/src/main/java/com/iluwatar/slob/serializers/BlobSerializer.java @@ -0,0 +1,83 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.slob.serializers; + +import com.iluwatar.slob.lob.Forest; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInput; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.sql.SQLException; + +/** + * Creates a Serializer that uses Binary serialization and deserialization of objects graph to and + * from their Binary Representation. + */ +public class BlobSerializer extends LobSerializer { + + public static final String TYPE_OF_DATA_FOR_DB = "BINARY"; + + public BlobSerializer() throws SQLException { + super(TYPE_OF_DATA_FOR_DB); + } + + /** + * Serializes the input object graph to its Binary Representation using Object Stream. + * + * @param toSerialize Object which is to be serialized + * @return Serialized object + * @throws IOException {@inheritDoc} + */ + @Override + public Object serialize(Forest toSerialize) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(baos); + oos.writeObject(toSerialize); + oos.close(); + return new ByteArrayInputStream(baos.toByteArray()); + } + + /** + * Deserializes the input Byte Array Stream using Object Stream and return its Object Graph + * Representation. + * + * @param toDeserialize Input Object to De-serialize + * @return Deserialized Object + * @throws ClassNotFoundException {@inheritDoc} + * @throws IOException {@inheritDoc} + */ + @Override + public Forest deSerialize(Object toDeserialize) throws IOException, ClassNotFoundException { + InputStream bis = (InputStream) toDeserialize; + Forest forest; + try (ObjectInput in = new ObjectInputStream(bis)) { + forest = (Forest) in.readObject(); + } + return forest; + } +} diff --git a/slob/src/main/java/com/iluwatar/slob/serializers/ClobSerializer.java b/slob/src/main/java/com/iluwatar/slob/serializers/ClobSerializer.java new file mode 100644 index 000000000000..1734447194d0 --- /dev/null +++ b/slob/src/main/java/com/iluwatar/slob/serializers/ClobSerializer.java @@ -0,0 +1,107 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.slob.serializers; + +import com.iluwatar.slob.lob.Forest; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.StringWriter; +import java.sql.SQLException; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.xml.sax.SAXException; + +/** + * Creates a Serializer that uses Character based serialization and deserialization of objects graph + * to and from XML Representation. + */ +public class ClobSerializer extends LobSerializer { + + public static final String TYPE_OF_DATA_FOR_DB = "TEXT"; + + public ClobSerializer() throws SQLException { + super(TYPE_OF_DATA_FOR_DB); + } + + /** + * Converts the input node to its XML String Representation. + * + * @param node XML Node that is to be converted to string + * @return String representation of XML parsed from the Node + * @throws TransformerException If any issues occur in Transformation from Node to XML + */ + private static String elementToXmlString(Element node) throws TransformerException { + StringWriter sw = new StringWriter(); + Transformer t = TransformerFactory.newDefaultInstance().newTransformer(); + t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); + t.setOutputProperty(OutputKeys.INDENT, "yes"); + t.transform(new DOMSource(node), new StreamResult(sw)); + return sw.toString(); + } + + /** + * Serializes the input object graph to its XML Representation using DOM Elements. + * + * @param forest Object which is to be serialized + * @return Serialized object + * @throws ParserConfigurationException If any issues occur in parsing input object + * @throws TransformerException If any issues occur in Transformation from Node to XML + */ + @Override + public Object serialize(Forest forest) throws ParserConfigurationException, TransformerException { + Element xmlElement = forest.toXmlElement(); + return elementToXmlString(xmlElement); + } + + /** + * Deserializes the input XML string using DOM Parser and return its Object Graph Representation. + * + * @param toDeserialize Input Object to De-serialize + * @return Deserialized Object + * @throws ParserConfigurationException If any issues occur in parsing input object + * @throws IOException if any issues occur during reading object + * @throws SAXException If any issues occur in Transformation from Node to XML + */ + @Override + public Forest deSerialize(Object toDeserialize) + throws ParserConfigurationException, IOException, SAXException { + DocumentBuilder documentBuilder = DocumentBuilderFactory.newDefaultInstance() + .newDocumentBuilder(); + var stream = new ByteArrayInputStream(toDeserialize.toString().getBytes()); + Document parsed = documentBuilder.parse(stream); + Forest forest = new Forest(); + forest.createObjectFromXml(parsed); + return forest; + } +} diff --git a/slob/src/main/java/com/iluwatar/slob/serializers/LobSerializer.java b/slob/src/main/java/com/iluwatar/slob/serializers/LobSerializer.java new file mode 100644 index 000000000000..54e9c8ba52ec --- /dev/null +++ b/slob/src/main/java/com/iluwatar/slob/serializers/LobSerializer.java @@ -0,0 +1,115 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.slob.serializers; + +import com.iluwatar.slob.dbservice.DatabaseService; +import com.iluwatar.slob.lob.Forest; +import java.io.Closeable; +import java.io.IOException; +import java.io.Serializable; +import java.sql.SQLException; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.TransformerException; +import org.xml.sax.SAXException; + +/** + * A LobSerializer can be used to create an instance of a serializer which can serialize and + * deserialize an object and persist and load that object into a DB. from their Binary + * Representation. + */ +public abstract class LobSerializer implements Serializable, Closeable { + + private final transient DatabaseService databaseService; + + /** + * Constructor initializes {@link LobSerializer#databaseService}. + * + * @param dataTypeDb Input provides type of Data to be stored by the Data Base Service + * @throws SQLException If any issue occurs during instantiation of DB Service or during startup. + */ + protected LobSerializer(String dataTypeDb) throws SQLException { + databaseService = new DatabaseService(dataTypeDb); + databaseService.startupService(); + } + + /** + * Provides the specification to Serialize the input object. + * + * @param toSerialize Input Object to serialize + * @return Serialized Object + * @throws ParserConfigurationException if any issue occurs during parsing of input object + * @throws TransformerException if any issue occurs during Transformation + * @throws IOException if any issues occur during reading object + */ + public abstract Object serialize(Forest toSerialize) + throws ParserConfigurationException, TransformerException, IOException; + + /** + * Saves the object to DB with the provided ID. + * + * @param id key to be sent to DB service + * @param name Object name to store in DB + * @param object Object to store in DB + * @return ID with which the object is stored in DB + * @throws SQLException if any issue occurs while saving to DB + */ + public int persistToDb(int id, String name, Object object) throws SQLException { + databaseService.insert(id, name, object); + return id; + } + + /** + * Loads the object from db using the ID and column name. + * + * @param id to query the DB + * @param columnName column from which object is to be extracted + * @return Object from DB + * @throws SQLException if any issue occurs while loading from DB + */ + public Object loadFromDb(int id, String columnName) throws SQLException { + return databaseService.select(id, columnName); + } + + /** + * Provides the specification to Deserialize the input object. + * + * @param toDeserialize object to deserialize + * @return Deserialized Object + * @throws ParserConfigurationException If issue occurs during parsing of input object + * @throws IOException if any issues occur during reading object + * @throws SAXException if any issues occur during reading object for XML parsing + */ + public abstract Forest deSerialize(Object toDeserialize) + throws ParserConfigurationException, IOException, SAXException, ClassNotFoundException; + + @Override + public void close() { + try { + databaseService.shutDownService(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } +} diff --git a/slob/src/test/java/com/iluwatar/slob/AppTest.java b/slob/src/test/java/com/iluwatar/slob/AppTest.java new file mode 100644 index 000000000000..f8332a128020 --- /dev/null +++ b/slob/src/test/java/com/iluwatar/slob/AppTest.java @@ -0,0 +1,143 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.slob; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +import com.iluwatar.slob.lob.Animal; +import com.iluwatar.slob.lob.Forest; +import com.iluwatar.slob.lob.Plant; +import com.iluwatar.slob.serializers.BlobSerializer; +import com.iluwatar.slob.serializers.ClobSerializer; +import com.iluwatar.slob.serializers.LobSerializer; +import java.io.IOException; +import java.sql.SQLException; +import java.util.Collections; +import java.util.Set; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.TransformerException; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.xml.sax.SAXException; + +/** + * SLOB Application test + */ +@Slf4j +class AppTest { + + /** + * Creates a Forest with Animals and Plants along with their respective relationships. + *

The method creates a forest with 2 Plants Grass and Oak of type Herb and tree + * respectively.

+ *

It also creates 3 animals Zebra and Buffalo which eat the plant grass. Lion consumes the + * Zebra and the Buffalo.

+ *

With the above animals and plants and their relationships a forest + * object is created which represents the Object Graph.

+ * + * @return Forest Object + */ + private static Forest createForest() { + Plant grass = new Plant("Grass", "Herb"); + Plant oak = new Plant("Oak", "Tree"); + + Animal zebra = new Animal("Zebra", Set.of(grass), Collections.emptySet()); + Animal buffalo = new Animal("Buffalo", Set.of(grass), Collections.emptySet()); + Animal lion = new Animal("Lion", Collections.emptySet(), Set.of(zebra, buffalo)); + + return new Forest("Amazon", Set.of(lion, buffalo, zebra), Set.of(grass, oak)); + } + + /** + * Tests the {@link App} without passing any argument in the args to test the + * {@link ClobSerializer}. + */ + @Test + void shouldExecuteWithoutExceptionClob() { + assertDoesNotThrow(() -> App.main(new String[]{"CLOB"})); + } + + /** + * Tests the {@link App} without passing any argument in the args to test the + * {@link BlobSerializer}. + */ + @Test + void shouldExecuteWithoutExceptionBlob() { + assertDoesNotThrow(() -> App.main(new String[]{})); + } + + /** + * Tests the serialization of the input object using the {@link ClobSerializer} and persists the + * serialized object to DB, then load the object back from DB and deserializes it using the + * provided {@link ClobSerializer}.

After loading the object back from DB the test matches the + * hash of the input object with the hash of the object that was loaded from DB and deserialized. + */ + @Test + void clobSerializerTest() { + Forest forest = createForest(); + try (LobSerializer serializer = new ClobSerializer()) { + + Object serialized = serializer.serialize(forest); + int id = serializer.persistToDb(1, forest.getName(), serialized); + + Object fromDb = serializer.loadFromDb(id, Forest.class.getSimpleName()); + Forest forestFromDb = serializer.deSerialize(fromDb); + + Assertions.assertEquals(forest.hashCode(), forestFromDb.hashCode(), + "Hashes of objects after Serializing and Deserializing are the same"); + } catch (SQLException | IOException | TransformerException | ParserConfigurationException | + SAXException | + ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + /** + * Tests the serialization of the input object using the {@link BlobSerializer} and persists the + * serialized object to DB, then loads the object back from DB and deserializes it using the + * {@link BlobSerializer}.

After loading the object back from DB the test matches the hash of + * the input object with the hash of the object that was loaded from DB and deserialized. + */ + @Test + void blobSerializerTest() { + Forest forest = createForest(); + try (LobSerializer serializer = new BlobSerializer()) { + + Object serialized = serializer.serialize(forest); + int id = serializer.persistToDb(1, forest.getName(), serialized); + + Object fromDb = serializer.loadFromDb(id, Forest.class.getSimpleName()); + Forest forestFromDb = serializer.deSerialize(fromDb); + + Assertions.assertEquals(forest.hashCode(), forestFromDb.hashCode(), + "Hashes of objects after Serializing and Deserializing are the same"); + } catch (SQLException | IOException | TransformerException | ParserConfigurationException | + SAXException | + ClassNotFoundException e) { + throw new RuntimeException(e); + } + } +} From a8ee68d4d856c7d9876b478df2794ed9cd16e673 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 26 Mar 2024 20:28:10 +0200 Subject: [PATCH 005/580] docs: add KishalayP as a contributor for code (#2850) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 8ed210af3585..ce1a7bd24039 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -3037,6 +3037,15 @@ "contributions": [ "code" ] + }, + { + "login": "KishalayP", + "name": "Kishalay Pandey", + "avatar_url": "https://avatars.githubusercontent.com/u/71012321?v=4", + "profile": "https://github.com/KishalayP", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 5f192ad7e4bf..e53ba764d97e 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=iluwatar_java-design-patterns&metric=coverage)](https://sonarcloud.io/dashboard?id=iluwatar_java-design-patterns) [![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) -[![All Contributors](https://img.shields.io/badge/all_contributors-333-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-334-orange.svg?style=flat-square)](#contributors-)
@@ -503,6 +503,7 @@ This project is licensed under the terms of the MIT license. omahs
omahs

📖 leif e.
leif e.

💻 Jun Kang
Jun Kang

💻 + Kishalay Pandey
Kishalay Pandey

💻 From be914e0bc3265027678f711c9edd59c6ae325202 Mon Sep 17 00:00:00 2001 From: Jun Kang Date: Wed, 27 Mar 2024 22:38:32 +0900 Subject: [PATCH 006/580] deps: Updated the imports in code of the healthcheck pattern for SpringBoot 3.x (#2851) * Updated the imports in code of the single table inheritance pattern for Spring Boot 3.x #2825 Change javax library to jakarta * add pom.xml * Updated the imports in code of the healthcheck pattern for SpringBoot 3.x Change javax library to jakarta and update maven dependency versions * change order of imports to pass Checkstyle violations * change import order to pass lexicographical order test * change import order to pass CustomImportOrder warning --- health-check/pom.xml | 23 ++++++++++++++++--- .../check/AsynchronousHealthChecker.java | 2 +- .../health/check/CpuHealthIndicator.java | 2 +- .../iluwatar/health/check/HealthCheck.java | 10 ++++---- .../health/check/HealthCheckRepository.java | 6 ++--- .../test/java/HealthCheckRepositoryTest.java | 4 ++-- 6 files changed, 32 insertions(+), 15 deletions(-) diff --git a/health-check/pom.xml b/health-check/pom.xml index b6f6ba2644f1..3fb07d14ee1b 100644 --- a/health-check/pom.xml +++ b/health-check/pom.xml @@ -36,14 +36,32 @@ health-check - + + + + org.springframework.boot + spring-boot-dependencies + pom + 3.2.3 + import + + + org.hibernate + hibernate-core + 6.4.4.Final + + + org.springframework.boot spring-boot-starter-web - + + jakarta.xml.bind + jakarta.xml.bind-api + org.springframework.boot @@ -105,7 +123,6 @@ test - diff --git a/health-check/src/main/java/com/iluwatar/health/check/AsynchronousHealthChecker.java b/health-check/src/main/java/com/iluwatar/health/check/AsynchronousHealthChecker.java index 106a924cbb11..18f44ef38c5b 100644 --- a/health-check/src/main/java/com/iluwatar/health/check/AsynchronousHealthChecker.java +++ b/health-check/src/main/java/com/iluwatar/health/check/AsynchronousHealthChecker.java @@ -1,5 +1,6 @@ package com.iluwatar.health.check; +import jakarta.annotation.PreDestroy; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; import java.util.concurrent.Executors; @@ -7,7 +8,6 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.function.Supplier; -import javax.annotation.PreDestroy; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.actuate.health.Health; diff --git a/health-check/src/main/java/com/iluwatar/health/check/CpuHealthIndicator.java b/health-check/src/main/java/com/iluwatar/health/check/CpuHealthIndicator.java index 0914c3807d66..5c9bc2dd7e7e 100644 --- a/health-check/src/main/java/com/iluwatar/health/check/CpuHealthIndicator.java +++ b/health-check/src/main/java/com/iluwatar/health/check/CpuHealthIndicator.java @@ -1,11 +1,11 @@ package com.iluwatar.health.check; +import jakarta.annotation.PostConstruct; import java.lang.management.ManagementFactory; import java.lang.management.OperatingSystemMXBean; import java.time.Instant; import java.util.HashMap; import java.util.Map; -import javax.annotation.PostConstruct; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; diff --git a/health-check/src/main/java/com/iluwatar/health/check/HealthCheck.java b/health-check/src/main/java/com/iluwatar/health/check/HealthCheck.java index 15c14488ae0b..528753ee035a 100644 --- a/health-check/src/main/java/com/iluwatar/health/check/HealthCheck.java +++ b/health-check/src/main/java/com/iluwatar/health/check/HealthCheck.java @@ -1,10 +1,10 @@ package com.iluwatar.health.check; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; import lombok.Data; /** diff --git a/health-check/src/main/java/com/iluwatar/health/check/HealthCheckRepository.java b/health-check/src/main/java/com/iluwatar/health/check/HealthCheckRepository.java index 64a0a4e93159..272cf46b2159 100644 --- a/health-check/src/main/java/com/iluwatar/health/check/HealthCheckRepository.java +++ b/health-check/src/main/java/com/iluwatar/health/check/HealthCheckRepository.java @@ -1,8 +1,8 @@ package com.iluwatar.health.check; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.transaction.Transactional; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.transaction.Transactional; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Repository; diff --git a/health-check/src/test/java/HealthCheckRepositoryTest.java b/health-check/src/test/java/HealthCheckRepositoryTest.java index 2508c126d9e4..8eb791438db8 100644 --- a/health-check/src/test/java/HealthCheckRepositoryTest.java +++ b/health-check/src/test/java/HealthCheckRepositoryTest.java @@ -3,8 +3,8 @@ import com.iluwatar.health.check.HealthCheck; import com.iluwatar.health.check.HealthCheckRepository; -import javax.persistence.EntityManager; -import javax.persistence.Query; +import jakarta.persistence.EntityManager; +import jakarta.persistence.Query; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; From 46fe84129673b9d53abffcdc20cfb81e7d4d71ee Mon Sep 17 00:00:00 2001 From: CYBERCRUX2 <41006191+pushpander1010@users.noreply.github.com> Date: Wed, 27 Mar 2024 20:18:09 +0530 Subject: [PATCH 007/580] docs: Update README.md (#2652) Added explanation, programming example. --- half-sync-half-async/README.md | 127 +++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) diff --git a/half-sync-half-async/README.md b/half-sync-half-async/README.md index 3e0943599c33..7b5de8c5b09a 100644 --- a/half-sync-half-async/README.md +++ b/half-sync-half-async/README.md @@ -23,6 +23,133 @@ Use Half-Sync/Half-Async pattern when * the higher level tasks in the system can be simplified significantly if I/O is performed synchronously. * one or more tasks in a system must run in a single thread of control, while other tasks may benefit from multi-threading. +## Explanation +The Half-Sync/Half-Async pattern is a concurrency design pattern used in software engineering to manage concurrent operations and interactions in a system. It's particularly useful in applications where both asynchronous and synchronous processing are required to achieve optimal performance and responsiveness. + +The pattern is structured into two components: the synchronous part (Half-Sync) and the asynchronous part (Half-Async). + +Half-Sync (Synchronous Part): +In this part, there is a synchronous layer that handles high-level control flow and coordination of the application. It typically consists of a set of threads that handle communication, synchronization, and coordination. These threads are responsible for managing shared resources and orchestrating the flow of work in a synchronous manner. + +Half-Async (Asynchronous Part): +The asynchronous part involves a set of asynchronous workers or threads that perform the actual processing and execution of tasks. These threads are responsible for carrying out time-consuming or potentially blocking operations asynchronously. They handle I/O operations, long-running computations, or any task that can be parallelized effectively. + +How it Works: + +Synchronous Part: + +The synchronous part handles incoming requests, organizes the tasks to be performed, and dispatches them to the asynchronous workers. +It's responsible for high-level orchestration, resource management, and synchronization of the overall system. +Asynchronous Part: + +Asynchronous workers execute the tasks independently and concurrently without blocking the main application. +They handle time-consuming or I/O-bound tasks efficiently, ensuring the system remains responsive. +Advantages: + +Responsiveness: Asynchronous processing ensures that the system remains responsive by allowing non-blocking operations. +Parallel Execution: It enables concurrent execution of tasks, improving performance by utilizing multiple threads or processes. +Scalability: The asynchronous part can be scaled easily to handle a larger number of requests efficiently. +Disadvantages: + +Complexity: Implementing and managing the two parts can be complex, requiring careful coordination and synchronization mechanisms. +Potential Deadlocks: The interplay between the synchronous and asynchronous parts can introduce potential deadlocks or race conditions if not handled correctly. +The Half-Sync/Half-Async pattern strikes a balance between responsiveness and efficiency by utilizing both synchronous and asynchronous processing to optimize the performance of a system while ensuring responsiveness to user requests. + +## Programmatic Example +```java +{ +import java.util.LinkedList; +import java.util.Queue; + +class TaskQueue { + private Queue queue = new LinkedList<>(); + + synchronized void enqueue(String task) { + queue.add(task); + notify(); // Notify waiting threads that a task is available + } + + synchronized String dequeue() throws InterruptedException { + while (queue.isEmpty()) { + wait(); // Wait until a task is enqueued + } + return queue.poll(); + } +} + +class SynchronousPart extends Thread { + private TaskQueue taskQueue; + + public SynchronousPart(TaskQueue taskQueue) { + this.taskQueue = taskQueue; + } + + @Override + public void run() { + while (true) { + try { + String task = taskQueue.dequeue(); + System.out.println("Synchronous part processing task: " + task); + // Simulate some synchronous processing + Thread.sleep(1000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + } +} + +class AsynchronousPart extends Thread { + @Override + public void run() { + while (true) { + // Simulate some asynchronous processing + System.out.println("Asynchronous part processing tasks..."); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + } +} + +public class HalfSyncHalfAsyncExample { + public static void main(String[] args) { + TaskQueue taskQueue = new TaskQueue(); + + SynchronousPart synchronousThread = new SynchronousPart(taskQueue); + AsynchronousPart asynchronousThread = new AsynchronousPart(); + + synchronousThread.start(); + asynchronousThread.start(); + + // Enqueue tasks + taskQueue.enqueue("Task 1"); + taskQueue.enqueue("Task 2"); + taskQueue.enqueue("Task 3"); + + // Allow the threads to run for a while + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + + // Stop the threads (in a real application, you would have a proper way to signal the threads to stop) + synchronousThread.interrupt(); + asynchronousThread.interrupt(); + } +} + ``` +### In this Java example: + +* TaskQueue class manages the task queue and provides methods for enqueueing and dequeuing tasks in a thread-safe manner. +* SynchronousPart and AsynchronousPart classes represent the synchronous and asynchronous parts of the application, respectively. +* The synchronous part processes tasks in a synchronous manner, and the asynchronous part processes tasks in an asynchronous manner, simulating some processing time. +* The main program creates instances of TaskQueue, SynchronousPart, and AsynchronousPart, enqueues tasks, and starts the threads to demonstrate the Half-Sync/Half-Async pattern. + + ## Real world examples * [BSD Unix networking subsystem](https://www.dre.vanderbilt.edu/~schmidt/PDF/PLoP-95.pdf) From 9f53811116a941b968924a799d2c2c28c587cf72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Wed, 27 Mar 2024 16:55:36 +0200 Subject: [PATCH 008/580] update dependabot conf --- .github/dependabot.yml | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index e0dcabf0b188..d4cd65774353 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -9,17 +9,3 @@ updates: directory: "/" # Location of package manifests schedule: interval: "weekly" - allow: - - dependency-name: "org.springframework.boot:spring-boot-dependencies" - - dependency-name: "commons-dbcp:commons-dbcp" - - dependency-name: "net.sourceforge.htmlunit:htmlunit" - - dependency-name: "com.google.code.gson:gson" - - dependency-name: "com.google.inject:guice" - - dependency-name: "com.github.stefanbirkner:system-lambda" - - dependency-name: "org.apache.maven.plugins:maven-surefire-plugin" - - dependency-name: "org.apache.maven.plugins:maven-assembly-plugin" - - dependency-name: "org.sonarsource.scanner.maven:sonar-maven-plugin" - - dependency-name: "org.apache.maven.plugins:maven-checkstyle-plugin" - - dependency-name: "com.mycila:license-maven-plugin" - - dependency-name: "org.jacoco:jacoco-maven-plugin" - - dependency-name: "com.iluwatar.urm:urm-maven-plugin" From 7c516064c6261bbb0ab8c7aa99148165ec3082be Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 27 Mar 2024 18:03:39 +0200 Subject: [PATCH 009/580] build(deps-dev): bump org.assertj:assertj-core from 3.24.2 to 3.25.3 (#2855) Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.24.2 to 3.25.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.24.2...assertj-build-3.25.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- health-check/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/health-check/pom.xml b/health-check/pom.xml index 3fb07d14ee1b..5e9859b45308 100644 --- a/health-check/pom.xml +++ b/health-check/pom.xml @@ -113,7 +113,7 @@ org.assertj assertj-core - 3.24.2 + 3.25.3 test From 55f43fd51450b9cb73e39c594af5097531ba9e40 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 27 Mar 2024 18:04:12 +0200 Subject: [PATCH 010/580] build(deps): bump org.apache.maven.plugins:maven-war-plugin (#2856) Bumps [org.apache.maven.plugins:maven-war-plugin](https://github.com/apache/maven-war-plugin) from 3.3.2 to 3.4.0. - [Commits](https://github.com/apache/maven-war-plugin/compare/maven-war-plugin-3.3.2...maven-war-plugin-3.4.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-war-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- model-view-viewmodel/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model-view-viewmodel/pom.xml b/model-view-viewmodel/pom.xml index aceb5eea7604..992b5247e999 100644 --- a/model-view-viewmodel/pom.xml +++ b/model-view-viewmodel/pom.xml @@ -38,7 +38,7 @@ 9.0.0 9.4.28.v20200408 - 3.3.2 + 3.4.0 yyyy-MM-dd -${project.version}-FL-${maven.build.timestamp} From 2061fe8c5967f01d0d7ef2940a7019f0f9d93324 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Wed, 27 Mar 2024 18:07:13 +0200 Subject: [PATCH 011/580] upgrade hamcrest --- marker/pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/marker/pom.xml b/marker/pom.xml index 9b0572e7cb1c..89489976bb14 100644 --- a/marker/pom.xml +++ b/marker/pom.xml @@ -42,7 +42,6 @@ org.hamcrest hamcrest-core - 1.3 test From 7d0874d88a2fa0caf7eaa65453a9201410dfe47f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Wed, 27 Mar 2024 20:09:01 +0200 Subject: [PATCH 012/580] deps: update maven --- .mvn/wrapper/MavenWrapperDownloader.java | 125 ------------------ .mvn/wrapper/maven-wrapper.properties | 10 +- crtp/etc/crtp.urm.puml | 2 + health-check/etc/health-check.urm.puml | 124 +++++++++++++++++ log-aggregation/etc/log-aggregation.urm.puml | 68 ++++++++++ model-view-viewmodel/pom.xml | 1 - .../etc/optimistic-offline-lock.urm.puml | 59 +++++++++ slob/etc/slob.urm.puml | 122 +++++++++++++++++ slob/pom.xml | 5 - .../etc/thread-local-storage.urm.puml | 29 ++++ 10 files changed, 409 insertions(+), 136 deletions(-) delete mode 100644 .mvn/wrapper/MavenWrapperDownloader.java create mode 100644 crtp/etc/crtp.urm.puml create mode 100644 health-check/etc/health-check.urm.puml create mode 100644 log-aggregation/etc/log-aggregation.urm.puml create mode 100644 optimistic-offline-lock/etc/optimistic-offline-lock.urm.puml create mode 100644 slob/etc/slob.urm.puml create mode 100644 thread-local-storage/etc/thread-local-storage.urm.puml diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index cfc696f0122a..000000000000 --- a/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * The MIT License - * Copyright © 2014-2021 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 java.net.*; -import java.io.*; -import java.nio.channels.*; -import java.util.Properties; - -public class MavenWrapperDownloader { - - private static final String WRAPPER_VERSION = "0.5.6"; - /** - * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. - */ - private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" - + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; - - /** - * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to - * use instead of the default one. - */ - private static final String MAVEN_WRAPPER_PROPERTIES_PATH = - ".mvn/wrapper/maven-wrapper.properties"; - - /** - * Path where the maven-wrapper.jar will be saved to. - */ - private static final String MAVEN_WRAPPER_JAR_PATH = - ".mvn/wrapper/maven-wrapper.jar"; - - /** - * Name of the property which should be used to override the default download url for the wrapper. - */ - private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; - - public static void main(String args[]) { - System.out.println("- Downloader started"); - File baseDirectory = new File(args[0]); - System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); - - // If the maven-wrapper.properties exists, read it and check if it contains a custom - // wrapperUrl parameter. - File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); - String url = DEFAULT_DOWNLOAD_URL; - if(mavenWrapperPropertyFile.exists()) { - FileInputStream mavenWrapperPropertyFileInputStream = null; - try { - mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); - Properties mavenWrapperProperties = new Properties(); - mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); - url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); - } catch (IOException e) { - System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); - } finally { - try { - if(mavenWrapperPropertyFileInputStream != null) { - mavenWrapperPropertyFileInputStream.close(); - } - } catch (IOException e) { - // Ignore ... - } - } - } - System.out.println("- Downloading from: " + url); - - File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); - if(!outputFile.getParentFile().exists()) { - if(!outputFile.getParentFile().mkdirs()) { - System.out.println( - "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); - } - } - System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); - try { - downloadFileFromURL(url, outputFile); - System.out.println("Done"); - System.exit(0); - } catch (Throwable e) { - System.out.println("- Error downloading"); - e.printStackTrace(); - System.exit(1); - } - } - - private static void downloadFileFromURL(String urlString, File destination) throws Exception { - if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { - String username = System.getenv("MVNW_USERNAME"); - char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); - Authenticator.setDefault(new Authenticator() { - @Override - protected PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(username, password); - } - }); - } - URL website = new URL(urlString); - ReadableByteChannel rbc; - rbc = Channels.newChannel(website.openStream()); - FileOutputStream fos = new FileOutputStream(destination); - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); - fos.close(); - rbc.close(); - } - -} diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index 8c79a83ae43f..4f15c4db1572 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -5,14 +5,14 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# +# +# https://www.apache.org/licenses/LICENSE-2.0 +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.4/apache-maven-3.8.4-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.6/apache-maven-3.9.6-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar diff --git a/crtp/etc/crtp.urm.puml b/crtp/etc/crtp.urm.puml new file mode 100644 index 000000000000..02af47ddf261 --- /dev/null +++ b/crtp/etc/crtp.urm.puml @@ -0,0 +1,2 @@ +@startuml +@enduml \ No newline at end of file diff --git a/health-check/etc/health-check.urm.puml b/health-check/etc/health-check.urm.puml new file mode 100644 index 000000000000..ebd0fa9678e7 --- /dev/null +++ b/health-check/etc/health-check.urm.puml @@ -0,0 +1,124 @@ +@startuml +package com.iluwatar.health.check { + class App { + + App() + + main(args : String[]) {static} + } + class AsynchronousHealthChecker { + - HEALTH_CHECK_FAILED_MESSAGE : String {static} + - HEALTH_CHECK_TIMEOUT_MESSAGE : String {static} + - LOGGER : Logger {static} + - healthCheckExecutor : ScheduledExecutorService + + AsynchronousHealthChecker() + - awaitTerminationWithTimeout() : boolean + + performCheck(healthCheck : Supplier, timeoutInSeconds : long) : CompletableFuture + + shutdown() + } + class CpuHealthIndicator { + - ERROR_MESSAGE : String {static} + - HIGH_LOAD_AVERAGE_MESSAGE : String {static} + - HIGH_LOAD_AVERAGE_MESSAGE_WITHOUT_PARAM : String {static} + - HIGH_PROCESS_CPU_LOAD_MESSAGE : String {static} + - HIGH_PROCESS_CPU_LOAD_MESSAGE_WITHOUT_PARAM : String {static} + - HIGH_SYSTEM_CPU_LOAD_MESSAGE : String {static} + - HIGH_SYSTEM_CPU_LOAD_MESSAGE_WITHOUT_PARAM : String {static} + - LOGGER : Logger {static} + - defaultWarningMessage : String + - loadAverageThreshold : double + - osBean : OperatingSystemMXBean + - processCpuLoadThreshold : double + - systemCpuLoadThreshold : double + + CpuHealthIndicator() + + getDefaultWarningMessage() : String + + getLoadAverageThreshold() : double + + getOsBean() : OperatingSystemMXBean + + getProcessCpuLoadThreshold() : double + + getSystemCpuLoadThreshold() : double + + health() : Health + + init() + + setDefaultWarningMessage(defaultWarningMessage : String) + + setLoadAverageThreshold(loadAverageThreshold : double) + + setOsBean(osBean : OperatingSystemMXBean) + + setProcessCpuLoadThreshold(processCpuLoadThreshold : double) + + setSystemCpuLoadThreshold(systemCpuLoadThreshold : double) + } + class CustomHealthIndicator { + - LOGGER : Logger {static} + - cacheManager : CacheManager + - healthCheckRepository : HealthCheckRepository + - healthChecker : AsynchronousHealthChecker + - timeoutInSeconds : long + + CustomHealthIndicator(healthChecker : AsynchronousHealthChecker, cacheManager : CacheManager, healthCheckRepository : HealthCheckRepository) + - check() : Health + + evictHealthCache() + + health() : Health + } + class DatabaseTransactionHealthIndicator { + - LOGGER : Logger {static} + - asynchronousHealthChecker : AsynchronousHealthChecker + - healthCheckRepository : HealthCheckRepository + - retryTemplate : RetryTemplate + - timeoutInSeconds : long + + DatabaseTransactionHealthIndicator(healthCheckRepository : HealthCheckRepository, asynchronousHealthChecker : AsynchronousHealthChecker, retryTemplate : RetryTemplate) + + getAsynchronousHealthChecker() : AsynchronousHealthChecker + + getHealthCheckRepository() : HealthCheckRepository + + getRetryTemplate() : RetryTemplate + + getTimeoutInSeconds() : long + + health() : Health + + setTimeoutInSeconds(timeoutInSeconds : long) + } + class GarbageCollectionHealthIndicator { + - LOGGER : Logger {static} + - memoryUsageThreshold : double + + GarbageCollectionHealthIndicator() + - addMemoryPoolDetails(collectorDetails : Map, memoryPoolMxBeans : List, memoryPoolNamesList : List) + - createCollectorDetails(gcBean : GarbageCollectorMXBean, memoryPoolMxBeans : List) : Map + # getGarbageCollectorMxBeans() : List + # getMemoryPoolMxBeans() : List + + getMemoryUsageThreshold() : double + + health() : Health + + setMemoryUsageThreshold(memoryUsageThreshold : double) + } + class HealthCheck { + - id : Integer + - status : String + + HealthCheck() + # canEqual(other : Object) : boolean + + equals(o : Object) : boolean + + getId() : Integer + + getStatus() : String + + hashCode() : int + + setId(id : Integer) + + setStatus(status : String) + + toString() : String + } + class HealthCheckRepository { + - HEALTH_CHECK_OK : String {static} + - LOGGER : Logger {static} + - entityManager : EntityManager + + HealthCheckRepository() + + checkHealth() : Integer + + performTestTransaction() + } + class MemoryHealthIndicator { + - LOGGER : Logger {static} + - asynchronousHealthChecker : AsynchronousHealthChecker + - memoryThreshold : double + - timeoutInSeconds : long + + MemoryHealthIndicator(asynchronousHealthChecker : AsynchronousHealthChecker) + + checkMemory() : Health + + health() : Health + } + class RetryConfig { + - backOffPeriod : long + - maxAttempts : int + + RetryConfig() + + retryTemplate() : RetryTemplate + } +} +DatabaseTransactionHealthIndicator --> "-asynchronousHealthChecker" AsynchronousHealthChecker +DatabaseTransactionHealthIndicator --> "-healthCheckRepository" HealthCheckRepository +CustomHealthIndicator --> "-healthCheckRepository" HealthCheckRepository +CustomHealthIndicator --> "-healthChecker" AsynchronousHealthChecker +MemoryHealthIndicator --> "-asynchronousHealthChecker" AsynchronousHealthChecker +@enduml \ No newline at end of file diff --git a/log-aggregation/etc/log-aggregation.urm.puml b/log-aggregation/etc/log-aggregation.urm.puml new file mode 100644 index 000000000000..1d4551ed025f --- /dev/null +++ b/log-aggregation/etc/log-aggregation.urm.puml @@ -0,0 +1,68 @@ +@startuml +package com.iluwatar.logaggregation { + class App { + + App() + + main(args : String[]) {static} + } + class CentralLogStore { + - LOGGER : Logger {static} + - logs : ConcurrentLinkedQueue + + CentralLogStore() + + displayLogs() + + storeLog(logEntry : LogEntry) + } + class LogAggregator { + - BUFFER_THRESHOLD : int {static} + - LOGGER : Logger {static} + - buffer : ConcurrentLinkedQueue + - centralLogStore : CentralLogStore + - executorService : ExecutorService + - logCount : AtomicInteger + - minLogLevel : LogLevel + + LogAggregator(centralLogStore : CentralLogStore, minLogLevel : LogLevel) + + collectLog(logEntry : LogEntry) + - flushBuffer() + - startBufferFlusher() + + stop() + } + class LogEntry { + - level : LogLevel + - message : String + - serviceName : String + - timestamp : LocalDateTime + + LogEntry(serviceName : String, level : LogLevel, message : String, timestamp : LocalDateTime) + # canEqual(other : Object) : boolean + + equals(o : Object) : boolean + + getLevel() : LogLevel + + getMessage() : String + + getServiceName() : String + + getTimestamp() : LocalDateTime + + hashCode() : int + + setLevel(level : LogLevel) + + setMessage(message : String) + + setServiceName(serviceName : String) + + setTimestamp(timestamp : LocalDateTime) + + toString() : String + } + enum LogLevel { + + DEBUG {static} + + ERROR {static} + + INFO {static} + + valueOf(name : String) : LogLevel {static} + + values() : LogLevel[] {static} + } + class LogProducer { + - LOGGER : Logger {static} + - aggregator : LogAggregator + - serviceName : String + + LogProducer(serviceName : String, aggregator : LogAggregator) + + generateLog(level : LogLevel, message : String) + } +} +LogAggregator --> "-centralLogStore" CentralLogStore +LogEntry --> "-level" LogLevel +CentralLogStore --> "-logs" LogEntry +LogAggregator --> "-buffer" LogEntry +LogAggregator --> "-minLogLevel" LogLevel +LogProducer --> "-aggregator" LogAggregator +@enduml \ No newline at end of file diff --git a/model-view-viewmodel/pom.xml b/model-view-viewmodel/pom.xml index 992b5247e999..09e85b55844a 100644 --- a/model-view-viewmodel/pom.xml +++ b/model-view-viewmodel/pom.xml @@ -32,7 +32,6 @@ com.iluwatar 1.26.0-SNAPSHOT - com.iluwatar model-view-viewmodel 1.26.0-SNAPSHOT diff --git a/optimistic-offline-lock/etc/optimistic-offline-lock.urm.puml b/optimistic-offline-lock/etc/optimistic-offline-lock.urm.puml new file mode 100644 index 000000000000..d2e861ad8f22 --- /dev/null +++ b/optimistic-offline-lock/etc/optimistic-offline-lock.urm.puml @@ -0,0 +1,59 @@ +@startuml +package com.iluwatar.repository { + interface JpaRepository { + + findById(long) : T {abstract} + + getEntityVersionById(long) : int {abstract} + + update(T) : int {abstract} + } +} +package com.iluwatar.api { + interface UpdateService { + + doUpdate(T, long) : T {abstract} + } +} +package com.iluwatar.service { + class CardUpdateService { + - cardJpaRepository : JpaRepository + + CardUpdateService(cardJpaRepository : JpaRepository) + + doUpdate(obj : Card, id : long) : Card + } +} +package com.iluwatar.model { + class Card { + - id : long + - personId : long + - sum : float + - version : int + + Card() + + Card(id : long, personId : long, sum : float, version : int) + + builder() : CardBuilder {static} + # canEqual(other : Object) : boolean + + equals(o : Object) : boolean + + getId() : long + + getPersonId() : long + + getSum() : float + + getVersion() : int + + hashCode() : int + + setId(id : long) + + setPersonId(personId : long) + + setSum(sum : float) + + setVersion(version : int) + + toString() : String + } + class CardBuilder { + - id : long + - personId : long + - sum : float + - version : int + ~ CardBuilder() + + build() : Card + + id(id : long) : CardBuilder + + personId(personId : long) : CardBuilder + + sum(sum : float) : CardBuilder + + toString() : String + + version(version : int) : CardBuilder + } +} +CardUpdateService --> "-cardJpaRepository" JpaRepository +CardUpdateService ..|> UpdateService +@enduml \ No newline at end of file diff --git a/slob/etc/slob.urm.puml b/slob/etc/slob.urm.puml new file mode 100644 index 000000000000..3e0c4c2e31b1 --- /dev/null +++ b/slob/etc/slob.urm.puml @@ -0,0 +1,122 @@ +@startuml +package com.iluwatar.slob.lob { + class Animal { + - animalsEaten : Set + - name : String + - plantsEaten : Set + + Animal() + + Animal(name : String, plantsEaten : Set, animalsEaten : Set) + # canEqual(other : Object) : boolean + + createObjectFromXml(node : Node) + + equals(o : Object) : boolean + + getAnimalsEaten() : Set + + getName() : String + + getPlantsEaten() : Set + + hashCode() : int + # iterateXmlForAnimalAndPlants(childNodes : NodeList, animalsEaten : Set, plantsEaten : Set) {static} + + setAnimalsEaten(animalsEaten : Set) + + setName(name : String) + + setPlantsEaten(plantsEaten : Set) + + toString() : String + + toXmlElement(xmlDoc : Document) : Element + } + class Forest { + - animals : Set + - name : String + - plants : Set + + Forest() + + Forest(name : String, animals : Set, plants : Set) + # canEqual(other : Object) : boolean + + createObjectFromXml(document : Document) + + equals(o : Object) : boolean + + getAnimals() : Set + + getName() : String + + getPlants() : Set + - getXmlDoc() : Document + + hashCode() : int + + setAnimals(animals : Set) + + setName(name : String) + + setPlants(plants : Set) + + toString() : String + + toXmlElement() : Element + } + class Plant { + - name : String + - type : String + + Plant() + + Plant(name : String, type : String) + # canEqual(other : Object) : boolean + + createObjectFromXml(node : Node) + + equals(o : Object) : boolean + + getName() : String + + getType() : String + + hashCode() : int + + setName(name : String) + + setType(type : String) + + toString() : String + + toXmlElement(xmlDoc : Document) : Element + } +} +package com.iluwatar.slob.serializers { + class BlobSerializer { + + TYPE_OF_DATA_FOR_DB : String {static} + + BlobSerializer() + + deSerialize(toDeserialize : Object) : Forest + + serialize(toSerialize : Forest) : Object + } + class ClobSerializer { + + TYPE_OF_DATA_FOR_DB : String {static} + + ClobSerializer() + + deSerialize(toDeserialize : Object) : Forest + - elementToXmlString(node : Element) : String {static} + + serialize(forest : Forest) : Object + } + abstract class LobSerializer { + - databaseService : DatabaseService + # LobSerializer(dataTypeDb : String) + + close() + + deSerialize(Object) : Forest {abstract} + + loadFromDb(id : int, columnName : String) : Object + + persistToDb(id : int, name : String, object : Object) : int + + serialize(Forest) : Object {abstract} + } +} +package com.iluwatar.slob.dbservice { + class DatabaseService { + + BINARY_DATA : String {static} + + CREATE_BINARY_SCHEMA_DDL : String {static} + + CREATE_TEXT_SCHEMA_DDL : String {static} + - DB_URL : String {static} + + DELETE_SCHEMA_SQL : String {static} + - INSERT : String {static} + - LOGGER : Logger {static} + - SELECT : String {static} + - dataSource : DataSource {static} + + dataTypeDb : String + + DatabaseService(dataTypeDb : String) + - createDataSource() : DataSource {static} + + insert(id : int, name : String, data : Object) + + select(id : long, columnsName : String) : Object + + shutDownService() + + startupService() + } +} +package com.iluwatar.slob { + class App { + + CLOB : String {static} + - LOGGER : Logger {static} + + App() + - createForest() : Forest {static} + - createLobSerializer(args : String[]) : LobSerializer {static} + - executeSerializer(forest : Forest, lobSerializer : LobSerializer) {static} + + main(args : String[]) {static} + } +} +Animal --> "-plantsEaten" Plant +LobSerializer --> "-databaseService" DatabaseService +Forest --> "-animals" Animal +Forest --> "-plants" Plant +Animal --> "-animalsEaten" Animal +BlobSerializer --|> LobSerializer +ClobSerializer --|> LobSerializer +@enduml \ No newline at end of file diff --git a/slob/pom.xml b/slob/pom.xml index 5f95d4c1b2c2..a53a6f4c409f 100644 --- a/slob/pom.xml +++ b/slob/pom.xml @@ -68,11 +68,6 @@ com.h2database 2.2.220 - - lombok - org.projectlombok - provided - diff --git a/thread-local-storage/etc/thread-local-storage.urm.puml b/thread-local-storage/etc/thread-local-storage.urm.puml new file mode 100644 index 000000000000..f6e682a019ac --- /dev/null +++ b/thread-local-storage/etc/thread-local-storage.urm.puml @@ -0,0 +1,29 @@ +@startuml +package com.iluwatar { + abstract class AbstractThreadLocalExample { + - RANDOM_THREAD_PARK_END : Integer {static} + - RANDOM_THREAD_PARK_START : Integer {static} + - RND : SecureRandom {static} + + AbstractThreadLocalExample() + - getThreadName() : String + # getter() : Supplier {abstract} + + run() + # setter() : Consumer {abstract} + } + class WithThreadLocal { + - value : ThreadLocal + + WithThreadLocal(value : ThreadLocal) + # getter() : Supplier + + remove() + # setter() : Consumer + } + class WithoutThreadLocal { + - value : Integer + + WithoutThreadLocal(value : Integer) + # getter() : Supplier + # setter() : Consumer + } +} +WithThreadLocal --|> AbstractThreadLocalExample +WithoutThreadLocal --|> AbstractThreadLocalExample +@enduml \ No newline at end of file From 6e806c238efa73b2da5b1d201f534e5b95d7930d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Wed, 27 Mar 2024 20:49:00 +0200 Subject: [PATCH 013/580] deps: update slf4j and logback --- pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pom.xml b/pom.xml index 2e1b3312b38b..58736e47cd75 100644 --- a/pom.xml +++ b/pom.xml @@ -48,6 +48,8 @@ 3.3.0 4.3 2.1.1 + 2.0.12 + 1.5.3 https://sonarcloud.io iluwatar @@ -264,14 +266,17 @@ org.slf4j slf4j-api + ${slf4j.version} ch.qos.logback logback-classic + ${logback.version} ch.qos.logback logback-core + ${logback.version} org.projectlombok From 2b934dfaef5442866d2f72ddf91b6f402e3143b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Wed, 27 Mar 2024 21:17:35 +0200 Subject: [PATCH 014/580] workaround: Skip failing tests --- .../test/java/com/iluwatar/subclasssandbox/GroundDiveTest.java | 2 ++ .../test/java/com/iluwatar/subclasssandbox/SkyLaunchTest.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/subclass-sandbox/src/test/java/com/iluwatar/subclasssandbox/GroundDiveTest.java b/subclass-sandbox/src/test/java/com/iluwatar/subclasssandbox/GroundDiveTest.java index 03c6b2e5c8ba..6df91255766d 100644 --- a/subclass-sandbox/src/test/java/com/iluwatar/subclasssandbox/GroundDiveTest.java +++ b/subclass-sandbox/src/test/java/com/iluwatar/subclasssandbox/GroundDiveTest.java @@ -28,11 +28,13 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import com.github.stefanbirkner.systemlambda.Statement; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; /** * GroundDive unit tests. */ +@Disabled class GroundDiveTest { @Test diff --git a/subclass-sandbox/src/test/java/com/iluwatar/subclasssandbox/SkyLaunchTest.java b/subclass-sandbox/src/test/java/com/iluwatar/subclasssandbox/SkyLaunchTest.java index 87cee4f3c697..f99a4565a989 100644 --- a/subclass-sandbox/src/test/java/com/iluwatar/subclasssandbox/SkyLaunchTest.java +++ b/subclass-sandbox/src/test/java/com/iluwatar/subclasssandbox/SkyLaunchTest.java @@ -28,11 +28,13 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import com.github.stefanbirkner.systemlambda.Statement; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; /** * SkyLaunch unit tests. */ +@Disabled class SkyLaunchTest { @Test From 910d6a75795a5e164e618f4c392e3e5527ae80c9 Mon Sep 17 00:00:00 2001 From: Jun Kang Date: Fri, 29 Mar 2024 03:42:54 +0900 Subject: [PATCH 015/580] deps: Updated the maven imports of layers pattern for SpringBoot 3.2.4 (#2861) * Updated the imports in code of the single table inheritance pattern for Spring Boot 3.x #2825 Change javax library to jakarta * add pom.xml * Updated the imports in code of the healthcheck pattern for SpringBoot 3.x Change javax library to jakarta and update maven dependency versions * change order of imports to pass Checkstyle violations * change import order to pass lexicographical order test * change import order to pass CustomImportOrder warning * Updated the maven imports of layers pattern for SpringBoot 3.2.4 * remove unused maven import --- layers/pom.xml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/layers/pom.xml b/layers/pom.xml index 425b8eaedc6f..6a769e08cc26 100644 --- a/layers/pom.xml +++ b/layers/pom.xml @@ -34,6 +34,19 @@ layers layers layers + + + + + org.springframework.boot + spring-boot-dependencies + pom + 3.2.4 + import + + + + org.springframework.boot From baa7793f3cc3483ad589b058cb46ad56213a9a5d Mon Sep 17 00:00:00 2001 From: Aditya <76624290+MaverickWingman@users.noreply.github.com> Date: Fri, 29 Mar 2024 14:33:18 +0530 Subject: [PATCH 016/580] deps: htmlunit #2852: MaverickWingman (#2864) * #2852 Upgrade Htmlunit * #2852 Upgrade Htmlunit * 2852: Checkstyle Done! * Update dependabot.yml --- .github/dependabot.yml | 2 +- page-object/pom.xml | 2 +- .../com/iluwatar/pageobject/AlbumListPageTest.java | 2 +- .../com/iluwatar/pageobject/AlbumPageTest.java | 2 +- .../com/iluwatar/pageobject/LoginPageTest.java | 2 +- .../iluwatar/pageobject/pages/AlbumListPage.java | 6 +++--- .../com/iluwatar/pageobject/pages/AlbumPage.java | 14 +++++++------- .../com/iluwatar/pageobject/pages/LoginPage.java | 10 +++++----- .../java/com/iluwatar/pageobject/pages/Page.java | 2 +- page-object/test-automation/pom.xml | 2 +- .../com/iluwatar/pageobject/AlbumListPage.java | 6 +++--- .../java/com/iluwatar/pageobject/AlbumPage.java | 12 ++++++------ .../java/com/iluwatar/pageobject/LoginPage.java | 10 +++++----- .../main/java/com/iluwatar/pageobject/Page.java | 2 +- .../com/iluwatar/pageobject/AlbumListPageTest.java | 2 +- .../com/iluwatar/pageobject/AlbumPageTest.java | 2 +- .../com/iluwatar/pageobject/LoginPageTest.java | 2 +- pom.xml | 4 ++-- 18 files changed, 42 insertions(+), 42 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index d4cd65774353..1f63bf5ff8b3 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -8,4 +8,4 @@ updates: - package-ecosystem: "maven" # See documentation for possible values directory: "/" # Location of package manifests schedule: - interval: "weekly" + interval: "weekly" \ No newline at end of file diff --git a/page-object/pom.xml b/page-object/pom.xml index 3e78d2f0c431..4f70425c9874 100644 --- a/page-object/pom.xml +++ b/page-object/pom.xml @@ -33,7 +33,7 @@ - net.sourceforge.htmlunit + org.htmlunit htmlunit test diff --git a/page-object/src/test/java/com/iluwatar/pageobject/AlbumListPageTest.java b/page-object/src/test/java/com/iluwatar/pageobject/AlbumListPageTest.java index 9bab578a5d47..4b565cc8b26b 100644 --- a/page-object/src/test/java/com/iluwatar/pageobject/AlbumListPageTest.java +++ b/page-object/src/test/java/com/iluwatar/pageobject/AlbumListPageTest.java @@ -26,7 +26,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; -import com.gargoylesoftware.htmlunit.WebClient; +import org.htmlunit.WebClient; import com.iluwatar.pageobject.pages.AlbumListPage; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/page-object/src/test/java/com/iluwatar/pageobject/AlbumPageTest.java b/page-object/src/test/java/com/iluwatar/pageobject/AlbumPageTest.java index 4448efbd8d1e..7dbd1b91d580 100644 --- a/page-object/src/test/java/com/iluwatar/pageobject/AlbumPageTest.java +++ b/page-object/src/test/java/com/iluwatar/pageobject/AlbumPageTest.java @@ -26,7 +26,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; -import com.gargoylesoftware.htmlunit.WebClient; +import org.htmlunit.WebClient; import com.iluwatar.pageobject.pages.AlbumPage; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/page-object/src/test/java/com/iluwatar/pageobject/LoginPageTest.java b/page-object/src/test/java/com/iluwatar/pageobject/LoginPageTest.java index ac74aee1274e..4e525b13e176 100644 --- a/page-object/src/test/java/com/iluwatar/pageobject/LoginPageTest.java +++ b/page-object/src/test/java/com/iluwatar/pageobject/LoginPageTest.java @@ -26,7 +26,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; -import com.gargoylesoftware.htmlunit.WebClient; +import org.htmlunit.WebClient; import com.iluwatar.pageobject.pages.LoginPage; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/page-object/src/test/java/com/iluwatar/pageobject/pages/AlbumListPage.java b/page-object/src/test/java/com/iluwatar/pageobject/pages/AlbumListPage.java index f5126db59567..f4d769187dad 100644 --- a/page-object/src/test/java/com/iluwatar/pageobject/pages/AlbumListPage.java +++ b/page-object/src/test/java/com/iluwatar/pageobject/pages/AlbumListPage.java @@ -24,9 +24,9 @@ */ package com.iluwatar.pageobject.pages; -import com.gargoylesoftware.htmlunit.WebClient; -import com.gargoylesoftware.htmlunit.html.HtmlAnchor; -import com.gargoylesoftware.htmlunit.html.HtmlPage; +import org.htmlunit.WebClient; +import org.htmlunit.html.HtmlAnchor; +import org.htmlunit.html.HtmlPage; import java.io.IOException; import java.util.List; diff --git a/page-object/src/test/java/com/iluwatar/pageobject/pages/AlbumPage.java b/page-object/src/test/java/com/iluwatar/pageobject/pages/AlbumPage.java index 92df556a5e41..385bcf86c916 100644 --- a/page-object/src/test/java/com/iluwatar/pageobject/pages/AlbumPage.java +++ b/page-object/src/test/java/com/iluwatar/pageobject/pages/AlbumPage.java @@ -24,13 +24,13 @@ */ package com.iluwatar.pageobject.pages; -import com.gargoylesoftware.htmlunit.WebClient; -import com.gargoylesoftware.htmlunit.html.HtmlNumberInput; -import com.gargoylesoftware.htmlunit.html.HtmlOption; -import com.gargoylesoftware.htmlunit.html.HtmlPage; -import com.gargoylesoftware.htmlunit.html.HtmlSelect; -import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput; -import com.gargoylesoftware.htmlunit.html.HtmlTextInput; +import org.htmlunit.WebClient; +import org.htmlunit.html.HtmlNumberInput; +import org.htmlunit.html.HtmlOption; +import org.htmlunit.html.HtmlPage; +import org.htmlunit.html.HtmlSelect; +import org.htmlunit.html.HtmlSubmitInput; +import org.htmlunit.html.HtmlTextInput; import java.io.IOException; /** diff --git a/page-object/src/test/java/com/iluwatar/pageobject/pages/LoginPage.java b/page-object/src/test/java/com/iluwatar/pageobject/pages/LoginPage.java index afdc9650ea18..5d2ef992e0f3 100644 --- a/page-object/src/test/java/com/iluwatar/pageobject/pages/LoginPage.java +++ b/page-object/src/test/java/com/iluwatar/pageobject/pages/LoginPage.java @@ -24,11 +24,11 @@ */ package com.iluwatar.pageobject.pages; -import com.gargoylesoftware.htmlunit.WebClient; -import com.gargoylesoftware.htmlunit.html.HtmlPage; -import com.gargoylesoftware.htmlunit.html.HtmlPasswordInput; -import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput; -import com.gargoylesoftware.htmlunit.html.HtmlTextInput; +import org.htmlunit.WebClient; +import org.htmlunit.html.HtmlPage; +import org.htmlunit.html.HtmlPasswordInput; +import org.htmlunit.html.HtmlSubmitInput; +import org.htmlunit.html.HtmlTextInput; import java.io.IOException; /** diff --git a/page-object/src/test/java/com/iluwatar/pageobject/pages/Page.java b/page-object/src/test/java/com/iluwatar/pageobject/pages/Page.java index eb164d31e4da..5331e03fe9c4 100644 --- a/page-object/src/test/java/com/iluwatar/pageobject/pages/Page.java +++ b/page-object/src/test/java/com/iluwatar/pageobject/pages/Page.java @@ -24,7 +24,7 @@ */ package com.iluwatar.pageobject.pages; -import com.gargoylesoftware.htmlunit.WebClient; +import org.htmlunit.WebClient; /** * Encapsulation for a generic 'Page' diff --git a/page-object/test-automation/pom.xml b/page-object/test-automation/pom.xml index 851fdf376598..81bdf93fbb98 100644 --- a/page-object/test-automation/pom.xml +++ b/page-object/test-automation/pom.xml @@ -40,7 +40,7 @@ test - net.sourceforge.htmlunit + org.htmlunit htmlunit diff --git a/page-object/test-automation/src/main/java/com/iluwatar/pageobject/AlbumListPage.java b/page-object/test-automation/src/main/java/com/iluwatar/pageobject/AlbumListPage.java index 83917be917aa..fa58b9cafede 100644 --- a/page-object/test-automation/src/main/java/com/iluwatar/pageobject/AlbumListPage.java +++ b/page-object/test-automation/src/main/java/com/iluwatar/pageobject/AlbumListPage.java @@ -24,12 +24,12 @@ */ package com.iluwatar.pageobject; -import com.gargoylesoftware.htmlunit.WebClient; -import com.gargoylesoftware.htmlunit.html.HtmlAnchor; -import com.gargoylesoftware.htmlunit.html.HtmlPage; import java.io.IOException; import java.util.List; import lombok.extern.slf4j.Slf4j; +import org.htmlunit.WebClient; +import org.htmlunit.html.HtmlAnchor; +import org.htmlunit.html.HtmlPage; /** * Page Object encapsulating the Album List page (album-list.html) diff --git a/page-object/test-automation/src/main/java/com/iluwatar/pageobject/AlbumPage.java b/page-object/test-automation/src/main/java/com/iluwatar/pageobject/AlbumPage.java index 625293a7a2cc..64d833551cdd 100644 --- a/page-object/test-automation/src/main/java/com/iluwatar/pageobject/AlbumPage.java +++ b/page-object/test-automation/src/main/java/com/iluwatar/pageobject/AlbumPage.java @@ -24,14 +24,14 @@ */ package com.iluwatar.pageobject; -import com.gargoylesoftware.htmlunit.WebClient; -import com.gargoylesoftware.htmlunit.html.HtmlNumberInput; -import com.gargoylesoftware.htmlunit.html.HtmlPage; -import com.gargoylesoftware.htmlunit.html.HtmlSelect; -import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput; -import com.gargoylesoftware.htmlunit.html.HtmlTextInput; import java.io.IOException; import lombok.extern.slf4j.Slf4j; +import org.htmlunit.WebClient; +import org.htmlunit.html.HtmlNumberInput; +import org.htmlunit.html.HtmlPage; +import org.htmlunit.html.HtmlSelect; +import org.htmlunit.html.HtmlSubmitInput; +import org.htmlunit.html.HtmlTextInput; /** * Page Object encapsulating the Album Page (album-page.html) diff --git a/page-object/test-automation/src/main/java/com/iluwatar/pageobject/LoginPage.java b/page-object/test-automation/src/main/java/com/iluwatar/pageobject/LoginPage.java index f87b58e76867..2f48e08938dc 100644 --- a/page-object/test-automation/src/main/java/com/iluwatar/pageobject/LoginPage.java +++ b/page-object/test-automation/src/main/java/com/iluwatar/pageobject/LoginPage.java @@ -24,13 +24,13 @@ */ package com.iluwatar.pageobject; -import com.gargoylesoftware.htmlunit.WebClient; -import com.gargoylesoftware.htmlunit.html.HtmlPage; -import com.gargoylesoftware.htmlunit.html.HtmlPasswordInput; -import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput; -import com.gargoylesoftware.htmlunit.html.HtmlTextInput; import java.io.IOException; import lombok.extern.slf4j.Slf4j; +import org.htmlunit.WebClient; +import org.htmlunit.html.HtmlPage; +import org.htmlunit.html.HtmlPasswordInput; +import org.htmlunit.html.HtmlSubmitInput; +import org.htmlunit.html.HtmlTextInput; /** * Page Object encapsulating the Login Page (login.html) diff --git a/page-object/test-automation/src/main/java/com/iluwatar/pageobject/Page.java b/page-object/test-automation/src/main/java/com/iluwatar/pageobject/Page.java index 49e7397fa5c5..0a2186f43b84 100644 --- a/page-object/test-automation/src/main/java/com/iluwatar/pageobject/Page.java +++ b/page-object/test-automation/src/main/java/com/iluwatar/pageobject/Page.java @@ -24,7 +24,7 @@ */ package com.iluwatar.pageobject; -import com.gargoylesoftware.htmlunit.WebClient; +import org.htmlunit.WebClient; /** * Encapsulation for a generic 'Page'. diff --git a/page-object/test-automation/src/test/java/com/iluwatar/pageobject/AlbumListPageTest.java b/page-object/test-automation/src/test/java/com/iluwatar/pageobject/AlbumListPageTest.java index 519baa4edef9..ff6dd877d50c 100644 --- a/page-object/test-automation/src/test/java/com/iluwatar/pageobject/AlbumListPageTest.java +++ b/page-object/test-automation/src/test/java/com/iluwatar/pageobject/AlbumListPageTest.java @@ -26,7 +26,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; -import com.gargoylesoftware.htmlunit.WebClient; +import org.htmlunit.WebClient; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/page-object/test-automation/src/test/java/com/iluwatar/pageobject/AlbumPageTest.java b/page-object/test-automation/src/test/java/com/iluwatar/pageobject/AlbumPageTest.java index f0586ee40320..830201c1cbcd 100644 --- a/page-object/test-automation/src/test/java/com/iluwatar/pageobject/AlbumPageTest.java +++ b/page-object/test-automation/src/test/java/com/iluwatar/pageobject/AlbumPageTest.java @@ -26,7 +26,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; -import com.gargoylesoftware.htmlunit.WebClient; +import org.htmlunit.WebClient; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/page-object/test-automation/src/test/java/com/iluwatar/pageobject/LoginPageTest.java b/page-object/test-automation/src/test/java/com/iluwatar/pageobject/LoginPageTest.java index 3e0bb6736d10..ed6232030610 100644 --- a/page-object/test-automation/src/test/java/com/iluwatar/pageobject/LoginPageTest.java +++ b/page-object/test-automation/src/test/java/com/iluwatar/pageobject/LoginPageTest.java @@ -26,7 +26,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; -import com.gargoylesoftware.htmlunit.WebClient; +import org.htmlunit.WebClient; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/pom.xml b/pom.xml index 58736e47cd75..399e7f9895a7 100644 --- a/pom.xml +++ b/pom.xml @@ -40,7 +40,7 @@ 2.7.5 0.8.11 1.4 - 2.70.0 + 3.11.0 2.10.1 5.1.0 1.1.0 @@ -240,7 +240,7 @@ ${commons-dbcp.version} - net.sourceforge.htmlunit + org.htmlunit htmlunit ${htmlunit.version} From 5bba35aad2630a136d2186765af0a0cc8db75dd5 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 29 Mar 2024 11:03:31 +0200 Subject: [PATCH 017/580] docs: add MaverickWingman as a contributor for code (#2866) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 3 ++- README.md | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index ce1a7bd24039..e67a282361f2 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2963,7 +2963,8 @@ "avatar_url": "https://avatars.githubusercontent.com/u/76624290?v=4", "profile": "https://github.com/MaverickWingman", "contributions": [ - "doc" + "doc", + "code" ] }, { diff --git a/README.md b/README.md index e53ba764d97e..155e0e8fd5f2 100644 --- a/README.md +++ b/README.md @@ -492,7 +492,7 @@ This project is licensed under the terms of the MIT license. jerryyummy
jerryyummy

🌠Manoj Chowdary
Manoj Chowdary

💻 - Aditya
Aditya

📖 + Aditya
Aditya

📖 💻 nooynayr
nooynayr

📖 CYBERCRUX2
CYBERCRUX2

📖 Luis Mateo Hincapié Martinez
Luis Mateo Hincapié Martinez

🌠From 254504e52ef9f5a1f323d53f9e15af966abeb1be Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Mar 2024 13:12:37 +0200 Subject: [PATCH 018/580] build(deps): bump org.eclipse.jetty:jetty-maven-plugin (#2868) Bumps org.eclipse.jetty:jetty-maven-plugin from 9.4.28.v20200408 to 11.0.20. --- updated-dependencies: - dependency-name: org.eclipse.jetty:jetty-maven-plugin dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- model-view-viewmodel/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model-view-viewmodel/pom.xml b/model-view-viewmodel/pom.xml index 09e85b55844a..b7199d34111d 100644 --- a/model-view-viewmodel/pom.xml +++ b/model-view-viewmodel/pom.xml @@ -36,7 +36,7 @@ 1.26.0-SNAPSHOT 9.0.0 - 9.4.28.v20200408 + 11.0.20 3.4.0 yyyy-MM-dd -${project.version}-FL-${maven.build.timestamp} From ea7bc2a4ebb758bf0fe3bbb854363e30c0dab0ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Fri, 29 Mar 2024 13:31:42 +0200 Subject: [PATCH 019/580] docs: update PR template --- PULL_REQUEST_TEMPLATE.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md index 097054fe54b3..5ce9356e40e3 100644 --- a/PULL_REQUEST_TEMPLATE.md +++ b/PULL_REQUEST_TEMPLATE.md @@ -1,15 +1,14 @@ + -Pull request description +## What problem does this PR solve? -- 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 f80cc468b24d0b2ab7e03b8951ed4bec59f8c5bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Fri, 29 Mar 2024 14:13:26 +0200 Subject: [PATCH 020/580] docs: collecting parameter docs + formatting --- abstract-document/README.md | 121 +++++--- abstract-factory/README.md | 112 ++++--- active-object/README.md | 103 ++++--- acyclic-visitor/README.md | 28 +- adapter/README.md | 51 +-- aggregator-microservices/README.md | 54 +++- ambassador/README.md | 133 ++++---- anti-corruption-layer/README.md | 129 +++++--- api-gateway/README.md | 64 ++-- arrange-act-assert/README.md | 13 +- async-method-invocation/README.md | 164 +++++----- balking/README.md | 60 ++-- bridge/README.md | 84 +++-- builder/README.md | 109 ++++--- business-delegate/README.md | 39 ++- bytecode/README.md | 51 ++- caching/README.md | 92 ++++-- callback/README.md | 36 ++- chain-of-responsibility/README.md | 92 +++--- circuit-breaker/README.md | 291 +++++++++--------- client-session/README.md | 43 ++- collecting-parameter/README.md | 114 ++++--- .../collectingparameter/PrinterQueueTest.java | 2 - 23 files changed, 1191 insertions(+), 794 deletions(-) diff --git a/abstract-document/README.md b/abstract-document/README.md index 7c30819c7f6b..f5bc50d99857 100644 --- a/abstract-document/README.md +++ b/abstract-document/README.md @@ -2,23 +2,27 @@ title: Abstract Document category: Structural language: en -tag: - - Abstraction - - Extensibility - - Decoupling +tag: + - Abstraction + - Extensibility + - Decoupling --- ## Intent -The Abstract Document design pattern is a structural design pattern that aims to provide a consistent way to handle hierarchical and tree-like data structures by defining a common interface for various document types. It separates the core document structure from specific data formats, enabling dynamic updates and simplified maintenance. +The Abstract Document design pattern is a structural design pattern that aims to provide a consistent way to handle +hierarchical and tree-like data structures by defining a common interface for various document types. It separates the +core document structure from specific data formats, enabling dynamic updates and simplified maintenance. ## Explanation -The Abstract Document pattern enables handling additional, non-static properties. This pattern uses concept of traits to enable type safety and separate properties of different classes into set of interfaces. +The Abstract Document pattern enables handling additional, non-static properties. This pattern uses concept of traits to +enable type safety and separate properties of different classes into set of interfaces. Real world example -> Consider a car that consists of multiple parts. However, we don't know if the specific car really has all the parts, or just some of them. Our cars are dynamic and extremely flexible. +> Consider a car that consists of multiple parts. However, we don't know if the specific car really has all the parts, +> or just some of them. Our cars are dynamic and extremely flexible. In plain words @@ -26,11 +30,15 @@ In plain words Wikipedia says -> An object-oriented structural design pattern for organizing objects in loosely typed key-value stores and exposing the data using typed views. The purpose of the pattern is to achieve a high degree of flexibility between components in a strongly typed language where new properties can be added to the object-tree on the fly, without losing the support of type-safety. The pattern makes use of traits to separate different properties of a class into different interfaces. +> An object-oriented structural design pattern for organizing objects in loosely typed key-value stores and exposing the +> data using typed views. The purpose of the pattern is to achieve a high degree of flexibility between components in a +> strongly typed language where new properties can be added to the object-tree on the fly, without losing the support of +> type-safety. The pattern makes use of traits to separate different properties of a class into different interfaces. **Programmatic Example** -Let's first define the base classes `Document` and `AbstractDocument`. They basically make the object hold a property map and any amount of child objects. +Let's first define the base classes `Document` and `AbstractDocument`. They basically make the object hold a property +map and any amount of child objects. ```java public interface Document { @@ -75,7 +83,9 @@ public abstract class AbstractDocument implements Document { ... } ``` -Next we define an enum `Property` and a set of interfaces for type, price, model and parts. This allows us to create static looking interface to our `Car` class. + +Next we define an enum `Property` and a set of interfaces for type, price, model and parts. This allows us to create +static looking interface to our `Car` class. ```java public enum Property { @@ -96,6 +106,7 @@ public interface HasPrice extends Document { return Optional.ofNullable((Number) get(Property.PRICE.toString())); } } + public interface HasModel extends Document { default Optional getModel() { @@ -127,40 +138,40 @@ And finally here's how we construct and use the `Car` in a full example. ```java LOGGER.info("Constructing parts and car"); - var wheelProperties = Map.of( - Property.TYPE.toString(), "wheel", - Property.MODEL.toString(), "15C", - Property.PRICE.toString(), 100L); + var wheelProperties=Map.of( + Property.TYPE.toString(),"wheel", + Property.MODEL.toString(),"15C", + Property.PRICE.toString(),100L); - var doorProperties = Map.of( - Property.TYPE.toString(), "door", - Property.MODEL.toString(), "Lambo", - Property.PRICE.toString(), 300L); + var doorProperties=Map.of( + Property.TYPE.toString(),"door", + Property.MODEL.toString(),"Lambo", + Property.PRICE.toString(),300L); - var carProperties = Map.of( - Property.MODEL.toString(), "300SL", - Property.PRICE.toString(), 10000L, - Property.PARTS.toString(), List.of(wheelProperties, doorProperties)); + var carProperties=Map.of( + Property.MODEL.toString(),"300SL", + Property.PRICE.toString(),10000L, + Property.PARTS.toString(),List.of(wheelProperties,doorProperties)); - var car = new Car(carProperties); + var car=new Car(carProperties); LOGGER.info("Here is our car:"); - LOGGER.info("-> model: {}", car.getModel().orElseThrow()); - LOGGER.info("-> price: {}", car.getPrice().orElseThrow()); + LOGGER.info("-> model: {}",car.getModel().orElseThrow()); + LOGGER.info("-> price: {}",car.getPrice().orElseThrow()); LOGGER.info("-> parts: "); - car.getParts().forEach(p -> LOGGER.info("\t{}/{}/{}", - p.getType().orElse(null), - p.getModel().orElse(null), - p.getPrice().orElse(null)) + car.getParts().forEach(p->LOGGER.info("\t{}/{}/{}", + p.getType().orElse(null), + p.getModel().orElse(null), + p.getPrice().orElse(null)) ); - // Constructing parts and car - // Here is our car: - // model: 300SL - // price: 10000 - // parts: - // wheel/15C/100 - // door/Lambo/300 +// Constructing parts and car +// Here is our car: +// model: 300SL +// price: 10000 +// parts: +// wheel/15C/100 +// door/Lambo/300 ``` ## Class diagram @@ -169,21 +180,38 @@ And finally here's how we construct and use the `Car` in a full example. ## Applicability -This pattern is particularly useful in scenarios where you have different types of documents that share some common attributes or behaviors, but also have unique attributes or behaviors specific to their individual types. Here are some scenarios where the Abstract Document design pattern can be applicable: +This pattern is particularly useful in scenarios where you have different types of documents that share some common +attributes or behaviors, but also have unique attributes or behaviors specific to their individual types. Here are some +scenarios where the Abstract Document design pattern can be applicable: -* Content Management Systems (CMS): In a CMS, you might have various types of content such as articles, images, videos, etc. Each type of content could have shared attributes like creation date, author, and tags, while also having specific attributes like image dimensions for images or video duration for videos. +* Content Management Systems (CMS): In a CMS, you might have various types of content such as articles, images, videos, + etc. Each type of content could have shared attributes like creation date, author, and tags, while also having + specific attributes like image dimensions for images or video duration for videos. -* File Systems: If you're designing a file system where different types of files need to be managed, such as documents, images, audio files, and directories, the Abstract Document pattern can help provide a consistent way to access attributes like file size, creation date, etc., while allowing for specific attributes like image resolution or audio duration. +* File Systems: If you're designing a file system where different types of files need to be managed, such as documents, + images, audio files, and directories, the Abstract Document pattern can help provide a consistent way to access + attributes like file size, creation date, etc., while allowing for specific attributes like image resolution or audio + duration. -* E-commerce Systems: An e-commerce platform might have different product types such as physical products, digital downloads, and subscriptions. Each type could share common attributes like name, price, and description, while having unique attributes like shipping weight for physical products or download link for digital products. +* E-commerce Systems: An e-commerce platform might have different product types such as physical products, digital + downloads, and subscriptions. Each type could share common attributes like name, price, and description, while having + unique attributes like shipping weight for physical products or download link for digital products. -* Medical Records Systems: In healthcare, patient records might include various types of data such as demographics, medical history, test results, and prescriptions. The Abstract Document pattern can help manage shared attributes like patient ID and date of birth, while accommodating specialized attributes like test results or prescribed medications. +* Medical Records Systems: In healthcare, patient records might include various types of data such as demographics, + medical history, test results, and prescriptions. The Abstract Document pattern can help manage shared attributes like + patient ID and date of birth, while accommodating specialized attributes like test results or prescribed medications. -* Configuration Management: When dealing with configuration settings for software applications, there can be different types of configuration elements, each with its own set of attributes. The Abstract Document pattern can be used to manage these configuration elements while ensuring a consistent way to access and manipulate their attributes. +* Configuration Management: When dealing with configuration settings for software applications, there can be different + types of configuration elements, each with its own set of attributes. The Abstract Document pattern can be used to + manage these configuration elements while ensuring a consistent way to access and manipulate their attributes. -* Educational Platforms: Educational systems might have various types of learning materials such as text-based content, videos, quizzes, and assignments. Common attributes like title, author, and publication date can be shared, while unique attributes like video duration or assignment due dates can be specific to each type. +* Educational Platforms: Educational systems might have various types of learning materials such as text-based content, + videos, quizzes, and assignments. Common attributes like title, author, and publication date can be shared, while + unique attributes like video duration or assignment due dates can be specific to each type. -* Project Management Tools: In project management applications, you could have different types of tasks like to-do items, milestones, and issues. The Abstract Document pattern could be used to handle general attributes like task name and assignee, while allowing for specific attributes like milestone date or issue priority. +* Project Management Tools: In project management applications, you could have different types of tasks like to-do + items, milestones, and issues. The Abstract Document pattern could be used to handle general attributes like task name + and assignee, while allowing for specific attributes like milestone date or issue priority. * Documents have diverse and evolving attribute structures. @@ -193,7 +221,10 @@ This pattern is particularly useful in scenarios where you have different types * Maintainability and flexibility are critical for the codebase. -The key idea behind the Abstract Document design pattern is to provide a flexible and extensible way to manage different types of documents or entities with shared and distinct attributes. By defining a common interface and implementing it across various document types, you can achieve a more organized and consistent approach to handling complex data structures. +The key idea behind the Abstract Document design pattern is to provide a flexible and extensible way to manage different +types of documents or entities with shared and distinct attributes. By defining a common interface and implementing it +across various document types, you can achieve a more organized and consistent approach to handling complex data +structures. ## Consequences diff --git a/abstract-factory/README.md b/abstract-factory/README.md index 4d5ff98a2165..c7db990bdc61 100644 --- a/abstract-factory/README.md +++ b/abstract-factory/README.md @@ -3,9 +3,9 @@ title: Abstract Factory category: Creational language: en tag: - - Abstraction - - Decoupling - - Gang of Four + - Abstraction + - Decoupling + - Gang of Four --- ## Also known as @@ -14,25 +14,32 @@ Kit ## Intent -The Abstract Factory design pattern provides a way to create families of related objects without specifying their concrete classes. This allows for code that is independent of the specific classes of objects it uses, promoting flexibility and maintainability. +The Abstract Factory design pattern provides a way to create families of related objects without specifying their +concrete classes. This allows for code that is independent of the specific classes of objects it uses, promoting +flexibility and maintainability. ## Explanation Real-world example -> To create a kingdom we need objects with a common theme. The elven kingdom needs an elven king, elven castle, and elven army whereas the orcish kingdom needs an orcish king, orcish castle, and orcish army. There is a dependency between the objects in the kingdom. +> To create a kingdom we need objects with a common theme. The elven kingdom needs an elven king, elven castle, and +> elven army whereas the orcish kingdom needs an orcish king, orcish castle, and orcish army. There is a dependency +> between the objects in the kingdom. In plain words -> A factory of factories; a factory that groups the individual but related/dependent factories together without specifying their concrete classes. +> A factory of factories; a factory that groups the individual but related/dependent factories together without +> specifying their concrete classes. Wikipedia says -> The abstract factory pattern provides a way to encapsulate a group of individual factories that have a common theme without specifying their concrete classes +> The abstract factory pattern provides a way to encapsulate a group of individual factories that have a common theme +> without specifying their concrete classes **Programmatic Example** -Translating the kingdom example above. First of all, we have some interfaces and implementation for the objects in the kingdom. +Translating the kingdom example above. First of all, we have some interfaces and implementation for the objects in the +kingdom. ```java public interface Castle { @@ -50,20 +57,25 @@ public interface Army { // Elven implementations -> public class ElfCastle implements Castle { static final String DESCRIPTION = "This is the elven castle!"; + @Override public String getDescription() { return DESCRIPTION; } } + public class ElfKing implements King { static final String DESCRIPTION = "This is the elven king!"; + @Override public String getDescription() { return DESCRIPTION; } } + public class ElfArmy implements Army { static final String DESCRIPTION = "This is the elven Army!"; + @Override public String getDescription() { return DESCRIPTION; @@ -79,7 +91,9 @@ Then we have the abstraction and implementations for the kingdom factory. ```java public interface KingdomFactory { Castle createCastle(); + King createKing(); + Army createArmy(); } @@ -112,7 +126,7 @@ public class OrcKingdomFactory implements KingdomFactory { public King createKing() { return new OrcKing(); } - + @Override public Army createArmy() { return new OrcArmy(); @@ -120,64 +134,68 @@ public class OrcKingdomFactory implements KingdomFactory { } ``` -Now we have the abstract factory that lets us make a family of related objects i.e. elven kingdom factory creates elven castle, king and army, etc. +Now we have the abstract factory that lets us make a family of related objects i.e. elven kingdom factory creates elven +castle, king and army, etc. ```java -var factory = new ElfKingdomFactory(); -var castle = factory.createCastle(); -var king = factory.createKing(); -var army = factory.createArmy(); - -castle.getDescription(); -king.getDescription(); -army.getDescription(); +var factory=new ElfKingdomFactory(); + var castle=factory.createCastle(); + var king=factory.createKing(); + var army=factory.createArmy(); + + castle.getDescription(); + king.getDescription(); + army.getDescription(); ``` Program output: ```java This is the elven castle! -This is the elven king! -This is the elven Army! + This is the elven king! + 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 (derived from `Army`, `King`, `Castle`). In this example, we also used an enum to parameterize which type of kingdom factory the client will ask for. +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 ( +derived from `Army`, `King`, `Castle`). In this example, we also used an enum to parameterize which type of kingdom +factory the client will ask for. ```java public static class FactoryMaker { - public enum KingdomType { - ELF, ORC - } + public enum KingdomType { + ELF, ORC + } - public static KingdomFactory makeFactory(KingdomType type) { - return switch (type) { - case ELF -> new ElfKingdomFactory(); - case ORC -> new OrcKingdomFactory(); - }; - } + public static KingdomFactory makeFactory(KingdomType type) { + return switch (type) { + case ELF -> new ElfKingdomFactory(); + case ORC -> new OrcKingdomFactory(); + }; + } } - public static void main(String[] args) { - var app = new App(); + public static void main(String[] args) { + var 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("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 - } + LOGGER.info("Orc Kingdom"); + app.createKingdom(FactoryMaker.makeFactory(KingdomType.ORC)); + --similar use of the orc factory + } ``` ## Class diagram ![alt text](./etc/abstract-factory.urm.png "Abstract Factory class diagram") - ## Applicability Use the Abstract Factory pattern when @@ -185,7 +203,8 @@ Use the Abstract Factory pattern when * The system should be independent of how its products are created, composed, and represented * The system should be configured with one of the multiple families of products * The family of related product objects is designed to be used together, and you need to enforce this constraint -* You want to provide a class library of products, and you want to reveal just their interfaces, not their implementations +* You want to provide a class library of products, and you want to reveal just their interfaces, not their + implementations * The lifetime of the dependency is conceptually shorter than the lifetime of the consumer. * You need a run-time value to construct a particular dependency * You want to decide which product to call from a family at runtime. @@ -193,9 +212,10 @@ Use the Abstract Factory pattern when * When you need consistency among products * You don’t want to change existing code when adding new products or families of products to the program. -Example use cases +Example use cases -* Selecting to call to the appropriate implementation of FileSystemAcmeService or DatabaseAcmeService or NetworkAcmeService at runtime. +* Selecting to call to the appropriate implementation of FileSystemAcmeService or DatabaseAcmeService or + NetworkAcmeService at runtime. * Unit test case writing becomes much easier * UI tools for different OS @@ -219,7 +239,7 @@ Trade-offs ## Tutorials -* [Abstract Factory Pattern Tutorial](https://www.journaldev.com/1418/abstract-factory-design-pattern-in-java) +* [Abstract Factory Pattern Tutorial](https://www.journaldev.com/1418/abstract-factory-design-pattern-in-java) * [Refactoring Guru - Abstract Factory](https://refactoring.guru/design-patterns/abstract-factory) ## Known uses diff --git a/active-object/README.md b/active-object/README.md index 26e3e816af7f..6dc70d806eda 100644 --- a/active-object/README.md +++ b/active-object/README.md @@ -3,84 +3,88 @@ title: Active Object category: Concurrency language: en tag: - - Performance + - Performance --- - ## Intent -The Active Object design pattern provides a safe and reliable way to implement asynchronous behavior in concurrent systems. It achieves this by encapsulating tasks within objects that have their own thread and message queue. This separation keeps the main thread responsive and avoids issues like direct thread manipulation or shared state access. +The Active Object design pattern provides a safe and reliable way to implement asynchronous behavior in concurrent +systems. It achieves this by encapsulating tasks within objects that have their own thread and message queue. This +separation keeps the main thread responsive and avoids issues like direct thread manipulation or shared state access. ## Explanation -The class that implements the active object pattern will contain a self-synchronization mechanism without using 'synchronized' methods. +The class that implements the active object pattern will contain a self-synchronization mechanism without using ' +synchronized' methods. Real-world example ->The Orcs are known for their wildness and untameable soul. It seems like they have their own thread of control based on previous behavior. - -To implement a creature that has its own thread of control mechanism and expose its API only and not the execution itself, we can use the Active Object pattern. +> The Orcs are known for their wildness and untameable soul. It seems like they have their own thread of control based +> on previous behavior. +To implement a creature that has its own thread of control mechanism and expose its API only and not the execution +itself, we can use the Active Object pattern. **Programmatic Example** ```java -public abstract class ActiveCreature{ +public abstract class ActiveCreature { private final Logger logger = LoggerFactory.getLogger(ActiveCreature.class.getName()); private BlockingQueue requests; - + private String name; - + private Thread thread; public ActiveCreature(String name) { this.name = name; this.requests = new LinkedBlockingQueue(); thread = new Thread(new Runnable() { - @Override - public void run() { - while (true) { - try { - requests.take().run(); - } catch (InterruptedException e) { - logger.error(e.getMessage()); - } + @Override + public void run() { + while (true) { + try { + requests.take().run(); + } catch (InterruptedException e) { + logger.error(e.getMessage()); } } } + } ); thread.start(); } - + public void eat() throws InterruptedException { requests.put(new Runnable() { - @Override - public void run() { - logger.info("{} is eating!",name()); - logger.info("{} has finished eating!",name()); - } - } + @Override + public void run() { + logger.info("{} is eating!", name()); + logger.info("{} has finished eating!", name()); + } + } ); } public void roam() throws InterruptedException { requests.put(new Runnable() { - @Override - public void run() { - logger.info("{} has started to roam the wastelands.",name()); - } - } + @Override + public void run() { + logger.info("{} has started to roam the wastelands.", name()); + } + } ); } - + public String name() { return this.name; } } ``` -We can see that any class that will extend the ActiveCreature class will have its own thread of control to invoke and execute methods. +We can see that any class that will extend the ActiveCreature class will have its own thread of control to invoke and +execute methods. For example, the Orc class: @@ -94,29 +98,30 @@ public class Orc extends ActiveCreature { } ``` -Now, we can create multiple creatures such as Orcs, tell them to eat and roam, and they will execute it on their own thread of control: +Now, we can create multiple creatures such as Orcs, tell them to eat and roam, and they will execute it on their own +thread of control: ```java - public static void main(String[] args) { - var app = new App(); + public static void main(String[]args){ + var app=new App(); app.run(); - } - - @Override - public void run() { + } + +@Override +public void run(){ ActiveCreature creature; - try { - for (int i = 0;i < creatures;i++) { - creature = new Orc(Orc.class.getSimpleName().toString() + i); - creature.eat(); - creature.roam(); - } - Thread.sleep(1000); - } catch (InterruptedException e) { - logger.error(e.getMessage()); + try{ + for(int i=0;i We have a hierarchy of modem classes. The modems in this hierarchy need to be visited by an external algorithm based -> on filtering criteria (is it Unix or DOS compatible modem). +> We have a hierarchy of modem classes. The modems in this hierarchy need to be visited by an external algorithm based +> on filtering criteria (is it Unix or DOS compatible modem). In plain words @@ -24,7 +25,7 @@ In plain words [WikiWikiWeb](https://wiki.c2.com/?AcyclicVisitor) says -> The Acyclic Visitor pattern allows new functions to be added to existing class hierarchies without affecting those +> The Acyclic Visitor pattern allows new functions to be added to existing class hierarchies without affecting those > hierarchies, and without creating the dependency cycles that are inherent to the GangOfFour VisitorPattern. **Programmatic Example** @@ -38,6 +39,7 @@ public abstract class Modem { public class Zoom extends Modem { ... + @Override public void accept(ModemVisitor modemVisitor) { if (modemVisitor instanceof ZoomVisitor) { @@ -50,6 +52,7 @@ public class Zoom extends Modem { public class Hayes extends Modem { ... + @Override public void accept(ModemVisitor modemVisitor) { if (modemVisitor instanceof HayesVisitor) { @@ -80,10 +83,12 @@ public interface AllModemVisitor extends ZoomVisitor, HayesVisitor { public class ConfigureForDosVisitor implements AllModemVisitor { ... + @Override public void visit(Hayes hayes) { LOGGER.info(hayes + " used with Dos configurator."); } + @Override public void visit(Zoom zoom) { LOGGER.info(zoom + " used with Dos configurator."); @@ -92,6 +97,7 @@ public class ConfigureForDosVisitor implements AllModemVisitor { public class ConfigureForUnixVisitor implements ZoomVisitor { ... + @Override public void visit(Zoom zoom) { LOGGER.info(zoom + " used with Unix configurator."); @@ -102,10 +108,10 @@ public class ConfigureForUnixVisitor implements ZoomVisitor { Finally, here are the visitors in action. ```java - var conUnix = new ConfigureForUnixVisitor(); - var conDos = new ConfigureForDosVisitor(); - var zoom = new Zoom(); - var hayes = new Hayes(); + var conUnix=new ConfigureForUnixVisitor(); + var conDos=new ConfigureForDosVisitor(); + var zoom=new Zoom(); + var hayes=new Hayes(); hayes.accept(conDos); zoom.accept(conDos); hayes.accept(conUnix); @@ -130,7 +136,8 @@ Program output: This pattern can be used: * When you need to add a new function to an existing hierarchy without the need to alter or affect that hierarchy. -* When there are functions that operate upon a hierarchy, but which do not belong in the hierarchy itself. e.g. the ConfigureForDOS / ConfigureForUnix / ConfigureForX issue. +* When there are functions that operate upon a hierarchy, but which do not belong in the hierarchy itself. e.g. the + ConfigureForDOS / ConfigureForUnix / ConfigureForX issue. * When you need to perform very different operations on an object depending upon its type. * When the visited class hierarchy will be frequently extended with new derivatives of the Element class. * When the recompilation, relinking, retesting or redistribution of the derivatives of Element is very expensive. @@ -149,7 +156,8 @@ Benefits: Trade-offs: -* Violates [Liskov's Substitution Principle](https://java-design-patterns.com/principles/#liskov-substitution-principle) by showing that it can accept all visitors but actually only being interested in particular visitors. +* Violates [Liskov's Substitution Principle](https://java-design-patterns.com/principles/#liskov-substitution-principle) + by showing that it can accept all visitors but actually only being interested in particular visitors. * Parallel hierarchy of visitors has to be created for all members in visitable class hierarchy. ## Related patterns diff --git a/adapter/README.md b/adapter/README.md index 8de9f4138089..0796d30f7679 100644 --- a/adapter/README.md +++ b/adapter/README.md @@ -14,14 +14,18 @@ Wrapper ## Intent -The Adapter pattern converts the interface of a class into another interface that clients expect, enabling compatibility. +The Adapter pattern converts the interface of a class into another interface that clients expect, enabling +compatibility. ## Explanation Real-world example -> Consider that you have some pictures on your memory card and you need to transfer them to your computer. To transfer them, you need some kind of adapter that is compatible with your computer ports so that you can attach a memory card to your computer. In this case card reader is an adapter. -> Another example would be the famous power adapter; a three-legged plug can't be connected to a two-pronged outlet, it needs to use a power adapter that makes it compatible with the two-pronged outlets. +> Consider that you have some pictures on your memory card and you need to transfer them to your computer. To transfer +> them, you need some kind of adapter that is compatible with your computer ports so that you can attach a memory card to +> your computer. In this case card reader is an adapter. +> Another example would be the famous power adapter; a three-legged plug can't be connected to a two-pronged outlet, it +> needs to use a power adapter that makes it compatible with the two-pronged outlets. > Yet another example would be a translator translating words spoken by one person to another In plain words @@ -30,7 +34,9 @@ In plain words Wikipedia says -> In software engineering, the adapter pattern is a software design pattern that allows the interface of an existing class to be used as another interface. It is often used to make existing classes work with others without modifying their source code. +> In software engineering, the adapter pattern is a software design pattern that allows the interface of an existing +> class to be used as another interface. It is often used to make existing classes work with others without modifying +> their source code. **Programmatic Example** @@ -57,6 +63,7 @@ And captain expects an implementation of `RowingBoat` interface to be able to mo public class Captain { private final RowingBoat rowingBoat; + // default constructor and setter for rowingBoat public Captain(RowingBoat rowingBoat) { this.rowingBoat = rowingBoat; @@ -68,9 +75,11 @@ public class Captain { } ``` -Now let's say the pirates are coming and our captain needs to escape but there is only a fishing boat available. We need to create an adapter that allows the captain to operate the fishing boat with his rowing boat skills. +Now let's say the pirates are coming and our captain needs to escape but there is only a fishing boat available. We need +to create an adapter that allows the captain to operate the fishing boat with his rowing boat skills. ```java + @Slf4j public class FishingBoatAdapter implements RowingBoat { @@ -90,8 +99,8 @@ public class FishingBoatAdapter implements RowingBoat { And now the `Captain` can use the `FishingBoat` to escape the pirates. ```java -var captain = new Captain(new FishingBoatAdapter()); -captain.row(); +var captain=new Captain(new FishingBoatAdapter()); + captain.row(); ``` ## Class diagram @@ -103,9 +112,13 @@ captain.row(); Use the Adapter pattern when * You want to use an existing class, and its interface does not match the one you need -* You want to create a reusable class that cooperates with unrelated or unforeseen classes, that is, classes that don't necessarily have compatible interfaces -* You need to use several existing subclasses, but it's impractical to adapt their interface by subclassing everyone. An object adapter can adapt the interface of its parent class. -* Most of the applications using third-party libraries use adapters as a middle layer between the application and the 3rd party library to decouple the application from the library. If another library has to be used only an adapter for the new library is required without having to change the application code. +* You want to create a reusable class that cooperates with unrelated or unforeseen classes, that is, classes that don't + necessarily have compatible interfaces +* You need to use several existing subclasses, but it's impractical to adapt their interface by subclassing everyone. An + object adapter can adapt the interface of its parent class. +* Most of the applications using third-party libraries use adapters as a middle layer between the application and the + 3rd party library to decouple the application from the library. If another library has to be used only an adapter for + the new library is required without having to change the application code. ## Tutorials @@ -114,20 +127,21 @@ Use the Adapter pattern when * [Baeldung](https://www.baeldung.com/java-adapter-pattern) * [GeeksforGeeks](https://www.geeksforgeeks.org/adapter-pattern/) - ## Consequences Class and object adapters have different trade-offs. A class adapter -* Adapts Adaptee to Target by committing to a concrete Adaptee class. As a consequence, a class adapter won’t work when we want to adapt a class and all its subclasses. -* Lets Adapter override some of Adaptee’s behavior since Adapter is a subclass of Adaptee. -* Introduces only one object, and no additional pointer indirection is needed to get to the adaptee. +* Adapts Adaptee to Target by committing to a concrete Adaptee class. As a consequence, a class adapter won’t work when + we want to adapt a class and all its subclasses. +* Lets Adapter override some of Adaptee’s behavior since Adapter is a subclass of Adaptee. +* Introduces only one object, and no additional pointer indirection is needed to get to the adaptee. -An object adapter - -* Lets a single Adapter work with many Adaptees, that is, the Adaptee itself and all of its subclasses (if any). The Adapter can also add functionality to all Adaptees at once. -* Makes it harder to override Adaptee behavior. It will require subclassing Adaptee and making the Adapter refer to the subclass rather than the Adaptee itself. +An object adapter +* Lets a single Adapter work with many Adaptees, that is, the Adaptee itself and all of its subclasses (if any). The + Adapter can also add functionality to all Adaptees at once. +* Makes it harder to override Adaptee behavior. It will require subclassing Adaptee and making the Adapter refer to the + subclass rather than the Adaptee itself. ## Real-world examples @@ -136,7 +150,6 @@ An object adapter * [java.util.Collections#enumeration()](https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#enumeration-java.util.Collection-) * [javax.xml.bind.annotation.adapters.XMLAdapter](http://docs.oracle.com/javase/8/docs/api/javax/xml/bind/annotation/adapters/XmlAdapter.html#marshal-BoundType-) - ## Credits * [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59) diff --git a/aggregator-microservices/README.md b/aggregator-microservices/README.md index 732129e17916..2673862f24d9 100644 --- a/aggregator-microservices/README.md +++ b/aggregator-microservices/README.md @@ -3,25 +3,29 @@ title: Aggregator Microservices category: Architectural language: en tag: -- API design -- Cloud distributed -- Decoupling -- Microservices + - API design + - Cloud distributed + - Decoupling + - Microservices --- ## Intent -Streamline client's interactions with system's microservices by providing a single aggregation point that consolidates data and responses from multiple services. This simplifies the client's communication with the system, improving efficiency and reducing complexity. +Streamline client's interactions with system's microservices by providing a single aggregation point that consolidates +data and responses from multiple services. This simplifies the client's communication with the system, improving +efficiency and reducing complexity. ## Explanation Real world example -> Our web marketplace needs information about products and their current inventory. It makes a call to an aggregator service, which, in turn, calls the product information and product inventory microservices, returning the combined information. +> Our web marketplace needs information about products and their current inventory. It makes a call to an aggregator +> service, which, in turn, calls the product information and product inventory microservices, returning the combined +> information. In plain words -> Aggregator Microservice collects pieces of data from various microservices and returns an aggregate for processing. +> Aggregator Microservice collects pieces of data from various microservices and returns an aggregate for processing. Stack Overflow says @@ -44,6 +48,7 @@ Next we can introduce our `Aggregator` microservice. It contains clients `Produc `ProductInventoryClient` for calling respective microservices. ```java + @RestController public class Aggregator { @@ -75,6 +80,7 @@ Here's the essence of information microservice implementation. Inventory microse inventory counts. ```java + @RestController public class InformationController { @RequestMapping(value = "/information", method = RequestMethod.GET) @@ -97,27 +103,41 @@ curl http://localhost:50004/product ## Applicability -The Aggregator Microservices Design Pattern is particularly useful in scenarios where a client requires a composite response that is assembled from data provided by multiple microservices. Common use cases include e-commerce applications where product details, inventory, and reviews might be provided by separate services, or in dashboard applications where aggregated data from various services is displayed in a unified view. +The Aggregator Microservices Design Pattern is particularly useful in scenarios where a client requires a composite +response that is assembled from data provided by multiple microservices. Common use cases include e-commerce +applications where product details, inventory, and reviews might be provided by separate services, or in dashboard +applications where aggregated data from various services is displayed in a unified view. ## Consequences Benefits: -* Simplified Client: Clients interact with just one service rather than managing calls to multiple microservices, which simplifies client-side logic. -* Reduced Latency: By aggregating responses, the number of network calls is reduced, which can improve the application's overall latency. -* Decoupling: Clients are decoupled from the individual microservices, allowing for more flexibility in changing the microservices landscape without impacting clients. -* Centralized Logic: Aggregation allows for centralized transformation and logic application on the data collected from various services, which can be more efficient than handling it in the client or spreading it across multiple services. +* Simplified Client: Clients interact with just one service rather than managing calls to multiple microservices, which + simplifies client-side logic. +* Reduced Latency: By aggregating responses, the number of network calls is reduced, which can improve the application's + overall latency. +* Decoupling: Clients are decoupled from the individual microservices, allowing for more flexibility in changing the + microservices landscape without impacting clients. +* Centralized Logic: Aggregation allows for centralized transformation and logic application on the data collected from + various services, which can be more efficient than handling it in the client or spreading it across multiple services. Trade-offs: -* Single Point of Failure: The aggregator service can become a bottleneck or a single point of failure if not designed with high availability and scalability in mind. -* Complexity: Implementing an aggregator can introduce complexity, especially in terms of data aggregation logic and error handling when dealing with multiple services. +* Single Point of Failure: The aggregator service can become a bottleneck or a single point of failure if not designed + with high availability and scalability in mind. +* Complexity: Implementing an aggregator can introduce complexity, especially in terms of data aggregation logic and + error handling when dealing with multiple services. ## Related Patterns -* [API Gateway](https://java-design-patterns.com/patterns/api-gateway/): The Aggregator Microservices pattern is often used in conjunction with an API Gateway, which provides a single entry point for clients to access multiple microservices. -* [Composite](https://java-design-patterns.com/patterns/composite/): The Aggregator Microservices pattern can be seen as a form of the Composite pattern, where the composite is the aggregated response from multiple microservices. -* [Facade](https://java-design-patterns.com/patterns/facade/): The Aggregator Microservices pattern can be seen as a form of the Facade pattern, where the facade is the aggregator service that provides a simplified interface to the client. +* [API Gateway](https://java-design-patterns.com/patterns/api-gateway/): The Aggregator Microservices pattern is often + used in conjunction with an API Gateway, which provides a single entry point for clients to access multiple + microservices. +* [Composite](https://java-design-patterns.com/patterns/composite/): The Aggregator Microservices pattern can be seen as + a form of the Composite pattern, where the composite is the aggregated response from multiple microservices. +* [Facade](https://java-design-patterns.com/patterns/facade/): The Aggregator Microservices pattern can be seen as a + form of the Facade pattern, where the facade is the aggregator service that provides a simplified interface to the + client. ## Credits diff --git a/ambassador/README.md b/ambassador/README.md index b2902d7ddd42..5bd535f07da4 100644 --- a/ambassador/README.md +++ b/ambassador/README.md @@ -19,68 +19,71 @@ Provide a helper service instance on a client and offload common functionality a Real world example -> A remote service has many clients accessing a function it provides. The service is a legacy application and is -> impossible to update. Large numbers of requests from users are causing connectivity issues. New rules for request +> A remote service has many clients accessing a function it provides. The service is a legacy application and is +> impossible to update. Large numbers of requests from users are causing connectivity issues. New rules for request > frequency should be implemented along with latency checks and client-side logging. In plain words -> With the Ambassador pattern, we can implement less-frequent polling from clients along with latency checks and +> With the Ambassador pattern, we can implement less-frequent polling from clients along with latency checks and > logging. Microsoft documentation states -> An ambassador service can be thought of as an out-of-process proxy which is co-located with the client. This pattern -> can be useful for offloading common client connectivity tasks such as monitoring, logging, routing, -> security (such as TLS), and resiliency patterns in a language agnostic way. It is often used with legacy applications, -> or other applications that are difficult to modify, in order to extend their networking capabilities. It can also +> An ambassador service can be thought of as an out-of-process proxy which is co-located with the client. This pattern +> can be useful for offloading common client connectivity tasks such as monitoring, logging, routing, +> security (such as TLS), and resiliency patterns in a language agnostic way. It is often used with legacy applications, +> or other applications that are difficult to modify, in order to extend their networking capabilities. It can also > enable a specialized team to implement those features. **Programmatic Example** -With the above introduction in mind we will imitate the functionality in this example. We have an interface implemented +With the above introduction in mind we will imitate the functionality in this example. We have an interface implemented by the remote service as well as the ambassador service: ```java interface RemoteServiceInterface { - long doRemoteFunction(int value) throws Exception; + long doRemoteFunction(int value) throws Exception; } ``` A remote services represented as a singleton. ```java + @Slf4j public class RemoteService implements RemoteServiceInterface { - private static RemoteService service = null; + private static RemoteService service = null; - static synchronized RemoteService getRemoteService() { - if (service == null) { - service = new RemoteService(); - } - return service; + static synchronized RemoteService getRemoteService() { + if (service == null) { + service = new RemoteService(); } + return service; + } - private RemoteService() {} - - @Override - public long doRemoteFunction(int value) { - long waitTime = (long) Math.floor(Math.random() * 1000); + private RemoteService() { + } - try { - sleep(waitTime); - } catch (InterruptedException e) { - LOGGER.error("Thread sleep interrupted", e); - } + @Override + public long doRemoteFunction(int value) { + long waitTime = (long) Math.floor(Math.random() * 1000); - return waitTime >= 200 ? value * 10 : -1; + try { + sleep(waitTime); + } catch (InterruptedException e) { + LOGGER.error("Thread sleep interrupted", e); } + + return waitTime >= 200 ? value * 10 : -1; + } } ``` A service ambassador adding additional features such as logging, latency checks ```java + @Slf4j public class ServiceAmbassador implements RemoteServiceInterface { private static final int RETRIES = 3; @@ -132,6 +135,7 @@ public class ServiceAmbassador implements RemoteServiceInterface { A client has a local service ambassador used to interact with the remote service: ```java + @Slf4j public class Client { private final ServiceAmbassador serviceAmbassador = new ServiceAmbassador(); @@ -160,15 +164,15 @@ public class App { Here's the output for running the example: ```java -Time taken (ms): 111 -Service result: 120 -Time taken (ms): 931 -Failed to reach remote: (1) -Time taken (ms): 665 -Failed to reach remote: (2) -Time taken (ms): 538 -Failed to reach remote: (3) -Service result: -1 +Time taken(ms):111 + Service result:120 + Time taken(ms):931 + Failed to reach remote:(1) + Time taken(ms):665 + Failed to reach remote:(2) + Time taken(ms):538 + Failed to reach remote:(3) + Service result:-1 ``` ## Class diagram @@ -177,8 +181,10 @@ Service result: -1 ## Applicability -* Cloud Native and Microservices Architectures: Especially useful in distributed systems where it's crucial to monitor, log, and secure inter-service communication. -* Legacy System Integration: Facilitates communication with newer services by handling necessary but non-core functionalities. +* Cloud Native and Microservices Architectures: Especially useful in distributed systems where it's crucial to monitor, + log, and secure inter-service communication. +* Legacy System Integration: Facilitates communication with newer services by handling necessary but non-core + functionalities. * Performance Enhancement: Can be used to cache results or compress data to improve communication efficiency. Typical use cases include: @@ -193,34 +199,57 @@ Typical use cases include: Benefits: -* Separation of Concerns: Offloads cross-cutting concerns from the service logic, leading to cleaner, more maintainable code. -* Reusable Infrastructure Logic: The ambassador pattern allows the same logic (e.g., logging, monitoring) to be reused across multiple services. -* Improved Security: Centralizes security features like SSL termination or authentication, reducing the risk of misconfiguration. +* Separation of Concerns: Offloads cross-cutting concerns from the service logic, leading to cleaner, more maintainable + code. +* Reusable Infrastructure Logic: The ambassador pattern allows the same logic (e.g., logging, monitoring) to be reused + across multiple services. +* Improved Security: Centralizes security features like SSL termination or authentication, reducing the risk of + misconfiguration. * Flexibility: Makes it easier to update or replace infrastructure concerns without modifying the service code. Trade-offs: * Increased Complexity: Adds another layer to the architecture, which can complicate the system design and debugging. -* Potential Performance Overhead: The additional network hop can introduce latency and overhead, particularly if not optimized. +* Potential Performance Overhead: The additional network hop can introduce latency and overhead, particularly if not + optimized. * Deployment Overhead: Requires additional resources and management for deploying and scaling ambassador services. ## Known uses -* Service Mesh Implementations: In a service mesh architecture, like Istio or Linkerd, the Ambassador pattern is often employed as a sidecar proxy that handles inter-service communications. This includes tasks such as service discovery, routing, load balancing, telemetry (metrics and tracing), and security (authentication and authorization). -* API Gateways: API gateways can use the Ambassador pattern to encapsulate common functionalities like rate limiting, caching, request shaping, and authentication. This allows backend services to focus on their core business logic without being burdened by these cross-cutting concerns. -* Logging and Monitoring: An Ambassador can aggregate logs and metrics from various services and forward them to centralized monitoring tools like Prometheus or ELK Stack (Elasticsearch, Logstash, Kibana). This simplifies the logging and monitoring setup for each service and provides a unified view of the system's health. -* Security: Security-related functionalities such as SSL/TLS termination, identity verification, and encryption can be managed by an Ambassador. This ensures consistent security practices across services and reduces the likelihood of security breaches due to misconfigurations. -* Resilience: The Ambassador can implement resilience patterns like circuit breakers, retries, and timeouts. For instance, Netflix's Hystrix library can be used within an Ambassador to prevent cascading failures in a microservices ecosystem. -* Database Proxy: Ambassadors can act as proxies for database connections, providing functionalities like connection pooling, read/write splitting for replicas, and query caching. This offloads significant complexity from the application services. -* Legacy System Integration: In scenarios where modern microservices need to communicate with legacy systems, an Ambassador can serve as an intermediary that translates protocols, handles necessary transformations, and implements modern security practices, easing the integration process. -* Network Optimization: For services deployed across different geographical locations or cloud regions, Ambassadors can optimize communication by compressing data, batching requests, or even implementing smart routing to reduce latency and costs. +* Service Mesh Implementations: In a service mesh architecture, like Istio or Linkerd, the Ambassador pattern is often + employed as a sidecar proxy that handles inter-service communications. This includes tasks such as service discovery, + routing, load balancing, telemetry (metrics and tracing), and security (authentication and authorization). +* API Gateways: API gateways can use the Ambassador pattern to encapsulate common functionalities like rate limiting, + caching, request shaping, and authentication. This allows backend services to focus on their core business logic + without being burdened by these cross-cutting concerns. +* Logging and Monitoring: An Ambassador can aggregate logs and metrics from various services and forward them to + centralized monitoring tools like Prometheus or ELK Stack (Elasticsearch, Logstash, Kibana). This simplifies the + logging and monitoring setup for each service and provides a unified view of the system's health. +* Security: Security-related functionalities such as SSL/TLS termination, identity verification, and encryption can be + managed by an Ambassador. This ensures consistent security practices across services and reduces the likelihood of + security breaches due to misconfigurations. +* Resilience: The Ambassador can implement resilience patterns like circuit breakers, retries, and timeouts. For + instance, Netflix's Hystrix library can be used within an Ambassador to prevent cascading failures in a microservices + ecosystem. +* Database Proxy: Ambassadors can act as proxies for database connections, providing functionalities like connection + pooling, read/write splitting for replicas, and query caching. This offloads significant complexity from the + application services. +* Legacy System Integration: In scenarios where modern microservices need to communicate with legacy systems, an + Ambassador can serve as an intermediary that translates protocols, handles necessary transformations, and implements + modern security practices, easing the integration process. +* Network Optimization: For services deployed across different geographical locations or cloud regions, Ambassadors can + optimize communication by compressing data, batching requests, or even implementing smart routing to reduce latency + and costs. * [Kubernetes-native API gateway for microservices](https://github.com/datawire/ambassador) ## Related patterns -* [Proxy](https://java-design-patterns.com/patterns/proxy/): Shares similarities with the proxy pattern, but the ambassador pattern specifically focuses on offloading ancillary functionalities. -* Sidecar: A similar pattern used in the context of containerized applications, where a sidecar container provides additional functionality to the main application container. -* [Decorator](https://java-design-patterns.com/patterns/decorator/): The decorator pattern is used to add functionality to an object dynamically, while the ambassador pattern is used to offload functionality to a separate object. +* [Proxy](https://java-design-patterns.com/patterns/proxy/): Shares similarities with the proxy pattern, but the + ambassador pattern specifically focuses on offloading ancillary functionalities. +* Sidecar: A similar pattern used in the context of containerized applications, where a sidecar container provides + additional functionality to the main application container. +* [Decorator](https://java-design-patterns.com/patterns/decorator/): The decorator pattern is used to add functionality + to an object dynamically, while the ambassador pattern is used to offload functionality to a separate object. ## Credits diff --git a/anti-corruption-layer/README.md b/anti-corruption-layer/README.md index bcffc3595237..015dd0c45f8e 100644 --- a/anti-corruption-layer/README.md +++ b/anti-corruption-layer/README.md @@ -16,21 +16,34 @@ tag: ## Intent -Implement a façade or adapter layer between different subsystems that don't share the same semantics. It translates between different data formats and systems, ensuring that the integration between systems does not lead to corruption of business logic or data integrity. +Implement a façade or adapter layer between different subsystems that don't share the same semantics. It translates +between different data formats and systems, ensuring that the integration between systems does not lead to corruption of +business logic or data integrity. ## Explanation ### Context and problem -Most applications rely on other systems for some data or functionality. For example, when a legacy application is migrated to a modern system, it may still need existing legacy resources. New features must be able to call the legacy system. This is especially true of gradual migrations, where different features of a larger application are moved to a modern system over time. +Most applications rely on other systems for some data or functionality. For example, when a legacy application is +migrated to a modern system, it may still need existing legacy resources. New features must be able to call the legacy +system. This is especially true of gradual migrations, where different features of a larger application are moved to a +modern system over time. -Often these legacy systems suffer from quality issues such as convoluted data schemas or obsolete APIs. The features and technologies used in legacy systems can vary widely from more modern systems. To interoperate with the legacy system, the new application may need to support outdated infrastructure, protocols, data models, APIs, or other features that you wouldn't otherwise put into a modern application. +Often these legacy systems suffer from quality issues such as convoluted data schemas or obsolete APIs. The features and +technologies used in legacy systems can vary widely from more modern systems. To interoperate with the legacy system, +the new application may need to support outdated infrastructure, protocols, data models, APIs, or other features that +you wouldn't otherwise put into a modern application. -Maintaining access between new and legacy systems can force the new system to adhere to at least some of the legacy system's APIs or other semantics. When these legacy features have quality issues, supporting them "corrupts" what might otherwise be a cleanly designed modern application. Similar issues can arise with any external system that your development team doesn't control, not just legacy systems. +Maintaining access between new and legacy systems can force the new system to adhere to at least some of the legacy +system's APIs or other semantics. When these legacy features have quality issues, supporting them "corrupts" what might +otherwise be a cleanly designed modern application. Similar issues can arise with any external system that your +development team doesn't control, not just legacy systems. ### Solution -Isolate the different subsystems by placing an anti-corruption layer between them. This layer translates communications between the two systems, allowing one system to remain unchanged while the other can avoid compromising its design and technological approach. +Isolate the different subsystems by placing an anti-corruption layer between them. This layer translates communications +between the two systems, allowing one system to remain unchanged while the other can avoid compromising its design and +technological approach. ### Programmatic example @@ -40,19 +53,25 @@ The example shows why the anti-corruption layer is needed. Here are 2 shop-ordering systems: `Legacy` and `Modern`. -The aforementioned systems have different domain models and have to operate simultaneously. Since they work independently the orders can come either from the `Legacy` or `Modern` system. Therefore, the system that receives the legacyOrder needs to check if the legacyOrder is valid and not present in the other system. Then it can place the legacyOrder in its own system. +The aforementioned systems have different domain models and have to operate simultaneously. Since they work +independently the orders can come either from the `Legacy` or `Modern` system. Therefore, the system that receives the +legacyOrder needs to check if the legacyOrder is valid and not present in the other system. Then it can place the +legacyOrder in its own system. -But for that, the system needs to know the domain model of the other system and to avoid that, the anti-corruption layer(ACL) is introduced. The ACL is a layer that translates the domain model of the `Legacy` system to the domain model of the `Modern` system and vice versa. Also, it hides all other operations with the other system, uncoupling the systems. +But for that, the system needs to know the domain model of the other system and to avoid that, the anti-corruption +layer(ACL) is introduced. The ACL is a layer that translates the domain model of the `Legacy` system to the domain model +of the `Modern` system and vice versa. Also, it hides all other operations with the other system, uncoupling the +systems. #### Domain model of the `Legacy` system ```java public class LegacyOrder { - private String id; - private String customer; - private String item; - private String qty; - private String price; + private String id; + private String customer; + private String item; + private String qty; + private String price; } ``` @@ -60,20 +79,22 @@ public class LegacyOrder { ```java public class ModernOrder { - private String id; - private Customer customer; + private String id; + private Customer customer; - private Shipment shipment; + private Shipment shipment; - private String extra; + private String extra; } + public class Customer { - private String address; + private String address; } + public class Shipment { - private String item; - private String qty; - private String price; + private String item; + private String qty; + private String price; } ``` @@ -82,44 +103,46 @@ public class Shipment { ```java public class AntiCorruptionLayer { - @Autowired - private ModernShop modernShop; + @Autowired + private ModernShop modernShop; - @Autowired - private LegacyShop legacyShop; + @Autowired + private LegacyShop legacyShop; - public Optional findOrderInModernSystem(String id) { - return modernShop.findOrder(id).map(o -> /* map to legacyOrder*/); - } + public Optional findOrderInModernSystem(String id) { + return modernShop.findOrder(id).map(o -> /* map to legacyOrder*/); + } - public Optional findOrderInLegacySystem(String id) { - return legacyShop.findOrder(id).map(o -> /* map to modernOrder*/); - } + public Optional findOrderInLegacySystem(String id) { + return legacyShop.findOrder(id).map(o -> /* map to modernOrder*/); + } } ``` #### The connection -Wherever the `Legacy` or `Modern` system needs to communicate with the counterpart the ACL needs to be used to avoid corrupting the current domain model. The example below shows how the `Legacy` system places an order with a validation from the `Modern` system. +Wherever the `Legacy` or `Modern` system needs to communicate with the counterpart the ACL needs to be used to avoid +corrupting the current domain model. The example below shows how the `Legacy` system places an order with a validation +from the `Modern` system. ```java public class LegacyShop { - @Autowired - private AntiCorruptionLayer acl; + @Autowired + private AntiCorruptionLayer acl; - public void placeOrder(LegacyOrder legacyOrder) throws ShopException { + public void placeOrder(LegacyOrder legacyOrder) throws ShopException { - String id = legacyOrder.getId(); + String id = legacyOrder.getId(); - Optional orderInModernSystem = acl.findOrderInModernSystem(id); + Optional orderInModernSystem = acl.findOrderInModernSystem(id); - if (orderInModernSystem.isPresent()) { - // order is already in the modern system - } else { - // place order in the current system - } + if (orderInModernSystem.isPresent()) { + // order is already in the modern system + } else { + // place order in the current system } + } } ``` @@ -127,11 +150,14 @@ public class LegacyShop { Use this pattern when: -* A migration is planned to happen over multiple stages, but integration between new and legacy systems needs to be maintained +* A migration is planned to happen over multiple stages, but integration between new and legacy systems needs to be + maintained * Two or more subsystems have different semantics, but still need to communicate -* When integrating with legacy systems or external systems where direct integration might pollute the domain model of the new system +* When integrating with legacy systems or external systems where direct integration might pollute the domain model of + the new system * In scenarios where different subsystems within a larger system use different data formats or structures -* When there is a need to ensure loose coupling between different subsystems or external services to facilitate easier maintenance and scalability +* When there is a need to ensure loose coupling between different subsystems or external services to facilitate easier + maintenance and scalability ## Tutorials @@ -140,9 +166,11 @@ Use this pattern when: ## Known Uses -* Microservices architectures where individual services must communicate without being tightly coupled to each other’s data schemas +* Microservices architectures where individual services must communicate without being tightly coupled to each other’s + data schemas * Enterprise systems integration, especially when integrating modern systems with legacy systems -* In bounded contexts within Domain-Driven Design (DDD) to maintain the integrity of a domain model when interacting with external systems or subsystems +* In bounded contexts within Domain-Driven Design (DDD) to maintain the integrity of a domain model when interacting + with external systems or subsystems ## Consequences @@ -160,9 +188,12 @@ Trade-offs: ## Related Patterns -* [Facade](https://java-design-patterns.com/patterns/facade/): The Anti-Corruption Layer can be seen as a specialized form of the Facade pattern that is used to isolate different subsystems -* [Adapter](https://java-design-patterns.com/patterns/adapter/): The Anti-Corruption Layer can be implemented using the Adapter pattern to translate between different data formats or structures -* [Gateway](https://java-design-patterns.com/patterns/gateway/): The Anti-Corruption Layer can be used as a Gateway to external systems to provide a unified interface +* [Facade](https://java-design-patterns.com/patterns/facade/): The Anti-Corruption Layer can be seen as a specialized + form of the Facade pattern that is used to isolate different subsystems +* [Adapter](https://java-design-patterns.com/patterns/adapter/): The Anti-Corruption Layer can be implemented using the + Adapter pattern to translate between different data formats or structures +* [Gateway](https://java-design-patterns.com/patterns/gateway/): The Anti-Corruption Layer can be used as a Gateway to + external systems to provide a unified interface ## Credits diff --git a/api-gateway/README.md b/api-gateway/README.md index 40d5f4dc445e..9c60d54f66a0 100644 --- a/api-gateway/README.md +++ b/api-gateway/README.md @@ -11,7 +11,9 @@ tag: ## Intent -The API Gateway design pattern aims to provide a unified interface to a set of microservices. It acts as a single entry point for clients, routing requests to the appropriate microservices and aggregating results, thereby simplifying the client-side code. +The API Gateway design pattern aims to provide a unified interface to a set of microservices. It acts as a single entry +point for clients, routing requests to the appropriate microservices and aggregating results, thereby simplifying the +client-side code. ## Also known as @@ -19,47 +21,47 @@ The API Gateway design pattern aims to provide a unified interface to a set of m ## Explanation -With the Microservices pattern, a client may need data from multiple different microservices. If the -client called each microservice directly, that could contribute to longer load times, since the -client would have to make a network request for each microservice called. Moreover, having the -client call each microservice directly ties the client to that microservice - if the internal -implementations of the microservices change (for example, if two microservices are combined sometime -in the future) or if the location (host and port) of a microservice changes, then every client that +With the Microservices pattern, a client may need data from multiple different microservices. If the +client called each microservice directly, that could contribute to longer load times, since the +client would have to make a network request for each microservice called. Moreover, having the +client call each microservice directly ties the client to that microservice - if the internal +implementations of the microservices change (for example, if two microservices are combined sometime +in the future) or if the location (host and port) of a microservice changes, then every client that makes use of those microservices must be updated. -The intent of the API Gateway pattern is to alleviate some of these issues. In the API Gateway -pattern, an additional entity (the API Gateway) is placed between the client and the microservices. -The job of the API Gateway is to aggregate the calls to the microservices. Rather than the client -calling each microservice individually, the client calls the API Gateway a single time. The API +The intent of the API Gateway pattern is to alleviate some of these issues. In the API Gateway +pattern, an additional entity (the API Gateway) is placed between the client and the microservices. +The job of the API Gateway is to aggregate the calls to the microservices. Rather than the client +calling each microservice individually, the client calls the API Gateway a single time. The API Gateway then calls each of the microservices that the client needs. Real world example -> We are implementing microservices and API Gateway pattern for an e-commerce site. In this system +> We are implementing microservices and API Gateway pattern for an e-commerce site. In this system > the API Gateway makes calls to the Image and Price microservices. In plain words -> For a system implemented using microservices architecture, API Gateway is the single entry point -> that aggregates the calls to the individual microservices. +> For a system implemented using microservices architecture, API Gateway is the single entry point +> that aggregates the calls to the individual microservices. Wikipedia says -> API Gateway is a server that acts as an API front-end, receives API requests, enforces throttling -> and security policies, passes requests to the back-end service and then passes the response back -> to the requester. A gateway often includes a transformation engine to orchestrate and modify the -> requests and responses on the fly. A gateway can also provide functionality such as collecting -> analytics data and providing caching. The gateway can provide functionality to support +> API Gateway is a server that acts as an API front-end, receives API requests, enforces throttling +> and security policies, passes requests to the back-end service and then passes the response back +> to the requester. A gateway often includes a transformation engine to orchestrate and modify the +> requests and responses on the fly. A gateway can also provide functionality such as collecting +> analytics data and providing caching. The gateway can provide functionality to support > authentication, authorization, security, audit and regulatory compliance. **Programmatic Example** -This implementation shows what the API Gateway pattern could look like for an e-commerce site. The -`ApiGateway` makes calls to the Image and Price microservices using the `ImageClientImpl` and -`PriceClientImpl` respectively. Customers viewing the site on a desktop device can see both price -information and an image of a product, so the `ApiGateway` calls both of the microservices and -aggregates the data in the `DesktopProduct` model. However, mobile users only see price information; -they do not see a product image. For mobile users, the `ApiGateway` only retrieves price +This implementation shows what the API Gateway pattern could look like for an e-commerce site. The +`ApiGateway` makes calls to the Image and Price microservices using the `ImageClientImpl` and +`PriceClientImpl` respectively. Customers viewing the site on a desktop device can see both price +information and an image of a product, so the `ApiGateway` calls both of the microservices and +aggregates the data in the `DesktopProduct` model. However, mobile users only see price information; +they do not see a product image. For mobile users, the `ApiGateway` only retrieves price information, which it uses to populate the `MobileProduct`. Here's the Image microservice implementation. @@ -153,7 +155,8 @@ public class ApiGateway { ## Applicability -* When building a microservices architecture, and there's a need to abstract the complexity of microservices from the client. +* When building a microservices architecture, and there's a need to abstract the complexity of microservices from the + client. * When multiple microservices need to be consumed in a single request. * For authentication, authorization, and security enforcement at a single point. * To optimize communication between clients and services, especially in a cloud environment. @@ -181,9 +184,12 @@ Trade-offs: ## Related patterns -* [Aggregator Microservice](../aggregator-microservices/README.md) - The API Gateway pattern is often used in conjunction with the Aggregator Microservice pattern to provide a unified interface to a set of microservices. -* [Proxy](../proxy/README.md) - The API Gateway pattern is a specialized form of the Proxy pattern, where the gateway acts as a single entry point for clients, routing requests to the appropriate microservices and aggregating results. -* [Circuit Breaker](../circuit-breaker/README.md) - API Gateways can use the Circuit Breaker pattern to prevent cascading failures when calling multiple microservices. +* [Aggregator Microservice](../aggregator-microservices/README.md) - The API Gateway pattern is often used in + conjunction with the Aggregator Microservice pattern to provide a unified interface to a set of microservices. +* [Proxy](../proxy/README.md) - The API Gateway pattern is a specialized form of the Proxy pattern, where the gateway + acts as a single entry point for clients, routing requests to the appropriate microservices and aggregating results. +* [Circuit Breaker](../circuit-breaker/README.md) - API Gateways can use the Circuit Breaker pattern to prevent + cascading failures when calling multiple microservices. ## Tutorials diff --git a/arrange-act-assert/README.md b/arrange-act-assert/README.md index 9c6d614b9df3..ee2e72921b34 100644 --- a/arrange-act-assert/README.md +++ b/arrange-act-assert/README.md @@ -42,7 +42,7 @@ In plain words WikiWikiWeb says -> Arrange/Act/Assert is a pattern for arranging and formatting code in UnitTest methods. +> Arrange/Act/Assert is a pattern for arranging and formatting code in UnitTest methods. **Programmatic Example** @@ -132,13 +132,14 @@ class CashAAATest { Use Arrange/Act/Assert pattern when -* Unit testing, especially within the context of TDD and BDD +* Unit testing, especially within the context of TDD and BDD * Anywhere clarity and structure are needed in test cases ## Known uses * Widely adopted in software projects using TDD and BDD methodologies. -* Utilized in various programming languages and testing frameworks, such as JUnit (Java), NUnit (.NET), and xUnit frameworks. +* Utilized in various programming languages and testing frameworks, such as JUnit (Java), NUnit (.NET), and xUnit + frameworks. ## Consequences @@ -151,11 +152,13 @@ Benefits: Trade-offs: * May introduce redundancy in tests, as similar arrangements may be repeated across tests. -* Some complex tests might not fit neatly into this structure, requiring additional context or setup outside these three phases. +* Some complex tests might not fit neatly into this structure, requiring additional context or setup outside these three + phases. ## Related patterns -* [Page Object](https://java-design-patterns.com/patterns/page-object/): A pattern for organizing UI tests that can be used in conjunction with Arrange/Act/Assert. +* [Page Object](https://java-design-patterns.com/patterns/page-object/): A pattern for organizing UI tests that can be + used in conjunction with Arrange/Act/Assert. ## Credits diff --git a/async-method-invocation/README.md b/async-method-invocation/README.md index 950b958610e5..60f4c7110eb9 100644 --- a/async-method-invocation/README.md +++ b/async-method-invocation/README.md @@ -3,17 +3,16 @@ title: Async Method Invocation category: Concurrency language: en tag: - - Asynchronous - - Reactive - - Scalability + - Asynchronous + - Reactive + - Scalability --- ## Intent -Asynchronous method invocation is a pattern where the calling thread -is not blocked while waiting results of tasks. The pattern provides parallel -processing of multiple independent tasks and retrieving the results via -callbacks or waiting until everything is done. +Asynchronous method invocation is a pattern where the calling thread is not blocked while waiting results of tasks. The +pattern provides parallel processing of multiple independent tasks and retrieving the results via callbacks or waiting +until everything is done. ## Also known as @@ -23,54 +22,59 @@ callbacks or waiting until everything is done. Real world example -> Launching space rockets is an exciting business. The mission command gives an order to launch and +> Launching space rockets is an exciting business. The mission command gives an order to launch and > after some undetermined time, the rocket either launches successfully or fails miserably. In plain words -> Asynchronous method invocation starts task processing and returns immediately before the task is +> Asynchronous method invocation starts task processing and returns immediately before the task is > ready. The results of the task processing are returned to the caller later. Wikipedia says -> In multithreaded computer programming, asynchronous method invocation (AMI), also known as -> asynchronous method calls or the asynchronous pattern is a design pattern in which the call site -> is not blocked while waiting for the called code to finish. Instead, the calling thread is +> In multithreaded computer programming, asynchronous method invocation (AMI), also known as +> asynchronous method calls or the asynchronous pattern is a design pattern in which the call site +> is not blocked while waiting for the called code to finish. Instead, the calling thread is > notified when the reply arrives. Polling for a reply is an undesired option. **Programmatic Example** In this example, we are launching space rockets and deploying lunar rovers. -The application demonstrates the async method invocation pattern. The key parts of the pattern are -`AsyncResult` which is an intermediate container for an asynchronously evaluated value, -`AsyncCallback` which can be provided to be executed on task completion and `AsyncExecutor` that +The application demonstrates the async method invocation pattern. The key parts of the pattern are +`AsyncResult` which is an intermediate container for an asynchronously evaluated value, +`AsyncCallback` which can be provided to be executed on task completion and `AsyncExecutor` that manages the execution of the async tasks. ```java public interface AsyncResult { boolean isCompleted(); + T getValue() throws ExecutionException; + void await() throws InterruptedException; } ``` ```java public interface AsyncCallback { - void onComplete(T value); - void onError(Exception ex); + void onComplete(T value); + + void onError(Exception ex); } ``` ```java public interface AsyncExecutor { AsyncResult startProcess(Callable task); + AsyncResult startProcess(Callable task, AsyncCallback callback); + T endProcess(AsyncResult asyncResult) throws ExecutionException, InterruptedException; } ``` -`ThreadAsyncExecutor` is an implementation of `AsyncExecutor`. Some of its key parts are highlighted +`ThreadAsyncExecutor` is an implementation of `AsyncExecutor`. Some of its key parts are highlighted next. ```java @@ -85,14 +89,14 @@ public class ThreadAsyncExecutor implements AsyncExecutor { public AsyncResult startProcess(Callable task, AsyncCallback callback) { var result = new CompletableResult<>(callback); new Thread( - () -> { - try { - result.setValue(task.call()); - } catch (Exception ex) { - result.setException(ex); - } - }, - "executor-" + idx.incrementAndGet()) + () -> { + try { + result.setValue(task.call()); + } catch (Exception ex) { + result.setException(ex); + } + }, + "executor-" + idx.incrementAndGet()) .start(); return result; } @@ -111,50 +115,50 @@ public class ThreadAsyncExecutor implements AsyncExecutor { Then we are ready to launch some rockets to see how everything works together. ```java -public static void main(String[] args) throws Exception { - // construct a new executor that will run async tasks - var executor = new ThreadAsyncExecutor(); - - // start few async tasks with varying processing times, two last with callback handlers - final var asyncResult1 = executor.startProcess(lazyval(10, 500)); - final var asyncResult2 = executor.startProcess(lazyval("test", 300)); - final var asyncResult3 = executor.startProcess(lazyval(50L, 700)); - final var asyncResult4 = executor.startProcess(lazyval(20, 400), callback("Deploying lunar rover")); - final var asyncResult5 = - executor.startProcess(lazyval("callback", 600), callback("Deploying lunar rover")); - - // emulate processing in the current thread while async tasks are running in their own threads - Thread.sleep(350); // Oh boy, we are working hard here - log("Mission command is sipping coffee"); - - // wait for completion of the tasks - final var result1 = executor.endProcess(asyncResult1); - final var result2 = executor.endProcess(asyncResult2); - final var result3 = executor.endProcess(asyncResult3); - asyncResult4.await(); - asyncResult5.await(); - - // log the results of the tasks, callbacks log immediately when complete - log("Space rocket <" + result1 + "> launch complete"); - log("Space rocket <" + result2 + "> launch complete"); - log("Space rocket <" + result3 + "> launch complete"); -} +public static void main(String[]args)throws Exception{ + // construct a new executor that will run async tasks + var executor=new ThreadAsyncExecutor(); + +// start few async tasks with varying processing times, two last with callback handlers +final var asyncResult1=executor.startProcess(lazyval(10,500)); +final var asyncResult2=executor.startProcess(lazyval("test",300)); +final var asyncResult3=executor.startProcess(lazyval(50L,700)); +final var asyncResult4=executor.startProcess(lazyval(20,400),callback("Deploying lunar rover")); +final var asyncResult5= + executor.startProcess(lazyval("callback",600),callback("Deploying lunar rover")); + + // emulate processing in the current thread while async tasks are running in their own threads + Thread.sleep(350); // Oh boy, we are working hard here + log("Mission command is sipping coffee"); + +// wait for completion of the tasks +final var result1=executor.endProcess(asyncResult1); +final var result2=executor.endProcess(asyncResult2); +final var result3=executor.endProcess(asyncResult3); + asyncResult4.await(); + asyncResult5.await(); + + // log the results of the tasks, callbacks log immediately when complete + log("Space rocket <"+result1+"> launch complete"); + log("Space rocket <"+result2+"> launch complete"); + log("Space rocket <"+result3+"> launch complete"); + } ``` Here's the program console output. ```java -21:47:08.227 [executor-2] INFO com.iluwatar.async.method.invocation.App - Space rocket launched successfully -21:47:08.269 [main] INFO com.iluwatar.async.method.invocation.App - Mission command is sipping coffee -21:47:08.318 [executor-4] INFO com.iluwatar.async.method.invocation.App - Space rocket <20> launched successfully -21:47:08.335 [executor-4] INFO com.iluwatar.async.method.invocation.App - Deploying lunar rover <20> -21:47:08.414 [executor-1] INFO com.iluwatar.async.method.invocation.App - Space rocket <10> launched successfully -21:47:08.519 [executor-5] INFO com.iluwatar.async.method.invocation.App - Space rocket launched successfully -21:47:08.519 [executor-5] INFO com.iluwatar.async.method.invocation.App - Deploying lunar rover -21:47:08.616 [executor-3] INFO com.iluwatar.async.method.invocation.App - Space rocket <50> launched successfully -21:47:08.617 [main] INFO com.iluwatar.async.method.invocation.App - Space rocket <10> launch complete -21:47:08.617 [main] INFO com.iluwatar.async.method.invocation.App - Space rocket launch complete -21:47:08.618 [main] INFO com.iluwatar.async.method.invocation.App - Space rocket <50> launch complete +21:47:08.227[executor-2]INFO com.iluwatar.async.method.invocation.App-Space rocket launched successfully + 21:47:08.269[main]INFO com.iluwatar.async.method.invocation.App-Mission command is sipping coffee + 21:47:08.318[executor-4]INFO com.iluwatar.async.method.invocation.App-Space rocket<20>launched successfully + 21:47:08.335[executor-4]INFO com.iluwatar.async.method.invocation.App-Deploying lunar rover<20> + 21:47:08.414[executor-1]INFO com.iluwatar.async.method.invocation.App-Space rocket<10>launched successfully + 21:47:08.519[executor-5]INFO com.iluwatar.async.method.invocation.App-Space rocket launched successfully + 21:47:08.519[executor-5]INFO com.iluwatar.async.method.invocation.App-Deploying lunar rover +21:47:08.616[executor-3]INFO com.iluwatar.async.method.invocation.App-Space rocket<50>launched successfully + 21:47:08.617[main]INFO com.iluwatar.async.method.invocation.App-Space rocket<10>launch complete + 21:47:08.617[main]INFO com.iluwatar.async.method.invocation.App-Space rocket launch complete + 21:47:08.618[main]INFO com.iluwatar.async.method.invocation.App-Space rocket<50>launch complete ``` # Class diagram @@ -166,14 +170,16 @@ Here's the program console output. Use the async method invocation pattern when * When operations do not need to complete before proceeding with the next steps in a program. -* For tasks that are resource-intensive or time-consuming, such as IO operations, network requests, or complex computations, where making the operation synchronous would significantly impact performance or user experience. +* For tasks that are resource-intensive or time-consuming, such as IO operations, network requests, or complex + computations, where making the operation synchronous would significantly impact performance or user experience. * In GUI applications to prevent freezing or unresponsiveness during long-running tasks. * In web applications for non-blocking IO operations. ## Known Uses * Web servers handling HTTP requests asynchronously to improve throughput and reduce latency. -* Desktop and mobile applications using background threads to perform time-consuming operations without blocking the user interface. +* Desktop and mobile applications using background threads to perform time-consuming operations without blocking the + user interface. * Microservices architectures where services perform asynchronous communications via messaging queues or event streams. * [FutureTask](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/FutureTask.html) * [CompletableFuture](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html) @@ -184,21 +190,29 @@ Use the async method invocation pattern when Benefits: -* Improved Responsiveness: The main thread or application flow remains unblocked, improving the user experience in GUI applications and overall responsiveness. -* Better Resource Utilization: By enabling parallel execution, system resources (like CPU and IO) are utilized more efficiently, potentially improving the application's throughput. +* Improved Responsiveness: The main thread or application flow remains unblocked, improving the user experience in GUI + applications and overall responsiveness. +* Better Resource Utilization: By enabling parallel execution, system resources (like CPU and IO) are utilized more + efficiently, potentially improving the application's throughput. * Scalability: Easier to scale applications, as tasks can be distributed across available resources more effectively. Trade-offs: -* Complexity: Introducing asynchronous operations can complicate the codebase, making it more challenging to understand, debug, and maintain. -* Resource Management: Requires careful management of threads or execution contexts, which can introduce overhead and potential resource exhaustion issues. -* Error Handling: Asynchronous operations can make error handling more complex, as exceptions may occur in different threads or at different times. +* Complexity: Introducing asynchronous operations can complicate the codebase, making it more challenging to understand, + debug, and maintain. +* Resource Management: Requires careful management of threads or execution contexts, which can introduce overhead and + potential resource exhaustion issues. +* Error Handling: Asynchronous operations can make error handling more complex, as exceptions may occur in different + threads or at different times. Related Patterns: -* [Command](https://java-design-patterns.com/patterns/command/): Asynchronous method invocation can be used to implement the Command pattern, where commands are executed asynchronously. -* [Observer](https://java-design-patterns.com/patterns/observer/): Asynchronous method invocation can be used to notify observers asynchronously when a subject's state changes. -* [Promise](https://java-design-patterns.com/patterns/promise/): The AsyncResult interface can be considered a form of Promise, representing a value that may not be available yet. +* [Command](https://java-design-patterns.com/patterns/command/): Asynchronous method invocation can be used to implement + the Command pattern, where commands are executed asynchronously. +* [Observer](https://java-design-patterns.com/patterns/observer/): Asynchronous method invocation can be used to notify + observers asynchronously when a subject's state changes. +* [Promise](https://java-design-patterns.com/patterns/promise/): The AsyncResult interface can be considered a form of + Promise, representing a value that may not be available yet. ## Credits diff --git a/balking/README.md b/balking/README.md index 486439c6819f..0fa525396978 100644 --- a/balking/README.md +++ b/balking/README.md @@ -3,18 +3,19 @@ title: Balking category: Concurrency language: en tag: - - Decoupling + - Decoupling --- ## Intent -Balking Pattern is used to prevent an object from executing a certain code if it is in an incomplete or inappropriate state. If the state is not suitable for the action, the method call is ignored (or "balked"). +Balking Pattern is used to prevent an object from executing a certain code if it is in an incomplete or inappropriate +state. If the state is not suitable for the action, the method call is ignored (or "balked"). ## Explanation Real world example -> There's a start-button in a washing machine to initiate the laundry washing. When the washing +> There's a start-button in a washing machine to initiate the laundry washing. When the washing > machine is inactive the button works as expected, but if it's already washing the button does > nothing. @@ -24,21 +25,22 @@ In plain words Wikipedia says -> The balking pattern is a software design pattern that only executes an action on an object when -> the object is in a particular state. For example, if an object reads ZIP files and a calling -> method invokes a get method on the object when the ZIP file is not open, the object would "balk" +> The balking pattern is a software design pattern that only executes an action on an object when +> the object is in a particular state. For example, if an object reads ZIP files and a calling +> method invokes a get method on the object when the ZIP file is not open, the object would "balk" > at the request. **Programmatic Example** -In this example implementation, `WashingMachine` is an object that has two states in which it can +In this example implementation, `WashingMachine` is an object that has two states in which it can be: ENABLED and WASHING. If the machine is ENABLED, the state changes to WASHING using a thread-safe -method. On the other hand, if it already has been washing and any other thread executes `wash()` +method. On the other hand, if it already has been washing and any other thread executes `wash()` it won't do that and returns without doing anything. Here are the relevant parts of the `WashingMachine` class. ```java + @Slf4j public class WashingMachine { @@ -86,20 +88,20 @@ public interface DelayProvider { Now we introduce the application using the `WashingMachine`. ```java - public static void main(String... args) { - final var washingMachine = new WashingMachine(); - var executorService = Executors.newFixedThreadPool(3); - for (int i = 0; i < 3; i++) { - executorService.execute(washingMachine::wash); + public static void main(String...args){ +final var washingMachine=new WashingMachine(); + var executorService=Executors.newFixedThreadPool(3); + for(int i=0;i< 3;i++){ + executorService.execute(washingMachine::wash); } executorService.shutdown(); - try { - executorService.awaitTermination(10, TimeUnit.SECONDS); - } catch (InterruptedException ie) { - LOGGER.error("ERROR: Waiting on executor service shutdown!"); - Thread.currentThread().interrupt(); + try{ + executorService.awaitTermination(10,TimeUnit.SECONDS); + }catch(InterruptedException ie){ + LOGGER.error("ERROR: Waiting on executor service shutdown!"); + Thread.currentThread().interrupt(); + } } - } ``` Here is the console output of the program. @@ -123,27 +125,33 @@ Here is the console output of the program. 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 but for an unknown +* Objects are generally only in a state that is prone to balking temporarily but for an unknown amount of time -* In multithreaded applications where certain actions should only proceed when specific conditions are met, and those conditions are expected to change over time due to external factors or concurrent operations. +* In multithreaded applications where certain actions should only proceed when specific conditions are met, and those + conditions are expected to change over time due to external factors or concurrent operations. ## Known Uses: * Resource pooling, where resources are only allocated if they are in a valid state for allocation. -* Thread management, where threads only proceed with tasks if certain conditions (like task availability or resource locks) are met. +* Thread management, where threads only proceed with tasks if certain conditions (like task availability or resource + locks) are met. ## Consequences: Benefits: -* Reduces unnecessary lock acquisitions in situations where actions cannot proceed, enhancing performance in concurrent applications. +* Reduces unnecessary lock acquisitions in situations where actions cannot proceed, enhancing performance in concurrent + applications. * Encourages clear separation of state management and behavior, leading to cleaner code. -* Simplifies the handling of operations that should only be performed under certain conditions without cluttering the caller code with state checks. +* Simplifies the handling of operations that should only be performed under certain conditions without cluttering the + caller code with state checks. Trade-offs: -* Can introduce complexity by obscuring the conditions under which actions are taken or ignored, potentially making the system harder to debug and understand. -* May lead to missed opportunities or actions if the state changes are not properly monitored or if the balking condition is too restrictive. +* Can introduce complexity by obscuring the conditions under which actions are taken or ignored, potentially making the + system harder to debug and understand. +* May lead to missed opportunities or actions if the state changes are not properly monitored or if the balking + condition is too restrictive. ## Related patterns diff --git a/bridge/README.md b/bridge/README.md index a679df25f248..894688765b5b 100644 --- a/bridge/README.md +++ b/bridge/README.md @@ -20,15 +20,20 @@ Decouple an abstraction from its implementation so that the two can vary indepen Real-world example -> Consider you have a weapon with different enchantments, and you are supposed to allow mixing different weapons with different enchantments. What would you do? Create multiple copies of each of the weapons for each of the enchantments or would you just create separate enchantment and set it for the weapon as needed? Bridge pattern allows you to do the second. +> Consider you have a weapon with different enchantments, and you are supposed to allow mixing different weapons with +> different enchantments. What would you do? Create multiple copies of each of the weapons for each of the enchantments or +> would you just create separate enchantment and set it for the weapon as needed? Bridge pattern allows you to do the +> second. In Plain Words -> Bridge pattern is about preferring composition to inheritance. Implementation details are pushed from a hierarchy to another object with a separate hierarchy. +> Bridge pattern is about preferring composition to inheritance. Implementation details are pushed from a hierarchy to +> another object with a separate hierarchy. Wikipedia says -> The bridge pattern is a design pattern used in software engineering that is meant to "decouple an abstraction from its implementation so that the two can vary independently" +> The bridge pattern is a design pattern used in software engineering that is meant to "decouple an abstraction from its +> implementation so that the two can vary independently" **Programmatic Example** @@ -37,8 +42,11 @@ Translating our weapon example from above. Here we have the `Weapon` hierarchy: ```java public interface Weapon { void wield(); + void swing(); + void unwield(); + Enchantment getEnchantment(); } @@ -112,7 +120,9 @@ Here's the separate enchantment hierarchy: ```java public interface Enchantment { void onActivate(); + void apply(); + void onDeactivate(); } @@ -157,16 +167,16 @@ Here are both hierarchies in action: ```java LOGGER.info("The knight receives an enchanted sword."); -var enchantedSword = new Sword(new SoulEatingEnchantment()); -enchantedSword.wield(); -enchantedSword.swing(); -enchantedSword.unwield(); - -LOGGER.info("The valkyrie receives an enchanted hammer."); -var hammer = new Hammer(new FlyingEnchantment()); -hammer.wield(); -hammer.swing(); -hammer.unwield(); + var enchantedSword=new Sword(new SoulEatingEnchantment()); + enchantedSword.wield(); + enchantedSword.swing(); + enchantedSword.unwield(); + + LOGGER.info("The valkyrie receives an enchanted hammer."); + var hammer=new Hammer(new FlyingEnchantment()); + hammer.wield(); + hammer.swing(); + hammer.unwield(); ``` Here's the console output. @@ -196,37 +206,55 @@ The item's glow fades. Use the Bridge pattern when -* You want to avoid a permanent binding between an abstraction and its implementation. This might be the case, for example, when the implementation must be selected or switched at run-time. -* Both the abstractions and their implementations should be extensible by subclassing. In this case, the Bridge pattern lets you combine the different abstractions and implementations and extend them independently. -* Changes in the implementation of an abstraction should have no impact on clients; that is, their code should not have to be recompiled. -* You have a proliferation of classes. Such a class hierarchy indicates the need for splitting an object into two parts. Rumbaugh uses the term "nested generalizations" to refer to such class hierarchies. -* You want to share an implementation among multiple objects (perhaps using reference counting), and this fact should be hidden from the client. A simple example is Coplien's String class, in which multiple objects can share the same string representation. +* You want to avoid a permanent binding between an abstraction and its implementation. This might be the case, for + example, when the implementation must be selected or switched at run-time. +* Both the abstractions and their implementations should be extensible by subclassing. In this case, the Bridge pattern + lets you combine the different abstractions and implementations and extend them independently. +* Changes in the implementation of an abstraction should have no impact on clients; that is, their code should not have + to be recompiled. +* You have a proliferation of classes. Such a class hierarchy indicates the need for splitting an object into two parts. + Rumbaugh uses the term "nested generalizations" to refer to such class hierarchies. +* You want to share an implementation among multiple objects (perhaps using reference counting), and this fact should be + hidden from the client. A simple example is Coplien's String class, in which multiple objects can share the same + string representation. ## Known uses -* GUI Frameworks where the abstraction is the window, and the implementation could be the underlying OS windowing system. -* Database Drivers where the abstraction is a generic database interface, and the implementations are database-specific drivers. -* Device Drivers where the abstraction is the device-independent code, and the implementation is the device-dependent code. +* GUI Frameworks where the abstraction is the window, and the implementation could be the underlying OS windowing + system. +* Database Drivers where the abstraction is a generic database interface, and the implementations are database-specific + drivers. +* Device Drivers where the abstraction is the device-independent code, and the implementation is the device-dependent + code. ## Consequences Benefits: -* Decoupling Interface and Implementation: The Bridge pattern enhances modularity by separating the interface (the high-level operations) from the implementation (the low-level operations). +* Decoupling Interface and Implementation: The Bridge pattern enhances modularity by separating the interface (the + high-level operations) from the implementation (the low-level operations). * Improved Extensibility: You can extend the abstraction and implementation hierarchies independently. * Hiding Implementation Details: Clients only see the abstraction's interface, not its implementation. Trade-offs: -* Increased Complexity: The pattern can complicate the system architecture and code, especially for clients unfamiliar with the pattern. -* Runtime Overhead: The extra layer of abstraction can introduce a performance penalty, although it is often negligible in practice. +* Increased Complexity: The pattern can complicate the system architecture and code, especially for clients unfamiliar + with the pattern. +* Runtime Overhead: The extra layer of abstraction can introduce a performance penalty, although it is often negligible + in practice. ## Related Patterns -* [Adapter](https://java-design-patterns.com/patterns/adapter/): The Adapter pattern is used to provide a different interface to an object, while the Bridge pattern is used to separate an object's interface from its implementation. -* [Strategy](https://java-design-patterns.com/patterns/strategy/): The Strategy pattern is like the Bridge pattern, but with a different intent. Both patterns are based on composition: Strategy uses composition to change the behavior of a class, while Bridge uses composition to separate an abstraction from its implementation. -* [Abstract Factory](https://java-design-patterns.com/patterns/abstract-factory/): The Abstract Factory pattern can be used along with the Bridge pattern to create platforms that are independent of the concrete classes used to create their objects. -* [Composite](https://java-design-patterns.com/patterns/composite/): The Bridge pattern is often used with the Composite pattern to model the implementation details of a component. +* [Adapter](https://java-design-patterns.com/patterns/adapter/): The Adapter pattern is used to provide a different + interface to an object, while the Bridge pattern is used to separate an object's interface from its implementation. +* [Strategy](https://java-design-patterns.com/patterns/strategy/): The Strategy pattern is like the Bridge pattern, but + with a different intent. Both patterns are based on composition: Strategy uses composition to change the behavior of a + class, while Bridge uses composition to separate an abstraction from its implementation. +* [Abstract Factory](https://java-design-patterns.com/patterns/abstract-factory/): The Abstract Factory pattern can be + used along with the Bridge pattern to create platforms that are independent of the concrete classes used to create + their objects. +* [Composite](https://java-design-patterns.com/patterns/composite/): The Bridge pattern is often used with the Composite + pattern to model the implementation details of a component. ## Tutorials diff --git a/builder/README.md b/builder/README.md index 930bca0f4311..c9f63f47125b 100644 --- a/builder/README.md +++ b/builder/README.md @@ -3,35 +3,43 @@ title: Builder category: Creational language: en tag: - - Gang of Four + - Gang of Four --- ## Intent -Separate the construction of a complex object from its representation so that the same construction process can create different representations. +Separate the construction of a complex object from its representation so that the same construction process can create +different representations. ## Explanation Real-world example -> Imagine a character generator for a role-playing game. The easiest option is to let the computer create the character for you. If you want to manually select the character details like profession, gender, hair color, etc. the character generation becomes a step-by-step process that completes when all the selections are ready. +> Imagine a character generator for a role-playing game. The easiest option is to let the computer create the character +> for you. If you want to manually select the character details like profession, gender, hair color, etc. the character +> generation becomes a step-by-step process that completes when all the selections are ready. In plain words -> Allows you to create different flavors of an object while avoiding constructor pollution. Useful when there could be several flavors of an object. Or when there are a lot of steps involved in creation of an object. +> Allows you to create different flavors of an object while avoiding constructor pollution. Useful when there could be +> several flavors of an object. Or when there are a lot of steps involved in creation of an object. Wikipedia says -> The builder pattern is an object creation software design pattern with the intentions of finding a solution to the telescoping constructor antipattern. +> The builder pattern is an object creation software design pattern with the intentions of finding a solution to the +> telescoping constructor antipattern. -Having said that let me add a bit about what telescoping constructor antipattern is. At one point or the other, we have all seen a constructor like below: +Having said that let me add a bit about what telescoping constructor antipattern is. At one point or the other, we have +all seen a constructor like below: ```java -public Hero(Profession profession, String name, HairType hairType, HairColor hairColor, Armor armor, Weapon weapon) { -} +public Hero(Profession profession,String name,HairType hairType,HairColor hairColor,Armor armor,Weapon weapon){ + } ``` -As you can see the number of constructor parameters can quickly get out of hand, and it may become difficult to understand the arrangement of parameters. Plus this parameter list could keep on growing if you would want to add more options in the future. This is called telescoping constructor antipattern. +As you can see the number of constructor parameters can quickly get out of hand, and it may become difficult to +understand the arrangement of parameters. Plus this parameter list could keep on growing if you would want to add more +options in the future. This is called telescoping constructor antipattern. **Programmatic Example** @@ -61,51 +69,51 @@ Then we have the builder: ```java public static class Builder { - private final Profession profession; - private final String name; - private HairType hairType; - private HairColor hairColor; - private Armor armor; - private Weapon weapon; - - public Builder(Profession profession, String name) { - if (profession == null || name == null) { - throw new IllegalArgumentException("profession and name can not be null"); - } - this.profession = profession; - this.name = name; + private final Profession profession; + private final String name; + private HairType hairType; + private HairColor hairColor; + private Armor armor; + private Weapon weapon; + + public Builder(Profession profession, String name) { + if (profession == null || name == null) { + throw new IllegalArgumentException("profession and name can not be null"); } + this.profession = profession; + this.name = name; + } - public Builder withHairType(HairType hairType) { - this.hairType = hairType; - return this; - } + public Builder withHairType(HairType hairType) { + this.hairType = hairType; + return this; + } - public Builder withHairColor(HairColor hairColor) { - this.hairColor = hairColor; - return this; - } + public Builder withHairColor(HairColor hairColor) { + this.hairColor = hairColor; + return this; + } - public Builder withArmor(Armor armor) { - this.armor = armor; - return this; - } + public Builder withArmor(Armor armor) { + this.armor = armor; + return this; + } - public Builder withWeapon(Weapon weapon) { - this.weapon = weapon; - return this; - } + public Builder withWeapon(Weapon weapon) { + this.weapon = weapon; + return this; + } - public Hero build() { - return new Hero(this); - } + public Hero build() { + return new Hero(this); } +} ``` Then it can be used as: ```java -var mage = new Hero.Builder(Profession.MAGE, "Riobard").withHairColor(HairColor.BLACK).withWeapon(Weapon.DAGGER).build(); +var mage=new Hero.Builder(Profession.MAGE,"Riobard").withHairColor(HairColor.BLACK).withWeapon(Weapon.DAGGER).build(); ``` ## Class diagram @@ -116,9 +124,11 @@ var mage = new Hero.Builder(Profession.MAGE, "Riobard").withHairColor(HairColor. Use the Builder pattern when -* The algorithm for creating a complex object should be independent of the parts that make up the object and how they're assembled +* The algorithm for creating a complex object should be independent of the parts that make up the object and how they're + assembled * The construction process must allow different representations for the object that's constructed -* It's particularly useful when a product requires a lot of steps to be created and when these steps need to be executed in a specific sequence +* It's particularly useful when a product requires a lot of steps to be created and when these steps need to be executed + in a specific sequence ## Known Uses @@ -132,7 +142,8 @@ Benefits: * More control over the construction process compared to other creational patterns * Supports constructing objects step-by-step, defer construction steps or run steps recursively -* Can construct objects that require a complex assembly of sub-objects. The final product is detached from the parts that make it up, as well as their assembly process +* Can construct objects that require a complex assembly of sub-objects. The final product is detached from the parts + that make it up, as well as their assembly process * Single Responsibility Principle. You can isolate complex construction code from the business logic of the product Trade-offs: @@ -148,7 +159,8 @@ Trade-offs: ## Known uses * [java.lang.StringBuilder](http://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html) -* [java.nio.ByteBuffer](http://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html#put-byte-) as well as similar buffers such as FloatBuffer, IntBuffer and so on. +* [java.nio.ByteBuffer](http://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html#put-byte-) as well as similar + buffers such as FloatBuffer, IntBuffer and so on. * [java.lang.StringBuffer](http://docs.oracle.com/javase/8/docs/api/java/lang/StringBuffer.html#append-boolean-) * All implementations of [java.lang.Appendable](http://docs.oracle.com/javase/8/docs/api/java/lang/Appendable.html) * [Apache Camel builders](https://github.com/apache/camel/tree/0e195428ee04531be27a0b659005e3aa8d159d23/camel-core/src/main/java/org/apache/camel/builder) @@ -156,7 +168,10 @@ Trade-offs: ## Related patterns -* [Step Builder](https://java-design-patterns.com/patterns/step-builder/) is a variation of the Builder pattern that generates a complex object using a step-by-step approach. The Step Builder pattern is a good choice when you need to build an object with a large number of optional parameters, and you want to avoid the telescoping constructor antipattern. +* [Step Builder](https://java-design-patterns.com/patterns/step-builder/) is a variation of the Builder pattern that + generates a complex object using a step-by-step approach. The Step Builder pattern is a good choice when you need to + build an object with a large number of optional parameters, and you want to avoid the telescoping constructor + antipattern. ## Credits diff --git a/business-delegate/README.md b/business-delegate/README.md index 87534b869757..e35546dcbeb5 100644 --- a/business-delegate/README.md +++ b/business-delegate/README.md @@ -3,12 +3,14 @@ title: Business Delegate category: Structural language: en tag: - - Decoupling + - Decoupling --- ## Intent -The Business Delegate pattern adds an abstraction layer between presentation and business tiers. By using the pattern we gain loose coupling between the tiers and encapsulate knowledge about how to locate, connect to, and interact with the business objects that make up the application. +The Business Delegate pattern adds an abstraction layer between presentation and business tiers. By using the pattern we +gain loose coupling between the tiers and encapsulate knowledge about how to locate, connect to, and interact with the +business objects that make up the application. ## Also known as @@ -18,7 +20,9 @@ Service Representative Real world example -> A mobile phone application promises to stream any movie in existence to your device. It captures the user's search string and passes this on to the Business Delegate. The Business Delegate selects the most suitable video streaming service and plays the video from there. +> A mobile phone application promises to stream any movie in existence to your device. It captures the user's search +> string and passes this on to the Business Delegate. The Business Delegate selects the most suitable video streaming +> service and plays the video from there. In Plain Words @@ -26,7 +30,10 @@ In Plain Words Wikipedia says -> Business Delegate is a Java EE design pattern. This pattern is directing to reduce the coupling in between business services and the connected presentation tier, and to hide the implementation details of services (including lookup and accessibility of EJB architecture). Business Delegates acts as an adaptor to invoke business objects from the presentation tier. +> Business Delegate is a Java EE design pattern. This pattern is directing to reduce the coupling in between business +> services and the connected presentation tier, and to hide the implementation details of services (including lookup and +> accessibility of EJB architecture). Business Delegates acts as an adaptor to invoke business objects from the +> presentation tier. **Programmatic Example** @@ -57,6 +64,7 @@ public class YouTubeService implements VideoStreamingService { Then, we have a lookup service that decides which video streaming service to use. ```java + @Setter public class BusinessLookup { @@ -77,6 +85,7 @@ The Business Delegate uses a business lookup to route movie playback requests to video streaming service. ```java + @Setter public class BusinessDelegate { @@ -109,20 +118,20 @@ public class MobileClient { Finally, we can demonstrate the complete example in action. ```java - public static void main(String[] args) { + public static void main(String[]args){ // prepare the objects - var businessDelegate = new BusinessDelegate(); - var businessLookup = new BusinessLookup(); + var businessDelegate=new BusinessDelegate(); + var businessLookup=new BusinessLookup(); businessLookup.setNetflixService(new NetflixService()); businessLookup.setYouTubeService(new YouTubeService()); businessDelegate.setLookupService(businessLookup); // create the client and use the Business Delegate - var client = new MobileClient(businessDelegate); + var client=new MobileClient(businessDelegate); client.playbackMovie("Die Hard 2"); client.playbackMovie("Maradona: The Greatest Ever"); - } + } ``` Here is the console output. @@ -164,7 +173,8 @@ Benefits: * Decoupling of Presentation and Business Tiers: Allows the client tier and business services to evolve independently. * Location Transparency: Clients remain unaffected by changes in the location or the instantiation of business services. -* Reuse and Scalability: Business Delegate objects can be reused by multiple clients, and the pattern supports load balancing and scalability. +* Reuse and Scalability: Business Delegate objects can be reused by multiple clients, and the pattern supports load + balancing and scalability. Trade-offs: @@ -173,9 +183,12 @@ Trade-offs: ## Related patterns -* [Service Locator](https://java-design-patterns.com/patterns/service-locator/): Business Delegate uses Service Locator to locate business services. -* [Session Facade](https://java-design-patterns.com/patterns/session-facade/): Business Delegate may use Session Facade to provide a unified interface to a set of business services. -* [Composite Entity](https://java-design-patterns.com/patterns/composite-entity/): Business Delegate may use Composite Entity to manage the state of business services. +* [Service Locator](https://java-design-patterns.com/patterns/service-locator/): Business Delegate uses Service Locator + to locate business services. +* [Session Facade](https://java-design-patterns.com/patterns/session-facade/): Business Delegate may use Session Facade + to provide a unified interface to a set of business services. +* [Composite Entity](https://java-design-patterns.com/patterns/composite-entity/): Business Delegate may use Composite + Entity to manage the state of business services. ## Credits diff --git a/bytecode/README.md b/bytecode/README.md index c13565eb1378..e4a459b5895f 100644 --- a/bytecode/README.md +++ b/bytecode/README.md @@ -3,7 +3,7 @@ title: Bytecode category: Behavioral language: en tag: - - Game programming + - Game programming --- ## Intent @@ -14,22 +14,28 @@ Allows encoding behavior as instructions for a virtual machine. Real world example -> A team is working on a new game where wizards battle against each other. The wizard behavior needs to be carefully adjusted and iterated hundreds of times through playtesting. It's not optimal to ask the programmer to make changes each time the game designer wants to vary the behavior, so the wizard behavior is implemented as a data-driven virtual machine. +> A team is working on a new game where wizards battle against each other. The wizard behavior needs to be carefully +> adjusted and iterated hundreds of times through playtesting. It's not optimal to ask the programmer to make changes each +> time the game designer wants to vary the behavior, so the wizard behavior is implemented as a data-driven virtual +> machine. In plain words > Bytecode pattern enables behavior driven by data instead of code. -[Gameprogrammingpatterns.com](https://gameprogrammingpatterns.com/bytecode.html) documentation +[Gameprogrammingpatterns.com](https://gameprogrammingpatterns.com/bytecode.html) documentation states: -> An instruction set defines the low-level operations that can be performed. A series of instructions is encoded as a sequence of bytes. A virtual machine executes these instructions one at a time, using a stack for intermediate values. By combining instructions, complex high-level behavior can be defined. +> An instruction set defines the low-level operations that can be performed. A series of instructions is encoded as a +> sequence of bytes. A virtual machine executes these instructions one at a time, using a stack for intermediate values. +> By combining instructions, complex high-level behavior can be defined. **Programmatic Example** One of the most important game objects is the `Wizard` class. ```java + @AllArgsConstructor @Setter @Getter @@ -54,9 +60,12 @@ public class Wizard { } ``` -Next, we show the available instructions for our virtual machine. Each of the instructions has its own semantics on how it operates with the stack data. For example, the ADD instruction takes the top two items from the stack, adds them together and pushes the result to the stack. +Next, we show the available instructions for our virtual machine. Each of the instructions has its own semantics on how +it operates with the stack data. For example, the ADD instruction takes the top two items from the stack, adds them +together and pushes the result to the stack. ```java + @AllArgsConstructor @Getter public enum Instruction { @@ -76,9 +85,11 @@ public enum Instruction { } ``` -At the heart of our example is the `VirtualMachine` class. It takes instructions as input and executes them to provide the game object behavior. +At the heart of our example is the `VirtualMachine` class. It takes instructions as input and executes them to provide +the game object behavior. ```java + @Getter @Slf4j public class VirtualMachine { @@ -172,11 +183,11 @@ public class VirtualMachine { Now we can show the full example utilizing the virtual machine. ```java - public static void main(String[] args) { + public static void main(String[]args){ - var vm = new VirtualMachine( - new Wizard(45, 7, 11, 0, 0), - new Wizard(36, 18, 8, 0, 0)); + var vm=new VirtualMachine( + new Wizard(45,7,11,0,0), + new Wizard(36,18,8,0,0)); vm.execute(InstructionConverterUtil.convertToByteCode("LITERAL 0")); vm.execute(InstructionConverterUtil.convertToByteCode("LITERAL 0")); @@ -190,7 +201,7 @@ Now we can show the full example utilizing the virtual machine. vm.execute(InstructionConverterUtil.convertToByteCode("DIVIDE")); vm.execute(InstructionConverterUtil.convertToByteCode("ADD")); vm.execute(InstructionConverterUtil.convertToByteCode("SET_HEALTH")); - } + } ``` Here is the console output. @@ -216,11 +227,13 @@ Here is the console output. ## Applicability -Use the Bytecode pattern when you have a lot of behavior you need to define and your game’s implementation language isn’t a good fit because: +Use the Bytecode pattern when you have a lot of behavior you need to define and your game’s implementation language +isn’t a good fit because: * It’s too low-level, making it tedious or error-prone to program in. * Iterating on it takes too long due to slow compile times or other tooling issues. -* It has too much trust. If you want to ensure the behavior being defined can’t break the game, you need to sandbox it from the rest of the codebase. +* It has too much trust. If you want to ensure the behavior being defined can’t break the game, you need to sandbox it + from the rest of the codebase. ## Known Uses @@ -238,14 +251,18 @@ Benefits: Trade-offs: -* Overhead: Running bytecode typically involves more overhead than running native code, potentially affecting performance. +* Overhead: Running bytecode typically involves more overhead than running native code, potentially affecting + performance. * Complexity: Implementing and maintaining a VM adds complexity to the system. ## Related patterns -* [Interpreter](https://java-design-patterns.com/patterns/interpreter/) is often used within the implementation of VMs to interpret bytecode instructions -* [Command](https://java-design-patterns.com/patterns/command/): Bytecode instructions can be seen as commands executed by the VM. -* [Factory Method](https://java-design-patterns.com/patterns/factory-method/): VMs may use factory methods to instantiate operations or instructions defined in the bytecode. +* [Interpreter](https://java-design-patterns.com/patterns/interpreter/) is often used within the implementation of VMs + to interpret bytecode instructions +* [Command](https://java-design-patterns.com/patterns/command/): Bytecode instructions can be seen as commands executed + by the VM. +* [Factory Method](https://java-design-patterns.com/patterns/factory-method/): VMs may use factory methods to + instantiate operations or instructions defined in the bytecode. ## Credits diff --git a/caching/README.md b/caching/README.md index 001b6ec1ca76..a3442a2b96dd 100644 --- a/caching/README.md +++ b/caching/README.md @@ -10,7 +10,9 @@ tag: ## Intent -The caching pattern avoids expensive re-acquisition of resources by not releasing them immediately after use. The resources retain their identity, are kept in some fast-access storage, and are re-used to avoid having to acquire them again. +The caching pattern avoids expensive re-acquisition of resources by not releasing them immediately after use. The +resources retain their identity, are kept in some fast-access storage, and are re-used to avoid having to acquire them +again. ## Also known as @@ -21,7 +23,10 @@ The caching pattern avoids expensive re-acquisition of resources by not releasin Real world example -> A team is working on a website that provides new homes for abandoned cats. People can post their cats on the website after registering, but all the new posts require approval from one of the site moderators. The user accounts of the site moderators contain a specific flag and the data is stored in a MongoDB database. Checking for the moderator flag each time a post is viewed becomes expensive, and it's a good idea to utilize caching here. +> A team is working on a website that provides new homes for abandoned cats. People can post their cats on the website +> after registering, but all the new posts require approval from one of the site moderators. The user accounts of the site +> moderators contain a specific flag and the data is stored in a MongoDB database. Checking for the moderator flag each +> time a post is viewed becomes expensive, and it's a good idea to utilize caching here. In plain words @@ -29,13 +34,20 @@ In plain words Wikipedia says: -> In computing, a cache is a hardware or software component that stores data so that future requests for that data can be served faster; the data stored in a cache might be the result of an earlier computation or a copy of data stored elsewhere. A cache hit occurs when the requested data can be found in a cache, while a cache miss occurs when it cannot. Cache hits are served by reading data from the cache, which is faster than recomputing a result or reading from a slower data store; thus, the more requests that can be served from the cache, the faster the system performs. +> In computing, a cache is a hardware or software component that stores data so that future requests for that data can +> be served faster; the data stored in a cache might be the result of an earlier computation or a copy of data stored +> elsewhere. A cache hit occurs when the requested data can be found in a cache, while a cache miss occurs when it cannot. +> Cache hits are served by reading data from the cache, which is faster than recomputing a result or reading from a slower +> data store; thus, the more requests that can be served from the cache, the faster the system performs. **Programmatic Example** -Let's first look at the data layer of our application. The interesting classes are `UserAccount` which is a simple Java object containing the user account details, and `DbManager` interface which handles reading and writing of these objects to/from database. +Let's first look at the data layer of our application. The interesting classes are `UserAccount` which is a simple Java +object containing the user account details, and `DbManager` interface which handles reading and writing of these objects +to/from database. ```java + @Data @AllArgsConstructor @ToString @@ -49,11 +61,15 @@ public class UserAccount { public interface DbManager { void connect(); + void disconnect(); - + UserAccount readFromDb(String userId); + UserAccount writeToDb(UserAccount userAccount); + UserAccount updateDb(UserAccount userAccount); + UserAccount upsertDb(UserAccount userAccount); } ``` @@ -62,17 +78,21 @@ In the example, we are demonstrating various different caching policies * Write-through writes data to the cache and DB in a single transaction * Write-around writes data immediately into the DB instead of the cache -* Write-behind writes data into the cache initially whilst the data is only written into the DB +* Write-behind writes data into the cache initially whilst the data is only written into the DB when the cache is full -* Cache-aside pushes the responsibility of keeping the data synchronized in both data sources to +* Cache-aside pushes the responsibility of keeping the data synchronized in both data sources to the application itself -* Read-through strategy is also included in the aforementioned strategies, and it returns data from - the cache to the caller if it exists, otherwise queries from DB and stores it into the cache for +* Read-through strategy is also included in the aforementioned strategies, and it returns data from + the cache to the caller if it exists, otherwise queries from DB and stores it into the cache for future use. - -The cache implementation in `LruCache` is a hash table accompanied by a doubly linked-list. The linked-list helps in capturing and maintaining the LRU data in the cache. When data is queried (from the cache), added (to the cache), or updated, the data is moved to the front of the list to depict itself as the most-recently-used data. The LRU data is always at the end of the list. + +The cache implementation in `LruCache` is a hash table accompanied by a doubly linked-list. The linked-list helps in +capturing and maintaining the LRU data in the cache. When data is queried (from the cache), added (to the cache), or +updated, the data is moved to the front of the list to depict itself as the most-recently-used data. The LRU data is +always at the end of the list. ```java + @Slf4j public class LruCache { @@ -87,7 +107,7 @@ public class LruCache { this.userAccount = userAccount; } } - + /* ... omitted details ... */ public LruCache(int capacity) { @@ -127,14 +147,21 @@ public class LruCache { public boolean contains(String userId) { return cache.containsKey(userId); } - + public void remove(Node node) { /* ... */ } + public void setHead(Node node) { /* ... */ } + public void invalidate(String userId) { /* ... */ } + public boolean isFull() { /* ... */ } + public UserAccount getLruData() { /* ... */ } + public void clear() { /* ... */ } + public List getCacheDataInListForm() { /* ... */ } + public void setCapacity(int newCapacity) { /* ... */ } } ``` @@ -142,6 +169,7 @@ public class LruCache { The next layer we are going to look at is `CacheStore` which implements the different caching strategies. ```java + @Slf4j public class CacheStore { @@ -201,9 +229,13 @@ public class CacheStore { } ``` -`AppManager` helps to bridge the gap in communication between the main class and the application's back-end. DB connection is initialized through this class. The chosen caching strategy/policy is also initialized here. Before the cache can be used, the size of the cache has to be set. Depending on the chosen caching policy, `AppManager` will call the appropriate function in the `CacheStore` class. +`AppManager` helps to bridge the gap in communication between the main class and the application's back-end. DB +connection is initialized through this class. The chosen caching strategy/policy is also initialized here. Before the +cache can be used, the size of the cache has to be set. Depending on the chosen caching policy, `AppManager` will call +the appropriate function in the `CacheStore` class. ```java + @Slf4j public final class AppManager { @@ -223,7 +255,7 @@ public final class AppManager { public UserAccount find(final String userId) { LOGGER.info("Trying to find {} in cache", userId); if (cachingPolicy == CachingPolicy.THROUGH - || cachingPolicy == CachingPolicy.AROUND) { + || cachingPolicy == CachingPolicy.AROUND) { return cacheStore.readThrough(userId); } else if (cachingPolicy == CachingPolicy.BEHIND) { return cacheStore.readThroughWithWriteBackPolicy(userId); @@ -257,12 +289,13 @@ public final class AppManager { Here is what we do in the main class of the application. ```java + @Slf4j public class App { public static void main(final String[] args) { boolean isDbMongo = isDbMongo(args); - if(isDbMongo){ + if (isDbMongo) { LOGGER.info("Using the Mongo database engine to run the application."); } else { LOGGER.info("Using the 'in Memory' database to run the application."); @@ -308,7 +341,8 @@ public class App { Use the Caching pattern when * Repetitious acquisition, initialization, and release of the same resource cause unnecessary performance overhead -* In scenarios where the cost of recomputing or re-fetching data is significantly higher than storing and retrieving it from cache +* In scenarios where the cost of recomputing or re-fetching data is significantly higher than storing and retrieving it + from cache * For read-heavy applications with relatively static data or data that changes infrequently ## Known Uses @@ -316,28 +350,36 @@ Use the Caching pattern when * Web page caching to reduce server load and improve response time * Database query caching to avoid repeated expensive SQL queries * Caching results of CPU-intensive computations -* Content Delivery Networks (CDNs) for caching static resources like images, CSS, and JavaScript files closer to the end users +* Content Delivery Networks (CDNs) for caching static resources like images, CSS, and JavaScript files closer to the end + users ## Consequences Benefits: * Improved Performance: Significantly reduces data access latency, leading to faster application performance -* Reduced Load: Decreases the load on the underlying data source, which can lead to cost savings and increased longevity of the resource -* Scalability: Enhances the scalability of applications by efficiently handling increases in load without proportional increases in resource utilization +* Reduced Load: Decreases the load on the underlying data source, which can lead to cost savings and increased longevity + of the resource +* Scalability: Enhances the scalability of applications by efficiently handling increases in load without proportional + increases in resource utilization Trade-Offs: * Complexity: Introduces complexity in terms of cache invalidation, consistency, and synchronization * Resource Utilization: Requires additional memory or storage resources to maintain the cache -* Stale Data: There's a risk of serving outdated data if the cache is not properly invalidated or updated when the underlying data changes +* Stale Data: There's a risk of serving outdated data if the cache is not properly invalidated or updated when the + underlying data changes ## Related patterns -* [Proxy](https://java-design-patterns.com/patterns/proxy/): Caching can be implemented using the Proxy pattern, where the proxy object intercepts requests and returns cached data if available -* [Observer](https://java-design-patterns.com/patterns/observer/): Can be used to notify the cache when the underlying data changes, so that it can be updated or invalidated accordingly -* [Decorator](https://java-design-patterns.com/patterns/decorator/): Can be used to add caching behavior to an existing object without modifying its code -* [Strategy](https://java-design-patterns.com/patterns/strategy/): Different caching strategies can be implemented using the Strategy pattern, allowing the application to switch between them at runtime +* [Proxy](https://java-design-patterns.com/patterns/proxy/): Caching can be implemented using the Proxy pattern, where + the proxy object intercepts requests and returns cached data if available +* [Observer](https://java-design-patterns.com/patterns/observer/): Can be used to notify the cache when the underlying + data changes, so that it can be updated or invalidated accordingly +* [Decorator](https://java-design-patterns.com/patterns/decorator/): Can be used to add caching behavior to an existing + object without modifying its code +* [Strategy](https://java-design-patterns.com/patterns/strategy/): Different caching strategies can be implemented using + the Strategy pattern, allowing the application to switch between them at runtime ## Credits diff --git a/callback/README.md b/callback/README.md index 543b8626ffeb..3af2f2d602a5 100644 --- a/callback/README.md +++ b/callback/README.md @@ -11,7 +11,8 @@ tag: ## Intent -Callback is a piece of executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at some convenient time. +Callback is a piece of executable code that is passed as an argument to other code, which is expected to call back ( +execute) the argument at some convenient time. ## Also known as @@ -22,15 +23,17 @@ Callback is a piece of executable code that is passed as an argument to other co Real world example -> We need to be notified after the executing task has finished. We pass a callback method for the executor and wait for it to call back on us. +> We need to be notified after the executing task has finished. We pass a callback method for the executor and wait for +> it to call back on us. In plain words -> Callback is a method passed to an executor which will be called at a defined moment. +> Callback is a method passed to an executor which will be called at a defined moment. Wikipedia says -> In computer programming, a callback, also known as a "call-after" function, is any executable code that is passed as an argument to other code; that other code is expected to call back (execute) the argument at a given time. +> In computer programming, a callback, also known as a "call-after" function, is any executable code that is passed as +> an argument to other code; that other code is expected to call back (execute) the argument at a given time. **Programmatic Example** @@ -69,8 +72,8 @@ public final class SimpleTask extends Task { Finally, here's how we execute a task and receive a callback when it's finished. ```java - var task = new SimpleTask(); - task.executeWith(() -> LOGGER.info("I'm done now.")); + var task=new SimpleTask(); + task.executeWith(()->LOGGER.info("I'm done now.")); ``` ## Class diagram @@ -89,13 +92,15 @@ Use the Callback pattern when * GUI frameworks often use callbacks for event handling, such as user interactions (clicks, key presses) * Node.js heavily relies on callbacks for non-blocking I/O operations -* Frameworks that deal with asynchronous operations, like Promises in JavaScript, use callbacks to handle the resolution or rejection of asynchronous tasks +* Frameworks that deal with asynchronous operations, like Promises in JavaScript, use callbacks to handle the resolution + or rejection of asynchronous tasks ## Consequences Benefits: -* Decouples the execution logic of an operation from the signaling or notification logic, enhancing modularity and reusability +* Decouples the execution logic of an operation from the signaling or notification logic, enhancing modularity and + reusability * Facilitates asynchronous processing, improving the responsiveness and scalability of applications * Enables a reactive programming model where components can react to events as they occur @@ -103,16 +108,21 @@ Trade-offs: * Callback hell or pyramid of doom: Deeply nested callbacks can lead to code that is hard to read and maintain * Inversion of control can lead to harder-to-follow code flow, making debugging more challenging -* Potential issues with error handling, especially in languages or environments where exceptions are used, as errors might need to be propagated through callbacks +* Potential issues with error handling, especially in languages or environments where exceptions are used, as errors + might need to be propagated through callbacks ## Related patterns -[Observer](https://java-design-patterns.com/patterns/observer/): Callbacks can be seen as a more dynamic and lightweight form of the Observer pattern, with the ability to subscribe and unsubscribe callback functions dynamically -[Command](https://java-design-patterns.com/patterns/command/): Callbacks can be implemented as Command objects in scenarios where more flexibility or statefulness is required in the callback operation -[Promise](https://java-design-patterns.com/patterns/promise/): In some languages or frameworks, Promises or Futures can be used to handle asynchronous operations more cleanly, often using callbacks for success or failure cases +[Observer](https://java-design-patterns.com/patterns/observer/): Callbacks can be seen as a more dynamic and lightweight +form of the Observer pattern, with the ability to subscribe and unsubscribe callback functions dynamically +[Command](https://java-design-patterns.com/patterns/command/): Callbacks can be implemented as Command objects in +scenarios where more flexibility or statefulness is required in the callback operation +[Promise](https://java-design-patterns.com/patterns/promise/): In some languages or frameworks, Promises or Futures can +be used to handle asynchronous operations more cleanly, often using callbacks for success or failure cases ## Real world examples -* [CyclicBarrier](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CyclicBarrier.html#CyclicBarrier%28int,%20java.lang.Runnable%29) constructor can accept a callback that will be triggered every time a barrier is tripped. +* [CyclicBarrier](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CyclicBarrier.html#CyclicBarrier%28int,%20java.lang.Runnable%29) + constructor can accept a callback that will be triggered every time a barrier is tripped. * [JavaScript: The Good Parts](https://amzn.to/3TiQV61) * [Node.js Design Patterns - Third edition: Design and implement production-grade Node.js applications using proven patterns and techniques](https://amzn.to/3VssjKG) diff --git a/chain-of-responsibility/README.md b/chain-of-responsibility/README.md index 175143491664..e33a88cd5ce2 100644 --- a/chain-of-responsibility/README.md +++ b/chain-of-responsibility/README.md @@ -15,27 +15,27 @@ tag: ## Intent -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 +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. ## Explanation Real-world example -> The Orc King gives loud orders to his army. The closest one to react is the commander, then +> The Orc King gives loud orders to his army. The closest one to react is the commander, then > an officer, and then a soldier. The commander, officer, and soldier form a chain of responsibility. In plain words -> It helps to build a chain of objects. A request enters from one end and keeps going from an object +> It helps to build a chain of objects. A request enters from one end and keeps going from an object > to another until it finds a 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 +> 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** @@ -56,11 +56,11 @@ public class Request { this.requestType = Objects.requireNonNull(requestType); this.requestDescription = Objects.requireNonNull(requestDescription); } - + public void markHandled() { this.handled = true; } - + @Override public String toString() { return getRequestDescription(); @@ -77,37 +77,37 @@ Next, we show the request handler hierarchy. ```java public interface RequestHandler { - boolean canHandleRequest(Request req); + boolean canHandleRequest(Request req); - int getPriority(); + int getPriority(); - void handle(Request req); + void handle(Request req); - String name(); + String name(); } @Slf4j public class OrcCommander implements RequestHandler { - @Override - public boolean canHandleRequest(Request req) { - return req.getRequestType() == RequestType.DEFEND_CASTLE; - } - - @Override - public int getPriority() { - return 2; - } - - @Override - public void handle(Request req) { - req.markHandled(); - LOGGER.info("{} handling request \"{}\"", name(), req); - } - - @Override - public String name() { - return "Orc commander"; - } + @Override + public boolean canHandleRequest(Request req) { + return req.getRequestType() == RequestType.DEFEND_CASTLE; + } + + @Override + public int getPriority() { + return 2; + } + + @Override + public void handle(Request req) { + req.markHandled(); + LOGGER.info("{} handling request \"{}\"", name(), req); + } + + @Override + public String name() { + return "Orc commander"; + } } // OrcOfficer and OrcSoldier are defined similarly as OrcCommander @@ -143,10 +143,10 @@ public class OrcKing { The chain of responsibility in action. ```java -var king = new OrcKing(); -king.makeRequest(new Request(RequestType.DEFEND_CASTLE, "defend castle")); -king.makeRequest(new Request(RequestType.TORTURE_PRISONER, "torture prisoner")); -king.makeRequest(new Request(RequestType.COLLECT_TAX, "collect tax")); +var king=new OrcKing(); + king.makeRequest(new Request(RequestType.DEFEND_CASTLE,"defend castle")); + king.makeRequest(new Request(RequestType.TORTURE_PRISONER,"torture prisoner")); + king.makeRequest(new Request(RequestType.COLLECT_TAX,"collect tax")); ``` The console output. @@ -165,7 +165,8 @@ Orc soldier handling request "collect tax" Use Chain of Responsibility when -* More than one object may handle a request, and the handler isn't known a priori. The handler should be ascertained automatically. +* More than one object may handle a request, and the handler isn't known a priori. The handler should be ascertained + automatically. * You want to issue a request to one of several objects without specifying the receiver explicitly. * The set of objects that can handle a request should be specified dynamically. @@ -183,20 +184,25 @@ Use Chain of Responsibility when Benefits: * Reduced coupling. The sender of a request does not need to know the concrete handler that will process the request. -* Increased flexibility in assigning responsibilities to objects. You can add or change responsibilities for handling a request by changing the members and order of the chain. +* Increased flexibility in assigning responsibilities to objects. You can add or change responsibilities for handling a + request by changing the members and order of the chain. * Allows you to set a default handler if no concrete handler can handle the request. Trade-Offs: * It can be challenging to debug and understand the flow, especially if the chain is long and complex. * The request might end up unhandled if the chain doesn't include a catch-all handler. -* Performance concerns might arise due to potentially going through several handlers before finding the right one, or not finding it at all. +* Performance concerns might arise due to potentially going through several handlers before finding the right one, or + not finding it at all. ## Related Patterns -[Command](https://java-design-patterns.com/patterns/command/): can be used to encapsulate a request as an object, which might be passed along the chain. -[Composite](https://java-design-patterns.com/patterns/composite/): the Chain of Responsibility is often applied in conjunction with the Composite pattern. -[Decorator](https://java-design-patterns.com/patterns/decorator/): decorators can be chained in a similar manner as responsibilities in the Chain of Responsibility pattern. +[Command](https://java-design-patterns.com/patterns/command/): can be used to encapsulate a request as an object, which +might be passed along the chain. +[Composite](https://java-design-patterns.com/patterns/composite/): the Chain of Responsibility is often applied in +conjunction with the Composite pattern. +[Decorator](https://java-design-patterns.com/patterns/decorator/): decorators can be chained in a similar manner as +responsibilities in the Chain of Responsibility pattern. ## Credits diff --git a/circuit-breaker/README.md b/circuit-breaker/README.md index 9d43ac8924f2..394d5d1d5ada 100644 --- a/circuit-breaker/README.md +++ b/circuit-breaker/README.md @@ -14,38 +14,41 @@ tag: ## Intent -The Circuit Breaker pattern aims to prevent a software system from making calls to a part of the system that is either failing or showing signs of distress. It is a way to gracefully degrade functionality when a dependent service is not responding, rather than failing completely. +The Circuit Breaker pattern aims to prevent a software system from making calls to a part of the system that is either +failing or showing signs of distress. It is a way to gracefully degrade functionality when a dependent service is not +responding, rather than failing completely. ## Explanation Real world example -> Imagine a web application that has both local files/images and remote services that are used for -> fetching data. These remote services may be either healthy and responsive at times, or may become -> slow and unresponsive at some point of time due to variety of reasons. So if one of the remote -> services is slow or not responding successfully, our application will try to fetch response from -> the remote service using multiple threads/processes, soon all of them will hang (also called -> [thread starvation](https://en.wikipedia.org/wiki/Starvation_(computer_science))) causing our entire web application to crash. We should be able to detect -> this situation and show the user an appropriate message so that he/she can explore other parts of -> the app unaffected by the remote service failure. Meanwhile, the other services that are working +> Imagine a web application that has both local files/images and remote services that are used for +> fetching data. These remote services may be either healthy and responsive at times, or may become +> slow and unresponsive at some point of time due to variety of reasons. So if one of the remote +> services is slow or not responding successfully, our application will try to fetch response from +> the remote service using multiple threads/processes, soon all of them will hang (also called +> [thread starvation](https://en.wikipedia.org/wiki/Starvation_(computer_science))) causing our entire web application +> to crash. We should be able to detect +> this situation and show the user an appropriate message so that he/she can explore other parts of +> the app unaffected by the remote service failure. Meanwhile, the other services that are working > normally, should keep functioning unaffected by this failure. In plain words -> Circuit Breaker allows graceful handling of failed remote services. It's especially useful when -> all parts of our application are highly decoupled from each other, and failure of one component +> Circuit Breaker allows graceful handling of failed remote services. It's especially useful when +> all parts of our application are highly decoupled from each other, and failure of one component > doesn't mean the other parts will stop working. Wikipedia says -> Circuit breaker is a design pattern used in modern software development. It is used to detect -> failures and encapsulates the logic of preventing a failure from constantly recurring, during +> Circuit breaker is a design pattern used in modern software development. It is used to detect +> failures and encapsulates the logic of preventing a failure from constantly recurring, during > maintenance, temporary external system failure or unexpected system difficulties. ## Programmatic Example -So, how does this all come together? With the above example in mind we will imitate the -functionality in a simple example. A monitoring service mimics the web app and makes both local and +So, how does this all come together? With the above example in mind we will imitate the +functionality in a simple example. A monitoring service mimics the web app and makes both local and remote calls. The service architecture is as follows: @@ -55,6 +58,7 @@ The service architecture is as follows: In terms of code, the end user application is: ```java + @Slf4j public class App { @@ -114,7 +118,7 @@ public class App { } ``` -The monitoring service: +The monitoring service: ```java public class MonitoringService { @@ -160,147 +164,154 @@ public class MonitoringService { } } ``` -As it can be seen, it does the call to get local resources directly, but it wraps the call to + +As it can be seen, it does the call to get local resources directly, but it wraps the call to remote (costly) service in a circuit breaker object, which prevents faults as follows: ```java public class DefaultCircuitBreaker implements CircuitBreaker { - private final long timeout; - private final long retryTimePeriod; - private final RemoteService service; - long lastFailureTime; - private String lastFailureResponse; - int failureCount; - private final int failureThreshold; - private State state; - // Future time offset, in nanoseconds - private final long futureTime = 1_000_000_000_000L; - - /** - * Constructor to create an instance of Circuit Breaker. - * - * @param timeout Timeout for the API request. Not necessary for this simple example - * @param failureThreshold Number of failures we receive from the depended service before changing - * state to 'OPEN' - * @param retryTimePeriod Time period after which a new request is made to remote service for - * status check. - */ - DefaultCircuitBreaker(RemoteService serviceToCall, long timeout, int failureThreshold, - long retryTimePeriod) { - this.service = serviceToCall; - // We start in a closed state hoping that everything is fine - this.state = State.CLOSED; - this.failureThreshold = failureThreshold; - // Timeout for the API request. - // Used to break the calls made to remote resource if it exceeds the limit - this.timeout = timeout; - this.retryTimePeriod = retryTimePeriod; - //An absurd amount of time in future which basically indicates the last failure never happened - this.lastFailureTime = System.nanoTime() + futureTime; - this.failureCount = 0; - } + private final long timeout; + private final long retryTimePeriod; + private final RemoteService service; + long lastFailureTime; + private String lastFailureResponse; + int failureCount; + private final int failureThreshold; + private State state; + // Future time offset, in nanoseconds + private final long futureTime = 1_000_000_000_000L; - // Reset everything to defaults - @Override - public void recordSuccess() { - this.failureCount = 0; - this.lastFailureTime = System.nanoTime() + futureTime; - this.state = State.CLOSED; - } + /** + * Constructor to create an instance of Circuit Breaker. + * + * @param timeout Timeout for the API request. Not necessary for this simple example + * @param failureThreshold Number of failures we receive from the depended service before changing + * state to 'OPEN' + * @param retryTimePeriod Time period after which a new request is made to remote service for + * status check. + */ + DefaultCircuitBreaker(RemoteService serviceToCall, long timeout, int failureThreshold, + long retryTimePeriod) { + this.service = serviceToCall; + // We start in a closed state hoping that everything is fine + this.state = State.CLOSED; + this.failureThreshold = failureThreshold; + // Timeout for the API request. + // Used to break the calls made to remote resource if it exceeds the limit + this.timeout = timeout; + this.retryTimePeriod = retryTimePeriod; + //An absurd amount of time in future which basically indicates the last failure never happened + this.lastFailureTime = System.nanoTime() + futureTime; + this.failureCount = 0; + } - @Override - public void recordFailure(String response) { - failureCount = failureCount + 1; - this.lastFailureTime = System.nanoTime(); - // Cache the failure response for returning on open state - this.lastFailureResponse = response; - } + // Reset everything to defaults + @Override + public void recordSuccess() { + this.failureCount = 0; + this.lastFailureTime = System.nanoTime() + futureTime; + this.state = State.CLOSED; + } - // Evaluate the current state based on failureThreshold, failureCount and lastFailureTime. - protected void evaluateState() { - if (failureCount >= failureThreshold) { //Then something is wrong with remote service - if ((System.nanoTime() - lastFailureTime) > retryTimePeriod) { - //We have waited long enough and should try checking if service is up - state = State.HALF_OPEN; - } else { - //Service would still probably be down - state = State.OPEN; - } - } else { - //Everything is working fine - state = State.CLOSED; - } - } + @Override + public void recordFailure(String response) { + failureCount = failureCount + 1; + this.lastFailureTime = System.nanoTime(); + // Cache the failure response for returning on open state + this.lastFailureResponse = response; + } - @Override - public String getState() { - evaluateState(); - return state.name(); + // Evaluate the current state based on failureThreshold, failureCount and lastFailureTime. + protected void evaluateState() { + if (failureCount >= failureThreshold) { //Then something is wrong with remote service + if ((System.nanoTime() - lastFailureTime) > retryTimePeriod) { + //We have waited long enough and should try checking if service is up + state = State.HALF_OPEN; + } else { + //Service would still probably be down + state = State.OPEN; + } + } else { + //Everything is working fine + state = State.CLOSED; } + } + + @Override + public String getState() { + evaluateState(); + return state.name(); + } - /** - * Break the circuit beforehand if it is known service is down Or connect the circuit manually if - * service comes online before expected. - * - * @param state State at which circuit is in - */ - @Override - public void setState(State state) { - this.state = state; - switch (state) { - case OPEN -> { - this.failureCount = failureThreshold; - this.lastFailureTime = System.nanoTime(); - } - case HALF_OPEN -> { - this.failureCount = failureThreshold; - this.lastFailureTime = System.nanoTime() - retryTimePeriod; - } - default -> this.failureCount = 0; - } + /** + * Break the circuit beforehand if it is known service is down Or connect the circuit manually if + * service comes online before expected. + * + * @param state State at which circuit is in + */ + @Override + public void setState(State state) { + this.state = state; + switch (state) { + case OPEN -> { + this.failureCount = failureThreshold; + this.lastFailureTime = System.nanoTime(); + } + case HALF_OPEN -> { + this.failureCount = failureThreshold; + this.lastFailureTime = System.nanoTime() - retryTimePeriod; + } + default -> this.failureCount = 0; } + } - /** - * Executes service call. - * - * @return Value from the remote resource, stale response or a custom exception - */ - @Override - public String attemptRequest() throws RemoteServiceException { - evaluateState(); - if (state == State.OPEN) { - // return cached response if the circuit is in OPEN state - return this.lastFailureResponse; - } else { - // Make the API request if the circuit is not OPEN - try { - //In a real application, this would be run in a thread and the timeout - //parameter of the circuit breaker would be utilized to know if service - //is working. Here, we simulate that based on server response itself - var response = service.call(); - // Yay!! the API responded fine. Let's reset everything. - recordSuccess(); - return response; - } catch (RemoteServiceException ex) { - recordFailure(ex.getMessage()); - throw ex; - } - } + /** + * Executes service call. + * + * @return Value from the remote resource, stale response or a custom exception + */ + @Override + public String attemptRequest() throws RemoteServiceException { + evaluateState(); + if (state == State.OPEN) { + // return cached response if the circuit is in OPEN state + return this.lastFailureResponse; + } else { + // Make the API request if the circuit is not OPEN + try { + //In a real application, this would be run in a thread and the timeout + //parameter of the circuit breaker would be utilized to know if service + //is working. Here, we simulate that based on server response itself + var response = service.call(); + // Yay!! the API responded fine. Let's reset everything. + recordSuccess(); + return response; + } catch (RemoteServiceException ex) { + recordFailure(ex.getMessage()); + throw ex; + } } + } } ``` -How does the above pattern prevent failures? Let's understand via this finite state machine +How does the above pattern prevent failures? Let's understand via this finite state machine implemented by it. ![alt text](./etc/StateDiagram.png "State Diagram") -- We initialize the Circuit Breaker object with certain parameters: `timeout`, `failureThreshold` and `retryTimePeriod` which help determine how resilient the API is. +- We initialize the Circuit Breaker object with certain parameters: `timeout`, `failureThreshold` and `retryTimePeriod` + which help determine how resilient the API is. - Initially, we are in the `closed` state and nos remote calls to the API have occurred. - Every time the call succeeds, we reset the state to as it was in the beginning. -- If the number of failures cross a certain threshold, we move to the `open` state, which acts just like an open circuit and prevents remote service calls from being made, thus saving resources. (Here, we return the response called ```stale response from API```) -- Once we exceed the retry timeout period, we move to the `half-open` state and make another call to the remote service again to check if the service is working so that we can serve fresh content. A failure sets it back to `open` state and another attempt is made after retry timeout period, while a success sets it to `closed` state so that everything starts working normally again. +- If the number of failures cross a certain threshold, we move to the `open` state, which acts just like an open circuit + and prevents remote service calls from being made, thus saving resources. (Here, we return the response + called ```stale response from API```) +- Once we exceed the retry timeout period, we move to the `half-open` state and make another call to the remote service + again to check if the service is working so that we can serve fresh content. A failure sets it back to `open` state + and another attempt is made after retry timeout period, while a success sets it to `closed` state so that everything + starts working normally again. ## Class diagram @@ -330,14 +341,18 @@ Benefits: Trade-Offs: -* The complexity of the system increases as the pattern requires additional logic to detect failures and manage the state of the circuit breaker -* May lead to system degradation if not properly configured, as legitimate requests might be blocked if the circuit is open +* The complexity of the system increases as the pattern requires additional logic to detect failures and manage the + state of the circuit breaker +* May lead to system degradation if not properly configured, as legitimate requests might be blocked if the circuit is + open * Requires careful tuning of thresholds and timeout periods to balance between responsiveness and protection ## Related Patterns -- [Retry Pattern](https://github.com/iluwatar/java-design-patterns/tree/master/retry): Can be used in conjunction with the Circuit Breaker pattern to retry failed operations before opening the circuit -- [Bulkhead Pattern](https://learn.microsoft.com/en-us/azure/architecture/patterns/bulkhead): Can be used to isolate different parts of the system to prevent failures from spreading across the system +- [Retry Pattern](https://github.com/iluwatar/java-design-patterns/tree/master/retry): Can be used in conjunction with + the Circuit Breaker pattern to retry failed operations before opening the circuit +- [Bulkhead Pattern](https://learn.microsoft.com/en-us/azure/architecture/patterns/bulkhead): Can be used to isolate + different parts of the system to prevent failures from spreading across the system ## Credits diff --git a/client-session/README.md b/client-session/README.md index c88c019fe00a..bd1fbc9fe4bf 100644 --- a/client-session/README.md +++ b/client-session/README.md @@ -13,21 +13,35 @@ tags: ## Intent -The Client Session design pattern aims to maintain a user's state and data across multiple requests within a web application, ensuring a continuous and personalized user experience. +The Client Session design pattern aims to maintain a user's state and data across multiple requests within a web +application, ensuring a continuous and personalized user experience. ## Explanation Real-World Example -> You're looking to create a data management app allowing users to send requests to the server to modify and make changes to data stored on their devices. These requests are small and the data is individual to each user, negating the need for a large scale database implementation. Using the client session pattern, you are able to handle multiple concurrent requests, load balancing clients across different servers with ease due to servers remaining stateless. You also remove the need to store session IDs on the server side due to clients providing all the information that a server needs to perform their process. +> You're looking to create a data management app allowing users to send requests to the server to modify and make +> changes to data stored on their devices. These requests are small and the data is individual to each user, negating the +> need for a large scale database implementation. Using the client session pattern, you are able to handle multiple +> concurrent requests, load balancing clients across different servers with ease due to servers remaining stateless. You +> also remove the need to store session IDs on the server side due to clients providing all the information that a server +> needs to perform their process. In Plain words -> Instead of storing information about the current client and the information being accessed on the server, it is maintained client side only. Client has to send session data with each request to the server and has to send an updated state back to the client, which is stored on the clients machine. The server doesn't have to store the client information. ([ref](https://dzone.com/articles/practical-php-patterns/practical-php-patterns-client)) +> Instead of storing information about the current client and the information being accessed on the server, it is +> maintained client side only. Client has to send session data with each request to the server and has to send an updated +> state back to the client, which is stored on the clients machine. The server doesn't have to store the client +> information. ([ref](https://dzone.com/articles/practical-php-patterns/practical-php-patterns-client)) **Programmatic Example** -Here is the sample code to describe the client-session pattern. In the below code we are first creating an instance of the Server. This server instance will then be used to get Session objects for two clients. As you can see from the code below the Session object can be used to store any relevant information that are required by the server to process the client request. These session objects will then be passed on with every Request to the server. The Request will have the Session object that stores the relevant client details along with the required data for processing the request. The session information in every request helps the server identify the client and process the request accordingly. +Here is the sample code to describe the client-session pattern. In the below code we are first creating an instance of +the Server. This server instance will then be used to get Session objects for two clients. As you can see from the code +below the Session object can be used to store any relevant information that are required by the server to process the +client request. These session objects will then be passed on with every Request to the server. The Request will have the +Session object that stores the relevant client details along with the required data for processing the request. The +session information in every request helps the server identify the client and process the request accordingly. ```java public class App { @@ -93,20 +107,27 @@ Use the client state pattern when: Benefits: * Improved server performance by reducing the need to store user state on the server. -* Enhanced user experience through personalized content and seamless navigation across different parts of the application. +* Enhanced user experience through personalized content and seamless navigation across different parts of the + application. * Flexibility in managing sessions through various client-side storage mechanisms (e.g., cookies, Web Storage API). Trade-offs: -* Potential security risks if sensitive information is stored in client sessions without proper encryption and validation. -* Dependence on client-side capabilities and settings, such as cookie policies, which can vary across browsers and user configurations. -* Increased complexity in session management logic, especially in handling session expiration, renewal, and synchronization across multiple devices or tabs. +* Potential security risks if sensitive information is stored in client sessions without proper encryption and + validation. +* Dependence on client-side capabilities and settings, such as cookie policies, which can vary across browsers and user + configurations. +* Increased complexity in session management logic, especially in handling session expiration, renewal, and + synchronization across multiple devices or tabs. ## Related Patterns -* Server Session: Often used in conjunction with the Client Session pattern to provide a balance between client-side efficiency and server-side control. -* [Singleton](https://java-design-patterns.com/patterns/singleton/): Ensuring a single instance of a user's session throughout the application. -* [State](https://java-design-patterns.com/patterns/state/): Managing state transitions in a session, such as authenticated, guest, or expired states. +* Server Session: Often used in conjunction with the Client Session pattern to provide a balance between client-side + efficiency and server-side control. +* [Singleton](https://java-design-patterns.com/patterns/singleton/): Ensuring a single instance of a user's session + throughout the application. +* [State](https://java-design-patterns.com/patterns/state/): Managing state transitions in a session, such as + authenticated, guest, or expired states. ## Credits diff --git a/collecting-parameter/README.md b/collecting-parameter/README.md index 99e7bea35b4d..34b8bf5450fd 100644 --- a/collecting-parameter/README.md +++ b/collecting-parameter/README.md @@ -1,44 +1,59 @@ --- -title: Collecting Parameter -category: Idiom +title: Collecting Parameter +category: Behavioral language: en tag: -- Generic + - Accumulation + - Generic --- -## Name -Collecting Parameter +## Also known as + +* Collector +* Accumulator ## Intent -To store the collaborative result of numerous methods within a collection. + +Aims to simplify methods that collect information by passing a single collection object through various method calls, +allowing them to add results to this collection rather than each method creating its own collection. ## Explanation + ### Real-world example + Within a large corporate building, there exists a global printer queue that is a collection of all the printing jobs that are currently pending. Various floors contain different models of printers, each having a different printing -policy. We must construct a program that can continually add appropriate printing jobs to a collection, which is called the *collecting parameter*. +policy. We must construct a program that can continually add appropriate printing jobs to a collection, which is called +the *collecting parameter*. ### In plain words + Instead of having one giant method that contains numerous policies for collecting information into a variable, we can -create numerous smaller functions that each take parameter, and append new information. We can pass the parameter to -all of these smaller functions and by the end, we will have what we wanted originally. This time, the code is cleaner -and easier to understand. Because the larger function has been broken down, the code is also easier to modify as changes -are localised to the smaller functions. +create numerous smaller functions that each take parameter, and append new information. We can pass the parameter to all +of these smaller functions and by the end, we will have what we wanted originally. This time, the code is cleaner and +easier to understand. Because the larger function has been broken down, the code is also easier to modify as changes are +localised to the smaller functions. ### Wikipedia says -In the Collecting Parameter idiom a collection (list, map, etc.) is passed repeatedly as a parameter to a method which adds items to the collection. + +In the Collecting Parameter idiom a collection (list, map, etc.) is passed repeatedly as a parameter to a method which +adds items to the collection. ### Programmatic example + Coding our example from above, we may use the collection `result` as a collecting parameter. The following restrictions are implemented: + - If an A4 paper is coloured, it must also be single-sided. All other non-coloured papers are accepted - A3 papers must be non-coloured and single-sided - A2 papers must be single-page, single-sided, and non-coloured ```java package com.iluwatar.collectingparameter; + import java.util.LinkedList; import java.util.Queue; + public class App { static PrinterQueue printerQueue = PrinterQueue.getInstance(); @@ -57,10 +72,10 @@ public class App { /* This variable is the collecting parameter. - */ + */ var result = new LinkedList(); - /* + /* * Using numerous sub-methods to collaboratively add information to the result collecting parameter */ addA4Papers(result); @@ -76,6 +91,7 @@ appropriate print jobs as per the policy described previously. The three policie ```java public class App { static PrinterQueue printerQueue = PrinterQueue.getInstance(); + /** * Adds A4 document jobs to the collecting parameter according to some policy that can be whatever the client * (the print center) wants. @@ -132,7 +148,7 @@ public class App { // Encoding the policy into a Boolean: the A2 paper must be single page, single-sided, and non-coloured. var isNotColouredSingleSidedAndOnePage = nextItem.pageCount == 1 && !nextItem.isDoubleSided - && !nextItem.isColour; + && !nextItem.isColour; if (isNotColouredSingleSidedAndOnePage) { printerItemsCollection.add(nextItem); } @@ -142,8 +158,9 @@ public class App { } ``` -Each method takes a collecting parameter as an argument. It then adds elements, taken from a global variable, -to this collecting parameter if each element satisfies a given criteria. These methods can have whatever policy the client desires. +Each method takes a collecting parameter as an argument. It then adds elements, taken from a global variable, to this +collecting parameter if each element satisfies a given criteria. These methods can have whatever policy the client +desires. In this programmatic example, three print jobs are added to the queue. Only the first two print jobs should be added to the collecting parameter as per the policy. The elements of the `result` variable after execution are, @@ -156,42 +173,69 @@ the collecting parameter as per the policy. The elements of the `result` variabl which is what we expected. ## Class diagram + ![alt text](./etc/collecting-parameter.urm.png "Collecting Parameter") ## Applicability + Use the Collecting Parameter design pattern when -- you want to return a collection or object that is the collaborative result of several methods -- You want to simplify a method that accumulates data as the original method is too complex + +- When multiple methods produce a collection of results and you want to aggregate these results in a unified manner. +- In scenarios where reducing the number of collections created by methods can improve memory efficiency and + performance. +- When you're refactoring large methods that perform multiple tasks, including the collection of results from various + operations. ## Tutorials + Tutorials for this method are found in: + - [Refactoring To Patterns](http://www.tarrani.net/RefactoringToPatterns.pdf) by Joshua Kerivsky -- [Smalltalk Best Practice Patterns](https://ptgmedia.pearsoncmg.com/images/9780134769042/samplepages/013476904X.pdf) by Kent Beck +- [Smalltalk Best Practice Patterns](https://ptgmedia.pearsoncmg.com/images/9780134769042/samplepages/013476904X.pdf) by + Kent Beck ## Known uses + Joshua Kerivsky gives a real-world example in his book 'Refactoring to Patterns'. He gives an example of using the Collecting Parameter Design Pattern to create a `toString()` method for an XML tree. Without using this design pattern, -this would require a bulky function with conditionals and concatenation that would worsen code readability. Such a method -can be broken down into smaller methods, each appending their own set of information to the collecting parameter. - +this would require a bulky function with conditionals and concatenation that would worsen code readability. Such a +method can be broken down into smaller methods, each appending their own set of information to the collecting parameter. See this in [Refactoring To Patterns](http://www.tarrani.net/RefactoringToPatterns.pdf). +Other examples include: + +- Aggregating error messages or validation failures across a complex validation process. +- Collecting elements or information while traversing a complex data structure. +- Refactoring complex reporting functionalities where various parts of a report are generated by different methods. + ## Consequences -Pros: -- Makes code more readable -- Avoids 'linkages', where numerous methods reference the same global variable -- Increases maintainability by decomposing larger functions -Cons: -- May increase code length -- Adds 'layers' of methods +Benefits: + +- Reduces code duplication by centralizing collection handling in a single place. +- Enhances clarity and maintainability by making it explicit where and how results are collected. +- Improves performance by minimizing the creation and management of multiple collection objects. + +Trade-offs: + +- Increases coupling between the caller and the methods being called since they must agree on the collection to use. +- May introduce side effects in methods if not carefully managed, as methods are no longer self-contained in their + result handling. ## Related patterns -- [Compose Methods](https://www.geeksforgeeks.org/composite-design-pattern/) + +- [Composite](https://java-design-patterns.com/patterns/composite/): Can be used in tandem with Collecting Parameter + when dealing with hierarchical structures, allowing results to be collected across a composite structure. +- [Visitor](https://java-design-patterns.com/patterns/visitor/): Often used together, where Visitor handles traversal + and operations on a structure, and Collecting Parameter accumulates the results. +- [Command](https://java-design-patterns.com/patterns/command/): Commands may utilize Collecting Parameter to aggregate + results from multiple operations executed by the command objects. ## Credits -Following books were used: -- [Refactoring To Patterns](http://www.tarrani.net/RefactoringToPatterns.pdf) by Joshua Kerivsky -- [Smalltalk Best Practice Patterns](https://ptgmedia.pearsoncmg.com/images/9780134769042/samplepages/013476904X.pdf) by Kent Beck -Sites: + +- [Refactoring To Patterns](http://www.tarrani.net/RefactoringToPatterns.pdf) by Joshua Kerivsky +- [Smalltalk Best Practice Patterns](https://ptgmedia.pearsoncmg.com/images/9780134769042/samplepages/013476904X.pdf) by + Kent Beck - [Wiki](https://wiki.c2.com/?CollectingParameter) +- [Refactoring: Improving the Design of Existing Code](https://amzn.to/3TVEgaB) +- [Clean Code: A Handbook of Agile Software Craftsmanship](https://amzn.to/4aApLP0) diff --git a/collecting-parameter/src/test/java/com/iluwatar/collectingparameter/PrinterQueueTest.java b/collecting-parameter/src/test/java/com/iluwatar/collectingparameter/PrinterQueueTest.java index 8cbe071a5410..fc633108be76 100644 --- a/collecting-parameter/src/test/java/com/iluwatar/collectingparameter/PrinterQueueTest.java +++ b/collecting-parameter/src/test/java/com/iluwatar/collectingparameter/PrinterQueueTest.java @@ -27,8 +27,6 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; -import java.util.LinkedList; -import java.util.Queue; import static org.junit.jupiter.api.Assertions.*; From 6322d538cd8893045fe5746b6c45d11b0fa2dbea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Fri, 29 Mar 2024 14:30:50 +0200 Subject: [PATCH 021/580] docs: add editorconfig + formatting --- .editorconfig | 340 +++++++++++++++++++++++ abstract-document/README.md | 152 +++++----- abstract-factory/README.md | 152 +++++----- active-object/README.md | 138 +++++----- acyclic-visitor/README.md | 76 ++--- adapter/README.md | 58 ++-- aggregator-microservices/README.md | 52 ++-- ambassador/README.md | 164 +++++------ anti-corruption-layer/README.md | 72 ++--- api-gateway/README.md | 116 ++++---- arrange-act-assert/README.md | 124 ++++----- async-method-invocation/README.md | 124 ++++----- balking/README.md | 86 +++--- bridge/README.md | 204 +++++++------- builder/README.md | 108 ++++---- business-delegate/README.md | 84 +++--- bytecode/README.md | 256 ++++++++--------- caching/README.md | 368 ++++++++++++------------- callback/README.md | 30 +- chain-of-responsibility/README.md | 118 ++++---- circuit-breaker/README.md | 427 ++++++++++++++--------------- client-session/README.md | 54 ++-- collecting-parameter/README.md | 158 +++++------ 23 files changed, 1902 insertions(+), 1559 deletions(-) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000000..4095d32cb5b9 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,340 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = false +max_line_length = 120 +tab_width = 4 +ij_continuation_indent_size = 8 +ij_formatter_off_tag = @formatter:off +ij_formatter_on_tag = @formatter:on +ij_formatter_tags_enabled = true +ij_smart_tabs = false +ij_visual_guides = +ij_wrap_on_typing = false + +[*.java] +indent_size = 2 +max_line_length = 100 +ij_continuation_indent_size = 4 +ij_java_align_consecutive_assignments = false +ij_java_align_consecutive_variable_declarations = false +ij_java_align_group_field_declarations = false +ij_java_align_multiline_annotation_parameters = false +ij_java_align_multiline_array_initializer_expression = false +ij_java_align_multiline_assignment = false +ij_java_align_multiline_binary_operation = false +ij_java_align_multiline_chained_methods = false +ij_java_align_multiline_deconstruction_list_components = true +ij_java_align_multiline_extends_list = false +ij_java_align_multiline_for = true +ij_java_align_multiline_method_parentheses = false +ij_java_align_multiline_parameters = true +ij_java_align_multiline_parameters_in_calls = false +ij_java_align_multiline_parenthesized_expression = false +ij_java_align_multiline_records = true +ij_java_align_multiline_resources = true +ij_java_align_multiline_ternary_operation = false +ij_java_align_multiline_text_blocks = false +ij_java_align_multiline_throws_list = false +ij_java_align_subsequent_simple_methods = false +ij_java_align_throws_keyword = false +ij_java_align_types_in_multi_catch = true +ij_java_annotation_parameter_wrap = off +ij_java_array_initializer_new_line_after_left_brace = false +ij_java_array_initializer_right_brace_on_new_line = false +ij_java_array_initializer_wrap = normal +ij_java_assert_statement_colon_on_next_line = false +ij_java_assert_statement_wrap = normal +ij_java_assignment_wrap = normal +ij_java_binary_operation_sign_on_next_line = false +ij_java_binary_operation_wrap = normal +ij_java_blank_lines_after_anonymous_class_header = 0 +ij_java_blank_lines_after_class_header = 0 +ij_java_blank_lines_after_imports = 1 +ij_java_blank_lines_after_package = 1 +ij_java_blank_lines_around_class = 1 +ij_java_blank_lines_around_field = 0 +ij_java_blank_lines_around_field_in_interface = 0 +ij_java_blank_lines_around_initializer = 1 +ij_java_blank_lines_around_method = 1 +ij_java_blank_lines_around_method_in_interface = 1 +ij_java_blank_lines_before_class_end = 0 +ij_java_blank_lines_before_imports = 1 +ij_java_blank_lines_before_method_body = 0 +ij_java_blank_lines_before_package = 1 +ij_java_block_brace_style = end_of_line +ij_java_block_comment_add_space = false +ij_java_block_comment_at_first_column = true +ij_java_builder_methods = +ij_java_call_parameters_new_line_after_left_paren = false +ij_java_call_parameters_right_paren_on_new_line = false +ij_java_call_parameters_wrap = normal +ij_java_case_statement_on_separate_line = true +ij_java_catch_on_new_line = false +ij_java_class_annotation_wrap = split_into_lines +ij_java_class_brace_style = end_of_line +ij_java_class_count_to_use_import_on_demand = 999 +ij_java_class_names_in_javadoc = 1 +ij_java_deconstruction_list_wrap = normal +ij_java_do_not_indent_top_level_class_members = false +ij_java_do_not_wrap_after_single_annotation = false +ij_java_do_not_wrap_after_single_annotation_in_parameter = false +ij_java_do_while_brace_force = always +ij_java_doc_add_blank_line_after_description = true +ij_java_doc_add_blank_line_after_param_comments = false +ij_java_doc_add_blank_line_after_return = false +ij_java_doc_add_p_tag_on_empty_lines = true +ij_java_doc_align_exception_comments = true +ij_java_doc_align_param_comments = true +ij_java_doc_do_not_wrap_if_one_line = false +ij_java_doc_enable_formatting = true +ij_java_doc_enable_leading_asterisks = true +ij_java_doc_indent_on_continuation = false +ij_java_doc_keep_empty_lines = true +ij_java_doc_keep_empty_parameter_tag = true +ij_java_doc_keep_empty_return_tag = true +ij_java_doc_keep_empty_throws_tag = true +ij_java_doc_keep_invalid_tags = true +ij_java_doc_param_description_on_new_line = false +ij_java_doc_preserve_line_breaks = false +ij_java_doc_use_throws_not_exception_tag = true +ij_java_else_on_new_line = false +ij_java_entity_dd_prefix = +ij_java_entity_dd_suffix = EJB +ij_java_entity_eb_prefix = +ij_java_entity_eb_suffix = Bean +ij_java_entity_hi_prefix = +ij_java_entity_hi_suffix = Home +ij_java_entity_lhi_prefix = Local +ij_java_entity_lhi_suffix = Home +ij_java_entity_li_prefix = Local +ij_java_entity_li_suffix = +ij_java_entity_pk_class = java.lang.String +ij_java_entity_ri_prefix = +ij_java_entity_ri_suffix = +ij_java_entity_vo_prefix = +ij_java_entity_vo_suffix = VO +ij_java_enum_constants_wrap = normal +ij_java_extends_keyword_wrap = normal +ij_java_extends_list_wrap = normal +ij_java_field_annotation_wrap = split_into_lines +ij_java_field_name_prefix = +ij_java_field_name_suffix = +ij_java_filter_class_prefix = +ij_java_filter_class_suffix = +ij_java_filter_dd_prefix = +ij_java_filter_dd_suffix = +ij_java_finally_on_new_line = false +ij_java_for_brace_force = always +ij_java_for_statement_new_line_after_left_paren = false +ij_java_for_statement_right_paren_on_new_line = false +ij_java_for_statement_wrap = normal +ij_java_generate_final_locals = false +ij_java_generate_final_parameters = false +ij_java_if_brace_force = always +ij_java_imports_layout = $*,|,* +ij_java_indent_case_from_switch = true +ij_java_insert_inner_class_imports = false +ij_java_insert_override_annotation = true +ij_java_keep_blank_lines_before_right_brace = 2 +ij_java_keep_blank_lines_between_package_declaration_and_header = 2 +ij_java_keep_blank_lines_in_code = 2 +ij_java_keep_blank_lines_in_declarations = 2 +ij_java_keep_builder_methods_indents = false +ij_java_keep_control_statement_in_one_line = true +ij_java_keep_first_column_comment = true +ij_java_keep_indents_on_empty_lines = false +ij_java_keep_line_breaks = true +ij_java_keep_multiple_expressions_in_one_line = false +ij_java_keep_simple_blocks_in_one_line = false +ij_java_keep_simple_classes_in_one_line = false +ij_java_keep_simple_lambdas_in_one_line = false +ij_java_keep_simple_methods_in_one_line = false +ij_java_label_indent_absolute = false +ij_java_label_indent_size = 0 +ij_java_lambda_brace_style = end_of_line +ij_java_layout_static_imports_separately = true +ij_java_line_comment_add_space = false +ij_java_line_comment_add_space_on_reformat = false +ij_java_line_comment_at_first_column = true +ij_java_listener_class_prefix = +ij_java_listener_class_suffix = +ij_java_local_variable_name_prefix = +ij_java_local_variable_name_suffix = +ij_java_message_dd_prefix = +ij_java_message_dd_suffix = EJB +ij_java_message_eb_prefix = +ij_java_message_eb_suffix = Bean +ij_java_method_annotation_wrap = split_into_lines +ij_java_method_brace_style = end_of_line +ij_java_method_call_chain_wrap = normal +ij_java_method_parameters_new_line_after_left_paren = false +ij_java_method_parameters_right_paren_on_new_line = false +ij_java_method_parameters_wrap = normal +ij_java_modifier_list_wrap = false +ij_java_multi_catch_types_wrap = normal +ij_java_names_count_to_use_import_on_demand = 999 +ij_java_new_line_after_lparen_in_annotation = false +ij_java_new_line_after_lparen_in_deconstruction_pattern = true +ij_java_new_line_after_lparen_in_record_header = false +ij_java_packages_to_use_import_on_demand = +ij_java_parameter_annotation_wrap = normal +ij_java_parameter_name_prefix = +ij_java_parameter_name_suffix = +ij_java_parentheses_expression_new_line_after_left_paren = false +ij_java_parentheses_expression_right_paren_on_new_line = false +ij_java_place_assignment_sign_on_next_line = false +ij_java_prefer_longer_names = true +ij_java_prefer_parameters_wrap = false +ij_java_record_components_wrap = normal +ij_java_repeat_annotations = +ij_java_repeat_synchronized = true +ij_java_replace_instanceof_and_cast = false +ij_java_replace_null_check = true +ij_java_replace_sum_lambda_with_method_ref = true +ij_java_resource_list_new_line_after_left_paren = false +ij_java_resource_list_right_paren_on_new_line = false +ij_java_resource_list_wrap = normal +ij_java_rparen_on_new_line_in_annotation = false +ij_java_rparen_on_new_line_in_deconstruction_pattern = true +ij_java_rparen_on_new_line_in_record_header = false +ij_java_servlet_class_prefix = +ij_java_servlet_class_suffix = +ij_java_servlet_dd_prefix = +ij_java_servlet_dd_suffix = +ij_java_session_dd_prefix = +ij_java_session_dd_suffix = EJB +ij_java_session_eb_prefix = +ij_java_session_eb_suffix = Bean +ij_java_session_hi_prefix = +ij_java_session_hi_suffix = Home +ij_java_session_lhi_prefix = Local +ij_java_session_lhi_suffix = Home +ij_java_session_li_prefix = Local +ij_java_session_li_suffix = +ij_java_session_ri_prefix = +ij_java_session_ri_suffix = +ij_java_session_si_prefix = +ij_java_session_si_suffix = Service +ij_java_space_after_closing_angle_bracket_in_type_argument = false +ij_java_space_after_colon = true +ij_java_space_after_comma = true +ij_java_space_after_comma_in_type_arguments = true +ij_java_space_after_for_semicolon = true +ij_java_space_after_quest = true +ij_java_space_after_type_cast = true +ij_java_space_before_annotation_array_initializer_left_brace = false +ij_java_space_before_annotation_parameter_list = false +ij_java_space_before_array_initializer_left_brace = true +ij_java_space_before_catch_keyword = true +ij_java_space_before_catch_left_brace = true +ij_java_space_before_catch_parentheses = true +ij_java_space_before_class_left_brace = true +ij_java_space_before_colon = true +ij_java_space_before_colon_in_foreach = true +ij_java_space_before_comma = false +ij_java_space_before_deconstruction_list = false +ij_java_space_before_do_left_brace = true +ij_java_space_before_else_keyword = true +ij_java_space_before_else_left_brace = true +ij_java_space_before_finally_keyword = true +ij_java_space_before_finally_left_brace = true +ij_java_space_before_for_left_brace = true +ij_java_space_before_for_parentheses = true +ij_java_space_before_for_semicolon = false +ij_java_space_before_if_left_brace = true +ij_java_space_before_if_parentheses = true +ij_java_space_before_method_call_parentheses = false +ij_java_space_before_method_left_brace = true +ij_java_space_before_method_parentheses = false +ij_java_space_before_opening_angle_bracket_in_type_parameter = false +ij_java_space_before_quest = true +ij_java_space_before_switch_left_brace = true +ij_java_space_before_switch_parentheses = true +ij_java_space_before_synchronized_left_brace = true +ij_java_space_before_synchronized_parentheses = true +ij_java_space_before_try_left_brace = true +ij_java_space_before_try_parentheses = true +ij_java_space_before_type_parameter_list = false +ij_java_space_before_while_keyword = true +ij_java_space_before_while_left_brace = true +ij_java_space_before_while_parentheses = true +ij_java_space_inside_one_line_enum_braces = false +ij_java_space_within_empty_array_initializer_braces = false +ij_java_space_within_empty_method_call_parentheses = false +ij_java_space_within_empty_method_parentheses = false +ij_java_spaces_around_additive_operators = true +ij_java_spaces_around_annotation_eq = true +ij_java_spaces_around_assignment_operators = true +ij_java_spaces_around_bitwise_operators = true +ij_java_spaces_around_equality_operators = true +ij_java_spaces_around_lambda_arrow = true +ij_java_spaces_around_logical_operators = true +ij_java_spaces_around_method_ref_dbl_colon = false +ij_java_spaces_around_multiplicative_operators = true +ij_java_spaces_around_relational_operators = true +ij_java_spaces_around_shift_operators = true +ij_java_spaces_around_type_bounds_in_type_parameters = true +ij_java_spaces_around_unary_operator = false +ij_java_spaces_within_angle_brackets = false +ij_java_spaces_within_annotation_parentheses = false +ij_java_spaces_within_array_initializer_braces = false +ij_java_spaces_within_braces = false +ij_java_spaces_within_brackets = false +ij_java_spaces_within_cast_parentheses = false +ij_java_spaces_within_catch_parentheses = false +ij_java_spaces_within_deconstruction_list = false +ij_java_spaces_within_for_parentheses = false +ij_java_spaces_within_if_parentheses = false +ij_java_spaces_within_method_call_parentheses = false +ij_java_spaces_within_method_parentheses = false +ij_java_spaces_within_parentheses = false +ij_java_spaces_within_record_header = false +ij_java_spaces_within_switch_parentheses = false +ij_java_spaces_within_synchronized_parentheses = false +ij_java_spaces_within_try_parentheses = false +ij_java_spaces_within_while_parentheses = false +ij_java_special_else_if_treatment = true +ij_java_static_field_name_prefix = +ij_java_static_field_name_suffix = +ij_java_subclass_name_prefix = +ij_java_subclass_name_suffix = Impl +ij_java_ternary_operation_signs_on_next_line = false +ij_java_ternary_operation_wrap = normal +ij_java_test_name_prefix = +ij_java_test_name_suffix = Test +ij_java_throws_keyword_wrap = normal +ij_java_throws_list_wrap = normal +ij_java_use_external_annotations = false +ij_java_use_fq_class_names = false +ij_java_use_relative_indents = false +ij_java_use_single_class_imports = true +ij_java_variable_annotation_wrap = normal +ij_java_visibility = public +ij_java_while_brace_force = always +ij_java_while_on_new_line = false +ij_java_wrap_comments = false +ij_java_wrap_first_method_in_call_chain = false +ij_java_wrap_long_lines = false + +[{*.markdown,*.md}] +ij_markdown_force_one_space_after_blockquote_symbol = true +ij_markdown_force_one_space_after_header_symbol = true +ij_markdown_force_one_space_after_list_bullet = true +ij_markdown_force_one_space_between_words = true +ij_markdown_format_tables = true +ij_markdown_insert_quote_arrows_on_wrap = true +ij_markdown_keep_indents_on_empty_lines = false +ij_markdown_keep_line_breaks_inside_text_blocks = true +ij_markdown_max_lines_around_block_elements = 1 +ij_markdown_max_lines_around_header = 1 +ij_markdown_max_lines_between_paragraphs = 1 +ij_markdown_min_lines_around_block_elements = 1 +ij_markdown_min_lines_around_header = 1 +ij_markdown_min_lines_between_paragraphs = 1 +ij_markdown_wrap_text_if_long = true +ij_markdown_wrap_text_inside_blockquotes = true diff --git a/abstract-document/README.md b/abstract-document/README.md index f5bc50d99857..a600047511f0 100644 --- a/abstract-document/README.md +++ b/abstract-document/README.md @@ -3,9 +3,9 @@ title: Abstract Document category: Structural language: en tag: - - Abstraction - - Extensibility - - Decoupling + - Abstraction + - Extensibility + - Decoupling --- ## Intent @@ -43,43 +43,43 @@ map and any amount of child objects. ```java public interface Document { - Void put(String key, Object value); + Void put(String key, Object value); - Object get(String key); + Object get(String key); - Stream children(String key, Function, T> constructor); + Stream children(String key, Function, T> constructor); } public abstract class AbstractDocument implements Document { - private final Map properties; - - protected AbstractDocument(Map properties) { - Objects.requireNonNull(properties, "properties map is required"); - this.properties = properties; - } - - @Override - public Void put(String key, Object value) { - properties.put(key, value); - return null; - } - - @Override - public Object get(String key) { - return properties.get(key); - } - - @Override - public Stream children(String key, Function, T> constructor) { - return Stream.ofNullable(get(key)) - .filter(Objects::nonNull) - .map(el -> (List>) el) - .findAny() - .stream() - .flatMap(Collection::stream) - .map(constructor); - } + private final Map properties; + + protected AbstractDocument(Map properties) { + Objects.requireNonNull(properties, "properties map is required"); + this.properties = properties; + } + + @Override + public Void put(String key, Object value) { + properties.put(key, value); + return null; + } + + @Override + public Object get(String key) { + return properties.get(key); + } + + @Override + public Stream children(String key, Function, T> constructor) { + return Stream.ofNullable(get(key)) + .filter(Objects::nonNull) + .map(el -> (List>) el) + .findAny() + .stream() + .flatMap(Collection::stream) + .map(constructor); + } ... } ``` @@ -90,35 +90,35 @@ static looking interface to our `Car` class. ```java public enum Property { - PARTS, TYPE, PRICE, MODEL + PARTS, TYPE, PRICE, MODEL } public interface HasType extends Document { - default Optional getType() { - return Optional.ofNullable((String) get(Property.TYPE.toString())); - } + default Optional getType() { + return Optional.ofNullable((String) get(Property.TYPE.toString())); + } } public interface HasPrice extends Document { - default Optional getPrice() { - return Optional.ofNullable((Number) get(Property.PRICE.toString())); - } + default Optional getPrice() { + return Optional.ofNullable((Number) get(Property.PRICE.toString())); + } } public interface HasModel extends Document { - default Optional getModel() { - return Optional.ofNullable((String) get(Property.MODEL.toString())); - } + default Optional getModel() { + return Optional.ofNullable((String) get(Property.MODEL.toString())); + } } public interface HasParts extends Document { - default Stream getParts() { - return children(Property.PARTS.toString(), Part::new); - } + default Stream getParts() { + return children(Property.PARTS.toString(), Part::new); + } } ``` @@ -127,9 +127,9 @@ Now we are ready to introduce the `Car`. ```java public class Car extends AbstractDocument implements HasModel, HasPrice, HasParts { - public Car(Map properties) { - super(properties); - } + public Car(Map properties) { + super(properties); + } } ``` @@ -138,32 +138,32 @@ And finally here's how we construct and use the `Car` in a full example. ```java LOGGER.info("Constructing parts and car"); - var wheelProperties=Map.of( - Property.TYPE.toString(),"wheel", - Property.MODEL.toString(),"15C", - Property.PRICE.toString(),100L); - - var doorProperties=Map.of( - Property.TYPE.toString(),"door", - Property.MODEL.toString(),"Lambo", - Property.PRICE.toString(),300L); - - var carProperties=Map.of( - Property.MODEL.toString(),"300SL", - Property.PRICE.toString(),10000L, - Property.PARTS.toString(),List.of(wheelProperties,doorProperties)); - - var car=new Car(carProperties); - - LOGGER.info("Here is our car:"); - LOGGER.info("-> model: {}",car.getModel().orElseThrow()); - LOGGER.info("-> price: {}",car.getPrice().orElseThrow()); - LOGGER.info("-> parts: "); - car.getParts().forEach(p->LOGGER.info("\t{}/{}/{}", - p.getType().orElse(null), - p.getModel().orElse(null), - p.getPrice().orElse(null)) - ); + var wheelProperties=Map.of( + Property.TYPE.toString(),"wheel", + Property.MODEL.toString(),"15C", + Property.PRICE.toString(),100L); + + var doorProperties=Map.of( + Property.TYPE.toString(),"door", + Property.MODEL.toString(),"Lambo", + Property.PRICE.toString(),300L); + + var carProperties=Map.of( + Property.MODEL.toString(),"300SL", + Property.PRICE.toString(),10000L, + Property.PARTS.toString(),List.of(wheelProperties,doorProperties)); + + var car=new Car(carProperties); + + LOGGER.info("Here is our car:"); + LOGGER.info("-> model: {}",car.getModel().orElseThrow()); + LOGGER.info("-> price: {}",car.getPrice().orElseThrow()); + LOGGER.info("-> parts: "); + car.getParts().forEach(p->LOGGER.info("\t{}/{}/{}", + p.getType().orElse(null), + p.getModel().orElse(null), + p.getPrice().orElse(null)) + ); // Constructing parts and car // Here is our car: diff --git a/abstract-factory/README.md b/abstract-factory/README.md index c7db990bdc61..01c7f7b44e6a 100644 --- a/abstract-factory/README.md +++ b/abstract-factory/README.md @@ -3,9 +3,9 @@ title: Abstract Factory category: Creational language: en tag: - - Abstraction - - Decoupling - - Gang of Four + - Abstraction + - Decoupling + - Gang of Four --- ## Also known as @@ -43,43 +43,43 @@ kingdom. ```java public interface Castle { - String getDescription(); + String getDescription(); } public interface King { - String getDescription(); + String getDescription(); } public interface Army { - String getDescription(); + String getDescription(); } // Elven implementations -> public class ElfCastle implements Castle { - static final String DESCRIPTION = "This is the elven castle!"; + static final String DESCRIPTION = "This is the elven castle!"; - @Override - public String getDescription() { - return DESCRIPTION; - } + @Override + public String getDescription() { + return DESCRIPTION; + } } public class ElfKing implements King { - static final String DESCRIPTION = "This is the elven king!"; + static final String DESCRIPTION = "This is the elven king!"; - @Override - public String getDescription() { - return DESCRIPTION; - } + @Override + public String getDescription() { + return DESCRIPTION; + } } public class ElfArmy implements Army { - static final String DESCRIPTION = "This is the elven Army!"; + static final String DESCRIPTION = "This is the elven Army!"; - @Override - public String getDescription() { - return DESCRIPTION; - } + @Override + public String getDescription() { + return DESCRIPTION; + } } // Orcish implementations similarly -> ... @@ -90,47 +90,47 @@ Then we have the abstraction and implementations for the kingdom factory. ```java public interface KingdomFactory { - Castle createCastle(); + Castle createCastle(); - King createKing(); + King createKing(); - Army createArmy(); + Army createArmy(); } public class ElfKingdomFactory implements KingdomFactory { - @Override - public Castle createCastle() { - return new ElfCastle(); - } + @Override + public Castle createCastle() { + return new ElfCastle(); + } - @Override - public King createKing() { - return new ElfKing(); - } + @Override + public King createKing() { + return new ElfKing(); + } - @Override - public Army createArmy() { - return new ElfArmy(); - } + @Override + public Army createArmy() { + return new ElfArmy(); + } } public class OrcKingdomFactory implements KingdomFactory { - @Override - public Castle createCastle() { - return new OrcCastle(); - } + @Override + public Castle createCastle() { + return new OrcCastle(); + } - @Override - public King createKing() { - return new OrcKing(); - } + @Override + public King createKing() { + return new OrcKing(); + } - @Override - public Army createArmy() { - return new OrcArmy(); - } + @Override + public Army createArmy() { + return new OrcArmy(); + } } ``` @@ -139,21 +139,21 @@ castle, king and army, etc. ```java var factory=new ElfKingdomFactory(); - var castle=factory.createCastle(); - var king=factory.createKing(); - var army=factory.createArmy(); + var castle=factory.createCastle(); + var king=factory.createKing(); + var army=factory.createArmy(); - castle.getDescription(); - king.getDescription(); - army.getDescription(); + castle.getDescription(); + king.getDescription(); + army.getDescription(); ``` Program output: ```java This is the elven castle! - This is the elven king! - This is the elven Army! + This is the elven king! + This is the elven Army! ``` Now, we can design a factory for our different kingdom factories. In this example, we created `FactoryMaker`, @@ -165,31 +165,31 @@ factory the client will ask for. ```java public static class FactoryMaker { - public enum KingdomType { - ELF, ORC - } + public enum KingdomType { + ELF, ORC + } - public static KingdomFactory makeFactory(KingdomType type) { - return switch (type) { - case ELF -> new ElfKingdomFactory(); - case ORC -> new OrcKingdomFactory(); - }; - } + public static KingdomFactory makeFactory(KingdomType type) { + return switch (type) { + case ELF -> new ElfKingdomFactory(); + case ORC -> new OrcKingdomFactory(); + }; + } } - public static void main(String[] args) { - var app = new App(); + public static void main(String[] args) { + var 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("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 - } + LOGGER.info("Orc Kingdom"); + app.createKingdom(FactoryMaker.makeFactory(KingdomType.ORC)); + --similar use of the orc factory + } ``` ## Class diagram diff --git a/active-object/README.md b/active-object/README.md index 6dc70d806eda..9935481c210d 100644 --- a/active-object/README.md +++ b/active-object/README.md @@ -3,7 +3,7 @@ title: Active Object category: Concurrency language: en tag: - - Performance + - Performance --- ## Intent @@ -29,57 +29,57 @@ itself, we can use the Active Object pattern. ```java public abstract class ActiveCreature { - private final Logger logger = LoggerFactory.getLogger(ActiveCreature.class.getName()); - - private BlockingQueue requests; - - private String name; - - private Thread thread; - - public ActiveCreature(String name) { - this.name = name; - this.requests = new LinkedBlockingQueue(); - thread = new Thread(new Runnable() { - @Override - public void run() { - while (true) { - try { - requests.take().run(); - } catch (InterruptedException e) { - logger.error(e.getMessage()); - } + private final Logger logger = LoggerFactory.getLogger(ActiveCreature.class.getName()); + + private BlockingQueue requests; + + private String name; + + private Thread thread; + + public ActiveCreature(String name) { + this.name = name; + this.requests = new LinkedBlockingQueue(); + thread = new Thread(new Runnable() { + @Override + public void run() { + while (true) { + try { + requests.take().run(); + } catch (InterruptedException e) { + logger.error(e.getMessage()); + } + } + } } - } + ); + thread.start(); + } + + public void eat() throws InterruptedException { + requests.put(new Runnable() { + @Override + public void run() { + logger.info("{} is eating!", name()); + logger.info("{} has finished eating!", name()); + } + } + ); + } + + public void roam() throws InterruptedException { + requests.put(new Runnable() { + @Override + public void run() { + logger.info("{} has started to roam the wastelands.", name()); + } + } + ); + } + + public String name() { + return this.name; } - ); - thread.start(); - } - - public void eat() throws InterruptedException { - requests.put(new Runnable() { - @Override - public void run() { - logger.info("{} is eating!", name()); - logger.info("{} has finished eating!", name()); - } - } - ); - } - - public void roam() throws InterruptedException { - requests.put(new Runnable() { - @Override - public void run() { - logger.info("{} has started to roam the wastelands.", name()); - } - } - ); - } - - public String name() { - return this.name; - } } ``` @@ -91,9 +91,9 @@ For example, the Orc class: ```java public class Orc extends ActiveCreature { - public Orc(String name) { - super(name); - } + public Orc(String name) { + super(name); + } } ``` @@ -103,25 +103,25 @@ thread of control: ```java public static void main(String[]args){ - var app=new App(); - app.run(); - } + var app=new App(); + app.run(); + } @Override public void run(){ - ActiveCreature creature; - try{ - for(int i=0;i Consider that you have some pictures on your memory card and you need to transfer them to your computer. To transfer -> them, you need some kind of adapter that is compatible with your computer ports so that you can attach a memory card to -> your computer. In this case card reader is an adapter. -> Another example would be the famous power adapter; a three-legged plug can't be connected to a two-pronged outlet, it -> needs to use a power adapter that makes it compatible with the two-pronged outlets. -> Yet another example would be a translator translating words spoken by one person to another +> them, you need some kind of adapter that is compatible with your computer ports so that you can attach a memory card +> to your computer. In this case card reader is an adapter. Another example would be the famous power adapter; a +> three-legged plug can't be connected to a two-pronged outlet, it needs to use a power adapter that makes it compatible +> with the two-pronged outlets. Yet another example would be a translator translating words spoken by one person to +> another In plain words @@ -46,14 +46,14 @@ First, we have interfaces `RowingBoat` and `FishingBoat` ```java public interface RowingBoat { - void row(); + void row(); } @Slf4j public class FishingBoat { - public void sail() { - LOGGER.info("The fishing boat is sailing"); - } + public void sail() { + LOGGER.info("The fishing boat is sailing"); + } } ``` @@ -62,16 +62,16 @@ And captain expects an implementation of `RowingBoat` interface to be able to mo ```java public class Captain { - private final RowingBoat rowingBoat; + private final RowingBoat rowingBoat; - // default constructor and setter for rowingBoat - public Captain(RowingBoat rowingBoat) { - this.rowingBoat = rowingBoat; - } + // default constructor and setter for rowingBoat + public Captain(RowingBoat rowingBoat) { + this.rowingBoat = rowingBoat; + } - public void row() { - rowingBoat.row(); - } + public void row() { + rowingBoat.row(); + } } ``` @@ -83,16 +83,16 @@ to create an adapter that allows the captain to operate the fishing boat with hi @Slf4j public class FishingBoatAdapter implements RowingBoat { - private final FishingBoat boat; + private final FishingBoat boat; - public FishingBoatAdapter() { - boat = new FishingBoat(); - } + public FishingBoatAdapter() { + boat = new FishingBoat(); + } - @Override - public void row() { - boat.sail(); - } + @Override + public void row() { + boat.sail(); + } } ``` @@ -100,7 +100,7 @@ And now the `Captain` can use the `FishingBoat` to escape the pirates. ```java var captain=new Captain(new FishingBoatAdapter()); - captain.row(); + captain.row(); ``` ## Class diagram diff --git a/aggregator-microservices/README.md b/aggregator-microservices/README.md index 2673862f24d9..a32005cefea9 100644 --- a/aggregator-microservices/README.md +++ b/aggregator-microservices/README.md @@ -3,10 +3,10 @@ title: Aggregator Microservices category: Architectural language: en tag: - - API design - - Cloud distributed - - Decoupling - - Microservices + - API design + - Cloud distributed + - Decoupling + - Microservices --- ## Intent @@ -37,9 +37,9 @@ Let's start from the data model. Here's our `Product`. ```java public class Product { - private String title; - private int productInventories; - // Getters and setters omitted for brevity -> + private String title; + private int productInventories; + // Getters and setters omitted for brevity -> ... } ``` @@ -52,27 +52,27 @@ Next we can introduce our `Aggregator` microservice. It contains clients `Produc @RestController public class Aggregator { - @Resource - private ProductInformationClient informationClient; + @Resource + private ProductInformationClient informationClient; - @Resource - private ProductInventoryClient inventoryClient; + @Resource + private ProductInventoryClient inventoryClient; - @RequestMapping(path = "/product", method = RequestMethod.GET) - public Product getProduct() { + @RequestMapping(path = "/product", method = RequestMethod.GET) + public Product getProduct() { - var product = new Product(); - var productTitle = informationClient.getProductTitle(); - var productInventory = inventoryClient.getProductInventories(); + var product = new Product(); + var productTitle = informationClient.getProductTitle(); + var productInventory = inventoryClient.getProductInventories(); - //Fallback to error message - product.setTitle(requireNonNullElse(productTitle, "Error: Fetching Product Title Failed")); + //Fallback to error message + product.setTitle(requireNonNullElse(productTitle, "Error: Fetching Product Title Failed")); - //Fallback to default error inventory - product.setProductInventories(requireNonNullElse(productInventory, -1)); + //Fallback to default error inventory + product.setProductInventories(requireNonNullElse(productInventory, -1)); - return product; - } + return product; + } } ``` @@ -83,10 +83,10 @@ inventory counts. @RestController public class InformationController { - @RequestMapping(value = "/information", method = RequestMethod.GET) - public String getProductTitle() { - return "The Product Title."; - } + @RequestMapping(value = "/information", method = RequestMethod.GET) + public String getProductTitle() { + return "The Product Title."; + } } ``` diff --git a/ambassador/README.md b/ambassador/README.md index 5bd535f07da4..172285dcd135 100644 --- a/ambassador/README.md +++ b/ambassador/README.md @@ -3,8 +3,8 @@ title: Ambassador category: Structural language: en tag: - - Decoupling - - Cloud distributed + - Decoupling + - Cloud distributed --- ## Intent @@ -43,7 +43,7 @@ by the remote service as well as the ambassador service: ```java interface RemoteServiceInterface { - long doRemoteFunction(int value) throws Exception; + long doRemoteFunction(int value) throws Exception; } ``` @@ -53,30 +53,30 @@ A remote services represented as a singleton. @Slf4j public class RemoteService implements RemoteServiceInterface { - private static RemoteService service = null; + private static RemoteService service = null; - static synchronized RemoteService getRemoteService() { - if (service == null) { - service = new RemoteService(); + static synchronized RemoteService getRemoteService() { + if (service == null) { + service = new RemoteService(); + } + return service; } - return service; - } - private RemoteService() { - } + private RemoteService() { + } - @Override - public long doRemoteFunction(int value) { - long waitTime = (long) Math.floor(Math.random() * 1000); + @Override + public long doRemoteFunction(int value) { + long waitTime = (long) Math.floor(Math.random() * 1000); - try { - sleep(waitTime); - } catch (InterruptedException e) { - LOGGER.error("Thread sleep interrupted", e); - } + try { + sleep(waitTime); + } catch (InterruptedException e) { + LOGGER.error("Thread sleep interrupted", e); + } - return waitTime >= 200 ? value * 10 : -1; - } + return waitTime >= 200 ? value * 10 : -1; + } } ``` @@ -86,49 +86,49 @@ A service ambassador adding additional features such as logging, latency checks @Slf4j public class ServiceAmbassador implements RemoteServiceInterface { - private static final int RETRIES = 3; - private static final int DELAY_MS = 3000; - - ServiceAmbassador() { - } - - @Override - public long doRemoteFunction(int value) { - return safeCall(value); - } - - private long checkLatency(int value) { - var startTime = System.currentTimeMillis(); - var result = RemoteService.getRemoteService().doRemoteFunction(value); - var timeTaken = System.currentTimeMillis() - startTime; - - LOGGER.info("Time taken (ms): " + timeTaken); - return result; - } - - private long safeCall(int value) { - var retries = 0; - var result = (long) FAILURE; - - for (int i = 0; i < RETRIES; i++) { - if (retries >= RETRIES) { - return FAILURE; - } - - if ((result = checkLatency(value)) == FAILURE) { - LOGGER.info("Failed to reach remote: (" + (i + 1) + ")"); - retries++; - try { - sleep(DELAY_MS); - } catch (InterruptedException e) { - LOGGER.error("Thread sleep state interrupted", e); + private static final int RETRIES = 3; + private static final int DELAY_MS = 3000; + + ServiceAmbassador() { + } + + @Override + public long doRemoteFunction(int value) { + return safeCall(value); + } + + private long checkLatency(int value) { + var startTime = System.currentTimeMillis(); + var result = RemoteService.getRemoteService().doRemoteFunction(value); + var timeTaken = System.currentTimeMillis() - startTime; + + LOGGER.info("Time taken (ms): " + timeTaken); + return result; + } + + private long safeCall(int value) { + var retries = 0; + var result = (long) FAILURE; + + for (int i = 0; i < RETRIES; i++) { + if (retries >= RETRIES) { + return FAILURE; + } + + if ((result = checkLatency(value)) == FAILURE) { + LOGGER.info("Failed to reach remote: (" + (i + 1) + ")"); + retries++; + try { + sleep(DELAY_MS); + } catch (InterruptedException e) { + LOGGER.error("Thread sleep state interrupted", e); + } + } else { + break; + } } - } else { - break; - } + return result; } - return result; - } } ``` @@ -138,13 +138,13 @@ A client has a local service ambassador used to interact with the remote service @Slf4j public class Client { - private final ServiceAmbassador serviceAmbassador = new ServiceAmbassador(); + private final ServiceAmbassador serviceAmbassador = new ServiceAmbassador(); - long useService(int value) { - var result = serviceAmbassador.doRemoteFunction(value); - LOGGER.info("Service result: " + result); - return result; - } + long useService(int value) { + var result = serviceAmbassador.doRemoteFunction(value); + LOGGER.info("Service result: " + result); + return result; + } } ``` @@ -152,12 +152,12 @@ Here are two clients using the service. ```java public class App { - public static void main(String[] args) { - var host1 = new Client(); - var host2 = new Client(); - host1.useService(12); - host2.useService(73); - } + public static void main(String[] args) { + var host1 = new Client(); + var host2 = new Client(); + host1.useService(12); + host2.useService(73); + } } ``` @@ -165,14 +165,14 @@ Here's the output for running the example: ```java Time taken(ms):111 - Service result:120 - Time taken(ms):931 - Failed to reach remote:(1) - Time taken(ms):665 - Failed to reach remote:(2) - Time taken(ms):538 - Failed to reach remote:(3) - Service result:-1 + Service result:120 + Time taken(ms):931 + Failed to reach remote:(1) + Time taken(ms):665 + Failed to reach remote:(2) + Time taken(ms):538 + Failed to reach remote:(3) + Service result:-1 ``` ## Class diagram diff --git a/anti-corruption-layer/README.md b/anti-corruption-layer/README.md index 015dd0c45f8e..3d44d7133c8e 100644 --- a/anti-corruption-layer/README.md +++ b/anti-corruption-layer/README.md @@ -3,9 +3,9 @@ title: Anti-corruption layer category: Integration language: en tag: - - Architecture - - Decoupling - - Isolation + - Architecture + - Decoupling + - Isolation --- ## Also known as @@ -67,11 +67,11 @@ systems. ```java public class LegacyOrder { - private String id; - private String customer; - private String item; - private String qty; - private String price; + private String id; + private String customer; + private String item; + private String qty; + private String price; } ``` @@ -79,22 +79,22 @@ public class LegacyOrder { ```java public class ModernOrder { - private String id; - private Customer customer; + private String id; + private Customer customer; - private Shipment shipment; + private Shipment shipment; - private String extra; + private String extra; } public class Customer { - private String address; + private String address; } public class Shipment { - private String item; - private String qty; - private String price; + private String item; + private String qty; + private String price; } ``` @@ -103,19 +103,19 @@ public class Shipment { ```java public class AntiCorruptionLayer { - @Autowired - private ModernShop modernShop; + @Autowired + private ModernShop modernShop; - @Autowired - private LegacyShop legacyShop; + @Autowired + private LegacyShop legacyShop; - public Optional findOrderInModernSystem(String id) { - return modernShop.findOrder(id).map(o -> /* map to legacyOrder*/); - } + public Optional findOrderInModernSystem(String id) { + return modernShop.findOrder(id).map(o -> /* map to legacyOrder*/); + } - public Optional findOrderInLegacySystem(String id) { - return legacyShop.findOrder(id).map(o -> /* map to modernOrder*/); - } + public Optional findOrderInLegacySystem(String id) { + return legacyShop.findOrder(id).map(o -> /* map to modernOrder*/); + } } ``` @@ -128,21 +128,21 @@ from the `Modern` system. ```java public class LegacyShop { - @Autowired - private AntiCorruptionLayer acl; + @Autowired + private AntiCorruptionLayer acl; - public void placeOrder(LegacyOrder legacyOrder) throws ShopException { + public void placeOrder(LegacyOrder legacyOrder) throws ShopException { - String id = legacyOrder.getId(); + String id = legacyOrder.getId(); - Optional orderInModernSystem = acl.findOrderInModernSystem(id); + Optional orderInModernSystem = acl.findOrderInModernSystem(id); - if (orderInModernSystem.isPresent()) { - // order is already in the modern system - } else { - // place order in the current system + if (orderInModernSystem.isPresent()) { + // order is already in the modern system + } else { + // place order in the current system + } } - } } ``` diff --git a/api-gateway/README.md b/api-gateway/README.md index 9c60d54f66a0..edc4ca98c3b8 100644 --- a/api-gateway/README.md +++ b/api-gateway/README.md @@ -3,10 +3,10 @@ title: API Gateway category: Architectural language: en tag: - - API design - - Cloud distributed - - Decoupling - - Microservices + - API design + - Cloud distributed + - Decoupling + - Microservices --- ## Intent @@ -68,27 +68,27 @@ Here's the Image microservice implementation. ```java public interface ImageClient { - String getImagePath(); + String getImagePath(); } public class ImageClientImpl implements ImageClient { - @Override - public String getImagePath() { - var httpClient = HttpClient.newHttpClient(); - var httpGet = HttpRequest.newBuilder() - .GET() - .uri(URI.create("http://localhost:50005/image-path")) - .build(); - - try { - var httpResponse = httpClient.send(httpGet, BodyHandlers.ofString()); - return httpResponse.body(); - } catch (IOException | InterruptedException e) { - e.printStackTrace(); + @Override + public String getImagePath() { + var httpClient = HttpClient.newHttpClient(); + var httpGet = HttpRequest.newBuilder() + .GET() + .uri(URI.create("http://localhost:50005/image-path")) + .build(); + + try { + var httpResponse = httpClient.send(httpGet, BodyHandlers.ofString()); + return httpResponse.body(); + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + } + + return null; } - - return null; - } } ``` @@ -96,28 +96,28 @@ Here's the Price microservice implementation. ```java public interface PriceClient { - String getPrice(); + String getPrice(); } public class PriceClientImpl implements PriceClient { - @Override - public String getPrice() { - var httpClient = HttpClient.newHttpClient(); - var httpGet = HttpRequest.newBuilder() - .GET() - .uri(URI.create("http://localhost:50006/price")) - .build(); - - try { - var httpResponse = httpClient.send(httpGet, BodyHandlers.ofString()); - return httpResponse.body(); - } catch (IOException | InterruptedException e) { - e.printStackTrace(); + @Override + public String getPrice() { + var httpClient = HttpClient.newHttpClient(); + var httpGet = HttpRequest.newBuilder() + .GET() + .uri(URI.create("http://localhost:50006/price")) + .build(); + + try { + var httpResponse = httpClient.send(httpGet, BodyHandlers.ofString()); + return httpResponse.body(); + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + } + + return null; } - - return null; - } } ``` @@ -126,26 +126,26 @@ Here we can see how API Gateway maps the requests to the microservices. ```java public class ApiGateway { - @Resource - private ImageClient imageClient; - - @Resource - private PriceClient priceClient; - - @RequestMapping(path = "/desktop", method = RequestMethod.GET) - public DesktopProduct getProductDesktop() { - var desktopProduct = new DesktopProduct(); - desktopProduct.setImagePath(imageClient.getImagePath()); - desktopProduct.setPrice(priceClient.getPrice()); - return desktopProduct; - } - - @RequestMapping(path = "/mobile", method = RequestMethod.GET) - public MobileProduct getProductMobile() { - var mobileProduct = new MobileProduct(); - mobileProduct.setPrice(priceClient.getPrice()); - return mobileProduct; - } + @Resource + private ImageClient imageClient; + + @Resource + private PriceClient priceClient; + + @RequestMapping(path = "/desktop", method = RequestMethod.GET) + public DesktopProduct getProductDesktop() { + var desktopProduct = new DesktopProduct(); + desktopProduct.setImagePath(imageClient.getImagePath()); + desktopProduct.setPrice(priceClient.getPrice()); + return desktopProduct; + } + + @RequestMapping(path = "/mobile", method = RequestMethod.GET) + public MobileProduct getProductMobile() { + var mobileProduct = new MobileProduct(); + mobileProduct.setPrice(priceClient.getPrice()); + return mobileProduct; + } } ``` diff --git a/arrange-act-assert/README.md b/arrange-act-assert/README.md index ee2e72921b34..cc0c308ac27f 100644 --- a/arrange-act-assert/README.md +++ b/arrange-act-assert/README.md @@ -3,8 +3,8 @@ title: Arrange/Act/Assert category: Testing language: en tag: - - Idiom - - Testing + - Idiom + - Testing --- ## Also known as @@ -51,28 +51,28 @@ Let's first introduce our `Cash` class to be unit tested. ```java public class Cash { - private int amount; + private int amount; - Cash(int amount) { - this.amount = amount; - } + Cash(int amount) { + this.amount = amount; + } - void plus(int addend) { - amount += addend; - } + void plus(int addend) { + amount += addend; + } - boolean minus(int subtrahend) { - if (amount >= subtrahend) { - amount -= subtrahend; - return true; - } else { - return false; + boolean minus(int subtrahend) { + if (amount >= subtrahend) { + amount -= subtrahend; + return true; + } else { + return false; + } } - } - int count() { - return amount; - } + int count() { + return amount; + } } ``` @@ -82,49 +82,49 @@ separated steps for each unit test. ```java class CashAAATest { - @Test - void testPlus() { - //Arrange - var cash = new Cash(3); - //Act - cash.plus(4); - //Assert - assertEquals(7, cash.count()); - } - - @Test - void testMinus() { - //Arrange - var cash = new Cash(8); - //Act - var result = cash.minus(5); - //Assert - assertTrue(result); - assertEquals(3, cash.count()); - } - - @Test - void testInsufficientMinus() { - //Arrange - var cash = new Cash(1); - //Act - var result = cash.minus(6); - //Assert - assertFalse(result); - assertEquals(1, cash.count()); - } - - @Test - void testUpdate() { - //Arrange - var cash = new Cash(5); - //Act - cash.plus(6); - var result = cash.minus(3); - //Assert - assertTrue(result); - assertEquals(8, cash.count()); - } + @Test + void testPlus() { + //Arrange + var cash = new Cash(3); + //Act + cash.plus(4); + //Assert + assertEquals(7, cash.count()); + } + + @Test + void testMinus() { + //Arrange + var cash = new Cash(8); + //Act + var result = cash.minus(5); + //Assert + assertTrue(result); + assertEquals(3, cash.count()); + } + + @Test + void testInsufficientMinus() { + //Arrange + var cash = new Cash(1); + //Act + var result = cash.minus(6); + //Assert + assertFalse(result); + assertEquals(1, cash.count()); + } + + @Test + void testUpdate() { + //Arrange + var cash = new Cash(5); + //Act + cash.plus(6); + var result = cash.minus(3); + //Assert + assertTrue(result); + assertEquals(8, cash.count()); + } } ``` diff --git a/async-method-invocation/README.md b/async-method-invocation/README.md index 60f4c7110eb9..deb573c7bd37 100644 --- a/async-method-invocation/README.md +++ b/async-method-invocation/README.md @@ -3,9 +3,9 @@ title: Async Method Invocation category: Concurrency language: en tag: - - Asynchronous - - Reactive - - Scalability + - Asynchronous + - Reactive + - Scalability --- ## Intent @@ -48,29 +48,29 @@ manages the execution of the async tasks. ```java public interface AsyncResult { - boolean isCompleted(); + boolean isCompleted(); - T getValue() throws ExecutionException; + T getValue() throws ExecutionException; - void await() throws InterruptedException; + void await() throws InterruptedException; } ``` ```java public interface AsyncCallback { - void onComplete(T value); + void onComplete(T value); - void onError(Exception ex); + void onError(Exception ex); } ``` ```java public interface AsyncExecutor { - AsyncResult startProcess(Callable task); + AsyncResult startProcess(Callable task); - AsyncResult startProcess(Callable task, AsyncCallback callback); + AsyncResult startProcess(Callable task, AsyncCallback callback); - T endProcess(AsyncResult asyncResult) throws ExecutionException, InterruptedException; + T endProcess(AsyncResult asyncResult) throws ExecutionException, InterruptedException; } ``` @@ -80,35 +80,35 @@ next. ```java public class ThreadAsyncExecutor implements AsyncExecutor { - @Override - public AsyncResult startProcess(Callable task) { - return startProcess(task, null); - } - - @Override - public AsyncResult startProcess(Callable task, AsyncCallback callback) { - var result = new CompletableResult<>(callback); - new Thread( - () -> { - try { - result.setValue(task.call()); - } catch (Exception ex) { - result.setException(ex); - } - }, - "executor-" + idx.incrementAndGet()) - .start(); - return result; - } - - @Override - public T endProcess(AsyncResult asyncResult) - throws ExecutionException, InterruptedException { - if (!asyncResult.isCompleted()) { - asyncResult.await(); + @Override + public AsyncResult startProcess(Callable task) { + return startProcess(task, null); + } + + @Override + public AsyncResult startProcess(Callable task, AsyncCallback callback) { + var result = new CompletableResult<>(callback); + new Thread( + () -> { + try { + result.setValue(task.call()); + } catch (Exception ex) { + result.setException(ex); + } + }, + "executor-" + idx.incrementAndGet()) + .start(); + return result; + } + + @Override + public T endProcess(AsyncResult asyncResult) + throws ExecutionException, InterruptedException { + if (!asyncResult.isCompleted()) { + asyncResult.await(); + } + return asyncResult.getValue(); } - return asyncResult.getValue(); - } } ``` @@ -116,8 +116,8 @@ Then we are ready to launch some rockets to see how everything works together. ```java public static void main(String[]args)throws Exception{ - // construct a new executor that will run async tasks - var executor=new ThreadAsyncExecutor(); + // construct a new executor that will run async tasks + var executor=new ThreadAsyncExecutor(); // start few async tasks with varying processing times, two last with callback handlers final var asyncResult1=executor.startProcess(lazyval(10,500)); @@ -125,40 +125,40 @@ final var asyncResult2=executor.startProcess(lazyval("test",300)); final var asyncResult3=executor.startProcess(lazyval(50L,700)); final var asyncResult4=executor.startProcess(lazyval(20,400),callback("Deploying lunar rover")); final var asyncResult5= - executor.startProcess(lazyval("callback",600),callback("Deploying lunar rover")); + executor.startProcess(lazyval("callback",600),callback("Deploying lunar rover")); - // emulate processing in the current thread while async tasks are running in their own threads - Thread.sleep(350); // Oh boy, we are working hard here - log("Mission command is sipping coffee"); + // emulate processing in the current thread while async tasks are running in their own threads + Thread.sleep(350); // Oh boy, we are working hard here + log("Mission command is sipping coffee"); // wait for completion of the tasks final var result1=executor.endProcess(asyncResult1); final var result2=executor.endProcess(asyncResult2); final var result3=executor.endProcess(asyncResult3); - asyncResult4.await(); - asyncResult5.await(); - - // log the results of the tasks, callbacks log immediately when complete - log("Space rocket <"+result1+"> launch complete"); - log("Space rocket <"+result2+"> launch complete"); - log("Space rocket <"+result3+"> launch complete"); - } + asyncResult4.await(); + asyncResult5.await(); + + // log the results of the tasks, callbacks log immediately when complete + log("Space rocket <"+result1+"> launch complete"); + log("Space rocket <"+result2+"> launch complete"); + log("Space rocket <"+result3+"> launch complete"); + } ``` Here's the program console output. ```java 21:47:08.227[executor-2]INFO com.iluwatar.async.method.invocation.App-Space rocket launched successfully - 21:47:08.269[main]INFO com.iluwatar.async.method.invocation.App-Mission command is sipping coffee - 21:47:08.318[executor-4]INFO com.iluwatar.async.method.invocation.App-Space rocket<20>launched successfully - 21:47:08.335[executor-4]INFO com.iluwatar.async.method.invocation.App-Deploying lunar rover<20> - 21:47:08.414[executor-1]INFO com.iluwatar.async.method.invocation.App-Space rocket<10>launched successfully - 21:47:08.519[executor-5]INFO com.iluwatar.async.method.invocation.App-Space rocket launched successfully - 21:47:08.519[executor-5]INFO com.iluwatar.async.method.invocation.App-Deploying lunar rover + 21:47:08.269[main]INFO com.iluwatar.async.method.invocation.App-Mission command is sipping coffee + 21:47:08.318[executor-4]INFO com.iluwatar.async.method.invocation.App-Space rocket<20>launched successfully + 21:47:08.335[executor-4]INFO com.iluwatar.async.method.invocation.App-Deploying lunar rover<20> + 21:47:08.414[executor-1]INFO com.iluwatar.async.method.invocation.App-Space rocket<10>launched successfully + 21:47:08.519[executor-5]INFO com.iluwatar.async.method.invocation.App-Space rocket launched successfully + 21:47:08.519[executor-5]INFO com.iluwatar.async.method.invocation.App-Deploying lunar rover 21:47:08.616[executor-3]INFO com.iluwatar.async.method.invocation.App-Space rocket<50>launched successfully - 21:47:08.617[main]INFO com.iluwatar.async.method.invocation.App-Space rocket<10>launch complete - 21:47:08.617[main]INFO com.iluwatar.async.method.invocation.App-Space rocket launch complete - 21:47:08.618[main]INFO com.iluwatar.async.method.invocation.App-Space rocket<50>launch complete + 21:47:08.617[main]INFO com.iluwatar.async.method.invocation.App-Space rocket<10>launch complete + 21:47:08.617[main]INFO com.iluwatar.async.method.invocation.App-Space rocket launch complete + 21:47:08.618[main]INFO com.iluwatar.async.method.invocation.App-Space rocket<50>launch complete ``` # Class diagram diff --git a/balking/README.md b/balking/README.md index 0fa525396978..f40c45d7d4b9 100644 --- a/balking/README.md +++ b/balking/README.md @@ -3,7 +3,7 @@ title: Balking category: Concurrency language: en tag: - - Decoupling + - Decoupling --- ## Intent @@ -44,36 +44,36 @@ Here are the relevant parts of the `WashingMachine` class. @Slf4j public class WashingMachine { - private final DelayProvider delayProvider; - private WashingMachineState washingMachineState; - - public WashingMachine(DelayProvider delayProvider) { - this.delayProvider = delayProvider; - this.washingMachineState = WashingMachineState.ENABLED; - } - - public WashingMachineState getWashingMachineState() { - return washingMachineState; - } - - public void wash() { - synchronized (this) { - var machineState = getWashingMachineState(); - LOGGER.info("{}: Actual machine state: {}", Thread.currentThread().getName(), machineState); - if (this.washingMachineState == WashingMachineState.WASHING) { - LOGGER.error("Cannot wash if the machine has been already washing!"); - return; - } - this.washingMachineState = WashingMachineState.WASHING; + private final DelayProvider delayProvider; + private WashingMachineState washingMachineState; + + public WashingMachine(DelayProvider delayProvider) { + this.delayProvider = delayProvider; + this.washingMachineState = WashingMachineState.ENABLED; + } + + public WashingMachineState getWashingMachineState() { + return washingMachineState; + } + + public void wash() { + synchronized (this) { + var machineState = getWashingMachineState(); + LOGGER.info("{}: Actual machine state: {}", Thread.currentThread().getName(), machineState); + if (this.washingMachineState == WashingMachineState.WASHING) { + LOGGER.error("Cannot wash if the machine has been already washing!"); + return; + } + this.washingMachineState = WashingMachineState.WASHING; + } + LOGGER.info("{}: Doing the washing", Thread.currentThread().getName()); + this.delayProvider.executeAfterDelay(50, TimeUnit.MILLISECONDS, this::endOfWashing); + } + + public synchronized void endOfWashing() { + washingMachineState = WashingMachineState.ENABLED; + LOGGER.info("{}: Washing completed.", Thread.currentThread().getId()); } - LOGGER.info("{}: Doing the washing", Thread.currentThread().getName()); - this.delayProvider.executeAfterDelay(50, TimeUnit.MILLISECONDS, this::endOfWashing); - } - - public synchronized void endOfWashing() { - washingMachineState = WashingMachineState.ENABLED; - LOGGER.info("{}: Washing completed.", Thread.currentThread().getId()); - } } ``` @@ -81,7 +81,7 @@ Here's the simple `DelayProvider` interface used by the `WashingMachine`. ```java public interface DelayProvider { - void executeAfterDelay(long interval, TimeUnit timeUnit, Runnable task); + void executeAfterDelay(long interval, TimeUnit timeUnit, Runnable task); } ``` @@ -90,18 +90,18 @@ Now we introduce the application using the `WashingMachine`. ```java public static void main(String...args){ final var washingMachine=new WashingMachine(); - var executorService=Executors.newFixedThreadPool(3); - for(int i=0;i< 3;i++){ - executorService.execute(washingMachine::wash); - } - executorService.shutdown(); - try{ - executorService.awaitTermination(10,TimeUnit.SECONDS); - }catch(InterruptedException ie){ - LOGGER.error("ERROR: Waiting on executor service shutdown!"); - Thread.currentThread().interrupt(); - } - } + var executorService=Executors.newFixedThreadPool(3); + for(int i=0;i< 3;i++){ + executorService.execute(washingMachine::wash); + } + executorService.shutdown(); + try{ + executorService.awaitTermination(10,TimeUnit.SECONDS); + }catch(InterruptedException ie){ + LOGGER.error("ERROR: Waiting on executor service shutdown!"); + Thread.currentThread().interrupt(); + } + } ``` Here is the console output of the program. diff --git a/bridge/README.md b/bridge/README.md index 894688765b5b..a5fac3a3792a 100644 --- a/bridge/README.md +++ b/bridge/README.md @@ -3,9 +3,9 @@ title: Bridge category: Structural language: en tag: - - Decoupling - - Extensibility - - Gang of Four + - Decoupling + - Extensibility + - Gang of Four --- ## Also known as @@ -21,8 +21,8 @@ Decouple an abstraction from its implementation so that the two can vary indepen Real-world example > Consider you have a weapon with different enchantments, and you are supposed to allow mixing different weapons with -> different enchantments. What would you do? Create multiple copies of each of the weapons for each of the enchantments or -> would you just create separate enchantment and set it for the weapon as needed? Bridge pattern allows you to do the +> different enchantments. What would you do? Create multiple copies of each of the weapons for each of the enchantments +> or would you just create separate enchantment and set it for the weapon as needed? Bridge pattern allows you to do the > second. In Plain Words @@ -41,77 +41,77 @@ Translating our weapon example from above. Here we have the `Weapon` hierarchy: ```java public interface Weapon { - void wield(); + void wield(); - void swing(); + void swing(); - void unwield(); + void unwield(); - Enchantment getEnchantment(); + Enchantment getEnchantment(); } public class Sword implements Weapon { - private final Enchantment enchantment; - - public Sword(Enchantment enchantment) { - this.enchantment = enchantment; - } - - @Override - public void wield() { - LOGGER.info("The sword is wielded."); - enchantment.onActivate(); - } - - @Override - public void swing() { - LOGGER.info("The sword is swung."); - enchantment.apply(); - } - - @Override - public void unwield() { - LOGGER.info("The sword is unwielded."); - enchantment.onDeactivate(); - } - - @Override - public Enchantment getEnchantment() { - return enchantment; - } + private final Enchantment enchantment; + + public Sword(Enchantment enchantment) { + this.enchantment = enchantment; + } + + @Override + public void wield() { + LOGGER.info("The sword is wielded."); + enchantment.onActivate(); + } + + @Override + public void swing() { + LOGGER.info("The sword is swung."); + enchantment.apply(); + } + + @Override + public void unwield() { + LOGGER.info("The sword is unwielded."); + enchantment.onDeactivate(); + } + + @Override + public Enchantment getEnchantment() { + return enchantment; + } } public class Hammer implements Weapon { - private final Enchantment enchantment; - - public Hammer(Enchantment enchantment) { - this.enchantment = enchantment; - } - - @Override - public void wield() { - LOGGER.info("The hammer is wielded."); - enchantment.onActivate(); - } - - @Override - public void swing() { - LOGGER.info("The hammer is swung."); - enchantment.apply(); - } - - @Override - public void unwield() { - LOGGER.info("The hammer is unwielded."); - enchantment.onDeactivate(); - } - - @Override - public Enchantment getEnchantment() { - return enchantment; - } + private final Enchantment enchantment; + + public Hammer(Enchantment enchantment) { + this.enchantment = enchantment; + } + + @Override + public void wield() { + LOGGER.info("The hammer is wielded."); + enchantment.onActivate(); + } + + @Override + public void swing() { + LOGGER.info("The hammer is swung."); + enchantment.apply(); + } + + @Override + public void unwield() { + LOGGER.info("The hammer is unwielded."); + enchantment.onDeactivate(); + } + + @Override + public Enchantment getEnchantment() { + return enchantment; + } } ``` @@ -119,47 +119,47 @@ Here's the separate enchantment hierarchy: ```java public interface Enchantment { - void onActivate(); + void onActivate(); - void apply(); + void apply(); - void onDeactivate(); + void onDeactivate(); } public class FlyingEnchantment implements Enchantment { - @Override - public void onActivate() { - LOGGER.info("The item begins to glow faintly."); - } + @Override + public void onActivate() { + LOGGER.info("The item begins to glow faintly."); + } - @Override - public void apply() { - LOGGER.info("The item flies and strikes the enemies finally returning to owner's hand."); - } + @Override + public void apply() { + LOGGER.info("The item flies and strikes the enemies finally returning to owner's hand."); + } - @Override - public void onDeactivate() { - LOGGER.info("The item's glow fades."); - } + @Override + public void onDeactivate() { + LOGGER.info("The item's glow fades."); + } } public class SoulEatingEnchantment implements Enchantment { - @Override - public void onActivate() { - LOGGER.info("The item spreads bloodlust."); - } + @Override + public void onActivate() { + LOGGER.info("The item spreads bloodlust."); + } - @Override - public void apply() { - LOGGER.info("The item eats the soul of enemies."); - } + @Override + public void apply() { + LOGGER.info("The item eats the soul of enemies."); + } - @Override - public void onDeactivate() { - LOGGER.info("Bloodlust slowly disappears."); - } + @Override + public void onDeactivate() { + LOGGER.info("Bloodlust slowly disappears."); + } } ``` @@ -167,16 +167,16 @@ Here are both hierarchies in action: ```java LOGGER.info("The knight receives an enchanted sword."); - var enchantedSword=new Sword(new SoulEatingEnchantment()); - enchantedSword.wield(); - enchantedSword.swing(); - enchantedSword.unwield(); - - LOGGER.info("The valkyrie receives an enchanted hammer."); - var hammer=new Hammer(new FlyingEnchantment()); - hammer.wield(); - hammer.swing(); - hammer.unwield(); + var enchantedSword=new Sword(new SoulEatingEnchantment()); + enchantedSword.wield(); + enchantedSword.swing(); + enchantedSword.unwield(); + + LOGGER.info("The valkyrie receives an enchanted hammer."); + var hammer=new Hammer(new FlyingEnchantment()); + hammer.wield(); + hammer.swing(); + hammer.unwield(); ``` Here's the console output. diff --git a/builder/README.md b/builder/README.md index c9f63f47125b..b42b0ede7f65 100644 --- a/builder/README.md +++ b/builder/README.md @@ -3,7 +3,7 @@ title: Builder category: Creational language: en tag: - - Gang of Four + - Gang of Four --- ## Intent @@ -34,7 +34,7 @@ all seen a constructor like below: ```java public Hero(Profession profession,String name,HairType hairType,HairColor hairColor,Armor armor,Weapon weapon){ - } + } ``` As you can see the number of constructor parameters can quickly get out of hand, and it may become difficult to @@ -47,21 +47,21 @@ The sane alternative is to use the Builder pattern. First of all, we have our he ```java public final class Hero { - private final Profession profession; - private final String name; - private final HairType hairType; - private final HairColor hairColor; - private final Armor armor; - private final Weapon weapon; - - private Hero(Builder builder) { - this.profession = builder.profession; - this.name = builder.name; - this.hairColor = builder.hairColor; - this.hairType = builder.hairType; - this.weapon = builder.weapon; - this.armor = builder.armor; - } + private final Profession profession; + private final String name; + private final HairType hairType; + private final HairColor hairColor; + private final Armor armor; + private final Weapon weapon; + + private Hero(Builder builder) { + this.profession = builder.profession; + this.name = builder.name; + this.hairColor = builder.hairColor; + this.hairType = builder.hairType; + this.weapon = builder.weapon; + this.armor = builder.armor; + } } ``` @@ -69,44 +69,44 @@ Then we have the builder: ```java public static class Builder { - private final Profession profession; - private final String name; - private HairType hairType; - private HairColor hairColor; - private Armor armor; - private Weapon weapon; - - public Builder(Profession profession, String name) { - if (profession == null || name == null) { - throw new IllegalArgumentException("profession and name can not be null"); + private final Profession profession; + private final String name; + private HairType hairType; + private HairColor hairColor; + private Armor armor; + private Weapon weapon; + + public Builder(Profession profession, String name) { + if (profession == null || name == null) { + throw new IllegalArgumentException("profession and name can not be null"); + } + this.profession = profession; + this.name = name; + } + + public Builder withHairType(HairType hairType) { + this.hairType = hairType; + return this; + } + + public Builder withHairColor(HairColor hairColor) { + this.hairColor = hairColor; + return this; + } + + public Builder withArmor(Armor armor) { + this.armor = armor; + return this; + } + + public Builder withWeapon(Weapon weapon) { + this.weapon = weapon; + return this; + } + + public Hero build() { + return new Hero(this); } - this.profession = profession; - this.name = name; - } - - public Builder withHairType(HairType hairType) { - this.hairType = hairType; - return this; - } - - public Builder withHairColor(HairColor hairColor) { - this.hairColor = hairColor; - return this; - } - - public Builder withArmor(Armor armor) { - this.armor = armor; - return this; - } - - public Builder withWeapon(Weapon weapon) { - this.weapon = weapon; - return this; - } - - public Hero build() { - return new Hero(this); - } } ``` diff --git a/business-delegate/README.md b/business-delegate/README.md index e35546dcbeb5..086175d7f329 100644 --- a/business-delegate/README.md +++ b/business-delegate/README.md @@ -3,7 +3,7 @@ title: Business Delegate category: Structural language: en tag: - - Decoupling + - Decoupling --- ## Intent @@ -41,23 +41,23 @@ First, we have an abstraction for video streaming services and a couple of imple ```java public interface VideoStreamingService { - void doProcessing(); + void doProcessing(); } @Slf4j public class NetflixService implements VideoStreamingService { - @Override - public void doProcessing() { - LOGGER.info("NetflixService is now processing"); - } + @Override + public void doProcessing() { + LOGGER.info("NetflixService is now processing"); + } } @Slf4j public class YouTubeService implements VideoStreamingService { - @Override - public void doProcessing() { - LOGGER.info("YouTubeService is now processing"); - } + @Override + public void doProcessing() { + LOGGER.info("YouTubeService is now processing"); + } } ``` @@ -68,16 +68,16 @@ Then, we have a lookup service that decides which video streaming service to use @Setter public class BusinessLookup { - private NetflixService netflixService; - private YouTubeService youTubeService; + private NetflixService netflixService; + private YouTubeService youTubeService; - public VideoStreamingService getBusinessService(String movie) { - if (movie.toLowerCase(Locale.ROOT).contains("die hard")) { - return netflixService; - } else { - return youTubeService; + public VideoStreamingService getBusinessService(String movie) { + if (movie.toLowerCase(Locale.ROOT).contains("die hard")) { + return netflixService; + } else { + return youTubeService; + } } - } } ``` @@ -89,12 +89,12 @@ video streaming service. @Setter public class BusinessDelegate { - private BusinessLookup lookupService; + private BusinessLookup lookupService; - public void playbackMovie(String movie) { - VideoStreamingService videoStreamingService = lookupService.getBusinessService(movie); - videoStreamingService.doProcessing(); - } + public void playbackMovie(String movie) { + VideoStreamingService videoStreamingService = lookupService.getBusinessService(movie); + videoStreamingService.doProcessing(); + } } ``` @@ -103,15 +103,15 @@ The mobile client utilizes Business Delegate to call the business tier. ```java public class MobileClient { - private final BusinessDelegate businessDelegate; + private final BusinessDelegate businessDelegate; - public MobileClient(BusinessDelegate businessDelegate) { - this.businessDelegate = businessDelegate; - } + public MobileClient(BusinessDelegate businessDelegate) { + this.businessDelegate = businessDelegate; + } - public void playbackMovie(String movie) { - businessDelegate.playbackMovie(movie); - } + public void playbackMovie(String movie) { + businessDelegate.playbackMovie(movie); + } } ``` @@ -120,18 +120,18 @@ Finally, we can demonstrate the complete example in action. ```java public static void main(String[]args){ - // prepare the objects - var businessDelegate=new BusinessDelegate(); - var businessLookup=new BusinessLookup(); - businessLookup.setNetflixService(new NetflixService()); - businessLookup.setYouTubeService(new YouTubeService()); - businessDelegate.setLookupService(businessLookup); - - // create the client and use the Business Delegate - var client=new MobileClient(businessDelegate); - client.playbackMovie("Die Hard 2"); - client.playbackMovie("Maradona: The Greatest Ever"); - } + // prepare the objects + var businessDelegate=new BusinessDelegate(); + var businessLookup=new BusinessLookup(); + businessLookup.setNetflixService(new NetflixService()); + businessLookup.setYouTubeService(new YouTubeService()); + businessDelegate.setLookupService(businessLookup); + + // create the client and use the Business Delegate + var client=new MobileClient(businessDelegate); + client.playbackMovie("Die Hard 2"); + client.playbackMovie("Maradona: The Greatest Ever"); + } ``` Here is the console output. diff --git a/bytecode/README.md b/bytecode/README.md index e4a459b5895f..919bf793e110 100644 --- a/bytecode/README.md +++ b/bytecode/README.md @@ -3,7 +3,7 @@ title: Bytecode category: Behavioral language: en tag: - - Game programming + - Game programming --- ## Intent @@ -15,8 +15,8 @@ Allows encoding behavior as instructions for a virtual machine. Real world example > A team is working on a new game where wizards battle against each other. The wizard behavior needs to be carefully -> adjusted and iterated hundreds of times through playtesting. It's not optimal to ask the programmer to make changes each -> time the game designer wants to vary the behavior, so the wizard behavior is implemented as a data-driven virtual +> adjusted and iterated hundreds of times through playtesting. It's not optimal to ask the programmer to make changes +> each time the game designer wants to vary the behavior, so the wizard behavior is implemented as a data-driven virtual > machine. In plain words @@ -42,21 +42,21 @@ One of the most important game objects is the `Wizard` class. @Slf4j public class Wizard { - private int health; - private int agility; - private int wisdom; - private int numberOfPlayedSounds; - private int numberOfSpawnedParticles; - - public void playSound() { - LOGGER.info("Playing sound"); - numberOfPlayedSounds++; - } - - public void spawnParticles() { - LOGGER.info("Spawning particles"); - numberOfSpawnedParticles++; - } + private int health; + private int agility; + private int wisdom; + private int numberOfPlayedSounds; + private int numberOfSpawnedParticles; + + public void playSound() { + LOGGER.info("Playing sound"); + numberOfPlayedSounds++; + } + + public void spawnParticles() { + LOGGER.info("Spawning particles"); + numberOfSpawnedParticles++; + } } ``` @@ -70,18 +70,18 @@ together and pushes the result to the stack. @Getter public enum Instruction { - LITERAL(1), // e.g. "LITERAL 0", push 0 to stack - SET_HEALTH(2), // e.g. "SET_HEALTH", pop health and wizard number, call set health - SET_WISDOM(3), // e.g. "SET_WISDOM", pop wisdom and wizard number, call set wisdom - SET_AGILITY(4), // e.g. "SET_AGILITY", pop agility and wizard number, call set agility - PLAY_SOUND(5), // e.g. "PLAY_SOUND", pop value as wizard number, call play sound - SPAWN_PARTICLES(6), // e.g. "SPAWN_PARTICLES", pop value as wizard number, call spawn particles - GET_HEALTH(7), // e.g. "GET_HEALTH", pop value as wizard number, push wizard's health - GET_AGILITY(8), // e.g. "GET_AGILITY", pop value as wizard number, push wizard's agility - GET_WISDOM(9), // e.g. "GET_WISDOM", pop value as wizard number, push wizard's wisdom - ADD(10), // e.g. "ADD", pop 2 values, push their sum - DIVIDE(11); // e.g. "DIVIDE", pop 2 values, push their division - // ... + LITERAL(1), // e.g. "LITERAL 0", push 0 to stack + SET_HEALTH(2), // e.g. "SET_HEALTH", pop health and wizard number, call set health + SET_WISDOM(3), // e.g. "SET_WISDOM", pop wisdom and wizard number, call set wisdom + SET_AGILITY(4), // e.g. "SET_AGILITY", pop agility and wizard number, call set agility + PLAY_SOUND(5), // e.g. "PLAY_SOUND", pop value as wizard number, call play sound + SPAWN_PARTICLES(6), // e.g. "SPAWN_PARTICLES", pop value as wizard number, call spawn particles + GET_HEALTH(7), // e.g. "GET_HEALTH", pop value as wizard number, push wizard's health + GET_AGILITY(8), // e.g. "GET_AGILITY", pop value as wizard number, push wizard's agility + GET_WISDOM(9), // e.g. "GET_WISDOM", pop value as wizard number, push wizard's wisdom + ADD(10), // e.g. "ADD", pop 2 values, push their sum + DIVIDE(11); // e.g. "DIVIDE", pop 2 values, push their division + // ... } ``` @@ -94,89 +94,89 @@ the game object behavior. @Slf4j public class VirtualMachine { - private final Stack stack = new Stack<>(); - - private final Wizard[] wizards = new Wizard[2]; - - public VirtualMachine() { - wizards[0] = new Wizard(randomInt(3, 32), randomInt(3, 32), randomInt(3, 32), - 0, 0); - wizards[1] = new Wizard(randomInt(3, 32), randomInt(3, 32), randomInt(3, 32), - 0, 0); - } - - public VirtualMachine(Wizard wizard1, Wizard wizard2) { - wizards[0] = wizard1; - wizards[1] = wizard2; - } - - public void execute(int[] bytecode) { - for (var i = 0; i < bytecode.length; i++) { - Instruction instruction = Instruction.getInstruction(bytecode[i]); - switch (instruction) { - case LITERAL: - // Read the next byte from the bytecode. - int value = bytecode[++i]; - // Push the next value to stack - stack.push(value); - break; - case SET_AGILITY: - var amount = stack.pop(); - var wizard = stack.pop(); - setAgility(wizard, amount); - break; - case SET_WISDOM: - amount = stack.pop(); - wizard = stack.pop(); - setWisdom(wizard, amount); - break; - case SET_HEALTH: - amount = stack.pop(); - wizard = stack.pop(); - setHealth(wizard, amount); - break; - case GET_HEALTH: - wizard = stack.pop(); - stack.push(getHealth(wizard)); - break; - case GET_AGILITY: - wizard = stack.pop(); - stack.push(getAgility(wizard)); - break; - case GET_WISDOM: - wizard = stack.pop(); - stack.push(getWisdom(wizard)); - break; - case ADD: - var a = stack.pop(); - var b = stack.pop(); - stack.push(a + b); - break; - case DIVIDE: - a = stack.pop(); - b = stack.pop(); - stack.push(b / a); - break; - case PLAY_SOUND: - wizard = stack.pop(); - getWizards()[wizard].playSound(); - break; - case SPAWN_PARTICLES: - wizard = stack.pop(); - getWizards()[wizard].spawnParticles(); - break; - default: - throw new IllegalArgumentException("Invalid instruction value"); - } - LOGGER.info("Executed " + instruction.name() + ", Stack contains " + getStack()); + private final Stack stack = new Stack<>(); + + private final Wizard[] wizards = new Wizard[2]; + + public VirtualMachine() { + wizards[0] = new Wizard(randomInt(3, 32), randomInt(3, 32), randomInt(3, 32), + 0, 0); + wizards[1] = new Wizard(randomInt(3, 32), randomInt(3, 32), randomInt(3, 32), + 0, 0); } - } - public void setHealth(int wizard, int amount) { - wizards[wizard].setHealth(amount); - } - // other setters -> - // ... + public VirtualMachine(Wizard wizard1, Wizard wizard2) { + wizards[0] = wizard1; + wizards[1] = wizard2; + } + + public void execute(int[] bytecode) { + for (var i = 0; i < bytecode.length; i++) { + Instruction instruction = Instruction.getInstruction(bytecode[i]); + switch (instruction) { + case LITERAL: + // Read the next byte from the bytecode. + int value = bytecode[++i]; + // Push the next value to stack + stack.push(value); + break; + case SET_AGILITY: + var amount = stack.pop(); + var wizard = stack.pop(); + setAgility(wizard, amount); + break; + case SET_WISDOM: + amount = stack.pop(); + wizard = stack.pop(); + setWisdom(wizard, amount); + break; + case SET_HEALTH: + amount = stack.pop(); + wizard = stack.pop(); + setHealth(wizard, amount); + break; + case GET_HEALTH: + wizard = stack.pop(); + stack.push(getHealth(wizard)); + break; + case GET_AGILITY: + wizard = stack.pop(); + stack.push(getAgility(wizard)); + break; + case GET_WISDOM: + wizard = stack.pop(); + stack.push(getWisdom(wizard)); + break; + case ADD: + var a = stack.pop(); + var b = stack.pop(); + stack.push(a + b); + break; + case DIVIDE: + a = stack.pop(); + b = stack.pop(); + stack.push(b / a); + break; + case PLAY_SOUND: + wizard = stack.pop(); + getWizards()[wizard].playSound(); + break; + case SPAWN_PARTICLES: + wizard = stack.pop(); + getWizards()[wizard].spawnParticles(); + break; + default: + throw new IllegalArgumentException("Invalid instruction value"); + } + LOGGER.info("Executed " + instruction.name() + ", Stack contains " + getStack()); + } + } + + public void setHealth(int wizard, int amount) { + wizards[wizard].setHealth(amount); + } + // other setters -> + // ... } ``` @@ -185,23 +185,23 @@ Now we can show the full example utilizing the virtual machine. ```java public static void main(String[]args){ - var vm=new VirtualMachine( - new Wizard(45,7,11,0,0), - new Wizard(36,18,8,0,0)); - - vm.execute(InstructionConverterUtil.convertToByteCode("LITERAL 0")); - vm.execute(InstructionConverterUtil.convertToByteCode("LITERAL 0")); - vm.execute(InstructionConverterUtil.convertToByteCode("GET_HEALTH")); - vm.execute(InstructionConverterUtil.convertToByteCode("LITERAL 0")); - vm.execute(InstructionConverterUtil.convertToByteCode("GET_AGILITY")); - vm.execute(InstructionConverterUtil.convertToByteCode("LITERAL 0")); - vm.execute(InstructionConverterUtil.convertToByteCode("GET_WISDOM")); - vm.execute(InstructionConverterUtil.convertToByteCode("ADD")); - vm.execute(InstructionConverterUtil.convertToByteCode("LITERAL 2")); - vm.execute(InstructionConverterUtil.convertToByteCode("DIVIDE")); - vm.execute(InstructionConverterUtil.convertToByteCode("ADD")); - vm.execute(InstructionConverterUtil.convertToByteCode("SET_HEALTH")); - } + var vm=new VirtualMachine( + new Wizard(45,7,11,0,0), + new Wizard(36,18,8,0,0)); + + vm.execute(InstructionConverterUtil.convertToByteCode("LITERAL 0")); + vm.execute(InstructionConverterUtil.convertToByteCode("LITERAL 0")); + vm.execute(InstructionConverterUtil.convertToByteCode("GET_HEALTH")); + vm.execute(InstructionConverterUtil.convertToByteCode("LITERAL 0")); + vm.execute(InstructionConverterUtil.convertToByteCode("GET_AGILITY")); + vm.execute(InstructionConverterUtil.convertToByteCode("LITERAL 0")); + vm.execute(InstructionConverterUtil.convertToByteCode("GET_WISDOM")); + vm.execute(InstructionConverterUtil.convertToByteCode("ADD")); + vm.execute(InstructionConverterUtil.convertToByteCode("LITERAL 2")); + vm.execute(InstructionConverterUtil.convertToByteCode("DIVIDE")); + vm.execute(InstructionConverterUtil.convertToByteCode("ADD")); + vm.execute(InstructionConverterUtil.convertToByteCode("SET_HEALTH")); + } ``` Here is the console output. diff --git a/caching/README.md b/caching/README.md index a3442a2b96dd..75e8b42c990e 100644 --- a/caching/README.md +++ b/caching/README.md @@ -3,9 +3,9 @@ title: Caching category: Performance optimization language: en tag: - - Caching - - Performance - - Cloud distributed + - Caching + - Performance + - Cloud distributed --- ## Intent @@ -24,9 +24,9 @@ again. Real world example > A team is working on a website that provides new homes for abandoned cats. People can post their cats on the website -> after registering, but all the new posts require approval from one of the site moderators. The user accounts of the site -> moderators contain a specific flag and the data is stored in a MongoDB database. Checking for the moderator flag each -> time a post is viewed becomes expensive, and it's a good idea to utilize caching here. +> after registering, but all the new posts require approval from one of the site moderators. The user accounts of the +> site moderators contain a specific flag and the data is stored in a MongoDB database. Checking for the moderator flag +> each time a post is viewed becomes expensive, and it's a good idea to utilize caching here. In plain words @@ -36,9 +36,9 @@ Wikipedia says: > In computing, a cache is a hardware or software component that stores data so that future requests for that data can > be served faster; the data stored in a cache might be the result of an earlier computation or a copy of data stored -> elsewhere. A cache hit occurs when the requested data can be found in a cache, while a cache miss occurs when it cannot. -> Cache hits are served by reading data from the cache, which is faster than recomputing a result or reading from a slower -> data store; thus, the more requests that can be served from the cache, the faster the system performs. +> elsewhere. A cache hit occurs when the requested data can be found in a cache, while a cache miss occurs when it +> cannot. Cache hits are served by reading data from the cache, which is faster than recomputing a result or reading +> from a slower data store; thus, the more requests that can be served from the cache, the faster the system performs. **Programmatic Example** @@ -53,24 +53,24 @@ to/from database. @ToString @EqualsAndHashCode public class UserAccount { - private String userId; - private String userName; - private String additionalInfo; + private String userId; + private String userName; + private String additionalInfo; } public interface DbManager { - void connect(); + void connect(); - void disconnect(); + void disconnect(); - UserAccount readFromDb(String userId); + UserAccount readFromDb(String userId); - UserAccount writeToDb(UserAccount userAccount); + UserAccount writeToDb(UserAccount userAccount); - UserAccount updateDb(UserAccount userAccount); + UserAccount updateDb(UserAccount userAccount); - UserAccount upsertDb(UserAccount userAccount); + UserAccount upsertDb(UserAccount userAccount); } ``` @@ -96,73 +96,73 @@ always at the end of the list. @Slf4j public class LruCache { - static class Node { - String userId; - UserAccount userAccount; - Node previous; - Node next; + static class Node { + String userId; + UserAccount userAccount; + Node previous; + Node next; - public Node(String userId, UserAccount userAccount) { - this.userId = userId; - this.userAccount = userAccount; + public Node(String userId, UserAccount userAccount) { + this.userId = userId; + this.userAccount = userAccount; + } } - } - /* ... omitted details ... */ + /* ... omitted details ... */ - public LruCache(int capacity) { - this.capacity = capacity; - } + public LruCache(int capacity) { + this.capacity = capacity; + } - public UserAccount get(String userId) { - if (cache.containsKey(userId)) { - var node = cache.get(userId); - remove(node); - setHead(node); - return node.userAccount; + public UserAccount get(String userId) { + if (cache.containsKey(userId)) { + var node = cache.get(userId); + remove(node); + setHead(node); + return node.userAccount; + } + return null; } - return null; - } - - public void set(String userId, UserAccount userAccount) { - if (cache.containsKey(userId)) { - var old = cache.get(userId); - old.userAccount = userAccount; - remove(old); - setHead(old); - } else { - var newNode = new Node(userId, userAccount); - if (cache.size() >= capacity) { - LOGGER.info("# Cache is FULL! Removing {} from cache...", end.userId); - cache.remove(end.userId); // remove LRU data from cache. - remove(end); - setHead(newNode); - } else { - setHead(newNode); - } - cache.put(userId, newNode); + + public void set(String userId, UserAccount userAccount) { + if (cache.containsKey(userId)) { + var old = cache.get(userId); + old.userAccount = userAccount; + remove(old); + setHead(old); + } else { + var newNode = new Node(userId, userAccount); + if (cache.size() >= capacity) { + LOGGER.info("# Cache is FULL! Removing {} from cache...", end.userId); + cache.remove(end.userId); // remove LRU data from cache. + remove(end); + setHead(newNode); + } else { + setHead(newNode); + } + cache.put(userId, newNode); + } } - } - public boolean contains(String userId) { - return cache.containsKey(userId); - } + public boolean contains(String userId) { + return cache.containsKey(userId); + } - public void remove(Node node) { /* ... */ } + public void remove(Node node) { /* ... */ } - public void setHead(Node node) { /* ... */ } + public void setHead(Node node) { /* ... */ } - public void invalidate(String userId) { /* ... */ } + public void invalidate(String userId) { /* ... */ } - public boolean isFull() { /* ... */ } + public boolean isFull() { /* ... */ } - public UserAccount getLruData() { /* ... */ } + public UserAccount getLruData() { /* ... */ } - public void clear() { /* ... */ } + public void clear() { /* ... */ } - public List getCacheDataInListForm() { /* ... */ } + public List getCacheDataInListForm() { /* ... */ } - public void setCapacity(int newCapacity) { /* ... */ } + public void setCapacity(int newCapacity) { /* ... */ } } ``` @@ -173,58 +173,58 @@ The next layer we are going to look at is `CacheStore` which implements the diff @Slf4j public class CacheStore { - private static final int CAPACITY = 3; - private static LruCache cache; - private final DbManager dbManager; - - /* ... details omitted ... */ - - public UserAccount readThrough(final String userId) { - if (cache.contains(userId)) { - LOGGER.info("# Found in Cache!"); - return cache.get(userId); + private static final int CAPACITY = 3; + private static LruCache cache; + private final DbManager dbManager; + + /* ... details omitted ... */ + + public UserAccount readThrough(final String userId) { + if (cache.contains(userId)) { + LOGGER.info("# Found in Cache!"); + return cache.get(userId); + } + LOGGER.info("# Not found in cache! Go to DB!!"); + UserAccount userAccount = dbManager.readFromDb(userId); + cache.set(userId, userAccount); + return userAccount; } - LOGGER.info("# Not found in cache! Go to DB!!"); - UserAccount userAccount = dbManager.readFromDb(userId); - cache.set(userId, userAccount); - return userAccount; - } - - public void writeThrough(final UserAccount userAccount) { - if (cache.contains(userAccount.getUserId())) { - dbManager.updateDb(userAccount); - } else { - dbManager.writeToDb(userAccount); + + public void writeThrough(final UserAccount userAccount) { + if (cache.contains(userAccount.getUserId())) { + dbManager.updateDb(userAccount); + } else { + dbManager.writeToDb(userAccount); + } + cache.set(userAccount.getUserId(), userAccount); } - cache.set(userAccount.getUserId(), userAccount); - } - - public void writeAround(final UserAccount userAccount) { - if (cache.contains(userAccount.getUserId())) { - dbManager.updateDb(userAccount); - // Cache data has been updated -- remove older - cache.invalidate(userAccount.getUserId()); - // version from cache. - } else { - dbManager.writeToDb(userAccount); + + public void writeAround(final UserAccount userAccount) { + if (cache.contains(userAccount.getUserId())) { + dbManager.updateDb(userAccount); + // Cache data has been updated -- remove older + cache.invalidate(userAccount.getUserId()); + // version from cache. + } else { + dbManager.writeToDb(userAccount); + } } - } - public static void clearCache() { - if (cache != null) { - cache.clear(); + public static void clearCache() { + if (cache != null) { + cache.clear(); + } } - } - public static void flushCache() { - LOGGER.info("# flushCache..."); - Optional.ofNullable(cache) - .map(LruCache::getCacheDataInListForm) - .orElse(List.of()) - .forEach(DbManager::updateDb); - } + public static void flushCache() { + LOGGER.info("# flushCache..."); + Optional.ofNullable(cache) + .map(LruCache::getCacheDataInListForm) + .orElse(List.of()) + .forEach(DbManager::updateDb); + } - /* ... omitted the implementation of other caching strategies ... */ + /* ... omitted the implementation of other caching strategies ... */ } ``` @@ -239,50 +239,50 @@ the appropriate function in the `CacheStore` class. @Slf4j public final class AppManager { - private static CachingPolicy cachingPolicy; - private final DbManager dbManager; - private final CacheStore cacheStore; + private static CachingPolicy cachingPolicy; + private final DbManager dbManager; + private final CacheStore cacheStore; - private AppManager() { - } + private AppManager() { + } - public void initDb() { /* ... */ } + public void initDb() { /* ... */ } - public static void initCachingPolicy(CachingPolicy policy) { /* ... */ } + public static void initCachingPolicy(CachingPolicy policy) { /* ... */ } - public static void initCacheCapacity(int capacity) { /* ... */ } + public static void initCacheCapacity(int capacity) { /* ... */ } - public UserAccount find(final String userId) { - LOGGER.info("Trying to find {} in cache", userId); - if (cachingPolicy == CachingPolicy.THROUGH - || cachingPolicy == CachingPolicy.AROUND) { - return cacheStore.readThrough(userId); - } else if (cachingPolicy == CachingPolicy.BEHIND) { - return cacheStore.readThroughWithWriteBackPolicy(userId); - } else if (cachingPolicy == CachingPolicy.ASIDE) { - return findAside(userId); + public UserAccount find(final String userId) { + LOGGER.info("Trying to find {} in cache", userId); + if (cachingPolicy == CachingPolicy.THROUGH + || cachingPolicy == CachingPolicy.AROUND) { + return cacheStore.readThrough(userId); + } else if (cachingPolicy == CachingPolicy.BEHIND) { + return cacheStore.readThroughWithWriteBackPolicy(userId); + } else if (cachingPolicy == CachingPolicy.ASIDE) { + return findAside(userId); + } + return null; } - return null; - } - - public void save(final UserAccount userAccount) { - LOGGER.info("Save record!"); - if (cachingPolicy == CachingPolicy.THROUGH) { - cacheStore.writeThrough(userAccount); - } else if (cachingPolicy == CachingPolicy.AROUND) { - cacheStore.writeAround(userAccount); - } else if (cachingPolicy == CachingPolicy.BEHIND) { - cacheStore.writeBehind(userAccount); - } else if (cachingPolicy == CachingPolicy.ASIDE) { - saveAside(userAccount); + + public void save(final UserAccount userAccount) { + LOGGER.info("Save record!"); + if (cachingPolicy == CachingPolicy.THROUGH) { + cacheStore.writeThrough(userAccount); + } else if (cachingPolicy == CachingPolicy.AROUND) { + cacheStore.writeAround(userAccount); + } else if (cachingPolicy == CachingPolicy.BEHIND) { + cacheStore.writeBehind(userAccount); + } else if (cachingPolicy == CachingPolicy.ASIDE) { + saveAside(userAccount); + } } - } - public static String printCacheContent() { - return CacheStore.print(); - } + public static String printCacheContent() { + return CacheStore.print(); + } - /* ... details omitted ... */ + /* ... details omitted ... */ } ``` @@ -293,42 +293,42 @@ Here is what we do in the main class of the application. @Slf4j public class App { - public static void main(final String[] args) { - boolean isDbMongo = isDbMongo(args); - if (isDbMongo) { - LOGGER.info("Using the Mongo database engine to run the application."); - } else { - LOGGER.info("Using the 'in Memory' database to run the application."); + public static void main(final String[] args) { + boolean isDbMongo = isDbMongo(args); + if (isDbMongo) { + LOGGER.info("Using the Mongo database engine to run the application."); + } else { + LOGGER.info("Using the 'in Memory' database to run the application."); + } + App app = new App(isDbMongo); + app.useReadAndWriteThroughStrategy(); + String splitLine = "=============================================="; + LOGGER.info(splitLine); + app.useReadThroughAndWriteAroundStrategy(); + LOGGER.info(splitLine); + app.useReadThroughAndWriteBehindStrategy(); + LOGGER.info(splitLine); + app.useCacheAsideStategy(); + LOGGER.info(splitLine); } - App app = new App(isDbMongo); - app.useReadAndWriteThroughStrategy(); - String splitLine = "=============================================="; - LOGGER.info(splitLine); - app.useReadThroughAndWriteAroundStrategy(); - LOGGER.info(splitLine); - app.useReadThroughAndWriteBehindStrategy(); - LOGGER.info(splitLine); - app.useCacheAsideStategy(); - LOGGER.info(splitLine); - } - - public void useReadAndWriteThroughStrategy() { - LOGGER.info("# CachingPolicy.THROUGH"); - appManager.initCachingPolicy(CachingPolicy.THROUGH); - - var userAccount1 = new UserAccount("001", "John", "He is a boy."); - - appManager.save(userAccount1); - LOGGER.info(appManager.printCacheContent()); - appManager.find("001"); - appManager.find("001"); - } - - public void useReadThroughAndWriteAroundStrategy() { /* ... */ } - - public void useReadThroughAndWriteBehindStrategy() { /* ... */ } - - public void useCacheAsideStrategy() { /* ... */ } + + public void useReadAndWriteThroughStrategy() { + LOGGER.info("# CachingPolicy.THROUGH"); + appManager.initCachingPolicy(CachingPolicy.THROUGH); + + var userAccount1 = new UserAccount("001", "John", "He is a boy."); + + appManager.save(userAccount1); + LOGGER.info(appManager.printCacheContent()); + appManager.find("001"); + appManager.find("001"); + } + + public void useReadThroughAndWriteAroundStrategy() { /* ... */ } + + public void useReadThroughAndWriteBehindStrategy() { /* ... */ } + + public void useCacheAsideStrategy() { /* ... */ } } ``` diff --git a/callback/README.md b/callback/README.md index 3af2f2d602a5..886cecd8071c 100644 --- a/callback/README.md +++ b/callback/README.md @@ -3,10 +3,10 @@ title: Callback category: Functional language: en tag: - - Asynchronous - - Decoupling - - Idiom - - Reactive + - Asynchronous + - Decoupling + - Idiom + - Reactive --- ## Intent @@ -42,7 +42,7 @@ Callback is a simple interface with single method. ```java public interface Callback { - void call(); + void call(); } ``` @@ -51,21 +51,21 @@ Next we define a task that will execute the callback after the task execution ha ```java public abstract class Task { - final void executeWith(Callback callback) { - execute(); - Optional.ofNullable(callback).ifPresent(Callback::call); - } + final void executeWith(Callback callback) { + execute(); + Optional.ofNullable(callback).ifPresent(Callback::call); + } - public abstract void execute(); + public abstract void execute(); } @Slf4j public final class SimpleTask extends Task { - @Override - public void execute() { - LOGGER.info("Perform some important activity and after call the callback method."); - } + @Override + public void execute() { + LOGGER.info("Perform some important activity and after call the callback method."); + } } ``` @@ -73,7 +73,7 @@ Finally, here's how we execute a task and receive a callback when it's finished. ```java var task=new SimpleTask(); - task.executeWith(()->LOGGER.info("I'm done now.")); + task.executeWith(()->LOGGER.info("I'm done now.")); ``` ## Class diagram diff --git a/chain-of-responsibility/README.md b/chain-of-responsibility/README.md index e33a88cd5ce2..147dcb0afbea 100644 --- a/chain-of-responsibility/README.md +++ b/chain-of-responsibility/README.md @@ -3,8 +3,8 @@ title: Chain of responsibility category: Behavioral language: en tag: - - Gang of Four - - Decoupling + - Gang of Four + - Decoupling --- ## Also known as @@ -48,27 +48,27 @@ import lombok.Getter; @Getter public class Request { - private final RequestType requestType; - private final String requestDescription; - private boolean handled; + 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 Request(final RequestType requestType, final String requestDescription) { + this.requestType = Objects.requireNonNull(requestType); + this.requestDescription = Objects.requireNonNull(requestDescription); + } - public void markHandled() { - this.handled = true; - } + public void markHandled() { + this.handled = true; + } - @Override - public String toString() { - return getRequestDescription(); - } + @Override + public String toString() { + return getRequestDescription(); + } } public enum RequestType { - DEFEND_CASTLE, TORTURE_PRISONER, COLLECT_TAX + DEFEND_CASTLE, TORTURE_PRISONER, COLLECT_TAX } ``` @@ -77,37 +77,37 @@ Next, we show the request handler hierarchy. ```java public interface RequestHandler { - boolean canHandleRequest(Request req); + boolean canHandleRequest(Request req); - int getPriority(); + int getPriority(); - void handle(Request req); + void handle(Request req); - String name(); + String name(); } @Slf4j public class OrcCommander implements RequestHandler { - @Override - public boolean canHandleRequest(Request req) { - return req.getRequestType() == RequestType.DEFEND_CASTLE; - } - - @Override - public int getPriority() { - return 2; - } - - @Override - public void handle(Request req) { - req.markHandled(); - LOGGER.info("{} handling request \"{}\"", name(), req); - } - - @Override - public String name() { - return "Orc commander"; - } + @Override + public boolean canHandleRequest(Request req) { + return req.getRequestType() == RequestType.DEFEND_CASTLE; + } + + @Override + public int getPriority() { + return 2; + } + + @Override + public void handle(Request req) { + req.markHandled(); + LOGGER.info("{} handling request \"{}\"", name(), req); + } + + @Override + public String name() { + return "Orc commander"; + } } // OrcOfficer and OrcSoldier are defined similarly as OrcCommander @@ -119,24 +119,24 @@ The Orc King gives the orders and forms the chain. ```java public class OrcKing { - private List handlers; + private List handlers; - public OrcKing() { - buildChain(); - } + public OrcKing() { + buildChain(); + } - private void buildChain() { - handlers = Arrays.asList(new OrcCommander(), new OrcOfficer(), new OrcSoldier()); - } + private void buildChain() { + handlers = Arrays.asList(new OrcCommander(), new OrcOfficer(), new OrcSoldier()); + } - public void makeRequest(Request req) { - handlers - .stream() - .sorted(Comparator.comparing(RequestHandler::getPriority)) - .filter(handler -> handler.canHandleRequest(req)) - .findFirst() - .ifPresent(handler -> handler.handle(req)); - } + public void makeRequest(Request req) { + handlers + .stream() + .sorted(Comparator.comparing(RequestHandler::getPriority)) + .filter(handler -> handler.canHandleRequest(req)) + .findFirst() + .ifPresent(handler -> handler.handle(req)); + } } ``` @@ -144,9 +144,9 @@ The chain of responsibility in action. ```java var king=new OrcKing(); - king.makeRequest(new Request(RequestType.DEFEND_CASTLE,"defend castle")); - king.makeRequest(new Request(RequestType.TORTURE_PRISONER,"torture prisoner")); - king.makeRequest(new Request(RequestType.COLLECT_TAX,"collect tax")); + king.makeRequest(new Request(RequestType.DEFEND_CASTLE,"defend castle")); + king.makeRequest(new Request(RequestType.TORTURE_PRISONER,"torture prisoner")); + king.makeRequest(new Request(RequestType.COLLECT_TAX,"collect tax")); ``` The console output. diff --git a/circuit-breaker/README.md b/circuit-breaker/README.md index 394d5d1d5ada..58d4b644ec41 100644 --- a/circuit-breaker/README.md +++ b/circuit-breaker/README.md @@ -3,9 +3,9 @@ title: Circuit Breaker category: Resilience language: en tag: - - Cloud distributed - - Fault tolerance - - Microservices + - Cloud distributed + - Fault tolerance + - Microservices --- ## Also known as @@ -28,10 +28,9 @@ Real world example > services is slow or not responding successfully, our application will try to fetch response from > the remote service using multiple threads/processes, soon all of them will hang (also called > [thread starvation](https://en.wikipedia.org/wiki/Starvation_(computer_science))) causing our entire web application -> to crash. We should be able to detect -> this situation and show the user an appropriate message so that he/she can explore other parts of -> the app unaffected by the remote service failure. Meanwhile, the other services that are working -> normally, should keep functioning unaffected by this failure. +> to crash. We should be able to detect this situation and show the user an appropriate message so that he/she can +> explore other parts of the app unaffected by the remote serv'ice failure. Meanwhile, the other services that are +> working normally, should keep functioning unaffected by this failure. In plain words @@ -62,59 +61,59 @@ In terms of code, the end user application is: @Slf4j public class App { - private static final Logger LOGGER = LoggerFactory.getLogger(App.class); - - /** - * Program entry point. - * - * @param args command line args - */ - public static void main(String[] args) { - - var serverStartTime = System.nanoTime(); - - var delayedService = new DelayedRemoteService(serverStartTime, 5); - var delayedServiceCircuitBreaker = new DefaultCircuitBreaker(delayedService, 3000, 2, - 2000 * 1000 * 1000); - - var quickService = new QuickRemoteService(); - var quickServiceCircuitBreaker = new DefaultCircuitBreaker(quickService, 3000, 2, - 2000 * 1000 * 1000); - - //Create an object of monitoring service which makes both local and remote calls - var monitoringService = new MonitoringService(delayedServiceCircuitBreaker, - quickServiceCircuitBreaker); - - //Fetch response from local resource - LOGGER.info(monitoringService.localResourceResponse()); - - //Fetch response from delayed service 2 times, to meet the failure threshold - LOGGER.info(monitoringService.delayedServiceResponse()); - LOGGER.info(monitoringService.delayedServiceResponse()); - - //Fetch current state of delayed service circuit breaker after crossing failure threshold limit - //which is OPEN now - LOGGER.info(delayedServiceCircuitBreaker.getState()); - - //Meanwhile, the delayed service is down, fetch response from the healthy quick service - LOGGER.info(monitoringService.quickServiceResponse()); - LOGGER.info(quickServiceCircuitBreaker.getState()); - - //Wait for the delayed service to become responsive - try { - LOGGER.info("Waiting for delayed service to become responsive"); - Thread.sleep(5000); - } catch (InterruptedException e) { - LOGGER.error("An error occurred: ", e); + private static final Logger LOGGER = LoggerFactory.getLogger(App.class); + + /** + * Program entry point. + * + * @param args command line args + */ + public static void main(String[] args) { + + var serverStartTime = System.nanoTime(); + + var delayedService = new DelayedRemoteService(serverStartTime, 5); + var delayedServiceCircuitBreaker = new DefaultCircuitBreaker(delayedService, 3000, 2, + 2000 * 1000 * 1000); + + var quickService = new QuickRemoteService(); + var quickServiceCircuitBreaker = new DefaultCircuitBreaker(quickService, 3000, 2, + 2000 * 1000 * 1000); + + //Create an object of monitoring service which makes both local and remote calls + var monitoringService = new MonitoringService(delayedServiceCircuitBreaker, + quickServiceCircuitBreaker); + + //Fetch response from local resource + LOGGER.info(monitoringService.localResourceResponse()); + + //Fetch response from delayed service 2 times, to meet the failure threshold + LOGGER.info(monitoringService.delayedServiceResponse()); + LOGGER.info(monitoringService.delayedServiceResponse()); + + //Fetch current state of delayed service circuit breaker after crossing failure threshold limit + //which is OPEN now + LOGGER.info(delayedServiceCircuitBreaker.getState()); + + //Meanwhile, the delayed service is down, fetch response from the healthy quick service + LOGGER.info(monitoringService.quickServiceResponse()); + LOGGER.info(quickServiceCircuitBreaker.getState()); + + //Wait for the delayed service to become responsive + try { + LOGGER.info("Waiting for delayed service to become responsive"); + Thread.sleep(5000); + } catch (InterruptedException e) { + LOGGER.error("An error occurred: ", e); + } + //Check the state of delayed circuit breaker, should be HALF_OPEN + LOGGER.info(delayedServiceCircuitBreaker.getState()); + + //Fetch response from delayed service, which should be healthy by now + LOGGER.info(monitoringService.delayedServiceResponse()); + //As successful response is fetched, it should be CLOSED again. + LOGGER.info(delayedServiceCircuitBreaker.getState()); } - //Check the state of delayed circuit breaker, should be HALF_OPEN - LOGGER.info(delayedServiceCircuitBreaker.getState()); - - //Fetch response from delayed service, which should be healthy by now - LOGGER.info(monitoringService.delayedServiceResponse()); - //As successful response is fetched, it should be CLOSED again. - LOGGER.info(delayedServiceCircuitBreaker.getState()); - } } ``` @@ -123,45 +122,45 @@ The monitoring service: ```java public class MonitoringService { - private final CircuitBreaker delayedService; - - private final CircuitBreaker quickService; - - public MonitoringService(CircuitBreaker delayedService, CircuitBreaker quickService) { - this.delayedService = delayedService; - this.quickService = quickService; - } - - //Assumption: Local service won't fail, no need to wrap it in a circuit breaker logic - public String localResourceResponse() { - return "Local Service is working"; - } - - /** - * Fetch response from the delayed service (with some simulated startup time). - * - * @return response string - */ - public String delayedServiceResponse() { - try { - return this.delayedService.attemptRequest(); - } catch (RemoteServiceException e) { - return e.getMessage(); + private final CircuitBreaker delayedService; + + private final CircuitBreaker quickService; + + public MonitoringService(CircuitBreaker delayedService, CircuitBreaker quickService) { + this.delayedService = delayedService; + this.quickService = quickService; } - } - - /** - * Fetches response from a healthy service without any failure. - * - * @return response string - */ - public String quickServiceResponse() { - try { - return this.quickService.attemptRequest(); - } catch (RemoteServiceException e) { - return e.getMessage(); + + //Assumption: Local service won't fail, no need to wrap it in a circuit breaker logic + public String localResourceResponse() { + return "Local Service is working"; + } + + /** + * Fetch response from the delayed service (with some simulated startup time). + * + * @return response string + */ + public String delayedServiceResponse() { + try { + return this.delayedService.attemptRequest(); + } catch (RemoteServiceException e) { + return e.getMessage(); + } + } + + /** + * Fetches response from a healthy service without any failure. + * + * @return response string + */ + public String quickServiceResponse() { + try { + return this.quickService.attemptRequest(); + } catch (RemoteServiceException e) { + return e.getMessage(); + } } - } } ``` @@ -171,128 +170,128 @@ remote (costly) service in a circuit breaker object, which prevents faults as fo ```java public class DefaultCircuitBreaker implements CircuitBreaker { - private final long timeout; - private final long retryTimePeriod; - private final RemoteService service; - long lastFailureTime; - private String lastFailureResponse; - int failureCount; - private final int failureThreshold; - private State state; - // Future time offset, in nanoseconds - private final long futureTime = 1_000_000_000_000L; - - /** - * Constructor to create an instance of Circuit Breaker. - * - * @param timeout Timeout for the API request. Not necessary for this simple example - * @param failureThreshold Number of failures we receive from the depended service before changing - * state to 'OPEN' - * @param retryTimePeriod Time period after which a new request is made to remote service for - * status check. - */ - DefaultCircuitBreaker(RemoteService serviceToCall, long timeout, int failureThreshold, - long retryTimePeriod) { - this.service = serviceToCall; - // We start in a closed state hoping that everything is fine - this.state = State.CLOSED; - this.failureThreshold = failureThreshold; - // Timeout for the API request. - // Used to break the calls made to remote resource if it exceeds the limit - this.timeout = timeout; - this.retryTimePeriod = retryTimePeriod; - //An absurd amount of time in future which basically indicates the last failure never happened - this.lastFailureTime = System.nanoTime() + futureTime; - this.failureCount = 0; - } - - // Reset everything to defaults - @Override - public void recordSuccess() { - this.failureCount = 0; - this.lastFailureTime = System.nanoTime() + futureTime; - this.state = State.CLOSED; - } - - @Override - public void recordFailure(String response) { - failureCount = failureCount + 1; - this.lastFailureTime = System.nanoTime(); - // Cache the failure response for returning on open state - this.lastFailureResponse = response; - } - - // Evaluate the current state based on failureThreshold, failureCount and lastFailureTime. - protected void evaluateState() { - if (failureCount >= failureThreshold) { //Then something is wrong with remote service - if ((System.nanoTime() - lastFailureTime) > retryTimePeriod) { - //We have waited long enough and should try checking if service is up - state = State.HALF_OPEN; - } else { - //Service would still probably be down - state = State.OPEN; - } - } else { - //Everything is working fine - state = State.CLOSED; + private final long timeout; + private final long retryTimePeriod; + private final RemoteService service; + long lastFailureTime; + private String lastFailureResponse; + int failureCount; + private final int failureThreshold; + private State state; + // Future time offset, in nanoseconds + private final long futureTime = 1_000_000_000_000L; + + /** + * Constructor to create an instance of Circuit Breaker. + * + * @param timeout Timeout for the API request. Not necessary for this simple example + * @param failureThreshold Number of failures we receive from the depended service before changing + * state to 'OPEN' + * @param retryTimePeriod Time period after which a new request is made to remote service for + * status check. + */ + DefaultCircuitBreaker(RemoteService serviceToCall, long timeout, int failureThreshold, + long retryTimePeriod) { + this.service = serviceToCall; + // We start in a closed state hoping that everything is fine + this.state = State.CLOSED; + this.failureThreshold = failureThreshold; + // Timeout for the API request. + // Used to break the calls made to remote resource if it exceeds the limit + this.timeout = timeout; + this.retryTimePeriod = retryTimePeriod; + //An absurd amount of time in future which basically indicates the last failure never happened + this.lastFailureTime = System.nanoTime() + futureTime; + this.failureCount = 0; } - } - - @Override - public String getState() { - evaluateState(); - return state.name(); - } - - /** - * Break the circuit beforehand if it is known service is down Or connect the circuit manually if - * service comes online before expected. - * - * @param state State at which circuit is in - */ - @Override - public void setState(State state) { - this.state = state; - switch (state) { - case OPEN -> { - this.failureCount = failureThreshold; + + // Reset everything to defaults + @Override + public void recordSuccess() { + this.failureCount = 0; + this.lastFailureTime = System.nanoTime() + futureTime; + this.state = State.CLOSED; + } + + @Override + public void recordFailure(String response) { + failureCount = failureCount + 1; this.lastFailureTime = System.nanoTime(); - } - case HALF_OPEN -> { - this.failureCount = failureThreshold; - this.lastFailureTime = System.nanoTime() - retryTimePeriod; - } - default -> this.failureCount = 0; + // Cache the failure response for returning on open state + this.lastFailureResponse = response; } - } - - /** - * Executes service call. - * - * @return Value from the remote resource, stale response or a custom exception - */ - @Override - public String attemptRequest() throws RemoteServiceException { - evaluateState(); - if (state == State.OPEN) { - // return cached response if the circuit is in OPEN state - return this.lastFailureResponse; - } else { - // Make the API request if the circuit is not OPEN - try { - //In a real application, this would be run in a thread and the timeout - //parameter of the circuit breaker would be utilized to know if service - //is working. Here, we simulate that based on server response itself - var response = service.call(); - // Yay!! the API responded fine. Let's reset everything. - recordSuccess(); - return response; - } catch (RemoteServiceException ex) { - recordFailure(ex.getMessage()); - throw ex; - } + + // Evaluate the current state based on failureThreshold, failureCount and lastFailureTime. + protected void evaluateState() { + if (failureCount >= failureThreshold) { //Then something is wrong with remote service + if ((System.nanoTime() - lastFailureTime) > retryTimePeriod) { + //We have waited long enough and should try checking if service is up + state = State.HALF_OPEN; + } else { + //Service would still probably be down + state = State.OPEN; + } + } else { + //Everything is working fine + state = State.CLOSED; + } + } + + @Override + public String getState() { + evaluateState(); + return state.name(); + } + + /** + * Break the circuit beforehand if it is known service is down Or connect the circuit manually if + * service comes online before expected. + * + * @param state State at which circuit is in + */ + @Override + public void setState(State state) { + this.state = state; + switch (state) { + case OPEN -> { + this.failureCount = failureThreshold; + this.lastFailureTime = System.nanoTime(); + } + case HALF_OPEN -> { + this.failureCount = failureThreshold; + this.lastFailureTime = System.nanoTime() - retryTimePeriod; + } + default -> this.failureCount = 0; + } + } + + /** + * Executes service call. + * + * @return Value from the remote resource, stale response or a custom exception + */ + @Override + public String attemptRequest() throws RemoteServiceException { + evaluateState(); + if (state == State.OPEN) { + // return cached response if the circuit is in OPEN state + return this.lastFailureResponse; + } else { + // Make the API request if the circuit is not OPEN + try { + //In a real application, this would be run in a thread and the timeout + //parameter of the circuit breaker would be utilized to know if service + //is working. Here, we simulate that based on server response itself + var response = service.call(); + // Yay!! the API responded fine. Let's reset everything. + recordSuccess(); + return response; + } catch (RemoteServiceException ex) { + recordFailure(ex.getMessage()); + throw ex; + } + } } - } } ``` diff --git a/client-session/README.md b/client-session/README.md index bd1fbc9fe4bf..a16eeca0348f 100644 --- a/client-session/README.md +++ b/client-session/README.md @@ -3,8 +3,8 @@ title: Client Session category: Behavioral language: en tags: - - Session management - - Web development + - Session management + - Web development --- ## Also known as @@ -21,17 +21,17 @@ application, ensuring a continuous and personalized user experience. Real-World Example > You're looking to create a data management app allowing users to send requests to the server to modify and make -> changes to data stored on their devices. These requests are small and the data is individual to each user, negating the -> need for a large scale database implementation. Using the client session pattern, you are able to handle multiple +> changes to data stored on their devices. These requests are small and the data is individual to each user, negating +> the need for a large scale database implementation. Using the client session pattern, you are able to handle multiple > concurrent requests, load balancing clients across different servers with ease due to servers remaining stateless. You -> also remove the need to store session IDs on the server side due to clients providing all the information that a server -> needs to perform their process. +> also remove the need to store session IDs on the server side due to clients providing all the information that a +> server needs to perform their process. In Plain words > Instead of storing information about the current client and the information being accessed on the server, it is -> maintained client side only. Client has to send session data with each request to the server and has to send an updated -> state back to the client, which is stored on the clients machine. The server doesn't have to store the client +> maintained client side only. Client has to send session data with each request to the server and has to send an +> updated state back to the client, which is stored on the clients machine. The server doesn't have to store the client > information. ([ref](https://dzone.com/articles/practical-php-patterns/practical-php-patterns-client)) **Programmatic Example** @@ -46,30 +46,30 @@ session information in every request helps the server identify the client and pr ```java public class App { - public static void main(String[] args) { - var server = new Server("localhost", 8080); - var session1 = server.getSession("Session1"); - var session2 = server.getSession("Session2"); - var request1 = new Request("Data1", session1); - var request2 = new Request("Data2", session2); - server.process(request1); - server.process(request2); - } + public static void main(String[] args) { + var server = new Server("localhost", 8080); + var session1 = server.getSession("Session1"); + var session2 = server.getSession("Session2"); + var request1 = new Request("Data1", session1); + var request2 = new Request("Data2", session2); + server.process(request1); + server.process(request2); + } } @Data @AllArgsConstructor public class Session { - /** - * Session id. - */ - private String id; + /** + * Session id. + */ + private String id; - /** - * Client name. - */ - private String clientName; + /** + * Client name. + */ + private String clientName; } @@ -77,9 +77,9 @@ public class Session { @AllArgsConstructor public class Request { - private String data; + private String data; - private Session session; + private Session session; } ``` diff --git a/collecting-parameter/README.md b/collecting-parameter/README.md index 34b8bf5450fd..7b68c99d5590 100644 --- a/collecting-parameter/README.md +++ b/collecting-parameter/README.md @@ -3,8 +3,8 @@ title: Collecting Parameter category: Behavioral language: en tag: - - Accumulation - - Generic + - Accumulation + - Generic --- ## Also known as @@ -55,33 +55,33 @@ import java.util.LinkedList; import java.util.Queue; public class App { - static PrinterQueue printerQueue = PrinterQueue.getInstance(); - - /** - * Program entry point. - * - * @param args command line args - */ - public static void main(String[] args) { + static PrinterQueue printerQueue = PrinterQueue.getInstance(); + + /** + * Program entry point. + * + * @param args command line args + */ + public static void main(String[] args) { /* Initialising the printer queue with jobs */ - printerQueue.addPrinterItem(new PrinterItem(PaperSizes.A4, 5, false, false)); - printerQueue.addPrinterItem(new PrinterItem(PaperSizes.A3, 2, false, false)); - printerQueue.addPrinterItem(new PrinterItem(PaperSizes.A2, 5, false, false)); + printerQueue.addPrinterItem(new PrinterItem(PaperSizes.A4, 5, false, false)); + printerQueue.addPrinterItem(new PrinterItem(PaperSizes.A3, 2, false, false)); + printerQueue.addPrinterItem(new PrinterItem(PaperSizes.A2, 5, false, false)); /* This variable is the collecting parameter. */ - var result = new LinkedList(); - - /* - * Using numerous sub-methods to collaboratively add information to the result collecting parameter - */ - addA4Papers(result); - addA3Papers(result); - addA2Papers(result); - } + var result = new LinkedList(); + + /* + * Using numerous sub-methods to collaboratively add information to the result collecting parameter + */ + addA4Papers(result); + addA3Papers(result); + addA2Papers(result); + } } ``` @@ -90,71 +90,75 @@ appropriate print jobs as per the policy described previously. The three policie ```java public class App { - static PrinterQueue printerQueue = PrinterQueue.getInstance(); - - /** - * Adds A4 document jobs to the collecting parameter according to some policy that can be whatever the client - * (the print center) wants. - * - * @param printerItemsCollection the collecting parameter - */ - public static void addA4Papers(Queue printerItemsCollection) { + static PrinterQueue printerQueue = PrinterQueue.getInstance(); + + /** + * Adds A4 document jobs to the collecting parameter according to some policy that can be whatever the client + * (the print center) wants. + * + * @param printerItemsCollection the collecting parameter + */ + public static void addA4Papers(Queue printerItemsCollection) { /* Iterate through the printer queue, and add A4 papers according to the correct policy to the collecting parameter, which is 'printerItemsCollection' in this case. */ - for (PrinterItem nextItem : printerQueue.getPrinterQueue()) { - if (nextItem.paperSize.equals(PaperSizes.A4)) { - var isColouredAndSingleSided = nextItem.isColour && !nextItem.isDoubleSided; - if (isColouredAndSingleSided) { - printerItemsCollection.add(nextItem); - } else if (!nextItem.isColour) { - printerItemsCollection.add(nextItem); + for (PrinterItem nextItem : printerQueue.getPrinterQueue()) { + if (nextItem.paperSize.equals(PaperSizes.A4)) { + var isColouredAndSingleSided = + nextItem.isColour && !nextItem.isDoubleSided; + if (isColouredAndSingleSided) { + printerItemsCollection.add(nextItem); + } else if (!nextItem.isColour) { + printerItemsCollection.add(nextItem); + } + } } - } } - } - - /** - * Adds A3 document jobs to the collecting parameter according to some policy that can be whatever the client - * (the print center) wants. The code is similar to the 'addA4Papers' method. The code can be changed to accommodate - * the wants of the client. - * - * @param printerItemsCollection the collecting parameter - */ - public static void addA3Papers(Queue printerItemsCollection) { - for (PrinterItem nextItem : printerQueue.getPrinterQueue()) { - if (nextItem.paperSize.equals(PaperSizes.A3)) { - - // Encoding the policy into a Boolean: the A3 paper cannot be coloured and double-sided at the same time - var isNotColouredAndSingleSided = !nextItem.isColour && !nextItem.isDoubleSided; - if (isNotColouredAndSingleSided) { - printerItemsCollection.add(nextItem); + + /** + * Adds A3 document jobs to the collecting parameter according to some policy that can be whatever the client + * (the print center) wants. The code is similar to the 'addA4Papers' method. The code can be changed to accommodate + * the wants of the client. + * + * @param printerItemsCollection the collecting parameter + */ + public static void addA3Papers(Queue printerItemsCollection) { + for (PrinterItem nextItem : printerQueue.getPrinterQueue()) { + if (nextItem.paperSize.equals(PaperSizes.A3)) { + + // Encoding the policy into a Boolean: the A3 paper cannot be coloured and double-sided at the same time + var isNotColouredAndSingleSided = + !nextItem.isColour && !nextItem.isDoubleSided; + if (isNotColouredAndSingleSided) { + printerItemsCollection.add(nextItem); + } + } } - } } - } - - /** - * Adds A2 document jobs to the collecting parameter according to some policy that can be whatever the client - * (the print center) wants. The code is similar to the 'addA4Papers' method. The code can be changed to accommodate - * the wants of the client. - * - * @param printerItemsCollection the collecting parameter - */ - public static void addA2Papers(Queue printerItemsCollection) { - for (PrinterItem nextItem : printerQueue.getPrinterQueue()) { - if (nextItem.paperSize.equals(PaperSizes.A2)) { - - // Encoding the policy into a Boolean: the A2 paper must be single page, single-sided, and non-coloured. - var isNotColouredSingleSidedAndOnePage = nextItem.pageCount == 1 && !nextItem.isDoubleSided - && !nextItem.isColour; - if (isNotColouredSingleSidedAndOnePage) { - printerItemsCollection.add(nextItem); + + /** + * Adds A2 document jobs to the collecting parameter according to some policy that can be whatever the client + * (the print center) wants. The code is similar to the 'addA4Papers' method. The code can be changed to accommodate + * the wants of the client. + * + * @param printerItemsCollection the collecting parameter + */ + public static void addA2Papers(Queue printerItemsCollection) { + for (PrinterItem nextItem : printerQueue.getPrinterQueue()) { + if (nextItem.paperSize.equals(PaperSizes.A2)) { + + // Encoding the policy into a Boolean: the A2 paper must be single page, single-sided, and non-coloured. + var isNotColouredSingleSidedAndOnePage = + nextItem.pageCount == 1 && + !nextItem.isDoubleSided + && !nextItem.isColour; + if (isNotColouredSingleSidedAndOnePage) { + printerItemsCollection.add(nextItem); + } + } } - } } - } } ``` From 7c1889b8e5800b60013a96d567b64df51dd62ae1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 30 Mar 2024 08:34:54 +0200 Subject: [PATCH 022/580] refactor: update layers parent, reformat code, update license headers --- .editorconfig | 25 ++ adapter/pom.xml | 2 +- .../java/com/iluwatar/corruption/App.java | 3 +- .../com/iluwatar/corruption/package-info.java | 24 ++ .../system/AntiCorruptionLayer.java | 24 ++ .../iluwatar/corruption/system/DataStore.java | 24 ++ .../corruption/system/ShopException.java | 24 ++ .../corruption/system/legacy/LegacyOrder.java | 24 ++ .../corruption/system/legacy/LegacyShop.java | 24 ++ .../corruption/system/legacy/LegacyStore.java | 24 ++ .../corruption/system/modern/Customer.java | 24 ++ .../corruption/system/modern/ModernOrder.java | 24 ++ .../corruption/system/modern/ModernShop.java | 24 ++ .../corruption/system/modern/ModernStore.java | 24 ++ .../corruption/system/modern/Shipment.java | 24 ++ .../system/AntiCorruptionLayerTest.java | 24 ++ .../iluwatar/client/session/ServerTest.java | 24 ++ component/pom.xml | 26 ++ .../main/java/com/iluwatar/component/App.java | 24 ++ .../com/iluwatar/component/GameObject.java | 24 ++ .../graphiccomponent/GraphicComponent.java | 24 ++ .../ObjectGraphicComponent.java | 24 ++ .../inputcomponent/DemoInputComponent.java | 24 ++ .../inputcomponent/InputComponent.java | 24 ++ .../inputcomponent/PlayerInputComponent.java | 24 ++ .../ObjectPhysicComponent.java | 24 ++ .../physiccomponent/PhysicComponent.java | 24 ++ .../java/com/iluwatar/component/AppTest.java | 24 ++ .../iluwatar/component/GameObjectTest.java | 24 ++ crtp/src/test/java/crtp/FightTest.java | 24 ++ .../sourcing/processor/EventJournal.java | 24 ++ .../java/com/iluwatar/gateway/Gateway.java | 24 ++ .../com/iluwatar/gateway/GatewayFactory.java | 24 ++ .../java/com/iluwatar/gateway/AppTest.java | 24 ++ .../iluwatar/gateway/ServiceFactoryTest.java | 24 ++ .../java/com/iluwatar/health/check/App.java | 24 ++ .../check/AsynchronousHealthChecker.java | 24 ++ .../health/check/CpuHealthIndicator.java | 24 ++ .../health/check/CustomHealthIndicator.java | 24 ++ .../DatabaseTransactionHealthIndicator.java | 24 ++ .../GarbageCollectionHealthIndicator.java | 24 ++ .../iluwatar/health/check/HealthCheck.java | 24 ++ .../HealthCheckInterruptedException.java | 24 ++ .../health/check/HealthCheckRepository.java | 24 ++ .../health/check/MemoryHealthIndicator.java | 24 ++ .../iluwatar/health/check/RetryConfig.java | 24 ++ health-check/src/test/java/AppTest.java | 24 ++ .../java/AsynchronousHealthCheckerTest.java | 24 ++ .../src/test/java/CpuHealthIndicatorTest.java | 24 ++ .../test/java/CustomHealthIndicatorTest.java | 24 ++ ...atabaseTransactionHealthIndicatorTest.java | 24 ++ .../GarbageCollectionHealthIndicatorTest.java | 24 ++ .../test/java/HealthCheckRepositoryTest.java | 24 ++ .../java/HealthEndpointIntegrationTest.java | 24 ++ .../test/java/MemoryHealthIndicatorTest.java | 24 ++ .../src/test/java/RetryConfigTest.java | 24 ++ .../hexagonal/banking/MongoBankTest.java | 24 ++ layers/pom.xml | 14 +- .../main/java/com/iluwatar/layers/Runner.java | 126 +++++---- .../com/iluwatar/layers/app/LayersApp.java | 40 ++- layers/src/main/java/dto/CakeInfo.java | 65 ++--- layers/src/main/java/dto/CakeLayerInfo.java | 47 ++-- layers/src/main/java/dto/CakeToppingInfo.java | 55 ++-- layers/src/main/java/entity/Cake.java | 79 +++--- layers/src/main/java/entity/CakeLayer.java | 44 +-- layers/src/main/java/entity/CakeTopping.java | 44 +-- .../java/exception/CakeBakingException.java | 13 +- .../main/java/service/CakeBakingService.java | 58 ++-- .../java/service/CakeBakingServiceImpl.java | 265 +++++++++--------- layers/src/main/java/view/CakeViewImpl.java | 17 +- layers/src/main/java/view/View.java | 3 +- .../iluwatar/layers/app/LayersAppTests.java | 47 +++- .../com/iluwatar/layers/entity/CakeTest.java | 16 +- .../exception/CakeBakingExceptionTest.java | 32 ++- .../service/CakeBakingServiceImplTest.java | 34 +-- .../layers/view/CakeViewImplTest.java | 17 +- log-aggregation/pom.xml | 26 ++ .../java/com/iluwatar/logaggregation/App.java | 2 +- .../logaggregation/CentralLogStore.java | 2 +- .../logaggregation/LogAggregator.java | 2 +- .../com/iluwatar/logaggregation/LogEntry.java | 2 +- .../com/iluwatar/logaggregation/LogLevel.java | 2 +- .../iluwatar/logaggregation/LogProducer.java | 2 +- .../logaggregation/LogAggregatorTest.java | 2 +- .../com/iluwatar/model/view/intent/App.java | 4 +- .../model/view/intent/CalculatorModel.java | 24 ++ .../model/view/intent/CalculatorView.java | 24 ++ .../view/intent/CalculatorViewModel.java | 24 ++ .../actions/AdditionCalculatorAction.java | 24 ++ .../view/intent/actions/CalculatorAction.java | 24 ++ .../actions/DivisionCalculatorAction.java | 24 ++ .../MultiplicationCalculatorAction.java | 24 ++ .../actions/SetVariableCalculatorAction.java | 24 ++ .../actions/SubtractionCalculatorAction.java | 24 ++ .../view/intent/actions/package-info.java | 24 ++ .../model/view/intent/package-info.java | 24 ++ .../view/intent/CalculatorViewModelTest.java | 24 ++ notification/pom.xml | 26 ++ .../src/main/java/com/iluwatar/App.java | 24 ++ .../java/com/iluwatar/DataTransferObject.java | 24 ++ .../main/java/com/iluwatar/Notification.java | 24 ++ .../java/com/iluwatar/NotificationError.java | 24 ++ .../java/com/iluwatar/RegisterWorker.java | 24 ++ .../java/com/iluwatar/RegisterWorkerDto.java | 24 ++ .../java/com/iluwatar/RegisterWorkerForm.java | 24 ++ .../com/iluwatar/RegisterWorkerService.java | 24 ++ .../main/java/com/iluwatar/ServerCommand.java | 24 ++ .../src/test/java/com/iluwatar/AppTest.java | 24 ++ .../com/iluwatar/RegisterWorkerFormTest.java | 24 ++ .../java/com/iluwatar/RegisterWorkerTest.java | 24 ++ .../java/com/iluwatar/api/UpdateService.java | 24 ++ .../exception/ApplicationException.java | 24 ++ .../main/java/com/iluwatar/model/Card.java | 24 ++ .../iluwatar/repository/JpaRepository.java | 24 ++ .../iluwatar/service/CardUpdateService.java | 24 ++ .../java/com/iluwatar/OptimisticLockTest.java | 24 ++ serialized-entity/pom.xml | 26 ++ single-table-inheritance/pom.xml | 26 ++ .../com/iluwatar/SingleTableInheritance.java | 24 ++ .../main/java/com/iluwatar/entity/Car.java | 24 ++ .../java/com/iluwatar/entity/Freighter.java | 24 ++ .../com/iluwatar/entity/PassengerVehicle.java | 24 ++ .../main/java/com/iluwatar/entity/Train.java | 24 ++ .../com/iluwatar/entity/TransportVehicle.java | 24 ++ .../main/java/com/iluwatar/entity/Truck.java | 24 ++ .../java/com/iluwatar/entity/Vehicle.java | 24 ++ .../repository/VehicleRepository.java | 24 ++ .../com/iluwatar/service/VehicleService.java | 24 ++ .../singleton/BillPughImplementationTest.java | 24 ++ .../iluwatar/AbstractThreadLocalExample.java | 24 ++ .../java/com/iluwatar/WithThreadLocal.java | 24 ++ .../java/com/iluwatar/WithoutThreadLocal.java | 24 ++ .../src/test/java/ThreadLocalTest.java | 24 ++ 133 files changed, 3094 insertions(+), 452 deletions(-) diff --git a/.editorconfig b/.editorconfig index 4095d32cb5b9..1e7144030a73 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,3 +1,28 @@ +# +# This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). +# +# The MIT License +# Copyright © 2014-2022 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. +# + root = true [*] diff --git a/adapter/pom.xml b/adapter/pom.xml index 9307c255d09f..d54cbd048708 100644 --- a/adapter/pom.xml +++ b/adapter/pom.xml @@ -4,7 +4,7 @@ This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). The MIT License - Copyright © 2014-2023 Ilkka Seppälä + Copyright © 2014-2022 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 diff --git a/anti-corruption-layer/src/main/java/com/iluwatar/corruption/App.java b/anti-corruption-layer/src/main/java/com/iluwatar/corruption/App.java index 3f53c54c0f60..ce2dbffd6f9a 100644 --- a/anti-corruption-layer/src/main/java/com/iluwatar/corruption/App.java +++ b/anti-corruption-layer/src/main/java/com/iluwatar/corruption/App.java @@ -2,7 +2,7 @@ * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). * * The MIT License - * Copyright © 2014-2023 Ilkka Seppälä + * Copyright © 2014-2022 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 @@ -22,7 +22,6 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ - package com.iluwatar.corruption; import org.springframework.boot.SpringApplication; diff --git a/anti-corruption-layer/src/main/java/com/iluwatar/corruption/package-info.java b/anti-corruption-layer/src/main/java/com/iluwatar/corruption/package-info.java index 87b7f7d00a0c..c8f72fca49fd 100644 --- a/anti-corruption-layer/src/main/java/com/iluwatar/corruption/package-info.java +++ b/anti-corruption-layer/src/main/java/com/iluwatar/corruption/package-info.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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. + */ /** * Context and problem * Most applications rely on other systems for some data or functionality. diff --git a/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/AntiCorruptionLayer.java b/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/AntiCorruptionLayer.java index 9f693cef8873..fae658ee5bac 100644 --- a/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/AntiCorruptionLayer.java +++ b/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/AntiCorruptionLayer.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.corruption.system; import com.iluwatar.corruption.system.legacy.LegacyShop; diff --git a/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/DataStore.java b/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/DataStore.java index f7424980d9d9..e9fdaa14ec1f 100644 --- a/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/DataStore.java +++ b/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/DataStore.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.corruption.system; import java.util.HashMap; diff --git a/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/ShopException.java b/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/ShopException.java index 843385c02685..103fcfccd9e7 100644 --- a/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/ShopException.java +++ b/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/ShopException.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.corruption.system; /** diff --git a/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/legacy/LegacyOrder.java b/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/legacy/LegacyOrder.java index a114302eb294..2481d19c8212 100644 --- a/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/legacy/LegacyOrder.java +++ b/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/legacy/LegacyOrder.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.corruption.system.legacy; import lombok.AllArgsConstructor; diff --git a/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/legacy/LegacyShop.java b/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/legacy/LegacyShop.java index fe5a88be8f9a..b74eb1c29718 100644 --- a/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/legacy/LegacyShop.java +++ b/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/legacy/LegacyShop.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.corruption.system.legacy; import java.util.Optional; diff --git a/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/legacy/LegacyStore.java b/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/legacy/LegacyStore.java index 85d0f64d6fb8..b29b71d87e5c 100644 --- a/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/legacy/LegacyStore.java +++ b/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/legacy/LegacyStore.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.corruption.system.legacy; import com.iluwatar.corruption.system.DataStore; diff --git a/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/modern/Customer.java b/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/modern/Customer.java index d76792c48fd9..dd335141579d 100644 --- a/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/modern/Customer.java +++ b/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/modern/Customer.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.corruption.system.modern; import lombok.AllArgsConstructor; diff --git a/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/modern/ModernOrder.java b/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/modern/ModernOrder.java index 6a561f361a3e..94c4f57b9a9c 100644 --- a/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/modern/ModernOrder.java +++ b/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/modern/ModernOrder.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.corruption.system.modern; import lombok.AllArgsConstructor; diff --git a/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/modern/ModernShop.java b/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/modern/ModernShop.java index 9cb5898684d6..45cd355bea87 100644 --- a/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/modern/ModernShop.java +++ b/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/modern/ModernShop.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.corruption.system.modern; import com.iluwatar.corruption.system.AntiCorruptionLayer; diff --git a/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/modern/ModernStore.java b/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/modern/ModernStore.java index 8ccc00a958d6..4ec4d7dbcfc0 100644 --- a/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/modern/ModernStore.java +++ b/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/modern/ModernStore.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.corruption.system.modern; import com.iluwatar.corruption.system.DataStore; diff --git a/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/modern/Shipment.java b/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/modern/Shipment.java index d4570f47a981..292c0d8e3771 100644 --- a/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/modern/Shipment.java +++ b/anti-corruption-layer/src/main/java/com/iluwatar/corruption/system/modern/Shipment.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.corruption.system.modern; import lombok.AllArgsConstructor; diff --git a/anti-corruption-layer/src/test/java/com/iluwatar/corruption/system/AntiCorruptionLayerTest.java b/anti-corruption-layer/src/test/java/com/iluwatar/corruption/system/AntiCorruptionLayerTest.java index 0883c8511f6b..ba24c89811db 100644 --- a/anti-corruption-layer/src/test/java/com/iluwatar/corruption/system/AntiCorruptionLayerTest.java +++ b/anti-corruption-layer/src/test/java/com/iluwatar/corruption/system/AntiCorruptionLayerTest.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.corruption.system; import com.iluwatar.corruption.system.legacy.LegacyOrder; diff --git a/client-session/src/test/java/com/iluwatar/client/session/ServerTest.java b/client-session/src/test/java/com/iluwatar/client/session/ServerTest.java index dc09441f0a6a..72f960332a2f 100644 --- a/client-session/src/test/java/com/iluwatar/client/session/ServerTest.java +++ b/client-session/src/test/java/com/iluwatar/client/session/ServerTest.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.client.session; import org.junit.jupiter.api.Test; diff --git a/component/pom.xml b/component/pom.xml index d416ae4f53df..e71b1cc59716 100644 --- a/component/pom.xml +++ b/component/pom.xml @@ -1,4 +1,30 @@ + diff --git a/component/src/main/java/com/iluwatar/component/App.java b/component/src/main/java/com/iluwatar/component/App.java index 12f19a691245..e6e005a1b553 100644 --- a/component/src/main/java/com/iluwatar/component/App.java +++ b/component/src/main/java/com/iluwatar/component/App.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.component; import java.awt.event.KeyEvent; diff --git a/component/src/main/java/com/iluwatar/component/GameObject.java b/component/src/main/java/com/iluwatar/component/GameObject.java index 10410c18e160..c67970d0625f 100644 --- a/component/src/main/java/com/iluwatar/component/GameObject.java +++ b/component/src/main/java/com/iluwatar/component/GameObject.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.component; import com.iluwatar.component.component.graphiccomponent.GraphicComponent; diff --git a/component/src/main/java/com/iluwatar/component/component/graphiccomponent/GraphicComponent.java b/component/src/main/java/com/iluwatar/component/component/graphiccomponent/GraphicComponent.java index 26a80cc7a514..f8e1f7094cbb 100644 --- a/component/src/main/java/com/iluwatar/component/component/graphiccomponent/GraphicComponent.java +++ b/component/src/main/java/com/iluwatar/component/component/graphiccomponent/GraphicComponent.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.component.component.graphiccomponent; import com.iluwatar.component.GameObject; diff --git a/component/src/main/java/com/iluwatar/component/component/graphiccomponent/ObjectGraphicComponent.java b/component/src/main/java/com/iluwatar/component/component/graphiccomponent/ObjectGraphicComponent.java index b147a916d78b..fc260b45ebfb 100644 --- a/component/src/main/java/com/iluwatar/component/component/graphiccomponent/ObjectGraphicComponent.java +++ b/component/src/main/java/com/iluwatar/component/component/graphiccomponent/ObjectGraphicComponent.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.component.component.graphiccomponent; import com.iluwatar.component.GameObject; diff --git a/component/src/main/java/com/iluwatar/component/component/inputcomponent/DemoInputComponent.java b/component/src/main/java/com/iluwatar/component/component/inputcomponent/DemoInputComponent.java index 34e0e1202a0b..ccf05738ef1d 100644 --- a/component/src/main/java/com/iluwatar/component/component/inputcomponent/DemoInputComponent.java +++ b/component/src/main/java/com/iluwatar/component/component/inputcomponent/DemoInputComponent.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.component.component.inputcomponent; import com.iluwatar.component.GameObject; diff --git a/component/src/main/java/com/iluwatar/component/component/inputcomponent/InputComponent.java b/component/src/main/java/com/iluwatar/component/component/inputcomponent/InputComponent.java index a597086039a0..3ab30c148cdc 100644 --- a/component/src/main/java/com/iluwatar/component/component/inputcomponent/InputComponent.java +++ b/component/src/main/java/com/iluwatar/component/component/inputcomponent/InputComponent.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.component.component.inputcomponent; import com.iluwatar.component.GameObject; diff --git a/component/src/main/java/com/iluwatar/component/component/inputcomponent/PlayerInputComponent.java b/component/src/main/java/com/iluwatar/component/component/inputcomponent/PlayerInputComponent.java index c2048b6198e7..eb9e9d800059 100644 --- a/component/src/main/java/com/iluwatar/component/component/inputcomponent/PlayerInputComponent.java +++ b/component/src/main/java/com/iluwatar/component/component/inputcomponent/PlayerInputComponent.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.component.component.inputcomponent; import com.iluwatar.component.GameObject; diff --git a/component/src/main/java/com/iluwatar/component/component/physiccomponent/ObjectPhysicComponent.java b/component/src/main/java/com/iluwatar/component/component/physiccomponent/ObjectPhysicComponent.java index 2fc4f53a7dbf..b8d880138534 100644 --- a/component/src/main/java/com/iluwatar/component/component/physiccomponent/ObjectPhysicComponent.java +++ b/component/src/main/java/com/iluwatar/component/component/physiccomponent/ObjectPhysicComponent.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.component.component.physiccomponent; import com.iluwatar.component.GameObject; diff --git a/component/src/main/java/com/iluwatar/component/component/physiccomponent/PhysicComponent.java b/component/src/main/java/com/iluwatar/component/component/physiccomponent/PhysicComponent.java index d7f55153f401..25e2dfd40b8b 100644 --- a/component/src/main/java/com/iluwatar/component/component/physiccomponent/PhysicComponent.java +++ b/component/src/main/java/com/iluwatar/component/component/physiccomponent/PhysicComponent.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.component.component.physiccomponent; import com.iluwatar.component.GameObject; diff --git a/component/src/test/java/com/iluwatar/component/AppTest.java b/component/src/test/java/com/iluwatar/component/AppTest.java index 35b5f243f51a..6fa191804c84 100644 --- a/component/src/test/java/com/iluwatar/component/AppTest.java +++ b/component/src/test/java/com/iluwatar/component/AppTest.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.component; import org.junit.jupiter.api.Test; diff --git a/component/src/test/java/com/iluwatar/component/GameObjectTest.java b/component/src/test/java/com/iluwatar/component/GameObjectTest.java index 68a35321255e..66b6c6a5523a 100644 --- a/component/src/test/java/com/iluwatar/component/GameObjectTest.java +++ b/component/src/test/java/com/iluwatar/component/GameObjectTest.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.component; import org.junit.jupiter.api.BeforeEach; diff --git a/crtp/src/test/java/crtp/FightTest.java b/crtp/src/test/java/crtp/FightTest.java index b1d699e33385..9c6a2ee61d93 100644 --- a/crtp/src/test/java/crtp/FightTest.java +++ b/crtp/src/test/java/crtp/FightTest.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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 crtp; import lombok.extern.slf4j.Slf4j; diff --git a/event-sourcing/src/main/java/com/iluwatar/event/sourcing/processor/EventJournal.java b/event-sourcing/src/main/java/com/iluwatar/event/sourcing/processor/EventJournal.java index 49bc89582a13..5c78da1d8125 100644 --- a/event-sourcing/src/main/java/com/iluwatar/event/sourcing/processor/EventJournal.java +++ b/event-sourcing/src/main/java/com/iluwatar/event/sourcing/processor/EventJournal.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.event.sourcing.processor; import com.iluwatar.event.sourcing.event.DomainEvent; diff --git a/gateway/src/main/java/com/iluwatar/gateway/Gateway.java b/gateway/src/main/java/com/iluwatar/gateway/Gateway.java index 912f78b4737b..40dc473d553e 100644 --- a/gateway/src/main/java/com/iluwatar/gateway/Gateway.java +++ b/gateway/src/main/java/com/iluwatar/gateway/Gateway.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.gateway; /** diff --git a/gateway/src/main/java/com/iluwatar/gateway/GatewayFactory.java b/gateway/src/main/java/com/iluwatar/gateway/GatewayFactory.java index 0a76368a349c..0f8c12ede17f 100644 --- a/gateway/src/main/java/com/iluwatar/gateway/GatewayFactory.java +++ b/gateway/src/main/java/com/iluwatar/gateway/GatewayFactory.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.gateway; import java.util.HashMap; diff --git a/gateway/src/test/java/com/iluwatar/gateway/AppTest.java b/gateway/src/test/java/com/iluwatar/gateway/AppTest.java index ad75d517576e..76dc45e537b0 100644 --- a/gateway/src/test/java/com/iluwatar/gateway/AppTest.java +++ b/gateway/src/test/java/com/iluwatar/gateway/AppTest.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.gateway; import org.junit.Before; diff --git a/gateway/src/test/java/com/iluwatar/gateway/ServiceFactoryTest.java b/gateway/src/test/java/com/iluwatar/gateway/ServiceFactoryTest.java index f6dd640f31b9..2e569f4b270f 100644 --- a/gateway/src/test/java/com/iluwatar/gateway/ServiceFactoryTest.java +++ b/gateway/src/test/java/com/iluwatar/gateway/ServiceFactoryTest.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.gateway; diff --git a/health-check/src/main/java/com/iluwatar/health/check/App.java b/health-check/src/main/java/com/iluwatar/health/check/App.java index 283f028ff6a5..c8150c9cde95 100644 --- a/health-check/src/main/java/com/iluwatar/health/check/App.java +++ b/health-check/src/main/java/com/iluwatar/health/check/App.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.health.check; import org.springframework.boot.SpringApplication; diff --git a/health-check/src/main/java/com/iluwatar/health/check/AsynchronousHealthChecker.java b/health-check/src/main/java/com/iluwatar/health/check/AsynchronousHealthChecker.java index 18f44ef38c5b..fcc4348e5a4c 100644 --- a/health-check/src/main/java/com/iluwatar/health/check/AsynchronousHealthChecker.java +++ b/health-check/src/main/java/com/iluwatar/health/check/AsynchronousHealthChecker.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.health.check; import jakarta.annotation.PreDestroy; diff --git a/health-check/src/main/java/com/iluwatar/health/check/CpuHealthIndicator.java b/health-check/src/main/java/com/iluwatar/health/check/CpuHealthIndicator.java index 5c9bc2dd7e7e..b2f3ab1b349e 100644 --- a/health-check/src/main/java/com/iluwatar/health/check/CpuHealthIndicator.java +++ b/health-check/src/main/java/com/iluwatar/health/check/CpuHealthIndicator.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.health.check; import jakarta.annotation.PostConstruct; diff --git a/health-check/src/main/java/com/iluwatar/health/check/CustomHealthIndicator.java b/health-check/src/main/java/com/iluwatar/health/check/CustomHealthIndicator.java index 94ba1cabc3d6..5f12325cb73e 100644 --- a/health-check/src/main/java/com/iluwatar/health/check/CustomHealthIndicator.java +++ b/health-check/src/main/java/com/iluwatar/health/check/CustomHealthIndicator.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.health.check; import java.util.concurrent.CompletableFuture; diff --git a/health-check/src/main/java/com/iluwatar/health/check/DatabaseTransactionHealthIndicator.java b/health-check/src/main/java/com/iluwatar/health/check/DatabaseTransactionHealthIndicator.java index cf26b3b76e26..5818fecf2b87 100644 --- a/health-check/src/main/java/com/iluwatar/health/check/DatabaseTransactionHealthIndicator.java +++ b/health-check/src/main/java/com/iluwatar/health/check/DatabaseTransactionHealthIndicator.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.health.check; import java.util.concurrent.ExecutionException; diff --git a/health-check/src/main/java/com/iluwatar/health/check/GarbageCollectionHealthIndicator.java b/health-check/src/main/java/com/iluwatar/health/check/GarbageCollectionHealthIndicator.java index f81df2b36084..2323bf9de6ae 100644 --- a/health-check/src/main/java/com/iluwatar/health/check/GarbageCollectionHealthIndicator.java +++ b/health-check/src/main/java/com/iluwatar/health/check/GarbageCollectionHealthIndicator.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.health.check; import java.lang.management.GarbageCollectorMXBean; diff --git a/health-check/src/main/java/com/iluwatar/health/check/HealthCheck.java b/health-check/src/main/java/com/iluwatar/health/check/HealthCheck.java index 528753ee035a..44dc5d5347f6 100644 --- a/health-check/src/main/java/com/iluwatar/health/check/HealthCheck.java +++ b/health-check/src/main/java/com/iluwatar/health/check/HealthCheck.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.health.check; import jakarta.persistence.Column; diff --git a/health-check/src/main/java/com/iluwatar/health/check/HealthCheckInterruptedException.java b/health-check/src/main/java/com/iluwatar/health/check/HealthCheckInterruptedException.java index d20e80b8734f..486a381f2756 100644 --- a/health-check/src/main/java/com/iluwatar/health/check/HealthCheckInterruptedException.java +++ b/health-check/src/main/java/com/iluwatar/health/check/HealthCheckInterruptedException.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.health.check; /** diff --git a/health-check/src/main/java/com/iluwatar/health/check/HealthCheckRepository.java b/health-check/src/main/java/com/iluwatar/health/check/HealthCheckRepository.java index 272cf46b2159..462b7b76b5eb 100644 --- a/health-check/src/main/java/com/iluwatar/health/check/HealthCheckRepository.java +++ b/health-check/src/main/java/com/iluwatar/health/check/HealthCheckRepository.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.health.check; import jakarta.persistence.EntityManager; diff --git a/health-check/src/main/java/com/iluwatar/health/check/MemoryHealthIndicator.java b/health-check/src/main/java/com/iluwatar/health/check/MemoryHealthIndicator.java index 5483dfadbb18..399d57db40bb 100644 --- a/health-check/src/main/java/com/iluwatar/health/check/MemoryHealthIndicator.java +++ b/health-check/src/main/java/com/iluwatar/health/check/MemoryHealthIndicator.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.health.check; import java.lang.management.ManagementFactory; diff --git a/health-check/src/main/java/com/iluwatar/health/check/RetryConfig.java b/health-check/src/main/java/com/iluwatar/health/check/RetryConfig.java index 0a0ba5d27f06..2fe5389dd34a 100644 --- a/health-check/src/main/java/com/iluwatar/health/check/RetryConfig.java +++ b/health-check/src/main/java/com/iluwatar/health/check/RetryConfig.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.health.check; import org.springframework.beans.factory.annotation.Value; diff --git a/health-check/src/test/java/AppTest.java b/health-check/src/test/java/AppTest.java index 038e1be1a6c7..c9cd78366461 100644 --- a/health-check/src/test/java/AppTest.java +++ b/health-check/src/test/java/AppTest.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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 static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import com.iluwatar.health.check.App; diff --git a/health-check/src/test/java/AsynchronousHealthCheckerTest.java b/health-check/src/test/java/AsynchronousHealthCheckerTest.java index b7aa8943cef2..dd6620595b74 100644 --- a/health-check/src/test/java/AsynchronousHealthCheckerTest.java +++ b/health-check/src/test/java/AsynchronousHealthCheckerTest.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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 static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.when; diff --git a/health-check/src/test/java/CpuHealthIndicatorTest.java b/health-check/src/test/java/CpuHealthIndicatorTest.java index 25513e861517..795ab454b898 100644 --- a/health-check/src/test/java/CpuHealthIndicatorTest.java +++ b/health-check/src/test/java/CpuHealthIndicatorTest.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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 static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.when; diff --git a/health-check/src/test/java/CustomHealthIndicatorTest.java b/health-check/src/test/java/CustomHealthIndicatorTest.java index a2b3ffc9e756..6f567809ffa6 100644 --- a/health-check/src/test/java/CustomHealthIndicatorTest.java +++ b/health-check/src/test/java/CustomHealthIndicatorTest.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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 static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.*; diff --git a/health-check/src/test/java/DatabaseTransactionHealthIndicatorTest.java b/health-check/src/test/java/DatabaseTransactionHealthIndicatorTest.java index 7bb87ecab234..a5f861449296 100644 --- a/health-check/src/test/java/DatabaseTransactionHealthIndicatorTest.java +++ b/health-check/src/test/java/DatabaseTransactionHealthIndicatorTest.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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 static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; diff --git a/health-check/src/test/java/GarbageCollectionHealthIndicatorTest.java b/health-check/src/test/java/GarbageCollectionHealthIndicatorTest.java index 04ad5ae7da8f..1c770f87ee53 100644 --- a/health-check/src/test/java/GarbageCollectionHealthIndicatorTest.java +++ b/health-check/src/test/java/GarbageCollectionHealthIndicatorTest.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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 static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; diff --git a/health-check/src/test/java/HealthCheckRepositoryTest.java b/health-check/src/test/java/HealthCheckRepositoryTest.java index 8eb791438db8..5c77f4e3efd7 100644 --- a/health-check/src/test/java/HealthCheckRepositoryTest.java +++ b/health-check/src/test/java/HealthCheckRepositoryTest.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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 static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; diff --git a/health-check/src/test/java/HealthEndpointIntegrationTest.java b/health-check/src/test/java/HealthEndpointIntegrationTest.java index 58fecb546ea6..8ca4545380bb 100644 --- a/health-check/src/test/java/HealthEndpointIntegrationTest.java +++ b/health-check/src/test/java/HealthEndpointIntegrationTest.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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 static io.restassured.RestAssured.given; import static org.hamcrest.Matchers.equalTo; diff --git a/health-check/src/test/java/MemoryHealthIndicatorTest.java b/health-check/src/test/java/MemoryHealthIndicatorTest.java index a8424ea04943..1df6a5f3e98a 100644 --- a/health-check/src/test/java/MemoryHealthIndicatorTest.java +++ b/health-check/src/test/java/MemoryHealthIndicatorTest.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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 static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; diff --git a/health-check/src/test/java/RetryConfigTest.java b/health-check/src/test/java/RetryConfigTest.java index 483bd00ab3a6..5869b5944e95 100644 --- a/health-check/src/test/java/RetryConfigTest.java +++ b/health-check/src/test/java/RetryConfigTest.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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 static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/banking/MongoBankTest.java b/hexagonal/src/test/java/com/iluwatar/hexagonal/banking/MongoBankTest.java index 30b10ed1d60c..532b909c5b47 100644 --- a/hexagonal/src/test/java/com/iluwatar/hexagonal/banking/MongoBankTest.java +++ b/hexagonal/src/test/java/com/iluwatar/hexagonal/banking/MongoBankTest.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.hexagonal.banking; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/layers/pom.xml b/layers/pom.xml index 6a769e08cc26..54ba28667b37 100644 --- a/layers/pom.xml +++ b/layers/pom.xml @@ -1,8 +1,11 @@ + THE SOFTWARE. + +--> 4.0.0 - org.springframework.boot - spring-boot-starter-parent - 3.0.2 - + com.iluwatar + java-design-patterns + 1.26.0-SNAPSHOT com.iluwatar layers diff --git a/layers/src/main/java/com/iluwatar/layers/Runner.java b/layers/src/main/java/com/iluwatar/layers/Runner.java index 6acfca8b7d1c..5e2ce2d8d2fe 100644 --- a/layers/src/main/java/com/iluwatar/layers/Runner.java +++ b/layers/src/main/java/com/iluwatar/layers/Runner.java @@ -1,68 +1,98 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.layers; import dto.CakeInfo; import dto.CakeLayerInfo; import dto.CakeToppingInfo; import exception.CakeBakingException; +import java.util.List; import lombok.extern.slf4j.Slf4j; -import service.CakeBakingService; -import view.CakeViewImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; +import service.CakeBakingService; +import view.CakeViewImpl; -import java.util.List; - +/** + * The Runner class is the entry point of the application. + * It implements CommandLineRunner, which means it will execute the run method after the application context is loaded. + * + *

The Runner class is responsible for initializing the cake baking service with sample data and creating a view to render the cakes. + * It uses the CakeBakingService to save new layers and toppings and to bake new cakes. + * It also handles exceptions that might occur during the cake baking process.

+ */ @Component @Slf4j public class Runner implements CommandLineRunner { - private final CakeBakingService cakeBakingService; - public static final String STRAWBERRY = "strawberry"; + private final CakeBakingService cakeBakingService; + public static final String STRAWBERRY = "strawberry"; - @Autowired - public Runner(CakeBakingService cakeBakingService) { - this.cakeBakingService = cakeBakingService; - } - @Override - public void run(String... args) { - //initialize sample data - initializeData(); - // create view and render it - var cakeView = new CakeViewImpl(cakeBakingService); - cakeView.render(); - } + @Autowired + public Runner(CakeBakingService cakeBakingService) { + this.cakeBakingService = cakeBakingService; + } - /** - * Initializes the example data. - */ - private void initializeData() { - cakeBakingService.saveNewLayer(new CakeLayerInfo("chocolate", 1200)); - cakeBakingService.saveNewLayer(new CakeLayerInfo("banana", 900)); - cakeBakingService.saveNewLayer(new CakeLayerInfo(STRAWBERRY, 950)); - cakeBakingService.saveNewLayer(new CakeLayerInfo("lemon", 950)); - cakeBakingService.saveNewLayer(new CakeLayerInfo("vanilla", 950)); - cakeBakingService.saveNewLayer(new CakeLayerInfo(STRAWBERRY, 950)); + @Override + public void run(String... args) { + //initialize sample data + initializeData(); + // create view and render it + var cakeView = new CakeViewImpl(cakeBakingService); + cakeView.render(); + } - cakeBakingService.saveNewTopping(new CakeToppingInfo("candies", 350)); - cakeBakingService.saveNewTopping(new CakeToppingInfo("cherry", 350)); + /** + * Initializes the example data. + */ + private void initializeData() { + cakeBakingService.saveNewLayer(new CakeLayerInfo("chocolate", 1200)); + cakeBakingService.saveNewLayer(new CakeLayerInfo("banana", 900)); + cakeBakingService.saveNewLayer(new CakeLayerInfo(STRAWBERRY, 950)); + cakeBakingService.saveNewLayer(new CakeLayerInfo("lemon", 950)); + cakeBakingService.saveNewLayer(new CakeLayerInfo("vanilla", 950)); + cakeBakingService.saveNewLayer(new CakeLayerInfo(STRAWBERRY, 950)); - var cake1 = new CakeInfo(new CakeToppingInfo("candies", 0), List.of( - new CakeLayerInfo("chocolate", 0), - new CakeLayerInfo("banana", 0), - new CakeLayerInfo(STRAWBERRY, 0))); - try { - cakeBakingService.bakeNewCake(cake1); - } catch (CakeBakingException e) { - LOGGER.error("Cake baking exception", e); - } - var cake2 = new CakeInfo(new CakeToppingInfo("cherry", 0), List.of( - new CakeLayerInfo("vanilla", 0), - new CakeLayerInfo("lemon", 0), - new CakeLayerInfo(STRAWBERRY, 0))); - try { - cakeBakingService.bakeNewCake(cake2); - } catch (CakeBakingException e) { - LOGGER.error("Cake baking exception", e); - } + cakeBakingService.saveNewTopping(new CakeToppingInfo("candies", 350)); + cakeBakingService.saveNewTopping(new CakeToppingInfo("cherry", 350)); + + var cake1 = new CakeInfo(new CakeToppingInfo("candies", 0), + List.of(new CakeLayerInfo("chocolate", 0), new CakeLayerInfo("banana", 0), + new CakeLayerInfo(STRAWBERRY, 0))); + try { + cakeBakingService.bakeNewCake(cake1); + } catch (CakeBakingException e) { + LOGGER.error("Cake baking exception", e); + } + var cake2 = new CakeInfo(new CakeToppingInfo("cherry", 0), + List.of(new CakeLayerInfo("vanilla", 0), new CakeLayerInfo("lemon", 0), + new CakeLayerInfo(STRAWBERRY, 0))); + try { + cakeBakingService.bakeNewCake(cake2); + } catch (CakeBakingException e) { + LOGGER.error("Cake baking exception", e); } + } } diff --git a/layers/src/main/java/com/iluwatar/layers/app/LayersApp.java b/layers/src/main/java/com/iluwatar/layers/app/LayersApp.java index af73f651f8d1..58828b6eadaa 100644 --- a/layers/src/main/java/com/iluwatar/layers/app/LayersApp.java +++ b/layers/src/main/java/com/iluwatar/layers/app/LayersApp.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.layers.app; import org.springframework.boot.SpringApplication; @@ -6,15 +30,23 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +/** + * The Layers pattern is a structural design pattern that organizes system architecture into + * distinct layers, each with a specific responsibility and abstraction level. This separation + * allows for increased modularity, facilitating independent development, maintenance, and reuse + * of each layer. Commonly, layers interact with each other through well-defined interfaces, with + * higher layers (more abstract) depending on lower layers (more concrete), but not vice versa, + * promoting a clear hierarchy and separation of concerns. + */ @SpringBootApplication @EnableJpaRepositories(basePackages = "dao") @EntityScan(basePackages = "entity") -@ComponentScan(basePackages = {"com.iluwatar.layers", "service", "dto", "exception", "view" ,"dao"}) +@ComponentScan(basePackages = {"com.iluwatar.layers", "service", "dto", "exception", "view", "dao"}) public class LayersApp { - public static void main(String[] args) { - SpringApplication.run(LayersApp.class, args); + public static void main(String[] args) { + SpringApplication.run(LayersApp.class, args); - } + } } diff --git a/layers/src/main/java/dto/CakeInfo.java b/layers/src/main/java/dto/CakeInfo.java index 8cc25e4ecb4b..a93b60c6364c 100644 --- a/layers/src/main/java/dto/CakeInfo.java +++ b/layers/src/main/java/dto/CakeInfo.java @@ -22,6 +22,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ + package dto; import java.util.List; @@ -32,40 +33,40 @@ */ public class CakeInfo { - public final Optional id; - public final CakeToppingInfo cakeToppingInfo; - public final List cakeLayerInfos; + public final Optional id; + public final CakeToppingInfo cakeToppingInfo; + public final List cakeLayerInfos; - /** - * Constructor. - */ - public CakeInfo(Long id, CakeToppingInfo cakeToppingInfo, List cakeLayerInfos) { - this.id = Optional.of(id); - this.cakeToppingInfo = cakeToppingInfo; - this.cakeLayerInfos = cakeLayerInfos; - } + /** + * Constructor. + */ + public CakeInfo(Long id, CakeToppingInfo cakeToppingInfo, List cakeLayerInfos) { + this.id = Optional.of(id); + this.cakeToppingInfo = cakeToppingInfo; + this.cakeLayerInfos = cakeLayerInfos; + } - /** - * Constructor. - */ - public CakeInfo(CakeToppingInfo cakeToppingInfo, List cakeLayerInfos) { - this.id = Optional.empty(); - this.cakeToppingInfo = cakeToppingInfo; - this.cakeLayerInfos = cakeLayerInfos; - } + /** + * Constructor. + */ + public CakeInfo(CakeToppingInfo cakeToppingInfo, List cakeLayerInfos) { + this.id = Optional.empty(); + this.cakeToppingInfo = cakeToppingInfo; + this.cakeLayerInfos = cakeLayerInfos; + } - /** - * Calculate calories. - */ - public int calculateTotalCalories() { - var total = cakeToppingInfo != null ? cakeToppingInfo.calories : 0; - total += cakeLayerInfos.stream().mapToInt(c -> c.calories).sum(); - return total; - } + /** + * Calculate calories. + */ + public int calculateTotalCalories() { + var total = cakeToppingInfo != null ? cakeToppingInfo.calories : 0; + total += cakeLayerInfos.stream().mapToInt(c -> c.calories).sum(); + return total; + } - @Override - public String toString() { - return String.format("CakeInfo id=%d topping=%s layers=%s totalCalories=%d", id.orElse(-1L), - cakeToppingInfo, cakeLayerInfos, calculateTotalCalories()); - } + @Override + public String toString() { + return String.format("CakeInfo id=%d topping=%s layers=%s totalCalories=%d", id.orElse(-1L), + cakeToppingInfo, cakeLayerInfos, calculateTotalCalories()); + } } diff --git a/layers/src/main/java/dto/CakeLayerInfo.java b/layers/src/main/java/dto/CakeLayerInfo.java index 4c74f47dbda5..244ae2cf6316 100644 --- a/layers/src/main/java/dto/CakeLayerInfo.java +++ b/layers/src/main/java/dto/CakeLayerInfo.java @@ -22,6 +22,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ + package dto; import java.util.Optional; @@ -31,30 +32,30 @@ */ public class CakeLayerInfo { - public final Optional id; - public final String name; - public final int calories; + public final Optional id; + public final String name; + public final int calories; - /** - * Constructor. - */ - public CakeLayerInfo(Long id, String name, int calories) { - this.id = Optional.of(id); - this.name = name; - this.calories = calories; - } + /** + * Constructor. + */ + public CakeLayerInfo(Long id, String name, int calories) { + this.id = Optional.of(id); + this.name = name; + this.calories = calories; + } - /** - * Constructor. - */ - public CakeLayerInfo(String name, int calories) { - this.id = Optional.empty(); - this.name = name; - this.calories = calories; - } + /** + * Constructor. + */ + public CakeLayerInfo(String name, int calories) { + this.id = Optional.empty(); + this.name = name; + this.calories = calories; + } - @Override - public String toString() { - return String.format("CakeLayerInfo id=%d name=%s calories=%d", id.orElse(-1L), name, calories); - } + @Override + public String toString() { + return String.format("CakeLayerInfo id=%d name=%s calories=%d", id.orElse(-1L), name, calories); + } } diff --git a/layers/src/main/java/dto/CakeToppingInfo.java b/layers/src/main/java/dto/CakeToppingInfo.java index 7a3feab0ebc7..a1e2e9ba4116 100644 --- a/layers/src/main/java/dto/CakeToppingInfo.java +++ b/layers/src/main/java/dto/CakeToppingInfo.java @@ -22,6 +22,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ + package dto; @@ -32,31 +33,31 @@ */ public class CakeToppingInfo { - public final Optional id; - public final String name; - public final int calories; - - /** - * Constructor. - */ - public CakeToppingInfo(Long id, String name, int calories) { - this.id = Optional.of(id); - this.name = name; - this.calories = calories; - } - - /** - * Constructor. - */ - public CakeToppingInfo(String name, int calories) { - this.id = Optional.empty(); - this.name = name; - this.calories = calories; - } - - @Override - public String toString() { - return String.format("CakeToppingInfo id=%d name=%s calories=%d", - id.orElse(-1L), name, calories); - } + public final Optional id; + public final String name; + public final int calories; + + /** + * Constructor. + */ + public CakeToppingInfo(Long id, String name, int calories) { + this.id = Optional.of(id); + this.name = name; + this.calories = calories; + } + + /** + * Constructor. + */ + public CakeToppingInfo(String name, int calories) { + this.id = Optional.empty(); + this.name = name; + this.calories = calories; + } + + @Override + public String toString() { + return String.format("CakeToppingInfo id=%d name=%s calories=%d", id.orElse(-1L), name, + calories); + } } diff --git a/layers/src/main/java/entity/Cake.java b/layers/src/main/java/entity/Cake.java index a7d78e622252..4d673b99ec31 100644 --- a/layers/src/main/java/entity/Cake.java +++ b/layers/src/main/java/entity/Cake.java @@ -22,17 +22,18 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ + package entity; -import java.util.HashSet; -import java.util.Set; +import jakarta.persistence.CascadeType; import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import jakarta.persistence.OneToMany; import jakarta.persistence.OneToOne; -import jakarta.persistence.CascadeType; -import jakarta.persistence.FetchType; +import java.util.HashSet; +import java.util.Set; /** * Cake entity. @@ -40,50 +41,50 @@ @Entity public class Cake { - @Id - @GeneratedValue - private Long id; + @Id + @GeneratedValue + private Long id; - @OneToOne(cascade = CascadeType.REMOVE) - private CakeTopping topping; + @OneToOne(cascade = CascadeType.REMOVE) + private CakeTopping topping; - @OneToMany(cascade = CascadeType.REMOVE, fetch = FetchType.EAGER) - private Set layers; + @OneToMany(cascade = CascadeType.REMOVE, fetch = FetchType.EAGER) + private Set layers; - public Cake() { - setLayers(new HashSet<>()); - } + public Cake() { + setLayers(new HashSet<>()); + } - public Long getId() { - return id; - } + public Long getId() { + return id; + } - public void setId(Long id) { - this.id = id; - } + public void setId(Long id) { + this.id = id; + } - public CakeTopping getTopping() { - return topping; - } + public CakeTopping getTopping() { + return topping; + } - public void setTopping(CakeTopping topping) { - this.topping = topping; - } + public void setTopping(CakeTopping topping) { + this.topping = topping; + } - public Set getLayers() { - return layers; - } + public Set getLayers() { + return layers; + } - public void setLayers(Set layers) { - this.layers = layers; - } + public void setLayers(Set layers) { + this.layers = layers; + } - public void addLayer(CakeLayer layer) { - this.layers.add(layer); - } + public void addLayer(CakeLayer layer) { + this.layers.add(layer); + } - @Override - public String toString() { - return String.format("id=%s topping=%s layers=%s", id, topping, layers.toString()); - } + @Override + public String toString() { + return String.format("id=%s topping=%s layers=%s", id, topping, layers.toString()); + } } diff --git a/layers/src/main/java/entity/CakeLayer.java b/layers/src/main/java/entity/CakeLayer.java index d3bd65ad9966..ad517317c79e 100644 --- a/layers/src/main/java/entity/CakeLayer.java +++ b/layers/src/main/java/entity/CakeLayer.java @@ -22,11 +22,21 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ + package entity; -import jakarta.persistence.*; -import lombok.*; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; /** * CakeLayer entity. @@ -40,24 +50,24 @@ @EqualsAndHashCode public class CakeLayer { - @Id - @GeneratedValue - private Long id; + @Id + @GeneratedValue + private Long id; - private String name; + private String name; - private int calories; + private int calories; - @ManyToOne(cascade = CascadeType.ALL) - private Cake cake; + @ManyToOne(cascade = CascadeType.ALL) + private Cake cake; - public CakeLayer(String name, int calories) { - this.setName(name); - this.setCalories(calories); - } + public CakeLayer(String name, int calories) { + this.setName(name); + this.setCalories(calories); + } - @Override - public String toString() { - return String.format("id=%s name=%s calories=%d", id, name, calories); - } + @Override + public String toString() { + return String.format("id=%s name=%s calories=%d", id, name, calories); + } } diff --git a/layers/src/main/java/entity/CakeTopping.java b/layers/src/main/java/entity/CakeTopping.java index 697ed5a07877..997dc6ddb311 100644 --- a/layers/src/main/java/entity/CakeTopping.java +++ b/layers/src/main/java/entity/CakeTopping.java @@ -22,11 +22,21 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ + package entity; -import jakarta.persistence.*; -import lombok.*; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.OneToOne; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; /** * CakeTopping entity. @@ -40,25 +50,25 @@ @EqualsAndHashCode public class CakeTopping { - @Id - @GeneratedValue - private Long id; + @Id + @GeneratedValue + private Long id; - private String name; + private String name; - private int calories; + private int calories; - @OneToOne(cascade = CascadeType.ALL) - private Cake cake; + @OneToOne(cascade = CascadeType.ALL) + private Cake cake; - public CakeTopping(String name, int calories) { - this.setName(name); - this.setCalories(calories); - } + public CakeTopping(String name, int calories) { + this.setName(name); + this.setCalories(calories); + } - @Override - public String toString() { - return String.format("id=%s name=%s calories=%d", id, name, calories); - } + @Override + public String toString() { + return String.format("id=%s name=%s calories=%d", id, name, calories); + } } diff --git a/layers/src/main/java/exception/CakeBakingException.java b/layers/src/main/java/exception/CakeBakingException.java index 95a2c11716e4..6b38356a9d1c 100644 --- a/layers/src/main/java/exception/CakeBakingException.java +++ b/layers/src/main/java/exception/CakeBakingException.java @@ -22,6 +22,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ + package exception; import org.springframework.stereotype.Component; @@ -32,12 +33,12 @@ @Component public class CakeBakingException extends Exception { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - public CakeBakingException() { - } + public CakeBakingException() { + } - public CakeBakingException(String message) { - super(message); - } + public CakeBakingException(String message) { + super(message); + } } diff --git a/layers/src/main/java/service/CakeBakingService.java b/layers/src/main/java/service/CakeBakingService.java index 7909b3f99be4..8ab5dd3a82b1 100644 --- a/layers/src/main/java/service/CakeBakingService.java +++ b/layers/src/main/java/service/CakeBakingService.java @@ -22,15 +22,15 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ + package service; import dto.CakeInfo; import dto.CakeLayerInfo; import dto.CakeToppingInfo; import exception.CakeBakingException; -import org.springframework.stereotype.Service; - import java.util.List; +import org.springframework.stereotype.Service; /** * Service for cake baking operations. @@ -38,40 +38,40 @@ @Service public interface CakeBakingService { - /** - * Bakes new cake according to parameters. - */ - void bakeNewCake(CakeInfo cakeInfo) throws CakeBakingException; + /** + * Bakes new cake according to parameters. + */ + void bakeNewCake(CakeInfo cakeInfo) throws CakeBakingException; - /** - * Get all cakes. - */ - List getAllCakes(); + /** + * Get all cakes. + */ + List getAllCakes(); - /** - * Store new cake topping. - */ - void saveNewTopping(CakeToppingInfo toppingInfo); + /** + * Store new cake topping. + */ + void saveNewTopping(CakeToppingInfo toppingInfo); - /** - * Get available cake toppings. - */ - List getAvailableToppings(); + /** + * Get available cake toppings. + */ + List getAvailableToppings(); - /** - * Add new cake layer. - */ - void saveNewLayer(CakeLayerInfo layerInfo); + /** + * Add new cake layer. + */ + void saveNewLayer(CakeLayerInfo layerInfo); - /** - * Get available cake layers. - */ - List getAvailableLayers(); + /** + * Get available cake layers. + */ + List getAvailableLayers(); - void deleteAllCakes(); + void deleteAllCakes(); - void deleteAllLayers(); + void deleteAllLayers(); - void deleteAllToppings(); + void deleteAllToppings(); } diff --git a/layers/src/main/java/service/CakeBakingServiceImpl.java b/layers/src/main/java/service/CakeBakingServiceImpl.java index 486e3e6d5d4d..2161c3ef7da7 100644 --- a/layers/src/main/java/service/CakeBakingServiceImpl.java +++ b/layers/src/main/java/service/CakeBakingServiceImpl.java @@ -22,6 +22,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ + package service; import dao.CakeDao; @@ -38,7 +39,6 @@ import java.util.HashSet; import java.util.List; import java.util.Set; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -50,140 +50,149 @@ @Transactional public class CakeBakingServiceImpl implements CakeBakingService { - private final CakeDao cakeDao; - private final CakeLayerDao cakeLayerDao; - private final CakeToppingDao cakeToppingDao; - - @Autowired - public CakeBakingServiceImpl(CakeDao cakeDao, CakeLayerDao cakeLayerDao, CakeToppingDao cakeToppingDao) { - this.cakeDao = cakeDao; - this.cakeLayerDao = cakeLayerDao; - this.cakeToppingDao = cakeToppingDao; + private final CakeDao cakeDao; + private final CakeLayerDao cakeLayerDao; + private final CakeToppingDao cakeToppingDao; + + /** + * Constructs a new instance of CakeBakingServiceImpl. + * + * @param cakeDao the DAO for cake-related operations + * @param cakeLayerDao the DAO for cake layer-related operations + * @param cakeToppingDao the DAO for cake topping-related operations + */ + @Autowired + public CakeBakingServiceImpl(CakeDao cakeDao, CakeLayerDao cakeLayerDao, + CakeToppingDao cakeToppingDao) { + this.cakeDao = cakeDao; + this.cakeLayerDao = cakeLayerDao; + this.cakeToppingDao = cakeToppingDao; + } + + @Override + public void bakeNewCake(CakeInfo cakeInfo) throws CakeBakingException { + var allToppings = getAvailableToppingEntities(); + var matchingToppings = + allToppings.stream().filter(t -> t.getName().equals(cakeInfo.cakeToppingInfo.name)) + .toList(); + if (matchingToppings.isEmpty()) { + throw new CakeBakingException( + String.format("Topping %s is not available", cakeInfo.cakeToppingInfo.name)); } - - @Override - public void bakeNewCake(CakeInfo cakeInfo) throws CakeBakingException { - var allToppings = getAvailableToppingEntities(); - var matchingToppings = - allToppings.stream().filter(t -> t.getName().equals(cakeInfo.cakeToppingInfo.name)) - .toList(); - if (matchingToppings.isEmpty()) { - throw new CakeBakingException(String.format("Topping %s is not available", - cakeInfo.cakeToppingInfo.name)); - } - var allLayers = getAvailableLayerEntities(); - Set foundLayers = new HashSet<>(); - for (var info : cakeInfo.cakeLayerInfos) { - var found = allLayers.stream().filter(layer -> layer.getName().equals(info.name)).findFirst(); - if (found.isEmpty()) { - throw new CakeBakingException(String.format("Layer %s is not available", info.name)); - } else { - foundLayers.add(found.get()); - } - } - - var topping = cakeToppingDao.findById(matchingToppings.iterator().next().getId()); - if (topping.isPresent()) { - var cake = new Cake(); - cake.setTopping(topping.get()); - cake.setLayers(foundLayers); - cakeDao.save(cake); - topping.get().setCake(cake); - cakeToppingDao.save(topping.get()); - Set foundLayersToUpdate = new HashSet<>(foundLayers); // copy set to avoid a ConcurrentModificationException - - for (var layer : foundLayersToUpdate) { - layer.setCake(cake); - cakeLayerDao.save(layer); - } - - } else { - throw new CakeBakingException(String.format("Topping %s is not available", - cakeInfo.cakeToppingInfo.name)); - } + var allLayers = getAvailableLayerEntities(); + Set foundLayers = new HashSet<>(); + for (var info : cakeInfo.cakeLayerInfos) { + var found = allLayers.stream().filter(layer -> layer.getName().equals(info.name)).findFirst(); + if (found.isEmpty()) { + throw new CakeBakingException(String.format("Layer %s is not available", info.name)); + } else { + foundLayers.add(found.get()); + } } - @Override - public void saveNewTopping(CakeToppingInfo toppingInfo) { - cakeToppingDao.save(new CakeTopping(toppingInfo.name, toppingInfo.calories)); + var topping = cakeToppingDao.findById(matchingToppings.iterator().next().getId()); + if (topping.isPresent()) { + var cake = new Cake(); + cake.setTopping(topping.get()); + cake.setLayers(foundLayers); + cakeDao.save(cake); + topping.get().setCake(cake); + cakeToppingDao.save(topping.get()); + Set foundLayersToUpdate = + new HashSet<>(foundLayers); // copy set to avoid a ConcurrentModificationException + + for (var layer : foundLayersToUpdate) { + layer.setCake(cake); + cakeLayerDao.save(layer); + } + + } else { + throw new CakeBakingException( + String.format("Topping %s is not available", cakeInfo.cakeToppingInfo.name)); } - - @Override - public void saveNewLayer(CakeLayerInfo layerInfo) { - cakeLayerDao.save(new CakeLayer(layerInfo.name, layerInfo.calories)); + } + + @Override + public void saveNewTopping(CakeToppingInfo toppingInfo) { + cakeToppingDao.save(new CakeTopping(toppingInfo.name, toppingInfo.calories)); + } + + @Override + public void saveNewLayer(CakeLayerInfo layerInfo) { + cakeLayerDao.save(new CakeLayer(layerInfo.name, layerInfo.calories)); + } + + private List getAvailableToppingEntities() { + List result = new ArrayList<>(); + for (CakeTopping topping : cakeToppingDao.findAll()) { + if (topping.getCake() == null) { + result.add(topping); + } } - - private List getAvailableToppingEntities() { - List result = new ArrayList<>(); - for (CakeTopping topping : cakeToppingDao.findAll()) { - if (topping.getCake() == null) { - result.add(topping); - } - } - return result; + return result; + } + + @Override + public List getAvailableToppings() { + List result = new ArrayList<>(); + for (CakeTopping next : cakeToppingDao.findAll()) { + if (next.getCake() == null) { + result.add(new CakeToppingInfo(next.getId(), next.getName(), next.getCalories())); + } } - - @Override - public List getAvailableToppings() { - List result = new ArrayList<>(); - for (CakeTopping next : cakeToppingDao.findAll()) { - if (next.getCake() == null) { - result.add(new CakeToppingInfo(next.getId(), next.getName(), next.getCalories())); - } - } - return result; + return result; + } + + private List getAvailableLayerEntities() { + List result = new ArrayList<>(); + for (CakeLayer next : cakeLayerDao.findAll()) { + if (next.getCake() == null) { + result.add(next); + } } - - private List getAvailableLayerEntities() { - List result = new ArrayList<>(); - for (CakeLayer next : cakeLayerDao.findAll()) { - if (next.getCake() == null) { - result.add(next); - } - } - return result; + return result; + } + + @Override + public List getAvailableLayers() { + List result = new ArrayList<>(); + for (CakeLayer next : cakeLayerDao.findAll()) { + if (next.getCake() == null) { + result.add(new CakeLayerInfo(next.getId(), next.getName(), next.getCalories())); + } } - - @Override - public List getAvailableLayers() { - List result = new ArrayList<>(); - for (CakeLayer next : cakeLayerDao.findAll()) { - if (next.getCake() == null) { - result.add(new CakeLayerInfo(next.getId(), next.getName(), next.getCalories())); - } - } - return result; - } - - @Override - public void deleteAllCakes() { - cakeDao.deleteAll(); - } - - @Override - public void deleteAllLayers() { - cakeLayerDao.deleteAll(); - } - - @Override - public void deleteAllToppings() { - cakeToppingDao.deleteAll(); - } - - @Override - public List getAllCakes() { - List result = new ArrayList<>(); - for (Cake cake : cakeDao.findAll()) { - var cakeToppingInfo = - new CakeToppingInfo(cake.getTopping().getId(), cake.getTopping().getName(), cake - .getTopping().getCalories()); - List cakeLayerInfos = new ArrayList<>(); - for (var layer : cake.getLayers()) { - cakeLayerInfos.add(new CakeLayerInfo(layer.getId(), layer.getName(), layer.getCalories())); - } - var cakeInfo = new CakeInfo(cake.getId(), cakeToppingInfo, cakeLayerInfos); - result.add(cakeInfo); - } - return result; + return result; + } + + @Override + public void deleteAllCakes() { + cakeDao.deleteAll(); + } + + @Override + public void deleteAllLayers() { + cakeLayerDao.deleteAll(); + } + + @Override + public void deleteAllToppings() { + cakeToppingDao.deleteAll(); + } + + @Override + public List getAllCakes() { + List result = new ArrayList<>(); + for (Cake cake : cakeDao.findAll()) { + var cakeToppingInfo = + new CakeToppingInfo(cake.getTopping().getId(), cake.getTopping().getName(), + cake.getTopping().getCalories()); + List cakeLayerInfos = new ArrayList<>(); + for (var layer : cake.getLayers()) { + cakeLayerInfos.add(new CakeLayerInfo(layer.getId(), layer.getName(), layer.getCalories())); + } + var cakeInfo = new CakeInfo(cake.getId(), cakeToppingInfo, cakeLayerInfos); + result.add(cakeInfo); } + return result; + } } diff --git a/layers/src/main/java/view/CakeViewImpl.java b/layers/src/main/java/view/CakeViewImpl.java index a060c7910f9e..edb9ebffe04a 100644 --- a/layers/src/main/java/view/CakeViewImpl.java +++ b/layers/src/main/java/view/CakeViewImpl.java @@ -22,6 +22,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ + package view; import org.slf4j.Logger; @@ -33,15 +34,15 @@ */ public class CakeViewImpl implements View { - private final CakeBakingService cakeBakingService; + private final CakeBakingService cakeBakingService; - private static final Logger LOGGER = LoggerFactory.getLogger(CakeViewImpl.class); + private static final Logger LOGGER = LoggerFactory.getLogger(CakeViewImpl.class); - public CakeViewImpl(CakeBakingService cakeBakingService) { - this.cakeBakingService = cakeBakingService; - } + public CakeViewImpl(CakeBakingService cakeBakingService) { + this.cakeBakingService = cakeBakingService; + } - public void render() { - cakeBakingService.getAllCakes().forEach(cake -> LOGGER.info(cake.toString())); - } + public void render() { + cakeBakingService.getAllCakes().forEach(cake -> LOGGER.info(cake.toString())); + } } diff --git a/layers/src/main/java/view/View.java b/layers/src/main/java/view/View.java index fb49fc1b74f1..f8ff8b53579b 100644 --- a/layers/src/main/java/view/View.java +++ b/layers/src/main/java/view/View.java @@ -22,6 +22,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ + package view; /** @@ -29,6 +30,6 @@ */ public interface View { - void render(); + void render(); } diff --git a/layers/src/test/java/com/iluwatar/layers/app/LayersAppTests.java b/layers/src/test/java/com/iluwatar/layers/app/LayersAppTests.java index e7e50a266757..da361e3f0c73 100644 --- a/layers/src/test/java/com/iluwatar/layers/app/LayersAppTests.java +++ b/layers/src/test/java/com/iluwatar/layers/app/LayersAppTests.java @@ -1,24 +1,49 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.layers.app; +import static org.junit.jupiter.api.Assertions.assertNotNull; + import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.ApplicationContext; -import static org.junit.jupiter.api.Assertions.assertNotNull; - @SpringBootTest(classes = LayersApp.class) class LayersAppTests { - private final ApplicationContext applicationContext; + private final ApplicationContext applicationContext; + + @Autowired + LayersAppTests(ApplicationContext applicationContext) { + this.applicationContext = applicationContext; + } - @Autowired - LayersAppTests(ApplicationContext applicationContext) { - this.applicationContext = applicationContext; - } - @Test - void contextLoads() { - assertNotNull(applicationContext); - } + @Test + void contextLoads() { + assertNotNull(applicationContext); + } } diff --git a/layers/src/test/java/com/iluwatar/layers/entity/CakeTest.java b/layers/src/test/java/com/iluwatar/layers/entity/CakeTest.java index e452419bc0d7..a59986c6cf2e 100644 --- a/layers/src/test/java/com/iluwatar/layers/entity/CakeTest.java +++ b/layers/src/test/java/com/iluwatar/layers/entity/CakeTest.java @@ -22,6 +22,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ + package com.iluwatar.layers.entity; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -29,18 +30,17 @@ import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import java.util.HashSet; -import java.util.Set; - import entity.Cake; import entity.CakeLayer; import entity.CakeTopping; +import java.util.HashSet; +import java.util.Set; import org.junit.jupiter.api.Test; /** - * Date: 12/15/15 - 8:02 PM - * - * @author Jeroen Meulemeester + * This class contains unit tests for the Cake class. + * It tests the functionality of setting and getting the id, topping, and layers of a Cake object. + * It also tests the functionality of adding a layer to a Cake object and converting a Cake object to a string. */ class CakeTest { @@ -70,9 +70,7 @@ void testSetLayers() { assertNotNull(cake.getLayers()); assertTrue(cake.getLayers().isEmpty()); - final var expectedLayers = Set.of( - new CakeLayer("layer1", 1000), - new CakeLayer("layer2", 2000), + final var expectedLayers = Set.of(new CakeLayer("layer1", 1000), new CakeLayer("layer2", 2000), new CakeLayer("layer3", 3000)); cake.setLayers(expectedLayers); assertEquals(expectedLayers, cake.getLayers()); diff --git a/layers/src/test/java/com/iluwatar/layers/exception/CakeBakingExceptionTest.java b/layers/src/test/java/com/iluwatar/layers/exception/CakeBakingExceptionTest.java index 7ab244edf78f..072603da7b4c 100644 --- a/layers/src/test/java/com/iluwatar/layers/exception/CakeBakingExceptionTest.java +++ b/layers/src/test/java/com/iluwatar/layers/exception/CakeBakingExceptionTest.java @@ -22,6 +22,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ + package com.iluwatar.layers.exception; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -31,27 +32,40 @@ import org.junit.jupiter.api.Test; /** - * Date: 12/15/15 - 7:57 PM - * - * @author Jeroen Meulemeester + * Tests for the {@link CakeBakingException} class. + * This class contains unit tests to verify the correct functionality + * of the {@code CakeBakingException} class constructors, including the default constructor + * and the constructor that accepts a message parameter. */ - class CakeBakingExceptionTest { - + /** + * Tests the default constructor of {@link CakeBakingException}. + * Ensures that an exception created with the default constructor has + * {@code null} as its message and cause. + */ @Test void testConstructor() { final var exception = new CakeBakingException(); - assertNull(exception.getMessage()); - assertNull(exception.getCause()); + assertNull(exception.getMessage(), "The message should be null for the default constructor."); + assertNull(exception.getCause(), "The cause should be null for the default constructor."); } + /** + * Tests the constructor of {@link CakeBakingException} that accepts a message. + * Ensures that an exception created with this constructor correctly stores the provided message + * and has {@code null} as its cause. + * + * @param expectedMessage The message provided to the constructor. + */ @Test void testConstructorWithMessage() { final var expectedMessage = "message"; final var exception = new CakeBakingException(expectedMessage); - assertEquals(expectedMessage, exception.getMessage()); - assertNull(exception.getCause()); + assertEquals(expectedMessage, exception.getMessage(), + "The stored message should match the expected message."); + assertNull(exception.getCause(), + "The cause should be null when an exception is created with only a message."); } } diff --git a/layers/src/test/java/com/iluwatar/layers/service/CakeBakingServiceImplTest.java b/layers/src/test/java/com/iluwatar/layers/service/CakeBakingServiceImplTest.java index 2770689b7c8d..359e8c16f469 100644 --- a/layers/src/test/java/com/iluwatar/layers/service/CakeBakingServiceImplTest.java +++ b/layers/src/test/java/com/iluwatar/layers/service/CakeBakingServiceImplTest.java @@ -22,6 +22,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ + package com.iluwatar.layers.service; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -35,22 +36,19 @@ import dto.CakeLayerInfo; import dto.CakeToppingInfo; import exception.CakeBakingException; +import java.util.Collections; +import java.util.List; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import service.CakeBakingServiceImpl; -import java.util.Collections; -import java.util.List; - -import org.junit.jupiter.api.Test; - /** - * Date: 12/15/15 - 9:55 PM + * Constructs a new instance of CakeBakingServiceImplTest. * - * @author Jeroen Meulemeester + * @param cakeBakingService the service for cake baking operations */ - @SpringBootTest(classes = LayersApp.class) class CakeBakingServiceImplTest { @@ -62,15 +60,14 @@ class CakeBakingServiceImplTest { } @BeforeEach - void setUp() { - cakeBakingService.deleteAllCakes(); - cakeBakingService.deleteAllLayers(); - cakeBakingService.deleteAllToppings(); - } + void setUp() { + cakeBakingService.deleteAllCakes(); + cakeBakingService.deleteAllLayers(); + cakeBakingService.deleteAllToppings(); + } @Test - void testLayers() { final var initialLayers = cakeBakingService.getAvailableLayers(); assertNotNull(initialLayers); @@ -156,7 +153,8 @@ void testBakeCakeMissingTopping() { cakeBakingService.saveNewLayer(layer2); final var missingTopping = new CakeToppingInfo("Topping1", 1000); - assertThrows(CakeBakingException.class, () -> cakeBakingService.bakeNewCake(new CakeInfo(missingTopping, List.of(layer1, layer2)))); + assertThrows(CakeBakingException.class, + () -> cakeBakingService.bakeNewCake(new CakeInfo(missingTopping, List.of(layer1, layer2)))); } @Test @@ -172,7 +170,8 @@ void testBakeCakeMissingLayer() { cakeBakingService.saveNewLayer(layer1); final var missingLayer = new CakeLayerInfo("Layer2", 2000); - assertThrows(CakeBakingException.class, () -> cakeBakingService.bakeNewCake(new CakeInfo(topping1, List.of(layer1, missingLayer)))); + assertThrows(CakeBakingException.class, + () -> cakeBakingService.bakeNewCake(new CakeInfo(topping1, List.of(layer1, missingLayer)))); } @Test @@ -192,7 +191,8 @@ void testBakeCakesUsedLayer() throws CakeBakingException { cakeBakingService.saveNewLayer(layer2); cakeBakingService.bakeNewCake(new CakeInfo(topping1, List.of(layer1, layer2))); - assertThrows(CakeBakingException.class, () -> cakeBakingService.bakeNewCake(new CakeInfo(topping2, Collections.singletonList(layer2)))); + assertThrows(CakeBakingException.class, () -> cakeBakingService.bakeNewCake( + new CakeInfo(topping2, Collections.singletonList(layer2)))); } } diff --git a/layers/src/test/java/com/iluwatar/layers/view/CakeViewImplTest.java b/layers/src/test/java/com/iluwatar/layers/view/CakeViewImplTest.java index 89487203758b..31a1dacf72ec 100644 --- a/layers/src/test/java/com/iluwatar/layers/view/CakeViewImplTest.java +++ b/layers/src/test/java/com/iluwatar/layers/view/CakeViewImplTest.java @@ -22,6 +22,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ + package com.iluwatar.layers.view; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -34,19 +35,19 @@ import dto.CakeInfo; import dto.CakeLayerInfo; import dto.CakeToppingInfo; -import service.CakeBakingService; import java.util.LinkedList; import java.util.List; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.slf4j.LoggerFactory; +import service.CakeBakingService; import view.CakeViewImpl; /** - * Date: 12/15/15 - 10:04 PM - * - * @author Jeroen Meulemeester + * This class contains unit tests for the CakeViewImpl class. + * It tests the functionality of rendering cakes using the CakeViewImpl class. + * It also tests the logging functionality of the CakeViewImpl class. */ class CakeViewImplTest { @@ -63,15 +64,13 @@ void tearDown() { } /** - * Verify if the cake view renders the expected result + * Verify if the cake view renders the expected result. */ @Test void testRender() { - final var layers = List.of( - new CakeLayerInfo("layer1", 1000), - new CakeLayerInfo("layer2", 2000), - new CakeLayerInfo("layer3", 3000)); + final var layers = List.of(new CakeLayerInfo("layer1", 1000), new CakeLayerInfo("layer2", 2000), + new CakeLayerInfo("layer3", 3000)); final var cake = new CakeInfo(new CakeToppingInfo("topping", 1000), layers); final var cakes = List.of(cake); diff --git a/log-aggregation/pom.xml b/log-aggregation/pom.xml index 886d712ff403..cd6140980ffd 100644 --- a/log-aggregation/pom.xml +++ b/log-aggregation/pom.xml @@ -1,4 +1,30 @@ + diff --git a/log-aggregation/src/main/java/com/iluwatar/logaggregation/App.java b/log-aggregation/src/main/java/com/iluwatar/logaggregation/App.java index ef9ca0a7ba87..080dc6763136 100644 --- a/log-aggregation/src/main/java/com/iluwatar/logaggregation/App.java +++ b/log-aggregation/src/main/java/com/iluwatar/logaggregation/App.java @@ -2,7 +2,7 @@ * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). * * The MIT License - * Copyright © 2014-2023 Ilkka Seppälä + * Copyright © 2014-2022 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 diff --git a/log-aggregation/src/main/java/com/iluwatar/logaggregation/CentralLogStore.java b/log-aggregation/src/main/java/com/iluwatar/logaggregation/CentralLogStore.java index f7226638c98d..32727916188a 100644 --- a/log-aggregation/src/main/java/com/iluwatar/logaggregation/CentralLogStore.java +++ b/log-aggregation/src/main/java/com/iluwatar/logaggregation/CentralLogStore.java @@ -2,7 +2,7 @@ * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). * * The MIT License - * Copyright © 2014-2023 Ilkka Seppälä + * Copyright © 2014-2022 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 diff --git a/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogAggregator.java b/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogAggregator.java index 406ce144a03d..37417e21267d 100644 --- a/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogAggregator.java +++ b/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogAggregator.java @@ -2,7 +2,7 @@ * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). * * The MIT License - * Copyright © 2014-2023 Ilkka Seppälä + * Copyright © 2014-2022 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 diff --git a/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogEntry.java b/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogEntry.java index bece65c64d21..1dd467293b37 100644 --- a/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogEntry.java +++ b/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogEntry.java @@ -2,7 +2,7 @@ * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). * * The MIT License - * Copyright © 2014-2023 Ilkka Seppälä + * Copyright © 2014-2022 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 diff --git a/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogLevel.java b/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogLevel.java index ed9258649189..8d90dbe9502f 100644 --- a/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogLevel.java +++ b/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogLevel.java @@ -2,7 +2,7 @@ * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). * * The MIT License - * Copyright © 2014-2023 Ilkka Seppälä + * Copyright © 2014-2022 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 diff --git a/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogProducer.java b/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogProducer.java index f6ca7f0ded12..a586588bc6d1 100644 --- a/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogProducer.java +++ b/log-aggregation/src/main/java/com/iluwatar/logaggregation/LogProducer.java @@ -2,7 +2,7 @@ * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). * * The MIT License - * Copyright © 2014-2023 Ilkka Seppälä + * Copyright © 2014-2022 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 diff --git a/log-aggregation/src/test/java/com/iluwatar/logaggregation/LogAggregatorTest.java b/log-aggregation/src/test/java/com/iluwatar/logaggregation/LogAggregatorTest.java index 182e7252769f..6c385f35c6c3 100644 --- a/log-aggregation/src/test/java/com/iluwatar/logaggregation/LogAggregatorTest.java +++ b/log-aggregation/src/test/java/com/iluwatar/logaggregation/LogAggregatorTest.java @@ -2,7 +2,7 @@ * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). * * The MIT License - * Copyright © 2014-2023 Ilkka Seppälä + * Copyright © 2014-2022 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 diff --git a/model-view-intent/src/main/java/com/iluwatar/model/view/intent/App.java b/model-view-intent/src/main/java/com/iluwatar/model/view/intent/App.java index c318708ad318..7d17f71049dd 100644 --- a/model-view-intent/src/main/java/com/iluwatar/model/view/intent/App.java +++ b/model-view-intent/src/main/java/com/iluwatar/model/view/intent/App.java @@ -1,7 +1,5 @@ /* - * This project is licensed under the MIT license. - * Module model-view-viewmodel is using ZK framework licensed under LGPL - * (see lgpl-3.0.txt). + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). * * The MIT License * Copyright © 2014-2022 Ilkka Seppälä diff --git a/model-view-intent/src/main/java/com/iluwatar/model/view/intent/CalculatorModel.java b/model-view-intent/src/main/java/com/iluwatar/model/view/intent/CalculatorModel.java index 8e11322fca8d..4d513ebe7418 100644 --- a/model-view-intent/src/main/java/com/iluwatar/model/view/intent/CalculatorModel.java +++ b/model-view-intent/src/main/java/com/iluwatar/model/view/intent/CalculatorModel.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.model.view.intent; import lombok.Data; diff --git a/model-view-intent/src/main/java/com/iluwatar/model/view/intent/CalculatorView.java b/model-view-intent/src/main/java/com/iluwatar/model/view/intent/CalculatorView.java index dfaf154684f7..13de1cbb4823 100644 --- a/model-view-intent/src/main/java/com/iluwatar/model/view/intent/CalculatorView.java +++ b/model-view-intent/src/main/java/com/iluwatar/model/view/intent/CalculatorView.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.model.view.intent; import com.iluwatar.model.view.intent.actions.AdditionCalculatorAction; diff --git a/model-view-intent/src/main/java/com/iluwatar/model/view/intent/CalculatorViewModel.java b/model-view-intent/src/main/java/com/iluwatar/model/view/intent/CalculatorViewModel.java index 160057c012bd..3865ec30b090 100644 --- a/model-view-intent/src/main/java/com/iluwatar/model/view/intent/CalculatorViewModel.java +++ b/model-view-intent/src/main/java/com/iluwatar/model/view/intent/CalculatorViewModel.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.model.view.intent; import com.iluwatar.model.view.intent.actions.AdditionCalculatorAction; diff --git a/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/AdditionCalculatorAction.java b/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/AdditionCalculatorAction.java index 5647232e0b98..2a57ba32018f 100644 --- a/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/AdditionCalculatorAction.java +++ b/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/AdditionCalculatorAction.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.model.view.intent.actions; /** diff --git a/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/CalculatorAction.java b/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/CalculatorAction.java index 70477409aa7b..18b7c8463d0a 100644 --- a/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/CalculatorAction.java +++ b/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/CalculatorAction.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.model.view.intent.actions; /** diff --git a/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/DivisionCalculatorAction.java b/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/DivisionCalculatorAction.java index 9da56c6ccc06..787de2d02674 100644 --- a/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/DivisionCalculatorAction.java +++ b/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/DivisionCalculatorAction.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.model.view.intent.actions; /** diff --git a/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/MultiplicationCalculatorAction.java b/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/MultiplicationCalculatorAction.java index 1bf9f4c86990..6287bfdcf736 100644 --- a/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/MultiplicationCalculatorAction.java +++ b/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/MultiplicationCalculatorAction.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.model.view.intent.actions; /** diff --git a/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/SetVariableCalculatorAction.java b/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/SetVariableCalculatorAction.java index 564609ccc1af..0876d2be249c 100644 --- a/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/SetVariableCalculatorAction.java +++ b/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/SetVariableCalculatorAction.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.model.view.intent.actions; import lombok.Data; diff --git a/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/SubtractionCalculatorAction.java b/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/SubtractionCalculatorAction.java index c8b31e3b86a3..2a8b7f420d31 100644 --- a/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/SubtractionCalculatorAction.java +++ b/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/SubtractionCalculatorAction.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.model.view.intent.actions; /** diff --git a/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/package-info.java b/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/package-info.java index 3ce2a4662e8c..1e0b6da49a62 100644 --- a/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/package-info.java +++ b/model-view-intent/src/main/java/com/iluwatar/model/view/intent/actions/package-info.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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. + */ /** * Handle actions for {@link com.iluwatar.model.view.intent.CalculatorModel} * defined by {@link com.iluwatar.model.view.intent.actions.CalculatorAction}. diff --git a/model-view-intent/src/main/java/com/iluwatar/model/view/intent/package-info.java b/model-view-intent/src/main/java/com/iluwatar/model/view/intent/package-info.java index ddfcb9827621..7b00c1d1a42e 100644 --- a/model-view-intent/src/main/java/com/iluwatar/model/view/intent/package-info.java +++ b/model-view-intent/src/main/java/com/iluwatar/model/view/intent/package-info.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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. + */ /** * Define Model, View and ViewModel. * Use them in {@link com.iluwatar.model.view.intent.App} diff --git a/model-view-intent/src/test/java/com/iluwatar/model/view/intent/CalculatorViewModelTest.java b/model-view-intent/src/test/java/com/iluwatar/model/view/intent/CalculatorViewModelTest.java index 57cb556d69ef..ae61d104b72b 100644 --- a/model-view-intent/src/test/java/com/iluwatar/model/view/intent/CalculatorViewModelTest.java +++ b/model-view-intent/src/test/java/com/iluwatar/model/view/intent/CalculatorViewModelTest.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.model.view.intent; import com.iluwatar.model.view.intent.actions.*; diff --git a/notification/pom.xml b/notification/pom.xml index 9755f96f369b..760169ef8b72 100644 --- a/notification/pom.xml +++ b/notification/pom.xml @@ -1,4 +1,30 @@ + diff --git a/notification/src/main/java/com/iluwatar/App.java b/notification/src/main/java/com/iluwatar/App.java index 70e51236c115..f62a62c32160 100644 --- a/notification/src/main/java/com/iluwatar/App.java +++ b/notification/src/main/java/com/iluwatar/App.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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; import java.time.LocalDate; diff --git a/notification/src/main/java/com/iluwatar/DataTransferObject.java b/notification/src/main/java/com/iluwatar/DataTransferObject.java index 23430e5707d3..11d648d16b42 100644 --- a/notification/src/main/java/com/iluwatar/DataTransferObject.java +++ b/notification/src/main/java/com/iluwatar/DataTransferObject.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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; import lombok.Getter; diff --git a/notification/src/main/java/com/iluwatar/Notification.java b/notification/src/main/java/com/iluwatar/Notification.java index 93a40ecc7ff2..47f36f5ee129 100644 --- a/notification/src/main/java/com/iluwatar/Notification.java +++ b/notification/src/main/java/com/iluwatar/Notification.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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; import java.util.ArrayList; diff --git a/notification/src/main/java/com/iluwatar/NotificationError.java b/notification/src/main/java/com/iluwatar/NotificationError.java index d53d900e52c6..a243a383b9f0 100644 --- a/notification/src/main/java/com/iluwatar/NotificationError.java +++ b/notification/src/main/java/com/iluwatar/NotificationError.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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; import lombok.AllArgsConstructor; diff --git a/notification/src/main/java/com/iluwatar/RegisterWorker.java b/notification/src/main/java/com/iluwatar/RegisterWorker.java index 35b101a95e3c..9de39344b847 100644 --- a/notification/src/main/java/com/iluwatar/RegisterWorker.java +++ b/notification/src/main/java/com/iluwatar/RegisterWorker.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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; import java.time.LocalDate; diff --git a/notification/src/main/java/com/iluwatar/RegisterWorkerDto.java b/notification/src/main/java/com/iluwatar/RegisterWorkerDto.java index 1bf705e62c3a..7050c54dc6f4 100644 --- a/notification/src/main/java/com/iluwatar/RegisterWorkerDto.java +++ b/notification/src/main/java/com/iluwatar/RegisterWorkerDto.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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; import java.time.LocalDate; diff --git a/notification/src/main/java/com/iluwatar/RegisterWorkerForm.java b/notification/src/main/java/com/iluwatar/RegisterWorkerForm.java index 3d03c967c300..6641919936e5 100644 --- a/notification/src/main/java/com/iluwatar/RegisterWorkerForm.java +++ b/notification/src/main/java/com/iluwatar/RegisterWorkerForm.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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; import java.time.LocalDate; diff --git a/notification/src/main/java/com/iluwatar/RegisterWorkerService.java b/notification/src/main/java/com/iluwatar/RegisterWorkerService.java index bcdd4e08b8f8..aed1629716a6 100644 --- a/notification/src/main/java/com/iluwatar/RegisterWorkerService.java +++ b/notification/src/main/java/com/iluwatar/RegisterWorkerService.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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; /** diff --git a/notification/src/main/java/com/iluwatar/ServerCommand.java b/notification/src/main/java/com/iluwatar/ServerCommand.java index 8c820d3de040..69af66cc0378 100644 --- a/notification/src/main/java/com/iluwatar/ServerCommand.java +++ b/notification/src/main/java/com/iluwatar/ServerCommand.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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; import lombok.AllArgsConstructor; diff --git a/notification/src/test/java/com/iluwatar/AppTest.java b/notification/src/test/java/com/iluwatar/AppTest.java index 8c20e97dabf5..8f5ff4a48d8d 100644 --- a/notification/src/test/java/com/iluwatar/AppTest.java +++ b/notification/src/test/java/com/iluwatar/AppTest.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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; import org.junit.jupiter.api.Test; diff --git a/notification/src/test/java/com/iluwatar/RegisterWorkerFormTest.java b/notification/src/test/java/com/iluwatar/RegisterWorkerFormTest.java index ffeccce82d3e..689403c5f692 100644 --- a/notification/src/test/java/com/iluwatar/RegisterWorkerFormTest.java +++ b/notification/src/test/java/com/iluwatar/RegisterWorkerFormTest.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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; import ch.qos.logback.classic.spi.ILoggingEvent; diff --git a/notification/src/test/java/com/iluwatar/RegisterWorkerTest.java b/notification/src/test/java/com/iluwatar/RegisterWorkerTest.java index 7b258afb6642..994c6ab580b2 100644 --- a/notification/src/test/java/com/iluwatar/RegisterWorkerTest.java +++ b/notification/src/test/java/com/iluwatar/RegisterWorkerTest.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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; import lombok.extern.slf4j.Slf4j; diff --git a/optimistic-offline-lock/src/main/java/com/iluwatar/api/UpdateService.java b/optimistic-offline-lock/src/main/java/com/iluwatar/api/UpdateService.java index b3c29d22f0b9..e41af6d50bcf 100644 --- a/optimistic-offline-lock/src/main/java/com/iluwatar/api/UpdateService.java +++ b/optimistic-offline-lock/src/main/java/com/iluwatar/api/UpdateService.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.api; /** diff --git a/optimistic-offline-lock/src/main/java/com/iluwatar/exception/ApplicationException.java b/optimistic-offline-lock/src/main/java/com/iluwatar/exception/ApplicationException.java index 7d12c3350e8b..4dbd1918bc7b 100644 --- a/optimistic-offline-lock/src/main/java/com/iluwatar/exception/ApplicationException.java +++ b/optimistic-offline-lock/src/main/java/com/iluwatar/exception/ApplicationException.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.exception; /** diff --git a/optimistic-offline-lock/src/main/java/com/iluwatar/model/Card.java b/optimistic-offline-lock/src/main/java/com/iluwatar/model/Card.java index b36c779d6ba4..73e27b2ec077 100644 --- a/optimistic-offline-lock/src/main/java/com/iluwatar/model/Card.java +++ b/optimistic-offline-lock/src/main/java/com/iluwatar/model/Card.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.model; diff --git a/optimistic-offline-lock/src/main/java/com/iluwatar/repository/JpaRepository.java b/optimistic-offline-lock/src/main/java/com/iluwatar/repository/JpaRepository.java index b1d3c240a0ce..c7ba389bd7cb 100644 --- a/optimistic-offline-lock/src/main/java/com/iluwatar/repository/JpaRepository.java +++ b/optimistic-offline-lock/src/main/java/com/iluwatar/repository/JpaRepository.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.repository; /** diff --git a/optimistic-offline-lock/src/main/java/com/iluwatar/service/CardUpdateService.java b/optimistic-offline-lock/src/main/java/com/iluwatar/service/CardUpdateService.java index 0f67c1e5e85f..d36e092c9e06 100644 --- a/optimistic-offline-lock/src/main/java/com/iluwatar/service/CardUpdateService.java +++ b/optimistic-offline-lock/src/main/java/com/iluwatar/service/CardUpdateService.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.service; import com.iluwatar.api.UpdateService; diff --git a/optimistic-offline-lock/src/test/java/com/iluwatar/OptimisticLockTest.java b/optimistic-offline-lock/src/test/java/com/iluwatar/OptimisticLockTest.java index 479b5807838e..c50ed8780107 100644 --- a/optimistic-offline-lock/src/test/java/com/iluwatar/OptimisticLockTest.java +++ b/optimistic-offline-lock/src/test/java/com/iluwatar/OptimisticLockTest.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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; import com.iluwatar.exception.ApplicationException; diff --git a/serialized-entity/pom.xml b/serialized-entity/pom.xml index 754089acf182..aea122f5a0ac 100644 --- a/serialized-entity/pom.xml +++ b/serialized-entity/pom.xml @@ -1,4 +1,30 @@ + 4.0.0 diff --git a/single-table-inheritance/pom.xml b/single-table-inheritance/pom.xml index 2bef8842e07a..a9ea9c70e305 100644 --- a/single-table-inheritance/pom.xml +++ b/single-table-inheritance/pom.xml @@ -1,4 +1,30 @@ + diff --git a/single-table-inheritance/src/main/java/com/iluwatar/SingleTableInheritance.java b/single-table-inheritance/src/main/java/com/iluwatar/SingleTableInheritance.java index 01fbb37b828f..6df96e4f73b3 100644 --- a/single-table-inheritance/src/main/java/com/iluwatar/SingleTableInheritance.java +++ b/single-table-inheritance/src/main/java/com/iluwatar/SingleTableInheritance.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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; import com.iluwatar.entity.Car; diff --git a/single-table-inheritance/src/main/java/com/iluwatar/entity/Car.java b/single-table-inheritance/src/main/java/com/iluwatar/entity/Car.java index 10e7fb2f12fd..932b71af23d2 100644 --- a/single-table-inheritance/src/main/java/com/iluwatar/entity/Car.java +++ b/single-table-inheritance/src/main/java/com/iluwatar/entity/Car.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.entity; import jakarta.persistence.DiscriminatorValue; diff --git a/single-table-inheritance/src/main/java/com/iluwatar/entity/Freighter.java b/single-table-inheritance/src/main/java/com/iluwatar/entity/Freighter.java index 0c20aacefe1c..32fcda144b7e 100644 --- a/single-table-inheritance/src/main/java/com/iluwatar/entity/Freighter.java +++ b/single-table-inheritance/src/main/java/com/iluwatar/entity/Freighter.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.entity; import jakarta.persistence.DiscriminatorValue; diff --git a/single-table-inheritance/src/main/java/com/iluwatar/entity/PassengerVehicle.java b/single-table-inheritance/src/main/java/com/iluwatar/entity/PassengerVehicle.java index c27818a9a1d9..4d1744b89b42 100644 --- a/single-table-inheritance/src/main/java/com/iluwatar/entity/PassengerVehicle.java +++ b/single-table-inheritance/src/main/java/com/iluwatar/entity/PassengerVehicle.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.entity; import lombok.Data; diff --git a/single-table-inheritance/src/main/java/com/iluwatar/entity/Train.java b/single-table-inheritance/src/main/java/com/iluwatar/entity/Train.java index d7bc226bea27..00d881054c78 100644 --- a/single-table-inheritance/src/main/java/com/iluwatar/entity/Train.java +++ b/single-table-inheritance/src/main/java/com/iluwatar/entity/Train.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.entity; import jakarta.persistence.DiscriminatorValue; diff --git a/single-table-inheritance/src/main/java/com/iluwatar/entity/TransportVehicle.java b/single-table-inheritance/src/main/java/com/iluwatar/entity/TransportVehicle.java index 9f9c60516e88..d3c104f3aa4d 100644 --- a/single-table-inheritance/src/main/java/com/iluwatar/entity/TransportVehicle.java +++ b/single-table-inheritance/src/main/java/com/iluwatar/entity/TransportVehicle.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.entity; import lombok.Data; diff --git a/single-table-inheritance/src/main/java/com/iluwatar/entity/Truck.java b/single-table-inheritance/src/main/java/com/iluwatar/entity/Truck.java index 26ae2724c7bc..56f2d0f955ec 100644 --- a/single-table-inheritance/src/main/java/com/iluwatar/entity/Truck.java +++ b/single-table-inheritance/src/main/java/com/iluwatar/entity/Truck.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.entity; import jakarta.persistence.DiscriminatorValue; diff --git a/single-table-inheritance/src/main/java/com/iluwatar/entity/Vehicle.java b/single-table-inheritance/src/main/java/com/iluwatar/entity/Vehicle.java index 814894d64d28..992c4de9cd8b 100644 --- a/single-table-inheritance/src/main/java/com/iluwatar/entity/Vehicle.java +++ b/single-table-inheritance/src/main/java/com/iluwatar/entity/Vehicle.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.entity; import jakarta.persistence.DiscriminatorColumn; diff --git a/single-table-inheritance/src/main/java/com/iluwatar/repository/VehicleRepository.java b/single-table-inheritance/src/main/java/com/iluwatar/repository/VehicleRepository.java index 5aec26c3aa95..42ee063ee5c4 100644 --- a/single-table-inheritance/src/main/java/com/iluwatar/repository/VehicleRepository.java +++ b/single-table-inheritance/src/main/java/com/iluwatar/repository/VehicleRepository.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.repository; import com.iluwatar.entity.Vehicle; diff --git a/single-table-inheritance/src/main/java/com/iluwatar/service/VehicleService.java b/single-table-inheritance/src/main/java/com/iluwatar/service/VehicleService.java index 4aeacd04824d..66946c8139d7 100644 --- a/single-table-inheritance/src/main/java/com/iluwatar/service/VehicleService.java +++ b/single-table-inheritance/src/main/java/com/iluwatar/service/VehicleService.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.service; import com.iluwatar.entity.Vehicle; diff --git a/singleton/src/test/java/com/iluwatar/singleton/BillPughImplementationTest.java b/singleton/src/test/java/com/iluwatar/singleton/BillPughImplementationTest.java index 90a3424e412c..c3b2c7f12818 100644 --- a/singleton/src/test/java/com/iluwatar/singleton/BillPughImplementationTest.java +++ b/singleton/src/test/java/com/iluwatar/singleton/BillPughImplementationTest.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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.singleton; /** diff --git a/thread-local-storage/src/main/java/com/iluwatar/AbstractThreadLocalExample.java b/thread-local-storage/src/main/java/com/iluwatar/AbstractThreadLocalExample.java index 0ab20a24e86c..3d495a61e1cb 100644 --- a/thread-local-storage/src/main/java/com/iluwatar/AbstractThreadLocalExample.java +++ b/thread-local-storage/src/main/java/com/iluwatar/AbstractThreadLocalExample.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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; import java.security.SecureRandom; diff --git a/thread-local-storage/src/main/java/com/iluwatar/WithThreadLocal.java b/thread-local-storage/src/main/java/com/iluwatar/WithThreadLocal.java index d66440d8330c..d2b1482e7dc1 100644 --- a/thread-local-storage/src/main/java/com/iluwatar/WithThreadLocal.java +++ b/thread-local-storage/src/main/java/com/iluwatar/WithThreadLocal.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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; import java.util.function.Consumer; diff --git a/thread-local-storage/src/main/java/com/iluwatar/WithoutThreadLocal.java b/thread-local-storage/src/main/java/com/iluwatar/WithoutThreadLocal.java index 8d60659eeaac..76d30b7d4b65 100644 --- a/thread-local-storage/src/main/java/com/iluwatar/WithoutThreadLocal.java +++ b/thread-local-storage/src/main/java/com/iluwatar/WithoutThreadLocal.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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; import java.util.function.Consumer; diff --git a/thread-local-storage/src/test/java/ThreadLocalTest.java b/thread-local-storage/src/test/java/ThreadLocalTest.java index 974b7ec8bab0..9a31e48a838c 100644 --- a/thread-local-storage/src/test/java/ThreadLocalTest.java +++ b/thread-local-storage/src/test/java/ThreadLocalTest.java @@ -1,3 +1,27 @@ +/* + * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). + * + * The MIT License + * Copyright © 2014-2022 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 com.iluwatar.WithThreadLocal; import com.iluwatar.WithoutThreadLocal; import org.junit.jupiter.api.AfterEach; From 9538c7820c34e879443078d9614fb570a00b4911 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 30 Mar 2024 13:54:59 +0200 Subject: [PATCH 023/580] docs: Collection pipeline explanation (#2875) * collection pipeline docs + refactoring * restore imperative programming code --- collection-pipeline/README.md | 136 ++++++++++++++++-- .../com/iluwatar/collectionpipeline/Car.java | 17 +-- .../FunctionalProgramming.java | 14 +- .../ImperativeProgramming.java | 18 +-- .../iluwatar/collectionpipeline/Person.java | 10 +- 5 files changed, 148 insertions(+), 47 deletions(-) diff --git a/collection-pipeline/README.md b/collection-pipeline/README.md index 3ae285accb69..aab323e0ec14 100644 --- a/collection-pipeline/README.md +++ b/collection-pipeline/README.md @@ -3,25 +3,145 @@ title: Collection Pipeline category: Functional language: en tag: - - Reactive + - Reactive + - Data processing --- ## Intent -Collection Pipeline introduces Function Composition and Collection Pipeline, two functional-style patterns that you can combine to iterate collections in your code. -In functional programming, it's common to sequence complex operations through a series of smaller modular functions or operations. The series is called a composition of functions, or a function composition. When a collection of data flows through a function composition, it becomes a collection pipeline. Function Composition and Collection Pipeline are two design patterns frequently used in functional-style programming. + +The Collection Pipeline design pattern is intended to process collections of data by chaining together operations in a +sequence where the output of one operation is the input for the next. It promotes a declarative approach to handling +collections, focusing on what should be done rather than how. + +## Explanation + +Real-world example + +> Imagine you're in a large library filled with books, and you're tasked with finding all the science fiction books +> published after 2000, then arranging them by author name in alphabetical order, and finally picking out the top 5 based +> on their popularity or ratings. + +In plain words + +> The Collection Pipeline pattern involves processing data by passing it through a series of operations, each +> transforming the data in sequence, much like an assembly line in a factory. + +Wikipedia says + +> In software engineering, a pipeline consists of a chain of processing elements (processes, threads, coroutines, +> functions, etc.), arranged so that the output of each element is the input of the next; the name is by analogy to a +> physical pipeline. Usually some amount of buffering is provided between consecutive elements. The information that flows +> in these pipelines is often a stream of records, bytes, or bits, and the elements of a pipeline may be called filters; +> this is also called the pipe(s) and filters design pattern. Connecting elements into a pipeline is analogous to function +> composition. + +**Programmatic Example** + +The Collection Pipeline pattern is implemented in this code example by using Java's Stream API to perform a series of +transformations on a collection of Car objects. The transformations are chained together to form a pipeline. Here's a +breakdown of how it's done: + +1. Creation of Cars: A list of Car objects is created using the `CarFactory.createCars()` method. + +`var cars = CarFactory.createCars();` + +2. Filtering and Transforming: The `FunctionalProgramming.getModelsAfter2000(cars)` method filters the cars to only + include those made after the year 2000, and then transforms the filtered cars into a list of their model names. + +`var modelsFunctional = FunctionalProgramming.getModelsAfter2000(cars);` + +In the `getModelsAfter2000` method, the pipeline is created as follows: + +```java +public static List getModelsAfter2000(List cars){ + return cars.stream().filter(car->car.getYear()>2000) + .sorted(comparing(Car::getYear)) + .map(Car::getModel) + .collect(toList()); + } +``` + +3. Grouping: The `FunctionalProgramming.getGroupingOfCarsByCategory(cars)` method groups the cars by their category. + +`var groupingByCategoryFunctional = FunctionalProgramming.getGroupingOfCarsByCategory(cars);` + +In the getGroupingOfCarsByCategory method, the pipeline is created as follows: + +```java +public static Map>getGroupingOfCarsByCategory(List cars){ + return cars.stream().collect(groupingBy(Car::getCategory)); + } +``` + +4. Filtering, Sorting and Transforming: The `FunctionalProgramming.getSedanCarsOwnedSortedByDate(List.of(john))` method + filters the cars owned by a person to only include sedans, sorts them by date, and then transforms the sorted cars + into a list of Car objects. + +`var sedansOwnedFunctional = FunctionalProgramming.getSedanCarsOwnedSortedByDate(List.of(john));` + +In the `getSedanCarsOwnedSortedByDate` method, the pipeline is created as follows: + +```java +public static List getSedanCarsOwnedSortedByDate(List persons){ + return persons.stream().flatMap(person->person.getCars().stream()) + .filter(car->Category.SEDAN.equals(car.getCategory())) + .sorted(comparing(Car::getDate)) + .collect(toList()); + } +``` + +In each of these methods, the Collection Pipeline pattern is used to perform a series of operations on the collection of +cars in a declarative manner, which improves readability and maintainability. ## Class diagram + ![alt text](./etc/collection-pipeline.png "Collection Pipeline") ## Applicability -Use the Collection Pipeline pattern when -* When you want to perform a sequence of operations where one operation's collected output is fed into the next -* When you use a lot of statements in your code -* When you use a lot of loops in your code +This pattern is applicable in scenarios involving bulk data operations such as filtering, mapping, sorting, or reducing +collections. It's particularly useful in data analysis, transformation tasks, and where a sequence of operations needs +to be applied to each element of a collection. + +## Known Uses + +* LINQ in .NET +* Stream API in Java 8+ +* Collections in modern functional languages (e.g., Haskell, Scala) +* Database query builders and ORM frameworks + +## Consequences + +Benefits: + +* Readability: The code is more readable and declarative, making it easier to understand the sequence of operations. +* Maintainability: Easier to modify or extend the pipeline with additional operations. +* Reusability: Common operations can be abstracted into reusable functions. +* Lazy Evaluation: Some implementations allow for operations to be lazily evaluated, improving performance. + +Trade-offs: + +* Performance Overhead: Chaining multiple operations can introduce overhead compared to traditional loops, especially + for short pipelines or very large collections. +* Debugging Difficulty: Debugging a chain of operations might be more challenging due to the lack of intermediate + variables. +* Limited to Collections: Primarily focused on collections, and its utility might be limited outside of collection + processing. + +## Related Patterns + +* [Builder](https://java-design-patterns.com/patterns/builder/): Similar fluent interface style but used for object + construction. +* [Chain of Responsibility](https://java-design-patterns.com/patterns/chain-of-responsibility/): Conceptually similar in + chaining handlers, but applied to object requests rather than data collection processing. +* [Strategy](https://java-design-patterns.com/patterns/strategy/): Can be used within a pipeline stage to encapsulate + different algorithms that can be selected at runtime. ## Credits * [Function composition and the Collection Pipeline pattern](https://www.ibm.com/developerworks/library/j-java8idioms2/index.html) -* [Martin Fowler](https://martinfowler.com/articles/collection-pipeline/) +* [Collection Pipeline described by Martin Fowler](https://martinfowler.com/articles/collection-pipeline/) * [Java8 Streams](https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html) +* [Refactoring: Improving the Design of Existing Code](https://amzn.to/3VDMWDO) +* [Functional Programming in Scala](https://amzn.to/4cEo6K2) +* [Java 8 in Action: Lambdas, Streams, and functional-style programming](https://amzn.to/3THp4wy) diff --git a/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/Car.java b/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/Car.java index 97e13231b24f..2cfeb963ba49 100644 --- a/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/Car.java +++ b/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/Car.java @@ -22,22 +22,11 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.collectionpipeline; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +package com.iluwatar.collectionpipeline; /** * A Car class that has the properties of make, model, year and category. */ -@Getter -@EqualsAndHashCode -@RequiredArgsConstructor -public class Car { - private final String make; - private final String model; - private final int year; - private final Category category; - -} \ No newline at end of file +public record Car(String make, String model, int year, Category category) { +} diff --git a/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/FunctionalProgramming.java b/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/FunctionalProgramming.java index adf0fda4bda2..20bf77d29a2f 100644 --- a/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/FunctionalProgramming.java +++ b/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/FunctionalProgramming.java @@ -22,6 +22,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ + package com.iluwatar.collectionpipeline; import java.util.Comparator; @@ -54,9 +55,8 @@ private FunctionalProgramming() { * @return {@link List} of {@link String} representing models built after year 2000 */ public static List getModelsAfter2000(List cars) { - return cars.stream().filter(car -> car.getYear() > 2000) - .sorted(Comparator.comparing(Car::getYear)) - .map(Car::getModel).toList(); + return cars.stream().filter(car -> car.year() > 2000).sorted(Comparator.comparing(Car::year)) + .map(Car::model).toList(); } /** @@ -66,7 +66,7 @@ public static List getModelsAfter2000(List cars) { * @return {@link Map} with category as key and cars belonging to that category as value */ public static Map> getGroupingOfCarsByCategory(List cars) { - return cars.stream().collect(Collectors.groupingBy(Car::getCategory)); + return cars.stream().collect(Collectors.groupingBy(Car::category)); } /** @@ -76,8 +76,8 @@ public static Map> getGroupingOfCarsByCategory(List car * @return {@link List} of {@link Car} to belonging to the group */ public static List getSedanCarsOwnedSortedByDate(List persons) { - return persons.stream().map(Person::getCars).flatMap(List::stream) - .filter(car -> Category.SEDAN.equals(car.getCategory())) - .sorted(Comparator.comparing(Car::getYear)).toList(); + return persons.stream().map(Person::cars).flatMap(List::stream) + .filter(car -> Category.SEDAN.equals(car.category())) + .sorted(Comparator.comparing(Car::year)).toList(); } } diff --git a/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/ImperativeProgramming.java b/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/ImperativeProgramming.java index e3359a389b0d..2a85334c6643 100644 --- a/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/ImperativeProgramming.java +++ b/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/ImperativeProgramming.java @@ -61,7 +61,7 @@ public static List getModelsAfter2000(List cars) { List carsSortedByYear = new ArrayList<>(); for (Car car : cars) { - if (car.getYear() > 2000) { + if (car.year() > 2000) { carsSortedByYear.add(car); } } @@ -69,13 +69,13 @@ public static List getModelsAfter2000(List cars) { Collections.sort(carsSortedByYear, new Comparator() { @Override public int compare(Car car1, Car car2) { - return car1.getYear() - car2.getYear(); + return car1.year() - car2.year(); } }); List models = new ArrayList<>(); for (Car car : carsSortedByYear) { - models.add(car.getModel()); + models.add(car.model()); } return models; @@ -90,12 +90,12 @@ public int compare(Car car1, Car car2) { public static Map> getGroupingOfCarsByCategory(List cars) { Map> groupingByCategory = new HashMap<>(); for (Car car : cars) { - if (groupingByCategory.containsKey(car.getCategory())) { - groupingByCategory.get(car.getCategory()).add(car); + if (groupingByCategory.containsKey(car.category())) { + groupingByCategory.get(car.category()).add(car); } else { List categoryCars = new ArrayList<>(); categoryCars.add(car); - groupingByCategory.put(car.getCategory(), categoryCars); + groupingByCategory.put(car.category(), categoryCars); } } return groupingByCategory; @@ -111,12 +111,12 @@ public static Map> getGroupingOfCarsByCategory(List car public static List getSedanCarsOwnedSortedByDate(List persons) { List cars = new ArrayList<>(); for (Person person : persons) { - cars.addAll(person.getCars()); + cars.addAll(person.cars()); } List sedanCars = new ArrayList<>(); for (Car car : cars) { - if (Category.SEDAN.equals(car.getCategory())) { + if (Category.SEDAN.equals(car.category())) { sedanCars.add(car); } } @@ -124,7 +124,7 @@ public static List getSedanCarsOwnedSortedByDate(List persons) { sedanCars.sort(new Comparator() { @Override public int compare(Car o1, Car o2) { - return o1.getYear() - o2.getYear(); + return o1.year() - o2.year(); } }); diff --git a/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/Person.java b/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/Person.java index 80b6a8bf0303..992596125423 100644 --- a/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/Person.java +++ b/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/Person.java @@ -25,16 +25,8 @@ package com.iluwatar.collectionpipeline; import java.util.List; -import lombok.Getter; -import lombok.RequiredArgsConstructor; /** * A Person class that has the list of cars that the person owns and use. */ -@Getter -@RequiredArgsConstructor -public class Person { - - private final List cars; - -} \ No newline at end of file +public record Person(List cars) {} From 8471c93035b643528455cbba3957a0922d17e4de Mon Sep 17 00:00:00 2001 From: Jun Kang Date: Sat, 30 Mar 2024 20:58:18 +0900 Subject: [PATCH 024/580] deps: Updated the maven imports of page-controller pattern for SpringBoot 3.2.4 (#2862) * Updated the imports in code of the single table inheritance pattern for Spring Boot 3.x #2825 Change javax library to jakarta * add pom.xml * Updated the imports in code of the healthcheck pattern for SpringBoot 3.x Change javax library to jakarta and update maven dependency versions * change order of imports to pass Checkstyle violations * change import order to pass lexicographical order test * change import order to pass CustomImportOrder warning * Updated the maven imports of layers pattern for SpringBoot 3.2.4 * remove unused maven import * Updated the maven imports of page-controller pattern for SpringBoot 3.2.4 - add page-controller module on parent pom.xml - add artifact information on page-controller pom.xml - add Springboot3, proper test dependencies on page-controller pom.xml --- page-controller/pom.xml | 21 ++++++++++++++++++++- pom.xml | 1 + 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/page-controller/pom.xml b/page-controller/pom.xml index 1e75f7f86221..64e3c8a3a46e 100644 --- a/page-controller/pom.xml +++ b/page-controller/pom.xml @@ -29,12 +29,26 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - page-controller com.iluwatar java-design-patterns 1.26.0-SNAPSHOT + page-controller + page-controller + page-controller + + + + org.springframework.boot + spring-boot-dependencies + pom + 3.2.4 + import + + + + org.springframework @@ -62,6 +76,11 @@ mockito-core test + + org.springframework.boot + spring-boot-starter-test + test + org.springframework spring-test diff --git a/pom.xml b/pom.xml index 399e7f9895a7..34874b5b3665 100644 --- a/pom.xml +++ b/pom.xml @@ -138,6 +138,7 @@ abstract-document aggregator-microservices promise + page-controller page-object event-asynchronous event-queue From 30ac97fe5900415e0d458fdfc6c58cbb2333a972 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 30 Mar 2024 14:44:22 +0200 Subject: [PATCH 025/580] docs: update Command documentation --- command/README.md | 257 ++++++++++++++++++++++++++-------------------- 1 file changed, 144 insertions(+), 113 deletions(-) diff --git a/command/README.md b/command/README.md index a3b863b78cbe..e280fc166d94 100644 --- a/command/README.md +++ b/command/README.md @@ -3,19 +3,21 @@ title: Command category: Behavioral language: en tag: - - Gang of Four + - Gang of Four --- ## Also known as -Action, Transaction +* Action +* Transaction ## Intent -Encapsulate a request as an object, thereby letting you parameterize clients with different -requests, queue or log requests, and support undoable operations. +The Command design pattern encapsulates a request as an object, thereby allowing for parameterization of clients with +queues, requests, and operations. It also allows for the support of undoable operations. ## Explanation + Real-world example > There is a wizard casting spells on a goblin. The spells are executed on the goblin one by one. @@ -37,155 +39,158 @@ Wikipedia says Here's the sample code with wizard and goblin. Let's start from the `Wizard` class. ```java + @Slf4j public class Wizard { - private final Deque undoStack = new LinkedList<>(); - private final Deque redoStack = new LinkedList<>(); + private final Deque undoStack = new LinkedList<>(); + private final Deque redoStack = new LinkedList<>(); - public Wizard() {} + public Wizard() { + } - public void castSpell(Runnable runnable) { - runnable.run(); - undoStack.offerLast(runnable); - } + public void castSpell(Runnable runnable) { + runnable.run(); + undoStack.offerLast(runnable); + } - public void undoLastSpell() { - if (!undoStack.isEmpty()) { - var previousSpell = undoStack.pollLast(); - redoStack.offerLast(previousSpell); - previousSpell.run(); + public void undoLastSpell() { + if (!undoStack.isEmpty()) { + var previousSpell = undoStack.pollLast(); + redoStack.offerLast(previousSpell); + previousSpell.run(); + } } - } - public void redoLastSpell() { - if (!redoStack.isEmpty()) { - var previousSpell = redoStack.pollLast(); - undoStack.offerLast(previousSpell); - previousSpell.run(); + public void redoLastSpell() { + if (!redoStack.isEmpty()) { + var previousSpell = redoStack.pollLast(); + undoStack.offerLast(previousSpell); + previousSpell.run(); + } } - } - @Override - public String toString() { - return "Wizard"; - } + @Override + public String toString() { + return "Wizard"; + } } ``` Next, we have the goblin who's the target of the spells. ```java + @Slf4j public abstract class Target { - private Size size; + private Size size; - private Visibility visibility; + private Visibility visibility; - public Size getSize() { - return size; - } + public Size getSize() { + return size; + } - public void setSize(Size size) { - this.size = size; - } + public void setSize(Size size) { + this.size = size; + } - public Visibility getVisibility() { - return visibility; - } + public Visibility getVisibility() { + return visibility; + } - public void setVisibility(Visibility visibility) { - this.visibility = visibility; - } + public void setVisibility(Visibility visibility) { + this.visibility = visibility; + } - @Override - public abstract String toString(); + @Override + public abstract String toString(); - public void printStatus() { - LOGGER.info("{}, [size={}] [visibility={}]", this, getSize(), getVisibility()); - } + public void printStatus() { + LOGGER.info("{}, [size={}] [visibility={}]", this, getSize(), getVisibility()); + } } public class Goblin extends Target { - public Goblin() { - setSize(Size.NORMAL); - setVisibility(Visibility.VISIBLE); - } - - @Override - public String toString() { - return "Goblin"; - } - - public void changeSize() { - var oldSize = getSize() == Size.NORMAL ? Size.SMALL : Size.NORMAL; - setSize(oldSize); - } - - public void changeVisibility() { - var visible = getVisibility() == Visibility.INVISIBLE - ? Visibility.VISIBLE : Visibility.INVISIBLE; - setVisibility(visible); - } + public Goblin() { + setSize(Size.NORMAL); + setVisibility(Visibility.VISIBLE); + } + + @Override + public String toString() { + return "Goblin"; + } + + public void changeSize() { + var oldSize = getSize() == Size.NORMAL ? Size.SMALL : Size.NORMAL; + setSize(oldSize); + } + + public void changeVisibility() { + var visible = getVisibility() == Visibility.INVISIBLE + ? Visibility.VISIBLE : Visibility.INVISIBLE; + setVisibility(visible); + } } ``` Finally, we have the wizard in the main function casting spells. ```java -public static void main(String[] args) { - var wizard = new Wizard(); - var goblin = new Goblin(); +public static void main(String[]args){ + var wizard=new Wizard(); + var goblin=new Goblin(); - // casts shrink/unshrink spell - wizard.castSpell(goblin::changeSize); + // casts shrink/unshrink spell + wizard.castSpell(goblin::changeSize); - // casts visible/invisible spell - wizard.castSpell(goblin::changeVisibility); + // casts visible/invisible spell + wizard.castSpell(goblin::changeVisibility); - // undo and redo casts - wizard.undoLastSpell(); - wizard.redoLastSpell(); + // undo and redo casts + wizard.undoLastSpell(); + wizard.redoLastSpell(); ``` Here's the whole example in action. ```java -var wizard = new Wizard(); -var goblin = new Goblin(); +var wizard=new Wizard(); + var goblin=new Goblin(); -goblin.printStatus(); -wizard.castSpell(goblin::changeSize); -goblin.printStatus(); + goblin.printStatus(); + wizard.castSpell(goblin::changeSize); + goblin.printStatus(); -wizard.castSpell(goblin::changeVisibility); -goblin.printStatus(); + wizard.castSpell(goblin::changeVisibility); + goblin.printStatus(); -wizard.undoLastSpell(); -goblin.printStatus(); + wizard.undoLastSpell(); + goblin.printStatus(); -wizard.undoLastSpell(); -goblin.printStatus(); + wizard.undoLastSpell(); + goblin.printStatus(); -wizard.redoLastSpell(); -goblin.printStatus(); + wizard.redoLastSpell(); + goblin.printStatus(); -wizard.redoLastSpell(); -goblin.printStatus(); + wizard.redoLastSpell(); + goblin.printStatus(); ``` Here's the program output: ```java -Goblin, [size=normal] [visibility=visible] -Goblin, [size=small] [visibility=visible] -Goblin, [size=small] [visibility=invisible] -Goblin, [size=small] [visibility=visible] -Goblin, [size=normal] [visibility=visible] -Goblin, [size=small] [visibility=visible] -Goblin, [size=small] [visibility=invisible] +Goblin,[size=normal][visibility=visible] + Goblin,[size=small][visibility=visible] + Goblin,[size=small][visibility=invisible] + Goblin,[size=small][visibility=visible] + Goblin,[size=normal][visibility=visible] + Goblin,[size=small][visibility=visible] + Goblin,[size=small][visibility=invisible] ``` ## Class diagram @@ -197,40 +202,66 @@ Goblin, [size=small] [visibility=invisible] Use the Command pattern when you want to: * Parameterize objects by an action to perform. You can express such parameterization in a -procedural language with a callback function, that is, a function that's registered somewhere to be -called at a later point. Commands are an object-oriented replacement for callbacks. + procedural language with a callback function, that is, a function that's registered somewhere to be + called at a later point. Commands are an object-oriented replacement for callbacks. * Specify, queue, and execute requests at different times. A Command object can have a life -independent of the original request. If the receiver of a request can be represented in an address -space-independent way, then you can transfer a command object for the request to a different process -and fulfill the request there. + independent of the original request. If the receiver of a request can be represented in an address + space-independent way, then you can transfer a command object for the request to a different process + and fulfill the request there. * Support undo. The Command's execute operation can store state for reversing its effects in the -command itself. The Command interface must have an added un-execute operation that reverses the -effects of a previous call to execute. The executed commands are stored in a history list. -Unlimited-level undo and redo functionality is achieved by traversing this list backward and forward + command itself. The Command interface must have an added un-execute operation that reverses the + effects of a previous call to execute. The executed commands are stored in a history list. + Unlimited-level undo and redo functionality is achieved by traversing this list backward and forward calling un-execute and execute, respectively. * Support logging changes so that they can be reapplied in case of a system crash. By augmenting the -Command interface with load and store operations, you can keep a persistent log of changes. -Recovering from a crash involves reloading logged commands from the disk and re-executing them with -the execute operation. + Command interface with load and store operations, you can keep a persistent log of changes. + Recovering from a crash involves reloading logged commands from the disk and re-executing them with + the execute operation. * Structure a system around high-level operations build on primitive operations. Such a structure is -common in information systems that support transactions. A transaction encapsulates a set of data -changes. The Command pattern offers a way to model transactions. Commands have a common interface, -letting you invoke all transactions the same way. The pattern also makes it easy to extend the -system with new transactions. + common in information systems that support transactions. A transaction encapsulates a set of data + changes. The Command pattern offers a way to model transactions. Commands have a common interface, + letting you invoke all transactions the same way. The pattern also makes it easy to extend the + system with new transactions. * Keep a history of requests. * Implement callback functionality. * Implement the undo functionality. ## Known uses +* GUI Buttons and menu items in desktop applications. +* Operations in database systems and transactional systems that support rollback. +* Macro recording in applications like text editors and spreadsheets. * [java.lang.Runnable](http://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html) * [org.junit.runners.model.Statement](https://github.com/junit-team/junit4/blob/master/src/main/java/org/junit/runners/model/Statement.java) * [Netflix Hystrix](https://github.com/Netflix/Hystrix/wiki) * [javax.swing.Action](http://docs.oracle.com/javase/8/docs/api/javax/swing/Action.html) +## Consequences + +Benefits: + +* Decouples the object that invokes the operation from the one that knows how to perform it. +* It's easy to add new Commands, because you don't have to change existing classes. +* You can assemble a set of commands into a composite command. + +Trade-offs: + +* Increases the number of classes for each individual command. +* Can complicate the design by adding multiple layers between senders and receivers. + +## Related Patterns + +* [Composite](https://java-design-patterns.com/patterns/composite/): Commands can be composed using the Composite + pattern + to create macro commands. +* [Memento](https://java-design-patterns.com/patterns/memento/): Can be used for implementing undo mechanisms. +* [Observer](https://java-design-patterns.com/patterns/observer/): The pattern can be observed for changes that trigger + commands. + ## Credits * [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59) * [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b) * [Refactoring to Patterns](https://www.amazon.com/gp/product/0321213351/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321213351&linkCode=as2&tag=javadesignpat-20&linkId=2a76fcb387234bc71b1c61150b3cc3a7) * [J2EE Design Patterns](https://www.amazon.com/gp/product/0596004273/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596004273&linkCode=as2&tag=javadesignpat-20&linkId=f27d2644fbe5026ea448791a8ad09c94) +* [Pattern-Oriented Software Architecture, Volume 1: A System of Patterns](https://amzn.to/3PFUqSY) From 2228212c2361c3ed54babe2b3778f386f5aac9d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 30 Mar 2024 14:44:43 +0200 Subject: [PATCH 026/580] docs: explanation for combinator (#2877) --- combinator/README.md | 299 ++++++++++-------- .../com/iluwatar/combinator/FinderTest.java | 9 +- .../com/iluwatar/combinator/FindersTest.java | 40 +-- 3 files changed, 190 insertions(+), 158 deletions(-) diff --git a/combinator/README.md b/combinator/README.md index 15ec1ea59019..70b6a82f7942 100644 --- a/combinator/README.md +++ b/combinator/README.md @@ -1,132 +1,136 @@ --- title: Combinator -category: Idiom +category: Functional language: en tag: - - Reactive + - Idiom + - Reactive --- ## Also known as -Composition pattern +* Function Composition +* Functional Combinator ## Intent -The functional pattern representing a style of organizing libraries centered around the idea of combining functions. -Putting it simply, there is some type T, some functions for constructing “primitive†values of type T, and some “combinators†which can combine values of type T in various ways to build up more complex values of type T. +The Combinator pattern is intended to enable complex functionalities by combining simple functions into more complex +ones. It aims to achieve modularization and reusability by breaking down a task into simpler, interchangeable components +that can be composed in various ways. ## Explanation Real world example -> In computer science, combinatory logic is used as a simplified model of computation, used in computability theory and proof theory. Despite its simplicity, combinatory logic captures many essential features of computation. -> +> In computer science, combinatory logic is used as a simplified model of computation, used in computability theory and +> proof theory. Despite its simplicity, combinatory logic captures many essential features of computation. In plain words -> The combinator allows you to create new "things" from previously defined "things". -> +> The combinator allows you to create new "things" from previously defined "things" Wikipedia says -> A combinator is a higher-order function that uses only function application and earlier defined combinators to define a result from its arguments. -> +> A combinator is a higher-order function that uses only function application and earlier defined combinators to define +> a result from its arguments. **Programmatic Example** -Translating the combinator example above. First of all, we have a interface consist of several methods `contains`, `not`, `or`, `and` . +Translating the combinator example above. First of all, we have an interface consist of several +methods `contains`, `not`, `or`, `and` . ```java // Functional interface to find lines in text. public interface Finder { - // The function to find lines in text. - List find(String text); - - // Simple implementation of function {@link #find(String)}. - static Finder contains(String word) { - return txt -> Stream.of(txt.split("\n")) - .filter(line -> line.toLowerCase().contains(word.toLowerCase())) - .collect(Collectors.toList()); - } - - // combinator not. - default Finder not(Finder notFinder) { - return txt -> { - List res = this.find(txt); - res.removeAll(notFinder.find(txt)); - return res; - }; - } - - // combinator or. - default Finder or(Finder orFinder) { - return txt -> { - List res = this.find(txt); - res.addAll(orFinder.find(txt)); - return res; - }; - } - - // combinator and. - default Finder and(Finder andFinder) { - return - txt -> this - .find(txt) - .stream() - .flatMap(line -> andFinder.find(line).stream()) - .collect(Collectors.toList()); - } + // The function to find lines in text. + List find(String text); + + // Simple implementation of function {@link #find(String)}. + static Finder contains(String word) { + return txt -> Stream.of(txt.split("\n")) + .filter(line -> line.toLowerCase().contains(word.toLowerCase())) + .collect(Collectors.toList()); + } + + // combinator not. + default Finder not(Finder notFinder) { + return txt -> { + List res = this.find(txt); + res.removeAll(notFinder.find(txt)); + return res; + }; + } + + // combinator or. + default Finder or(Finder orFinder) { + return txt -> { + List res = this.find(txt); + res.addAll(orFinder.find(txt)); + return res; + }; + } + + // combinator and. + default Finder and(Finder andFinder) { + return + txt -> this + .find(txt) + .stream() + .flatMap(line -> andFinder.find(line).stream()) + .collect(Collectors.toList()); + } ... } ``` -Then we have also another combinator for some complex finders `advancedFinder`, `filteredFinder`, `specializedFinder` and `expandedFinder`. +Then we have also another combinator for some complex finders `advancedFinder`, `filteredFinder`, `specializedFinder` +and `expandedFinder`. ```java // Complex finders consisting of simple finder. public class Finders { - private Finders() { - } - - // Finder to find a complex query. - public static Finder advancedFinder(String query, String orQuery, String notQuery) { - return - Finder.contains(query) - .or(Finder.contains(orQuery)) - .not(Finder.contains(notQuery)); - } - - // Filtered finder looking a query with excluded queries as well. - public static Finder filteredFinder(String query, String... excludeQueries) { - var finder = Finder.contains(query); - - for (String q : excludeQueries) { - finder = finder.not(Finder.contains(q)); - } - return finder; - } - - // Specialized query. Every next query is looked in previous result. - public static Finder specializedFinder(String... queries) { - var finder = identMult(); - - for (String query : queries) { - finder = finder.and(Finder.contains(query)); - } - return finder; - } - - // Expanded query. Looking for alternatives. - public static Finder expandedFinder(String... queries) { - var finder = identSum(); - - for (String query : queries) { - finder = finder.or(Finder.contains(query)); - } - return finder; - } + private Finders() { + } + + // Finder to find a complex query. + public static Finder advancedFinder(String query, String orQuery, String notQuery) { + return + Finder.contains(query) + .or(Finder.contains(orQuery)) + .not(Finder.contains(notQuery)); + } + + // Filtered finder looking a query with excluded queries as well. + public static Finder filteredFinder(String query, String... excludeQueries) { + var finder = Finder.contains(query); + + for (String q : excludeQueries) { + finder = finder.not(Finder.contains(q)); + } + return finder; + } + + // Specialized query. Every next query is looked in previous result. + public static Finder specializedFinder(String... queries) { + var finder = identMult(); + + for (String query : queries) { + finder = finder.and(Finder.contains(query)); + } + return finder; + } + + // Expanded query. Looking for alternatives. + public static Finder expandedFinder(String... queries) { + var finder = identSum(); + + for (String query : queries) { + finder = finder.or(Finder.contains(query)); + } + return finder; + } ... } ``` @@ -134,75 +138,102 @@ public class Finders { Now we have created the interface and methods for combinators. Now we have an application working on these combinators. ```java -var queriesOr = new String[]{"many", "Annabel"}; -var finder = Finders.expandedFinder(queriesOr); -var res = finder.find(text()); -LOGGER.info("the result of expanded(or) query[{}] is {}", queriesOr, res); +var queriesOr=new String[]{"many","Annabel"}; + var finder=Finders.expandedFinder(queriesOr); + var res=finder.find(text()); + LOGGER.info("the result of expanded(or) query[{}] is {}",queriesOr,res); -var queriesAnd = new String[]{"Annabel", "my"}; -finder = Finders.specializedFinder(queriesAnd); -res = finder.find(text()); -LOGGER.info("the result of specialized(and) query[{}] is {}", queriesAnd, res); + var queriesAnd=new String[]{"Annabel","my"}; + finder=Finders.specializedFinder(queriesAnd); + res=finder.find(text()); + LOGGER.info("the result of specialized(and) query[{}] is {}",queriesAnd,res); -finder = Finders.advancedFinder("it was", "kingdom", "sea"); -res = finder.find(text()); -LOGGER.info("the result of advanced query is {}", res); + finder=Finders.advancedFinder("it was","kingdom","sea"); + res=finder.find(text()); + LOGGER.info("the result of advanced query is {}",res); -res = Finders.filteredFinder(" was ", "many", "child").find(text()); -LOGGER.info("the result of filtered query is {}", res); + res=Finders.filteredFinder(" was ","many","child").find(text()); + LOGGER.info("the result of filtered query is {}",res); -private static String text() { - return +private static String text(){ + return "It was many and many a year ago,\n" - + "In a kingdom by the sea,\n" - + "That a maiden there lived whom you may know\n" - + "By the name of ANNABEL LEE;\n" - + "And this maiden she lived with no other thought\n" - + "Than to love and be loved by me.\n" - + "I was a child and she was a child,\n" - + "In this kingdom by the sea;\n" - + "But we loved with a love that was more than love-\n" - + "I and my Annabel Lee;\n" - + "With a love that the winged seraphs of heaven\n" - + "Coveted her and me."; - } + +"In a kingdom by the sea,\n" + +"That a maiden there lived whom you may know\n" + +"By the name of ANNABEL LEE;\n" + +"And this maiden she lived with no other thought\n" + +"Than to love and be loved by me.\n" + +"I was a child and she was a child,\n" + +"In this kingdom by the sea;\n" + +"But we loved with a love that was more than love-\n" + +"I and my Annabel Lee;\n" + +"With a love that the winged seraphs of heaven\n" + +"Coveted her and me."; + } ``` **Program output:** ```java -the result of expanded(or) query[[many, Annabel]] is [It was many and many a year ago,, By the name of ANNABEL LEE;, I and my Annabel Lee;] -the result of specialized(and) query[[Annabel, my]] is [I and my Annabel Lee;] -the result of advanced query is [It was many and many a year ago,] -the result of filtered query is [But we loved with a love that was more than love-] +the result of expanded(or)query[[many,Annabel]]is[It was many and many a year ago,,By the name of ANNABEL LEE;,I and my Annabel Lee;] + the result of specialized(and)query[[Annabel,my]]is[I and my Annabel Lee;] + the result of advanced query is[It was many and many a year ago,] + the result of filtered query is[But we loved with a love that was more than love-] ``` -Now we can design our app to with the queries finding feature `expandedFinder`, `specializedFinder`, `advancedFinder`, `filteredFinder` which are all derived from `contains`, `or`, `not`, `and`. - +Now we can design our app to with the queries finding +feature `expandedFinder`, `specializedFinder`, `advancedFinder`, `filteredFinder` which are all derived +from `contains`, `or`, `not`, `and`. ## Class diagram + ![alt text](./etc/combinator.urm.png "Combinator class diagram") ## Applicability -Use the combinator pattern when: -- You are able to create a more complex value from more plain values but having the same type(a combination of them) +This pattern is applicable in scenarios where: + +* The solution to a problem can be constructed from simple, reusable components. +* There is a need for high modularity and reusability of functions. +* The programming environment supports first-class functions and higher-order functions. + +## Known Uses + +* Functional programming languages like Haskell and Scala extensively use combinators for tasks ranging from parsing to + UI construction. +* In domain-specific languages, particularly those involved in parsing, such as parsing expression grammars. +* In libraries for functional programming in languages like JavaScript, Python, and Ruby. +* java.util.function.Function#compose +* java.util.function.Function#andThen + +## Consequences + +Benefits: -## Benefits +* Enhances modularity and reusability by breaking down complex tasks into simpler, composable functions. +* Promotes readability and maintainability by using a declarative style of programming. +* Facilitates lazy evaluation and potentially more efficient execution through function composition. -- From a developers perspective the API is made of terms from the domain. -- There is a clear distinction between combining and application phase. -- One first constructs an instance and then executes it. -- This makes the pattern applicable in a parallel environment. +Trade-offs: +* Can lead to a steep learning curve for those unfamiliar with functional programming principles. +* May result in performance overhead due to the creation of intermediate functions. +* Debugging can be challenging due to the abstract nature of function compositions. -## Real world examples +## Related Patterns -- java.util.function.Function#compose -- java.util.function.Function#andThen +[Strategy](https://java-design-patterns.com/patterns/strategy/): Both involve selecting an algorithm at runtime, but +Combinator uses composition of functions. +[Decorator](https://java-design-patterns.com/patterns/decorator/): Similar to Combinator in enhancing functionality, but +Decorator focuses on object augmentation. +[Chain of Responsibility](https://java-design-patterns.com/patterns/chain-of-responsibility/): Relies on chaining +objects, whereas Combinator chains functions. ## Credits -- [Example for java](https://gtrefs.github.io/code/combinator-pattern/) +- [Example for Java](https://gtrefs.github.io/code/combinator-pattern/) - [Combinator pattern](https://wiki.haskell.org/Combinator_pattern) - [Combinatory logic](https://wiki.haskell.org/Combinatory_logic) +- [Structure and Interpretation of Computer Programs](https://amzn.to/3PJwVsf) +- [Functional Programming in Scala](https://amzn.to/4cEo6K2) +- [Haskell: The Craft of Functional Programming](https://amzn.to/4axxtcF) diff --git a/combinator/src/test/java/com/iluwatar/combinator/FinderTest.java b/combinator/src/test/java/com/iluwatar/combinator/FinderTest.java index 4f0d42258d62..c4a505df075d 100644 --- a/combinator/src/test/java/com/iluwatar/combinator/FinderTest.java +++ b/combinator/src/test/java/com/iluwatar/combinator/FinderTest.java @@ -22,6 +22,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ + package com.iluwatar.combinator; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -33,12 +34,12 @@ class FinderTest { @Test void contains() { var example = """ - the first one - the second one\s - """; + the first one + the second one\s + """; var result = Finder.contains("second").find(example); assertEquals(1, result.size()); - assertEquals( "the second one ", result.get(0)); + assertEquals("the second one ", result.get(0)); } } diff --git a/combinator/src/test/java/com/iluwatar/combinator/FindersTest.java b/combinator/src/test/java/com/iluwatar/combinator/FindersTest.java index bf34af1704f7..aa84b9350d5b 100644 --- a/combinator/src/test/java/com/iluwatar/combinator/FindersTest.java +++ b/combinator/src/test/java/com/iluwatar/combinator/FindersTest.java @@ -22,6 +22,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ + package com.iluwatar.combinator; import static com.iluwatar.combinator.Finders.advancedFinder; @@ -38,48 +39,47 @@ class FindersTest { void advancedFinderTest() { var res = advancedFinder("it was", "kingdom", "sea").find(text()); assertEquals(1, res.size()); - assertEquals( "It was many and many a year ago,", res.get(0)); + assertEquals("It was many and many a year ago,", res.get(0)); } @Test void filteredFinderTest() { var res = filteredFinder(" was ", "many", "child").find(text()); assertEquals(1, res.size()); - assertEquals( "But we loved with a love that was more than love-", res.get(0)); + assertEquals("But we loved with a love that was more than love-", res.get(0)); } @Test void specializedFinderTest() { var res = specializedFinder("love", "heaven").find(text()); assertEquals(1, res.size()); - assertEquals( "With a love that the winged seraphs of heaven", res.get(0)); + assertEquals("With a love that the winged seraphs of heaven", res.get(0)); } @Test void expandedFinderTest() { var res = expandedFinder("It was", "kingdom").find(text()); assertEquals(3, res.size()); - assertEquals( "It was many and many a year ago,", res.get(0)); - assertEquals( "In a kingdom by the sea,", res.get(1)); - assertEquals( "In this kingdom by the sea;", res.get(2)); + assertEquals("It was many and many a year ago,", res.get(0)); + assertEquals("In a kingdom by the sea,", res.get(1)); + assertEquals("In this kingdom by the sea;", res.get(2)); } private String text() { - return - """ - It was many and many a year ago, - In a kingdom by the sea, - That a maiden there lived whom you may know - By the name of ANNABEL LEE; - And this maiden she lived with no other thought - Than to love and be loved by me. - I was a child and she was a child, - In this kingdom by the sea; - But we loved with a love that was more than love- - I and my Annabel Lee; - With a love that the winged seraphs of heaven - Coveted her and me."""; + return """ + It was many and many a year ago, + In a kingdom by the sea, + That a maiden there lived whom you may know + By the name of ANNABEL LEE; + And this maiden she lived with no other thought + Than to love and be loved by me. + I was a child and she was a child, + In this kingdom by the sea; + But we loved with a love that was more than love- + I and my Annabel Lee; + With a love that the winged seraphs of heaven + Coveted her and me."""; } } From 81ebcf0a791adb28175186332038922f5087c82d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 30 Mar 2024 17:37:02 +0200 Subject: [PATCH 027/580] docs: commander docs + refactoring (#2878) --- commander/README.md | 151 +++++++++++++++++- .../com/iluwatar/commander/Commander.java | 20 +-- .../java/com/iluwatar/commander/Retry.java | 2 +- .../employeehandle/EmployeeHandle.java | 2 +- .../messagingservice/MessagingDatabase.java | 2 +- .../messagingservice/MessagingService.java | 6 +- .../paymentservice/PaymentService.java | 2 +- .../commander/queue/QueueDatabase.java | 1 - .../com/iluwatar/commander/RetryTest.java | 10 +- 9 files changed, 166 insertions(+), 30 deletions(-) diff --git a/commander/README.md b/commander/README.md index 472370f4bbe1..f6cacd243f76 100644 --- a/commander/README.md +++ b/commander/README.md @@ -1,25 +1,162 @@ --- title: Commander -category: Concurrency +category: Behavioral language: en tag: - - Cloud distributed + - Cloud distributed + - Microservices + - Transactions --- +## Also known as + +* Distributed Transaction Commander +* Transaction Coordinator + ## Intent -> Used to handle all problems that can be encountered when doing distributed transactions. +The intent of the Commander pattern in the context of distributed transactions is to manage and coordinate complex +transactions across multiple distributed components or services, ensuring consistency and integrity of the overall +transaction. It encapsulates transaction commands and coordination logic, facilitating the implementation of distributed +transaction protocols like two-phase commit or Saga. + +## Explanation + +Real-world example + +> Imagine organizing a large international music festival where various bands from around the world are scheduled to +> perform. Each band's arrival, soundcheck, and performance are like individual transactions in a distributed system. The +> festival organizer acts as the "Commander," coordinating these transactions to ensure that if a band's flight is +> delayed (akin to a transaction failure), there's a backup plan, such as rescheduling or swapping time slots with another +> band (compensating actions), to keep the overall schedule intact. This setup mirrors the Commander pattern in +> distributed transactions, where various components must be coordinated to achieve a successful outcome despite +> individual failures. + +In plain words + +> The Commander pattern turns a request into a stand-alone object, allowing for the parameterization of commands, +> queueing of actions, and the implementation of undo operations. + +**Programmatic Example** + +Managing transactions across different services in a distributed system, such as an e-commerce platform with separate +Payment and Shipping microservices, requires careful coordination to avoid issues. When a user places an order but one +service (e.g., Payment) is unavailable while the other (e.g., Shipping) is ready, we need a robust solution to handle +this discrepancy. + +A strategy to address this involves using a Commander component that orchestrates the process. Initially, the order is +processed by the available service (Shipping in this case). The commander then attempts to synchronize the order with +the currently unavailable service (Payment) by storing the order details in a database or queueing it for future +processing. This queueing system must also account for possible failures in adding requests to the queue. + +The commander repeatedly tries to process the queued orders to ensure both services eventually reflect the same +transaction data. This process involves ensuring idempotence, meaning that even if the same order synchronization +request is made multiple times, it will only be executed once, preventing duplicate transactions. The goal is to achieve +eventual consistency across services, where all systems are synchronized over time despite initial failures or delays. + +In the provided code, the Commander pattern is used to handle distributed transactions across multiple services ( +PaymentService, ShippingService, MessagingService, EmployeeHandle). Each service has its own database and can throw +exceptions to simulate failures. + +The Commander class is the central part of this pattern. It takes instances of all services and their databases, along +with some configuration parameters. The placeOrder method in the Commander class is used to place an order, which +involves interacting with all the services. + +```java +public class Commander { + // ... constructor and other methods ... + + public void placeOrder(Order order) { + // ... implementation ... + } +} +``` + +The User and Order classes represent a user and an order respectively. An order is placed by a user. + +```java +public class User { + // ... constructor and other methods ... +} + +public class Order { + // ... constructor and other methods ... +} +``` + +Each service (e.g., PaymentService, ShippingService, MessagingService, EmployeeHandle) has its own database and can +throw exceptions to simulate failures. For example, the PaymentService might throw a DatabaseUnavailableException if its +database is unavailable. + +```java +public class PaymentService { + // ... constructor and other methods ... +} +``` + +The DatabaseUnavailableException, ItemUnavailableException, and ShippingNotPossibleException classes represent different +types of exceptions that can occur. + +```java +public class DatabaseUnavailableException extends Exception { + // ... constructor and other methods ... +} + +public class ItemUnavailableException extends Exception { + // ... constructor and other methods ... +} + +public class ShippingNotPossibleException extends Exception { + // ... constructor and other methods ... +} +``` + +In the main method of each class (AppQueueFailCases, AppShippingFailCases), different scenarios are simulated by +creating instances of the Commander class with different configurations and calling the placeOrder method. ## Class diagram + ![alt text](./etc/commander.urm.png "Commander class diagram") ## Applicability -This pattern can be used when we need to make commits into 2 (or more) databases to complete transaction, which cannot be done atomically and can thereby create problems. -## Explanation -Handling distributed transactions can be tricky, but if we choose to not handle it carefully, there could be unwanted consequences. Say, we have an e-commerce website which has a Payment microservice and a Shipping microservice. If the shipping is available currently but payment service is not up, or vice versa, how would we deal with it after having already received the order from the user? -We need a mechanism in place which can handle these kinds of situations. We have to direct the order to either one of the services (in this example, shipping) and then add the order into the database of the other service (in this example, payment), since two databases cannot be updated atomically. If currently unable to do it, there should be a queue where this request can be queued, and there has to be a mechanism which allows for a failure in the queueing as well. All this needs to be done by constant retries while ensuring idempotence (even if the request is made several times, the change should only be applied once) by a commander class, to reach a state of eventual consistency. +Use the Commander pattern for distributed transactions when: + +* You need to ensure data consistency across distributed services in the event of partial system failures. +* Transactions span multiple microservices or distributed components requiring coordinated commit or rollback. +* You are implementing long-lived transactions requiring compensating actions for rollback. + +## Known Uses + +* Two-Phase Commit (2PC) Protocols: Coordinating commit or rollback across distributed databases or services. +* Saga Pattern Implementations: Managing long-lived business processes that span multiple microservices, with each step + having a compensating action for rollback. +* Distributed Transactions in Microservices Architecture: Coordinating complex operations across microservices while + maintaining data integrity and consistency. + +## Consequences + +Benefits: + +* Provides a clear mechanism for managing complex distributed transactions, enhancing system reliability. +* Enables the implementation of compensating transactions, which are crucial for maintaining consistency in long-lived + transactions. +* Facilitates the integration of heterogeneous systems within a transactional context. + +Trade-offs: + +* Increases complexity, especially in failure scenarios, due to the need for coordinated rollback mechanisms. +* Potentially impacts performance due to the overhead of coordination and consistency checks. +* Saga-based implementations can lead to increased complexity in understanding the overall business process flow. + +## Related Patterns + +[Saga Pattern](https://java-design-patterns.com/patterns/saga/): Often discussed in tandem with the Commander pattern +for distributed transactions, focusing on long-lived transactions with compensating actions. ## Credits * [Distributed Transactions: The Icebergs of Microservices](https://www.grahamlea.com/2016/08/distributed-transactions-microservices-icebergs/) +* [Microservices Patterns: With examples in Java](https://amzn.to/4axjnYW) +* [Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems](https://amzn.to/4axHwOV) +* [Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions](https://amzn.to/4aATcRe) diff --git a/commander/src/main/java/com/iluwatar/commander/Commander.java b/commander/src/main/java/com/iluwatar/commander/Commander.java index 6b6c90a03f8d..4a1483c11e02 100644 --- a/commander/src/main/java/com/iluwatar/commander/Commander.java +++ b/commander/src/main/java/com/iluwatar/commander/Commander.java @@ -121,7 +121,7 @@ void placeOrder(Order order) throws Exception { sendShippingRequest(order); } - private void sendShippingRequest(Order order) throws Exception { + private void sendShippingRequest(Order order) { var list = shippingService.exceptionsList; Retry.Operation op = (l) -> { if (!l.isEmpty()) { @@ -233,7 +233,7 @@ private void sendPaymentRequest(Order order) { try { r.perform(list, order); } catch (Exception e1) { - e1.printStackTrace(); + LOG.error("An exception occurred", e1); } }); t.start(); @@ -282,7 +282,7 @@ private void updateQueue(QueueTask qt) { try { r.perform(list, qt); } catch (Exception e1) { - e1.printStackTrace(); + LOG.error("An exception occurred", e1); } }); t.start(); @@ -305,7 +305,7 @@ private void tryDoingTasksInQueue() { //commander controls operations done to qu try { r.perform(list, null); } catch (Exception e1) { - e1.printStackTrace(); + LOG.error("An exception occurred", e1); } }); t2.start(); @@ -324,12 +324,12 @@ private void tryDequeue() { }; Retry.HandleErrorIssue handleError = (o, err) -> { }; - var r = new Retry(op, handleError, numOfRetries, retryDuration, + var r = new Retry<>(op, handleError, numOfRetries, retryDuration, e -> DatabaseUnavailableException.class.isAssignableFrom(e.getClass())); try { r.perform(list, null); } catch (Exception e1) { - e1.printStackTrace(); + LOG.error("An exception occurred", e1); } }); t3.start(); @@ -351,7 +351,7 @@ private void sendSuccessMessage(Order order) { try { r.perform(list, order); } catch (Exception e1) { - e1.printStackTrace(); + LOG.error("An exception occurred", e1); } }); t.start(); @@ -409,7 +409,7 @@ private void sendPaymentFailureMessage(Order order) { try { r.perform(list, order); } catch (Exception e1) { - e1.printStackTrace(); + LOG.error("An exception occurred", e1); } }); t.start(); @@ -465,7 +465,7 @@ private void sendPaymentPossibleErrorMsg(Order order) { try { r.perform(list, order); } catch (Exception e1) { - e1.printStackTrace(); + LOG.error("An exception occurred", e1); } }); t.start(); @@ -537,7 +537,7 @@ private void employeeHandleIssue(Order order) { try { r.perform(list, order); } catch (Exception e1) { - e1.printStackTrace(); + LOG.error("An exception occurred", e1); } }); t.start(); diff --git a/commander/src/main/java/com/iluwatar/commander/Retry.java b/commander/src/main/java/com/iluwatar/commander/Retry.java index 45984dfaa910..71614668254b 100644 --- a/commander/src/main/java/com/iluwatar/commander/Retry.java +++ b/commander/src/main/java/com/iluwatar/commander/Retry.java @@ -94,7 +94,7 @@ public void perform(List list, T obj) { this.errors.add(e); if (this.attempts.incrementAndGet() >= this.maxAttempts || !this.test.test(e)) { this.handleError.handleIssue(obj, e); - return; //return here...dont go further + return; //return here... don't go further } try { long testDelay = diff --git a/commander/src/main/java/com/iluwatar/commander/employeehandle/EmployeeHandle.java b/commander/src/main/java/com/iluwatar/commander/employeehandle/EmployeeHandle.java index ac161fbb5404..441ce920feae 100644 --- a/commander/src/main/java/com/iluwatar/commander/employeehandle/EmployeeHandle.java +++ b/commander/src/main/java/com/iluwatar/commander/employeehandle/EmployeeHandle.java @@ -47,7 +47,7 @@ protected String updateDb(Object... parameters) throws DatabaseUnavailableExcept var o = (Order) parameters[0]; if (database.get(o.id) == null) { database.add(o); - return o.id; //true rcvd - change addedToEmployeeHandle to true else dont do anything + return o.id; //true rcvd - change addedToEmployeeHandle to true else don't do anything } return null; } diff --git a/commander/src/main/java/com/iluwatar/commander/messagingservice/MessagingDatabase.java b/commander/src/main/java/com/iluwatar/commander/messagingservice/MessagingDatabase.java index 7339a623c1ce..e4a000f1cf62 100644 --- a/commander/src/main/java/com/iluwatar/commander/messagingservice/MessagingDatabase.java +++ b/commander/src/main/java/com/iluwatar/commander/messagingservice/MessagingDatabase.java @@ -38,7 +38,7 @@ public class MessagingDatabase extends Database { @Override public MessageRequest add(MessageRequest r) { - return data.put(r.reqId, r); + return data.put(r.reqId(), r); } @Override diff --git a/commander/src/main/java/com/iluwatar/commander/messagingservice/MessagingService.java b/commander/src/main/java/com/iluwatar/commander/messagingservice/MessagingService.java index 47d14b970b68..e00bde4997b6 100644 --- a/commander/src/main/java/com/iluwatar/commander/messagingservice/MessagingService.java +++ b/commander/src/main/java/com/iluwatar/commander/messagingservice/MessagingService.java @@ -44,11 +44,7 @@ enum MessageToSend { PAYMENT_SUCCESSFUL } - @RequiredArgsConstructor - static class MessageRequest { - final String reqId; - final MessageToSend msg; - } + record MessageRequest(String reqId, MessageToSend msg) {} public MessagingService(MessagingDatabase db, Exception... exc) { super(db, exc); diff --git a/commander/src/main/java/com/iluwatar/commander/paymentservice/PaymentService.java b/commander/src/main/java/com/iluwatar/commander/paymentservice/PaymentService.java index 0ba0c531001f..28fda2eb2106 100644 --- a/commander/src/main/java/com/iluwatar/commander/paymentservice/PaymentService.java +++ b/commander/src/main/java/com/iluwatar/commander/paymentservice/PaymentService.java @@ -51,7 +51,7 @@ public PaymentService(PaymentDatabase db, Exception... exc) { */ public String receiveRequest(Object... parameters) throws DatabaseUnavailableException { - //it could also be sending a userid, payment details here or something, not added here + //it could also be sending an userid, payment details here or something, not added here var id = generateId(); var req = new PaymentRequest(id, (float) parameters[0]); return updateDb(req); diff --git a/commander/src/main/java/com/iluwatar/commander/queue/QueueDatabase.java b/commander/src/main/java/com/iluwatar/commander/queue/QueueDatabase.java index 5f4f40b5b5df..b8189e6f0025 100644 --- a/commander/src/main/java/com/iluwatar/commander/queue/QueueDatabase.java +++ b/commander/src/main/java/com/iluwatar/commander/queue/QueueDatabase.java @@ -25,7 +25,6 @@ package com.iluwatar.commander.queue; import com.iluwatar.commander.Database; -import com.iluwatar.commander.exceptions.DatabaseUnavailableException; import com.iluwatar.commander.exceptions.IsEmptyException; import java.util.ArrayList; import java.util.List; diff --git a/commander/src/test/java/com/iluwatar/commander/RetryTest.java b/commander/src/test/java/com/iluwatar/commander/RetryTest.java index 2276b340efc7..c74fb94d0f9d 100644 --- a/commander/src/test/java/com/iluwatar/commander/RetryTest.java +++ b/commander/src/test/java/com/iluwatar/commander/RetryTest.java @@ -31,9 +31,13 @@ import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; class RetryTest { + private static final Logger LOG = LoggerFactory.getLogger(RetryTest.class); + @Test void performTest() { Retry.Operation op = (l) -> { @@ -53,16 +57,16 @@ void performTest() { try { r1.perform(arr1, order); } catch (Exception e1) { - e1.printStackTrace(); + LOG.error("An exception occurred", e1); } var arr2 = new ArrayList<>(List.of(new DatabaseUnavailableException(), new ItemUnavailableException())); try { r2.perform(arr2, order); } catch (Exception e1) { - e1.printStackTrace(); + LOG.error("An exception occurred", e1); } //r1 stops at ItemUnavailableException, r2 retries because it encounters DatabaseUnavailableException - assertTrue(arr1.size() == 1 && arr2.size() == 0); + assertTrue(arr1.size() == 1 && arr2.isEmpty()); } } From 48a5edef0e835aed6c7d16346c993a39e3d108fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 30 Mar 2024 21:21:06 +0200 Subject: [PATCH 028/580] docs: update Component documentation --- component/README.md | 157 ++++++++++++++++++++++++++++---------------- 1 file changed, 101 insertions(+), 56 deletions(-) diff --git a/component/README.md b/component/README.md index 7864945fc3e1..e2c2f6d71ca5 100644 --- a/component/README.md +++ b/component/README.md @@ -1,25 +1,36 @@ --- title: Component -categories: Behavioral +categories: Structural language: en tag: -- Game programming -- Domain + - Game programming + - Decoupling + - Modularity --- +## Also known as + +* Entity-Component-System (ECS) +* Component-Entity-System (CES) +* Component-Based Architecture (CBA) + ## Intent -The component design pattern enables developers to decouple attributes of an objects. Essentially allowing a single -component to be inheritable by multiple domains/objects without linking the objects to each other. In addition to this -benefit, the component design pattern allows developer to write maintainable and comprehensible code which is less -likely to result in monolithic classes. +The Component design pattern aims to organize code into reusable, interchangeable components, promoting flexibility and +ease of maintenance in game development by allowing entities to be configured with varying behaviors. ![Intent](./etc/component.duplication.png "Component Design Pattern") ## Explanation Real world example -> Suppose your video game consists of a graphics component and a sound component. Including the methods and attributes of both of these features in a single java class can be problematic due to many reasons. Firstly, the graphics and sound code can create an extremely long java class which can be hard to maintain. Furthermore, graphics components may be written and implemented by a separate team as to the sound contents. If both parties work simultaneously on the same java class, this may cause conflicts and major delay. Using the component design pattern, the development team is able to create individual component classes for graphics and sound whilst providing the domain/object the reach to both of these attributes. +> Suppose your video game consists of a graphics component and a sound component. Including the methods and attributes +> of both of these features in a single java class can be problematic due to many reasons. Firstly, the graphics and sound +> code can create an extremely long java class which can be hard to maintain. Furthermore, graphics components may be +> written and implemented by a separate team as to the sound contents. If both parties work simultaneously on the same +> java class, this may cause conflicts and major delay. Using the component design pattern, the development team is able +> to create individual component classes for graphics and sound whilst providing the domain/object the reach to both of +> these attributes. In plain words @@ -63,48 +74,48 @@ components. ```java public class GameObject { - private final InputComponent inputComponent; - private final PhysicComponent physicComponent; - private final GraphicComponent graphicComponent; - - public String name; - public int velocity = 0; - public int coordinate = 0; - - public static GameObject createPlayer() { - return new GameObject(new PlayerInputComponent(), - new ObjectPhysicComponent(), - new ObjectGraphicComponent(), - "player"); - } - - public static GameObject createNpc() { - return new GameObject( - new DemoInputComponent(), - new ObjectPhysicComponent(), - new ObjectGraphicComponent(), - "npc"); - } - - public void demoUpdate() { - inputComponent.update(this); - physicComponent.update(this); - graphicComponent.update(this); - } - - public void update(int e) { - inputComponent.update(this, e); - physicComponent.update(this); - graphicComponent.update(this); - } - - public void updateVelocity(int acceleration) { - this.velocity += acceleration; - } - - public void updateCoordinate() { - this.coordinate += this.velocity; - } + private final InputComponent inputComponent; + private final PhysicComponent physicComponent; + private final GraphicComponent graphicComponent; + + public String name; + public int velocity = 0; + public int coordinate = 0; + + public static GameObject createPlayer() { + return new GameObject(new PlayerInputComponent(), + new ObjectPhysicComponent(), + new ObjectGraphicComponent(), + "player"); + } + + public static GameObject createNpc() { + return new GameObject( + new DemoInputComponent(), + new ObjectPhysicComponent(), + new ObjectGraphicComponent(), + "npc"); + } + + public void demoUpdate() { + inputComponent.update(this); + physicComponent.update(this); + graphicComponent.update(this); + } + + public void update(int e) { + inputComponent.update(this, e); + physicComponent.update(this); + graphicComponent.update(this); + } + + public void updateVelocity(int acceleration) { + this.velocity += acceleration; + } + + public void updateCoordinate() { + this.coordinate += this.velocity; + } } ``` @@ -148,13 +159,47 @@ public class PlayerInputComponent implements InputComponent { ## Applicability -Use the component design pattern when +* Used in game development and simulations where game entities (e.g., characters, items) can have a dynamic set of + abilities or states. +* Suitable for systems requiring high modularity and systems where entities might need to change behavior at runtime + without inheritance hierarchies. + +## Known Uses + +* Game engines like Unity, Unreal Engine, and various custom engines in AAA and indie games. +* Simulation systems that require flexible, dynamic object composition. + +## Consequences + +Benefits: + +* Flexibility and Reusability: Components can be reused across different entities, making it easier to add new features + or modify existing ones. +* Decoupling: Reduces dependencies between game entity states and behaviors, facilitating easier changes and + maintenance. +* Dynamic Composition: Entities can alter their behavior at runtime by adding or removing components, providing + significant flexibility in game design. + +Trade-offs: + +* Complexity: Can introduce additional complexity in system architecture, particularly in managing dependencies and + communications between components. +* Performance Considerations: Depending on implementation, may incur a performance overhead due to indirection and + dynamic behavior, especially critical in high-performance game loops. + +## Related Patterns -- you have a class which access multiple features which you would like to keep separate. -- you want to reduce the length of a class. -- you require a variety of objects to share a collection of components but the use of inheritance isn't specific enough. +* [Decorator](https://java-design-patterns.com/patterns/decorator/): Similar concept of adding responsibilities + dynamically, but without the focus on game entities. +* [Flyweight](https://java-design-patterns.com/patterns/flyweight/): Can be used in conjunction with the Component + pattern to share component instances among many entities to save memory. +* [Observer](https://java-design-patterns.com/patterns/observer/): Often used in Component systems to communicate state + changes between components. ## Credits -- [Component Design Pattern] (https://gameprogrammingpatterns.com/component.html) -- [Component pattern - game programming series - Tutemic] (https://www.youtube.com/watch?v=n92GBp2WMkg&ab_channel=Tutemic) \ No newline at end of file +* [Component Design Pattern] (https://gameprogrammingpatterns.com/component.html) +* [Component pattern - game programming series - Tutemic] (https://www.youtube.com/watch?v=n92GBp2WMkg&ab_channel=Tutemic) +* [Game Programming Patterns](https://amzn.to/4cDRWhV) +* [Unity in Action: Multiplatform Game Development in C#](https://amzn.to/3THO6vw) +* [Procedural Content Generation for Unity Game Development](https://amzn.to/3vBKCTp) From e00e67c9a60dba16ea3eb5f0e0c0cb5b5a71b835 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 30 Mar 2024 21:30:52 +0200 Subject: [PATCH 029/580] docs: update Composite docs --- composite/README.md | 207 ++++++++++++++++++++++++++------------------ 1 file changed, 121 insertions(+), 86 deletions(-) diff --git a/composite/README.md b/composite/README.md index e44530f9ce09..f9d72ef9b613 100644 --- a/composite/README.md +++ b/composite/README.md @@ -3,20 +3,27 @@ title: Composite category: Structural language: en tag: - - Gang of Four + - Gang of Four + - Object composition + - Recursion --- +## Also known as + +* Object Tree +* Composite Structure + ## Intent -Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients +Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly. ## Explanation Real-world example -> Every sentence is composed of words which are in turn composed of characters. Each of these -> objects are printable and they can have something printed before or after them like sentence +> Every sentence is composed of words which are in turn composed of characters. Each of these +> objects are printable and they can have something printed before or after them like sentence > always ends with full stop and word always has space before it. In plain words @@ -25,85 +32,85 @@ In plain words Wikipedia says -> In software engineering, the composite pattern is a partitioning design pattern. The composite -> pattern describes that a group of objects is to be treated in the same way as a single instance of -> an object. The intent of a composite is to "compose" objects into tree structures to represent -> part-whole hierarchies. Implementing the composite pattern lets clients treat individual objects +> In software engineering, the composite pattern is a partitioning design pattern. The composite +> pattern describes that a group of objects is to be treated in the same way as a single instance of +> an object. The intent of a composite is to "compose" objects into tree structures to represent +> part-whole hierarchies. Implementing the composite pattern lets clients treat individual objects > and compositions uniformly. **Programmatic Example** -Taking our sentence example from above. Here we have the base class `LetterComposite` and the -different printable types `Letter`, `Word` and `Sentence`. +Taking our sentence example from above. Here we have the base class `LetterComposite` and the +different printable types `Letter`, `Word` and `Sentence`. ```java public abstract class LetterComposite { - private final List children = new ArrayList<>(); + private final List children = new ArrayList<>(); - public void add(LetterComposite letter) { - children.add(letter); - } + public void add(LetterComposite letter) { + children.add(letter); + } - public int count() { - return children.size(); - } + public int count() { + return children.size(); + } - protected void printThisBefore() { - } + protected void printThisBefore() { + } - protected void printThisAfter() { - } + protected void printThisAfter() { + } - public void print() { - printThisBefore(); - children.forEach(LetterComposite::print); - printThisAfter(); - } + public void print() { + printThisBefore(); + children.forEach(LetterComposite::print); + printThisAfter(); + } } public class Letter extends LetterComposite { - private final char character; + private final char character; - public Letter(char c) { - this.character = c; - } + public Letter(char c) { + this.character = c; + } - @Override - protected void printThisBefore() { - System.out.print(character); - } + @Override + protected void printThisBefore() { + System.out.print(character); + } } public class Word extends LetterComposite { - public Word(List letters) { - letters.forEach(this::add); - } + public Word(List letters) { + letters.forEach(this::add); + } - public Word(char... letters) { - for (char letter : letters) { - this.add(new Letter(letter)); + public Word(char... letters) { + for (char letter : letters) { + this.add(new Letter(letter)); + } } - } - @Override - protected void printThisBefore() { - System.out.print(" "); - } + @Override + protected void printThisBefore() { + System.out.print(" "); + } } public class Sentence extends LetterComposite { - public Sentence(List words) { - words.forEach(this::add); - } + public Sentence(List words) { + words.forEach(this::add); + } - @Override - protected void printThisAfter() { - System.out.print("."); - } + @Override + protected void printThisAfter() { + System.out.print("."); + } } ``` @@ -112,38 +119,38 @@ Then we have a messenger to carry messages: ```java public class Messenger { - LetterComposite messageFromOrcs() { + LetterComposite messageFromOrcs() { - var words = List.of( - new Word('W', 'h', 'e', 'r', 'e'), - new Word('t', 'h', 'e', 'r', 'e'), - new Word('i', 's'), - new Word('a'), - new Word('w', 'h', 'i', 'p'), - new Word('t', 'h', 'e', 'r', 'e'), - new Word('i', 's'), - new Word('a'), - new Word('w', 'a', 'y') - ); + var words = List.of( + new Word('W', 'h', 'e', 'r', 'e'), + new Word('t', 'h', 'e', 'r', 'e'), + new Word('i', 's'), + new Word('a'), + new Word('w', 'h', 'i', 'p'), + new Word('t', 'h', 'e', 'r', 'e'), + new Word('i', 's'), + new Word('a'), + new Word('w', 'a', 'y') + ); - return new Sentence(words); + return new Sentence(words); - } + } - LetterComposite messageFromElves() { + LetterComposite messageFromElves() { - var words = List.of( - new Word('M', 'u', 'c', 'h'), - new Word('w', 'i', 'n', 'd'), - new Word('p', 'o', 'u', 'r', 's'), - new Word('f', 'r', 'o', 'm'), - new Word('y', 'o', 'u', 'r'), - new Word('m', 'o', 'u', 't', 'h') - ); + var words = List.of( + new Word('M', 'u', 'c', 'h'), + new Word('w', 'i', 'n', 'd'), + new Word('p', 'o', 'u', 'r', 's'), + new Word('f', 'r', 'o', 'm'), + new Word('y', 'o', 'u', 'r'), + new Word('m', 'o', 'u', 't', 'h') + ); - return new Sentence(words); + return new Sentence(words); - } + } } ``` @@ -151,13 +158,13 @@ public class Messenger { And then it can be used as: ```java -var messenger = new Messenger(); +var messenger=new Messenger(); -LOGGER.info("Message from the orcs: "); -messenger.messageFromOrcs().print(); + LOGGER.info("Message from the orcs: "); + messenger.messageFromOrcs().print(); -LOGGER.info("Message from the elves: "); -messenger.messageFromElves().print(); + LOGGER.info("Message from the elves: "); + messenger.messageFromElves().print(); ``` The console output: @@ -178,16 +185,44 @@ Message from the elves: Use the Composite pattern when * You want to represent part-whole hierarchies of objects. -* You want clients to be able to ignore the difference between compositions of objects and -individual objects. Clients will treat all objects in the composite structure uniformly. +* You want clients to be able to ignore the difference between compositions of objects and + individual objects. Clients will treat all objects in the composite structure uniformly. ## Known uses -* [java.awt.Container](http://docs.oracle.com/javase/8/docs/api/java/awt/Container.html) and [java.awt.Component](http://docs.oracle.com/javase/8/docs/api/java/awt/Component.html) -* [Apache Wicket](https://github.com/apache/wicket) component tree, see [Component](https://github.com/apache/wicket/blob/91e154702ab1ff3481ef6cbb04c6044814b7e130/wicket-core/src/main/java/org/apache/wicket/Component.java) and [MarkupContainer](https://github.com/apache/wicket/blob/b60ec64d0b50a611a9549809c9ab216f0ffa3ae3/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java) +* Graphical user interfaces where components can contain other components (e.g., panels containing buttons, labels, + other panels). +* File system representations where directories can contain files and other directories. +* Organizational structures where a department can contain sub-departments and employees. +* [java.awt.Container](http://docs.oracle.com/javase/8/docs/api/java/awt/Container.html) + and [java.awt.Component](http://docs.oracle.com/javase/8/docs/api/java/awt/Component.html) +* [Apache Wicket](https://github.com/apache/wicket) component tree, + see [Component](https://github.com/apache/wicket/blob/91e154702ab1ff3481ef6cbb04c6044814b7e130/wicket-core/src/main/java/org/apache/wicket/Component.java) + and [MarkupContainer](https://github.com/apache/wicket/blob/b60ec64d0b50a611a9549809c9ab216f0ffa3ae3/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java) + +## Consequences + +Benefits: + +* Simplifies client code, as it can treat composite structures and individual objects uniformly. +* Makes it easier to add new kinds of components, as existing code doesn't need to be changed. + +Trade-offs: + +* Can make the design overly general. It might be difficult to restrict the components of a composite. +* Can make it harder to restrict the types of components in a composite. + +## Related Patterns + +* [Flyweight](https://java-design-patterns.com/patterns/flyweight/): Composite can use Flyweight to share component + instances among several composites. +* [Iterator](https://java-design-patterns.com/patterns/iterator/): Can be used to traverse Composite structures. +* [Visitor](https://java-design-patterns.com/patterns/visitor/): Can apply an operation over a Composite structure. ## Credits * [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59) * [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b) * [Refactoring to Patterns](https://www.amazon.com/gp/product/0321213351/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321213351&linkCode=as2&tag=javadesignpat-20&linkId=2a76fcb387234bc71b1c61150b3cc3a7) +* [Pattern-Oriented Software Architecture, Volume 1: A System of Patterns](https://amzn.to/3xoLAmi) +* [Patterns of Enterprise Application Architecture](https://amzn.to/3vBKXWb) From fd109955dc96f8105a99ecea431b0dc8a546eec6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 30 Mar 2024 21:51:17 +0200 Subject: [PATCH 030/580] docs: composite entity --- composite-entity/README.md | 134 ++++++++++++------ .../compositeentity/DependentObject.java | 13 +- composite-view/README.md | 2 +- 3 files changed, 95 insertions(+), 54 deletions(-) diff --git a/composite-entity/README.md b/composite-entity/README.md index d02d92de6e60..5ff69c5d2fc3 100644 --- a/composite-entity/README.md +++ b/composite-entity/README.md @@ -3,18 +3,27 @@ title: Composite Entity category: Structural language: en tag: - - Enterprise Integration Pattern + - Client-server + - Data access + - Enterprise patterns --- +## Also known as + +* Coarse-Grained Entity + ## Intent -It is used to model, represent, and manage a set of persistent objects that are interrelated, rather than representing them as individual fine-grained entities. +The Composite Entity design pattern is aimed at managing a set of interrelated persistent objects as if they were a +single entity. It is commonly used in the context of Enterprise JavaBeans (EJB) and similar enterprise frameworks to +represent graph-based data structures within business models, enabling clients to treat them as a single unit. ## Explanation Real world example -> For a console, there may be many interfaces that need to be managed and controlled. Using the composite entity pattern, dependent objects such as messages and signals can be combined together and controlled using a single object. +> For a console, there may be many interfaces that need to be managed and controlled. Using the composite entity +> pattern, dependent objects such as messages and signals can be combined and controlled using a single object. In plain words @@ -22,34 +31,34 @@ In plain words **Programmatic Example** -We need a generic solution for the problem. To achieve this, let's introduce a generic +We need a generic solution for the problem. To achieve this, let's introduce a generic Composite Entity Pattern. ```java public abstract class DependentObject { - T data; + T data; - public void setData(T message) { - this.data = message; - } + public void setData(T message) { + this.data = message; + } - public T getData() { - return data; - } + public T getData() { + return data; + } } public abstract class CoarseGrainedObject { - DependentObject[] dependentObjects; + DependentObject[] dependentObjects; - public void setData(T... data) { - IntStream.range(0, data.length).forEach(i -> dependentObjects[i].setData(data[i])); - } + public void setData(T... data) { + IntStream.range(0, data.length).forEach(i -> dependentObjects[i].setData(data[i])); + } - public T[] getData() { - return (T[]) Arrays.stream(dependentObjects).map(DependentObject::getData).toArray(); - } + public T[] getData() { + return (T[]) Arrays.stream(dependentObjects).map(DependentObject::getData).toArray(); + } } ``` @@ -67,43 +76,43 @@ public class SignalDependentObject extends DependentObject { public class ConsoleCoarseGrainedObject extends CoarseGrainedObject { - @Override - public String[] getData() { - super.getData(); - return new String[]{ - dependentObjects[0].getData(), dependentObjects[1].getData() - }; - } - - public void init() { - dependentObjects = new DependentObject[]{ - new MessageDependentObject(), new SignalDependentObject()}; - } + @Override + public String[] getData() { + super.getData(); + return new String[] { + dependentObjects[0].getData(), dependentObjects[1].getData() + }; + } + + public void init() { + dependentObjects = new DependentObject[] { + new MessageDependentObject(), new SignalDependentObject()}; + } } public class CompositeEntity { - private final ConsoleCoarseGrainedObject console = new ConsoleCoarseGrainedObject(); + private final ConsoleCoarseGrainedObject console = new ConsoleCoarseGrainedObject(); - public void setData(String message, String signal) { - console.setData(message, signal); - } + public void setData(String message, String signal) { + console.setData(message, signal); + } - public String[] getData() { - return console.getData(); - } + public String[] getData() { + return console.getData(); + } } ``` Now managing the assignment of message and signal objects with the composite entity `console`. ```java -var console = new CompositeEntity(); -console.init(); -console.setData("No Danger", "Green Light"); -Arrays.stream(console.getData()).forEach(LOGGER::info); -console.setData("Danger", "Red Light"); -Arrays.stream(console.getData()).forEach(LOGGER::info); +var console=new CompositeEntity(); + console.init(); + console.setData("No Danger","Green Light"); + Arrays.stream(console.getData()).forEach(LOGGER::info); + console.setData("Danger","Red Light"); + Arrays.stream(console.getData()).forEach(LOGGER::info); ``` ## Class diagram @@ -112,9 +121,44 @@ Arrays.stream(console.getData()).forEach(LOGGER::info); ## Applicability -Use the Composite Entity Pattern in the following situation: +* Useful in enterprise applications where business objects are complex and involve various interdependent objects. +* Ideal for scenarios where clients need to work with a unified interface to a set of objects rather than individual + entities. +* Applicable in systems that require a simplified view of a complex data model for external clients or services. + +## Known Uses + +* Enterprise applications with complex business models, particularly those using EJB or similar enterprise frameworks. +* Systems requiring abstraction over complex database schemas to simplify client interactions. +* Applications that need to enforce consistency or transactions across multiple objects in a business entity. + +## Consequences + +Benefits: + +* Simplifies client interactions with complex entity models by providing a unified interface. +* Enhances reusability and maintainability of the business layer by decoupling client code from the complex internals of + business entities. +* Facilitates easier transaction management and consistency enforcement across a set of related objects. + +Trade-offs: + +* May introduce a level of indirection that could impact performance. +* Can lead to overly coarse-grained interfaces that might not be as flexible for all client needs. +* Requires careful design to avoid bloated composite entities that are difficult to manage. + +## Related Patterns + +* [Decorator](https://java-design-patterns.com/patterns/decorator/): For dynamically adding behavior to individual + objects within the composite entity without affecting the structure. +* [Facade](https://java-design-patterns.com/patterns/facade/): Provides a simplified interface to a complex subsystem, + similar to how a composite entity simplifies access to a set of objects. +* [Flyweight](https://java-design-patterns.com/patterns/flyweight/): Useful for managing shared objects within a + composite entity to reduce memory footprint. -* You want to manage multiple dependency objects through one object to adjust the degree of granularity between objects. At the same time, the lifetime of dependency objects depends on a coarse-grained object. ## Credits * [Composite Entity Pattern in wikipedia](https://en.wikipedia.org/wiki/Composite_entity_pattern) +* [Core J2EE Patterns: Best Practices and Design Strategies](https://amzn.to/4cAbDap) +* [Enterprise Patterns and MDA: Building Better Software with Archetype Patterns and UML](https://amzn.to/49mslqS) +* [Patterns of Enterprise Application Architecture](https://amzn.to/3xjKdpe) diff --git a/composite-entity/src/main/java/com/iluwatar/compositeentity/DependentObject.java b/composite-entity/src/main/java/com/iluwatar/compositeentity/DependentObject.java index 4d072c781d7d..29380af543cf 100644 --- a/composite-entity/src/main/java/com/iluwatar/compositeentity/DependentObject.java +++ b/composite-entity/src/main/java/com/iluwatar/compositeentity/DependentObject.java @@ -24,21 +24,18 @@ */ package com.iluwatar.compositeentity; +import lombok.Getter; +import lombok.Setter; + /** * It is an object, which can contain other dependent objects (there may be a tree of objects within * the composite entity), that depends on the coarse-grained object and has its life cycle managed * by the coarse-grained object. */ - +@Setter +@Getter public abstract class DependentObject { T data; - public void setData(T message) { - this.data = message; - } - - public T getData() { - return data; - } } diff --git a/composite-view/README.md b/composite-view/README.md index ec0faf513c27..92e634fc1dff 100644 --- a/composite-view/README.md +++ b/composite-view/README.md @@ -3,7 +3,7 @@ title: Composite View category: Structural language: en tag: -- Enterprise Integration Pattern +- Enterprise patterns - Presentation --- From d3e7401f70abb8c2b55f9b69a509677cfc0f883d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 30 Mar 2024 22:06:41 +0200 Subject: [PATCH 031/580] docs: update composite view --- composite-view/README.md | 484 ++++++++++++++++++++++----------------- 1 file changed, 274 insertions(+), 210 deletions(-) diff --git a/composite-view/README.md b/composite-view/README.md index 92e634fc1dff..18a4631ed44d 100644 --- a/composite-view/README.md +++ b/composite-view/README.md @@ -1,36 +1,39 @@ --- -title: Composite View +title: Composite View category: Structural language: en tag: -- Enterprise patterns -- Presentation + - Enterprise patterns + - Presentation --- -## Name -**Composite View** - ## Intent -The purpose of the Composite View Pattern is to increase re-usability and flexibility when creating views for websites/webapps. -This pattern seeks to decouple the content of the page from its layout, allowing changes to be made to either the content -or layout of the page without impacting the other. This pattern also allows content to be easily reused across different views easily. + +The primary goal of the Composite View design pattern is to compose objects into tree structures to represent part-whole +hierarchies. This allows clients to treat individual objects and compositions of objects uniformly, simplifying the +management of complex structures. ## Explanation + Real World Example + > A news site wants to display the current date and news to different users > based on that user's preferences. The news site will substitute in different news feed > components depending on the user's interest, defaulting to local news. In Plain Words + > Composite View Pattern is having a main view being composed of smaller subviews. > The layout of this composite view is based on a template. A View-manager then decides which > subviews to include in this template. Wikipedia Says -> Composite views that are composed of multiple atomic subviews. Each component of -> the template may be included dynamically into the whole and the layout of the page may be managed independently of the content. -> This solution provides for the creation of a composite view based on the inclusion and substitution of -> modular dynamic and static template fragments. + +> Composite views that are composed of multiple atomic subviews. Each component of +> the template may be included dynamically into the whole and the layout of the page may be managed independently of the +> content. +> This solution provides for the creation of a composite view based on the inclusion and substitution of +> modular dynamic and static template fragments. > It promotes the reuse of atomic portions of the view by encouraging modular design. **Programmatic Example** @@ -39,229 +42,272 @@ Since this is a web development pattern, a server is required to demonstrate it. This example uses Tomcat 10.0.13 to run the servlet, and this programmatic example will only work with Tomcat 10+. Firstly there is `AppServlet` which is an `HttpServlet` that runs on Tomcat 10+. + ```java public class AppServlet extends HttpServlet { - private String msgPartOne = "

This Server Doesn't Support"; - private String msgPartTwo = "Requests

\n" - + "

Use a GET request with boolean values for the following parameters

\n" - + "

'name'

\n

'bus'

\n

'sports'

\n

'sci'

\n

'world'

"; - - private String destination = "newsDisplay.jsp"; - - public AppServlet() { - - } - - @Override - public void doGet(HttpServletRequest req, HttpServletResponse resp) - throws ServletException, IOException { - RequestDispatcher requestDispatcher = req.getRequestDispatcher(destination); - ClientPropertiesBean reqParams = new ClientPropertiesBean(req); - req.setAttribute("properties", reqParams); - requestDispatcher.forward(req, resp); - } - - @Override - public void doPost(HttpServletRequest req, HttpServletResponse resp) - throws ServletException, IOException { - resp.setContentType("text/html"); - PrintWriter out = resp.getWriter(); - out.println(msgPartOne + " Post " + msgPartTwo); - - } - - @Override - public void doDelete(HttpServletRequest req, HttpServletResponse resp) - throws ServletException, IOException { - resp.setContentType("text/html"); - PrintWriter out = resp.getWriter(); - out.println(msgPartOne + " Delete " + msgPartTwo); - - } - - @Override - public void doPut(HttpServletRequest req, HttpServletResponse resp) - throws ServletException, IOException { - resp.setContentType("text/html"); - PrintWriter out = resp.getWriter(); - out.println(msgPartOne + " Put " + msgPartTwo); - - } + private String msgPartOne = "

This Server Doesn't Support"; + private String msgPartTwo = "Requests

\n" + + "

Use a GET request with boolean values for the following parameters

\n" + + "

'name'

\n

'bus'

\n

'sports'

\n

'sci'

\n

'world'

"; + + private String destination = "newsDisplay.jsp"; + + public AppServlet() { + + } + + @Override + public void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + RequestDispatcher requestDispatcher = req.getRequestDispatcher(destination); + ClientPropertiesBean reqParams = new ClientPropertiesBean(req); + req.setAttribute("properties", reqParams); + requestDispatcher.forward(req, resp); + } + + @Override + public void doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + resp.setContentType("text/html"); + PrintWriter out = resp.getWriter(); + out.println(msgPartOne + " Post " + msgPartTwo); + + } + + @Override + public void doDelete(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + resp.setContentType("text/html"); + PrintWriter out = resp.getWriter(); + out.println(msgPartOne + " Delete " + msgPartTwo); + + } + + @Override + public void doPut(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + resp.setContentType("text/html"); + PrintWriter out = resp.getWriter(); + out.println(msgPartOne + " Put " + msgPartTwo); + + } } ``` + This servlet is not part of the pattern, and simply forwards GET requests to the correct JSP. PUT, POST, and DELETE requests are not supported and will simply show an error message. The view management in this example is done via a javabean class: `ClientPropertiesBean`, which stores user preferences. + ```java public class ClientPropertiesBean implements Serializable { - private static final String WORLD_PARAM = "world"; - private static final String SCIENCE_PARAM = "sci"; - private static final String SPORTS_PARAM = "sport"; - private static final String BUSINESS_PARAM = "bus"; - private static final String NAME_PARAM = "name"; - - private static final String DEFAULT_NAME = "DEFAULT_NAME"; - private boolean worldNewsInterest; - private boolean sportsInterest; - private boolean businessInterest; - private boolean scienceNewsInterest; - private String name; - - public ClientPropertiesBean() { - worldNewsInterest = true; - sportsInterest = true; - businessInterest = true; - scienceNewsInterest = true; - name = DEFAULT_NAME; - - } - - public ClientPropertiesBean(HttpServletRequest req) { - worldNewsInterest = Boolean.parseBoolean(req.getParameter(WORLD_PARAM)); - sportsInterest = Boolean.parseBoolean(req.getParameter(SPORTS_PARAM)); - businessInterest = Boolean.parseBoolean(req.getParameter(BUSINESS_PARAM)); - scienceNewsInterest = Boolean.parseBoolean(req.getParameter(SCIENCE_PARAM)); - String tempName = req.getParameter(NAME_PARAM); - if (tempName == null || tempName == "") { - tempName = DEFAULT_NAME; + private static final String WORLD_PARAM = "world"; + private static final String SCIENCE_PARAM = "sci"; + private static final String SPORTS_PARAM = "sport"; + private static final String BUSINESS_PARAM = "bus"; + private static final String NAME_PARAM = "name"; + + private static final String DEFAULT_NAME = "DEFAULT_NAME"; + private boolean worldNewsInterest; + private boolean sportsInterest; + private boolean businessInterest; + private boolean scienceNewsInterest; + private String name; + + public ClientPropertiesBean() { + worldNewsInterest = true; + sportsInterest = true; + businessInterest = true; + scienceNewsInterest = true; + name = DEFAULT_NAME; + + } + + public ClientPropertiesBean(HttpServletRequest req) { + worldNewsInterest = Boolean.parseBoolean(req.getParameter(WORLD_PARAM)); + sportsInterest = Boolean.parseBoolean(req.getParameter(SPORTS_PARAM)); + businessInterest = Boolean.parseBoolean(req.getParameter(BUSINESS_PARAM)); + scienceNewsInterest = Boolean.parseBoolean(req.getParameter(SCIENCE_PARAM)); + String tempName = req.getParameter(NAME_PARAM); + if (tempName == null || tempName == "") { + tempName = DEFAULT_NAME; + } + name = tempName; } - name = tempName; - } - // getters and setters generated by Lombok + // getters and setters generated by Lombok } ``` + This javabean has a default constructor, and another that takes an `HttpServletRequest`. This second constructor takes the request object, parses out the request parameters which contain the user preferences for different types of news. The template for the news page is in `newsDisplay.jsp` + ```html + - <%ClientPropertiesBean propertiesBean = (ClientPropertiesBean) request.getAttribute("properties");%> -

Welcome <%= propertiesBean.getName()%>

- - - - - - <% if(propertiesBean.isWorldNewsInterest()) { %> - - <% } else { %> - - <% } %> - - - - <% if(propertiesBean.isBusinessInterest()) { %> - - <% } else { %> - - <% } %> - - <% if(propertiesBean.isSportsInterest()) { %> - - <% } else { %> - - <% } %> - - - - <% if(propertiesBean.isScienceNewsInterest()) { %> - - <% } else { %> - - <% } %> - - -
<%@include file="worldNews.jsp"%><%@include file="localNews.jsp"%>
<%@include file="businessNews.jsp"%><%@include file="localNews.jsp"%><%@include file="sportsNews.jsp"%><%@include file="localNews.jsp"%>
<%@include file="scienceNews.jsp"%><%@include file="localNews.jsp"%>
+<%ClientPropertiesBean propertiesBean = (ClientPropertiesBean) request.getAttribute("properties");%> +

Welcome <%= propertiesBean.getName()%>

+ + + + + + <% if(propertiesBean.isWorldNewsInterest()) { %> + + <% } else { %> + + <% } %> + + + + <% if(propertiesBean.isBusinessInterest()) { %> + + <% } else { %> + + <% } %> + + <% if(propertiesBean.isSportsInterest()) { %> + + <% } else { %> + + <% } %> + + + + <% if(propertiesBean.isScienceNewsInterest()) { %> + + <% } else { %> + + <% } %> + + +
<%@include file="worldNews.jsp"%><%@include file="localNews.jsp"%>
<%@include file="businessNews.jsp"%><%@include file="localNews.jsp"%><%@include file="sportsNews.jsp"%><%@include file="localNews.jsp"%>
<%@include file="scienceNews.jsp"%><%@include file="localNews.jsp"%>
``` + This JSP page is the template. It declares a table with three rows, with one component in the first row, -two components in the second row, and one component in the third row. +two components in the second row, and one component in the third row. The scriplets in the file are part of the view management strategy that include different atomic subviews based on the user preferences in the Javabean. Here are two examples of the mock atomic subviews used in the composite: `businessNews.jsp` + ```html + - - - - -

- Generic Business News -

- - - - - - - - - -
Stock prices up across the worldNew tech companies to invest in
Industry leaders unveil new projectPrice fluctuations and what they mean
- + + + + +

+ Generic Business News +

+ + + + + + + + + +
Stock prices up across the worldNew tech companies to invest in
Industry leaders unveil new projectPrice fluctuations and what they mean
+ ``` + `localNews.jsp` + ```html + - -
-

- Generic Local News -

-
    -
  • - Mayoral elections coming up in 2 weeks -
  • -
  • - New parking meter rates downtown coming tomorrow -
  • -
  • - Park renovations to finish by the next year -
  • -
  • - Annual marathon sign ups available online -
  • -
-
- + +
+

+ Generic Local News +

+
    +
  • + Mayoral elections coming up in 2 weeks +
  • +
  • + New parking meter rates downtown coming tomorrow +
  • +
  • + Park renovations to finish by the next year +
  • +
  • + Annual marathon sign ups available online +
  • +
+
+ ``` + The results are as such: -1) The user has put their name as `Tammy` in the request parameters and no preferences: -![alt text](./etc/images/noparam.png) -2) The user has put their name as `Johnny` in the request parameters and has a preference for world, business, and science news: -![alt text](./etc/images/threeparams.png) +1) The user has put their name as `Tammy` in the request parameters and no preferences: + ![alt text](./etc/images/noparam.png) +2) The user has put their name as `Johnny` in the request parameters and has a preference for world, business, and + science news: + ![alt text](./etc/images/threeparams.png) The different subviews such as `worldNews.jsp`, `businessNews.jsp`, etc. are included conditionally based on the request parameters. @@ -273,12 +319,13 @@ Set up your IDE to build a WAR file from the module and deploy that file to the IntelliJ: -Under `Run` and `edit configurations` Make sure Tomcat server is one of the run configurations. -Go to the deployment tab, and make sure there is one artifact being built called `composite-view:war exploded`. +Under `Run` and `edit configurations` Make sure Tomcat server is one of the run configurations. +Go to the deployment tab, and make sure there is one artifact being built called `composite-view:war exploded`. If not present, add one. -Ensure that the artifact is being built from the content of the `web` directory and the compilation results of the module. -Point the output of the artifact to a convenient place. Run the configuration and view the landing page, +Ensure that the artifact is being built from the content of the `web` directory and the compilation results of the +module. +Point the output of the artifact to a convenient place. Run the configuration and view the landing page, follow instructions on that page to continue. ## Class diagram @@ -288,35 +335,52 @@ follow instructions on that page to continue. The class diagram here displays the Javabean which is the view manager. The views are JSP's held inside the web directory. -## Applicability +## Applicability: -This pattern is applicable to most websites that require content to be displayed dynamically/conditionally. -If there are components that need to be re-used for multiple views, or if the project requires reusing a template, -or if it needs to include content depending on certain conditions, then this pattern is a good choice. +Use the Composite View design pattern when: -## Known uses +* You want to represent part-whole hierarchies of objects. +* You expect that the composite structures might include any new components in the future. +* You want clients to be able to ignore the difference between compositions of objects and individual objects. Clients + will treat all objects in the composite structure uniformly. -Most modern websites use composite views in some shape or form, as they have templates for views and small atomic components -that are included in the page dynamically. Most modern Javascript libraries, like React, support this design pattern -with components. +## Known Uses + +* Graphical User Interfaces (GUIs) where widgets can contain other widgets (e.g., a window containing panels, buttons, + and text fields). +* Document structures, such as the representation of tables containing rows, which in turn contain cells, all of which + can be treated as elements in a unified hierarchy. ## Consequences -**Pros** -* Easy to re-use components -* Change layout/content without affecting the other -* Reduce code duplication -* Code is more maintainable and modular - -**Cons** -* Overhead cost at runtime -* Slower response compared to directly embedding elements -* Increases potential for display errors - -## Related patterns -* [Composite (GoF)](https://java-design-patterns.com/patterns/composite/) + +Benefits: + +* High flexibility in adding new components: Since composites and leaf nodes are treated uniformly, it's easier to add + new kinds of components. +* Simplified client code: Clients can treat composite structures and individual elements uniformly, reducing the + complexity in client code. + +Trade-offs: + +* Overgeneralization: Designing the system might become more complex if you make everything composite, especially if + your application doesn't require it. +* Difficulty in constraint enforcement: It can be harder to restrict the components of a composite to only certain + types. + +## Related Patterns + +* [Decorator](https://java-design-patterns.com/patterns/decorator/): While Decorator is used to add responsibilities to + objects, Composite is meant for building structures of objects. +* [Flyweight](https://java-design-patterns.com/patterns/flyweight/): Composite can often be combined with Flyweight to + implement shared leaf nodes in a composite structure, reducing the memory footprint. +* [Chain of Responsibility](https://java-design-patterns.com/patterns/chain-of-responsibility/): Can be used with + Composite to let components pass requests through the hierarchy. +* [Composite](https://java-design-patterns.com/patterns/composite/) * [View Helper](https://www.oracle.com/java/technologies/viewhelper.html) ## Credits + * [Core J2EE Patterns - Composite View](https://www.oracle.com/java/technologies/composite-view.html) * [Composite View Design Pattern – Core J2EE Patterns](https://www.dineshonjava.com/composite-view-design-pattern/) - +* [Patterns of Enterprise Application Architecture](https://amzn.to/49jpQG3) +* [Head First Design Patterns: Building Extensible and Maintainable Object-Oriented Software](https://amzn.to/3xfntGJ) From 44a97666567e4c4a630e5eb9027fda0c2bf0ea80 Mon Sep 17 00:00:00 2001 From: drishtii7 <82076566+drishtii7@users.noreply.github.com> Date: Sun, 31 Mar 2024 04:47:04 -0300 Subject: [PATCH 032/580] refactor: Changes to make Abstract-Document and Adapter better. (#2872) * Added new test case for error handling * Added new test cases for error handling * Refactored Abstract Document * Changes updated --- .../abstractdocument/AbstractDocument.java | 52 ++++++++++++++----- .../AbstractDocumentTest.java | 42 +++++++++++++++ 2 files changed, 81 insertions(+), 13 deletions(-) diff --git a/abstract-document/src/main/java/com/iluwatar/abstractdocument/AbstractDocument.java b/abstract-document/src/main/java/com/iluwatar/abstractdocument/AbstractDocument.java index 665729008810..70190604150b 100644 --- a/abstract-document/src/main/java/com/iluwatar/abstractdocument/AbstractDocument.java +++ b/abstract-document/src/main/java/com/iluwatar/abstractdocument/AbstractDocument.java @@ -36,41 +36,67 @@ */ public abstract class AbstractDocument implements Document { - private final Map properties; + private final Map documentProperties; protected AbstractDocument(Map properties) { Objects.requireNonNull(properties, "properties map is required"); - this.properties = properties; + this.documentProperties = properties; } @Override public Void put(String key, Object value) { - properties.put(key, value); + documentProperties.put(key, value); return null; } @Override public Object get(String key) { - return properties.get(key); + return documentProperties.get(key); } @Override - public Stream children(String key, Function, T> constructor) { + public Stream children(String key, Function, T> childConstructor) { return Stream.ofNullable(get(key)) - .filter(Objects::nonNull) - .map(el -> (List>) el) - .findAny() - .stream() - .flatMap(Collection::stream) - .map(constructor); + .filter(Objects::nonNull) + .map(el -> (List>) el) + .findAny() + .stream() + .flatMap(Collection::stream) + .map(childConstructor); } @Override public String toString() { + return buildStringRepresentation(); + } + + private String buildStringRepresentation() { var builder = new StringBuilder(); builder.append(getClass().getName()).append("["); - properties.forEach((key, value) -> builder.append("[").append(key).append(" : ").append(value) - .append("]")); + + // Explaining variable for document properties map + Map documentProperties = this.documentProperties; + + // Explaining variable for the size of document properties map + int numProperties = documentProperties.size(); + + // Explaining variable for tracking the current property index + int currentPropertyIndex = 0; + + // Iterate over document properties map + for (Map.Entry entry : documentProperties.entrySet()) { + String key = entry.getKey(); + Object value = entry.getValue(); + + // Append key-value pair + builder.append("[").append(key).append(" : ").append(value).append("]"); + + // Add comma if not last property + if (++currentPropertyIndex < numProperties) { + builder.append(", "); + } + } + builder.append("]"); return builder.toString(); } diff --git a/abstract-document/src/test/java/com/iluwatar/abstractdocument/AbstractDocumentTest.java b/abstract-document/src/test/java/com/iluwatar/abstractdocument/AbstractDocumentTest.java index 249f01f64a1e..a86e6273d5b5 100644 --- a/abstract-document/src/test/java/com/iluwatar/abstractdocument/AbstractDocumentTest.java +++ b/abstract-document/src/test/java/com/iluwatar/abstractdocument/AbstractDocumentTest.java @@ -80,4 +80,46 @@ void shouldIncludePropsInToString() { assertTrue(document.toString().contains(VALUE)); } + @Test + void shouldHandleExceptionDuringConstruction() { + Map invalidProperties = null; // Invalid properties, causing NullPointerException + + // Throw null pointer exception + assertThrows(NullPointerException.class, () -> { + // Attempt to construct a document with invalid properties + new DocumentImplementation(invalidProperties); + }); + } + + @Test + void shouldPutAndGetNestedDocument() { + // Creating a nested document + DocumentImplementation nestedDocument = new DocumentImplementation(new HashMap<>()); + nestedDocument.put("nestedKey", "nestedValue"); + + + document.put("nested", nestedDocument); + + // Retrieving the nested document + DocumentImplementation retrievedNestedDocument = (DocumentImplementation) document.get("nested"); + + assertNotNull(retrievedNestedDocument); + assertEquals("nestedValue", retrievedNestedDocument.get("nestedKey")); + } + + @Test + void shouldUpdateExistingValue() { + // Arrange + final String key = "key"; + final String originalValue = "originalValue"; + final String updatedValue = "updatedValue"; + + document.put(key, originalValue); + + // Updating the value + document.put(key, updatedValue); + + //Verifying that the updated value is retrieved correctly + assertEquals(updatedValue, document.get(key)); + } } From dfd34d890b0b9b5b7a8597a9bee4b3b6f90d5e56 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 31 Mar 2024 10:48:12 +0300 Subject: [PATCH 033/580] docs: add drishtii7 as a contributor for code (#2879) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index e67a282361f2..161782571ab4 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -3047,6 +3047,15 @@ "contributions": [ "code" ] + }, + { + "login": "drishtii7", + "name": "drishtii7", + "avatar_url": "https://avatars.githubusercontent.com/u/82076566?v=4", + "profile": "https://github.com/drishtii7", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 155e0e8fd5f2..07c6a31fa081 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=iluwatar_java-design-patterns&metric=coverage)](https://sonarcloud.io/dashboard?id=iluwatar_java-design-patterns) [![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) -[![All Contributors](https://img.shields.io/badge/all_contributors-334-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-335-orange.svg?style=flat-square)](#contributors-)
@@ -504,6 +504,7 @@ This project is licensed under the terms of the MIT license. leif e.
leif e.

💻 Jun Kang
Jun Kang

💻 Kishalay Pandey
Kishalay Pandey

💻 + drishtii7
drishtii7

💻 From de5a93c499e3879d8ca0a09353896b64b98bff9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 31 Mar 2024 18:00:53 +0300 Subject: [PATCH 034/580] docs: update .editorconfig and reformat readmes --- .editorconfig | 3 +- abstract-document/README.md | 59 +++++-------------- abstract-factory/README.md | 35 ++++------- active-object/README.md | 19 ++---- acyclic-visitor/README.md | 15 ++--- adapter/README.md | 36 ++++------- aggregator-microservices/README.md | 48 +++++---------- ambassador/README.md | 75 +++++++---------------- anti-corruption-layer/README.md | 61 +++++-------------- api-gateway/README.md | 51 ++++------------ arrange-act-assert/README.md | 27 +++------ async-method-invocation/README.md | 53 +++++------------ balking/README.md | 38 ++++-------- bridge/README.md | 59 ++++++------------- builder/README.md | 37 ++++-------- business-delegate/README.md | 28 +++------ bytecode/README.md | 37 ++++-------- caching/README.md | 68 ++++++--------------- callback/README.md | 30 ++++------ chain-of-responsibility/README.md | 33 ++++------- circuit-breaker/README.md | 56 +++++------------- client-session/README.md | 43 ++++---------- collecting-parameter/README.md | 60 ++++++------------- collection-pipeline/README.md | 54 +++++------------ combinator/README.md | 32 ++++------ command/README.md | 44 ++++---------- commander/README.md | 61 +++++-------------- component/README.md | 60 ++++++------------- composite-entity/README.md | 25 +++----- composite-view/README.md | 95 +++++++++--------------------- composite/README.md | 32 +++------- 31 files changed, 388 insertions(+), 986 deletions(-) diff --git a/.editorconfig b/.editorconfig index 1e7144030a73..4afde59eb070 100644 --- a/.editorconfig +++ b/.editorconfig @@ -31,7 +31,7 @@ end_of_line = lf indent_size = 4 indent_style = space insert_final_newline = false -max_line_length = 120 +max_line_length = off tab_width = 4 ij_continuation_indent_size = 8 ij_formatter_off_tag = @formatter:off @@ -355,6 +355,7 @@ ij_markdown_format_tables = true ij_markdown_insert_quote_arrows_on_wrap = true ij_markdown_keep_indents_on_empty_lines = false ij_markdown_keep_line_breaks_inside_text_blocks = true +ij_markdown_max_line_length = off ij_markdown_max_lines_around_block_elements = 1 ij_markdown_max_lines_around_header = 1 ij_markdown_max_lines_between_paragraphs = 1 diff --git a/abstract-document/README.md b/abstract-document/README.md index a600047511f0..9e97f33c4889 100644 --- a/abstract-document/README.md +++ b/abstract-document/README.md @@ -10,19 +10,15 @@ tag: ## Intent -The Abstract Document design pattern is a structural design pattern that aims to provide a consistent way to handle -hierarchical and tree-like data structures by defining a common interface for various document types. It separates the -core document structure from specific data formats, enabling dynamic updates and simplified maintenance. +The Abstract Document design pattern is a structural design pattern that aims to provide a consistent way to handle hierarchical and tree-like data structures by defining a common interface for various document types. It separates the core document structure from specific data formats, enabling dynamic updates and simplified maintenance. ## Explanation -The Abstract Document pattern enables handling additional, non-static properties. This pattern uses concept of traits to -enable type safety and separate properties of different classes into set of interfaces. +The Abstract Document pattern enables handling additional, non-static properties. This pattern uses concept of traits to enable type safety and separate properties of different classes into set of interfaces. Real world example -> Consider a car that consists of multiple parts. However, we don't know if the specific car really has all the parts, -> or just some of them. Our cars are dynamic and extremely flexible. +> Consider a car that consists of multiple parts. However, we don't know if the specific car really has all the parts, or just some of them. Our cars are dynamic and extremely flexible. In plain words @@ -30,15 +26,11 @@ In plain words Wikipedia says -> An object-oriented structural design pattern for organizing objects in loosely typed key-value stores and exposing the -> data using typed views. The purpose of the pattern is to achieve a high degree of flexibility between components in a -> strongly typed language where new properties can be added to the object-tree on the fly, without losing the support of -> type-safety. The pattern makes use of traits to separate different properties of a class into different interfaces. +> An object-oriented structural design pattern for organizing objects in loosely typed key-value stores and exposing the data using typed views. The purpose of the pattern is to achieve a high degree of flexibility between components in a strongly typed language where new properties can be added to the object-tree on the fly, without losing the support of type-safety. The pattern makes use of traits to separate different properties of a class into different interfaces. **Programmatic Example** -Let's first define the base classes `Document` and `AbstractDocument`. They basically make the object hold a property -map and any amount of child objects. +Let's first define the base classes `Document` and `AbstractDocument`. They basically make the object hold a property map and any amount of child objects. ```java public interface Document { @@ -84,8 +76,7 @@ public abstract class AbstractDocument implements Document { } ``` -Next we define an enum `Property` and a set of interfaces for type, price, model and parts. This allows us to create -static looking interface to our `Car` class. +Next we define an enum `Property` and a set of interfaces for type, price, model and parts. This allows us to create static looking interface to our `Car` class. ```java public enum Property { @@ -180,38 +171,21 @@ And finally here's how we construct and use the `Car` in a full example. ## Applicability -This pattern is particularly useful in scenarios where you have different types of documents that share some common -attributes or behaviors, but also have unique attributes or behaviors specific to their individual types. Here are some -scenarios where the Abstract Document design pattern can be applicable: +This pattern is particularly useful in scenarios where you have different types of documents that share some common attributes or behaviors, but also have unique attributes or behaviors specific to their individual types. Here are some scenarios where the Abstract Document design pattern can be applicable: -* Content Management Systems (CMS): In a CMS, you might have various types of content such as articles, images, videos, - etc. Each type of content could have shared attributes like creation date, author, and tags, while also having - specific attributes like image dimensions for images or video duration for videos. +* Content Management Systems (CMS): In a CMS, you might have various types of content such as articles, images, videos, etc. Each type of content could have shared attributes like creation date, author, and tags, while also having specific attributes like image dimensions for images or video duration for videos. -* File Systems: If you're designing a file system where different types of files need to be managed, such as documents, - images, audio files, and directories, the Abstract Document pattern can help provide a consistent way to access - attributes like file size, creation date, etc., while allowing for specific attributes like image resolution or audio - duration. +* File Systems: If you're designing a file system where different types of files need to be managed, such as documents, images, audio files, and directories, the Abstract Document pattern can help provide a consistent way to access attributes like file size, creation date, etc., while allowing for specific attributes like image resolution or audio duration. -* E-commerce Systems: An e-commerce platform might have different product types such as physical products, digital - downloads, and subscriptions. Each type could share common attributes like name, price, and description, while having - unique attributes like shipping weight for physical products or download link for digital products. +* E-commerce Systems: An e-commerce platform might have different product types such as physical products, digital downloads, and subscriptions. Each type could share common attributes like name, price, and description, while having unique attributes like shipping weight for physical products or download link for digital products. -* Medical Records Systems: In healthcare, patient records might include various types of data such as demographics, - medical history, test results, and prescriptions. The Abstract Document pattern can help manage shared attributes like - patient ID and date of birth, while accommodating specialized attributes like test results or prescribed medications. +* Medical Records Systems: In healthcare, patient records might include various types of data such as demographics, medical history, test results, and prescriptions. The Abstract Document pattern can help manage shared attributes like patient ID and date of birth, while accommodating specialized attributes like test results or prescribed medications. -* Configuration Management: When dealing with configuration settings for software applications, there can be different - types of configuration elements, each with its own set of attributes. The Abstract Document pattern can be used to - manage these configuration elements while ensuring a consistent way to access and manipulate their attributes. +* Configuration Management: When dealing with configuration settings for software applications, there can be different types of configuration elements, each with its own set of attributes. The Abstract Document pattern can be used to manage these configuration elements while ensuring a consistent way to access and manipulate their attributes. -* Educational Platforms: Educational systems might have various types of learning materials such as text-based content, - videos, quizzes, and assignments. Common attributes like title, author, and publication date can be shared, while - unique attributes like video duration or assignment due dates can be specific to each type. +* Educational Platforms: Educational systems might have various types of learning materials such as text-based content, videos, quizzes, and assignments. Common attributes like title, author, and publication date can be shared, while unique attributes like video duration or assignment due dates can be specific to each type. -* Project Management Tools: In project management applications, you could have different types of tasks like to-do - items, milestones, and issues. The Abstract Document pattern could be used to handle general attributes like task name - and assignee, while allowing for specific attributes like milestone date or issue priority. +* Project Management Tools: In project management applications, you could have different types of tasks like to-do items, milestones, and issues. The Abstract Document pattern could be used to handle general attributes like task name and assignee, while allowing for specific attributes like milestone date or issue priority. * Documents have diverse and evolving attribute structures. @@ -221,10 +195,7 @@ scenarios where the Abstract Document design pattern can be applicable: * Maintainability and flexibility are critical for the codebase. -The key idea behind the Abstract Document design pattern is to provide a flexible and extensible way to manage different -types of documents or entities with shared and distinct attributes. By defining a common interface and implementing it -across various document types, you can achieve a more organized and consistent approach to handling complex data -structures. +The key idea behind the Abstract Document design pattern is to provide a flexible and extensible way to manage different types of documents or entities with shared and distinct attributes. By defining a common interface and implementing it across various document types, you can achieve a more organized and consistent approach to handling complex data structures. ## Consequences diff --git a/abstract-factory/README.md b/abstract-factory/README.md index 01c7f7b44e6a..029cd5e46a6e 100644 --- a/abstract-factory/README.md +++ b/abstract-factory/README.md @@ -14,32 +14,25 @@ Kit ## Intent -The Abstract Factory design pattern provides a way to create families of related objects without specifying their -concrete classes. This allows for code that is independent of the specific classes of objects it uses, promoting -flexibility and maintainability. +The Abstract Factory design pattern provides a way to create families of related objects without specifying their concrete classes. This allows for code that is independent of the specific classes of objects it uses, promoting flexibility and maintainability. ## Explanation Real-world example -> To create a kingdom we need objects with a common theme. The elven kingdom needs an elven king, elven castle, and -> elven army whereas the orcish kingdom needs an orcish king, orcish castle, and orcish army. There is a dependency -> between the objects in the kingdom. +> To create a kingdom we need objects with a common theme. The elven kingdom needs an elven king, elven castle, and elven army whereas the orcish kingdom needs an orcish king, orcish castle, and orcish army. There is a dependency between the objects in the kingdom. In plain words -> A factory of factories; a factory that groups the individual but related/dependent factories together without -> specifying their concrete classes. +> A factory of factories; a factory that groups the individual but related/dependent factories together without specifying their concrete classes. Wikipedia says -> The abstract factory pattern provides a way to encapsulate a group of individual factories that have a common theme -> without specifying their concrete classes +> The abstract factory pattern provides a way to encapsulate a group of individual factories that have a common theme without specifying their concrete classes **Programmatic Example** -Translating the kingdom example above. First of all, we have some interfaces and implementation for the objects in the -kingdom. +Translating the kingdom example above. First of all, we have some interfaces and implementation for the objects in the kingdom. ```java public interface Castle { @@ -134,8 +127,7 @@ public class OrcKingdomFactory implements KingdomFactory { } ``` -Now we have the abstract factory that lets us make a family of related objects i.e. elven kingdom factory creates elven -castle, king and army, etc. +Now we have the abstract factory that lets us make a family of related objects i.e. elven kingdom factory creates elven castle, king and army, etc. ```java var factory=new ElfKingdomFactory(); @@ -156,11 +148,7 @@ This is the elven castle! 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 ( -derived from `Army`, `King`, `Castle`). In this example, we also used an enum to parameterize which type of kingdom -factory the client will ask for. +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 (derived from `Army`, `King`, `Castle`). In this example, we also used an enum to parameterize which type of kingdom factory the client will ask for. ```java public static class FactoryMaker { @@ -203,8 +191,7 @@ Use the Abstract Factory pattern when * The system should be independent of how its products are created, composed, and represented * The system should be configured with one of the multiple families of products * The family of related product objects is designed to be used together, and you need to enforce this constraint -* You want to provide a class library of products, and you want to reveal just their interfaces, not their - implementations +* You want to provide a class library of products, and you want to reveal just their interfaces, not their implementations * The lifetime of the dependency is conceptually shorter than the lifetime of the consumer. * You need a run-time value to construct a particular dependency * You want to decide which product to call from a family at runtime. @@ -214,8 +201,7 @@ Use the Abstract Factory pattern when Example use cases -* Selecting to call to the appropriate implementation of FileSystemAcmeService or DatabaseAcmeService or - NetworkAcmeService at runtime. +* Selecting to call to the appropriate implementation of FileSystemAcmeService or DatabaseAcmeService or NetworkAcmeService at runtime. * Unit test case writing becomes much easier * UI tools for different OS @@ -258,4 +244,5 @@ Trade-offs * [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59) * [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b) * [Java Design Patterns: A Hands-On Experience with Real-World Examples](https://amzn.to/3HWNf4U) -* [Design Patterns in Java](https://amzn.to/3Syw0vC) \ No newline at end of file +* [Design Patterns in Java](https://amzn.to/3Syw0vC) +* \ No newline at end of file diff --git a/active-object/README.md b/active-object/README.md index 9935481c210d..33e330db47dc 100644 --- a/active-object/README.md +++ b/active-object/README.md @@ -8,22 +8,17 @@ tag: ## Intent -The Active Object design pattern provides a safe and reliable way to implement asynchronous behavior in concurrent -systems. It achieves this by encapsulating tasks within objects that have their own thread and message queue. This -separation keeps the main thread responsive and avoids issues like direct thread manipulation or shared state access. +The Active Object design pattern provides a safe and reliable way to implement asynchronous behavior in concurrent systems. It achieves this by encapsulating tasks within objects that have their own thread and message queue. This separation keeps the main thread responsive and avoids issues like direct thread manipulation or shared state access. ## Explanation -The class that implements the active object pattern will contain a self-synchronization mechanism without using ' -synchronized' methods. +The class that implements the active object pattern will contain a self-synchronization mechanism without using 'synchronized' methods. Real-world example -> The Orcs are known for their wildness and untameable soul. It seems like they have their own thread of control based -> on previous behavior. +> The Orcs are known for their wildness and untameable soul. It seems like they have their own thread of control based on previous behavior. -To implement a creature that has its own thread of control mechanism and expose its API only and not the execution -itself, we can use the Active Object pattern. +To implement a creature that has its own thread of control mechanism and expose its API only and not the execution itself, we can use the Active Object pattern. **Programmatic Example** @@ -83,8 +78,7 @@ public abstract class ActiveCreature { } ``` -We can see that any class that will extend the ActiveCreature class will have its own thread of control to invoke and -execute methods. +We can see that any class that will extend the ActiveCreature class will have its own thread of control to invoke and execute methods. For example, the Orc class: @@ -98,8 +92,7 @@ public class Orc extends ActiveCreature { } ``` -Now, we can create multiple creatures such as Orcs, tell them to eat and roam, and they will execute it on their own -thread of control: +Now, we can create multiple creatures such as Orcs, tell them to eat and roam, and they will execute it on their own thread of control: ```java public static void main(String[]args){ diff --git a/acyclic-visitor/README.md b/acyclic-visitor/README.md index d548eed97695..ab2304402d96 100644 --- a/acyclic-visitor/README.md +++ b/acyclic-visitor/README.md @@ -9,15 +9,13 @@ tag: ## Intent -The Acyclic Visitor pattern decouples operations from an object hierarchy, allowing you to add new operations without -modifying the object structure directly. +The Acyclic Visitor pattern decouples operations from an object hierarchy, allowing you to add new operations without modifying the object structure directly. ## Explanation Real world example -> We have a hierarchy of modem classes. The modems in this hierarchy need to be visited by an external algorithm based -> on filtering criteria (is it Unix or DOS compatible modem). +> We have a hierarchy of modem classes. The modems in this hierarchy need to be visited by an external algorithm based on filtering criteria (is it Unix or DOS compatible modem). In plain words @@ -25,8 +23,7 @@ In plain words [WikiWikiWeb](https://wiki.c2.com/?AcyclicVisitor) says -> The Acyclic Visitor pattern allows new functions to be added to existing class hierarchies without affecting those -> hierarchies, and without creating the dependency cycles that are inherent to the GangOfFour VisitorPattern. +> The Acyclic Visitor pattern allows new functions to be added to existing class hierarchies without affecting those hierarchies, and without creating the dependency cycles that are inherent to the GangOfFour VisitorPattern. **Programmatic Example** @@ -136,8 +133,7 @@ Program output: This pattern can be used: * When you need to add a new function to an existing hierarchy without the need to alter or affect that hierarchy. -* When there are functions that operate upon a hierarchy, but which do not belong in the hierarchy itself. e.g. the - ConfigureForDOS / ConfigureForUnix / ConfigureForX issue. +* When there are functions that operate upon a hierarchy, but which do not belong in the hierarchy itself. e.g. the ConfigureForDOS / ConfigureForUnix / ConfigureForX issue. * When you need to perform very different operations on an object depending upon its type. * When the visited class hierarchy will be frequently extended with new derivatives of the Element class. * When the recompilation, relinking, retesting or redistribution of the derivatives of Element is very expensive. @@ -156,8 +152,7 @@ Benefits: Trade-offs: -* Violates [Liskov's Substitution Principle](https://java-design-patterns.com/principles/#liskov-substitution-principle) - by showing that it can accept all visitors but actually only being interested in particular visitors. +* Violates [Liskov's Substitution Principle](https://java-design-patterns.com/principles/#liskov-substitution-principle) by showing that it can accept all visitors but actually only being interested in particular visitors. * Parallel hierarchy of visitors has to be created for all members in visitable class hierarchy. ## Related patterns diff --git a/adapter/README.md b/adapter/README.md index 1d9b7eaabf32..8fb99d0b6a33 100644 --- a/adapter/README.md +++ b/adapter/README.md @@ -14,19 +14,13 @@ Wrapper ## Intent -The Adapter pattern converts the interface of a class into another interface that clients expect, enabling -compatibility. +The Adapter pattern converts the interface of a class into another interface that clients expect, enabling compatibility. ## Explanation Real-world example -> Consider that you have some pictures on your memory card and you need to transfer them to your computer. To transfer -> them, you need some kind of adapter that is compatible with your computer ports so that you can attach a memory card -> to your computer. In this case card reader is an adapter. Another example would be the famous power adapter; a -> three-legged plug can't be connected to a two-pronged outlet, it needs to use a power adapter that makes it compatible -> with the two-pronged outlets. Yet another example would be a translator translating words spoken by one person to -> another +> Consider that you have some pictures on your memory card and you need to transfer them to your computer. To transfer them, you need some kind of adapter that is compatible with your computer ports so that you can attach a memory card to your computer. In this case card reader is an adapter. Another example would be the famous power adapter; a three-legged plug can't be connected to a two-pronged outlet, it needs to use a power adapter that makes it compatible with the two-pronged outlets. Yet another example would be a translator translating words spoken by one person to another In plain words @@ -34,9 +28,7 @@ In plain words Wikipedia says -> In software engineering, the adapter pattern is a software design pattern that allows the interface of an existing -> class to be used as another interface. It is often used to make existing classes work with others without modifying -> their source code. +> In software engineering, the adapter pattern is a software design pattern that allows the interface of an existing class to be used as another interface. It is often used to make existing classes work with others without modifying their source code. **Programmatic Example** @@ -75,8 +67,7 @@ public class Captain { } ``` -Now let's say the pirates are coming and our captain needs to escape but there is only a fishing boat available. We need -to create an adapter that allows the captain to operate the fishing boat with his rowing boat skills. +Now let's say the pirates are coming and our captain needs to escape but there is only a fishing boat available. We need to create an adapter that allows the captain to operate the fishing boat with his rowing boat skills. ```java @@ -112,13 +103,9 @@ var captain=new Captain(new FishingBoatAdapter()); Use the Adapter pattern when * You want to use an existing class, and its interface does not match the one you need -* You want to create a reusable class that cooperates with unrelated or unforeseen classes, that is, classes that don't - necessarily have compatible interfaces -* You need to use several existing subclasses, but it's impractical to adapt their interface by subclassing everyone. An - object adapter can adapt the interface of its parent class. -* Most of the applications using third-party libraries use adapters as a middle layer between the application and the - 3rd party library to decouple the application from the library. If another library has to be used only an adapter for - the new library is required without having to change the application code. +* You want to create a reusable class that cooperates with unrelated or unforeseen classes, that is, classes that don't necessarily have compatible interfaces +* You need to use several existing subclasses, but it's impractical to adapt their interface by subclassing everyone. An object adapter can adapt the interface of its parent class. +* Most of the applications using third-party libraries use adapters as a middle layer between the application and the 3rd party library to decouple the application from the library. If another library has to be used only an adapter for the new library is required without having to change the application code. ## Tutorials @@ -131,17 +118,14 @@ Use the Adapter pattern when Class and object adapters have different trade-offs. A class adapter -* Adapts Adaptee to Target by committing to a concrete Adaptee class. As a consequence, a class adapter won’t work when - we want to adapt a class and all its subclasses. +* Adapts Adaptee to Target by committing to a concrete Adaptee class. As a consequence, a class adapter won’t work when we want to adapt a class and all its subclasses. * Lets Adapter override some of Adaptee’s behavior since Adapter is a subclass of Adaptee. * Introduces only one object, and no additional pointer indirection is needed to get to the adaptee. An object adapter -* Lets a single Adapter work with many Adaptees, that is, the Adaptee itself and all of its subclasses (if any). The - Adapter can also add functionality to all Adaptees at once. -* Makes it harder to override Adaptee behavior. It will require subclassing Adaptee and making the Adapter refer to the - subclass rather than the Adaptee itself. +* Lets a single Adapter work with many Adaptees, that is, the Adaptee itself and all of its subclasses (if any). The Adapter can also add functionality to all Adaptees at once. +* Makes it harder to override Adaptee behavior. It will require subclassing Adaptee and making the Adapter refer to the subclass rather than the Adaptee itself. ## Real-world examples diff --git a/aggregator-microservices/README.md b/aggregator-microservices/README.md index a32005cefea9..a4c0f9e6dab3 100644 --- a/aggregator-microservices/README.md +++ b/aggregator-microservices/README.md @@ -11,17 +11,13 @@ tag: ## Intent -Streamline client's interactions with system's microservices by providing a single aggregation point that consolidates -data and responses from multiple services. This simplifies the client's communication with the system, improving -efficiency and reducing complexity. +Streamline client's interactions with system's microservices by providing a single aggregation point that consolidates data and responses from multiple services. This simplifies the client's communication with the system, improving efficiency and reducing complexity. ## Explanation Real world example -> Our web marketplace needs information about products and their current inventory. It makes a call to an aggregator -> service, which, in turn, calls the product information and product inventory microservices, returning the combined -> information. +> Our web marketplace needs information about products and their current inventory. It makes a call to an aggregator service, which, in turn, calls the product information and product inventory microservices, returning the combined information. In plain words @@ -44,8 +40,7 @@ public class Product { } ``` -Next we can introduce our `Aggregator` microservice. It contains clients `ProductInformationClient` and -`ProductInventoryClient` for calling respective microservices. +Next we can introduce our `Aggregator` microservice. It contains clients `ProductInformationClient` and `ProductInventoryClient` for calling respective microservices. ```java @@ -76,8 +71,7 @@ public class Aggregator { } ``` -Here's the essence of information microservice implementation. Inventory microservice is similar, it just returns -inventory counts. +Here's the essence of information microservice implementation. Inventory microservice is similar, it just returns inventory counts. ```java @@ -103,41 +97,27 @@ curl http://localhost:50004/product ## Applicability -The Aggregator Microservices Design Pattern is particularly useful in scenarios where a client requires a composite -response that is assembled from data provided by multiple microservices. Common use cases include e-commerce -applications where product details, inventory, and reviews might be provided by separate services, or in dashboard -applications where aggregated data from various services is displayed in a unified view. +The Aggregator Microservices Design Pattern is particularly useful in scenarios where a client requires a composite response that is assembled from data provided by multiple microservices. Common use cases include e-commerce applications where product details, inventory, and reviews might be provided by separate services, or in dashboard applications where aggregated data from various services is displayed in a unified view. ## Consequences Benefits: -* Simplified Client: Clients interact with just one service rather than managing calls to multiple microservices, which - simplifies client-side logic. -* Reduced Latency: By aggregating responses, the number of network calls is reduced, which can improve the application's - overall latency. -* Decoupling: Clients are decoupled from the individual microservices, allowing for more flexibility in changing the - microservices landscape without impacting clients. -* Centralized Logic: Aggregation allows for centralized transformation and logic application on the data collected from - various services, which can be more efficient than handling it in the client or spreading it across multiple services. +* Simplified Client: Clients interact with just one service rather than managing calls to multiple microservices, which simplifies client-side logic. +* Reduced Latency: By aggregating responses, the number of network calls is reduced, which can improve the application's overall latency. +* Decoupling: Clients are decoupled from the individual microservices, allowing for more flexibility in changing the microservices landscape without impacting clients. +* Centralized Logic: Aggregation allows for centralized transformation and logic application on the data collected from various services, which can be more efficient than handling it in the client or spreading it across multiple services. Trade-offs: -* Single Point of Failure: The aggregator service can become a bottleneck or a single point of failure if not designed - with high availability and scalability in mind. -* Complexity: Implementing an aggregator can introduce complexity, especially in terms of data aggregation logic and - error handling when dealing with multiple services. +* Single Point of Failure: The aggregator service can become a bottleneck or a single point of failure if not designed with high availability and scalability in mind. +* Complexity: Implementing an aggregator can introduce complexity, especially in terms of data aggregation logic and error handling when dealing with multiple services. ## Related Patterns -* [API Gateway](https://java-design-patterns.com/patterns/api-gateway/): The Aggregator Microservices pattern is often - used in conjunction with an API Gateway, which provides a single entry point for clients to access multiple - microservices. -* [Composite](https://java-design-patterns.com/patterns/composite/): The Aggregator Microservices pattern can be seen as - a form of the Composite pattern, where the composite is the aggregated response from multiple microservices. -* [Facade](https://java-design-patterns.com/patterns/facade/): The Aggregator Microservices pattern can be seen as a - form of the Facade pattern, where the facade is the aggregator service that provides a simplified interface to the - client. +* [API Gateway](https://java-design-patterns.com/patterns/api-gateway/): The Aggregator Microservices pattern is often used in conjunction with an API Gateway, which provides a single entry point for clients to access multiple microservices. +* [Composite](https://java-design-patterns.com/patterns/composite/): The Aggregator Microservices pattern can be seen as a form of the Composite pattern, where the composite is the aggregated response from multiple microservices. +* [Facade](https://java-design-patterns.com/patterns/facade/): The Aggregator Microservices pattern can be seen as a form of the Facade pattern, where the facade is the aggregator service that provides a simplified interface to the client. ## Credits diff --git a/ambassador/README.md b/ambassador/README.md index 172285dcd135..7d78974fede2 100644 --- a/ambassador/README.md +++ b/ambassador/README.md @@ -19,27 +19,19 @@ Provide a helper service instance on a client and offload common functionality a Real world example -> A remote service has many clients accessing a function it provides. The service is a legacy application and is -> impossible to update. Large numbers of requests from users are causing connectivity issues. New rules for request -> frequency should be implemented along with latency checks and client-side logging. +> A remote service has many clients accessing a function it provides. The service is a legacy application and is impossible to update. Large numbers of requests from users are causing connectivity issues. New rules for request frequency should be implemented along with latency checks and client-side logging. In plain words -> With the Ambassador pattern, we can implement less-frequent polling from clients along with latency checks and -> logging. +> With the Ambassador pattern, we can implement less-frequent polling from clients along with latency checks and logging. Microsoft documentation states -> An ambassador service can be thought of as an out-of-process proxy which is co-located with the client. This pattern -> can be useful for offloading common client connectivity tasks such as monitoring, logging, routing, -> security (such as TLS), and resiliency patterns in a language agnostic way. It is often used with legacy applications, -> or other applications that are difficult to modify, in order to extend their networking capabilities. It can also -> enable a specialized team to implement those features. +> An ambassador service can be thought of as an out-of-process proxy which is co-located with the client. This pattern can be useful for offloading common client connectivity tasks such as monitoring, logging, routing, security (such as TLS), and resiliency patterns in a language agnostic way. It is often used with legacy applications, or other applications that are difficult to modify, in order to extend their networking capabilities. It can also enable a specialized team to implement those features. **Programmatic Example** -With the above introduction in mind we will imitate the functionality in this example. We have an interface implemented -by the remote service as well as the ambassador service: +With the above introduction in mind we will imitate the functionality in this example. We have an interface implemented by the remote service as well as the ambassador service: ```java interface RemoteServiceInterface { @@ -181,10 +173,8 @@ Time taken(ms):111 ## Applicability -* Cloud Native and Microservices Architectures: Especially useful in distributed systems where it's crucial to monitor, - log, and secure inter-service communication. -* Legacy System Integration: Facilitates communication with newer services by handling necessary but non-core - functionalities. +* Cloud Native and Microservices Architectures: Especially useful in distributed systems where it's crucial to monitor, log, and secure inter-service communication. +* Legacy System Integration: Facilitates communication with newer services by handling necessary but non-core functionalities. * Performance Enhancement: Can be used to cache results or compress data to improve communication efficiency. Typical use cases include: @@ -199,57 +189,34 @@ Typical use cases include: Benefits: -* Separation of Concerns: Offloads cross-cutting concerns from the service logic, leading to cleaner, more maintainable - code. -* Reusable Infrastructure Logic: The ambassador pattern allows the same logic (e.g., logging, monitoring) to be reused - across multiple services. -* Improved Security: Centralizes security features like SSL termination or authentication, reducing the risk of - misconfiguration. +* Separation of Concerns: Offloads cross-cutting concerns from the service logic, leading to cleaner, more maintainable code. +* Reusable Infrastructure Logic: The ambassador pattern allows the same logic (e.g., logging, monitoring) to be reused across multiple services. +* Improved Security: Centralizes security features like SSL termination or authentication, reducing the risk of misconfiguration. * Flexibility: Makes it easier to update or replace infrastructure concerns without modifying the service code. Trade-offs: * Increased Complexity: Adds another layer to the architecture, which can complicate the system design and debugging. -* Potential Performance Overhead: The additional network hop can introduce latency and overhead, particularly if not - optimized. +* Potential Performance Overhead: The additional network hop can introduce latency and overhead, particularly if not optimized. * Deployment Overhead: Requires additional resources and management for deploying and scaling ambassador services. ## Known uses -* Service Mesh Implementations: In a service mesh architecture, like Istio or Linkerd, the Ambassador pattern is often - employed as a sidecar proxy that handles inter-service communications. This includes tasks such as service discovery, - routing, load balancing, telemetry (metrics and tracing), and security (authentication and authorization). -* API Gateways: API gateways can use the Ambassador pattern to encapsulate common functionalities like rate limiting, - caching, request shaping, and authentication. This allows backend services to focus on their core business logic - without being burdened by these cross-cutting concerns. -* Logging and Monitoring: An Ambassador can aggregate logs and metrics from various services and forward them to - centralized monitoring tools like Prometheus or ELK Stack (Elasticsearch, Logstash, Kibana). This simplifies the - logging and monitoring setup for each service and provides a unified view of the system's health. -* Security: Security-related functionalities such as SSL/TLS termination, identity verification, and encryption can be - managed by an Ambassador. This ensures consistent security practices across services and reduces the likelihood of - security breaches due to misconfigurations. -* Resilience: The Ambassador can implement resilience patterns like circuit breakers, retries, and timeouts. For - instance, Netflix's Hystrix library can be used within an Ambassador to prevent cascading failures in a microservices - ecosystem. -* Database Proxy: Ambassadors can act as proxies for database connections, providing functionalities like connection - pooling, read/write splitting for replicas, and query caching. This offloads significant complexity from the - application services. -* Legacy System Integration: In scenarios where modern microservices need to communicate with legacy systems, an - Ambassador can serve as an intermediary that translates protocols, handles necessary transformations, and implements - modern security practices, easing the integration process. -* Network Optimization: For services deployed across different geographical locations or cloud regions, Ambassadors can - optimize communication by compressing data, batching requests, or even implementing smart routing to reduce latency - and costs. +* Service Mesh Implementations: In a service mesh architecture, like Istio or Linkerd, the Ambassador pattern is often employed as a sidecar proxy that handles inter-service communications. This includes tasks such as service discovery, routing, load balancing, telemetry (metrics and tracing), and security (authentication and authorization). +* API Gateways: API gateways can use the Ambassador pattern to encapsulate common functionalities like rate limiting, caching, request shaping, and authentication. This allows backend services to focus on their core business logic without being burdened by these cross-cutting concerns. +* Logging and Monitoring: An Ambassador can aggregate logs and metrics from various services and forward them to centralized monitoring tools like Prometheus or ELK Stack (Elasticsearch, Logstash, Kibana). This simplifies the logging and monitoring setup for each service and provides a unified view of the system's health. +* Security: Security-related functionalities such as SSL/TLS termination, identity verification, and encryption can be managed by an Ambassador. This ensures consistent security practices across services and reduces the likelihood of security breaches due to misconfigurations. +* Resilience: The Ambassador can implement resilience patterns like circuit breakers, retries, and timeouts. For instance, Netflix's Hystrix library can be used within an Ambassador to prevent cascading failures in a microservices ecosystem. +* Database Proxy: Ambassadors can act as proxies for database connections, providing functionalities like connection pooling, read/write splitting for replicas, and query caching. This offloads significant complexity from the application services. +* Legacy System Integration: In scenarios where modern microservices need to communicate with legacy systems, an Ambassador can serve as an intermediary that translates protocols, handles necessary transformations, and implements modern security practices, easing the integration process. +* Network Optimization: For services deployed across different geographical locations or cloud regions, Ambassadors can optimize communication by compressing data, batching requests, or even implementing smart routing to reduce latency and costs. * [Kubernetes-native API gateway for microservices](https://github.com/datawire/ambassador) ## Related patterns -* [Proxy](https://java-design-patterns.com/patterns/proxy/): Shares similarities with the proxy pattern, but the - ambassador pattern specifically focuses on offloading ancillary functionalities. -* Sidecar: A similar pattern used in the context of containerized applications, where a sidecar container provides - additional functionality to the main application container. -* [Decorator](https://java-design-patterns.com/patterns/decorator/): The decorator pattern is used to add functionality - to an object dynamically, while the ambassador pattern is used to offload functionality to a separate object. +* [Proxy](https://java-design-patterns.com/patterns/proxy/): Shares similarities with the proxy pattern, but the ambassador pattern specifically focuses on offloading ancillary functionalities. +* Sidecar: A similar pattern used in the context of containerized applications, where a sidecar container provides additional functionality to the main application container. +* [Decorator](https://java-design-patterns.com/patterns/decorator/): The decorator pattern is used to add functionality to an object dynamically, while the ambassador pattern is used to offload functionality to a separate object. ## Credits diff --git a/anti-corruption-layer/README.md b/anti-corruption-layer/README.md index 3d44d7133c8e..4109fd5c6790 100644 --- a/anti-corruption-layer/README.md +++ b/anti-corruption-layer/README.md @@ -16,34 +16,21 @@ tag: ## Intent -Implement a façade or adapter layer between different subsystems that don't share the same semantics. It translates -between different data formats and systems, ensuring that the integration between systems does not lead to corruption of -business logic or data integrity. +Implement a façade or adapter layer between different subsystems that don't share the same semantics. It translates between different data formats and systems, ensuring that the integration between systems does not lead to corruption of business logic or data integrity. ## Explanation ### Context and problem -Most applications rely on other systems for some data or functionality. For example, when a legacy application is -migrated to a modern system, it may still need existing legacy resources. New features must be able to call the legacy -system. This is especially true of gradual migrations, where different features of a larger application are moved to a -modern system over time. +Most applications rely on other systems for some data or functionality. For example, when a legacy application is migrated to a modern system, it may still need existing legacy resources. New features must be able to call the legacy system. This is especially true of gradual migrations, where different features of a larger application are moved to a modern system over time. -Often these legacy systems suffer from quality issues such as convoluted data schemas or obsolete APIs. The features and -technologies used in legacy systems can vary widely from more modern systems. To interoperate with the legacy system, -the new application may need to support outdated infrastructure, protocols, data models, APIs, or other features that -you wouldn't otherwise put into a modern application. +Often these legacy systems suffer from quality issues such as convoluted data schemas or obsolete APIs. The features and technologies used in legacy systems can vary widely from more modern systems. To interoperate with the legacy system, the new application may need to support outdated infrastructure, protocols, data models, APIs, or other features that you wouldn't otherwise put into a modern application. -Maintaining access between new and legacy systems can force the new system to adhere to at least some of the legacy -system's APIs or other semantics. When these legacy features have quality issues, supporting them "corrupts" what might -otherwise be a cleanly designed modern application. Similar issues can arise with any external system that your -development team doesn't control, not just legacy systems. +Maintaining access between new and legacy systems can force the new system to adhere to at least some of the legacy system's APIs or other semantics. When these legacy features have quality issues, supporting them "corrupts" what might otherwise be a cleanly designed modern application. Similar issues can arise with any external system that your development team doesn't control, not just legacy systems. ### Solution -Isolate the different subsystems by placing an anti-corruption layer between them. This layer translates communications -between the two systems, allowing one system to remain unchanged while the other can avoid compromising its design and -technological approach. +Isolate the different subsystems by placing an anti-corruption layer between them. This layer translates communications between the two systems, allowing one system to remain unchanged while the other can avoid compromising its design and technological approach. ### Programmatic example @@ -53,15 +40,9 @@ The example shows why the anti-corruption layer is needed. Here are 2 shop-ordering systems: `Legacy` and `Modern`. -The aforementioned systems have different domain models and have to operate simultaneously. Since they work -independently the orders can come either from the `Legacy` or `Modern` system. Therefore, the system that receives the -legacyOrder needs to check if the legacyOrder is valid and not present in the other system. Then it can place the -legacyOrder in its own system. +The aforementioned systems have different domain models and have to operate simultaneously. Since they work independently the orders can come either from the `Legacy` or `Modern` system. Therefore, the system that receives the legacyOrder needs to check if the legacyOrder is valid and not present in the other system. Then it can place the legacyOrder in its own system. -But for that, the system needs to know the domain model of the other system and to avoid that, the anti-corruption -layer(ACL) is introduced. The ACL is a layer that translates the domain model of the `Legacy` system to the domain model -of the `Modern` system and vice versa. Also, it hides all other operations with the other system, uncoupling the -systems. +But for that, the system needs to know the domain model of the other system and to avoid that, the anti-corruption layer(ACL) is introduced. The ACL is a layer that translates the domain model of the `Legacy` system to the domain model of the `Modern` system and vice versa. Also, it hides all other operations with the other system, uncoupling the systems. #### Domain model of the `Legacy` system @@ -122,9 +103,7 @@ public class AntiCorruptionLayer { #### The connection -Wherever the `Legacy` or `Modern` system needs to communicate with the counterpart the ACL needs to be used to avoid -corrupting the current domain model. The example below shows how the `Legacy` system places an order with a validation -from the `Modern` system. +Wherever the `Legacy` or `Modern` system needs to communicate with the counterpart the ACL needs to be used to avoid corrupting the current domain model. The example below shows how the `Legacy` system places an order with a validation from the `Modern` system. ```java public class LegacyShop { @@ -150,14 +129,11 @@ public class LegacyShop { Use this pattern when: -* A migration is planned to happen over multiple stages, but integration between new and legacy systems needs to be - maintained +* A migration is planned to happen over multiple stages, but integration between new and legacy systems needs to be maintained * Two or more subsystems have different semantics, but still need to communicate -* When integrating with legacy systems or external systems where direct integration might pollute the domain model of - the new system +* When integrating with legacy systems or external systems where direct integration might pollute the domain model of the new system * In scenarios where different subsystems within a larger system use different data formats or structures -* When there is a need to ensure loose coupling between different subsystems or external services to facilitate easier - maintenance and scalability +* When there is a need to ensure loose coupling between different subsystems or external services to facilitate easier maintenance and scalability ## Tutorials @@ -166,11 +142,9 @@ Use this pattern when: ## Known Uses -* Microservices architectures where individual services must communicate without being tightly coupled to each other’s - data schemas +* Microservices architectures where individual services must communicate without being tightly coupled to each other’s data schemas * Enterprise systems integration, especially when integrating modern systems with legacy systems -* In bounded contexts within Domain-Driven Design (DDD) to maintain the integrity of a domain model when interacting - with external systems or subsystems +* In bounded contexts within Domain-Driven Design (DDD) to maintain the integrity of a domain model when interacting with external systems or subsystems ## Consequences @@ -188,12 +162,9 @@ Trade-offs: ## Related Patterns -* [Facade](https://java-design-patterns.com/patterns/facade/): The Anti-Corruption Layer can be seen as a specialized - form of the Facade pattern that is used to isolate different subsystems -* [Adapter](https://java-design-patterns.com/patterns/adapter/): The Anti-Corruption Layer can be implemented using the - Adapter pattern to translate between different data formats or structures -* [Gateway](https://java-design-patterns.com/patterns/gateway/): The Anti-Corruption Layer can be used as a Gateway to - external systems to provide a unified interface +* [Facade](https://java-design-patterns.com/patterns/facade/): The Anti-Corruption Layer can be seen as a specialized form of the Facade pattern that is used to isolate different subsystems +* [Adapter](https://java-design-patterns.com/patterns/adapter/): The Anti-Corruption Layer can be implemented using the Adapter pattern to translate between different data formats or structures +* [Gateway](https://java-design-patterns.com/patterns/gateway/): The Anti-Corruption Layer can be used as a Gateway to external systems to provide a unified interface ## Credits diff --git a/api-gateway/README.md b/api-gateway/README.md index edc4ca98c3b8..2455b6b64004 100644 --- a/api-gateway/README.md +++ b/api-gateway/README.md @@ -11,9 +11,7 @@ tag: ## Intent -The API Gateway design pattern aims to provide a unified interface to a set of microservices. It acts as a single entry -point for clients, routing requests to the appropriate microservices and aggregating results, thereby simplifying the -client-side code. +The API Gateway design pattern aims to provide a unified interface to a set of microservices. It acts as a single entry point for clients, routing requests to the appropriate microservices and aggregating results, thereby simplifying the client-side code. ## Also known as @@ -21,48 +19,25 @@ client-side code. ## Explanation -With the Microservices pattern, a client may need data from multiple different microservices. If the -client called each microservice directly, that could contribute to longer load times, since the -client would have to make a network request for each microservice called. Moreover, having the -client call each microservice directly ties the client to that microservice - if the internal -implementations of the microservices change (for example, if two microservices are combined sometime -in the future) or if the location (host and port) of a microservice changes, then every client that -makes use of those microservices must be updated. +With the Microservices pattern, a client may need data from multiple different microservices. If the client called each microservice directly, that could contribute to longer load times, since the client would have to make a network request for each microservice called. Moreover, having the client call each microservice directly ties the client to that microservice - if the internal implementations of the microservices change (for example, if two microservices are combined sometime in the future) or if the location (host and port) of a microservice changes, then every client that makes use of those microservices must be updated. -The intent of the API Gateway pattern is to alleviate some of these issues. In the API Gateway -pattern, an additional entity (the API Gateway) is placed between the client and the microservices. -The job of the API Gateway is to aggregate the calls to the microservices. Rather than the client -calling each microservice individually, the client calls the API Gateway a single time. The API -Gateway then calls each of the microservices that the client needs. +The intent of the API Gateway pattern is to alleviate some of these issues. In the API Gateway pattern, an additional entity (the API Gateway) is placed between the client and the microservices. The job of the API Gateway is to aggregate the calls to the microservices. Rather than the client calling each microservice individually, the client calls the API Gateway a single time. The API Gateway then calls each of the microservices that the client needs. Real world example -> We are implementing microservices and API Gateway pattern for an e-commerce site. In this system -> the API Gateway makes calls to the Image and Price microservices. +> We are implementing microservices and API Gateway pattern for an e-commerce site. In this system the API Gateway makes calls to the Image and Price microservices. In plain words -> For a system implemented using microservices architecture, API Gateway is the single entry point -> that aggregates the calls to the individual microservices. +> For a system implemented using microservices architecture, API Gateway is the single entry point that aggregates the calls to the individual microservices. Wikipedia says -> API Gateway is a server that acts as an API front-end, receives API requests, enforces throttling -> and security policies, passes requests to the back-end service and then passes the response back -> to the requester. A gateway often includes a transformation engine to orchestrate and modify the -> requests and responses on the fly. A gateway can also provide functionality such as collecting -> analytics data and providing caching. The gateway can provide functionality to support -> authentication, authorization, security, audit and regulatory compliance. +> API Gateway is a server that acts as an API front-end, receives API requests, enforces throttling and security policies, passes requests to the back-end service and then passes the response back to the requester. A gateway often includes a transformation engine to orchestrate and modify the requests and responses on the fly. A gateway can also provide functionality such as collecting analytics data and providing caching. The gateway can provide functionality to support authentication, authorization, security, audit and regulatory compliance. **Programmatic Example** -This implementation shows what the API Gateway pattern could look like for an e-commerce site. The -`ApiGateway` makes calls to the Image and Price microservices using the `ImageClientImpl` and -`PriceClientImpl` respectively. Customers viewing the site on a desktop device can see both price -information and an image of a product, so the `ApiGateway` calls both of the microservices and -aggregates the data in the `DesktopProduct` model. However, mobile users only see price information; -they do not see a product image. For mobile users, the `ApiGateway` only retrieves price -information, which it uses to populate the `MobileProduct`. +This implementation shows what the API Gateway pattern could look like for an e-commerce site. The`ApiGateway` makes calls to the Image and Price microservices using the `ImageClientImpl` and `PriceClientImpl` respectively. Customers viewing the site on a desktop device can see both price information and an image of a product, so the `ApiGateway` calls both of the microservices and aggregates the data in the `DesktopProduct` model. However, mobile users only see price information; they do not see a product image. For mobile users, the `ApiGateway` only retrieves price information, which it uses to populate the `MobileProduct`. Here's the Image microservice implementation. @@ -155,8 +130,7 @@ public class ApiGateway { ## Applicability -* When building a microservices architecture, and there's a need to abstract the complexity of microservices from the - client. +* When building a microservices architecture, and there's a need to abstract the complexity of microservices from the client. * When multiple microservices need to be consumed in a single request. * For authentication, authorization, and security enforcement at a single point. * To optimize communication between clients and services, especially in a cloud environment. @@ -184,12 +158,9 @@ Trade-offs: ## Related patterns -* [Aggregator Microservice](../aggregator-microservices/README.md) - The API Gateway pattern is often used in - conjunction with the Aggregator Microservice pattern to provide a unified interface to a set of microservices. -* [Proxy](../proxy/README.md) - The API Gateway pattern is a specialized form of the Proxy pattern, where the gateway - acts as a single entry point for clients, routing requests to the appropriate microservices and aggregating results. -* [Circuit Breaker](../circuit-breaker/README.md) - API Gateways can use the Circuit Breaker pattern to prevent - cascading failures when calling multiple microservices. +* [Aggregator Microservice](../aggregator-microservices/README.md) - The API Gateway pattern is often used in conjunction with the Aggregator Microservice pattern to provide a unified interface to a set of microservices. +* [Proxy](../proxy/README.md) - The API Gateway pattern is a specialized form of the Proxy pattern, where the gateway acts as a single entry point for clients, routing requests to the appropriate microservices and aggregating results. +* [Circuit Breaker](../circuit-breaker/README.md) - API Gateways can use the Circuit Breaker pattern to prevent cascading failures when calling multiple microservices. ## Tutorials diff --git a/arrange-act-assert/README.md b/arrange-act-assert/README.md index cc0c308ac27f..96c4de87e9be 100644 --- a/arrange-act-assert/README.md +++ b/arrange-act-assert/README.md @@ -13,8 +13,7 @@ Given/When/Then ## Intent -Arrange/Act/Assert (AAA) is a pattern for organizing unit tests. -It breaks tests down into three clear and distinct steps: +Arrange/Act/Assert (AAA) is a pattern for organizing unit tests. It breaks tests down into three clear and distinct steps: 1. Arrange: Perform the setup and initialization required for the test. 2. Act: Take action(s) required for the test. @@ -22,14 +21,9 @@ It breaks tests down into three clear and distinct steps: ## Explanation -This pattern has several significant benefits. It creates a clear separation between a test's -setup, operations, and results. This structure makes the code easier to read and understand. If -you place the steps in order and format your code to separate them, you can scan a test and -quickly comprehend what it does. +This pattern has several significant benefits. It creates a clear separation between a test's setup, operations, and results. This structure makes the code easier to read and understand. If you place the steps in order and format your code to separate them, you can scan a test and quickly comprehend what it does. -It also enforces a certain degree of discipline when you write your tests. You have to think -clearly about the three steps your test will perform. It makes tests more natural to write at -the same time since you already have an outline. +It also enforces a certain degree of discipline when you write your tests. You have to think clearly about the three steps your test will perform. It makes tests more natural to write at the same time since you already have an outline. Real world example @@ -37,8 +31,7 @@ Real world example In plain words -> Arrange/Act/Assert is a testing pattern that organizes tests into three clear steps for easy -> maintenance. +> Arrange/Act/Assert is a testing pattern that organizes tests into three clear steps for easy maintenance. WikiWikiWeb says @@ -76,8 +69,7 @@ public class Cash { } ``` -Then we write our unit tests according to Arrange/Act/Assert pattern. Notice the clearly -separated steps for each unit test. +Then we write our unit tests according to Arrange/Act/Assert pattern. Notice the clearly separated steps for each unit test. ```java class CashAAATest { @@ -138,8 +130,7 @@ Use Arrange/Act/Assert pattern when ## Known uses * Widely adopted in software projects using TDD and BDD methodologies. -* Utilized in various programming languages and testing frameworks, such as JUnit (Java), NUnit (.NET), and xUnit - frameworks. +* Utilized in various programming languages and testing frameworks, such as JUnit (Java), NUnit (.NET), and xUnit frameworks. ## Consequences @@ -152,13 +143,11 @@ Benefits: Trade-offs: * May introduce redundancy in tests, as similar arrangements may be repeated across tests. -* Some complex tests might not fit neatly into this structure, requiring additional context or setup outside these three - phases. +* Some complex tests might not fit neatly into this structure, requiring additional context or setup outside these three phases. ## Related patterns -* [Page Object](https://java-design-patterns.com/patterns/page-object/): A pattern for organizing UI tests that can be - used in conjunction with Arrange/Act/Assert. +* [Page Object](https://java-design-patterns.com/patterns/page-object/): A pattern for organizing UI tests that can be used in conjunction with Arrange/Act/Assert. ## Credits diff --git a/async-method-invocation/README.md b/async-method-invocation/README.md index deb573c7bd37..54dfc7c64be9 100644 --- a/async-method-invocation/README.md +++ b/async-method-invocation/README.md @@ -10,9 +10,7 @@ tag: ## Intent -Asynchronous method invocation is a pattern where the calling thread is not blocked while waiting results of tasks. The -pattern provides parallel processing of multiple independent tasks and retrieving the results via callbacks or waiting -until everything is done. +Asynchronous method invocation is a pattern where the calling thread is not blocked while waiting results of tasks. The pattern provides parallel processing of multiple independent tasks and retrieving the results via callbacks or waiting until everything is done. ## Also known as @@ -22,29 +20,21 @@ until everything is done. Real world example -> Launching space rockets is an exciting business. The mission command gives an order to launch and -> after some undetermined time, the rocket either launches successfully or fails miserably. +> Launching space rockets is an exciting business. The mission command gives an order to launch and after some undetermined time, the rocket either launches successfully or fails miserably. In plain words -> Asynchronous method invocation starts task processing and returns immediately before the task is -> ready. The results of the task processing are returned to the caller later. +> Asynchronous method invocation starts task processing and returns immediately before the task is ready. The results of the task processing are returned to the caller later. Wikipedia says -> In multithreaded computer programming, asynchronous method invocation (AMI), also known as -> asynchronous method calls or the asynchronous pattern is a design pattern in which the call site -> is not blocked while waiting for the called code to finish. Instead, the calling thread is -> notified when the reply arrives. Polling for a reply is an undesired option. +> In multithreaded computer programming, asynchronous method invocation (AMI), also known as asynchronous method calls or the asynchronous pattern is a design pattern in which the call site is not blocked while waiting for the called code to finish. Instead, the calling thread is notified when the reply arrives. Polling for a reply is an undesired option. **Programmatic Example** In this example, we are launching space rockets and deploying lunar rovers. -The application demonstrates the async method invocation pattern. The key parts of the pattern are -`AsyncResult` which is an intermediate container for an asynchronously evaluated value, -`AsyncCallback` which can be provided to be executed on task completion and `AsyncExecutor` that -manages the execution of the async tasks. +The application demonstrates the async method invocation pattern. The key parts of the pattern are`AsyncResult` which is an intermediate container for an asynchronously evaluated value, `AsyncCallback` which can be provided to be executed on task completion and `AsyncExecutor` that manages the execution of the async tasks. ```java public interface AsyncResult { @@ -74,8 +64,7 @@ public interface AsyncExecutor { } ``` -`ThreadAsyncExecutor` is an implementation of `AsyncExecutor`. Some of its key parts are highlighted -next. +`ThreadAsyncExecutor` is an implementation of `AsyncExecutor`. Some of its key parts are highlighted next. ```java public class ThreadAsyncExecutor implements AsyncExecutor { @@ -170,16 +159,14 @@ Here's the program console output. Use the async method invocation pattern when * When operations do not need to complete before proceeding with the next steps in a program. -* For tasks that are resource-intensive or time-consuming, such as IO operations, network requests, or complex - computations, where making the operation synchronous would significantly impact performance or user experience. +* For tasks that are resource-intensive or time-consuming, such as IO operations, network requests, or complex computations, where making the operation synchronous would significantly impact performance or user experience. * In GUI applications to prevent freezing or unresponsiveness during long-running tasks. * In web applications for non-blocking IO operations. ## Known Uses * Web servers handling HTTP requests asynchronously to improve throughput and reduce latency. -* Desktop and mobile applications using background threads to perform time-consuming operations without blocking the - user interface. +* Desktop and mobile applications using background threads to perform time-consuming operations without blocking the user interface. * Microservices architectures where services perform asynchronous communications via messaging queues or event streams. * [FutureTask](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/FutureTask.html) * [CompletableFuture](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html) @@ -190,29 +177,21 @@ Use the async method invocation pattern when Benefits: -* Improved Responsiveness: The main thread or application flow remains unblocked, improving the user experience in GUI - applications and overall responsiveness. -* Better Resource Utilization: By enabling parallel execution, system resources (like CPU and IO) are utilized more - efficiently, potentially improving the application's throughput. +* Improved Responsiveness: The main thread or application flow remains unblocked, improving the user experience in GUI applications and overall responsiveness. +* Better Resource Utilization: By enabling parallel execution, system resources (like CPU and IO) are utilized more efficiently, potentially improving the application's throughput. * Scalability: Easier to scale applications, as tasks can be distributed across available resources more effectively. Trade-offs: -* Complexity: Introducing asynchronous operations can complicate the codebase, making it more challenging to understand, - debug, and maintain. -* Resource Management: Requires careful management of threads or execution contexts, which can introduce overhead and - potential resource exhaustion issues. -* Error Handling: Asynchronous operations can make error handling more complex, as exceptions may occur in different - threads or at different times. +* Complexity: Introducing asynchronous operations can complicate the codebase, making it more challenging to understand, debug, and maintain. +* Resource Management: Requires careful management of threads or execution contexts, which can introduce overhead and potential resource exhaustion issues. +* Error Handling: Asynchronous operations can make error handling more complex, as exceptions may occur in different threads or at different times. Related Patterns: -* [Command](https://java-design-patterns.com/patterns/command/): Asynchronous method invocation can be used to implement - the Command pattern, where commands are executed asynchronously. -* [Observer](https://java-design-patterns.com/patterns/observer/): Asynchronous method invocation can be used to notify - observers asynchronously when a subject's state changes. -* [Promise](https://java-design-patterns.com/patterns/promise/): The AsyncResult interface can be considered a form of - Promise, representing a value that may not be available yet. +* [Command](https://java-design-patterns.com/patterns/command/): Asynchronous method invocation can be used to implement the Command pattern, where commands are executed asynchronously. +* [Observer](https://java-design-patterns.com/patterns/observer/): Asynchronous method invocation can be used to notify observers asynchronously when a subject's state changes. +* [Promise](https://java-design-patterns.com/patterns/promise/): The AsyncResult interface can be considered a form of Promise, representing a value that may not be available yet. ## Credits diff --git a/balking/README.md b/balking/README.md index f40c45d7d4b9..75a4eee083e1 100644 --- a/balking/README.md +++ b/balking/README.md @@ -8,16 +8,13 @@ tag: ## Intent -Balking Pattern is used to prevent an object from executing a certain code if it is in an incomplete or inappropriate -state. If the state is not suitable for the action, the method call is ignored (or "balked"). +Balking Pattern is used to prevent an object from executing a certain code if it is in an incomplete or inappropriate state. If the state is not suitable for the action, the method call is ignored (or "balked"). ## Explanation Real world example -> There's a start-button in a washing machine to initiate the laundry washing. When the washing -> machine is inactive the button works as expected, but if it's already washing the button does -> nothing. +> There's a start-button in a washing machine to initiate the laundry washing. When the washing machine is inactive the button works as expected, but if it's already washing the button does nothing. In plain words @@ -25,17 +22,11 @@ In plain words Wikipedia says -> The balking pattern is a software design pattern that only executes an action on an object when -> the object is in a particular state. For example, if an object reads ZIP files and a calling -> method invokes a get method on the object when the ZIP file is not open, the object would "balk" -> at the request. +> The balking pattern is a software design pattern that only executes an action on an object when the object is in a particular state. For example, if an object reads ZIP files and a calling method invokes a get method on the object when the ZIP file is not open, the object would "balk" at the request. **Programmatic Example** -In this example implementation, `WashingMachine` is an object that has two states in which it can -be: ENABLED and WASHING. If the machine is ENABLED, the state changes to WASHING using a thread-safe -method. On the other hand, if it already has been washing and any other thread executes `wash()` -it won't do that and returns without doing anything. +In this example implementation, `WashingMachine` is an object that has two states in which it can be: ENABLED and WASHING. If the machine is ENABLED, the state changes to WASHING using a thread-safe method. On the other hand, if it already has been washing and any other thread executes `wash()`it won't do that and returns without doing anything. Here are the relevant parts of the `WashingMachine` class. @@ -125,33 +116,26 @@ Here is the console output of the program. 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 but for an unknown - amount of time -* In multithreaded applications where certain actions should only proceed when specific conditions are met, and those - conditions are expected to change over time due to external factors or concurrent operations. +* Objects are generally only in a state that is prone to balking temporarily but for an unknown amount of time +* In multithreaded applications where certain actions should only proceed when specific conditions are met, and those conditions are expected to change over time due to external factors or concurrent operations. ## Known Uses: * Resource pooling, where resources are only allocated if they are in a valid state for allocation. -* Thread management, where threads only proceed with tasks if certain conditions (like task availability or resource - locks) are met. +* Thread management, where threads only proceed with tasks if certain conditions (like task availability or resource locks) are met. ## Consequences: Benefits: -* Reduces unnecessary lock acquisitions in situations where actions cannot proceed, enhancing performance in concurrent - applications. +* Reduces unnecessary lock acquisitions in situations where actions cannot proceed, enhancing performance in concurrent applications. * Encourages clear separation of state management and behavior, leading to cleaner code. -* Simplifies the handling of operations that should only be performed under certain conditions without cluttering the - caller code with state checks. +* Simplifies the handling of operations that should only be performed under certain conditions without cluttering the caller code with state checks. Trade-offs: -* Can introduce complexity by obscuring the conditions under which actions are taken or ignored, potentially making the - system harder to debug and understand. -* May lead to missed opportunities or actions if the state changes are not properly monitored or if the balking - condition is too restrictive. +* Can introduce complexity by obscuring the conditions under which actions are taken or ignored, potentially making the system harder to debug and understand. +* May lead to missed opportunities or actions if the state changes are not properly monitored or if the balking condition is too restrictive. ## Related patterns diff --git a/bridge/README.md b/bridge/README.md index a5fac3a3792a..c5828fdc7169 100644 --- a/bridge/README.md +++ b/bridge/README.md @@ -20,20 +20,15 @@ Decouple an abstraction from its implementation so that the two can vary indepen Real-world example -> Consider you have a weapon with different enchantments, and you are supposed to allow mixing different weapons with -> different enchantments. What would you do? Create multiple copies of each of the weapons for each of the enchantments -> or would you just create separate enchantment and set it for the weapon as needed? Bridge pattern allows you to do the -> second. +> Consider you have a weapon with different enchantments, and you are supposed to allow mixing different weapons with different enchantments. What would you do? Create multiple copies of each of the weapons for each of the enchantments or would you just create separate enchantment and set it for the weapon as needed? Bridge pattern allows you to do the second. In Plain Words -> Bridge pattern is about preferring composition to inheritance. Implementation details are pushed from a hierarchy to -> another object with a separate hierarchy. +> Bridge pattern is about preferring composition to inheritance. Implementation details are pushed from a hierarchy to another object with a separate hierarchy. Wikipedia says -> The bridge pattern is a design pattern used in software engineering that is meant to "decouple an abstraction from its -> implementation so that the two can vary independently" +> The bridge pattern is a design pattern used in software engineering that is meant to "decouple an abstraction from its implementation so that the two can vary independently" **Programmatic Example** @@ -206,55 +201,37 @@ The item's glow fades. Use the Bridge pattern when -* You want to avoid a permanent binding between an abstraction and its implementation. This might be the case, for - example, when the implementation must be selected or switched at run-time. -* Both the abstractions and their implementations should be extensible by subclassing. In this case, the Bridge pattern - lets you combine the different abstractions and implementations and extend them independently. -* Changes in the implementation of an abstraction should have no impact on clients; that is, their code should not have - to be recompiled. -* You have a proliferation of classes. Such a class hierarchy indicates the need for splitting an object into two parts. - Rumbaugh uses the term "nested generalizations" to refer to such class hierarchies. -* You want to share an implementation among multiple objects (perhaps using reference counting), and this fact should be - hidden from the client. A simple example is Coplien's String class, in which multiple objects can share the same - string representation. +* You want to avoid a permanent binding between an abstraction and its implementation. This might be the case, for example, when the implementation must be selected or switched at run-time. +* Both the abstractions and their implementations should be extensible by subclassing. In this case, the Bridge pattern lets you combine the different abstractions and implementations and extend them independently. +* Changes in the implementation of an abstraction should have no impact on clients; that is, their code should not have to be recompiled. +* You have a proliferation of classes. Such a class hierarchy indicates the need for splitting an object into two parts. Rumbaugh uses the term "nested generalizations" to refer to such class hierarchies. +* You want to share an implementation among multiple objects (perhaps using reference counting), and this fact should be hidden from the client. A simple example is Coplien's String class, in which multiple objects can share the same string representation. ## Known uses -* GUI Frameworks where the abstraction is the window, and the implementation could be the underlying OS windowing - system. -* Database Drivers where the abstraction is a generic database interface, and the implementations are database-specific - drivers. -* Device Drivers where the abstraction is the device-independent code, and the implementation is the device-dependent - code. +* GUI Frameworks where the abstraction is the window, and the implementation could be the underlying OS windowing system. +* Database Drivers where the abstraction is a generic database interface, and the implementations are database-specific drivers. +* Device Drivers where the abstraction is the device-independent code, and the implementation is the device-dependent code. ## Consequences Benefits: -* Decoupling Interface and Implementation: The Bridge pattern enhances modularity by separating the interface (the - high-level operations) from the implementation (the low-level operations). +* Decoupling Interface and Implementation: The Bridge pattern enhances modularity by separating the interface (the high-level operations) from the implementation (the low-level operations). * Improved Extensibility: You can extend the abstraction and implementation hierarchies independently. * Hiding Implementation Details: Clients only see the abstraction's interface, not its implementation. Trade-offs: -* Increased Complexity: The pattern can complicate the system architecture and code, especially for clients unfamiliar - with the pattern. -* Runtime Overhead: The extra layer of abstraction can introduce a performance penalty, although it is often negligible - in practice. +* Increased Complexity: The pattern can complicate the system architecture and code, especially for clients unfamiliar with the pattern. +* Runtime Overhead: The extra layer of abstraction can introduce a performance penalty, although it is often negligible in practice. ## Related Patterns -* [Adapter](https://java-design-patterns.com/patterns/adapter/): The Adapter pattern is used to provide a different - interface to an object, while the Bridge pattern is used to separate an object's interface from its implementation. -* [Strategy](https://java-design-patterns.com/patterns/strategy/): The Strategy pattern is like the Bridge pattern, but - with a different intent. Both patterns are based on composition: Strategy uses composition to change the behavior of a - class, while Bridge uses composition to separate an abstraction from its implementation. -* [Abstract Factory](https://java-design-patterns.com/patterns/abstract-factory/): The Abstract Factory pattern can be - used along with the Bridge pattern to create platforms that are independent of the concrete classes used to create - their objects. -* [Composite](https://java-design-patterns.com/patterns/composite/): The Bridge pattern is often used with the Composite - pattern to model the implementation details of a component. +* [Adapter](https://java-design-patterns.com/patterns/adapter/): The Adapter pattern is used to provide a different interface to an object, while the Bridge pattern is used to separate an object's interface from its implementation. +* [Strategy](https://java-design-patterns.com/patterns/strategy/): The Strategy pattern is like the Bridge pattern, but with a different intent. Both patterns are based on composition: Strategy uses composition to change the behavior of a class, while Bridge uses composition to separate an abstraction from its implementation. +* [Abstract Factory](https://java-design-patterns.com/patterns/abstract-factory/): The Abstract Factory pattern can be used along with the Bridge pattern to create platforms that are independent of the concrete classes used to create their objects. +* [Composite](https://java-design-patterns.com/patterns/composite/): The Bridge pattern is often used with the Composite pattern to model the implementation details of a component. ## Tutorials diff --git a/builder/README.md b/builder/README.md index b42b0ede7f65..af8fff28e5f2 100644 --- a/builder/README.md +++ b/builder/README.md @@ -8,38 +8,30 @@ tag: ## Intent -Separate the construction of a complex object from its representation so that the same construction process can create -different representations. +Separate the construction of a complex object from its representation so that the same construction process can create different representations. ## Explanation Real-world example -> Imagine a character generator for a role-playing game. The easiest option is to let the computer create the character -> for you. If you want to manually select the character details like profession, gender, hair color, etc. the character -> generation becomes a step-by-step process that completes when all the selections are ready. +> Imagine a character generator for a role-playing game. The easiest option is to let the computer create the character for you. If you want to manually select the character details like profession, gender, hair color, etc. the character generation becomes a step-by-step process that completes when all the selections are ready. In plain words -> Allows you to create different flavors of an object while avoiding constructor pollution. Useful when there could be -> several flavors of an object. Or when there are a lot of steps involved in creation of an object. +> Allows you to create different flavors of an object while avoiding constructor pollution. Useful when there could be several flavors of an object. Or when there are a lot of steps involved in creation of an object. Wikipedia says -> The builder pattern is an object creation software design pattern with the intentions of finding a solution to the -> telescoping constructor antipattern. +> The builder pattern is an object creation software design pattern with the intentions of finding a solution to the telescoping constructor antipattern. -Having said that let me add a bit about what telescoping constructor antipattern is. At one point or the other, we have -all seen a constructor like below: +Having said that let me add a bit about what telescoping constructor antipattern is. At one point or the other, we have all seen a constructor like below: ```java public Hero(Profession profession,String name,HairType hairType,HairColor hairColor,Armor armor,Weapon weapon){ } ``` -As you can see the number of constructor parameters can quickly get out of hand, and it may become difficult to -understand the arrangement of parameters. Plus this parameter list could keep on growing if you would want to add more -options in the future. This is called telescoping constructor antipattern. +As you can see the number of constructor parameters can quickly get out of hand, and it may become difficult to understand the arrangement of parameters. Plus this parameter list could keep on growing if you would want to add more options in the future. This is called telescoping constructor antipattern. **Programmatic Example** @@ -124,11 +116,9 @@ var mage=new Hero.Builder(Profession.MAGE,"Riobard").withHairColor(HairColor.BLA Use the Builder pattern when -* The algorithm for creating a complex object should be independent of the parts that make up the object and how they're - assembled +* The algorithm for creating a complex object should be independent of the parts that make up the object and how they're assembled * The construction process must allow different representations for the object that's constructed -* It's particularly useful when a product requires a lot of steps to be created and when these steps need to be executed - in a specific sequence +* It's particularly useful when a product requires a lot of steps to be created and when these steps need to be executed in a specific sequence ## Known Uses @@ -142,8 +132,7 @@ Benefits: * More control over the construction process compared to other creational patterns * Supports constructing objects step-by-step, defer construction steps or run steps recursively -* Can construct objects that require a complex assembly of sub-objects. The final product is detached from the parts - that make it up, as well as their assembly process +* Can construct objects that require a complex assembly of sub-objects. The final product is detached from the parts that make it up, as well as their assembly process * Single Responsibility Principle. You can isolate complex construction code from the business logic of the product Trade-offs: @@ -159,8 +148,7 @@ Trade-offs: ## Known uses * [java.lang.StringBuilder](http://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html) -* [java.nio.ByteBuffer](http://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html#put-byte-) as well as similar - buffers such as FloatBuffer, IntBuffer and so on. +* [java.nio.ByteBuffer](http://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html#put-byte-) as well as similar buffers such as FloatBuffer, IntBuffer and so on. * [java.lang.StringBuffer](http://docs.oracle.com/javase/8/docs/api/java/lang/StringBuffer.html#append-boolean-) * All implementations of [java.lang.Appendable](http://docs.oracle.com/javase/8/docs/api/java/lang/Appendable.html) * [Apache Camel builders](https://github.com/apache/camel/tree/0e195428ee04531be27a0b659005e3aa8d159d23/camel-core/src/main/java/org/apache/camel/builder) @@ -168,10 +156,7 @@ Trade-offs: ## Related patterns -* [Step Builder](https://java-design-patterns.com/patterns/step-builder/) is a variation of the Builder pattern that - generates a complex object using a step-by-step approach. The Step Builder pattern is a good choice when you need to - build an object with a large number of optional parameters, and you want to avoid the telescoping constructor - antipattern. +* [Step Builder](https://java-design-patterns.com/patterns/step-builder/) is a variation of the Builder pattern that generates a complex object using a step-by-step approach. The Step Builder pattern is a good choice when you need to build an object with a large number of optional parameters, and you want to avoid the telescoping constructor antipattern. ## Credits diff --git a/business-delegate/README.md b/business-delegate/README.md index 086175d7f329..02ade2804ede 100644 --- a/business-delegate/README.md +++ b/business-delegate/README.md @@ -8,9 +8,7 @@ tag: ## Intent -The Business Delegate pattern adds an abstraction layer between presentation and business tiers. By using the pattern we -gain loose coupling between the tiers and encapsulate knowledge about how to locate, connect to, and interact with the -business objects that make up the application. +The Business Delegate pattern adds an abstraction layer between presentation and business tiers. By using the pattern we gain loose coupling between the tiers and encapsulate knowledge about how to locate, connect to, and interact with the business objects that make up the application. ## Also known as @@ -20,9 +18,7 @@ Service Representative Real world example -> A mobile phone application promises to stream any movie in existence to your device. It captures the user's search -> string and passes this on to the Business Delegate. The Business Delegate selects the most suitable video streaming -> service and plays the video from there. +> A mobile phone application promises to stream any movie in existence to your device. It captures the user's search string and passes this on to the Business Delegate. The Business Delegate selects the most suitable video streaming service and plays the video from there. In Plain Words @@ -30,10 +26,7 @@ In Plain Words Wikipedia says -> Business Delegate is a Java EE design pattern. This pattern is directing to reduce the coupling in between business -> services and the connected presentation tier, and to hide the implementation details of services (including lookup and -> accessibility of EJB architecture). Business Delegates acts as an adaptor to invoke business objects from the -> presentation tier. +> Business Delegate is a Java EE design pattern. This pattern is directing to reduce the coupling in between business services and the connected presentation tier, and to hide the implementation details of services (including lookup and accessibility of EJB architecture). Business Delegates acts as an adaptor to invoke business objects from the presentation tier. **Programmatic Example** @@ -81,8 +74,7 @@ public class BusinessLookup { } ``` -The Business Delegate uses a business lookup to route movie playback requests to a suitable -video streaming service. +The Business Delegate uses a business lookup to route movie playback requests to a suitable video streaming service. ```java @@ -173,8 +165,7 @@ Benefits: * Decoupling of Presentation and Business Tiers: Allows the client tier and business services to evolve independently. * Location Transparency: Clients remain unaffected by changes in the location or the instantiation of business services. -* Reuse and Scalability: Business Delegate objects can be reused by multiple clients, and the pattern supports load - balancing and scalability. +* Reuse and Scalability: Business Delegate objects can be reused by multiple clients, and the pattern supports load balancing and scalability. Trade-offs: @@ -183,12 +174,9 @@ Trade-offs: ## Related patterns -* [Service Locator](https://java-design-patterns.com/patterns/service-locator/): Business Delegate uses Service Locator - to locate business services. -* [Session Facade](https://java-design-patterns.com/patterns/session-facade/): Business Delegate may use Session Facade - to provide a unified interface to a set of business services. -* [Composite Entity](https://java-design-patterns.com/patterns/composite-entity/): Business Delegate may use Composite - Entity to manage the state of business services. +* [Service Locator](https://java-design-patterns.com/patterns/service-locator/): Business Delegate uses Service Locator to locate business services. +* [Session Facade](https://java-design-patterns.com/patterns/session-facade/): Business Delegate may use Session Facade to provide a unified interface to a set of business services. +* [Composite Entity](https://java-design-patterns.com/patterns/composite-entity/): Business Delegate may use Composite Entity to manage the state of business services. ## Credits diff --git a/bytecode/README.md b/bytecode/README.md index 919bf793e110..b93bc8e2625e 100644 --- a/bytecode/README.md +++ b/bytecode/README.md @@ -14,21 +14,15 @@ Allows encoding behavior as instructions for a virtual machine. Real world example -> A team is working on a new game where wizards battle against each other. The wizard behavior needs to be carefully -> adjusted and iterated hundreds of times through playtesting. It's not optimal to ask the programmer to make changes -> each time the game designer wants to vary the behavior, so the wizard behavior is implemented as a data-driven virtual -> machine. +> A team is working on a new game where wizards battle against each other. The wizard behavior needs to be carefully adjusted and iterated hundreds of times through playtesting. It's not optimal to ask the programmer to make changes each time the game designer wants to vary the behavior, so the wizard behavior is implemented as a data-driven virtual machine. In plain words > Bytecode pattern enables behavior driven by data instead of code. -[Gameprogrammingpatterns.com](https://gameprogrammingpatterns.com/bytecode.html) documentation -states: +[Gameprogrammingpatterns.com](https://gameprogrammingpatterns.com/bytecode.html) documentation states: -> An instruction set defines the low-level operations that can be performed. A series of instructions is encoded as a -> sequence of bytes. A virtual machine executes these instructions one at a time, using a stack for intermediate values. -> By combining instructions, complex high-level behavior can be defined. +> An instruction set defines the low-level operations that can be performed. A series of instructions is encoded as a sequence of bytes. A virtual machine executes these instructions one at a time, using a stack for intermediate values. By combining instructions, complex high-level behavior can be defined. **Programmatic Example** @@ -60,9 +54,7 @@ public class Wizard { } ``` -Next, we show the available instructions for our virtual machine. Each of the instructions has its own semantics on how -it operates with the stack data. For example, the ADD instruction takes the top two items from the stack, adds them -together and pushes the result to the stack. +Next, we show the available instructions for our virtual machine. Each of the instructions has its own semantics on how it operates with the stack data. For example, the ADD instruction takes the top two items from the stack, adds them together and pushes the result to the stack. ```java @@ -85,8 +77,7 @@ public enum Instruction { } ``` -At the heart of our example is the `VirtualMachine` class. It takes instructions as input and executes them to provide -the game object behavior. +At the heart of our example is the `VirtualMachine` class. It takes instructions as input and executes them to provide the game object behavior. ```java @@ -227,13 +218,11 @@ Here is the console output. ## Applicability -Use the Bytecode pattern when you have a lot of behavior you need to define and your game’s implementation language -isn’t a good fit because: +Use the Bytecode pattern when you have a lot of behavior you need to define and your game’s implementation language isn’t a good fit because: * It’s too low-level, making it tedious or error-prone to program in. * Iterating on it takes too long due to slow compile times or other tooling issues. -* It has too much trust. If you want to ensure the behavior being defined can’t break the game, you need to sandbox it - from the rest of the codebase. +* It has too much trust. If you want to ensure the behavior being defined can’t break the game, you need to sandbox it from the rest of the codebase. ## Known Uses @@ -251,18 +240,14 @@ Benefits: Trade-offs: -* Overhead: Running bytecode typically involves more overhead than running native code, potentially affecting - performance. +* Overhead: Running bytecode typically involves more overhead than running native code, potentially affecting performance. * Complexity: Implementing and maintaining a VM adds complexity to the system. ## Related patterns -* [Interpreter](https://java-design-patterns.com/patterns/interpreter/) is often used within the implementation of VMs - to interpret bytecode instructions -* [Command](https://java-design-patterns.com/patterns/command/): Bytecode instructions can be seen as commands executed - by the VM. -* [Factory Method](https://java-design-patterns.com/patterns/factory-method/): VMs may use factory methods to - instantiate operations or instructions defined in the bytecode. +* [Interpreter](https://java-design-patterns.com/patterns/interpreter/) is often used within the implementation of VMs to interpret bytecode instructions +* [Command](https://java-design-patterns.com/patterns/command/): Bytecode instructions can be seen as commands executed by the VM. +* [Factory Method](https://java-design-patterns.com/patterns/factory-method/): VMs may use factory methods to instantiate operations or instructions defined in the bytecode. ## Credits diff --git a/caching/README.md b/caching/README.md index 75e8b42c990e..e926556b9798 100644 --- a/caching/README.md +++ b/caching/README.md @@ -10,9 +10,7 @@ tag: ## Intent -The caching pattern avoids expensive re-acquisition of resources by not releasing them immediately after use. The -resources retain their identity, are kept in some fast-access storage, and are re-used to avoid having to acquire them -again. +The caching pattern avoids expensive re-acquisition of resources by not releasing them immediately after use. The resources retain their identity, are kept in some fast-access storage, and are re-used to avoid having to acquire them again. ## Also known as @@ -23,10 +21,7 @@ again. Real world example -> A team is working on a website that provides new homes for abandoned cats. People can post their cats on the website -> after registering, but all the new posts require approval from one of the site moderators. The user accounts of the -> site moderators contain a specific flag and the data is stored in a MongoDB database. Checking for the moderator flag -> each time a post is viewed becomes expensive, and it's a good idea to utilize caching here. +> A team is working on a website that provides new homes for abandoned cats. People can post their cats on the website after registering, but all the new posts require approval from one of the site moderators. The user accounts of the site moderators contain a specific flag and the data is stored in a MongoDB database. Checking for the moderator flag each time a post is viewed becomes expensive, and it's a good idea to utilize caching here. In plain words @@ -34,17 +29,11 @@ In plain words Wikipedia says: -> In computing, a cache is a hardware or software component that stores data so that future requests for that data can -> be served faster; the data stored in a cache might be the result of an earlier computation or a copy of data stored -> elsewhere. A cache hit occurs when the requested data can be found in a cache, while a cache miss occurs when it -> cannot. Cache hits are served by reading data from the cache, which is faster than recomputing a result or reading -> from a slower data store; thus, the more requests that can be served from the cache, the faster the system performs. +> In computing, a cache is a hardware or software component that stores data so that future requests for that data can be served faster; the data stored in a cache might be the result of an earlier computation or a copy of data stored elsewhere. A cache hit occurs when the requested data can be found in a cache, while a cache miss occurs when it cannot. Cache hits are served by reading data from the cache, which is faster than recomputing a result or reading from a slower data store; thus, the more requests that can be served from the cache, the faster the system performs. **Programmatic Example** -Let's first look at the data layer of our application. The interesting classes are `UserAccount` which is a simple Java -object containing the user account details, and `DbManager` interface which handles reading and writing of these objects -to/from database. +Let's first look at the data layer of our application. The interesting classes are `UserAccount` which is a simple Java object containing the user account details, and `DbManager` interface which handles reading and writing of these objects to/from database. ```java @@ -78,18 +67,11 @@ In the example, we are demonstrating various different caching policies * Write-through writes data to the cache and DB in a single transaction * Write-around writes data immediately into the DB instead of the cache -* Write-behind writes data into the cache initially whilst the data is only written into the DB - when the cache is full -* Cache-aside pushes the responsibility of keeping the data synchronized in both data sources to - the application itself -* Read-through strategy is also included in the aforementioned strategies, and it returns data from - the cache to the caller if it exists, otherwise queries from DB and stores it into the cache for - future use. - -The cache implementation in `LruCache` is a hash table accompanied by a doubly linked-list. The linked-list helps in -capturing and maintaining the LRU data in the cache. When data is queried (from the cache), added (to the cache), or -updated, the data is moved to the front of the list to depict itself as the most-recently-used data. The LRU data is -always at the end of the list. +* Write-behind writes data into the cache initially whilst the data is only written into the DB when the cache is full +* Cache-aside pushes the responsibility of keeping the data synchronized in both data sources to the application itself +* Read-through strategy is also included in the aforementioned strategies, and it returns data from the cache to the caller if it exists, otherwise queries from DB and stores it into the cache for future use. + +The cache implementation in `LruCache` is a hash table accompanied by a doubly linked-list. The linked-list helps in capturing and maintaining the LRU data in the cache. When data is queried (from the cache), added (to the cache), or updated, the data is moved to the front of the list to depict itself as the most-recently-used data. The LRU data is always at the end of the list. ```java @@ -229,10 +211,7 @@ public class CacheStore { } ``` -`AppManager` helps to bridge the gap in communication between the main class and the application's back-end. DB -connection is initialized through this class. The chosen caching strategy/policy is also initialized here. Before the -cache can be used, the size of the cache has to be set. Depending on the chosen caching policy, `AppManager` will call -the appropriate function in the `CacheStore` class. +`AppManager` helps to bridge the gap in communication between the main class and the application's back-end. DB connection is initialized through this class. The chosen caching strategy/policy is also initialized here. Before the cache can be used, the size of the cache has to be set. Depending on the chosen caching policy, `AppManager` will call the appropriate function in the `CacheStore` class. ```java @@ -341,8 +320,7 @@ public class App { Use the Caching pattern when * Repetitious acquisition, initialization, and release of the same resource cause unnecessary performance overhead -* In scenarios where the cost of recomputing or re-fetching data is significantly higher than storing and retrieving it - from cache +* In scenarios where the cost of recomputing or re-fetching data is significantly higher than storing and retrieving it from cache * For read-heavy applications with relatively static data or data that changes infrequently ## Known Uses @@ -350,36 +328,28 @@ Use the Caching pattern when * Web page caching to reduce server load and improve response time * Database query caching to avoid repeated expensive SQL queries * Caching results of CPU-intensive computations -* Content Delivery Networks (CDNs) for caching static resources like images, CSS, and JavaScript files closer to the end - users +* Content Delivery Networks (CDNs) for caching static resources like images, CSS, and JavaScript files closer to the end users ## Consequences Benefits: * Improved Performance: Significantly reduces data access latency, leading to faster application performance -* Reduced Load: Decreases the load on the underlying data source, which can lead to cost savings and increased longevity - of the resource -* Scalability: Enhances the scalability of applications by efficiently handling increases in load without proportional - increases in resource utilization +* Reduced Load: Decreases the load on the underlying data source, which can lead to cost savings and increased longevity of the resource +* Scalability: Enhances the scalability of applications by efficiently handling increases in load without proportional increases in resource utilization Trade-Offs: * Complexity: Introduces complexity in terms of cache invalidation, consistency, and synchronization * Resource Utilization: Requires additional memory or storage resources to maintain the cache -* Stale Data: There's a risk of serving outdated data if the cache is not properly invalidated or updated when the - underlying data changes +* Stale Data: There's a risk of serving outdated data if the cache is not properly invalidated or updated when the underlying data changes ## Related patterns -* [Proxy](https://java-design-patterns.com/patterns/proxy/): Caching can be implemented using the Proxy pattern, where - the proxy object intercepts requests and returns cached data if available -* [Observer](https://java-design-patterns.com/patterns/observer/): Can be used to notify the cache when the underlying - data changes, so that it can be updated or invalidated accordingly -* [Decorator](https://java-design-patterns.com/patterns/decorator/): Can be used to add caching behavior to an existing - object without modifying its code -* [Strategy](https://java-design-patterns.com/patterns/strategy/): Different caching strategies can be implemented using - the Strategy pattern, allowing the application to switch between them at runtime +* [Proxy](https://java-design-patterns.com/patterns/proxy/): Caching can be implemented using the Proxy pattern, where the proxy object intercepts requests and returns cached data if available +* [Observer](https://java-design-patterns.com/patterns/observer/): Can be used to notify the cache when the underlying data changes, so that it can be updated or invalidated accordingly +* [Decorator](https://java-design-patterns.com/patterns/decorator/): Can be used to add caching behavior to an existing object without modifying its code +* [Strategy](https://java-design-patterns.com/patterns/strategy/): Different caching strategies can be implemented using the Strategy pattern, allowing the application to switch between them at runtime ## Credits diff --git a/callback/README.md b/callback/README.md index 886cecd8071c..c75b56905803 100644 --- a/callback/README.md +++ b/callback/README.md @@ -11,8 +11,7 @@ tag: ## Intent -Callback is a piece of executable code that is passed as an argument to other code, which is expected to call back ( -execute) the argument at some convenient time. +Callback is a piece of executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at some convenient time. ## Also known as @@ -23,8 +22,7 @@ execute) the argument at some convenient time. Real world example -> We need to be notified after the executing task has finished. We pass a callback method for the executor and wait for -> it to call back on us. +> We need to be notified after the executing task has finished. We pass a callback method for the executor and wait for it to call back on us. In plain words @@ -32,8 +30,7 @@ In plain words Wikipedia says -> In computer programming, a callback, also known as a "call-after" function, is any executable code that is passed as -> an argument to other code; that other code is expected to call back (execute) the argument at a given time. +> In computer programming, a callback, also known as a "call-after" function, is any executable code that is passed as an argument to other code; that other code is expected to call back (execute) the argument at a given time. **Programmatic Example** @@ -92,15 +89,13 @@ Use the Callback pattern when * GUI frameworks often use callbacks for event handling, such as user interactions (clicks, key presses) * Node.js heavily relies on callbacks for non-blocking I/O operations -* Frameworks that deal with asynchronous operations, like Promises in JavaScript, use callbacks to handle the resolution - or rejection of asynchronous tasks +* Frameworks that deal with asynchronous operations, like Promises in JavaScript, use callbacks to handle the resolution or rejection of asynchronous tasks ## Consequences Benefits: -* Decouples the execution logic of an operation from the signaling or notification logic, enhancing modularity and - reusability +* Decouples the execution logic of an operation from the signaling or notification logic, enhancing modularity and reusability * Facilitates asynchronous processing, improving the responsiveness and scalability of applications * Enables a reactive programming model where components can react to events as they occur @@ -108,21 +103,16 @@ Trade-offs: * Callback hell or pyramid of doom: Deeply nested callbacks can lead to code that is hard to read and maintain * Inversion of control can lead to harder-to-follow code flow, making debugging more challenging -* Potential issues with error handling, especially in languages or environments where exceptions are used, as errors - might need to be propagated through callbacks +* Potential issues with error handling, especially in languages or environments where exceptions are used, as errors might need to be propagated through callbacks ## Related patterns -[Observer](https://java-design-patterns.com/patterns/observer/): Callbacks can be seen as a more dynamic and lightweight -form of the Observer pattern, with the ability to subscribe and unsubscribe callback functions dynamically -[Command](https://java-design-patterns.com/patterns/command/): Callbacks can be implemented as Command objects in -scenarios where more flexibility or statefulness is required in the callback operation -[Promise](https://java-design-patterns.com/patterns/promise/): In some languages or frameworks, Promises or Futures can -be used to handle asynchronous operations more cleanly, often using callbacks for success or failure cases +* [Observer](https://java-design-patterns.com/patterns/observer/): Callbacks can be seen as a more dynamic and lightweight form of the Observer pattern, with the ability to subscribe and unsubscribe callback functions dynamically +* [Command](https://java-design-patterns.com/patterns/command/): Callbacks can be implemented as Command objects in scenarios where more flexibility or statefulness is required in the callback operation +* [Promise](https://java-design-patterns.com/patterns/promise/): In some languages or frameworks, Promises or Futures can be used to handle asynchronous operations more cleanly, often using callbacks for success or failure cases ## Real world examples -* [CyclicBarrier](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CyclicBarrier.html#CyclicBarrier%28int,%20java.lang.Runnable%29) - constructor can accept a callback that will be triggered every time a barrier is tripped. +* [CyclicBarrier](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CyclicBarrier.html#CyclicBarrier%28int,%20java.lang.Runnable%29) constructor can accept a callback that will be triggered every time a barrier is tripped. * [JavaScript: The Good Parts](https://amzn.to/3TiQV61) * [Node.js Design Patterns - Third edition: Design and implement production-grade Node.js applications using proven patterns and techniques](https://amzn.to/3VssjKG) diff --git a/chain-of-responsibility/README.md b/chain-of-responsibility/README.md index 147dcb0afbea..da2cf17d853b 100644 --- a/chain-of-responsibility/README.md +++ b/chain-of-responsibility/README.md @@ -15,28 +15,21 @@ tag: ## Intent -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. +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. ## Explanation Real-world example -> The Orc King gives loud orders to his army. The closest one to react is the commander, then -> an officer, and then a soldier. The commander, officer, and soldier form a chain of responsibility. +> The Orc King gives loud orders to his army. The closest one to react is the commander, then an officer, and then a soldier. The commander, officer, and soldier form a chain of responsibility. In plain words -> It helps to build a chain of objects. A request enters from one end and keeps going from an object -> to another until it finds a suitable handler. +> It helps to build a chain of objects. A request enters from one end and keeps going from an object to another until it finds a 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. +> 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** @@ -165,8 +158,7 @@ Orc soldier handling request "collect tax" Use Chain of Responsibility when -* More than one object may handle a request, and the handler isn't known a priori. The handler should be ascertained - automatically. +* More than one object may handle a request, and the handler isn't known a priori. The handler should be ascertained automatically. * You want to issue a request to one of several objects without specifying the receiver explicitly. * The set of objects that can handle a request should be specified dynamically. @@ -184,25 +176,20 @@ Use Chain of Responsibility when Benefits: * Reduced coupling. The sender of a request does not need to know the concrete handler that will process the request. -* Increased flexibility in assigning responsibilities to objects. You can add or change responsibilities for handling a - request by changing the members and order of the chain. +* Increased flexibility in assigning responsibilities to objects. You can add or change responsibilities for handling a request by changing the members and order of the chain. * Allows you to set a default handler if no concrete handler can handle the request. Trade-Offs: * It can be challenging to debug and understand the flow, especially if the chain is long and complex. * The request might end up unhandled if the chain doesn't include a catch-all handler. -* Performance concerns might arise due to potentially going through several handlers before finding the right one, or - not finding it at all. +* Performance concerns might arise due to potentially going through several handlers before finding the right one, or not finding it at all. ## Related Patterns -[Command](https://java-design-patterns.com/patterns/command/): can be used to encapsulate a request as an object, which -might be passed along the chain. -[Composite](https://java-design-patterns.com/patterns/composite/): the Chain of Responsibility is often applied in -conjunction with the Composite pattern. -[Decorator](https://java-design-patterns.com/patterns/decorator/): decorators can be chained in a similar manner as -responsibilities in the Chain of Responsibility pattern. +* [Command](https://java-design-patterns.com/patterns/command/): can be used to encapsulate a request as an object, which might be passed along the chain. +* [Composite](https://java-design-patterns.com/patterns/composite/): the Chain of Responsibility is often applied in conjunction with the Composite pattern. +* [Decorator](https://java-design-patterns.com/patterns/decorator/): decorators can be chained in a similar manner as responsibilities in the Chain of Responsibility pattern. ## Credits diff --git a/circuit-breaker/README.md b/circuit-breaker/README.md index 58d4b644ec41..3ce21a138abc 100644 --- a/circuit-breaker/README.md +++ b/circuit-breaker/README.md @@ -14,41 +14,25 @@ tag: ## Intent -The Circuit Breaker pattern aims to prevent a software system from making calls to a part of the system that is either -failing or showing signs of distress. It is a way to gracefully degrade functionality when a dependent service is not -responding, rather than failing completely. +The Circuit Breaker pattern aims to prevent a software system from making calls to a part of the system that is either failing or showing signs of distress. It is a way to gracefully degrade functionality when a dependent service is not responding, rather than failing completely. ## Explanation Real world example -> Imagine a web application that has both local files/images and remote services that are used for -> fetching data. These remote services may be either healthy and responsive at times, or may become -> slow and unresponsive at some point of time due to variety of reasons. So if one of the remote -> services is slow or not responding successfully, our application will try to fetch response from -> the remote service using multiple threads/processes, soon all of them will hang (also called -> [thread starvation](https://en.wikipedia.org/wiki/Starvation_(computer_science))) causing our entire web application -> to crash. We should be able to detect this situation and show the user an appropriate message so that he/she can -> explore other parts of the app unaffected by the remote serv'ice failure. Meanwhile, the other services that are -> working normally, should keep functioning unaffected by this failure. +> Imagine a web application that has both local files/images and remote services that are used for fetching data. These remote services may be either healthy and responsive at times, or may become slow and unresponsive at some point of time due to variety of reasons. So if one of the remote services is slow or not responding successfully, our application will try to fetch response from the remote service using multiple threads/processes, soon all of them will hang (also called[thread starvation](https://en.wikipedia.org/wiki/Starvation_(computer_science))) causing our entire web application to crash. We should be able to detect this situation and show the user an appropriate message so that he/she can explore other parts of the app unaffected by the remote serv'ice failure. Meanwhile, the other services that are working normally, should keep functioning unaffected by this failure. In plain words -> Circuit Breaker allows graceful handling of failed remote services. It's especially useful when -> all parts of our application are highly decoupled from each other, and failure of one component -> doesn't mean the other parts will stop working. +> Circuit Breaker allows graceful handling of failed remote services. It's especially useful when all parts of our application are highly decoupled from each other, and failure of one component doesn't mean the other parts will stop working. Wikipedia says -> Circuit breaker is a design pattern used in modern software development. It is used to detect -> failures and encapsulates the logic of preventing a failure from constantly recurring, during -> maintenance, temporary external system failure or unexpected system difficulties. +> Circuit breaker is a design pattern used in modern software development. It is used to detect failures and encapsulates the logic of preventing a failure from constantly recurring, during maintenance, temporary external system failure or unexpected system difficulties. ## Programmatic Example -So, how does this all come together? With the above example in mind we will imitate the -functionality in a simple example. A monitoring service mimics the web app and makes both local and -remote calls. +So, how does this all come together? With the above example in mind we will imitate the functionality in a simple example. A monitoring service mimics the web app and makes both local and remote calls. The service architecture is as follows: @@ -164,8 +148,7 @@ public class MonitoringService { } ``` -As it can be seen, it does the call to get local resources directly, but it wraps the call to -remote (costly) service in a circuit breaker object, which prevents faults as follows: +As it can be seen, it does the call to get local resources directly, but it wraps the call to remote (costly) service in a circuit breaker object, which prevents faults as follows: ```java public class DefaultCircuitBreaker implements CircuitBreaker { @@ -295,22 +278,15 @@ public class DefaultCircuitBreaker implements CircuitBreaker { } ``` -How does the above pattern prevent failures? Let's understand via this finite state machine -implemented by it. +How does the above pattern prevent failures? Let's understand via this finite state machine implemented by it. ![alt text](./etc/StateDiagram.png "State Diagram") -- We initialize the Circuit Breaker object with certain parameters: `timeout`, `failureThreshold` and `retryTimePeriod` - which help determine how resilient the API is. +- We initialize the Circuit Breaker object with certain parameters: `timeout`, `failureThreshold` and `retryTimePeriod`which help determine how resilient the API is. - Initially, we are in the `closed` state and nos remote calls to the API have occurred. - Every time the call succeeds, we reset the state to as it was in the beginning. -- If the number of failures cross a certain threshold, we move to the `open` state, which acts just like an open circuit - and prevents remote service calls from being made, thus saving resources. (Here, we return the response - called ```stale response from API```) -- Once we exceed the retry timeout period, we move to the `half-open` state and make another call to the remote service - again to check if the service is working so that we can serve fresh content. A failure sets it back to `open` state - and another attempt is made after retry timeout period, while a success sets it to `closed` state so that everything - starts working normally again. +- If the number of failures cross a certain threshold, we move to the `open` state, which acts just like an open circuit and prevents remote service calls from being made, thus saving resources. (Here, we return the response called ```stale response from API```) +- Once we exceed the retry timeout period, we move to the `half-open` state and make another call to the remote service again to check if the service is working so that we can serve fresh content. A failure sets it back to `open` state and another attempt is made after retry timeout period, while a success sets it to `closed` state so that everything starts working normally again. ## Class diagram @@ -340,18 +316,14 @@ Benefits: Trade-Offs: -* The complexity of the system increases as the pattern requires additional logic to detect failures and manage the - state of the circuit breaker -* May lead to system degradation if not properly configured, as legitimate requests might be blocked if the circuit is - open +* The complexity of the system increases as the pattern requires additional logic to detect failures and manage the state of the circuit breaker +* May lead to system degradation if not properly configured, as legitimate requests might be blocked if the circuit is open * Requires careful tuning of thresholds and timeout periods to balance between responsiveness and protection ## Related Patterns -- [Retry Pattern](https://github.com/iluwatar/java-design-patterns/tree/master/retry): Can be used in conjunction with - the Circuit Breaker pattern to retry failed operations before opening the circuit -- [Bulkhead Pattern](https://learn.microsoft.com/en-us/azure/architecture/patterns/bulkhead): Can be used to isolate - different parts of the system to prevent failures from spreading across the system +- [Retry Pattern](https://github.com/iluwatar/java-design-patterns/tree/master/retry): Can be used in conjunction with the Circuit Breaker pattern to retry failed operations before opening the circuit +- [Bulkhead Pattern](https://learn.microsoft.com/en-us/azure/architecture/patterns/bulkhead): Can be used to isolate different parts of the system to prevent failures from spreading across the system ## Credits diff --git a/client-session/README.md b/client-session/README.md index a16eeca0348f..a87ce53e6842 100644 --- a/client-session/README.md +++ b/client-session/README.md @@ -13,35 +13,21 @@ tags: ## Intent -The Client Session design pattern aims to maintain a user's state and data across multiple requests within a web -application, ensuring a continuous and personalized user experience. +The Client Session design pattern aims to maintain a user's state and data across multiple requests within a web application, ensuring a continuous and personalized user experience. ## Explanation Real-World Example -> You're looking to create a data management app allowing users to send requests to the server to modify and make -> changes to data stored on their devices. These requests are small and the data is individual to each user, negating -> the need for a large scale database implementation. Using the client session pattern, you are able to handle multiple -> concurrent requests, load balancing clients across different servers with ease due to servers remaining stateless. You -> also remove the need to store session IDs on the server side due to clients providing all the information that a -> server needs to perform their process. +> You're looking to create a data management app allowing users to send requests to the server to modify and make changes to data stored on their devices. These requests are small and the data is individual to each user, negating the need for a large scale database implementation. Using the client session pattern, you are able to handle multiple concurrent requests, load balancing clients across different servers with ease due to servers remaining stateless. You also remove the need to store session IDs on the server side due to clients providing all the information that a server needs to perform their process. In Plain words -> Instead of storing information about the current client and the information being accessed on the server, it is -> maintained client side only. Client has to send session data with each request to the server and has to send an -> updated state back to the client, which is stored on the clients machine. The server doesn't have to store the client -> information. ([ref](https://dzone.com/articles/practical-php-patterns/practical-php-patterns-client)) +> Instead of storing information about the current client and the information being accessed on the server, it is maintained client side only. Client has to send session data with each request to the server and has to send an updated state back to the client, which is stored on the clients machine. The server doesn't have to store the client information. ([ref](https://dzone.com/articles/practical-php-patterns/practical-php-patterns-client)) **Programmatic Example** -Here is the sample code to describe the client-session pattern. In the below code we are first creating an instance of -the Server. This server instance will then be used to get Session objects for two clients. As you can see from the code -below the Session object can be used to store any relevant information that are required by the server to process the -client request. These session objects will then be passed on with every Request to the server. The Request will have the -Session object that stores the relevant client details along with the required data for processing the request. The -session information in every request helps the server identify the client and process the request accordingly. +Here is the sample code to describe the client-session pattern. In the below code we are first creating an instance of the Server. This server instance will then be used to get Session objects for two clients. As you can see from the code below the Session object can be used to store any relevant information that are required by the server to process the client request. These session objects will then be passed on with every Request to the server. The Request will have the Session object that stores the relevant client details along with the required data for processing the request. The session information in every request helps the server identify the client and process the request accordingly. ```java public class App { @@ -107,27 +93,20 @@ Use the client state pattern when: Benefits: * Improved server performance by reducing the need to store user state on the server. -* Enhanced user experience through personalized content and seamless navigation across different parts of the - application. +* Enhanced user experience through personalized content and seamless navigation across different parts of the application. * Flexibility in managing sessions through various client-side storage mechanisms (e.g., cookies, Web Storage API). Trade-offs: -* Potential security risks if sensitive information is stored in client sessions without proper encryption and - validation. -* Dependence on client-side capabilities and settings, such as cookie policies, which can vary across browsers and user - configurations. -* Increased complexity in session management logic, especially in handling session expiration, renewal, and - synchronization across multiple devices or tabs. +* Potential security risks if sensitive information is stored in client sessions without proper encryption and validation. +* Dependence on client-side capabilities and settings, such as cookie policies, which can vary across browsers and user configurations. +* Increased complexity in session management logic, especially in handling session expiration, renewal, and synchronization across multiple devices or tabs. ## Related Patterns -* Server Session: Often used in conjunction with the Client Session pattern to provide a balance between client-side - efficiency and server-side control. -* [Singleton](https://java-design-patterns.com/patterns/singleton/): Ensuring a single instance of a user's session - throughout the application. -* [State](https://java-design-patterns.com/patterns/state/): Managing state transitions in a session, such as - authenticated, guest, or expired states. +* Server Session: Often used in conjunction with the Client Session pattern to provide a balance between client-side efficiency and server-side control. +* [Singleton](https://java-design-patterns.com/patterns/singleton/): Ensuring a single instance of a user's session throughout the application. +* [State](https://java-design-patterns.com/patterns/state/): Managing state transitions in a session, such as authenticated, guest, or expired states. ## Credits diff --git a/collecting-parameter/README.md b/collecting-parameter/README.md index 7b68c99d5590..64bae225a11b 100644 --- a/collecting-parameter/README.md +++ b/collecting-parameter/README.md @@ -14,35 +14,25 @@ tag: ## Intent -Aims to simplify methods that collect information by passing a single collection object through various method calls, -allowing them to add results to this collection rather than each method creating its own collection. +Aims to simplify methods that collect information by passing a single collection object through various method calls, allowing them to add results to this collection rather than each method creating its own collection. ## Explanation ### Real-world example -Within a large corporate building, there exists a global printer queue that is a collection of all the printing jobs -that are currently pending. Various floors contain different models of printers, each having a different printing -policy. We must construct a program that can continually add appropriate printing jobs to a collection, which is called -the *collecting parameter*. +Within a large corporate building, there exists a global printer queue that is a collection of all the printing jobs that are currently pending. Various floors contain different models of printers, each having a different printing policy. We must construct a program that can continually add appropriate printing jobs to a collection, which is called the *collecting parameter*. ### In plain words -Instead of having one giant method that contains numerous policies for collecting information into a variable, we can -create numerous smaller functions that each take parameter, and append new information. We can pass the parameter to all -of these smaller functions and by the end, we will have what we wanted originally. This time, the code is cleaner and -easier to understand. Because the larger function has been broken down, the code is also easier to modify as changes are -localised to the smaller functions. +Instead of having one giant method that contains numerous policies for collecting information into a variable, we can create numerous smaller functions that each take parameter, and append new information. We can pass the parameter to all of these smaller functions and by the end, we will have what we wanted originally. This time, the code is cleaner and easier to understand. Because the larger function has been broken down, the code is also easier to modify as changes are localised to the smaller functions. ### Wikipedia says -In the Collecting Parameter idiom a collection (list, map, etc.) is passed repeatedly as a parameter to a method which -adds items to the collection. +In the Collecting Parameter idiom a collection (list, map, etc.) is passed repeatedly as a parameter to a method which adds items to the collection. ### Programmatic example -Coding our example from above, we may use the collection `result` as a collecting parameter. The following restrictions -are implemented: +Coding our example from above, we may use the collection `result` as a collecting parameter. The following restrictions are implemented: - If an A4 paper is coloured, it must also be single-sided. All other non-coloured papers are accepted - A3 papers must be non-coloured and single-sided @@ -85,8 +75,7 @@ public class App { } ``` -We use the `addA4Paper`, `addA3Paper`, and `addA2Paper` methods to populate the `result` collecting parameter with the -appropriate print jobs as per the policy described previously. The three policies are encoded below, +We use the `addA4Paper`, `addA3Paper`, and `addA2Paper` methods to populate the `result` collecting parameter with the appropriate print jobs as per the policy described previously. The three policies are encoded below, ```java public class App { @@ -162,12 +151,9 @@ public class App { } ``` -Each method takes a collecting parameter as an argument. It then adds elements, taken from a global variable, to this -collecting parameter if each element satisfies a given criteria. These methods can have whatever policy the client -desires. +Each method takes a collecting parameter as an argument. It then adds elements, taken from a global variable, to this collecting parameter if each element satisfies a given criteria. These methods can have whatever policy the client desires. -In this programmatic example, three print jobs are added to the queue. Only the first two print jobs should be added to -the collecting parameter as per the policy. The elements of the `result` variable after execution are, +In this programmatic example, three print jobs are added to the queue. Only the first two print jobs should be added to the collecting parameter as per the policy. The elements of the `result` variable after execution are, | paperSize | pageCount | isDoubleSided | isColour | |-----------|-----------|---------------|----------| @@ -185,26 +171,19 @@ which is what we expected. Use the Collecting Parameter design pattern when - When multiple methods produce a collection of results and you want to aggregate these results in a unified manner. -- In scenarios where reducing the number of collections created by methods can improve memory efficiency and - performance. -- When you're refactoring large methods that perform multiple tasks, including the collection of results from various - operations. +- In scenarios where reducing the number of collections created by methods can improve memory efficiency and performance. +- When you're refactoring large methods that perform multiple tasks, including the collection of results from various operations. ## Tutorials Tutorials for this method are found in: - [Refactoring To Patterns](http://www.tarrani.net/RefactoringToPatterns.pdf) by Joshua Kerivsky -- [Smalltalk Best Practice Patterns](https://ptgmedia.pearsoncmg.com/images/9780134769042/samplepages/013476904X.pdf) by - Kent Beck +- [Smalltalk Best Practice Patterns](https://ptgmedia.pearsoncmg.com/images/9780134769042/samplepages/013476904X.pdf) by Kent Beck ## Known uses -Joshua Kerivsky gives a real-world example in his book 'Refactoring to Patterns'. He gives an example of using the -Collecting Parameter Design Pattern to create a `toString()` method for an XML tree. Without using this design pattern, -this would require a bulky function with conditionals and concatenation that would worsen code readability. Such a -method can be broken down into smaller methods, each appending their own set of information to the collecting parameter. -See this in [Refactoring To Patterns](http://www.tarrani.net/RefactoringToPatterns.pdf). +Joshua Kerivsky gives a real-world example in his book 'Refactoring to Patterns'. He gives an example of using the Collecting Parameter Design Pattern to create a `toString()` method for an XML tree. Without using this design pattern, this would require a bulky function with conditionals and concatenation that would worsen code readability. Such a method can be broken down into smaller methods, each appending their own set of information to the collecting parameter. See this in [Refactoring To Patterns](http://www.tarrani.net/RefactoringToPatterns.pdf). Other examples include: @@ -223,23 +202,18 @@ Benefits: Trade-offs: - Increases coupling between the caller and the methods being called since they must agree on the collection to use. -- May introduce side effects in methods if not carefully managed, as methods are no longer self-contained in their - result handling. +- May introduce side effects in methods if not carefully managed, as methods are no longer self-contained in their result handling. ## Related patterns -- [Composite](https://java-design-patterns.com/patterns/composite/): Can be used in tandem with Collecting Parameter - when dealing with hierarchical structures, allowing results to be collected across a composite structure. -- [Visitor](https://java-design-patterns.com/patterns/visitor/): Often used together, where Visitor handles traversal - and operations on a structure, and Collecting Parameter accumulates the results. -- [Command](https://java-design-patterns.com/patterns/command/): Commands may utilize Collecting Parameter to aggregate - results from multiple operations executed by the command objects. +- [Composite](https://java-design-patterns.com/patterns/composite/): Can be used in tandem with Collecting Parameter when dealing with hierarchical structures, allowing results to be collected across a composite structure. +- [Visitor](https://java-design-patterns.com/patterns/visitor/): Often used together, where Visitor handles traversal and operations on a structure, and Collecting Parameter accumulates the results. +- [Command](https://java-design-patterns.com/patterns/command/): Commands may utilize Collecting Parameter to aggregate results from multiple operations executed by the command objects. ## Credits - [Refactoring To Patterns](http://www.tarrani.net/RefactoringToPatterns.pdf) by Joshua Kerivsky -- [Smalltalk Best Practice Patterns](https://ptgmedia.pearsoncmg.com/images/9780134769042/samplepages/013476904X.pdf) by - Kent Beck +- [Smalltalk Best Practice Patterns](https://ptgmedia.pearsoncmg.com/images/9780134769042/samplepages/013476904X.pdf) by Kent Beck - [Wiki](https://wiki.c2.com/?CollectingParameter) - [Refactoring: Improving the Design of Existing Code](https://amzn.to/3TVEgaB) - [Clean Code: A Handbook of Agile Software Craftsmanship](https://amzn.to/4aApLP0) diff --git a/collection-pipeline/README.md b/collection-pipeline/README.md index aab323e0ec14..00598c500c9c 100644 --- a/collection-pipeline/README.md +++ b/collection-pipeline/README.md @@ -9,44 +9,31 @@ tag: ## Intent -The Collection Pipeline design pattern is intended to process collections of data by chaining together operations in a -sequence where the output of one operation is the input for the next. It promotes a declarative approach to handling -collections, focusing on what should be done rather than how. +The Collection Pipeline design pattern is intended to process collections of data by chaining together operations in a sequence where the output of one operation is the input for the next. It promotes a declarative approach to handling collections, focusing on what should be done rather than how. ## Explanation Real-world example -> Imagine you're in a large library filled with books, and you're tasked with finding all the science fiction books -> published after 2000, then arranging them by author name in alphabetical order, and finally picking out the top 5 based -> on their popularity or ratings. +> Imagine you're in a large library filled with books, and you're tasked with finding all the science fiction books published after 2000, then arranging them by author name in alphabetical order, and finally picking out the top 5 based on their popularity or ratings. In plain words -> The Collection Pipeline pattern involves processing data by passing it through a series of operations, each -> transforming the data in sequence, much like an assembly line in a factory. +> The Collection Pipeline pattern involves processing data by passing it through a series of operations, each transforming the data in sequence, much like an assembly line in a factory. Wikipedia says -> In software engineering, a pipeline consists of a chain of processing elements (processes, threads, coroutines, -> functions, etc.), arranged so that the output of each element is the input of the next; the name is by analogy to a -> physical pipeline. Usually some amount of buffering is provided between consecutive elements. The information that flows -> in these pipelines is often a stream of records, bytes, or bits, and the elements of a pipeline may be called filters; -> this is also called the pipe(s) and filters design pattern. Connecting elements into a pipeline is analogous to function -> composition. +> In software engineering, a pipeline consists of a chain of processing elements (processes, threads, coroutines, functions, etc.), arranged so that the output of each element is the input of the next; the name is by analogy to a physical pipeline. Usually some amount of buffering is provided between consecutive elements. The information that flows in these pipelines is often a stream of records, bytes, or bits, and the elements of a pipeline may be called filters; this is also called the pipe(s) and filters design pattern. Connecting elements into a pipeline is analogous to function composition. **Programmatic Example** -The Collection Pipeline pattern is implemented in this code example by using Java's Stream API to perform a series of -transformations on a collection of Car objects. The transformations are chained together to form a pipeline. Here's a -breakdown of how it's done: +The Collection Pipeline pattern is implemented in this code example by using Java's Stream API to perform a series of transformations on a collection of Car objects. The transformations are chained together to form a pipeline. Here's a breakdown of how it's done: 1. Creation of Cars: A list of Car objects is created using the `CarFactory.createCars()` method. `var cars = CarFactory.createCars();` -2. Filtering and Transforming: The `FunctionalProgramming.getModelsAfter2000(cars)` method filters the cars to only - include those made after the year 2000, and then transforms the filtered cars into a list of their model names. +2. Filtering and Transforming: The `FunctionalProgramming.getModelsAfter2000(cars)` method filters the cars to only include those made after the year 2000, and then transforms the filtered cars into a list of their model names. `var modelsFunctional = FunctionalProgramming.getModelsAfter2000(cars);` @@ -73,9 +60,7 @@ public static Map>getGroupingOfCarsByCategory(List cars } ``` -4. Filtering, Sorting and Transforming: The `FunctionalProgramming.getSedanCarsOwnedSortedByDate(List.of(john))` method - filters the cars owned by a person to only include sedans, sorts them by date, and then transforms the sorted cars - into a list of Car objects. +4. Filtering, Sorting and Transforming: The `FunctionalProgramming.getSedanCarsOwnedSortedByDate(List.of(john))` method filters the cars owned by a person to only include sedans, sorts them by date, and then transforms the sorted cars into a list of Car objects. `var sedansOwnedFunctional = FunctionalProgramming.getSedanCarsOwnedSortedByDate(List.of(john));` @@ -90,8 +75,7 @@ public static List getSedanCarsOwnedSortedByDate(List persons){ } ``` -In each of these methods, the Collection Pipeline pattern is used to perform a series of operations on the collection of -cars in a declarative manner, which improves readability and maintainability. +In each of these methods, the Collection Pipeline pattern is used to perform a series of operations on the collection of cars in a declarative manner, which improves readability and maintainability. ## Class diagram @@ -99,9 +83,7 @@ cars in a declarative manner, which improves readability and maintainability. ## Applicability -This pattern is applicable in scenarios involving bulk data operations such as filtering, mapping, sorting, or reducing -collections. It's particularly useful in data analysis, transformation tasks, and where a sequence of operations needs -to be applied to each element of a collection. +This pattern is applicable in scenarios involving bulk data operations such as filtering, mapping, sorting, or reducing collections. It's particularly useful in data analysis, transformation tasks, and where a sequence of operations needs to be applied to each element of a collection. ## Known Uses @@ -121,21 +103,15 @@ Benefits: Trade-offs: -* Performance Overhead: Chaining multiple operations can introduce overhead compared to traditional loops, especially - for short pipelines or very large collections. -* Debugging Difficulty: Debugging a chain of operations might be more challenging due to the lack of intermediate - variables. -* Limited to Collections: Primarily focused on collections, and its utility might be limited outside of collection - processing. +* Performance Overhead: Chaining multiple operations can introduce overhead compared to traditional loops, especially for short pipelines or very large collections. +* Debugging Difficulty: Debugging a chain of operations might be more challenging due to the lack of intermediate variables. +* Limited to Collections: Primarily focused on collections, and its utility might be limited outside of collection processing. ## Related Patterns -* [Builder](https://java-design-patterns.com/patterns/builder/): Similar fluent interface style but used for object - construction. -* [Chain of Responsibility](https://java-design-patterns.com/patterns/chain-of-responsibility/): Conceptually similar in - chaining handlers, but applied to object requests rather than data collection processing. -* [Strategy](https://java-design-patterns.com/patterns/strategy/): Can be used within a pipeline stage to encapsulate - different algorithms that can be selected at runtime. +* [Builder](https://java-design-patterns.com/patterns/builder/): Similar fluent interface style but used for object construction. +* [Chain of Responsibility](https://java-design-patterns.com/patterns/chain-of-responsibility/): Conceptually similar in chaining handlers, but applied to object requests rather than data collection processing. +* [Strategy](https://java-design-patterns.com/patterns/strategy/): Can be used within a pipeline stage to encapsulate different algorithms that can be selected at runtime. ## Credits diff --git a/combinator/README.md b/combinator/README.md index 70b6a82f7942..7470fea8b15b 100644 --- a/combinator/README.md +++ b/combinator/README.md @@ -14,16 +14,13 @@ tag: ## Intent -The Combinator pattern is intended to enable complex functionalities by combining simple functions into more complex -ones. It aims to achieve modularization and reusability by breaking down a task into simpler, interchangeable components -that can be composed in various ways. +The Combinator pattern is intended to enable complex functionalities by combining simple functions into more complex ones. It aims to achieve modularization and reusability by breaking down a task into simpler, interchangeable components that can be composed in various ways. ## Explanation Real world example -> In computer science, combinatory logic is used as a simplified model of computation, used in computability theory and -> proof theory. Despite its simplicity, combinatory logic captures many essential features of computation. +> In computer science, combinatory logic is used as a simplified model of computation, used in computability theory and proof theory. Despite its simplicity, combinatory logic captures many essential features of computation. In plain words @@ -31,13 +28,11 @@ In plain words Wikipedia says -> A combinator is a higher-order function that uses only function application and earlier defined combinators to define -> a result from its arguments. +> A combinator is a higher-order function that uses only function application and earlier defined combinators to define a result from its arguments. **Programmatic Example** -Translating the combinator example above. First of all, we have an interface consist of several -methods `contains`, `not`, `or`, `and` . +Translating the combinator example above. First of all, we have an interface consist of several methods `contains`, `not`, `or`, `and` . ```java // Functional interface to find lines in text. @@ -84,8 +79,7 @@ public interface Finder { } ``` -Then we have also another combinator for some complex finders `advancedFinder`, `filteredFinder`, `specializedFinder` -and `expandedFinder`. +Then we have also another combinator for some complex finders `advancedFinder`, `filteredFinder`, `specializedFinder` and `expandedFinder`. ```java // Complex finders consisting of simple finder. @@ -181,9 +175,7 @@ the result of expanded(or)query[[many,Annabel]]is[It was many and many a year ag the result of filtered query is[But we loved with a love that was more than love-] ``` -Now we can design our app to with the queries finding -feature `expandedFinder`, `specializedFinder`, `advancedFinder`, `filteredFinder` which are all derived -from `contains`, `or`, `not`, `and`. +Now we can design our app to with the queries finding feature `expandedFinder`, `specializedFinder`, `advancedFinder`, `filteredFinder` which are all derived from `contains`, `or`, `not`, `and`. ## Class diagram @@ -199,8 +191,7 @@ This pattern is applicable in scenarios where: ## Known Uses -* Functional programming languages like Haskell and Scala extensively use combinators for tasks ranging from parsing to - UI construction. +* Functional programming languages like Haskell and Scala extensively use combinators for tasks ranging from parsing to UI construction. * In domain-specific languages, particularly those involved in parsing, such as parsing expression grammars. * In libraries for functional programming in languages like JavaScript, Python, and Ruby. * java.util.function.Function#compose @@ -222,12 +213,9 @@ Trade-offs: ## Related Patterns -[Strategy](https://java-design-patterns.com/patterns/strategy/): Both involve selecting an algorithm at runtime, but -Combinator uses composition of functions. -[Decorator](https://java-design-patterns.com/patterns/decorator/): Similar to Combinator in enhancing functionality, but -Decorator focuses on object augmentation. -[Chain of Responsibility](https://java-design-patterns.com/patterns/chain-of-responsibility/): Relies on chaining -objects, whereas Combinator chains functions. +* [Strategy](https://java-design-patterns.com/patterns/strategy/): Both involve selecting an algorithm at runtime, but Combinator uses composition of functions. +* [Decorator](https://java-design-patterns.com/patterns/decorator/): Similar to Combinator in enhancing functionality, but Decorator focuses on object augmentation. +* [Chain of Responsibility](https://java-design-patterns.com/patterns/chain-of-responsibility/): Relies on chaining objects, whereas Combinator chains functions. ## Credits diff --git a/command/README.md b/command/README.md index e280fc166d94..9403304f3caa 100644 --- a/command/README.md +++ b/command/README.md @@ -13,16 +13,13 @@ tag: ## Intent -The Command design pattern encapsulates a request as an object, thereby allowing for parameterization of clients with -queues, requests, and operations. It also allows for the support of undoable operations. +The Command design pattern encapsulates a request as an object, thereby allowing for parameterization of clients with queues, requests, and operations. It also allows for the support of undoable operations. ## Explanation Real-world example -> There is a wizard casting spells on a goblin. The spells are executed on the goblin one by one. -> The first spell shrinks the goblin and the second makes him invisible. Then the wizard reverses -> the spells one by one. Each spell here is a command object that can be undone. +> There is a wizard casting spells on a goblin. The spells are executed on the goblin one by one. The first spell shrinks the goblin and the second makes him invisible. Then the wizard reverses the spells one by one. Each spell here is a command object that can be undone. In plain words @@ -30,9 +27,7 @@ In plain words Wikipedia says -> In object-oriented programming, the command pattern is a behavioral design pattern in which an -> object is used to encapsulate all information needed to perform an action or trigger an event at -> a later time. +> In object-oriented programming, the command pattern is a behavioral design pattern in which an object is used to encapsulate all information needed to perform an action or trigger an event at a later time. **Programmatic Example** @@ -201,27 +196,11 @@ Goblin,[size=normal][visibility=visible] Use the Command pattern when you want to: -* Parameterize objects by an action to perform. You can express such parameterization in a - procedural language with a callback function, that is, a function that's registered somewhere to be - called at a later point. Commands are an object-oriented replacement for callbacks. -* Specify, queue, and execute requests at different times. A Command object can have a life - independent of the original request. If the receiver of a request can be represented in an address - space-independent way, then you can transfer a command object for the request to a different process - and fulfill the request there. -* Support undo. The Command's execute operation can store state for reversing its effects in the - command itself. The Command interface must have an added un-execute operation that reverses the - effects of a previous call to execute. The executed commands are stored in a history list. - Unlimited-level undo and redo functionality is achieved by traversing this list backward and forward - calling un-execute and execute, respectively. -* Support logging changes so that they can be reapplied in case of a system crash. By augmenting the - Command interface with load and store operations, you can keep a persistent log of changes. - Recovering from a crash involves reloading logged commands from the disk and re-executing them with - the execute operation. -* Structure a system around high-level operations build on primitive operations. Such a structure is - common in information systems that support transactions. A transaction encapsulates a set of data - changes. The Command pattern offers a way to model transactions. Commands have a common interface, - letting you invoke all transactions the same way. The pattern also makes it easy to extend the - system with new transactions. +* Parameterize objects by an action to perform. You can express such parameterization in a procedural language with a callback function, that is, a function that's registered somewhere to be called at a later point. Commands are an object-oriented replacement for callbacks. +* Specify, queue, and execute requests at different times. A Command object can have a life independent of the original request. If the receiver of a request can be represented in an address space-independent way, then you can transfer a command object for the request to a different process and fulfill the request there. +* Support undo. The Command's execute operation can store state for reversing its effects in the command itself. The Command interface must have an added un-execute operation that reverses the effects of a previous call to execute. The executed commands are stored in a history list. Unlimited-level undo and redo functionality is achieved by traversing this list backward and forward calling un-execute and execute, respectively. +* Support logging changes so that they can be reapplied in case of a system crash. By augmenting the Command interface with load and store operations, you can keep a persistent log of changes. Recovering from a crash involves reloading logged commands from the disk and re-executing them with the execute operation. +* Structure a system around high-level operations build on primitive operations. Such a structure is common in information systems that support transactions. A transaction encapsulates a set of data changes. The Command pattern offers a way to model transactions. Commands have a common interface, letting you invoke all transactions the same way. The pattern also makes it easy to extend the system with new transactions. * Keep a history of requests. * Implement callback functionality. * Implement the undo functionality. @@ -251,12 +230,9 @@ Trade-offs: ## Related Patterns -* [Composite](https://java-design-patterns.com/patterns/composite/): Commands can be composed using the Composite - pattern - to create macro commands. +* [Composite](https://java-design-patterns.com/patterns/composite/): Commands can be composed using the Composite pattern to create macro commands. * [Memento](https://java-design-patterns.com/patterns/memento/): Can be used for implementing undo mechanisms. -* [Observer](https://java-design-patterns.com/patterns/observer/): The pattern can be observed for changes that trigger - commands. +* [Observer](https://java-design-patterns.com/patterns/observer/): The pattern can be observed for changes that trigger commands. ## Credits diff --git a/commander/README.md b/commander/README.md index f6cacd243f76..31342c8763ee 100644 --- a/commander/README.md +++ b/commander/README.md @@ -15,52 +15,29 @@ tag: ## Intent -The intent of the Commander pattern in the context of distributed transactions is to manage and coordinate complex -transactions across multiple distributed components or services, ensuring consistency and integrity of the overall -transaction. It encapsulates transaction commands and coordination logic, facilitating the implementation of distributed -transaction protocols like two-phase commit or Saga. +The intent of the Commander pattern in the context of distributed transactions is to manage and coordinate complex transactions across multiple distributed components or services, ensuring consistency and integrity of the overall transaction. It encapsulates transaction commands and coordination logic, facilitating the implementation of distributed transaction protocols like two-phase commit or Saga. ## Explanation Real-world example -> Imagine organizing a large international music festival where various bands from around the world are scheduled to -> perform. Each band's arrival, soundcheck, and performance are like individual transactions in a distributed system. The -> festival organizer acts as the "Commander," coordinating these transactions to ensure that if a band's flight is -> delayed (akin to a transaction failure), there's a backup plan, such as rescheduling or swapping time slots with another -> band (compensating actions), to keep the overall schedule intact. This setup mirrors the Commander pattern in -> distributed transactions, where various components must be coordinated to achieve a successful outcome despite -> individual failures. +> Imagine organizing a large international music festival where various bands from around the world are scheduled to perform. Each band's arrival, soundcheck, and performance are like individual transactions in a distributed system. The festival organizer acts as the "Commander," coordinating these transactions to ensure that if a band's flight is delayed (akin to a transaction failure), there's a backup plan, such as rescheduling or swapping time slots with another band (compensating actions), to keep the overall schedule intact. This setup mirrors the Commander pattern in distributed transactions, where various components must be coordinated to achieve a successful outcome despite individual failures. In plain words -> The Commander pattern turns a request into a stand-alone object, allowing for the parameterization of commands, -> queueing of actions, and the implementation of undo operations. +> The Commander pattern turns a request into a stand-alone object, allowing for the parameterization of commands, queueing of actions, and the implementation of undo operations. **Programmatic Example** -Managing transactions across different services in a distributed system, such as an e-commerce platform with separate -Payment and Shipping microservices, requires careful coordination to avoid issues. When a user places an order but one -service (e.g., Payment) is unavailable while the other (e.g., Shipping) is ready, we need a robust solution to handle -this discrepancy. +Managing transactions across different services in a distributed system, such as an e-commerce platform with separate Payment and Shipping microservices, requires careful coordination to avoid issues. When a user places an order but one service (e.g., Payment) is unavailable while the other (e.g., Shipping) is ready, we need a robust solution to handle this discrepancy. -A strategy to address this involves using a Commander component that orchestrates the process. Initially, the order is -processed by the available service (Shipping in this case). The commander then attempts to synchronize the order with -the currently unavailable service (Payment) by storing the order details in a database or queueing it for future -processing. This queueing system must also account for possible failures in adding requests to the queue. +A strategy to address this involves using a Commander component that orchestrates the process. Initially, the order is processed by the available service (Shipping in this case). The commander then attempts to synchronize the order with the currently unavailable service (Payment) by storing the order details in a database or queueing it for future processing. This queueing system must also account for possible failures in adding requests to the queue. -The commander repeatedly tries to process the queued orders to ensure both services eventually reflect the same -transaction data. This process involves ensuring idempotence, meaning that even if the same order synchronization -request is made multiple times, it will only be executed once, preventing duplicate transactions. The goal is to achieve -eventual consistency across services, where all systems are synchronized over time despite initial failures or delays. +The commander repeatedly tries to process the queued orders to ensure both services eventually reflect the same transaction data. This process involves ensuring idempotence, meaning that even if the same order synchronization request is made multiple times, it will only be executed once, preventing duplicate transactions. The goal is to achieve eventual consistency across services, where all systems are synchronized over time despite initial failures or delays. -In the provided code, the Commander pattern is used to handle distributed transactions across multiple services ( -PaymentService, ShippingService, MessagingService, EmployeeHandle). Each service has its own database and can throw -exceptions to simulate failures. +In the provided code, the Commander pattern is used to handle distributed transactions across multiple services (PaymentService, ShippingService, MessagingService, EmployeeHandle). Each service has its own database and can throw exceptions to simulate failures. -The Commander class is the central part of this pattern. It takes instances of all services and their databases, along -with some configuration parameters. The placeOrder method in the Commander class is used to place an order, which -involves interacting with all the services. +The Commander class is the central part of this pattern. It takes instances of all services and their databases, along with some configuration parameters. The placeOrder method in the Commander class is used to place an order, which involves interacting with all the services. ```java public class Commander { @@ -84,9 +61,7 @@ public class Order { } ``` -Each service (e.g., PaymentService, ShippingService, MessagingService, EmployeeHandle) has its own database and can -throw exceptions to simulate failures. For example, the PaymentService might throw a DatabaseUnavailableException if its -database is unavailable. +Each service (e.g., PaymentService, ShippingService, MessagingService, EmployeeHandle) has its own database and can throw exceptions to simulate failures. For example, the PaymentService might throw a DatabaseUnavailableException if its database is unavailable. ```java public class PaymentService { @@ -94,8 +69,7 @@ public class PaymentService { } ``` -The DatabaseUnavailableException, ItemUnavailableException, and ShippingNotPossibleException classes represent different -types of exceptions that can occur. +The DatabaseUnavailableException, ItemUnavailableException, and ShippingNotPossibleException classes represent different types of exceptions that can occur. ```java public class DatabaseUnavailableException extends Exception { @@ -111,8 +85,7 @@ public class ShippingNotPossibleException extends Exception { } ``` -In the main method of each class (AppQueueFailCases, AppShippingFailCases), different scenarios are simulated by -creating instances of the Commander class with different configurations and calling the placeOrder method. +In the main method of each class (AppQueueFailCases, AppShippingFailCases), different scenarios are simulated by creating instances of the Commander class with different configurations and calling the placeOrder method. ## Class diagram @@ -129,18 +102,15 @@ Use the Commander pattern for distributed transactions when: ## Known Uses * Two-Phase Commit (2PC) Protocols: Coordinating commit or rollback across distributed databases or services. -* Saga Pattern Implementations: Managing long-lived business processes that span multiple microservices, with each step - having a compensating action for rollback. -* Distributed Transactions in Microservices Architecture: Coordinating complex operations across microservices while - maintaining data integrity and consistency. +* Saga Pattern Implementations: Managing long-lived business processes that span multiple microservices, with each step having a compensating action for rollback. +* Distributed Transactions in Microservices Architecture: Coordinating complex operations across microservices while maintaining data integrity and consistency. ## Consequences Benefits: * Provides a clear mechanism for managing complex distributed transactions, enhancing system reliability. -* Enables the implementation of compensating transactions, which are crucial for maintaining consistency in long-lived - transactions. +* Enables the implementation of compensating transactions, which are crucial for maintaining consistency in long-lived transactions. * Facilitates the integration of heterogeneous systems within a transactional context. Trade-offs: @@ -151,8 +121,7 @@ Trade-offs: ## Related Patterns -[Saga Pattern](https://java-design-patterns.com/patterns/saga/): Often discussed in tandem with the Commander pattern -for distributed transactions, focusing on long-lived transactions with compensating actions. +[Saga Pattern](https://java-design-patterns.com/patterns/saga/): Often discussed in tandem with the Commander pattern for distributed transactions, focusing on long-lived transactions with compensating actions. ## Credits diff --git a/component/README.md b/component/README.md index e2c2f6d71ca5..83a629ef8142 100644 --- a/component/README.md +++ b/component/README.md @@ -16,37 +16,25 @@ tag: ## Intent -The Component design pattern aims to organize code into reusable, interchangeable components, promoting flexibility and -ease of maintenance in game development by allowing entities to be configured with varying behaviors. +The Component design pattern aims to organize code into reusable, interchangeable components, promoting flexibility and ease of maintenance in game development by allowing entities to be configured with varying behaviors. ![Intent](./etc/component.duplication.png "Component Design Pattern") ## Explanation Real world example -> Suppose your video game consists of a graphics component and a sound component. Including the methods and attributes -> of both of these features in a single java class can be problematic due to many reasons. Firstly, the graphics and sound -> code can create an extremely long java class which can be hard to maintain. Furthermore, graphics components may be -> written and implemented by a separate team as to the sound contents. If both parties work simultaneously on the same -> java class, this may cause conflicts and major delay. Using the component design pattern, the development team is able -> to create individual component classes for graphics and sound whilst providing the domain/object the reach to both of -> these attributes. +> Suppose your video game consists of a graphics component and a sound component. Including the methods and attributes of both of these features in a single java class can be problematic due to many reasons. Firstly, the graphics and sound code can create an extremely long java class which can be hard to maintain. Furthermore, graphics components may be written and implemented by a separate team as to the sound contents. If both parties work simultaneously on the same java class, this may cause conflicts and major delay. Using the component design pattern, the development team is able to create individual component classes for graphics and sound whilst providing the domain/object the reach to both of these attributes. In plain words -> The component design pattern provides a single attribute to be accessible by numerous objects without requiring the -> existence of a relationship between the objects themselves. +> The component design pattern provides a single attribute to be accessible by numerous objects without requiring the existence of a relationship between the objects themselves. Key drawback -> With the implementation of the component design pattern, it can be very difficult to create a relationship -> between components. For example, suppose we require the sound component to be aware of the current animation in order -> create a certain sound based upon the animation; this can be quite tricky as the component design pattern makes -> components 'unaware' of other components' existence due to its decoupling nature. +> With the implementation of the component design pattern, it can be very difficult to create a relationship between components. For example, suppose we require the sound component to be aware of the current animation in order create a certain sound based upon the animation; this can be quite tricky as the component design pattern makes components 'unaware' of other components' existence due to its decoupling nature. **Programmatic Example** -The App class creates a demonstration of the use of the component pattern by creating two different objects which -inherit a small collection of individual components that are modifiable. +The App class creates a demonstration of the use of the component pattern by creating two different objects which inherit a small collection of individual components that are modifiable. ```java public final class App { @@ -68,9 +56,7 @@ public final class App { } ``` -Much of the program exists within the GameObject class, within this class, the player and NPC object create methods are -set up. Additionally, this class also consists of the method calls used to update/alter information of the object's -components. +Much of the program exists within the GameObject class, within this class, the player and NPC object create methods are set up. Additionally, this class also consists of the method calls used to update/alter information of the object's components. ```java public class GameObject { @@ -119,9 +105,7 @@ public class GameObject { } ``` -Upon opening the component package, the collection of components are revealed. These components provide the interface -for objects to inherit these domains. The PlayerInputComponent class shown below updates the object's velocity -characteristic based on user's key event input. +Upon opening the component package, the collection of components are revealed. These components provide the interface for objects to inherit these domains. The PlayerInputComponent class shown below updates the object's velocity characteristic based on user's key event input. ```java public class PlayerInputComponent implements InputComponent { @@ -159,10 +143,8 @@ public class PlayerInputComponent implements InputComponent { ## Applicability -* Used in game development and simulations where game entities (e.g., characters, items) can have a dynamic set of - abilities or states. -* Suitable for systems requiring high modularity and systems where entities might need to change behavior at runtime - without inheritance hierarchies. +* Used in game development and simulations where game entities (e.g., characters, items) can have a dynamic set of abilities or states. +* Suitable for systems requiring high modularity and systems where entities might need to change behavior at runtime without inheritance hierarchies. ## Known Uses @@ -173,28 +155,20 @@ public class PlayerInputComponent implements InputComponent { Benefits: -* Flexibility and Reusability: Components can be reused across different entities, making it easier to add new features - or modify existing ones. -* Decoupling: Reduces dependencies between game entity states and behaviors, facilitating easier changes and - maintenance. -* Dynamic Composition: Entities can alter their behavior at runtime by adding or removing components, providing - significant flexibility in game design. +* Flexibility and Reusability: Components can be reused across different entities, making it easier to add new features or modify existing ones. +* Decoupling: Reduces dependencies between game entity states and behaviors, facilitating easier changes and maintenance. +* Dynamic Composition: Entities can alter their behavior at runtime by adding or removing components, providing significant flexibility in game design. Trade-offs: -* Complexity: Can introduce additional complexity in system architecture, particularly in managing dependencies and - communications between components. -* Performance Considerations: Depending on implementation, may incur a performance overhead due to indirection and - dynamic behavior, especially critical in high-performance game loops. +* Complexity: Can introduce additional complexity in system architecture, particularly in managing dependencies and communications between components. +* Performance Considerations: Depending on implementation, may incur a performance overhead due to indirection and dynamic behavior, especially critical in high-performance game loops. ## Related Patterns -* [Decorator](https://java-design-patterns.com/patterns/decorator/): Similar concept of adding responsibilities - dynamically, but without the focus on game entities. -* [Flyweight](https://java-design-patterns.com/patterns/flyweight/): Can be used in conjunction with the Component - pattern to share component instances among many entities to save memory. -* [Observer](https://java-design-patterns.com/patterns/observer/): Often used in Component systems to communicate state - changes between components. +* [Decorator](https://java-design-patterns.com/patterns/decorator/): Similar concept of adding responsibilities dynamically, but without the focus on game entities. +* [Flyweight](https://java-design-patterns.com/patterns/flyweight/): Can be used in conjunction with the Component pattern to share component instances among many entities to save memory. +* [Observer](https://java-design-patterns.com/patterns/observer/): Often used in Component systems to communicate state changes between components. ## Credits diff --git a/composite-entity/README.md b/composite-entity/README.md index 5ff69c5d2fc3..a029f5905c94 100644 --- a/composite-entity/README.md +++ b/composite-entity/README.md @@ -14,16 +14,13 @@ tag: ## Intent -The Composite Entity design pattern is aimed at managing a set of interrelated persistent objects as if they were a -single entity. It is commonly used in the context of Enterprise JavaBeans (EJB) and similar enterprise frameworks to -represent graph-based data structures within business models, enabling clients to treat them as a single unit. +The Composite Entity design pattern is aimed at managing a set of interrelated persistent objects as if they were a single entity. It is commonly used in the context of Enterprise JavaBeans (EJB) and similar enterprise frameworks to represent graph-based data structures within business models, enabling clients to treat them as a single unit. ## Explanation Real world example -> For a console, there may be many interfaces that need to be managed and controlled. Using the composite entity -> pattern, dependent objects such as messages and signals can be combined and controlled using a single object. +> For a console, there may be many interfaces that need to be managed and controlled. Using the composite entity pattern, dependent objects such as messages and signals can be combined and controlled using a single object. In plain words @@ -31,8 +28,7 @@ In plain words **Programmatic Example** -We need a generic solution for the problem. To achieve this, let's introduce a generic -Composite Entity Pattern. +We need a generic solution for the problem. To achieve this, let's introduce a generic Composite Entity Pattern. ```java public abstract class DependentObject { @@ -122,8 +118,7 @@ var console=new CompositeEntity(); ## Applicability * Useful in enterprise applications where business objects are complex and involve various interdependent objects. -* Ideal for scenarios where clients need to work with a unified interface to a set of objects rather than individual - entities. +* Ideal for scenarios where clients need to work with a unified interface to a set of objects rather than individual entities. * Applicable in systems that require a simplified view of a complex data model for external clients or services. ## Known Uses @@ -137,8 +132,7 @@ var console=new CompositeEntity(); Benefits: * Simplifies client interactions with complex entity models by providing a unified interface. -* Enhances reusability and maintainability of the business layer by decoupling client code from the complex internals of - business entities. +* Enhances reusability and maintainability of the business layer by decoupling client code from the complex internals of business entities. * Facilitates easier transaction management and consistency enforcement across a set of related objects. Trade-offs: @@ -149,12 +143,9 @@ Trade-offs: ## Related Patterns -* [Decorator](https://java-design-patterns.com/patterns/decorator/): For dynamically adding behavior to individual - objects within the composite entity without affecting the structure. -* [Facade](https://java-design-patterns.com/patterns/facade/): Provides a simplified interface to a complex subsystem, - similar to how a composite entity simplifies access to a set of objects. -* [Flyweight](https://java-design-patterns.com/patterns/flyweight/): Useful for managing shared objects within a - composite entity to reduce memory footprint. +* [Decorator](https://java-design-patterns.com/patterns/decorator/): For dynamically adding behavior to individual objects within the composite entity without affecting the structure. +* [Facade](https://java-design-patterns.com/patterns/facade/): Provides a simplified interface to a complex subsystem, similar to how a composite entity simplifies access to a set of objects. +* [Flyweight](https://java-design-patterns.com/patterns/flyweight/): Useful for managing shared objects within a composite entity to reduce memory footprint. ## Credits diff --git a/composite-view/README.md b/composite-view/README.md index 18a4631ed44d..aeec3211052e 100644 --- a/composite-view/README.md +++ b/composite-view/README.md @@ -9,39 +9,27 @@ tag: ## Intent -The primary goal of the Composite View design pattern is to compose objects into tree structures to represent part-whole -hierarchies. This allows clients to treat individual objects and compositions of objects uniformly, simplifying the -management of complex structures. +The primary goal of the Composite View design pattern is to compose objects into tree structures to represent part-whole hierarchies. This allows clients to treat individual objects and compositions of objects uniformly, simplifying the management of complex structures. ## Explanation Real World Example -> A news site wants to display the current date and news to different users -> based on that user's preferences. The news site will substitute in different news feed -> components depending on the user's interest, defaulting to local news. +> A news site wants to display the current date and news to different users based on that user's preferences. The news site will substitute in different news feed components depending on the user's interest, defaulting to local news. In Plain Words -> Composite View Pattern is having a main view being composed of smaller subviews. -> The layout of this composite view is based on a template. A View-manager then decides which -> subviews to include in this template. +> Composite View Pattern is having a main view being composed of smaller subviews. The layout of this composite view is based on a template. A View-manager then decides which subviews to include in this template. Wikipedia Says -> Composite views that are composed of multiple atomic subviews. Each component of -> the template may be included dynamically into the whole and the layout of the page may be managed independently of the -> content. -> This solution provides for the creation of a composite view based on the inclusion and substitution of -> modular dynamic and static template fragments. -> It promotes the reuse of atomic portions of the view by encouraging modular design. +> Composite views that are composed of multiple atomic subviews. Each component of the template may be included dynamically into the whole and the layout of the page may be managed independently of the content. This solution provides for the creation of a composite view based on the inclusion and substitution of modular dynamic and static template fragments. It promotes the reuse of atomic portions of the view by encouraging modular design. **Programmatic Example** -Since this is a web development pattern, a server is required to demonstrate it. -This example uses Tomcat 10.0.13 to run the servlet, and this programmatic example will only work with Tomcat 10+. +Since this is a web development pattern, a server is required to demonstrate it. This example uses Tomcat 10.0.13 to run the servlet, and this programmatic example will only work with Tomcat 10+. -Firstly there is `AppServlet` which is an `HttpServlet` that runs on Tomcat 10+. +Firstly, there is `AppServlet` which is an `HttpServlet` that runs on Tomcat 10+. ```java public class AppServlet extends HttpServlet { @@ -95,8 +83,7 @@ public class AppServlet extends HttpServlet { ``` -This servlet is not part of the pattern, and simply forwards GET requests to the correct JSP. -PUT, POST, and DELETE requests are not supported and will simply show an error message. +This servlet is not part of the pattern, and simply forwards GET requests to the correct JSP. PUT, POST, and DELETE requests are not supported and will simply show an error message. The view management in this example is done via a javabean class: `ClientPropertiesBean`, which stores user preferences. @@ -141,8 +128,8 @@ public class ClientPropertiesBean implements Serializable { ``` This javabean has a default constructor, and another that takes an `HttpServletRequest`. -This second constructor takes the request object, parses out the request parameters which contain the -user preferences for different types of news. + +This second constructor takes the request object, parses out the request parameters which contain the user preferences for different types of news. The template for the news page is in `newsDisplay.jsp` @@ -223,14 +210,11 @@ The template for the news page is in `newsDisplay.jsp` ``` -This JSP page is the template. It declares a table with three rows, with one component in the first row, -two components in the second row, and one component in the third row. +This JSP page is the template. It declares a table with three rows, with one component in the first row, two components in the second row, and one component in the third row. -The scriplets in the file are part of the -view management strategy that include different atomic subviews based on the user preferences in the Javabean. +The scriplets in the file are part of the view management strategy that include different atomic subviews based on the user preferences in the Javabean. -Here are two examples of the mock atomic subviews used in the composite: -`businessNews.jsp` +Here are two examples of the mock atomic subviews used in the composite: `businessNews.jsp` ```html @@ -303,37 +287,26 @@ Here are two examples of the mock atomic subviews used in the composite: The results are as such: -1) The user has put their name as `Tammy` in the request parameters and no preferences: - ![alt text](./etc/images/noparam.png) -2) The user has put their name as `Johnny` in the request parameters and has a preference for world, business, and - science news: - ![alt text](./etc/images/threeparams.png) +1) The user has put their name as `Tammy` in the request parameters and no preferences: ![alt text](./etc/images/noparam.png) +2) The user has put their name as `Johnny` in the request parameters and has a preference for world, business, and science news: ![alt text](./etc/images/threeparams.png) -The different subviews such as `worldNews.jsp`, `businessNews.jsp`, etc. are included conditionally -based on the request parameters. +The different subviews such as `worldNews.jsp`, `businessNews.jsp`, etc. are included conditionally based on the request parameters. **How To Use** -To try this example, make sure you have Tomcat 10+ installed. -Set up your IDE to build a WAR file from the module and deploy that file to the server +To try this example, make sure you have Tomcat 10+ installed. Set up your IDE to build a WAR file from the module and deploy that file to the server IntelliJ: -Under `Run` and `edit configurations` Make sure Tomcat server is one of the run configurations. -Go to the deployment tab, and make sure there is one artifact being built called `composite-view:war exploded`. -If not present, add one. +Under `Run` and `edit configurations` Make sure Tomcat server is one of the run configurations. Go to the deployment tab, and make sure there is one artifact being built called `composite-view:war exploded`. If not present, add one. -Ensure that the artifact is being built from the content of the `web` directory and the compilation results of the -module. -Point the output of the artifact to a convenient place. Run the configuration and view the landing page, -follow instructions on that page to continue. +Ensure that the artifact is being built from the content of the `web` directory and the compilation results of the module. Point the output of the artifact to a convenient place. Run the configuration and view the landing page, follow instructions on that page to continue. ## Class diagram ![alt text](./etc/composite_view.png) -The class diagram here displays the Javabean which is the view manager. -The views are JSP's held inside the web directory. +The class diagram here displays the Javabean which is the view manager. The views are JSP's held inside the web directory. ## Applicability: @@ -341,40 +314,30 @@ Use the Composite View design pattern when: * You want to represent part-whole hierarchies of objects. * You expect that the composite structures might include any new components in the future. -* You want clients to be able to ignore the difference between compositions of objects and individual objects. Clients - will treat all objects in the composite structure uniformly. +* You want clients to be able to ignore the difference between compositions of objects and individual objects. Clients will treat all objects in the composite structure uniformly. ## Known Uses -* Graphical User Interfaces (GUIs) where widgets can contain other widgets (e.g., a window containing panels, buttons, - and text fields). -* Document structures, such as the representation of tables containing rows, which in turn contain cells, all of which - can be treated as elements in a unified hierarchy. +* Graphical User Interfaces (GUIs) where widgets can contain other widgets (e.g., a window containing panels, buttons, and text fields). +* Document structures, such as the representation of tables containing rows, which in turn contain cells, all of which can be treated as elements in a unified hierarchy. ## Consequences Benefits: -* High flexibility in adding new components: Since composites and leaf nodes are treated uniformly, it's easier to add - new kinds of components. -* Simplified client code: Clients can treat composite structures and individual elements uniformly, reducing the - complexity in client code. +* High flexibility in adding new components: Since composites and leaf nodes are treated uniformly, it's easier to add new kinds of components. +* Simplified client code: Clients can treat composite structures and individual elements uniformly, reducing the complexity in client code. Trade-offs: -* Overgeneralization: Designing the system might become more complex if you make everything composite, especially if - your application doesn't require it. -* Difficulty in constraint enforcement: It can be harder to restrict the components of a composite to only certain - types. +* Overgeneralization: Designing the system might become more complex if you make everything composite, especially if your application doesn't require it. +* Difficulty in constraint enforcement: It can be harder to restrict the components of a composite to only certain types. ## Related Patterns -* [Decorator](https://java-design-patterns.com/patterns/decorator/): While Decorator is used to add responsibilities to - objects, Composite is meant for building structures of objects. -* [Flyweight](https://java-design-patterns.com/patterns/flyweight/): Composite can often be combined with Flyweight to - implement shared leaf nodes in a composite structure, reducing the memory footprint. -* [Chain of Responsibility](https://java-design-patterns.com/patterns/chain-of-responsibility/): Can be used with - Composite to let components pass requests through the hierarchy. +* [Decorator](https://java-design-patterns.com/patterns/decorator/): While Decorator is used to add responsibilities to objects, Composite is meant for building structures of objects. +* [Flyweight](https://java-design-patterns.com/patterns/flyweight/): Composite can often be combined with Flyweight to implement shared leaf nodes in a composite structure, reducing the memory footprint. +* [Chain of Responsibility](https://java-design-patterns.com/patterns/chain-of-responsibility/): Can be used with Composite to let components pass requests through the hierarchy. * [Composite](https://java-design-patterns.com/patterns/composite/) * [View Helper](https://www.oracle.com/java/technologies/viewhelper.html) diff --git a/composite/README.md b/composite/README.md index f9d72ef9b613..1a267cefb1e6 100644 --- a/composite/README.md +++ b/composite/README.md @@ -15,16 +15,13 @@ tag: ## Intent -Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients -treat individual objects and compositions of objects uniformly. +Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly. ## Explanation Real-world example -> Every sentence is composed of words which are in turn composed of characters. Each of these -> objects are printable and they can have something printed before or after them like sentence -> always ends with full stop and word always has space before it. +> Every sentence is composed of words which are in turn composed of characters. Each of these objects are printable and they can have something printed before or after them like sentence always ends with full stop and word always has space before it. In plain words @@ -32,16 +29,11 @@ In plain words Wikipedia says -> In software engineering, the composite pattern is a partitioning design pattern. The composite -> pattern describes that a group of objects is to be treated in the same way as a single instance of -> an object. The intent of a composite is to "compose" objects into tree structures to represent -> part-whole hierarchies. Implementing the composite pattern lets clients treat individual objects -> and compositions uniformly. +> In software engineering, the composite pattern is a partitioning design pattern. The composite pattern describes that a group of objects is to be treated in the same way as a single instance of an object. The intent of a composite is to "compose" objects into tree structures to represent part-whole hierarchies. Implementing the composite pattern lets clients treat individual objects and compositions uniformly. **Programmatic Example** -Taking our sentence example from above. Here we have the base class `LetterComposite` and the -different printable types `Letter`, `Word` and `Sentence`. +Taking our sentence example from above. Here we have the base class `LetterComposite` and the different printable types `Letter`, `Word` and `Sentence`. ```java public abstract class LetterComposite { @@ -185,20 +177,15 @@ Message from the elves: Use the Composite pattern when * You want to represent part-whole hierarchies of objects. -* You want clients to be able to ignore the difference between compositions of objects and - individual objects. Clients will treat all objects in the composite structure uniformly. +* You want clients to be able to ignore the difference between compositions of objects and individual objects. Clients will treat all objects in the composite structure uniformly. ## Known uses -* Graphical user interfaces where components can contain other components (e.g., panels containing buttons, labels, - other panels). +* Graphical user interfaces where components can contain other components (e.g., panels containing buttons, labels, other panels). * File system representations where directories can contain files and other directories. * Organizational structures where a department can contain sub-departments and employees. -* [java.awt.Container](http://docs.oracle.com/javase/8/docs/api/java/awt/Container.html) - and [java.awt.Component](http://docs.oracle.com/javase/8/docs/api/java/awt/Component.html) -* [Apache Wicket](https://github.com/apache/wicket) component tree, - see [Component](https://github.com/apache/wicket/blob/91e154702ab1ff3481ef6cbb04c6044814b7e130/wicket-core/src/main/java/org/apache/wicket/Component.java) - and [MarkupContainer](https://github.com/apache/wicket/blob/b60ec64d0b50a611a9549809c9ab216f0ffa3ae3/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java) +* [java.awt.Container](http://docs.oracle.com/javase/8/docs/api/java/awt/Container.html) and [java.awt.Component](http://docs.oracle.com/javase/8/docs/api/java/awt/Component.html) +* [Apache Wicket](https://github.com/apache/wicket) component tree, see [Component](https://github.com/apache/wicket/blob/91e154702ab1ff3481ef6cbb04c6044814b7e130/wicket-core/src/main/java/org/apache/wicket/Component.java) and [MarkupContainer](https://github.com/apache/wicket/blob/b60ec64d0b50a611a9549809c9ab216f0ffa3ae3/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java) ## Consequences @@ -214,8 +201,7 @@ Trade-offs: ## Related Patterns -* [Flyweight](https://java-design-patterns.com/patterns/flyweight/): Composite can use Flyweight to share component - instances among several composites. +* [Flyweight](https://java-design-patterns.com/patterns/flyweight/): Composite can use Flyweight to share component instances among several composites. * [Iterator](https://java-design-patterns.com/patterns/iterator/): Can be used to traverse Composite structures. * [Visitor](https://java-design-patterns.com/patterns/visitor/): Can apply an operation over a Composite structure. From a155ee243340d4f2973f3664d24ba7fb076d61b1 Mon Sep 17 00:00:00 2001 From: Jun Kang Date: Mon, 1 Apr 2024 23:50:28 +0900 Subject: [PATCH 035/580] deps: Aggregatormicroservice patterns spring version up (#2883) * Updated the imports in code of the single table inheritance pattern for Spring Boot 3.x #2825 Change javax library to jakarta * add pom.xml * Updated the imports in code of the healthcheck pattern for SpringBoot 3.x Change javax library to jakarta and update maven dependency versions * change order of imports to pass Checkstyle violations * change import order to pass lexicographical order test * change import order to pass CustomImportOrder warning * Updated the maven imports of layers pattern for SpringBoot 3.2.4 * remove unused maven import * Updated the maven imports of api-gateway pattern for SpringBoot 3.2.4 #2822 * Updated the maven imports of Aggregator Microservices pattern for SpringBoot 3.2.4 #2821 --- .../iluwatar/aggregator/microservices/Aggregator.java | 2 +- aggregator-microservices/pom.xml | 11 +++++++++++ .../java/com/iluwatar/api/gateway/ApiGateway.java | 2 +- api-gateway/pom.xml | 11 +++++++++++ 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/aggregator-microservices/aggregator-service/src/main/java/com/iluwatar/aggregator/microservices/Aggregator.java b/aggregator-microservices/aggregator-service/src/main/java/com/iluwatar/aggregator/microservices/Aggregator.java index 6931b9a3b299..2e429bf08473 100644 --- a/aggregator-microservices/aggregator-service/src/main/java/com/iluwatar/aggregator/microservices/Aggregator.java +++ b/aggregator-microservices/aggregator-service/src/main/java/com/iluwatar/aggregator/microservices/Aggregator.java @@ -26,7 +26,7 @@ import static java.util.Objects.requireNonNullElse; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; diff --git a/aggregator-microservices/pom.xml b/aggregator-microservices/pom.xml index c5b4db33cada..e083c8911a37 100644 --- a/aggregator-microservices/pom.xml +++ b/aggregator-microservices/pom.xml @@ -34,6 +34,17 @@ 4.0.0 aggregator-microservices pom + + + + org.springframework.boot + spring-boot-dependencies + pom + 3.2.4 + import + + + information-microservice aggregator-service diff --git a/api-gateway/api-gateway-service/src/main/java/com/iluwatar/api/gateway/ApiGateway.java b/api-gateway/api-gateway-service/src/main/java/com/iluwatar/api/gateway/ApiGateway.java index 59fbe7ddd4fe..b7ab7b404963 100644 --- a/api-gateway/api-gateway-service/src/main/java/com/iluwatar/api/gateway/ApiGateway.java +++ b/api-gateway/api-gateway-service/src/main/java/com/iluwatar/api/gateway/ApiGateway.java @@ -24,7 +24,7 @@ */ package com.iluwatar.api.gateway; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; diff --git a/api-gateway/pom.xml b/api-gateway/pom.xml index 8270b16a9bc3..d7a9a9a3ba19 100644 --- a/api-gateway/pom.xml +++ b/api-gateway/pom.xml @@ -34,6 +34,17 @@ 4.0.0 api-gateway pom + + + + org.springframework.boot + spring-boot-dependencies + pom + 3.2.4 + import + + + image-microservice price-microservice From 9258cc854b86c15ba284f10c18fcfeaedcaa18e1 Mon Sep 17 00:00:00 2001 From: Jun Kang Date: Mon, 1 Apr 2024 23:51:43 +0900 Subject: [PATCH 036/580] deps: Updated the maven imports of api-gateway pattern for SpringBoot 3.2.4 (#2882) * Updated the imports in code of the single table inheritance pattern for Spring Boot 3.x #2825 Change javax library to jakarta * add pom.xml * Updated the imports in code of the healthcheck pattern for SpringBoot 3.x Change javax library to jakarta and update maven dependency versions * change order of imports to pass Checkstyle violations * change import order to pass lexicographical order test * change import order to pass CustomImportOrder warning * Updated the maven imports of layers pattern for SpringBoot 3.2.4 * remove unused maven import * Updated the maven imports of api-gateway pattern for SpringBoot 3.2.4 #2822 * Flaky test in Thread Local Storage #2880 * Rollback testing changes From 74cce87c70385a629d3eb929c2767aec503ff0db Mon Sep 17 00:00:00 2001 From: Jun Kang Date: Mon, 1 Apr 2024 23:54:49 +0900 Subject: [PATCH 037/580] fix: Thread local storage test change (#2884) * Updated the imports in code of the single table inheritance pattern for Spring Boot 3.x #2825 Change javax library to jakarta * add pom.xml * Updated the imports in code of the healthcheck pattern for SpringBoot 3.x Change javax library to jakarta and update maven dependency versions * change order of imports to pass Checkstyle violations * change import order to pass lexicographical order test * change import order to pass CustomImportOrder warning * Updated the maven imports of layers pattern for SpringBoot 3.2.4 * remove unused maven import * Updated the maven imports of api-gateway pattern for SpringBoot 3.2.4 #2822 * Flaky test in Thread Local Storage #2880 * Rollback testing changes * Flaky test in Thread Local Storage #2880 Create independent threadLocal to make values unsharable and unchangable by other thread * rollback branch conflict --- .../src/test/java/ThreadLocalTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/thread-local-storage/src/test/java/ThreadLocalTest.java b/thread-local-storage/src/test/java/ThreadLocalTest.java index 9a31e48a838c..0de7f0514906 100644 --- a/thread-local-storage/src/test/java/ThreadLocalTest.java +++ b/thread-local-storage/src/test/java/ThreadLocalTest.java @@ -57,15 +57,15 @@ public void withoutThreadLocal() throws InterruptedException { int threadSize = 2; ExecutorService executor = Executors.newFixedThreadPool(threadSize); - WithoutThreadLocal threadLocal = new WithoutThreadLocal(initialValue); for (int i = 0; i < threadSize; i++) { - executor.submit(threadLocal); + //Create independent thread + WithoutThreadLocal threadLocal = new WithoutThreadLocal(initialValue); + executor.submit(threadLocal); } executor.awaitTermination(3, TimeUnit.SECONDS); - List lines = outContent.toString().lines().toList(); - //Matches only first thread, the second has changed by first thread value - Assertions.assertFalse(lines.stream() + + Assertions.assertTrue(lines.stream() .allMatch(line -> line.endsWith(String.valueOf(initialValue)))); } From 9f97c1505d8985d7b0f6d4cea3f91c23a0b54bdd Mon Sep 17 00:00:00 2001 From: Surjendu <101238933+surjendu104@users.noreply.github.com> Date: Tue, 2 Apr 2024 23:06:39 +0530 Subject: [PATCH 038/580] deps : upgrade the jackson-databind to latest version(2.17.0) (#2885) --- dynamic-proxy/pom.xml | 7 ++++++- event-sourcing/pom.xml | 6 ++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/dynamic-proxy/pom.xml b/dynamic-proxy/pom.xml index 0ec69f0bcc6e..d308c7885993 100644 --- a/dynamic-proxy/pom.xml +++ b/dynamic-proxy/pom.xml @@ -35,10 +35,15 @@
dynamic-proxy + + com.fasterxml.jackson.core + jackson-core + 2.17.0 + com.fasterxml.jackson.core jackson-databind - 2.16.1 + 2.17.0 org.springframework diff --git a/event-sourcing/pom.xml b/event-sourcing/pom.xml index 569a5fceebd8..19f6feb8f7a7 100644 --- a/event-sourcing/pom.xml +++ b/event-sourcing/pom.xml @@ -39,9 +39,15 @@ junit-jupiter-engine test + + com.fasterxml.jackson.core + jackson-core + 2.17.0 + com.fasterxml.jackson.core jackson-databind + 2.17.0 From e0b1250019725736f1ffc11ce1a20bc112a7e956 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 2 Apr 2024 20:37:17 +0300 Subject: [PATCH 039/580] docs: add surjendu104 as a contributor for code (#2889) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 3 ++- README.md | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 161782571ab4..e1142c794e4f 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2567,7 +2567,8 @@ "avatar_url": "https://avatars.githubusercontent.com/u/101238933?v=4", "profile": "https://surjendu-pal.netlify.app/", "contributions": [ - "translation" + "translation", + "code" ] }, { diff --git a/README.md b/README.md index 07c6a31fa081..41044a559212 100644 --- a/README.md +++ b/README.md @@ -437,7 +437,7 @@ This project is licensed under the terms of the MIT license. Vladimir
Vladimir

🌠- Surjendu
Surjendu

🌠+ Surjendu
Surjendu

🌠💻 bakazhou
bakazhou

💻 Owen Leung
Owen Leung

💻 Stavros Barousis
Stavros Barousis

📖 From 3ac7cc326898429855246d2a9578cf59553b3153 Mon Sep 17 00:00:00 2001 From: Surjendu <101238933+surjendu104@users.noreply.github.com> Date: Tue, 2 Apr 2024 23:09:29 +0530 Subject: [PATCH 040/580] refactor: Composite View (#2886) * chore : upgrade the jackson-databind to latest version(2.17.0) * refactor: refactor Composite View * refactor: remove unnecessary chnges related to this PR(#2853) * fix: checkstyle error in AppServlet.java --- .../iluwatar/compositeview/AppServlet.java | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/composite-view/src/main/java/com/iluwatar/compositeview/AppServlet.java b/composite-view/src/main/java/com/iluwatar/compositeview/AppServlet.java index 0cef25d2dd22..d2ec90675eb5 100644 --- a/composite-view/src/main/java/com/iluwatar/compositeview/AppServlet.java +++ b/composite-view/src/main/java/com/iluwatar/compositeview/AppServlet.java @@ -25,18 +25,17 @@ package com.iluwatar.compositeview; import jakarta.servlet.RequestDispatcher; -import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import java.io.IOException; import java.io.PrintWriter; +import lombok.extern.slf4j.Slf4j; /** * A servlet object that extends HttpServlet. * Runs on Tomcat 10 and handles Http requests */ - +@Slf4j public final class AppServlet extends HttpServlet { private static final String CONTENT_TYPE = "text/html"; private String msgPartOne = "

This Server Doesn't Support"; @@ -56,39 +55,44 @@ public AppServlet() { } @Override - public void doGet(HttpServletRequest req, HttpServletResponse resp) - throws ServletException, IOException { - RequestDispatcher requestDispatcher = req.getRequestDispatcher(destination); - ClientPropertiesBean reqParams = new ClientPropertiesBean(req); - req.setAttribute("properties", reqParams); - requestDispatcher.forward(req, resp); + public void doGet(HttpServletRequest req, HttpServletResponse resp) { + try { + RequestDispatcher requestDispatcher = req.getRequestDispatcher(destination); + ClientPropertiesBean reqParams = new ClientPropertiesBean(req); + req.setAttribute("properties", reqParams); + requestDispatcher.forward(req, resp); + } catch (Exception e) { + LOGGER.error("Exception occurred GET request processing ", e); + } } @Override - public void doPost(HttpServletRequest req, HttpServletResponse resp) - throws ServletException, IOException { + public void doPost(HttpServletRequest req, HttpServletResponse resp) { resp.setContentType(CONTENT_TYPE); try (PrintWriter out = resp.getWriter()) { out.println(msgPartOne + " Post " + msgPartTwo); + } catch (Exception e) { + LOGGER.error("Exception occurred POST request processing ", e); } - } @Override - public void doDelete(HttpServletRequest req, HttpServletResponse resp) - throws ServletException, IOException { + public void doDelete(HttpServletRequest req, HttpServletResponse resp) { resp.setContentType(CONTENT_TYPE); try (PrintWriter out = resp.getWriter()) { out.println(msgPartOne + " Delete " + msgPartTwo); + } catch (Exception e) { + LOGGER.error("Exception occurred DELETE request processing ", e); } } @Override - public void doPut(HttpServletRequest req, HttpServletResponse resp) - throws ServletException, IOException { + public void doPut(HttpServletRequest req, HttpServletResponse resp) { resp.setContentType(CONTENT_TYPE); try (PrintWriter out = resp.getWriter()) { out.println(msgPartOne + " Put " + msgPartTwo); + } catch (Exception e) { + LOGGER.error("Exception occurred PUT request processing ", e); } } } From 74be3a537ca630ff569a8ac53025ff1b8f56fdf8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Apr 2024 20:40:38 +0300 Subject: [PATCH 041/580] build(deps): bump org.joda:joda-money from 1.0.1 to 1.0.4 (#2887) Bumps [org.joda:joda-money](https://github.com/JodaOrg/joda-money) from 1.0.1 to 1.0.4. - [Release notes](https://github.com/JodaOrg/joda-money/releases) - [Changelog](https://github.com/JodaOrg/joda-money/blob/main/RELEASE-NOTES.txt) - [Commits](https://github.com/JodaOrg/joda-money/compare/v1.0.1...v1.0.4) --- updated-dependencies: - dependency-name: org.joda:joda-money dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- domain-model/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain-model/pom.xml b/domain-model/pom.xml index 19353550275b..9eb7e23bf3de 100644 --- a/domain-model/pom.xml +++ b/domain-model/pom.xml @@ -51,7 +51,7 @@ org.joda joda-money - 1.0.1 + 1.0.4 From dd9beebd75df2d60db52776d552109a237714083 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Apr 2024 20:47:05 +0300 Subject: [PATCH 042/580] build(deps): bump jakarta.servlet:jakarta.servlet-api (#2888) Bumps [jakarta.servlet:jakarta.servlet-api](https://github.com/eclipse-ee4j/servlet-api) from 5.0.0 to 6.0.0. - [Commits](https://github.com/eclipse-ee4j/servlet-api/commits) --- updated-dependencies: - dependency-name: jakarta.servlet:jakarta.servlet-api dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composite-view/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composite-view/pom.xml b/composite-view/pom.xml index bfeae14206db..10872228af3a 100644 --- a/composite-view/pom.xml +++ b/composite-view/pom.xml @@ -49,7 +49,7 @@ jakarta.servlet jakarta.servlet-api - 5.0.0 + 6.0.0 compile From ead63737653ad58aab5f4bba516583318ef7e7db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20Mateo=20Hincapi=C3=A9=20Martinez?= <44934142+luismateoh@users.noreply.github.com> Date: Thu, 4 Apr 2024 11:54:16 -0500 Subject: [PATCH 043/580] translation: Translated all structural patterns category to Spanish (Task of issue #2277) (#2890) * Typo corrections * bridge pattern translated to spanish * builder pattern translated to spanish * context-object pattern translated to spanish * converter pattern translated to spanish * dependency injection pattern translated to spanish * factory pattern translated to spanish * factory-kit pattern translated to spanish * factory-method pattern translated to spanish * monostate pattern translated to spanish * multiton pattern translated to spanish * object mother pattern translated to spanish * object pool pattern translated to spanish * property pattern translated to spanish * prototype pattern translated to spanish * registry pattern translated to spanish * step builder pattern translated to spanish * value object pattern translated to spanish * typo corrections and resources urls refactor * grammar corrections * Add image to each pattern * translate all structural patterns to Spanish --------- Co-authored-by: luismateoh Co-authored-by: luis.hincapie --- localization/es/business-delegate/README.md | 202 +++++++++ .../etc/business-delegate.urm.png | Bin 0 -> 50060 bytes localization/es/composite-entity/README.md | 172 ++++++++ .../etc/composite_entity.urm.png | Bin 0 -> 91799 bytes localization/es/composite-view/README.md | 385 ++++++++++++++++++ .../es/composite-view/etc/composite_view.png | Bin 0 -> 19092 bytes .../es/composite-view/etc/images/noparam.png | Bin 0 -> 72495 bytes .../composite-view/etc/images/threeparams.png | Bin 0 -> 78650 bytes localization/es/composite/README.md | 229 +++++++++++ .../es/composite/etc/composite.urm.png | Bin 0 -> 35715 bytes localization/es/crtp/README.md | 135 ++++++ localization/es/crtp/etc/crtp.png | Bin 0 -> 122701 bytes localization/es/decorator/README.md | 169 ++++++++ .../es/decorator/etc/decorator.urm.png | Bin 0 -> 23530 bytes localization/es/delegation/README.md | 125 ++++++ localization/es/delegation/etc/delegation.png | Bin 0 -> 25260 bytes localization/es/embedded-value/README.md | 138 +++++++ .../embedded-value/etc/embedded-value.urm.png | Bin 0 -> 107518 bytes localization/es/event-aggregator/README.md | 170 ++++++++ .../es/event-aggregator/etc/classes.png | Bin 0 -> 45639 bytes localization/es/facade/README.md | 224 ++++++++++ localization/es/facade/etc/facade.urm.png | Bin 0 -> 62013 bytes localization/es/flux/README.md | 25 ++ localization/es/flux/etc/flux.png | Bin 0 -> 62348 bytes localization/es/flyweight/README.md | 208 ++++++++++ .../es/flyweight/etc/flyweight.urm.png | Bin 0 -> 54844 bytes localization/es/front-controller/README.md | 33 ++ .../front-controller/etc/front-controller.png | Bin 0 -> 27672 bytes localization/es/gateway/README.md | 146 +++++++ localization/es/gateway/etc/gateway.urm.png | Bin 0 -> 46237 bytes localization/es/marker/README.md | 28 ++ localization/es/marker/etc/MarkerDiagram.png | Bin 0 -> 6461 bytes localization/es/module/README.md | 164 ++++++++ localization/es/module/etc/module.png | Bin 0 -> 18027 bytes localization/es/page-controller/README.md | 162 ++++++++ .../etc/page-controller.urm.png | Bin 0 -> 75946 bytes localization/es/page-object/README.md | 86 ++++ .../es/page-object/etc/page-object.png | Bin 0 -> 49696 bytes localization/es/proxy/README.md | 161 ++++++++ localization/es/proxy/etc/proxy.urm.png | Bin 0 -> 28797 bytes localization/es/role-object/README.md | 32 ++ .../es/role-object/etc/role-object.urm.png | Bin 0 -> 64455 bytes localization/es/separated-interface/README.md | 133 ++++++ .../separated-interface/etc/class_diagram.png | Bin 0 -> 32958 bytes .../es/single-table-inheritance/README.md | 146 +++++++ .../etc/single-table-inheritance.urm.png | Bin 0 -> 141489 bytes localization/es/strangler/README.md | 28 ++ localization/es/strangler/etc/strangler.png | Bin 0 -> 77937 bytes localization/es/table-module/README.md | 133 ++++++ .../es/table-module/etc/table-module.urm.png | Bin 0 -> 77337 bytes localization/es/twin/README.md | 156 +++++++ localization/es/twin/etc/twin.png | Bin 0 -> 29682 bytes 52 files changed, 3590 insertions(+) create mode 100644 localization/es/business-delegate/README.md create mode 100644 localization/es/business-delegate/etc/business-delegate.urm.png create mode 100644 localization/es/composite-entity/README.md create mode 100644 localization/es/composite-entity/etc/composite_entity.urm.png create mode 100644 localization/es/composite-view/README.md create mode 100644 localization/es/composite-view/etc/composite_view.png create mode 100644 localization/es/composite-view/etc/images/noparam.png create mode 100644 localization/es/composite-view/etc/images/threeparams.png create mode 100644 localization/es/composite/README.md create mode 100644 localization/es/composite/etc/composite.urm.png create mode 100644 localization/es/crtp/README.md create mode 100644 localization/es/crtp/etc/crtp.png create mode 100644 localization/es/decorator/README.md create mode 100644 localization/es/decorator/etc/decorator.urm.png create mode 100644 localization/es/delegation/README.md create mode 100644 localization/es/delegation/etc/delegation.png create mode 100644 localization/es/embedded-value/README.md create mode 100644 localization/es/embedded-value/etc/embedded-value.urm.png create mode 100644 localization/es/event-aggregator/README.md create mode 100644 localization/es/event-aggregator/etc/classes.png create mode 100644 localization/es/facade/README.md create mode 100644 localization/es/facade/etc/facade.urm.png create mode 100644 localization/es/flux/README.md create mode 100644 localization/es/flux/etc/flux.png create mode 100644 localization/es/flyweight/README.md create mode 100644 localization/es/flyweight/etc/flyweight.urm.png create mode 100644 localization/es/front-controller/README.md create mode 100644 localization/es/front-controller/etc/front-controller.png create mode 100644 localization/es/gateway/README.md create mode 100644 localization/es/gateway/etc/gateway.urm.png create mode 100644 localization/es/marker/README.md create mode 100644 localization/es/marker/etc/MarkerDiagram.png create mode 100644 localization/es/module/README.md create mode 100644 localization/es/module/etc/module.png create mode 100644 localization/es/page-controller/README.md create mode 100644 localization/es/page-controller/etc/page-controller.urm.png create mode 100644 localization/es/page-object/README.md create mode 100644 localization/es/page-object/etc/page-object.png create mode 100644 localization/es/proxy/README.md create mode 100644 localization/es/proxy/etc/proxy.urm.png create mode 100644 localization/es/role-object/README.md create mode 100644 localization/es/role-object/etc/role-object.urm.png create mode 100644 localization/es/separated-interface/README.md create mode 100644 localization/es/separated-interface/etc/class_diagram.png create mode 100644 localization/es/single-table-inheritance/README.md create mode 100644 localization/es/single-table-inheritance/etc/single-table-inheritance.urm.png create mode 100644 localization/es/strangler/README.md create mode 100644 localization/es/strangler/etc/strangler.png create mode 100644 localization/es/table-module/README.md create mode 100644 localization/es/table-module/etc/table-module.urm.png create mode 100644 localization/es/twin/README.md create mode 100644 localization/es/twin/etc/twin.png diff --git a/localization/es/business-delegate/README.md b/localization/es/business-delegate/README.md new file mode 100644 index 000000000000..ffdfa871299d --- /dev/null +++ b/localization/es/business-delegate/README.md @@ -0,0 +1,202 @@ +--- +title: Business Delegate +category: Structural +language: es +tag: + - Decoupling +--- + +## Propósito + +El patrón Business Delegate añade una capa de abstracción entre los niveles de presentación y de negocio. Al utilizar +este patrón, conseguimos un acoplamiento flexible entre los niveles y encapsulamos el conocimiento sobre cómo localizar, +conectar e interactuar con los objetos de negocio que componen la aplicación. + +## También conocido como + +Service Representative + +## Explicación + +Ejemplo del mundo real + +> Una aplicación para teléfonos móviles promete transmitir a tu dispositivo cualquier película existente. Captura la +> cadena de búsqueda del usuario y se la pasa al Delegado de Negocio. El Delegado de Negocio selecciona el +> servicio de streaming de vídeo más adecuado y reproduce el vídeo. + +En pocas palabras + +> Business Delegate añade una capa de abstracción entre los niveles de presentación y de negocio. + +Wikipedia dice + +> Business Delegate es un patrón de diseño de Java EE. Este patrón está dirigido a reducir el acoplamiento entre los +> servicios de negocio y el nivel de presentación conectado, y para ocultar los detalles de implementación de los +> servicios (incluyendo la búsqueda y la accesibilidad de la arquitectura EJB). Los delegados de negocio actúan como un +> adaptador para invocar objetos de negocio desde la capa de presentación. + +**Ejemplo programático** + +En primer lugar, tenemos una abstracción para los servicios de streaming de vídeo `VideoStreamingService` y un par de +implementaciones `NetflixService` y `YouTubeService`. + +```java +public interface VideoStreamingService { + void doProcessing(); +} + +@Slf4j +public class NetflixService implements VideoStreamingService { + @Override + public void doProcessing() { + LOGGER.info("NetflixService is now processing"); + } +} + +@Slf4j +public class YouTubeService implements VideoStreamingService { + @Override + public void doProcessing() { + LOGGER.info("YouTubeService is now processing"); + } +} +``` + +A continuación, tenemos un servicio de búsqueda `BusinessLookup` que decide qué servicio de transmisión de vídeo +utilizar. + +```java + +@Setter +public class BusinessLookup { + + private NetflixService netflixService; + private YouTubeService youTubeService; + + public VideoStreamingService getBusinessService(String movie) { + if (movie.toLowerCase(Locale.ROOT).contains("die hard")) { + return netflixService; + } else { + return youTubeService; + } + } +} +``` + +El Delegado de Negocio `BusinessDelegate` utiliza una búsqueda de negocio para dirigir las solicitudes de reproducción +de películas a un servicio de streaming de vídeo adecuado. + +```java + +@Setter +public class BusinessDelegate { + + private BusinessLookup lookupService; + + public void playbackMovie(String movie) { + VideoStreamingService videoStreamingService = lookupService.getBusinessService(movie); + videoStreamingService.doProcessing(); + } +} +``` + +El cliente móvil `MobileClient` utiliza Business Delegate para llamar al nivel de negocio. + +```java +public class MobileClient { + + private final BusinessDelegate businessDelegate; + + public MobileClient(BusinessDelegate businessDelegate) { + this.businessDelegate = businessDelegate; + } + + public void playbackMovie(String movie) { + businessDelegate.playbackMovie(movie); + } +} +``` + +Por último, podemos demostrar el ejemplo completo en acción. + +```java + public static void main(String[]args){ + + // preparar los objetos + var businessDelegate=new BusinessDelegate(); + var businessLookup=new BusinessLookup(); + businessLookup.setNetflixService(new NetflixService()); + businessLookup.setYouTubeService(new YouTubeService()); + businessDelegate.setLookupService(businessLookup); + + // crear el cliente y utilizar el Business Delegate + var client=new MobileClient(businessDelegate); + client.playbackMovie("Die Hard 2"); + client.playbackMovie("Maradona: The Greatest Ever"); + } +``` + +Aquí está la salida de la consola. + +``` +21:15:33.790 [main] INFO com.iluwatar.business.delegate.NetflixService - NetflixService is now processing +21:15:33.794 [main] INFO com.iluwatar.business.delegate.YouTubeService - YouTubeService is now processing +``` + +## Diagrama de clases + +![Diagrama de clases](./etc/business-delegate.urm.png "Business Delegate") + +## Patrones relacionados + +* [Patrón de localización de servicios](https://java-design-patterns.com/patterns/service-locator/) + +## Aplicabilidad + +Utilice el patrón Business Delegate cuando + +* Desea un acoplamiento flexible entre los niveles de presentación y de negocio. +* Quieres orquestar llamadas a múltiples servicios de negocio +* Se desea encapsular las búsquedas y llamadas a servicios. +* Es necesario abstraer y encapsular la comunicación entre la capa cliente y los servicios de negocio. + +## Tutoriales + +* [Patrón Delegado de Negocio en TutorialsPoint](https://www.tutorialspoint.com/design_pattern/business_delegate_pattern.htm) + +## Usos conocidos + +* Aplicaciones empresariales que utilicen Java EE (Java Platform, Enterprise Edition) +* Aplicaciones que requieren acceso remoto a servicios empresariales + +## Consecuencias + +Ventajas: + +* Desacoplamiento de los niveles de presentación y de negocio: Permite que el nivel de cliente y los servicios + empresariales evolucionen de forma independiente. +* Transparencia de ubicación: Los clientes no se ven afectados por cambios en la ubicación o la instanciación de los + servicios de negocio. +* Reutilización y escalabilidad: Los objetos Business Delegate pueden ser reutilizados por múltiples clientes, y el + patrón soporta el equilibrio de carga y la escalabilidad. + carga y escalabilidad. + +Contrapartidas: + +* Complejidad: Introduce capas y abstracciones adicionales que pueden aumentar la complejidad. +* Sobrecarga de rendimiento: La indirección adicional puede suponer una ligera penalización en el rendimiento. + +## Patrones relacionados + +* [Localizador de servicios](https://java-design-patterns.com/patterns/service-locator/): El Delegado de Negocio ( + Business Delegate) utiliza el Localizador de Servicios (Service Locator) para localizar servicios de negocio. +* [Fachada de Sesión](https://java-design-patterns.com/patterns/session-facade/): El Delegado de Negocio (Business + Delegate) puede utilizar la Fachada de Sesión (Session Facade) para proporcionar una interfaz unificada a un conjunto + de servicios de negocio. +* [Entidad Compuesta](https://java-design-patterns.com/patterns/composite-entity/): El Delegado (Business Delegate) de + Negocio puede utilizar Entidad Compuesta (Composite Entity) para gestionar el estado de los servicios de negocio. + +## Créditos + +* [J2EE Design Patterns](https://www.amazon.com/gp/product/0596004273/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596004273&linkCode=as2&tag=javadesignpat-20&linkId=48d37c67fb3d845b802fa9b619ad8f31) +* [Core J2EE Patterns: Best Practices and Design Strategies](https://www.amazon.com/gp/product/0130648841/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=0130648841&linkId=a0100de2b28c71ede8db1757fb2b5947) diff --git a/localization/es/business-delegate/etc/business-delegate.urm.png b/localization/es/business-delegate/etc/business-delegate.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..4dca6c263b99ddc3898218250c4da67fc6d71314 GIT binary patch literal 50060 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

X|h62V?2|OLQYYg$LNG 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 Y%N4F4Gn;|10UDZ&q=G~`Qpfdw0UUnbEC2ui literal 0 HcmV?d00001 diff --git a/localization/es/composite-entity/README.md b/localization/es/composite-entity/README.md new file mode 100644 index 000000000000..fbe132250bde --- /dev/null +++ b/localization/es/composite-entity/README.md @@ -0,0 +1,172 @@ +--- +title: Composite Entity +category: Structural +language: es +tag: + - Client-server + - Data access + - Enterprise patterns +--- + +## También conocido como + +* Coarse-Grained Entity + +## Propósito + +El patrón de diseño Entidad Compuesta tiene como objetivo gestionar un conjunto de objetos persistentes +interrelacionados como si fueran una única entidad. Se utiliza comúnmente en el contexto de Enterprise JavaBeans (EJB) y +marcos empresariales similares para representar estructuras de datos basadas en gráficos dentro de modelos de negocio, +permitiendo a los clientes tratarlos como una sola unidad. + +## Explicación + +Ejemplo real + +> En una consola, puede haber muchas interfaces que necesiten ser gestionadas y controladas. Usando el patrón de entidad +> compuesta, objetos dependientes como mensajes y señales pueden ser combinados y controlados usando un único objeto. + +En palabras llanas + +> El patrón de entidad compuesta permite representar y gestionar un conjunto de objetos relacionados mediante un objeto +> unificado. + +**Ejemplo programático** + +Necesitamos una solución genérica para el problema. Para ello, vamos a introducir un patrón genérico de entidad +compuesta. + +```java +public abstract class DependentObject { + + T data; + + public void setData(T message) { + this.data = message; + } + + public T getData() { + return data; + } +} + +public abstract class CoarseGrainedObject { + + DependentObject[] dependentObjects; + + public void setData(T... data) { + IntStream.range(0, data.length).forEach(i -> dependentObjects[i].setData(data[i])); + } + + public T[] getData() { + return (T[]) Arrays.stream(dependentObjects).map(DependentObject::getData).toArray(); + } +} + +``` + +La entidad compuesta especializada `consola` hereda de esta clase base de la siguiente manera. + +```java +public class MessageDependentObject extends DependentObject { + +} + +public class SignalDependentObject extends DependentObject { + +} + +public class ConsoleCoarseGrainedObject extends CoarseGrainedObject { + + @Override + public String[] getData() { + super.getData(); + return new String[] { + dependentObjects[0].getData(), dependentObjects[1].getData() + }; + } + + public void init() { + dependentObjects = new DependentObject[] { + new MessageDependentObject(), new SignalDependentObject()}; + } +} + +public class CompositeEntity { + + private final ConsoleCoarseGrainedObject console = new ConsoleCoarseGrainedObject(); + + public void setData(String message, String signal) { + console.setData(message, signal); + } + + public String[] getData() { + return console.getData(); + } +} +``` + +Gestionando ahora la asignación de objetos mensaje y señal con la entidad compuesta `consola`. + +```java +var console=new CompositeEntity(); + console.init(); + console.setData("No Danger","Green Light"); + Arrays.stream(console.getData()).forEach(LOGGER::info); + console.setData("Danger","Red Light"); + Arrays.stream(console.getData()).forEach(LOGGER::info); +``` + +## Diagrama de clases + +![alt text](./etc/composite_entity.urm.png "Patrón de entidad compuesta") + +## Aplicabilidad + +* Útil en aplicaciones empresariales donde los objetos de negocio son complejos e involucran varios objetos + interdependientes. +* Ideal para escenarios donde los clientes necesitan trabajar con una interfaz unificada para un conjunto de objetos en + lugar de entidades individuales. +* Aplicable en sistemas que requieren una vista simplificada de un modelo de datos complejo para clientes o servicios + externos. + +## Usos conocidos + +* Aplicaciones empresariales con modelos de negocio complejos, particularmente aquellas que utilizan EJB o marcos + empresariales similares. +* Sistemas que requieren abstracción sobre esquemas de bases de datos complejos para simplificar las interacciones con + los clientes. +* Aplicaciones que necesitan reforzar la consistencia o las transacciones a través de múltiples objetos en una entidad + de negocio. + +## Consecuencias + +Ventajas: + +* Simplifica las interacciones del cliente con modelos de entidad complejos proporcionando una interfaz unificada. +* Mejora la reutilización y el mantenimiento de la capa de negocio al desacoplar el código del cliente de los complejos + componentes internos de las entidades de negocio. +* Facilita la gestión de transacciones y la aplicación de la coherencia en un conjunto de objetos relacionados. + +Contrapartidas: + +* Puede introducir un nivel de indirección que podría afectar al rendimiento. +* Puede dar lugar a interfaces de grano demasiado grueso que podrían no ser tan flexibles para todas las necesidades de + los clientes. +* Requiere un diseño cuidadoso para evitar entidades compuestas hinchadas que sean difíciles de gestionar. + +## Patrones relacionados + +* [Decorador](https://java-design-patterns.com/patterns/decorator/): Para añadir dinámicamente comportamiento a objetos + individuales dentro de la entidad compuesta sin afectar a la estructura. +* [Fachada](https://java-design-patterns.com/patterns/facade/): Proporciona una interfaz simplificada a un subsistema + complejo, de forma similar a como una entidad compuesta simplifica el acceso a un conjunto de objetos. +* [Flyweight](https://java-design-patterns.com/patterns/flyweight/): Útil para gestionar objetos compartidos dentro de + una entidad compuesta para reducir la huella de memoria. + +## Créditos + +* [Composite Entity Pattern in wikipedia](https://en.wikipedia.org/wiki/Composite_entity_pattern) +* [Core J2EE Patterns: Best Practices and Design Strategies](https://amzn.to/4cAbDap) +* [Enterprise Patterns and MDA: Building Better Software with Archetype Patterns and UML](https://amzn.to/49mslqS) +* [Patterns of Enterprise Application Architecture](https://amzn.to/3xjKdpe) diff --git a/localization/es/composite-entity/etc/composite_entity.urm.png b/localization/es/composite-entity/etc/composite_entity.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..d6c29a718837bda04012a62dd36b8520b21d07ef GIT binary patch literal 91799 zcmbrlbySq!*EWt~qJ*S?fS`0qOG|fmOE*Y2CS*X}YVzF3i^E)19=65!RcFr!gHcZC$ zwohJhKSM#ejbo{*>HM$1quc_+xTi&^D%q#L!t$++zkb(;LxUP)kxoVWxhyv{p30g7 z)}re3?rYB6SMi$O5!1^Z-skZjzp0Z7dtYszw=}l5j0DlCm>@qbv7ZUy+>7bg&A=C= z-L9+afvyCx7}j|NwSPhpr5z;_SoUb{Fjp=s3Ac=REbvj>A*KoSJC4w>nQf~-TVJ4< z+UM*^FZZfn@AV%?=}S+@6yvbtm(f3pc=>uw)gqbo<->Kq54qBnP+?E}`R$g<9`-e< z#BSI$?%i^bdE;Slr>CAEqVtd$sA^JqD#vCrLKiKm zfz6)Ng?|w3(JlJWCzyF;my>}zdT+4ovS(^Ts+)8IAc3JzJDv&pw9r4so-h$R#%;kZ zfcz?K6>}@@l*4&%U9l=1`WQWK^fK?RxBHH+11h6RwF8GRLEa56@cA1rQA5>_PO9N3JqJv1o8<><_X1vCq$*vI<`3%M0lmDRged} z*Jkq1xQ_c}srn^ZJp>2Om+GA$UIWcs``%UF@`w8U@^B38FK4uYUQvLJs$0G)ue?G2tvO{|3=jZREM3=vIT>5m8 z`uNW`cVvx|El!{)C`n8RH%Rcd`m@}ihzLN^t$2}ibs@ssrC@TSZ^*amzI#p&W`irLtE;=l%j<+$u-B&DQc693GF<~Mj@ zMXZPD=+K>#^z_*bey<*mbV0wXscP%q-roN?*75diWpy>Qd~2jorB^^qRJ5bBlah)m z4+`xK`(r>{8(=eFx$OVut0Om>0|N#C)UumG5y7_KZxwt7MKU_g$m@?|)Y0M~G$DCxO#G z){rksIW`|t!j`J9H2FNXJ`zuoIZBsI(Cbirwi+#}3U2W^H?kwWdCB+kFv2*(5JULE z&u;VGT-5q- zeYxYuV0y4N)HIgFVywAvb$PBOZDUhXTk8gH()0vNW?9e&)5K{KEO}E+FzbGCQjwWy z5Jx4axzM=N!fQ8E2NoWttKXbb6C4r}!l+Z@eZEzjFQ4A`=+n~n=&$NEnyyF^nblm+ z!*ypxp5V#w^Yv;!{)rEIEAX0lFsWE^zoypsHiU3Z`|Bk`WQFX z&&o1#g*)%eHAe}YeZsu;ke9bHj#@z)&gXsd#bbX3!TK>Epgrb=L~f@$e#FjcO=+pE ztgP&8gNp}Rg>g5Ar5It8W~6e)qwA4;CED{k$7N~t_s?$2WIM3QcpPnNArVl#DPLB5 zr}Yt9FE1~3*}fXv>0G&TYWgm7Vr56jSs;J<0UW={@e{6|=eh81f^cM=aSApJe)}(hfx&SOB z!k^D@mY!=wmk>Iz+8IXBYrp95H%dmVlOEvmCy+99mViHrXMa) zdZ91g2f`V(t?)fl5udZqT~+40Vxvhx-FukzL_BPyqU|CJFEH%*c{$C zI69pQX`jU~koX(adAA#bnST zOI_r&I=~Rvl=JbEy!LU)7$u@eO=;QdOib5D3ip?KaUf5z zu)bo0fCE>~kP&aFsHhmM4v@)c3p(NJ?CT2!K2`nKrv&^Qes*Mw1S_kkOxn!35aG@_&kaUMo%J{q#KN1)YP{?_HZrTNtu6Q1|8>cGibi;;DxDSu_pkQ^ zHWObyP=b96Nxbn3t%XDb-(Hy-%i$nO$Lrp5jAZ_+HzUlg7j4+REqf#|Trt;HUn4Xj z>Ih0i`F)?4kGcgAg^Q*pvY7&U**{$w^&t!G50 zFjmCuci2#uxZL|L&yO>$ud@eK+!>!#gnz(A;&SkyL3$(#&X2Z? zX&1Yr%$06>My5cOwuBwH9EeaLv%&*#{UH5COR8QHfL>)rSus zn!Y;eJW#xf&!Inwg&`(Nk&Ms%&7w=-k->@eSc#HF=B7F7k622X z?a9jEgiKyHrukmM>kE}uUmxib#q74^o?cyDE#2=4s6Y@=i24S$r$e83Rrx569cDC=hHMoc27%UGlwwbY89Gn`ET1lrsu&+`cH} z^Q+e|Tous{RwJ}?LH^yQGwxXEZwajqmZ}fL5@}8ET-?#z5|)(U@wDyO zr;c|)7!g`!WMbL|K*vO0laRH5FA+-P>>}dXR%%EyWO_%<6A5AbwI8OOpU)ENIhl5C@!lIy{z`*e* z^FD8nu6{*I#t%V){bV?oBN~DYU|l0fX$JN@G&G+Q>U}SHj;Yy4ybji$j4rr6?1~~A zJnmA)Z4igtQ~qNOzqBBpHvuQzQDh1!>>&hk7#^o+1CNiWK4S`;yw8_R^zvnz+y|g~ z7=ftUA_p;|tM7NADZm8)c$242)PQUakzCYXAH)>A_)4~s$!3mGTwwpWH15VM(uK;< zwNEsG;-?H^XDCU#v(Z9k2?-UowW}cvV&ur60h}uk6DvEU6X-&ULuJVGJEYIf&ZG_E zC`AtV9zzOx$^?yEe9M9`NX~T6-HBz!E!Y{-Gbzpjy({czzsxgHQ&YnV|FsQ5$*m3f zfH#o)Bw&#}z^7FfJrlHVu}G>47jCRdIe0>lk&%OYggt0=&p?+x?>Dh%Xo;SYWN?$) z_KYDW1Ixr`6XWj4Wm?#+X6GSWJJhFsmxl!O?FLGHDf-n`c$5IK#U#e7y(IWX7n)-g zxhYl<4pJ>&Ao;8xSXK9mRdKf*pYx-O&`OStr-*44zL@+qzF&6?+CF?cmIZh_SVPch zCHx@tHvya#IB0h$vXQ5WLSbl7MB2_L-NsJ27jtKOHb{W;@F!NvxPTp z#auSVOx+4PlsF{J)#vJY0G{+tEzqjWbCzCm%4u|1`$5i0uZ-p~W#4idl=utDC${>K z+V}d>ZTEtv%FVb;zqzkiaNI?UFh@LM!PHsbe^vZgqQrM&jL~;E_S=>gz#mX#Fecdw z@AyN5u!~^@!A|AHoBfQUtRIQczmEzDIhnt{8ZXvhK6-{xA6cqX+b6^4mywpnXFF8| zP%d2+>P(d2)d`6A0L5P%-&4-8)_9Wjp;6dNCf{MPOB$;DtdjL4zJ9LRs}h&Usxlsw zS-p9j{61&S+cWhxU8=haod9X4q@?he^k4AGP(*_Sfd$Av zh}&mOLT2``ji`ZjucOUu17e7LV$``)A(Fy6eJgbTPBLZSky!h`TwNMJ?swnQ8rf%8 zC6Tut$Jbx^b49ns90j+^LO5TFWe9p6e1gi5CFUz}Kzr;GBw5S`&jy0n)76^FwwhWl zpAHzUS<8feU`5zH&1?%k12Db}0>YsK+5Lf*3160UEl;~a%QZ)(`$peo}jsCIg`&;lkDDF~l z2qUs_rbvzcpD6qFh8<}FfRXY*k4dM-=Iz_(|70L{4Df?!Y+~Z#A26d%w14jZJ);Wg zot@Ro*0Zq2LU}I8_U`AKqt_~@d&~TMeA+cOlORNce@7eRQH&#h-ZVPu_wjL}PGXud z5nR+PnUH@lSC|sK8smc ztbzJYK2t!hj26%^HE#L;)pZ6c%KMNT zXTcSOB_&lRx@A+$4{^j)h?5B&G4+pImm0lKaKhNH=P z-o}7~UV|8J4SY^xuyOI+0Ib7%t(#fnioQ*L-ec6kFdU*kY_S=el#~RPGc7GGHg*qy zvZ^Zf(?l{96i19d!+=*7!hd0w+}7MR^qUeyZvg=Ta`F#NIE2)Wa(m2zfQ)+vhJGV- z2lCLLLA;-J%a$!x{1vb`;HgZ~fM<%A(Na>1T`k{7d7p*~3`q0oD=Q0>zvpO< zto&tz>1;@i06C@3@4G3wFC4?-t|YEh;GPEX%RLahF&=b+PWeydE+R|#M6(9o*amZ#vu-$G8 zdB}kmwd0HqV!d_i)>4WvsIn+10D}TR z(9%~86`;>*A*e?QocwKdqqsJXPqqmiRyS5r_CJ4F;SN8bL8@AG*7Tv-KAtf^3!l2|jV3jvgH*$6 zV3oDS`iO%=*}|v zpM8q{XK{_bL6AxaT4+SE)zZtM->+=>E84rdf+%bsuExR=NN+3LpCo{}(X2clGg4;O zl3m@h+Z3qKTRc492__ZbW6oRUovn9TSoz+5vAEdH!e!TVVev*Gql4<@$BlUB;K}u= z>Q_jNoq4}{EWSay2mfsXf5zc*gL0_I@W(ZuP|KdGUz_+U5Wxt+fb@xZs#068XBc%>+`Vf3&bNwmY6oy0 ztrCcd*{T$`noP3}8)=sO{$iM^=#hMaQJFCEC58mra4`_eUi|z4@Y%O^H;=#j9*8k(DCrn1s= z*b8&_vk2J4A%Q0v$VY!K$>BF>^;J|Kdg@2H#W$U&CspZrWTRK8tfd}A05Me>HuAeV zStPEg_b%nLOZJ_HMcu}@BUBHazi3}Ffd3Og(`psr@kh^tB4sX52|kbhqEjCEpq0ni zjoL9|1I^$`O_97@EtzN#7@C-!n(~}vHPAY%G*2XAFW@&4b+e@4E>MO(EA%=#a&2k3 z%#Ayq_#PKWU0YYDY8L#Xp?ae|c(s?ezP@=-xv7bdl)ukgF_brMvXX6uLYXWGb0-4= zG39)&^$CL{1=aux-mr*S#_yD5YB}O!5E*v+t6$4-X)V8rd(1D=i^i+1A3-$p&&2R0rb+ECh{-@01Pq1! z=-ylfyKd|V*6Q)rGPgVxrfv4D&W_LE*Qwm=7aS>G-TQXmrRB<#(}Po@+o;kEJ+4NQ z=@XhFX02WNc!e>W`6~8>nY?tL<(>>^v#18TZm+KDl%=V3hMJP{z3x75f2^!JQp4Pu zmi1$xdXa6TC&cGSi@B)Ia=1jjlt@WzD!aow6BS1Qz&9KoCQeJr7=*Db#E-T9?O@>~ZN|wOPpi&n`aQE2*|GC_MaKP7M<3b2> zfRKYE(QMdiX#E`?opO>^UMaQfr}|0hW=nLA-Epl5;3TJKM_wDHpN$#{q6F<`a=N=O z76FA^u;6zsRvEQv7J0Bsy(gSNpNNjG*C~(()qDA3#FP86~{f=77r|~h7T=6$Da^>OXhS}!X z&1(A|j+$5+I%+*U)95!gCF1m+JgYEH&6Rsl<(QN^evckkm-f4r_+1BIF72I+Hd@84voLVa~pX4t_{|80zKYc^_qkWW2O?^W;2v5|e&CDj4NR zF^G!4;|+W#6==Qn3AsP)EvG}(XrNZ3dobMOn29gH9%XoKX+MS1B=~MFnr9vssTP)0 zoxQ(B0?7^Zx?r0KtG#c1IqcOyCbwF%0XXN42IEn_0n)aVRW#Q~bqQ`VFD(0z!_!?68#=95)0?@B`g{=c5L<^~R&RGV9UbDngueEi?145ON(jr(u*W7b zMH=OjWrv%SD0EIM{jQeu5OPhb2ma2XcY~X4#g*TD0#{@t)uQv(6o;c6EiLWdPLa?* zsf4sc)P*#!a74X|N0)7E&@kuvn5dN*z8CcX^mz*PS|c^XWYlV{Kbreh=%Jn+j-!T_ zj0GZl<0jDXq}|q{>rGB`BvyOPO0?J#2&^m0(XeEE`^8s1ub z?{AgB;EolCRTqOHSLv0r=E}-H2vuC&gVG`pYks|v%LoRAa{PD!yP;JhMyl_-S#Rmb z-CIpTvR?i*^u=)*R%=g|NX4YHBJ;ga74Cr+u}Lle?5p6}`CxTLMT^twopXzc=OMKH zl64JZi}k5ogLK+e4-5jmudg_qv9C_4LkVtDl;2TEC_3p3UF?VWXSG$fup8$S+RYYXC|mz3O3DjHyoE zh~Gfoh4<1?$lJ5zl(gLprU(AvU@Hod2GB6vxqCP8>IfqZ&m567jp$jX@nFQO|T&$sFUE(1Nts7Q<^ zXIhKR2?4Y%&ox9OVWm;VEx718gYLvtfAUtX9SK`>LYbcAk6zkEHH`(G07emrdGdBA z*_rQdY{0fp!qN6Ot@&3uRZi3M1;>F}PS-8b+&Osu&wY%(8M;+|z$LtW`*sgUU{H|w zzvK*k|8^*SL#((cXTy`1(DX*LYuBOucjy_c;jLLADtShe-z9271KIEzHT1H#SZZ60 z!n!_*|8`kdU9_E?(2OHFJDz8NOGf+b9d32Q-90>JTCex!*MrbwliI>RW@eTbTl3en zxA;u&>d4A2Ef=ZMc02ZxNbS%f&gY`Pv%8wvW|d~k zioUh1(^ihiBwEyz% z#+2+X?E`;Djn>oP-qtjafPHSljwN1xX&yY~&w*Vztuy;3qkH_te9hYNbc-g|<{PSG zlf?$B?^S~I?cig5GCYI~H5N@R=knF|^BTbzr3$iqbStcvdvMSW9gj|qfl7$kE6Wtqoz?2wa}zs(qc>NWvZ?GGg|E*}7f$!%%!G zoXF7r4>3b4^Bdh!wWRTekiJ@_!K55+(wDyX4d|o`^_Q^$bsa3MVZ)27h zSjb71%4b6buZ}$-hs1kzZ<7%QX&*sG0XQDtiBW{=8D4ULP0sg265<3`yKfvkR&A)u z2K>g(mYGG@PpuY+xpunUDg^G_X^wvw5D=(Ch57`||9NF-C#`0luIg0#qbH=7@qsf2 z;~X&tjyuILH-%8u(9$K-kl|6ZtPH*obW8)d21%7<@;g-%jK>nhXWFz|Gir7|tSuG` zwSyKz<7q9M-6@AT%q^gp#*d=6Jw25HN26F`#5lnwpU|5u!q_5SnpjtQn8jS`} zY`eR=K%2Cb-t#)fI`+@wsYUs`99irT{cq_t)Y6&OUFbUvA^LicM`hEYt~R9FXN%r$ zeh=vs|MmPQw%%Y-(fhj}{og48s=|Eprh7ku?{w5WFF*mlbqf$s&nrK57T#oR*^vL0 zvF$gB^Rog!3AWvCvv&C`qTVvC)@=WOM{Ge|NOiltM@;1pfwF6 z$5jWkP}DPS$Fl=VM>${?ur_-)lRydjWNw*=eVfaSh}v31Er7I$9A`wuyw!Ud9#wnqDekai$2fI6K$_1|hPf zL~@bo_nfmk8puX*ir*DBcmHtX1_{-@?0LbPzeZ#IVBsugTw+XmnGm@2;uSRgJe$g= zHM2Ha+|o#_$G>x7WZMjtw(icIJJHr?K;H%y7l_wnW#eyr?7(JIsnI$gl{P?C> zre>zj!5x&!WSLB$xO(E`q_Ml}RcL&m($AWeufV)LeLQ-yJD2G+9QMl$>S->WY^vvo8^DE(7V)ES8A;crig^BUd7=Fu1BuizkQ4ScxG57w6u6 zO{%qO(HEsTa%W}@ISqPh0X`sxHK(nzxzt$o+%XN<{x(*o`nukC8edsYQ>5zO_d-^vJxxo_fvRL%X`b+mly10@M&;mEHP~7Q7u-bmEfTP zHSBQS>BWwpL`STL^im=y_vL4q^cr4naM}*0ajP;Uzc}2Qj(nMyD!MS5o%58p29pvr zM?Xcj4GchPdK;A+K4`Nh7Y#CMdyB^ACH)CfgDh3J$_fhkZNMX+vP>0(va4VcF<*j?|> zye7O+6|G%ehMThhto{Aj$Y(L*$0Mw9Zt;kv& zUQ`;5b#*1h`gy}kK8*I%4Y04WF6ilfGiKcl4DPN}g;ZdX2uuaQeNiy4B3 zwWV^-sA(N$`l6X?#Fd2|Tw%t27)~v_tWM^#$HmLqplRfZ7o+wYDae4)@q2p9wpw09 zL#qqyE6p)meR$!*B?}#VsQHni-Ho1yxP72kq^+&p^){BovffetCGzE)Kii0=yP?H6 zr*A+`Z5aNw_~m0HLI9*VXP3wZFTs|uLvjZ7|8gj%soaYKz4LGO$rn3|kML;MzcLI% z7H=7qvE0zAax=|OsrZ$MIlYC>n_L-XD2B%k2Ct5$`7d601oS1qd0yj|sh8fq%-u@m z!rY(1XB2RBDAX-h#}gocPuAaYlY^a_E$LWzo$fJwg9QDI*UT2S#J2q*kwK|VRU{+# zqpUBUmU0@eT1;f=>XKL5ZNT{y<_L;dWn$wjC2S9DAQV|=AEtjrpg$70x4b^0|R@w|-00KEO`H5o>gxSI1mBRJCYxcGS+N(nqb{@Sj$~T!{ey zLq_z`cY8iM^gVkn`UbSM=EYK52dr2bhN+s}qAlK({J?%%t<%pTo+4LV7{Y5lg23Uh zP&9XZwD1sjG+#kSW8BlG2oHTh@N7*FnM1|i0Bu1hKI#p)zq)3uIblUKUSl=-X*q+Z zI>E75@0H-2JU~dTn3QeL!kd2Ww__6Vyn!O3d}f-x9-^<&#`wf*QL(z447$%oM<*=B zU}LvUN)VN(7!uW0M%^>1Q(C9vjvh$oPo~aBy*^p&s#?wT?bEFfCE1&6rngL;9m`sT zDxJ6Z7*yPT@+7s_y+3JpPwFMeA_hJj$+p9vGUbtA$$I~CC-;p3DaZ83U<6X0|;?c#jyrQhhm>^#vdf}RgysEa(HLSPQ z;bIjwssqZ+1(OeBrKtldV}&U4+Abh8+FfsYOa)J;wfVij_7{?KLgjqs)A zWg%C2?es7kSK#e7sT@3Jvi2Fo&o(vczFg)=B)1A91kAnG^AyNrTLG>1J(aLk`+_vy zU41asjs_42%Wq<~yj3GJ?yW4|72motk&I%+gKKN)OioU#mFwl$4jzex@~ovslx7G7 zGYu;gYkaa5I@P-gTkiuOJOGK%gKuih9b&m|vpYzkBDEU+P_^R>HMK+6IQQz}krl<( zH@Ji@0v+QW^lY0KkAu-?D!8jWzRi4ls6dr-0D`WTFH5Le5bcvMPrBH3s8-y1v6@L^ zX~;?pTR*4(1+I+_XWq_aCC4)87dZ_{_`){;->iB9vIwFX8UIUMY->K#p{I#>fjkcL zCC+G;&=x7bfPTw`6S7Jikw9-%1h^cExh=g$d=)gm73pU)!$L8GCY5lL42jh^4P7G* z(^2Tr3yJ(hlE5k#7!P9IBov6|zdAu3-OA@1s_CcAB8mV%w9PetK?c=rDKQ~~`V1V6 z3_&k`2JpaEIxb%&zq_#`VR3HUH$rm#>&2q~VDMk7MjljZmA)z1jHHz5*g7Bgs%4+% z_uqQ-1mm1Xy}xAHzzBGKHl|46gTDp791#-eGy@iapkNF-z?JP2j=oD?m0_+w>d!-n0uC= z={eN7T(3M@q7|ahY#gDimjPE^W2lJw<9Y>y&RZtmL(UCZe<^|{(G??Zc2+ z`Y5=ztzb30-n(l*9>8Cb{HO^JPWQ!ZM!kEkl`z<6(ekVGPCD6?%V|*25(Fvy$AZFl z?r4SY8CP*5a-(3rZoBprDvfg_6R(EM_pksvqto7o5g1@JVuYWV=h>}764WD)>!o=e zB?#*uGq#!nqGUXr$)nCNA=S-P`>UwcSgx%2iHX_GoY$}LR1nqHlACkQCV+(M4CVgu zG;y$PeP(iawz;J$x7ZrUruZgmY-AOXOK3Irnal~!hP8mbe@u3@Cqz(|&P$+_bFn2G zL`(^~7CEl7GjsVWLh^6>ljab1YkXgww??Yj%xjnd?^q4aPn=#p+S)2?HoI9SKAJZgiY(QMRu zh+5sqoUv+PO5R*tIWg+8^?$*@Zj1ePf3a_zW#swJt&y%>XWW|#>s}G_iKeF#ccvyL zM#>B%N;;trck}W6F0}+pH zVqP?dwB&HP&meZd$G!g7h0k>BzVPcGX$5r1SaF z?$-3`{d-Kfm02?h|D$|zGd?!Gc;VP<1iU)rDi#((%@f`wr;N2A5$qeW`bt|EL(yNk_X_>66O zpu_Tto69m8!brUP?P2=X_N)##xD{VcH$YInSQc_liG-(!4#wq_g^oITdU_q4oGeBW zvlWXl#gq;*&64X>%6r}qiA<5_&~wgcBccQcW4e@kzDbk4j7!&V&yRHd?9NhX4=UON zl3&NzI<>9|v+r3A-@P~W4@WpeUG=#&hB_qwkqp3p3^m3jO_v0iA5L+&ifvpO5XChp zPZta%KN??>geUq9q>P>B@zD^Nw!JpRz@h-kqj=_=@0Bw5tz4AHM$dy?)-?!s6e&Uz zozs4DbqZ3vOYkg}=w69et}J_G5T_peIo_&!CBG4aKtZ*^RnCg5_Slkov{++vs`_pO zv#m{uWr+f+gJnfhQaaH76&YOH60wXIs%(|khUz!qb~uS$KbIloDk~R0e}F^$j{c)t zjdDYdaYZCaYPJ22Jo;`b9kMM+K(CQW7-$qgySt|zkIuxP+Uj&^iNP+q>j%3PH8`gB z9wQWe!!mOQ-)wpffQrNQ`X8hPwIga%Z_TChF%8c^kGYC#3Nzt&7rC&h+cr1H#9+h0 z{BGAsu~0d31UlC|4H|2KM>US75Ob_L>(Anrm^=#c?wpPzY84GhMkfbX7yAM{XzPOM z69}kGjrA&3@zw8Nr!}^0*z+Fwo{3D~k@+n-;A|L;OF|j~baX^o9jnas-?)0BXEuO_ z>jAIS-2%3y?`yC<2A+teEFPD=pT!P;%WrWhwcKRSAMPHyzU1TTg!A}Dh{WNJnb}oU zqtCMIbD5TNdy)iHhi1i8a&s^67`08#4!#*N#fSaDfDfKvnXvTb53QUZ=18JI$-YIS5*nd%J!J z89d^~MvZdL%?R0xOEKAa3Lm++q*#cnLwgW&Pjb_x>!{TzouUrnmUDyaOsh%n>m&Ao z^-+}*@6rQ;otMky6msLP?wz3_-&6fgKo?%%yd-g8PQU&$DQ`^_D3f3~>~)Du16`(B zL(W^?Z5-Bl2+|(z8_|Y~2%iZeN^qNmr%DGPpn{iLil9MS`G}F+$RbTW+1{gruI`6VK28|U00h1m$=;Pbc4Ua((2?cSDfG@)!MUF8*>hdBaoJxnq^GAx^PX+21qeBmJ*Y60|QV8;gmbRA?0*oNq9nvRkZi{MY7E0Gq2y=2taO;kxs~`YMHs z%AP9kK|0W_gZ90ioSNiGa5-8Z=l&U=oj7eZawW}MJE6o(ohzhBn)o_@2q6EPT@KS& zkvYDAgbXDYN-EtqORjl_iRBdW#0xn$8)j&-WB2JrCO~1tveqcPAH;f7lLgMpu3*UZBNtxN`dnh`x2UOz9bY|eSN(v z7zM({Wx_PlJM^LdUJB3%xUMge4_LBigBHr$YT(GYwX?tDE6gxZ?>7((%Kp{JmH1Y{jA(P_&Tk=p2ET>pjHEclS1z>kU^!w z2tzKVNkV*MeKZ=VJ2b!^E$_bF-0}xJ{)Ij+RUxVDagH4Hl_k5s=|X3VufF8x6?D(a zFq1v`ki}OvTAaU@Hf%xnmxiCD-)9=$gYKbR3I~Sbnn7sK6E~1g8sW~@DUpd{YdAWG ze!tpSHjRtbBj$W+?+uzlLdqvZh=7>MnNkiW3$h=Vy&2ON5n@%}>#M{tZQ*iSoGx0Y z_gJ@t@N>LLY%}t@NZpRr@f`ga$8qZ=_6-%FE^(>r{k7jgab}0O;o(io`+*o>0Mfli zK!?qWW2-3^r zCxZKDre4QVvu@6kh4@B|_c|bpOB?+Fgou)@4qk^Zv%+8MwISyHn4rH229*-7E)AGo zNf#+YXFfgQnR|}WoN}{RA6Ur!Wrt4Ph@SpvPU`3I*aM0Zo-Tt#JM9qr2=BN)qyxW? zr&7&Jhq?NR_F^o$?u`)9Ez+$B%{X3jG65&hn%TOfR?h z-d+lCdAhxY^!_iHT%;YWLZaW&$D;$(dTnE4c@B%70s?w^ zLyY!fdD$ensd-xFnAYdX>w~jDfw=4A1G8kiyJs;Ru}Jmz26MHt3$W7iLVyEPUOT*x zi+kadfQAPH$BVva`mKCzNRsX%8~@c#%*RIrTT^ZJ>`do1Xt7~owwS64Z*@xp^>3JI zc+AP?gzA_)Ok5IrZ_`LI8KMsX&i#F?)=>q;>h5;VL)ywB9HVX z*$O{&n#e@_FKI-Wu%I3|{jE=5Q>#!bYy&CRfP;ozj`!H#~ zN(u73AcL4BPavMi0_9!Md*H<}+gP3?f5M8f@SRFo9v>i0X?n3(8pzV%cin%!GY$iy zL2lT6pYg76{(qq-n1l{%*JaICR@cn~}_X4h4Q~u4= zBk!3#zef^IRLTMus_VJXeafk%RzR!vuoSWVcI#5I(d@~OwP#I%Q*AcRJ78e z7{>(8vi!!!jRfV#moon`9Z-4lWUf<&iM5L;>!GtB&Ad zZl=H6ocGTbYP*q&P!6Z_Qg?_VTCXz_nqi7O^P8D|pUVscX^PvZ9Qb`p&SL}}fZ%FOLW`doaXBv6#l}*E;yGDNk3}#CNG+a& zimngh63daha~o>C<0z>yw6wYkbYYe}B)Cv;c13pvHE!b0v5a@u^91s7Q6-DvJT2te zv=L&QWfCtJN5&^^RBn8fjLEeKsvpQt)#uqMW(dI^FVAG6XV@R)@ymH!CEpBPG@U-+ ztu!BGonpJ}A9L1vQx$`hl6DsU*;O#me#BFq+n~I~ILZo3A1v1yTV9Kz`gaqx3poiz zt>&TKaK%H%93ClW#W#Nb|AC|7*K%Ve8=pfS;S`&I<~GAN;pp=6+0V()l9=Y^*&5sZ zjuJrYB4}P-2Ab08HJC(^l9g+7)PrQWly{>21gQ;IEs8e=LO@WNv6&Bi0&V49Qd@t0 zl^dq#YZ8{>R|3#qziGu-kK-?~tR3G-Xb>7he%H-KT9x-U&xMIE%xIl%H@Y&q0&dXJ z^6htPDQbt&;#J{A$ro-tHGUTk_HamqW-_Kg0S-=OoW?5aZv~${;(-Cm6XNB1D!H?G zvXozTO}`e6P<U;F_k894K-y$k&w64~ zfpJ;cq35yP{@Rd7x-H@M(@PU#URQ=QP#M`=y*!MVb?5q#>AbZs436qB=r_@L{3K)x z`agWVWn9%;7cFceN+{h@(%s!4-QCjN-73;un+ECbZfV$r0@5W&cX!-{o~Q2pz3;d4 z#lv3zwbq zX;PeX(=oe3>F++1$|MFGvEffsqOU0+U=~$d+3%Yp=Ar|@__YmM>BG%5vS>_2RkS_% znsLB!Q$g-{4WF`Fh=H~Cmws6#h~QDaLQ5TfyS)+T6X)NZHpUGfikr}vNPnzxjwMBO zpoaC9B$ItB7Ji!*u>d?zydJCs+FaDMniD~T++ic)D?-pX2Yp{xYzzekY()hcpZf;p z>|9-K>*&Chw-C)G<%Fs%{il-hFTgvf5Rv095=<5Qlhxs%_o?*JqG`(0{QqvP&JVnV`{o;QPx zBhHP^_JL~A>ZCKj2Ev7M|F8x0q{5g7A~2PsHTR5p8TSniTvMWz=Lpz8NjoD;Q%8i= z7rm3!4*^$tVt2S)v8h4!!NNjl?TZl!S$d&P3(+x*C8mUdG(@Cr)UcCO1~+mSQQfIf zY~eRRoX>WbEq^|1K*DyYqU<53G{Lf)`Xmt)85&2Z z_R_I}BLobGn+Q*FJ|mNtH5Jd6viqSbz-V2S~`*e)9+dDaG;$;$V)=RzQz zN2h0W6x+PBM*Rt-;72rG$)$% zWRppxQxnYazj+WkA3P}>Kk)S)0|~V7v4P0(F=g;vR`CyK-5lq&gh-kiDb8*h6hqQ~ zGWM6px`qTHKbu^VT^0&xb7LA^Y)HJ;8H0E$E4Zc~*{h6F?;%*vv1^s4#P|y76~2Aj z3W16D^fYq~DCP|FM|;977B|6I9D>2r-2UmQ`{Jo(J&w&?eczJ`jz&(W%gSg8m>1WF zs6gvcs22(efzzqbUj|Z)w)XZ&Us|P1+FZx`gN%%#>?R@{{vhBrOJ*|Z0$K2a(_XbS zzshm@IRgWi2-!CU_PLwB8OAw=)EZaFr@M0M&AE~Jrg-w|n!bWj|KVhA#};xbU?^rG zOq1FwWGJ~m@O>Xu!x`_IdD8zR6XBV_TI5ULr_?C1Ox@B+;$&wvIts(6O{&x70W%rX z^ODzHDmuF5QVp~ZkRJf;J}pD;Z~JKn$eNuYp><|s!e^O=r4uFEM(QVrfW*l&@dET@ zlKtKsVlDThTYV2#W<%KpoCYCE#VTWxT1K4sVY_l(z|J`?b)13TTUJVFg0*eSr{6?R z6&oGJ&72CRq?tC0N+aIRi&4a;m8Q~~T3OAv`G_)_>FB(D`odZNsY@!c>yhgN6$d<) zMu1m3iILT)^dpx^A2!t=&6YKqZ*tnkoQ-hgk!2-`W(JPwPqmf132GsEm>b`xs~%TY z3CtFwC-OHkTTDpBIr|2s;26!fdZn-sYGZs+UT6CXUpHKtUE&ZFko5qz31Arm{?>RY zn`Y)ab}lwXgy)m?(or6LbQC4Y3H!>c%;tn`@4TATa)J7aqgMaY-RnP?4<`FNBk&}Y zz7Goq1RQpyDyF>3>6UtBp$g3+I9ZOq6Q8##`|~X|FcJgwyK$#{o`p^mdQmIpqIwXe zQ!pIne?nVu+!~W@;dC^mlnjkn9Po@~nE&PewD_J7OywYb=>prv+QkZ?ZJC z2aeCxmR6vN{uk(uI17w&)bl^Vpb{^Shup?^_=nsMqi(c zC9ct!lu|D$q1!7Pp92BBg)Y!|<3`JsSgmQGaevqwYJv2o{G&;QS+FMp{N~bzVrwAl z5^ZXJ`kQAh;(n7SjLHuMy?t@7%XeYd6UCYO!nOpebHVpwS!b#$mPO77^y#{vk3J8t z2MB~Ny@`U@pFJGCg8YwaRJYw8F_+A&*je%9hZ7qkSj1+mn5&9;Key=6=oWemzG;L4 zE9*!F=H+9E_n9TY(#oJ~BW#WkVKv8B1G^2K){@U+g5FGXdh3DxO^<3tP$@W}Qpg5v zmRPl252rHmH#S@8z9@dnfa-KELnB~vYAohcc)+Q@ zmQ=5+ZxfC@%b07RPm`u!&j&2+IIP8;Y1EmHwUMu9Wr1isle?(X%FbmKiaDZvs85S; zvAkPXG@QnhqLGpMqZA+$L&NP@krxZqW=~u1AG$-uw^vRFpzR7E z0&K;~ktzl*LnBcCv| z+CYq?*yYULFY%-njl8!I^Tp@=l{y3vKMGoYLlbQnpiTYhq?4aY@skap~g z9f(M6GgGx3NC*$A$)Bu}# zYQ_SD-5o)E%4_u^;bMFs4<5k#PYz$=hzqx zdT5ifQ2<9@3hjX}QvF$#hvB2qLX<5Gm($`Qc3+XCoxB1gP9z=Z({pVe;z4PZ+!da5 zvk@L%M-3jfnqYer)c$WIo=H=rY#ZNUBd57IJ z2^$~OX%45HYU8YWyEH0MpWbqKx(Wdht8j0#z)ihJ23iK1q#S90Gm*;4sQF;gC*4r? z@DT0H5Pg_``^D?htfFs-R^x^JmTw7eae14$NJeXZlQ%7OHI3WBR6miH$C5TI=QcgY4n%<1E3Qvd-Hy7zqLFfLV)kem9yEIosiXYY{H zb4^tU0rtpN{KwgN`aflW&Ko%X=feN~7lkV;ieRQvyo@4q`a{|Q+}49N0`~JD(Z7Bb zINB#(6c86~V^P zz`x9?8wi@Y9;)6X{fei)fA~c0OPD`{{?@*kPI?2*6T2X{1Gps8EtLkNOv}oG@8eM zTzw6gR%fawS59LKCJ~CO)5u_H56k_>M+}OnIN~XG|LkffF18P)t<&y*)rV746ouy1 zxXZhO{_|CmYJfH6tpDw`1sg<}XBci!%oq>lnCKHtDGB(qs<{YOje?zd15sKp+vD0| z_=n#J`FqIzZj#Pp*6!D|a=Vg0rDMVV$*_d7~UiQ-(A`SD3-7WP{_a&>=I zcXPF=6{a-V-&fv;+_Y({#sQxUc6stiRbgR!L+Ev0hBEO%GH;TB1cYS>J*xH9XOYbzUYycNUiL_%8cC&9 z$W~^L@%D1Rpl_Qn=v+1k{Mpq~Mo|%%tgr^Bs~Cz((@w#mk@vi08lDg&tI*bgFQ9`j z7nxe|jDEoJM-IwEbHqaPls0KhSAnWfV>BAYN(uUjqIMUt^U5eL&%lYOMD}FqA?xuB z6UzcO^VWHbKEuP00j~TO?D!tq^^EsstA*80Sz+X5FFCv*FTrh_nrBih3*fvcbiO~WQGC5gW_1r5FhC>lJ4lq-_1UG82&n|B zq{Jy834!ukzN=~)OF^?slsfvmmudJO^fj6$D|G40eNxzakFyuARBJ73am=v$%-Z9+9k?b8TcYh_3>;YV6%qYk$5lbCChFDp^ z0u_NfO(4nb>Dmd3Aw>n57*k)~V6?^N|Gpje!6#O=C&z|GBV{)_xn`mmv%}l;hWjfb zWatb-oSgT&EM8`~1{ZB@F8l8vauwl{@9V9(1_wdv#BENyWs9x1x1k|$v`T$xtX+(Z zHKvDACqFP_$sw_YfD>yTq+*6Xn5WSwV~tIsy&-h_QWW|O`TP_ZSz#x4(Yg61b6?7I zE?cA&+uXWMh0Z#McD=3yIoMHY6|&!0flgfe>odEGZ1wK8pP;o@vv!a|Ybxy(7YE0v zERZoOW%VoOMyt(ui*0~xP7Z1qs~BJ85G>+X?hhYEgfLcg1f)O@f#3aE^i{=0GbpTtr)sg6MutHLeiA9tW z?^IOR%7@=hKg7-X-OP-wj;6EgNXu%raU_9&;KSqFQ}?5Htn5?YM=I3HbgY20TC^v^ z75;{Vl_0ey)Fu|#3Mjd_W`X;V+h~6w4!BeF_40p_*JUD{OI|~3+ZtUx%#Xa>Uec_E zv(jj?5>*KctW8%*o-j~bIsxr!zOe>XGD-QpcYMJ|&_Nv^FRH&h;#jhHd}a;$hnKqv zDh`tWa@x`|!>*8>;Z&6UHr)^fopqgV8+eO-n`h=gR2)<#)P%;Sa(n= z%FRgj5~Y-YZkonB)VwZ>186;R`QmGTkdFTLemoFg+=Fy@`O!v*X)=HT1DAh#&|=Z* zTy2`b|0m~%XGZhQE(*mWpbrVIy8;2HHIfu)4Ws-^Jzpt67zcSa z&b;O`H3gG23kEt1i+^XRL2Rpy5b?#YWo>CR(pnYznQ?LB z_&%PUyb6IATSfiAcb+SDG^v|-y>z@`y};dUJft)OnU~ay8G9eG*W!7(K3VD~Ugfwa zXPjt?E8Bzz{PMd2=U-Mplce#G#AtypXq{%~ipK;Jg)E1&B}&*`o(!HN@NuRkl%~dm z*=tE46v&lrV7jpzjScp#fSH9C-#)QWM_ozfen!*-9iQf>@s$N5s5$+3(rMh0xTLZv zY&Nk!=@=L$g-5u^O$%CU;ax&)gwC}axB+D zBR;4P={!%=Pg$c~5cl?zn_a^(?-!j?n z*t`k!+mSs~cY45d77OZ%?$0gfI>Zn){h;Rt`|}B=)a0)yKhTl0qVDA06bG3q>4&1R zIPc&4G_>2zuR_M=2+Q}^-SE@q69MhKy5@1bus6J=Mw*R5opAj-0&bw>Lrgib2#dTg zr3IH?L8p93dioHgLdhTAjDfkGk^8OxlZA!f${yhC;Er1PUu2=1Z*?-FXbs zEjm=Uzu^!GHayay&S-LZ-6wEw(^euB$d4hJ&bvj+PMyxXYvVnBXfaNi&Rih5_0xL! zEk|f_x608Pb7*MAujOdrJNpdXjB=^<;pfH!5Tqir(fTF2CmL!AY@;KTCn~!`)tF-g zM)io6pM8_Rg~thYF9Y5#W{2}47%(Cbl~gh0y+ zxU7q%0Jo@QDpjS2+>9UwK;L+eZ-hhpD`@C2I%vY6wP-jcW z7be(;)khf=Ut_$)$NIFfpGZpxhzo>yIr_sgD*-=&d;Mr+OkV_PZnC<-~x$GsB5dy zX)H2?5E}vt+P#&PXX_M|*|x%Bs@h{&@Hy<^tdqXsfdvPaT^S=iomt4AeOa|%Wx3U3 z+s)2a81M$Z7Gr4J^2KZov3;EW@iBu!IrwxQXHp&9A5e9&-cJK1paZ8%BV%Jgxd`&! zq|M#w1?2wDgDq4&ib!6_9P?%DOZb!mtGpj)yKr)kc$W@;cglTFldhm7MSg>^^`Npz zr19WA`fetGnBLw#P&%M2(qI#`9-^iku(#lk;RFc-|83m^JHTh~*k@#E|_C0kaq1)O~+xGystgf7(UkED>a( z(%0dVZI907%EVzBxmY>j{EEd!r%KQ-TE9WSmonW`L6{m0jwG;Iz^zPB5ECtBO=S#3 zmaR@4;m$Qx+)vGt78Z^aU&8&`A9GFo-1xmC&#G5>d;5sM+S#rbm{|rIl`fmzI=@Ia zI+{^&UX*Bh7?iy6S&DiS_+xrC+d-c;1rCGN{|hxs3wBK}xofuL=4fAtv8^<|XQYM} zj=*u3Lnu8ZnQW$du~doO;~pU>eUet`2XXyJ^|%Z+SsYAxpjGaMP^h zURTvtvlD2ieV8Q7W(s`jQgi*e^YPxDh9?6_EWV@MN(Dy+eWPZtr4S*jG=8x2ASeZu zm`_lvR_G7jyLi4WRHY+!4z415(mHKF@|FvkjUVd2xzl2^r~(}##LZ<7fTH+)hmm2C z`dWz~C?*U!Le`%f2yg!c3Cbi7=nJ=lB28fu-N=?X9u_{G{Q0A|%HiAB_q=H&Yjr{r zBW}ATw;OOy8**i86*n`Egm&$s9FL1G^iF@Z8|e>LIIIgsh3~)fED1J>>wOcS@Wpv2 zaE63}9z!=w@m#> zQ{I2Q(NJ)M&oM$yPG_&s$TO}8CLCDlzr|rGOd^wIH8EKS5!&1W;?b*GP%{e`hY-Rd znY)1-K36b()MO9Nc&_xd`$Ta&rd!{OZ}gB3TLJYd)Y0w9vSR5xcp_ra69tco_&du8AhWZoBsCnJe|Q* z?wV4WS40f#QMIe^iyE&Jc>!g;3_5Czeq|J<1RB}*g!414mSzdgREe2mX)p+dzYgLk z*g5oz5}96*i7ywYc3*Fe<6W5a!|4|$1kDKNR~zk@OBLSx#U9yy5n8CVYOTdYmWJ$; zTB)S;KU@L|jY<5SMVEfQ<<_f2zTnISY3ESI@LyI!4@vL^?F#}q)2eFsqZKibrj^EI zpFj7y-^{~b*3{zmV6tD?R`(5fz5h8DhwZbn5c=w5G}Hi$+ZVRxwNzVQ>DS(0XCg2XfYTf!q3oXcXaaQ(tPd_s@8P4c{C~U;NIhuYvQmDDzHeASV5#lIB**jGpy&a z4Pq5D1jP^E#LC6fB8+@6VxY)A-#EPbBKJNfDhokSqWyCNnbd(2Y4E0A8V{HA^%*bx z*Y0POf}rn0Sn6UuooA+$O!4lSBvzpzNS>}jwiqed2YzK(Yp?5CM$PvJ&^(u42#%KU z=8D)%hwoN8{D{lv%5*J+Svi6hLoj-yDqRmvsXaU*RHX+$s0_X%TuU3-8-Vzm)kRZq z?g~8WT?$zjJY4J&Ad%i8suhG6Rp|{sjdK#Tn)zwxBu$yyDbWA3V1A_}DE~$BR~ejh zUfT~%u@o^>_liOR&dB$qt4m59zsG%hF1bHbMsXO zY7R#$*y>fTgO3&imq`*bGN|bL4i56aJVx=CyS=UxD6Kcry*{PO8H%Q0v4C_=0sBCS zM0)N_ft>BZ>kIVW1v^K^!|VOF?tGD9Q))ldY+}_o87xtl2-YT-`;Sp4E{k4HXO`dg z+ia5fd@xm3aVZh7l>~6r8h=W{5ZR>)^fKx>rctRvI{fD4nQB3l%Q=A8Kd_SY6BBqO zOdyzu$AxYP5~mK0+vU--Cr?yd_Ot@Ey0E@5?#K*=*zP2}ULK9th4i+5-5MYG&}RCm za;CN<1j+NmFDc8@&ez0XoIgog0%I?#^P4w65|D@+)A-sRuj-|j&lIa8R2jW`wew_Y zW3GXJB^ZkoM1)prQc~k@hrzS3s}%z#PSw|yIeIfChQTr(2d}%$sCDnMIs;mk{NzfS z`F>a?K7UIBLX`WjZwfouK8IxjuXtbDV~|H+1KIjBw%luod|sGG?`7|&-#E{7QG9MH z)Ca$X-`7tg4}v#kf`skdQ1Zm4G~yxysX6W!JfiS?eMi6$!d^YU^;&7(;jFFEz1<1K z;)-U`H4161-U)Tjn^PRIlNz_<6r+J2eaFlpcM~2@%wW#dpWoj9*qyz8V}hhJvMvI~ zNZxxrA$ygop1dc=VVzeydDA+akiLj|_(7_;(jdkD8LNNbJ<;KF;?4P{2G6teqg5-B z;QE2$2wqC^T!;dKe(Yi;qa^jO5DtJp^pBx&lKuS-CF7R0b1Jl?-_U+pC=48Lb)* zyzaylpJIbmd?^{qs+cQ0)K0)Zd3Uv4YoFr2J0o+*s3MTa*j=U@aTP8nf}{NE4j}XQ z);TBewMu~tl#8D~R1OZ1>3;c8>nX1Hjm7~9x)S%MY8Aqy#vA2F*m}dV60bW!nf#^Q zD@P(-4UWs!i(agLdrd>AEIMMG%_MA#RX<`xg8Rof>WM{P|g`(q(uXblFQ3d}e zEj_)3LU+((T^PD$>VKmrv$x#g7pC8#Je7wTmOi|ILHCx%_$>x_mqpmK^viRWmMfR@ z?MY7ER$NMpFUs#Ib?Z)b410fla2#NE?PbR($!$-*BP?}c1Z3E;2(-f$R>2{Eo|T{L5hySlU% z)Q+nrXYJgh=M6tY}4rU(ir!c~0zE^uEdFjozqp_XOGstAaf2I2sgW+G$ z%hfJ8okP`P+Nx%Bl{k`K5;p5+S@yegiVPFfUm|OqcYgveSr(;Ti&)K=u8%exevW4? z&gKO~Br`!#4You3MQ?n_`s_ax<&d7P;craJ=o`O}dxe zp+?z(;uPea!6QAE4MY{5mo6J6J~v1_-#?+=JiWqbTv})eF(UGWQ;6lOC{Wm2q6D?P-0Yq8xY-(yQEGd%(AE z=A$B^b>!HDuMf&FJ*#jdCX85rM^qFcdpZ>3Rp$m}3FsVH3aD@~q-g6tc>Ikmkh|!j zuidf0`1D(0|B*htvY#C_s35X5b5CNh(bE@IP7%M@_%>I{SZR14Zm&NsHoLpgTRyS? zqtum!VqDO97mpaLk-k*$hP(XC-vdVqlW%wNe(YdLTT3fCkjt@GO{cYBUgA}<=_2R4 z>B9xRNIduM0i~5zhG4%MUCrzRn8Fbf=8iq9TLNlTPFLubxA&G=&B3NLWKh{{j2n`g zn!0#h$9U=u*iiXe$>uDrxm;7a)6KC=F(jAECoa?DJJC=;1mWWozhsRxSIaw-lWRRWy9K0Tpt=*Kri5KSw zFg}Lei^6Hf2x)%)6S^)1pSuRUAdhoemD@pE04|llbn1G5&}Py|?CUHOK@+d#?heEH zcN-8$J=9j0V7sT_m9cV0K`7Q0rKz!9f_3Dx1e2|lQ#2bI)V>AcdtkKH=T{CwU;vS= ze)pL+XUy25(%D-nxmV4hcsJ7ddCzOQ1 zL$@{dC7t0B{cEN4R9QPPoKEnwYotFVUu{`vTklINQ&1d-{|<8`*FNxGM*JUHc+(^H}mh(ZGk%~AV2(D3&5ACS$P z5`v3Ne+F$M^XkU*5LLX?_})YslAA zTt`ryqIPPf7Qf|5S{aBJ0=L@OuZ`381E3r6IDh&I3POOp172PK4P6>y3S-Xw;qRiQ z0#F|Ma;`FyE)&|om;VB;1gbD)yBY~HxS?-L-w-;Q+s{02oixXa90z z7Am7u8V?b?7~>rJ(ST)nxIBWHv<{71O}63Oo2e0VV|byd_bdErb&WK{NdU)rPm8>C zxW6Tt8t@7DWI(#$U%ebLs|t40ZDsT; zg|6G_Dg%8MdRtNjdduEh6C=VA?uQINzH2zoi`J9=5LH8afI8#6N4}yug-;ATxaRT9S^#7^D zPw5zf)`4M<6dDWoJEeR%g;JtApLH@mwHmt>=>h3%m#2Vfh#RC0r|&?x$XmhG2P*DE@%jm zVX{Pm*~pW*98P8{HXjFVXQUY49V`$&9ytp~5g~l6p-yGp7F)lWQmB&g7@UwTqd|yq zk1&z)G&LEESM-&f@-Ae=KQkZG=uc)htgReot~* zaKu$J=}_eeoTG&ttKG;N3Ql!StBLrUV*|;d8SOsQ)Ul#@==<(NERU;`{LS%ziKIU; zVV4kWlq>DOHtH#jV)gLiD^6REUtoMd&-wYDU$#_Yvr+*OfFY4vQx)FP?}mv*-^)se zXXPswHP5X~G2mwx>+)&yQ2{d1z7;HZVL03T%r6|AsUS9Q4OUCe$U>v)!Q*L^hzmS? zIE{1|mCk)LsHy+i9A^whk@XYvx=~8rlnPLyMpXiM0Uc8Q17vM*h{%J3>mFh}<@-Nm zL`w*S8teDYj^|Z%8)b_~NRr!;A&TtB1nQqjz(T`f;X1>6l*N!3YfHw{ zN`sVD0jACb%whC^SI#iLQNmnJd3HRLjahxmbZbmtG*O(8?s0i((uT{yI9YJ)wmXAX z?gr?=3PSW!o%v65fE?*CUmM)alL@<0rTp$6DK!FC%=E=S!wrhy2LkFp5e4dZ;o0*Q z5G;Y(8?t+rz3i*7mamZ@9xj?t50^1%^OK?BmlX?5lJZI^6o5YChMF=}EJddN##JG--_{CJN8 zqSaDu%cZn>1Pyp!jh0t30w3R>_pY8^rN)RH8eVB&`_;%kRw^m|z^b27a}B01;n3IP zJkzE)_&eZ}V72fO*DnsoXXY*_tdb8)s7YlmB1R`t*t2;`U!rg;W{Wv*j;dJc0fOUC zp+dAjsKU@1Kyb9<``ZlRrmQ{L69dH>U|Eg~M4%Q}zsDiPF0GO0)1>nQ08RuBcS zMygcP-<#74b2@qhd@}b>zm6uc#Ke#|#Jy(u=4zmPZ-j<=ivQ;bt&neC5T#OAtv(U# zkM^6X4a?(eQ7XQuNO?zZHKW81DQmMXqCqdqUR<;LeRZ-kt<)4pGg`*6B(YxaeQ88< z1AGO#7Ig}LuIv;tk>i51ww2kr+M@Gq?I@ytZ0B@?L%_^Nk|ll@x0gFJ&db{Ykdtj9T>+L0i!mFGaPmws9ya?n)C>)OcnXYFIix_d@up4NT|ET_U@2;AJ@6XOar zt8*r(l;dxT`;jevD}@ds3jlHE*JsZex4-k%u~}=e0165t{vF_jt{3koimXH13!UE> zc&{dHO_Y$UobPG^wJmX_KTBuVPp=njpv(T9fO5pNJ>B7tj8yt70SUmBPpxzXZNT}5 zU_`t>F4bKmQR$ZP_4PS8u?&hv!14ZMw>6v!$7CW?R%srB9yXZF_TrVv_cSvQjV>n) zVg2_WO<_L>!Yd%c=aD+^9N&n2HJf2J_%XVGw%%(E{Jx@>NQhWi-Hnv0aE|g~_c0c)nXY4ptawCKYE9ie8VtSQKhE zeO42}y|_7!5aGdM@}_sS4FF?t3bq(D_crz>%W4wFVB23M_o;twy}#3Z#xssXU^55% z9yWU4Igh;Q{}MNliHP?0d&P3(rP{71)E1tqtM2WNTR$I4V1TtNHXZRSkH>t1P8s_` zC@eBE$9N!;$mcEvvkehz6p2!eo~;Kz0Fg#i+)iC~t`GG$0nCH+$$;6Bk0FGxvpj3l zq>loxAn*O{BWt0%T%~#yHm05P9t; zF{>|3gz@MrYyG+cq&hjP&mBFkObqF`oL&ezi{4F_W^-f+Bl&cbi-Tc}l_rMzvfnFC z^(z{!@(=7u@&J$aQR?0iGa!Yq(@Z2~I516Bne+m1APXiN0K~e&b@HW4WyVLq?-j|& zJ3B%dqet|2*C%7I0Z~n4lZ?79nm06&?cg1o{>vtbzO?`SQX>ikP#+S*y zo|y(}mF1@|`B>c@Ut5mW+bPHH&(_5izKykIS=z`o=Ez_ zC|B=_!U{rIQ!{t|U$K!n$L{dbN|`tTkOqvh)>__&I4)Eaen@HJcK23>hOj*a0Q50w zmZIu?qr_M7yr5?W04p>5u7pvrQfjg^jGkUWhv4?&cgNee@^_-@-_w1pd#4L4NUP6w`0F983ttJBFvZV(esUHEOIDSq?zB2*L&@#p>>#GSR*^I6|hGF z0#lw;vo;hkazqx;*!((H-R63AGRZtYI^DEyq(I<$1D}YTRn8T6nVAL zf<%=ImpZS5N8=x&A&Q7RViex*SmJU9VfaOsk?tay_>b-O&zKlZEu$K&0H4ZX%fYXy zvvG5Y0PtWpL6&5^KLFrItt?fmyH=zK%L?B$5%dQkWKp0tWOv&72r8^tawHat<~{`o zQiq)JrUG54(NY1Z>V^7SJTQPUBjWk0@2P$sV~+i*0#MUbjhD)%Btl$UD)USR-ifDB zsoY?~z&vGH{j_bUZn4zh@JUUM7q8WR)inlTC{P)YbJv&BSoB||3lv1km1k?6L_DhR zpX^>n!SJ`@3MK+p#OP@?;6*G8)bn`sS$f8bD6`5y=942+sNNThmFOB->vXFSPF5)~ zN25uSO;o5aZ@S3q!nCU9D^|OHM?S#q4LpAS>Oh>AGXdI*^h6dy<|1G;uFkBKYs@!+ zPLWKFUweOR)3Q1A-9PqXoiYzGmz)b!w*M=%?(raA+v+sMg6=iV)oJVbZ=4G)RZ?c3 zkp`E4%a`enjqJ_y1>#&uL(Wy`bnjBd%D_w8rCRDeYR0+I;Dxf{=~@9PaI-}cw{J&e?E1)??8FE#U#J5q|#i{t3<`ZTS(^s40)<#*&ccDv) z!KksZ6qF>DreojoYywVwxmCQ3B&!S5t8i0l8J`y|r++q$VOnnz#qrb-PApP&A^7PD z)ZO~8$Rw}6E~^k2iMYXLPZ51#G3))QzB zkRy4wb?-p2)z^$> zavaqD0|d+7h<)Fv3d|<*ZKNiM3s1XQAWo6ovG0q3@_ryGuF@)Th1tmg)Xji9W0H>6 zEhB>N|GPiBVWFYw9_T1CGBV(H8T!?j$Mw?EV~&ElCj;{aaGfgLt6=o(7pcV2?iu(7 zxDr~eDN}{!SasMq4Dv`xDb=s{bdi55d6hjSlGOkDyw$;E0DLHfcB9-@Nh#Q%S$*k5 z#jpi+mVDmudakO=&`{zr0t7UaQA#YgB@&5LE_F5~(A?Kc#PK3+&fJF|NaFiwU91h| z6Zp#-L=o*RP60Y5cpQaHB?QM`9t;T002~Fdc?j_pQ z4)6P#0c!^6tC3FUd!M-7DsyCZ{gLt#!q@;F)vsOkM`-)@5oXh5_*tMpsAq#=opqS> ztF~uhc(b#}O_B(>Q;5F5Ktuv)PaIx9_Eh-2zvqE~`OXuX&AEohQho{j8t@TH4r&GO zWf(L_kEtdDv_S{s)8V0P*X1^VVTOl?fdd1VwYbW%3e!n_VAN)*(#W7fD_6=6Q-(U0 zO7)2k0H~Q`@Tr%JUlH-PmTnBRc)hN^F+eb?^r;iTEwi})j467_sct;a8lq)q5-TzB zpURc-@FrB?BDQdkN3p+eWUW7j*p{?Erm5Cin@co&5WErDm&#>PW1cev2{JhXV&AWi z_emFcWClI2yH@w!hZX9hc)pWKKf}0(!?NOZF1As)AUQ5-;DpBC=Yuo^{7#Z_lq8>% zVG*J3zsxE^n9b&9YKmqvMWnm3hR01T@^ugXAVS<7ePa-9H;}Cf+_ih%96*B4c7;!-2*e`YO=d< zD-=hW-hrJ+y-y~uGkAIYeHU}i5E_dpl!(m&?a&PZK^Q~7*!MBHdn9HTx%?GLl~KyG zUcbk$oaI4jkR=MJj<3bNmTq1sFj?Z!>;}c~E}yix9Xy}(3@$)EsdfmEUo@y;!g@QVK)9H#9TJ^5{5@i06De_x31G)k*D?-)c!`NO|EY zktZ|0T?iy>pW7NZYm|Ff&o6Iz;k(;3?@*ukKC6nQ(?zVOcn4KSw_Vfoj&!{!ue;Fw zv$$30DBGfN3({km0-Y8KzWW_Az8JtX74yb*J84hSgCI z{0Kc^p$Y77-!87!2j2%uMG~*qOxHP9?s5bmr{Jv;0i!6ftlXq0WfN}kR~6{hHmwu^ za%W#0)j->QPm|`e?wES0?$D6U0+W?Ob5zeBGNfPQmCPS|868Z&zsvSCr*v ztCSom<{<_iR!F8=2*i+ywiw8tCY%D@;C$zDWS|J6RzRFSS)El^2`0SGXabCs%Yv<|qNJZ^2bY@fs#<=4mm!NVlNn8L8A zVBX+1x8{B8mwZNV&vb>HV8g)+0q{-=c=`-3X zCy;WU**ZFKJ^_A!fj^;ArHum#?q@;P`UZ1LBdkGXvlL#p+-oQ~TRN{70jq#i6xVp! zkIt;oymar2eln5aG=xCT>cFo+R(vPB7aScZaY5xm2@i7?;w}+S>u=<#%H!cI+1L{oM5O2%n-(VNWUU z$%~Muy)Ts@8Ou8VUuuv9UxD63@#nocOHfvjD+C#|UiOEVZp6>`7?YUcmn<9@@VGOp z*O+$K;s&c$EGrK?wOoW{At8GWAhygDIQv00c4d5WrD?g{RMUUipE*z!;iw8YSg zAr}y03^HFC{enIIp(>w=$RFy4vZ9J~lmC^*+qrsx$9fZ)UhOI;O2B|GWwOV~5-;_< zH^Yy|gB5LH(R&uH=x9k~6a8#g)BbRIjY_rFW}49jXpSA#fs@vKjA|P*HBp7eQE^Nr z=yuZYCE5h1-x9JXI`3{ll@Ck#<-zP29w~^r*3&1(+#b$5KsEI^ySYF-=UHrRvFQ%B zn{Q;HRiWmi{F1|A`=OvO`kJxrhzTlguLKbvR4RfB4ynn>piNb-#)Bofhf=URv44W1 zQtlc3p`GE8z*2nv&9jGECxRM>in&huXrH@~c6Y&g_Z#+rhhfqjrnlMQA%3-A&X0~L z;;b@(f}ZVBnr~meL9%7jS6ZDeBAoljm@2Z~0my>}f|_#(?D*SQ!%lw>zF1u%@~$>ekr;W$aEMS$LAs ztSzUeXoR(^0_|Xb`v3Q{zy4D`lvUC^lnkh$6+B;!8h`1}{GS`=9_vC^#sfhvuJyqLFK= z?NjcvNOB)|Z8P}9M4A)AZ%iV&MyXqHa|c|Iz3~Ad$u#dC>GI<-{qDW~3Zl`>ye_h>-2X(9-^pZNNJxj2bW14R-O}A9-KC^T zw; zlh4XYoRf?Oen&WI-xpf(K6zg%7si!XOuGV@9oVB&n*@Nmr{aQr4G1fM4FM|G2L@uY zq<;r=|FwPsrP8IZIpW`ylYox9x86_1wvEh7fdWTE%$2W~idmSfwxT9kLK@gnsYYqb z6*!KdQ~)ICd+swnkpgB~&n?!Kw{bw)lAJ%wl)Yg^YR=tHFe=L_Y$#2oToU@}i=HH| z&)@hL+wNH@j1u)Jvl@~swDae0^u5JFd3BA6yef-rVZlebx*%97>T$AR?Th&1p0tv; z5Zz(#L1p6RCkKS03ZR{uAj~8lPGVD}TpaG28xfPoXI@nJRk+8Cxt&Ru3BXI%_Mq*A zH)@~*b-AH4SAiv9?Wp?v)gK*yXl{EymP4?~n8cq=FNf?G=zn$XfOH;?QQkj8Qv*@v zss^TS&gRH<-zQ2NL6*uRT|R6_3MxJdSs|Rx_EB(O5YrTmI#A)tsBbt52X z9?m*x-&|Q?dBMC_v_L?Myu#3`Y7`NhVE1+WB0;paxA=AfP6yB#uMmZ9yXB@s&Sv5f5VUAILV6q(s zTsArS*GrY5*2aKB7ti!qEdJwXr4pSz!2_SKUcVe8eLpOWSF#+rZ&KL`Psm4ISsZq! zM4R9d@LDr;Pj?8X3M=HsQ1kcZxIS?>jREh?Z!}eaLs#)Ngt#m$KY+~O5#o^aE5!0} zESgFhVzlD%^>!+KQ z8N!f`W=gaJkDBY9EnwQD0@l6gNK{77TWVn(oJ<5ndRYQD1(`nSK<{u;I6~QaS|L)w zU%}f-9nKZwxxuZ0R4tG%1vI^J`N?RN1>RwvDqpGI1qkh?(_&av0y@e^D7&81`r6Ev z+=<33Xaffj^&-*J4PAq2KI`CRiaO&Ri*#{r z?o8sWeFK=|S7&zyV>6s~YmyJj0Ga#}1hv+bs~2nQjeJX z02Bsbl2jl+sCuG0%0RY6&%^0HpGVd1s1LSMi zG1(?NQkSn@hL@My0pk(`L2kE;HGga?3#*{E#{rc9G>{}?j~}%!0ZgK^~yFM zZOz1xllFX1=J{?=yJWxKckBC900fvInsU^uzvMXsLU|OIOO`ax&A|wzcKK@X1b`jv zZEaDc+19?tl76WrU5x&eDV3dbp4)+EVftb`kXgLPplrs2(D@7iJ%hvBV}&_X#GVfe zkUt8{Hx*VmI6GGfMszpS}i&c3OZ!4##t|k~szCC1~)i-kE|bsi$jD*u)pG zEqpCslv62Q3a&;(v_kYfndSU4d3sMV9!C=*)%b711_(L-BJ0qHm~1RhvgybW6ZHR# zKyNfSj=7(BZ;j?F6luU3iUUe+r)Z|-YycSolW7D~bEYAqIzD@zQenm0?KoZzs*kr9 zMxg-Z2AiI8|FK}NNN5qG>bqbjl(0XZf(M`GJkLD~%c8be6dhVF#hr4yhaSI>nvt_xEhMn5d#DKW{q1#6ojwtTwZJoqpX zFlyt8gcup*?)e4zW<&8T+S2Y!z~$5HV_!8EHj7<|=Dwzp-G((UM{;;=d%NATgjcjZy__ChF{#a+^UNzaYGG zq09$ym!y0lB>WOUqDj`#$Vvp#kG_J5w8OVk9!B9oMaA0HHEhb*je2L zpUKDX^;*@v1sMxktfYc)#Km5HF~IMm-%=LJb;oae0i2i>h)j;bdY|{3&On;TA2GDY zLB;AU2uwirNsiHI8C+}^n*lzsV!uZqd2=K}I$(MI8SbfK6}#%)El!oew-|8n1TI*w zN%8`_0EeYd$*XO1~Gl+x~Byc!U;C2wH34HifChln!*Z~3k zzuwIb-c6_iU`k*;KKJq#@QpI-kx_t*1l&kM8hHZ)1JDQ88xE6R0}cTJ0TFRd7>LNg z=D?2uh(Uxw>_O7e##ep*>z-HvY39**B0?eW0r&786vKtrjl~E16I306A8BiE2k~4_ zn`zzuF=j+)2DC_HgRin-#5%wU_?aRNJ{ZJg^!+ffvHeS@f^k^rjjui=wX9|H-GWkn}<#KC1GJIj;VQsDW5>tJBOJn3i)!{ZlUenAMM5 zQW6y)<&1Iq-749At4>GW$ifP3IGsL0{CTThz2Om0BO_o7i8YwQWhRdps|@_&SyBc# z)3GNY(SYbKcoXdJ%hL@%YTF*>eYP3ax6_if-I}+Rx#j ziKTq@Yba=F=*N$Xv>Kf+j#hg_T@Ah0DO`)9JXkan`B2CQB!RC(r$X;ktkoM~2x{<#2pX8MWK&Q< zsAl1?Sb{F%WUpS?e+|LAy}iY1DSUny8QIv>x!&!vrQz^cEGDHs^{Jy^+WKHR+vTcutFGbrP%_1ZsYCgq7nng;Ko#k;z{kap=K}k;&+ht%t6>weDdxq4q06`4t!FXYO7C64T_#rGXgs?ThcXN5%;y$eG>Jkl_ zu$-y+kUE`A(qwDA0I!{07EPxqXY|Pnwhrg7W=^m3*y8UIgkd0JR?7k;XzqmZ7oDu3 zQ`FAY>Kq3>=v*(QP2ig=&d;AtwaJNdC;-mSSXo6BB{+8>bz}z4rr5*$3Ou2sP0A^{ z7sPp^{7Ig>V^`^D9tCVE=qVV-!Vn5~2=_eF{FN2y8fkISIcr};2is}vTVP1plfYW~ z48j@!I^a27`I3MiYaHuG%sS~I%v-nh&l4PbNbGM~Z{4D=iTC!$-jPbM=Y}0DCxgu=aR}2|4VCPXSm-~c+a|~GlFk{R zFn~KD9JG-q*^w8o9?*O@S4b=U>keqnCPb>cwp;**&J9RUf+mSQCh|C`(3bf;Wv{#L63C1zP+@<7@41|GUCNjjkC3fF3uZcLYGf@3hPek{}gTHWvWJgHD+mlBGdFApAqu9T{qU-<9 zq%6e*3P6H;)@PUz+2!!Wk%VU0yViXR{zljZR3Sdo(Zd((AoP z@!WgEx*CIYcF$icHwcQ}E`v9i9!`JZ>rw|>`0xMuY5cmB;z88r;Scpc zOXh{d5A&|KHa1^3Hc5zE;rI6vf`50Jy$;oW(sOczo$O6KcrW1K2}nnA+RZoa7DG>f z{Oa86pkEKjEjGHy&dqyG`uKjM{dyPfHq$$SG4}snxQM6~f6OeGjq*?csK#IKL1ZFm zYE+?ipkkoE7tdeAfB$uyFOv;}wD^86-v4if$tB+nU86P|Y=11U{eRx9Ri3XAeN%ar zFYo{1p9?v-P3?YdzJCpI?4wlsREW}l-pssqz&d5|@jp*Q{nYg3oBPX=+>VxiKHA|M z^(~`))4wlFV`z5W+*UaC(2oYP`Sm(e~0D2HqTSs&ge}yThRCXpSd&MORk6SIa!Z;4%YPVqzKxrudu0Pnc+PB?+fF7 z-9H%C;oA%T=Y7|W+b|%h;ZrgY|G!^?BGr-gutd`7bpjCWze^zc%H#5JE2B_SW5$0* z(H3ptW9a<$q7Llazf+!e;nvEol0|+uBm196tY;N}G<3dQ2>b8F^G*^vvES*m^8PbN z+CFqD@dasMK5_mmWg6S0htD1KC{S_}e6d13w|FM@VC zlO?;I>Oc-k|HuJJ+>HbDqsTShhz5witFV(h#ZesD*I{~qBpo^{*i z;0xJ*Untw~_IhMoVeR`0I*^oqUbM8iE2@%pZ08Er^PdUoOgFo0Vbs)U-~(#o@5^L4 z&u^$`hF2A*|9!E*!NJiF92e;s&Xb;Y2@k%0B7(dpGgm*J0xfy#qOjSq@Mqoy4#ukl ztOeC9x@UFDUD_=OswPzPxRgApf3Oa1))OZ-UnP(0ZOp(YOY~IpjyvJ|EIVW2rxrz% zIR2g&Kf<>cC$Sz=rq+UOkgagA@{gPzh1%y_9N-aD2iwZLOT$HTjTqD5Lyi|1`4QfM z_`l9?^>RkR@{Xc+VPUirOWo5Ic?`QEd-R|>+5 zrY&09^07EBA^9)$mM3Sgw!@VaC%btgyF#|mS|6ABQR5%+Q`uj7l zi-|FF!6hpFV%zeH?`{w7ci!VaAI*BIv|nCmEa8yn6D^(eI3wS^#xojR0Q>g>ckPnC zaRsuY9a4uc@fxa_L3$qh+oX;YV*^qhP;?B_0N(^t1DW6NB@Q9Pv%6=H2Y|*XPUA3ML_*F-5ZRd{qXb z4*f@BD6+|Ej_qEYQ7mP#FW=qnN9)3kkrf`SBy)h>^Uq`aIbFViO?3vft+2TkO~yQ3Yi z0dh#u<6cBu9EZd8h-B1pX)v_}+fc^#UoSL)8_5(z@cT^{8v9+kSKRax{jYekBn2j)9pc zH>2Q7%K8y$cv~47?|H2f5F9vjz{cVnxvcqa!R1lko7{~p9|Q@ zIkO9$@{gA0zXCCz(k!iKkN>NP_3SNo*!Ik*j<>7lm-jmf9*$1_qi@pn-47Y*w$-&v*9R9GL%V;ZkdxL!WlMuX6tC>Q9)DnIb1w=0xL#NR2f$%4BCV=TUym!Y7rM z95_!CV4$Xj0O<1HKOjY!NI--VCq9<(SM=pLIhK~c5cR#CqM`a=D&hY0_w6;jDr7+| z-`74X5RLW9cvuicT07L}d;IzJ{k^4~2F&1LSBeHu2CM^sIlx;)#m2q>W;_6S@~>(g zev6mhJ#G8v#Y=;jr)vP;yT{s|KJ|6_X!Frb?#yoc_qObSytl;#VSCVI%E@tG1H0AO zm?CHx;8Y87M8w3SH#6+N<){>B3|Uy&HpUCLK`1hEdU|UB9S{-{T1zc1E;{Ya$o}i0 z{B4zz();)UoXyMoTutX!Cw+Vt5CP&HC{ZR3nIQ*k0A@TrJM%Srf`GtfxAq-;$jHB5 z^r?hqxbfxmYpIxqT7DPp@qV{?SH58Fp(pV@Ra^{jt_#yYOd(KGg^8(()rFpC60^PxWujD@sFx)^l=(-`s0BC5V%OQt0Xubav(VVgGxiJGc7b zxYG)MvlgnGMCF;o3tvc_C$C_%OE*@JQKvv;#ReQpOpzR*5%gAb4c?zM_PdMPY|WhI zFthi!6`$O`4Axx1bROCdl~8iHW@*NrYwA=_z5W9Equ4^DsPI!7%7@=evgG&HGWK?E zz50a!!hD6|O_Sz=)2UM>-_T&_Z4*J&fdiF`?LakMGT!)@q%5r3?^(AIbgh!aRCe8u zu4u6OK<4h!HWJcBv_IcR!*vmOW|dv3D$9Q6tDVijTBnIV#aY{XL6{>*`g^RbM009c z&1V-Eq=gI0rTO!8Mx$CAkx$&OVIM2A!J&=3X&iIaZZ=4URyIAp9+chHqM-T^@JqXq zg!m=@{7%`kWpwkr<>&?vj?W#PP@dEvFiiT@fxtR$e>*;7rj?9KyJ-Q>S%C=omqHQ6 zMdqQEA8~zZlCM@zAZ@%7popbfOClA}EP!#7Lz@z@A0x#2-L5>_>K(>0WK7&f@ox!S56{22@8VNZwfg@ZsBaYI z){O*Mip1KKN-lA9T6t!(Bu>q*?!JeLAHoUD;BqRdNBS$<2KPKGTrzSVk^h~ZCe}nxRy=V2J7H{Vw`X}MUK9f=_XYV<=Z__u4FD)(IOk-OxL_%@|YsBvyXP@y`US;NZ z{WHPf3CZMAKOCrVdag|GYF>@8bW>L1a~fRG-PzgNwjFIK=2v!(9L;-sB4{5rIyP5r zfGRbw6DF$Vvmf6l*MS;W^;MFt!<~Wg*-}?(74HBn1nPI1_B0fNYAJqGAQ3d9w=6J< z?yhgRJd@E7;Ay^yozLs|KyE6iihFQk0{@x785FIu$Q%toU)G~V%?A`&G?X%hc>J#b zk+?S|{E3(14W~3x8?6qNO!L!a^Z7g(3Z9jkLq)w@|L(oIcGEnDF--N`Y4+iddXuyK zVvr`KR+(p5_K94&3UFQY2;bQ%!|zpkFZ613dKZ9o8A&B1MVbuAO*^kZQh>?}Q1}33-sBZhDZfx` zbjG%@5U(_rMIFj&js&S5%x@&6Eu3)!|1Pdo)HgaI(q_wflfn>j0>uI^-O*5y5dB*F zUb<3^rQ`m}&WfoSn~uwo$X+^WVp^^T8xhVzeEOv!iS@_KJSzA^}GTfs*zz^*ZYbd+dd}W434NU8I zqKj)$%=%w4$vr+iJK4Z?=p{Go9$mj1z)&(7K8T&@Z0GT;1gV}N{sxMQl{sv4T8x2& zGzM4YtOQVKbI~1CKLZ&$=oo8-vnwN%^C0<*;>pf*wO}lhfv5;;>Ac50NNzU+j8l-n z^_^}mO(DAMq+8$|X#oS$iUhsf-;ov(7Z49XwmFxPtA>45eU zrIC`Yi~9E&$N+a$Q}A|^O6Has-5Jilu^~(5;viGfx4^n}1ChFoxkfRN-WK)|3eC~c z@fM`NsmMfz>I1mw-Zkz(KI{e#UFG*1`e_j}hln_=l0h`o&yXx8aQSHTE>Mm(SLedJ zbNXmsmOx6znB|-4T027Fep?5SaYnEF3FP#H)B=5h42m8)4OSvClyy+FO{S%n7HWzU zkYB?H818tjvB+XmuGrw4Mpz6eUIuEa z>fzoEOKTCqRUx=s{1~t7)|9va<=E!#E~&SMvS%ZN%I_Sy#+{z@2^_5y zEqTE|8)?$4uVb~cwmIOTC@%Xb2dWodfRcXQqafQ@k2*#X0PU0IMu6jiSJfNO@)hvS z46qZn0BI(0RRxFntu?el44a*^&DvtFAOfrKaDM%x$X$Pze^2f#X9a%np(cLdu?df> z7bO|HD~FuAN@isbiyr13u15B(OVH(3K1K;d-ZnY|$Q>6tpw)I)y`8E|ROuuGu(~6t zhW8?g7ih7zWc%$g6^#K9+0K<)m4AyK<^qZ{d|Q&czA@@zUlfRADTa;yC;X2}Abu^7zk=YqR2F&wKM?y8 zLPZk<^HsdtKfD9Q>mDWhDB{ut&4Aj);~oR%2@onGZ`o`P@8hg1ZNYvP0s_h{iz9{V zvML22?`8R|Y;6sUPaGVkV|1aM$@#$xYYy8=sd)AYq%{#x(-Xuk6hidF41qR;inTDt za(!-!>WFF7q*05)Dnta#$h0*))#lrqX4Kff`bs%UOvCUf5w%A#t3PkNCB}4S>W7{~ z?*&hIrl@}eW2LDXTs}z=<7_k1s;Rjwpf)W+S8S?9(x}1+xUO25=)JvJ4o&aay1T7* zpDZiwh6J=s9|F`KEbsJ#mJhoT4tg0{4R0YBMq3Y;^Hh&()I@^5livX!SsaO0Aw&0Jjs8&+MoOq?6@Nv zN>(J6YBa#t?L5kovXhbfF@qK)1Bg8xjFQip0kfMvmcvxR$$Y3(-;JjI2k4icI-`^e zsxGv6bdNT?vujDby)I8KlkADoe)BDyPgNM#+r3?@fi;QCg$#==Hk0%CcSMr@fB+~L<+M_reHf}!AB1}UXK<$hjnxw_LYt>^rPQX9BZBE)R8XWC(n_}v z?`p`8wVguimyuMuT$=ZtnrGh)J37woTv-|!39G28rb%U($Ul;dRr&oFE~X$9yP=+y z!XOc$Ao6@;odcWEsH(Jb*8au^hDIxusDVa=oZQeA+c7B4muRl>lLtO30WRLl^D8Gg zpPmOsnw#FuZY~fXPP(B$KfQF9QyNG!NHR%K<-J(V=v#QMsiM;mD1L_-=5hPZ_m%I> zRrLE$1NFJSPoK&>Z+r&1TWe<&-LgB)A*341$Od*SpTWn3*%@0{Fg(9~>l2J8J|*vt zUn$tOe$-7DaRMolxJxNy8M~wTP*_lSJkIuhS?&H6I!+2Kg(0P^Y;1FNmGWxRC4$yC zg_fO;QZwdvmPSq;tdVFnl+IZz8s99v|7D!^`Iz_ze7 zKocbS62A*36X=O@pjM>HgqL=wH`LSp^(RIqi*5+{aW@a@M_fS$J7l@zuD5{VN}%l! zuNnj-<9>^-Aqu6V10H%OftXt8vOj8bRu>+J^LC=tSwBzMaQ0JP6zgoeb!H-iA6pN)MJVmo&WR!4 z^1GUSy*X8!Z=~u8~|ClO25mYnvO%vw{Aww9`I zuguVDF0zw5pE>U_nHGiA;hr4h8BVF}_;+;9sT~#qx#I1?f!QMJ^hY%VUG_k+MgL_e zIG@xLZI7FpAx|Y1>Zh-p0|QYrp(?TH7nZ5))Mn)z20)A2!+iY9N5*Yl#e$EB6aYUR zjSw8xrRC+Ft!0L#`$oo@&>ukcGJgj$pusWcS4u%SCAjc(8vE0o)-Kh{RK!Lm6z!t{ z^^~qICVRjMdpEgPN`d(*D5Q0!>9#Id;p*~7Er*jMNEJc(dM~WhvPKJ?fiJz`*3si9 zKEf>WXMBUIvWSO1rN~hWezrOgQ^tBy2mk%^YqQZyIdeU;8odal6`6c9A}_coIAQ3z zOpOyxp_czMZToQ3GRX^UI4kBN(0H_$6j0)kSuK2lQKIdHW-l~lv!JRF6Y$LyH%Ilk z>d`xW!TC5bHT8a1bX@JhB81hqn88%B&(A7Wp1H*e^xzviym$-h_#iQQ+{!%p7B>oV zhp6y)Jlvn`)sv0Uo}?n3ud>cIyo;k)nyR#hg9`+;*oG-L1Y;S!{e!Qsj}av#diXrq zWd^|n&+5ph*;}&-s?Jq~bNTL{pZjhpC z$NaM{om3bfdgXQ!~|TM2Xr1@mINd^{YgRt!a{CGOt1TsXkXQ#SI4syCz6K-R#u{? zg>}z2qbiV!qw!ioJ*ip3f*$IApQoy-y4Dj7bnKH9qtzbFuas#YoIc2ODsL1w??F{Q z_=K|&>nU&vtaD?M@)0C0P(qo#$(m3GRfHC1LG9T$$eHJAI%FwCqKcJy9201uiag}7 z_`IKXoqg(3=kf9uNaCXIvA(+{H8%ZJ0m9s#iAz+x#5RpX{ZYoK(};Kthk-B@fm<5+ zW6_{l2@XptBK$x^Kq~g}TJHxJudH@16hX9>U|z0x=0Z}8c2U0n920nkLt2-H?L!lo zQq*m$3FJ0@8{FIzbw|Ty$ptJrM0<0yFP-hrfDVbKQAKJ3tx1{~ods0N$x?LNsepZ$ z=62;%MyI9K%1*9@NJvCdhgiXRM!-bnILiGBlB&vd^zCNaN}5c@RJ{`e1;VpOg2ua3utRhOQ7`Zi zib&nm4Qupjv<`^qiu0Cw(HDIQ__?^aI61oq$P_5yvLtENx^^R{={H_tnP62bTST9^ zpu@!Dd+HL6n6xqEWk?dtY0hZnh{+r>xAM%&F%rBi-F{nQ5eet!LlLN-Vewv4DSu5X zPk}I#O3{-NHIR*;nA)-hbNLfs(fwKMs7K5^#gM1m8ZB4-O83@VV>RUg8W&xaR!_r^}SX ze$AN<(7tm!vUZpU=M5i3&x%GD+73H@(m2QWRQ6+1;i-o|pV@o=Owoaonta*29uS9b zcE17PYU_ptht}0_b^bEA`?WwbWnRP@RX?ncUYD-g2!7@>zJ=|2P?3Pv>6=5KH~zJ} zu#7l#{j$G!v+s3er9f|hu!T<~Fq)Y=;_S4IiKy5Yf6Jh&Gc(It^< zC%S%~dWVIXO6_NTi z{`>2MeL!2*996lE9e2r|-@qeY6a218fLnvp%pu%2JL&cvM2+?0r}BnilkugCyy?MI)^-qCuH zdBDcWiTh$4Bv%z{H{YHg>erHz)R$~BUlJ5ETke-jEPsyv1XW@<{~6YIt5a-Bm}eLd^BuH6J1Bs$s#oK4yPgBa99W8o|IEIZda3il?I_z}$mML$ zaW@RS@UzGFqS0}JOn^V(%`Nb;klL4Z3}$ne0HcZOx;x|?smeq(#;RE-o@z1H3@qEJ z@2lz@9%4ma_&|SxKJI@$Ow14cB^LaT_xJk}w35DC89Lpq6SBG`2n@THDR1t~`l^HF9Vf;5#en(^Jyss%&*4NM-)U`Z$@p#&79q6p zBiuCN5%3F#z?J3M*VOHAH%n6iDp)w8>1p-fEfDjj6aKM)g-&;eUI-T6;bH}px)S1x zamMQjj7;e_L~U!|;a@ASrifgfS-qeL)S(ZD`On=t_jh~$x*PxSuBnE0B-OcK*pZNb zGgu7S*2HXLb=RKLzR&Mdpt>RQLS1S~&uw~SCOwweBc>~Lb7y!T*_=r){iT9)naI-| za?e&#+6l!HWO=fvM}ZK{yQ9m?({?UCHO%w}XnP;SQB*e-g@so*t*{(W4KCG*aBLD*Yop{^d)W-p`=j>fW$;w#x9tFqV=? z!k=4|2HH=)#X9%Xvz*{3$21D&-sCY!VRS$5v}hG_b40VeUYr#&w1NL(G%|fkg`(hD5CDiV`D?cq9 zX(-y+@}X?ImvC@!kC?Xx1Y;k;XtF|g-jwO)9u0QsxH{%c{-fzoo9{(}NdTS(XbF_( zhr#FMai{P$1-d%2`u$^CC&iAKca}p3U+~#H_qL-IE{AT2n@`7?p)kCC5KD)-2|Em`(NjR8#M{pZIJJBwVaQ#T3esJv}R zmb1s1`+U28YB{fxTezl3>@f%#|N84O%f;cs^B!>?$%KrZj+WaS2~crze=Q2`;3)4I z7V8hs73ss_>~Uh;=5DWKyt1;X%Hs?*FTq)!~1mqJjez)mI%(aFyiJV_N>HYazmgmEN;tvs4G7h z@ke}+dlYR^S}mt;NS?&wL2(4K@j-?ZFmzp;&eO17*E?B}5ot8zf3Uu$8g_SF_!d0W zd0eklNN2ZV&A$m5{7g~A>j}De-sEbyrV!Bw;RhLnW@C>4;K0sdrDb5IQh}KX)8I(U*`y%$ zs8KoZjfVtRmWY&ctu5#Tcr4K_5kaxAr=>8Nmy70nMHo;2e+P$qIN!+X`)S|Me zZ?X{k5(iWf^y8G>%aui1BI zQo{XYLtKNBQMD z9@jP``oho^c`(RQm{_cppb*vVZDNL4#MuZh0xTS62!&#v%(rl;PLD<7&$w&})|uy# zeb42}n=|o;(_b^%8)E|R=_lfYXdQ5C;(Rx_g==|&9e4Z~pV4luWxTjwj5wt}oY})& z`6L;n`bty+#~x(b769-_kOIgd@X{>j=O}}9TIOIMoBK+|NS&7l4&BT3IhLd(w^0DXEQx#U9$lDGB^^sM3Z=;+gLoN9PJ8%t} zY?i+^fttQ(GFd4p*je*wz+bJ=T2V@5|2TfAF2SIl(sM)Lf{f|Ok z+-_>AGBX;2DMfHgByPLrEpwG*6Nq4I9IT^f{ygx1?OWW#J67y~PbG%O_gkax#PL}o z(8_$dOaTLia55dq*=+`iHNY)D_;iqxNWYj5z*ruS+ixC=YMtd5Be@Pk!+@W=q#zs% zicyfv(X_IC`m#S>Ogr-tG>{d|cG}+q7>31EMbumw{JA=#BB<#n!2c#dp7VCmNR*g( z8U);iDX)bR@VOf}`MxO^K9kO7v9jz3s7-}EZhLS#Xr{^eBwE55JuJ*@Vb{OwY=7VL z%iO|Va%qAP-PrdUuExfJb6n`r0^|(xSs9?-6mD#wMny%{JJF#{ z0l-#8UH#^2-vk-ELz2CaRJ$nwY<@}UBx2vs_UL>jo6^Zi?}sT9*B>5HHUzejQOp|PfnUOf3Tmn z>Ve3J6+{B{)9+zhy1Uxe_40zpNfM=c=;g^~LIUm}1nBHSbTuUQ5AK`GG!0~wK?j_E^=SQ?%6lR`%qO zHFtKz#CIr^0TqU%W{+H#2wccGYU0$X7E*LKoq7|@TvWxO84{nipD(0{4EqqEM5*^1H*wPvd zBACZ%B$bGgB=V5019I2y_-Mk*PzRM+_C%!=QZUwCo#)|*sL%XZuPBn?RGmXna&jmm zXKdKH>CV)TLYkGED+;6^Hp|X#HxBXlP_CVLB?Y24)iFZ>Bb3LDgF>CH*wP~T$TRFTzrdT@9%qe(HlcWS%my(1V#IU>xa;q}iN2r_n48lC0c1aHgit zPcsapl!tv3ZS0&9S6l$C-S}*6ElT2oqEI0>;(SEqR1#`B>}FOSD2+uV3WAohPe2E& ztE#p=1$~>YPBtH&?x-q&rYq;+)OdJpU@HK_6g`hxng5e%yU#bLy`6A=Nf!R^Lz#Cx zg9H@HMKS00tr07auL}u0f_RU1r`O>uj5laD6)TKo*L&zBx)@pL8NOH(qtR}WU6sTS znrKBZOJUS4`)+XPs&%A~X0|P^z<$FY)>8m{N zgWJ#0RPxAeh!%)tIreT}>{Xw-pY9ld%?W@sS_Ci5NILD;hsqT@vF!R^9I+h(SxkFu#(2u^sxYRh)zD;qHwh~j<3VW}$A zL(TswRfA6Kc-r-@w%{-q32+xN&7(69?i@}kSmVOQZznYjcI+o zUF^~mLAe9A?KPi7AM~{>dQH`5 zCom^%&n(TC)9o*ZMOkx&)e8W?+!;{oPdC1J)3VwNx=nz>;Yct$6Q$3MUK`B_mWJ0e z?}Z~HM#q^(GNgN|2uUe5zIM#;KMq}lPkF|3jYOp-zLWho&MHdsWC_3o63OjgdeiRAbGvn)qbRu#)o0`E>n+ z>HMuac;<(BCbGmQLMp|-N~CNL;Oj+W5l(7qM(wK?23;d#5`DBAo7b*QEQ2<4@K75N zCPKQ5fxsWl5F=RMHAe4$W05e}7FJeSnF|6g8nt?Ja|Ar2GQv^b2|UfPuip!wRkFM1 zE8p?gI(zwPNK{K=G+L0qw=_ZPi&CmqvIWLysZ9V7{2L(G9tLsq*u{N|7P)(JQ+0d z(Q!Wq=mqV^tAY656F9?xmHw~_?H1E(tKXI(*HO+uF{?p`S z*Vl(%k-erTR3tF%m3}&cpXVSs1u0paElE%I3RF?wUjLC7Q0xy;8QT`MTNEi}!tY@GSO;8Qg2?0@VTicuT z!VSx%YS0S#WbJc8Cpeu3ZcmH_oFMs_NEMgAl=jb?PnIowY3;E7imHlW=%Y6jp+579 z%3uSWHqN6&Mp83QZmhhipUKa>_1~vT*X3o9^-=l`hcfVuJQ~EHy<`=DH&1=jdjuoM zl=GRGB_f2~cxi1=_SKXWB0i5IN~dNGQcgj9P6J9BH>8dfh{6xXjOn>9f3L9-|Cj+E z_Te7S!1}5NGXVT@Pv>r;hUuuzg!f*_|2{ z>5hgu!1@xh>yMiDzySp;G^wpUgrinY~k zs17y;2?dGwHPYh)8gyDq&i2#sdAKz)#Z^B&nR1mxU4IAt=mcUk6|Y5yZ$l^L(Mc5s z6^V9@^`knXIu@z|e|01|lJPAqPcwTCn_)8*jn{iKFNUfGvUuZC--9ej+Al19K{(|3 zF>^@RKM}^q!q>@b{XSIo9juvGhWKrcg-`nwmW?0s7^?b1a{{0pFQfdxWg)JtKRQvPbq-l$DTK zLbmMroZs&I{{8O%|M|as-aN0%^}VjoIM;EU$C+j3!!eL-5K4!!p021JdQpMXLs4af zdg*oYZo2p}tfrFsKv1aZdW{hX!WOT?6< zwYh-)gHvw&>Fvbq@(*HGFs-jgkE7W&KdRD(?N1+wXo?^EIqz1>z=%VV6x5 zhCE9jDNqiM5le~ETyoDD?6}Dj}lM0VDPzCP?tnE z+%D}Z^9|pk;=Ub>k4`2T*trlW$A@kQ+4%NJ@-E@3G`sG(*D4Xu6V(CWV&`mSX zlYOP(Y+h`!E*Yse&n7CQLGO3bOi%PHkXsLfD6Hp#TIQ=n83+4RHC(}m4w{rG|D@JqUqoN0IQta4PpR%!vCYsu|Eu1JzdZ zP%SF_2(DnRb#&iGmRY0P`d)scL1}UWzU#H|e7-qu0S9RBEv~DhKkLbeuQp@N$5e8#|_`i-w za)91jRvxcnB9hEXCojm|aJaC20Fqm=qW$|3T)zAVRk|4T9j0+dQO zZt7AQx$y6r)d6uoRN;E1=2F|i#&qmH3!R^_;wA(3Rd*n&(A}b%W|%9CRnHr{i8GSr zU)zhiOUG)C+2wvAT>SLY*MS(B;k-&x>OhTB?NGE8r!S>q_We={S6QZ(bu}ObC5Qa4p-H9mfXqaP?Q4^iOs!Z}M|Y6YE23#~Nz4y1^(L`A!c?mp&;627eNJ>6F4h&w0K( z@?~$8Wx8R{K`DM-y&^4v9;Ym59xsYUFVJ{m_~>9`eY(O_upMkN-691FTHjc+gR!1W zufld4!4#Bdw{3{9uX#8UJ^vfoT!lYWg{#!*-$076=HYL{ze|kc-wqV@Y)#vFg zRl_r{DgN-;`&t6>*z-)G4)YT+_+A zjwc0)>#<+krVRgt@o%J7-J+{MM8kptMzbD2vULshw*%LePZEc+^3~p$7g_F7M=ac? z$hiFPcYg~N?;?^v=I;77r3J$MTH{|HM~C^;hWqVrWidX=l_r0 zJ^v0xJtUSIdu!euBb+b1lKq_Ug<@3OEnNOr_IMZDZI5%6UXG9dfo<1nd4_NOg_!N6U$Mj2T9~zZn3b@LDcn~|= zg>${1;LK|8O0c>El;cN^V~|Q0Nt^F47Q{5chLmZ!fn|?=}HO0sh}66UaKh z=z_XB37%&Bm+F&j-F1)?Mf!SnMzFPHH2cZ`+KF?-mL1hs?xoU1Y@UAPRBf2E_8ka> z?L>|a4ygdPK$sCfq>2k9rHabRu};|%&ApFruE$2v&gxOx3YbuC%(mo0(xa)Fi0$e; zAPfa;zy`LZ1frG2c_0UX!Pv4A=Vu2_kaI$|M%9CaR+5LFK+&~7AUyXk7uZRZ(Iyk| zKm3~s$NuEkS=(&a+L!ckQ3_O0oj7#oE3 zla?skd7L`Dpk%M6UT*wg^I&t}iDK`3ZwzU_eI#bc2Y-yqCpt76@;`=HU(a$2Dmpa2z$M;Dtd1P`T^%&?mQ zt)~lo@9mkTQQ~3$)nnKEe7-}BxrlXIvG(?EGKmqn zXL9%Zj9=OMOp^*#f#c$^xuB`8H1VIT(WoD&V!5jSrcW5Bl4jJ`(!4J;?tOg2^cV34 z0VxBk8Y+}CaF?DAWfKjz0;iy3PsH2fe)`7bo(+JrL<2K3Z#)moKD|!A3R9UgP0Vt9Q0;wU z%=Qg5ZMD@ed-sLN&kmqdgS zQv#ICV5Qjuekvq60Cotd0m5!?4dbuVc(?Zym_dCLs0QapEUKD39eK3(YKr05kqH)Q ztbTyFCOVWWE+Cs;qu#O0gny#O=6Wi~pxf&p7(@P|VVQPHvN-=fR zcl?SCaQ5bVptVc3gc0Sj4orN7SQe~W7-%hOg}9A_;GkJ+mk8iYMT=g z0h-06nN+;Fx7A5G60`5f$e?lMmL@o9zOLZxASH>%3Hnf@d=5uki?|7qF ze8gpb3z=y1MUU#Mdf!6%ZZ4(2*r54Z0D}6CQoi`~bl8ivtj|c4mk01;LM^c)3f8la zDflY&^@~(@E2tfP`^WfCfZ`j%?sb8#j{ZJ@P9Sw*3OwHs?z1o4HJbx;)6x;W?@ZlZ|3Jgi2N7Cz0 zE1%w(qwvac`2LH*%xM>=5ZVGW$B0lq<5&m-+gVRn7wkoV61V>33q%#2*zcd!NOr8z za9BCWv8oC$Ov`(zBmxig1urRQ^2w}^vf4F5_AFi%+Cs-A7a|Tph1b`nJmULjW^51b zMPlSor053Y+0LpO#4DeEItE=bnLu`WCU(o)Md67v#Txg?$yv6Caqw`9$4V~c_8}WR z7OsxUn=s6+>*J#iiykS=}{``<2Jp=P1Ck*J2`eJGc?$j?^vwj>X08cUiv z{+&5>_^^je0OENf)|mmcm~`Pk!@>H1I={VLlyXy#Y`*UM<2g}7 z3t>JEPQXTib360CUjH~1n^Qa|I_0);xmHf5!Z2bxA&+01$H6zX*O58F?^yJPKE?Mo z|FhIO^($9a9z?D&4@7T)UFt*~%Vmgxdi>5$;|%sbqMFxFX{mo zJ0ENj@|VfGxyT=uCR1aF*big~N2Fhn(b5yuIa@9L92ns>brjW|GywRM(`Is+o*Kp5 zh)F+Lj6+BEg@Fs(2i`oReszXUQExb(+rNJk72L74CMgOcICutW5v`gmkGTq#N;=^8 z7S2*Kh9nP-hu0+45bPkQ;_$eu0s=i@zP`YV9Nq1wi2fiY}Z zv#kwgBNc1uE+W>uok;#DksvZ1MNbQdR2wS zfEH-povm}=RiCrgoo12d{lavp3iKLtmy8NdHTHak8{%M-yl_mSG(P~t+`2pb3d0yQ zFNvmDLYqdv#^)Lc1+sZxh6k+!2g95CORXKXyu7@<42itmR1IpZh}WTmy|AMRhPt2M zyGpK`oSdB}CCHrl6v-LkM~|)#en4r8U}XEtZhLq79RK>*>#vrc&rjkLOPV}Bvpl$n zCyo1WFN{p|Cd{WBgw1h;cEAv7m7imr+BtTjzGW<2)>i|5%N(2Y@|s_%f^Z2*!kL`JeI%3m33{Sd8VYY%+;1w@nC_}r zL+tIp(FAOiyO}k}KJEFLGxdmkiw8emDc%9v_}H6tmdK&k(Bct@tI?mt&C*`oK>8cT zEI-H)k==$%APN1zN&mIbh=tiGVNI_m4pmI>y|c% z*K^+giVj_d{$%^RyRA8efCGWRp8FB6%P2F2x&0+}HT#qO!IcqXt^2V?Kohc`&B;+l zL9`a}K8c0R(2PwrP#^sX=h&j2WkkdB66MRQ6r!Dix@?iTw^G0@v{n~uzf%YQJclK3 z7w0$M?%RKLnMM{_F$JDMfR!^Be`Lb%)L2v`hdizf!6OLz-6)Cq5y zJzSNi6q8X+cMN@|<$Wd-ZtCT_|DLS+ZUDvGjoH};M3R-PF}bMe>^rdWfL}iIN8{`w@PGAd&;hnFKRbve_pKV%u>ER-B`%3(Jz;z zr6ho4G%M5?N&mvQ{)7r6P#zC*3mg_EKBq)%RPXkV2Bmb|{@!q=|4_F7ilQ5=_SQPb z)oV!%y=b*g!KWf@Ko^=UF1NbD#|W+ki~hiEHo80o)s`P%F2*`icRkqiB@(Z7*e>?x z0fCO-`XlCrwQu!w;G!(YzOAUQNrUmh7N|5*goPt-qj zs3O$}qIg4AocnN02@3iI0GSV|V%FJ#c;N-N^RH1EYfhM?7z5C`G@VUyTyE8jKNOG$o=2^4{%vbEgF%Ev_D zp+XydJ#hY-JZq6fNGCHIX0=~vpqFH zf{?O4Un)!x=2`-*A&9`l2(9PZVq#Zk#o1JQe~TyeS7!(e8&R;EsNk}hVsYMt5g?Hs zFQ({1KB~#81pVP`Mqg_gRe}DoZVNyPEN=Ma$v?jH`Old=+HZdJlcLxiIO@|ezhMlWKb}6gp1vVfAe8B%9SsrID|f46e@mW z)-yt7kjk0%UwxxH=KVSIO3N9U)e7(u?KUmnet}-6-k-56WkJIU`LICi$^XRq^ERRY?7 zAP>8(%1^~#%$1&hr~|C8yUD7MLRSgKp&RN}TfXO|VqEzrLuonKWlgK}SlvAxn^ri` zI_P+MOn%XpL-Qlo{9!H7f@N6nFJotX2Qm;sduwSfjFHK6zZBZxa0kEt`0p6x*u(}7Sk(8U9Y=McM9s?a0Rvr{a8omIsO$Xg%eRv=?t5-cR8j|M z)~(FleOc-7-2^w-E?BM2-ToReZyXYxOuHe^tcrjA+rx$hmTTnk7BwAZiC89KXnn=^ z4hd`Bjo*r1I3b|m%CB|hw|QjDrF*r}0qgA(i8ZPs0PpBX`LAxE6^;+QqBS)1O)?uy za~QnlQ)a87*$MrVd_~XC-LWP!1YDD9egmP1=#A?(ExNeWD)x;_kb>VRS_x_9aor$v z!ox-XfKkhn_Z!lAxg5q{3m6s`=j(Hs(6$foq=1pJ@y!83{mU^RN!9MKy>JA%E^!Qs z1fAWCJ-^BQN3HSAa{4q$%EhD{-3wP~W&p8zK&`8i?9w#)OE_t~GveV-Q&#>IU{=1Y zG45fp3&7T^9Sp?nV6MiTjF8TSN<-FtV5)T`KkmQZsYV{Wn_9QtS4~`yWu=vYq_Z*Eqd{bIxhES^`e8h&VqhyD0$B~JR7mLI zP#S1#BQ*=d2-Oxz(K>9P|8)9=g~e&dUhbiquEDwb;O*tdP({P8ceW}RQhz0&7*fvZ zrYkO`_EVuKXa>(TGP0oH!B{bEi%u+RI8tm`SKkU^C5E$9>;a``X_6Ao8{ZK64PTGM z(GWKnel0CA%5(kHmYYi1CsbD=LMOzAf{}(SD&$tOmLA!5LT+zqrBM&ad!yT~CjuiT zcwl%c7UmnZxxv9t0E(YDGp0Jq6{yebvP zcJG4*H}VF-1!_goS#y7N5CXb7{}ydaTCJGKFi17-uCpc0oA|_|SU=`(uMzKpbo~?G zGG^ZIOI4^ZsN=8rvC!Q&NqGq^IiZ3XrM)Y@_lMvA?g85+@-ZECtg{^)c{QdtUSixk z*I?xd0{Der+pj1arazR9Bq%q`=rEoc9_Hn=uF+iJ0}z}(k(F*v9YF?@S>lQ%*@bqd zs)`7xq{GtM`5jyaIiEeqeIDX#Pc-*(4ka(_#vZoFIfa-*uF^-OUILQElvC835T77r z5aVQnnYwHw2OtvbGbhn|^YkI+s=iCnl`r$72a+W2T^5kS*8qNLoeo%qaGFIM;^>;& zsWM-j(46|rK?{Hll06PtMdismmR~qqTsIdWJtB1F&HHWTY$vuN6)k-b3-t507wpt3 z>yvvo1qqI+)o&^2Rz9>_VzJ_Vgs($Dek-q>;l&y)x|4pq5g+)sh>G8gK7X$+y`1c( zrzzpZsEQTql*(JSj)Hy#(^kH>p)xkT7MqzS7TKU2qAjkibS#|pYL{D6*M{#Z6a28qIt zA5`+QLnQiby0{-COL2i_al*G~DC^R3{a*{wQyEDZ^XY-W(;U*^| zx_Dr|N^vaOUrr;}+jx5+1{%(xCU^R!gfnu)E=4&mhK6jxq~NbpQ+=v^v6q`iOSCQ{ zT(}L=WHW@*ox}hd4!X)Zcf6EAD^l}DHE+!y>qK^}!TAg@`uCpXrhEybeI)dDvj)AX zWA7kbyxQ#HjB-Xvkl;>v{eFWgqdV%}=}{5%@33ofN*UfKn(N9AQL)jjr%-%iYz(UR zD!Qx$2IYB+JrRbI5)pt9Fdp?%;{YpBftDF6rdr>a%WV5i^W^e6+lirbsbH(+LKyRo z2UxLeDm3f>xdwE@zf;NARa3rA2thMei1obt7}YU7ra=PcNqzh8?ua*P1!&8k&rVM8 z3YYH(X&YT}t%vweoh)1s2-Z-8WgwN|KMWeOWW6V{edFoU$K7#Xzvj>@A+Kx92727z z&XF$vx=e<5I~6>>8B)5!ula+=;g%>AP52#*B)e_%P7l>`m4#{Qnv#&TX@ds1H98#9t_Lzz2 zkCQhGKg_?BmaEI}TDQhG^&Gfx&{knRR($>XuOHjko2bf8b$f2lI|_;n&cdMBKabnn zEJsX8@8;IgM}hcEe)r_qV;%uCyZOkM{zhHj2>n##5BLSPZ}i(htV=a5sQx*UYHWIP zGW0x@nVShXn#Zw?5?FR=FD6rB<$nE;l@Psak0;^?RXhZW^HuiSyt(|}8eR5?HlJO& zrX8C9;nf{1Tyf#Uz_3e^Ok`AV@}|DlLb%D@!U^yVO5JNNE+um>)rVozjkV+h$=rs6 z&|k)BD4Y*Osb0U0aUdO`ulieVe4__lmU69f;>omMn95h`>7x^?pw=HfV|Sep+fJ48 zwIskh3AybdtZ`Z~ zCq&u3ufqS3Y~6CYOizsvMKUL_Y`&Db5L3e$%84fLvpKif$3zXKo(3%%6+*Q&WaHPb zR3z%MYxiPaeLF$`xbb`tBeT*3snu8$>23}d_EGeznDIUq#;0;?&4l*L7Nah06f6Wr znaA02n!p==$YUQc`sNbRz?gG2W4t6jSHHsX`WwNt0Y}pXo!CC&Tckx=hTs@X8NBF**SyrN~r-UyC#Q zh8kIsh+mHji2D$sa;_F+)Myr|YI5$7Wqd+4Y>|#|jKBHl0{FAyH|`Tk#X+?~^FX!4 z=K=)WYE;_9P;(etLf=Qj%!i@bK4AYTZ&(?zH{m@fc{RxA;pCc&wjI6x!9+Uf;@p#J zqlkH<+_pXNvfnOM#Lo8aE+McltjOFRZ#^PHU6XRl7(uJhJEncroryQV zYK&*?#J2> z97*C9dGm-H_!%~J=Wxz6v+ezurKxo zNz-I38hvkKz9NQQ!4(hv_m)-Qx~)VzVv&A zW+5!SJ!OX#(_+mnj9Qqh%+n+)l3QD6c1f!DO%k2PL;hU$QA(^~njaJv*Z+WoBM(j` z7iOB8AS5DQog%&^)7M?p=z8G$X|5>zsld&Il5ob$?z_u`j?Cj?g}GRt<>(jX(I`r@ zVr^a6_Qa93o045BMT`qf`t}b))M!xwv8)<61BAlSoWiK*X`G~DlTLMv4A&OP*kYA` zPThyFETz|x@Q7897*De^I0^GpRI@L6E1QtnJ611VU`#<_?se%@t1NMT!P>)q0~S#l z9F@VmaOJ>?jZU403Qi}yP-Hm`vAf$xBBp~c#}!yXg>Gs{`Vn0+U2{=WJf(lxJZEg6 zKTJ8{GhQAuBZjqPqTGpvadtxPXkemBQbTTkcl;uwmF$Gfi^e#>J1mG0(lX@+H{&T` z(kHAlvz`M44_kQ*IFAm7g+Bjy>L9nP%?`awicb_Pyu#Z*lvn~NmTRRh=jRxbK_U8D zh)eoAMYr4ZRh>K;4fO!^KtbbD(X#|f-eLBC(k9smh>2d-KZA+(?1s&C2?=>lSOq_V z<9YMkt8DdY$?ri+Xf?cReB6dWeqTnNcBR@$9g`XJn3RF`lf7CmC zXZkj(edNJXwlJJ`bJ!v-17j{_%P^SWfP@|~n07ZOGpr92m<{25nx~5uwmJp;V~vfv z`;-|efy8$R3tlimepLrNFRBskI8NFQZAj{yn$iuzwD-)L{k{`3BB+Y5N+^~uC$PoGXf#iC3sR`PIDB_Ap#C28f!ZqU};-`(v2+BLe< zhPq$AX!f0wk|3ixC`ZhCdW^DXK524pGV#JOC;LiJ9QLq>j@%8=W<|k@DB@&Q`s|Mzc z&=hin{j(3Cr};D{OY`8D+4vhf7La;d=o+Z7Wc{6`^NebGRK>z3fpnx>@m*YE9{OTp zCgCWpR+g(E4&(YiV0MOeCY#G}y&xO*Vp=vIo{+5ww;{vlH9DaHlxuV9lq`RiK?Ali z^RB1wkWU>6!D4tFUpUjw@9RQem7h^Af(#|5?7P1d_h{N#nYovzJFzauNnfC&6xft}Vi<;$Ed|jYz6=5^moMlY_ z{k_d%H4vS6o$R+qiAalb6hEP(wa~y<|9F++hKz@VTmpN5RZP&WzwaRwFY%<=!4>>h z76R^ij^gZB#Xp7acy2|6P@j$Ml=yFB_ecZ4nuoi)VSaY$LgkEpV{={to(28kla7Y) zD7~XHC~E>l_nAG}H$E8qCF1Fzbt_NV?`^9(I-cf zA1r{0(9H+59Q!u^FGS`2vq?Ip)5#v1=shD42c$}mXMIS==R{^RkD-up{RB;p8Sa%X z2FYiNT!q%7->*P!mwp;MK)u2X$#^IHTmS-Bb2k~N7T4yY4H{Ij1H&nXG}6wIeXhMzBcu~VQ&PO}X?S4fgWM>QMlC?cKTiZIgW;_SOP+vgW~DvmnB zbHqs9u!6Z;3`>Asc^=rZsfz~U-YC&@E-)U=_<9A{Mp0G8nCxb_@lL(*gpZ_R7>;sb zMMEo*9+{8|Kw>^T=i@(8D37_-{0gk#SHj-D5fRnB^@^{K7yC)$zIXxq=JOTGVd&sK0Hxt? zlaq3i0?`E7P>xA9$e}DuW>XoaR};4;?RI!;6!XH&?z&iue0}TJ%-s{&*p9Alg?Fbe!xgB3iLDo55 zrJIN9#qoD`^L1hAR4kCR>BQaO+2Gr_vmv-~-=mc|@uJ4s_6}=r#c-lmgus9v!+0LM z?5TZXZhL+KG0wI7mp(l_?I-1AyZMW6J~v;Xb*$tGl-nuF^~jVt(;v9)E`Nq<0`$LF zp6nkDH`N2Bh>-B}5;$^Q8lGq)WR--Q2u2u(C_t3lXfyR5DJ5|yG~s8?SXmEBkbnQT z_mqt>qlb0+wlVz!H^*VxeBOkmb0a;sp|JGYJC2&p2yWWwL{I~UP$E9NON&RXrb45e zM=nLh=N8~mB1--yxi%2y%a#gx9d3ba5=dChG&rxqq`Yy^Qc7GD;if)i!Mv+J8=KXA z{3LF%VU%(C+%7ImzWOjYlc@%T=;| ztd1|m<4{@Ig3@rDJcf>R_XIt|fAPcsT;si{vj$ne#Cr^kfJP*DobpUZb zkj%EmN+SAEiLKaE=_KhM=>ut&2UneZL7CW4+L}JztELrJ4 zoA%!8Xa}Ux+^DAEi;nkJ-4N-fPma_hKN^t6W|^6PY3NDB=yzr(`#-)UNM`+?uKbq&Opal-GP zGip`7%~f*u+GX(If4+!IM&=EaT3}H^6{)>FHavUm{FbddXhHcWG&Xr17CidU9*Y~u zMk4ao2L3z7wo4ou}_v2g& z2)*CF&GnTuY^-dw|3ElZT&rcBu&S-Cnt)u%=wzjo*Uf^r-8MTp)n4gh@G)IY9v42H zlr~ks^p6?+>#cZq_E&y?pSi??qQA_)*P*B3l{nCD6!h2M%cN|8Bd%y2|KHryap0yN zt(C4M8M@rD(UniL6ixt-rSJKEf}oi2u-1X^&vE!%(O%i(*x@gnlm8i&JX|iI2ZBPUc47NoB#4g z{HFM@Mq`s@(14EUnkRB-;hYoYjzkh{yr-_+p`9vTkJDZkQI zjrnWa#Zxx^FBYbFPvi_R55Nb~3Y0#j;do;l3P&!=wAZF2IKP2!PpyWwYG{qk?Rxh-EF9;t*#b)djaK_z_imr_{S{#Ik?$mL(dQGO*@V7WC67H z*ju)PGbEMp&vv4*mo0Dbl}#*PLgnpOcX41zO1T-ojRQ=uONPV&ATsQ&Qz=M1R_}82 z8jR_?P<~?tQbI6XuqqVC*@G?aB?$$B6bq{3WW{#P78&&ZO}w=BxsXV}Z^kHH9Ivug z-G16_;FiE{3WAs>QYZyVWfIps&bl5K;{G|~qc;v-5Cq*F{T9=>J-c)`!knm1hcwho z%&PeigbDnM#Mof>UlJo)(^vPc$1T_^Gfk93&e9{WyB}v+-nN|Oc6X7xcpbCP zxLYCHYk&XVn7$ZSr?{PuHIytHXQTm`!nJZeTxHRcOhH(&-ldM;3Y%+)Ik8=^$Fhb|;V~Q)gZyr32=S@evV}{b#XQnb+{dl`XRA4B_h6ekvH5i_S2Bw?0+ z3^$Wle8|>cyuXWcp_v=B=x+?8-oAaCELbfPIolML3iM1M2W10y+pfJ0T6|f50(%KK z4I0f}4mQ`uh*rHnu*S{F!vu@Y6=2O0&cjIh-0AAoDdzdVlIThhO5DP=sH*w)@&MOD?> z=e9<`8|iK$@fv~%6eyjmfDu7^zX;kMt%|q=QTltH5Sk&R4`-TalW55GCL$?EB>Izl zJA#uK#fww}GcAFL!utvMa1WVvgaMDMeD`i+DCY>cG=#y~M5a_c*(GstIZkNwPiEfJ z7v4Th;7n_iaR7_*DF z+FxXf(J+~zp4S{1<$*x)RN+H@MMkN-Kn7k^ z8LZbc_!BzZKZo;CXYDOWhOaV^5Z}mSjB^Lc?OfG7-u?+!i!wncb6|Mr{3a7=(V?vC zKqP2}^`g^xzXWx!!;j1IuPpa3w~&^uW2)lB;Dp3x$5_lZ2lnGQt7iDjR2p>+QyRS2 zkeDpGO#TIgzD(O*yz7Th>>!D2eeRd8nn-N+usBf)N-m35qMboXUiW17z>7K#G#S7b*c%`zJJc)rP#u>v21oRm#M?q``g|x!06(oePfrN zCM0{<82J+N`MrhTJL;-%ilX4p=y@NidvG$4_&SBlzl#3#Qb7imM=Gxexp1=^v?8^G zS$C5J=&K1+qFE)GL*=5ROwgh?ijo9qsQJ?6Uv1Gc^3p#9s9CFBYQI&r=}OgRORZFf zK7Qk-#iabK{KI(Nos=8!tb3f=jH4 zmaI#%Nv*8QYZG$Il@B%9;!|URsX_?Pqm^mG^^uFSgYO)7glw)Q)n3a?#~1w;8|MO# z8ph?aY4-`~4Pd&Aiz^7q!Tak|-rnBG$-Cx5*@4_+*%p;Tr6p;nj<5GaGUB)>={l;O zp}l^w{$DD|>l?BJk%aztk(qVK>6n-z9A#+=Isug3|)dRbYQPmg|Ae0QFM(I8W`c5d!p zypGDOQ)0uaJ{^C%oX-FZ}&YlQ?eO+JZE#0_*3+PHEZ9^ubD!{Eq{#^s zCQ0Gq9lwOAGB3A9MowCjbu3O>I58IFa3&X#-wR`fD=JB;sMtOAYi*}vr^`9G`!cYi z`~IYj)-nqTYH%SJS?&LtX@DxH|E00jYACvbF6_w{~rN z{VS8kuewZp=arnoq63KN(Wi4aZm~iAA zM;G&`O~WEqd09}{f?<)SqiF(XgPy@(U4g%fTwOgV=lX1JDqWD{pD*(F;lxHM3Wfig z{*c?I!SzQ~4Z&NA7#s^Rldo|(mzrY~9n=B`vkK6vr%{G6;YRN+o!c#qHx0dji+xR! zIalzAeM&pOsi6A%cGj%aeee8r%xE)0q(uNrF-A@3Z873&2X;Xg*2I!GWpGe?BVouw zF^l<5?e*b(G#O*$$>rd(5qE@z*KL2Xu~tlb=Hsc-b1*5DIkI`G+qR4(*b&vz3%})=af*Y>1oaU~_|_%HQ4jpYQfH#0qXF{; zxtD6=o=EsZeLDEVd~hn#A48j~ilk?^UL90TyDfqR6yG?$m_IO+SDq?n=^2dL^O^8E z+Z!k4(DXXqEm9y%`LoQez325+MKU9v!O9jVTb7Kx^Le+Wq|bPs`vv4V+f~(7UIf&f z)K^=Lvp4F%&ov=`4gm{W`clEI{v0cvc8gxxiBPkn#1swp z-w$~&4kw5mOvmQn%)w%+Ko$FM2LH*nskEA8woC z3GP$Pw>8w|NaN0IKi{A+VRiK5&B1sv&1ADAII$Is7@XFURqz9$0*!y}jPwH&aijbA z&)>G}$xK+gd^tj_P1@MFF8t>s^9?4QEMhWh2!f=+P4(ti)R^DqKKTU!(%996<$L!# z;ST=w1`P$S5-wlD>Z>eT?>w5^{YA&yCjRgfgOZm(&&Z^M#7a%ugHM)?aq}>u{hsSa zxQ8q%o@hUuG0~5CiXBfKEk-y3d(q{E5U!@bFBndwb?5ZBfeM{-T_I@822V zs2tVStJ1M=rL>{N3+@d-*H2z*WVcd;%k`#gB4_>57CSt!wWY3VWlYROTnHKKOc@1O z(>GG#;Wa*gFoi!y3ajc%e(Gs4(rWQ&(&VuubLZmEFA`R`{M-G@PA=U$EsD%GcYL)7 zVsKEZ6k;Cs1Up#7wGpLclJD(KfT?iTy=Tiga(*5n0+z)<1D5_JO_Bg5_#LXO0@#Aj zI`!^mCSOUA&j5Rbvfy-aSnqsgAcxxq>3D;kB74!F`3&mU^U6nzVNmHCwir%f%_Tg5 zw>p$GoK&xES<|Ea6HSB%^rCmgO|^NZ;>Sfiag9@Mx0@Mpxr71_CC)XNtjf_8nP?n# zVf1F;6?-)6_Sm_to8$JqjEu#i^-I1>aNi%teE1+B1<(A*f4Hn;Lpw~*Fv7w0t8c{E zzra&lV?w>zxVP^zEbuK@6BKz2+Ix*}>Q?(d4kr0bXRb?lNSJse$VyLYzw!T(XPogd zdM$Sy)0Z5~4js|!Z}lyegFO``-d?@6k0#^a5TzLCEIoC9^YKU3&pqZl0yLxhsG`>J z648j*_(*SFiT#=z_hetd>!#E3HobsPnVLQ%IofP4n7H*u9{urM*kY!xMZ-I#AJ^W) zTbzAgs`8d0c&SjHO4s6D^83ysh!its%ZK5y?~#v{gwyoq=1+Fd$4N;x!~66DjJ!>P z3>~kp(QHMWF3qTCJzHLphi{X?hV_cw=v$wosXm6q;IqzW8X3KKbY^=%59rFDB8Zg=qPN&^lyJem^U1zg{RwvQSL@D7n*N)Tm@v-`R7MgBKZ(Z=B zFpm#U_IXR&EMIy zDId~u>GU~qf>1HfL6TV_6wi}*Ye@ZwyYa|JpEj)t!f;aqEq_1d z%|Oe>7;tFeOXu6qsAnuzE!GdG3MzA6OPM#K(iOoHZtY;4R}6CG#Ld3CDe=4oc6?IQ zg!d|Zi?dO5OF8lQJIRkN>XK8 z{(il$6ygD^q%c0l9f!J|`NMWi_iZA8qDe`r2FuGI^EjXSzeZ<@@& zptWRIH})?0{AgH`a}HnghU@7hMR%p5&jF8pd3>5;(;jU#pWx~T4B-t;3gi{13=U{kyD%u&us zz$hF>1z=21=;k#BYb3-OFMY7hsJUnGw18WFjT2kg;|rt2V%TqzGvoa6@y(^u_f>3b zlk4fuCm(#$&&nPM<10B)VEX1FH`Rv)?yJQ8=2)8MrZ*i7*M+{g^vv)6kmCISM{e>8 zlZkQ4{#2TWl^%&>uZ_^t#XK>eqqW^WH6M+dRKJ$e5x6dLVE9{o)=$$C3|z(p-jD3J z)d#d#`hVHju5#J!U#@C+{QYTGRMqs$@suKYq0(ZZ_il<)M0W=J<^3712hwcZXFFCR zNceXB{3xl08buXp)KuHnr+YM)?3U9jm7-^bZ8B1#MYuec3U4-sxbA0c!CDIc&|Amu zs0ftrH zJYc!EJu4Se#T6m6>g`}W%Xgd5h$GCS33gjA7HKV)#eFt71DxgUOo&5GV-gvrokkUcR{cq?St8stbszNZ~KHO1`NnUS@CT4%~n-e!#nHX zVDj@O8OFJsqKZm4_X*}oKOe)xHa)6x51ZR|lBck8W&N7JWoG;SdLR|@f#3EtP0LB^ zqLDA@jeJS(JGHdi15>RmTGQ08&KBpvz{S!WkT5P;2Blv$ef<&D+U#(Z!}G?C*!ouYdWrf-0(u^o~^wI}V4h^Ce7| zgpU!b-&!Vr%#KZSgIas!ZT{SER%Ehig| z62VvSadC&Qgi<3fVfUZUxg{mFZXuxHvTC=E{ds>SExlP`pWFY-`j`vd6^QK@Y3|(_ zk(k=P_H^;a1RzZyuX?&aWfw)k(>^`jB%j0uV>w;z?O%phEq@f;*hTphq>8568~u1R zQE>75L<9Cl@_yLYE!%r7#ATfId8k(*IbqJT@s6zAiM8Hc9s9u=H+ zhLD)$7$LV3CO6cNbY!HN zWJ`X7jL#5Aiu#W{4v02GruirP5Bg}^7q{$cn>vi%+!pSE2Ijb5_w8$} zB+GBkJxMAzf>vOw&Nh*4*4(Puj9z*02AN8B$@}PNXp&Ax1GU;N5b~wWzT@!PV0=L< zBAI*htXm9NHY~fCp`lHHXK4XzSKeQ@-MhD;lAN^j z9l!(?!36c}Uk@@ycfI-(vvOCO|HRTzDukNM{nm_2{Fi(8v0_U(Ppvt74Dchs2wyFZ zw!*{0yrJ&ALQMBelyko}yQ17-`8Hcs@XB&y%U?J3b05(K9;Tg5j*%OJ>o&i@X7fsDMdVhS8$!U+ChKvnx+q2acU(&%-<) znj!G7^^61VFGEOKwumcCsdIy=I(4$g%6!WxOY}Lov$C%W#A2mA)*W(N?k-Js&wehM z&U*d?72Myw&<^pK=pMS$th95{I4E+8x-m)t=vSO8|A?Lb+3NePbHJ>;#uV<1z|9cy z>V~CG(~tJ-3wKm>Tk*&B<%AlC{^NxDQN z%>kA&ghXYzS_ca=dd_t@U9yPKodrAwrlJ$39>M3d-?T{6I#716iAgVxOYJZd0yR|o z#B{MN>f95LXP0eLOva<6oxk+;L9#iuCEoU@hj}zOHvaHgkEKOafX70|wRhRyDy#%s zRzeEr1LhBa<9USOgrLw^rhQueVxS0#(K8)(QL@A+6e1&cDA$RR#wh{?C%E=wgE14 zE++ZrY@g&yhn9z&USk>QPSP-Y8>uL#{nIwmjVuwp`AuoZW-!IYDpTPAma?hpnKB#S zQ3B{^&A{0+G`Y+&T1;Q#NRZX-vDCLqB(e+HK(=FxFZT`I4WKUQlqn)T^?=(pmzpVB z+d6uP#?8yw5NCUsr*rsE`j)2o8_E=9G#J=JL{R9=uFL$>+Z(WUH~t8p8am?fTlH{Y z?>W7xPRG~IE#cc{`z(7?!xs1k;(gRB1J?dDma$H^$?mzv7Jl|@z@cbC0YDetW|fPx z&wrzPPKy%~f~N9v&AoaEOS4j+QBsQ4`p)!gW6Zpy&C)|+0qOu*vFHpz8qY8{E2fEP zE0`!B9(Z%@PFPIhKDy^u;0}9mQRJ|#zH8LdcgN5wyg`;q5v?fi(>y$PfzI5KG-)kq zsIr+!KOkZp0&{U%Gsyz6 zx|4@taSpzyyTX+V%&k$n_h=$<1Y6Is{%YCL-L88v&k1iS)SLF<9NlvW(&+Z6-a)y# zdU=f%Ylu6$)KQYFHmG}e-V+#zq0-JK+C@R!h;l819Zfedl`n2OW2u*>M}DIlXQ6!w z&;B6ZA?kCe5;8}Y`+0j%{XaD|wr7#a=cDL7gy&~&BDY@R&rHVDQ8oFRYrdk9*7_|{ zIVwE#H1t}yHm7@(vH!E(n9&%=G;K95{q;C{sFLFMw-rJT?@S#fU}isAJRTh@X1nOQ zWLjXp?fP=9KbOK8uu|&sA@aqr?z^SdtMZChSvrNh5jwm<_3!1lPoXpCTb~Y%s%uWl zkGVoPXINe!TjH)zI{eeaBY(Y0{+H_XLe{+om2T9m`*GaSgPv5G`%R1QND_Qs6Gy3B zZ0O!b7YZ(`yNka~C=j8(b(DC^>gs?ZP}SIFmVBG#*6j^?&YO%s(Y1-fW;z+j6*S%@ zcx|@KQP!?&nMJmHu_=c9@YuEHm1URYOaROe;}R00e;p&JGsWWT^5RV+Nb*~_O|xI< zl)Gtmd}+U8lA4<5TweNwc23CXt0&|u$8^;+qqm1Y`*5ARHeMP(IrZzc!Z!=YBGO?A z12z;+zTWmx7yS|{Xcqp%ZRVAdOiE>Br_-@gOH`Q$iV@GEyG@RtZzy~agtHwl-OiL` zi)Ko6Uhy-8T`;lk34>6`qPTrM=tio_4{uxfgrz?MnpZMU9Nfg z(w;p1+}X5lt7jB)CS@_H&GN@jTH8(i;UPcYKAKM)t#&Q63wd1ax56TBUJblqraGL1%1>3_bK5jrc1mvU>vu*NI~g2JYW9pMIt`C=(y7<2}G}B5L)0 zLxXBkrD=(&yt+xh$uQF%#+_Kont>H{EZW8<%jytQn`L9D#J=RHg%#vk%tkjdf@Bra|C0|)n#>L;{Rqe~WXI}v!`J_zI;49X}C41tn{*s1 zzt5A1m%(#6Pkoj^SW~QQSLd>bh#sheSEhud;0Qz^q~M}fo^`JbmVHRWWoxMnai$zG zJz>09^@P!LR24f}UT~5OdYS664uFm4h~%FuWfb9Up<-_CFADbt;DJk z;%pZ>JFw>cGpa;qYcIkq%hhq~f=A|*h^zkcsic&I^}hLXH?N@Kuzh=b8Yy{}GZD5Y zqQ$IJJl)BuJ6p3+6Pda-x}p4y zt!5wTyYRIyW`}s$%zCmYtUDtSXF!^Vo_(e}56Un{tNki%`WIH`tJu9*+6!mBL4Clu zc!7B_3q}N#6c?M9gU9ImjCt`*YsBfuTF;QeQv6ISw5hgwEA(e*KW=6p0Z(KXDgY2!xRR zb6>0E>L0;yQJrg}5i(ed1(eHLQ)S%>PD;Gqnjd6SO}KMN0~YQt zqHIr_QqsqZ!YiJuHbl9Jux`#6QKnlLdz>>pUl$|^1tk|T&b=F!QuSE9*|$Ow%Cse% zJbi%vAXS$Qeny^FoO>Hi2$==;)%eF&>!Wn3&+l)iEUy2hD7A-t#fycUw?SoTBy{k2&O;aOz&w1sd>S5+Vd3MEw5Pe9;5hkY7 zXEfNzJv|`F(h#D+fG?So-@eXO?tOU6I7!{-=U*4pHsTr7Wh!E+qv9^*Tm7(&w!c1c?tHdG zZ6_dNEpAsDo&QzCwKGSnrC0qoRg>rg4Q)?x_g{uAPpQ z`Rx$CPy6!Uz2Dk*XyUYh{LWO?tDwlm_w)%GC(8C)lRF3>Nxu|>-x_WrW~wnVk{aFr zVM*M>Ji)b1zq~?tXcb1g@An$cSH%{6`||81F;`h___;szN&azr{CL&c*u$IV1R>i% zuFdtyUo=YbQw?g}K^%=JR~YmJDk90(Hd4xSYK6w*l>$Z@6zVTPv$)#=IVw}P$;^QyPldHIdU4xrbJmYAF;IuZf**$&WxTaL_|EH4hOidjq}CR6Di2?ng{qGq zS$X>6#cw>O5?-ZFhw$D6!OYe_>>V2MA0tjr8yFbqCLcC%+uFQiO%^dE8gy&%?t1C< zx8n7?DBFv<*Epxv@>2E=H7R^58(3g7KSxI zP(*|?UsZk$N`iZI)otn{Rzy|MNnuAvQG&zDdKvopR%@D3;XLgPCg;4CZg+HZl`|}Z zQ56tkZkdE0=pdX=3HTl#Hd#J_>{^oK%| zf=LVE>=3h>)uF6R3M&k0yZz{AEOlCkRZ7HlGV@kaSnvnD#V32mOx`_W_rgGsE4ld5 zhj-5gQJ}1zel*g|sxD9yOhBaa!DVof*4EaS6;`5UC;2#?CJBj|E#e!L>T5<6Mjb-bnpKnK#JrJb+Wv2(L4ONjV0NK#%4$W3O|xbJxCNJ1#w$ z@XENaR`FaQw@qI&v$w}iLQZd=bK9{k{*n9%jqW~ww=w71bf{Q~zsj$zsv6(1I?vwt zVSCGOh*$B|lpwFNZmILmJ>Rv|t{k+Q)g9aJtVf)_b#)Jau^`wv@Q;4`c2CZ&*p4g2 zF9^?!#dsR8tUjQ(q^<;1OeNoZp9WrSj8Txwr}0?u80xhh->)PnWabvYbSomSa2E4H zW#7%4+X#=v5iylp4_MJSVVLxL@ON^&3|O{xFXJl@VsxdUYUsskmIo6(xzEUKtr4fQ zFYm>KCgImko&OOwQEONCvx&Wm{;6`Z{Z)sMl2^J`Zm9bn@tKi=)fHXU!G&C}w3UzP zS_vbqKh?@^AM9vlHe+6{yJ#LJua+y6waGAv=iM=vPw47QXFhPE=_pH?Nm6U%d{FWn z6)Ia#gY&%+8)Jtl3K!j3soW{Q-S0MmFNB^=J42seEa>T1Ks?pl$3hkQ{#v2K3rqpw zK^?Ordeq|>vkE4@6#J}m6woYbrBA%sO+%RRRI0cd$l_;TIlTD(&lpc~Gns6Rb;O+v zxk$yQnHEn?^>B!)>B2lf!6*Bi^^!sgX9ffE3!Cq@eNc&3izo1ojAjlwHb+S}psFHH zUrd`F7_8k#GTZVoZ$1@H!^_WU!P_wms>B(UFXF0+jMtDBCJmjfjzBl^`YVjM+x823 zN;+MZw{%g=Kg+Hv=hO3bWGN(#<2Ni>)&gH*}l&=Hxb-1l}*2C@G8H)#~gi zjxV{-t8)7IdAv@N-*LXXo_;b$Fp5DEZ7%vI?3SiKrYEPMjAv;`VK|e|RAPsuHW_lF zUb10&p<;VIW+!JKy&|RRvgEPQuMwxQ>X*MpNlR-8Kbp($&PnGG#oPr3@gWqz(4ExE z2&zBk=+I}yVHT*D&Q`Z;affxOO3#Eo!*|Fv~wNRJKW0WgUv0WcsEZy zj9tGy`^>Hz`OFbK{+Yxje}(;S_-tmgOnt`8OmxAkGs$9iqcyGGK6E;K_*us~WvAbg z+<~3wsIoE;&ITx;TI4!gUdSwxB86Qzz2xG@V4G#u%inY9@zaFc#nARI$|J?R1)`i_6OdbnePf97^_7@dF}T?3 z-0K=$9_ufwB3RiMz1;bVy0LQSflxVU$x!|W#?zhmNxPct*Kvq+8&I61FOWs(*WX`&xG330stSnJhmfw3mUys-+ zm{o&%xZS9iJ9Y5AqEbw>c&$Q&7lTQ1tDF8r&iVAk@`UuI)`gsjch4MghoH{ZfU?xk z1x7&essw2|_6%cD4a$ZN?Q#B!IJ7o{co)WltUIM3Zj8?8a9I7&plT+Q$(o(zK49a5 z7yj`|m5KUtkKQP0SF+x`-Hvv|Gk)I6K0ZG&qmWKw8LDIVcj9lLaK67umu2fCnF>mr zY+Ez;<;C%2{Vq|Q<6WBUk)MB+c`v(30+Jv7a`!VR75I$rL5Yn%k=bsmt4gtKNEcVz zPkT8R$*(OsV|n?|uQLaOJm0^!o&7|kHg?16oC^qEu7T0}*>UDf>5cpq)!`Y=8((ZY z94JhFGKB1v=r=A)DNMK|_x^h)JZgW7fQl@)XOXXlR|q^$XuXq zzK_0B?!M3wifwK@=M2KLeS(`J(!(>Hnxy>Qhs8gwLzxE+c(a*)wzK#4-t_-XI)nWZ zQw4a~SlUHDaa}}c@1DA+&mIkF+WqWb%-JsZppj!x(fP0NkAb+UDi*?u^i{pQ7IGh` z;)hV)Lbo@OR^fODe(_hRJ)t{^V<2`B?zz@YAN}jPd#XSa&=LR#UtowSs8IQC$TC8W z5Z#6U`iuVv^7-rje={Rz5!&_NP3;QzdE)Mg`WHF3`zw#Y*PZzHD?F`sR`<$S#UDGv z^LkgtJhx0c_`YK-ejjxP-%U#DAJ?9-7{|rYYHS1YX(-@mSrLpP(CCpznTx&c!)LVCbUi@~w)MDKE?1vF~3py@zOH zZf#T+L`=mHh)X;Cp^*zpC{>@`^~SdaseB7`H?(LDm(=CnfCgF#sZia^jUapg<+MU( zZP76Kn^=eAYKODE`C1I9bH90MTH&4pZRrQ=2ttO>PeT0JEw2rJ>ZnZjt2#Wx?sD*4 zK6^>YFVq#ahVpdWVW`0m?U|<{2 zXohZb8=QP0-tWDgL!Oxyz1G}u*nc93muq)fw0sqlpyfjKYfxFD488*o56P7WE%2?q zZYAn4lVc7@0QoH{I_T`LoTrFzV;J0PT6F(Qwcn?o#>x53lijUQ0$%LCHrv0IyFJdp ze^yuZ`;KVjXkWUjtKcAii+M+*21HZMGlAOo!tr}uiHx~&ws*SW?45$>y z%d|wxt`Etg!#4Zg+^+aP+)!8MxFO2UF>|eI-)wlHUYefbep(PHNEx7bh<|(gs2bDV zQs!ix8?5`Q2MRin?)xxYRV6q{czODJ*LEm)dzw{xiUsj%?D~Yi4SM^JzJSl+go7Vj zxkRn>0>G%CNB5@h+9R@2t{jAG`j^#!;}~uT(No%9>P~_fev%^?#krP-1k%NEXzY`$ zkGf^r?v^oPAmU6dT2?{x2cp-0ikC|5EC0-l49-7!<4C&6+|bLquoQLVBer3gNcveBv>x`#LR=yN>F6dKo(AGwJm)_bjGFmX505s?6k&gFdZSwmM;|T8f zR*ghA-4#N1Lvg>X%YC0y#+s3Hp!B8md~|(z>m#74wx#jpKD;6qBh>s~W;H0fzs;+= zH{EOmt-_LnIvDc#M?gBucWbdBy4xCg;H60 zvYOldIUDp4EnJ8TXr+Rla$OtB*y~cgd;NnDuG=XecDFHY>uJ|~r*r>nZ}Z>!)PK4* zowLEn`lOseHEk81N(MoiTYyyL+lP24Qvb{6ZEAosRnR%xzK+wNFZQ@hyAG$}1AZN< z6(9ceKmc6%!l*GfoeM2D{C65;*SY+|ng8>P|A#*HAHNd+xz1r`CRCQ-VI%V;b2i?* zd3SA4Sk!{t5@w!h`ra32-Vlt=;*p4RPoJ`b^D|HVe$`DBt_(HVU-Y#*GhB%IW1q!! zKlGl4mT^u2l7-_sp98_OOb5E>0tc=_3r{D#S_m2TT1LQTr?Zg`toe9PZZ*t|Y+`PW zUb61a`m-y8h^_}1JN^01e2iC?zT0qLV4KkSZ9%n$R@=~si1eg4_M_Yos2+x%gEXx; zyi7;y>UZoB_$+ALpJ^JoGxGjHZ)N!F+mDT9-Je^mH&mm?Pj9)9IQL3O9K(erg5aDj zDXIhCRF@dzv9oKjK}mhMN~%~_k^ z9r^TlLKJm^9L~^~oHyHU0UaJ!sy0feeYJb_gUOumQbH6|IT_eW({R!8@xf&ae z@#=hqLxdQ>B$-nxqDt^w{>S;)UX_mFL^v+8B?YKQl|NUdc@=cqbVEdwPWz)hej%Yi z1em92$ywG%Nsq$W1EG&B#jJlsv_Lih}u7L{Muwzt*wj_Cc-p+Vu1@r2n2kb^hMxB`^ zYeV%R4Hp*0LG#1WpV_eR&6}1#wgP50YF}k)5uC=`)|aQ5K`v6eq~Ei2HC&X!i%HQj zZ=sie*%J0?dwH651Y<;2cnj({ zVOoZa1m;ZS|5xn*h6gtRi5Eg#em>d=Ylno%Hi5%T7~DD^<33^p(#0@GCaXBM=< z0P}uc>vX_Ki0W0vy+h3##=yX62+t~3J;p{xo5)Tw*b??fF)d1O4#PzPoM9VIK9+>n=nv->#_N1tw( zP3x$sL})}vsSzqk5H=L)u|tAnL`7F$vJ_ zx{!}qo(iI6HQbAkOdKjIl4Oo5+F%C6bvAAZL+``>9fDlksjZ!5SOJnO1Pbq;>kF9r zUuR6I_?={iyAJJ!oi|5dphnN$LuujBl!FT8w?D)wR2mx@X+((WjqCLD4BsHgE8=zk_54=|k5r&3atx-@a z_sy&0-`_GkEi0Qfx-b`(=ER%aW|VX4jiA<1B1Fl6g0c@^6!OtwXjO-`fegur*=*UO zBIrfn1&95udJ8JQMvA&9gaP3v(ldz^KTWs?J&R*Jbw>MX3sFl2(ol_L&+r#!<}twD00a>tjo6> zt6BSE#UrEm!dIju^-~P9ecMQ7+6yrFt2mwYI!?(CRdIp&`ActZ^Wg{2*pI$yYfbqD zch#>ZU4Vf(aTs>({+8pIcanf&)WaxsZvAD#s)lVRQpR=cVj=m|%;4@}0gY=-O8vh# z-#m-u!^f!UP*TLKCm4AGYc~}ct)Lt~7Rcgtr^OzU=SH(`^rzZ$p$Y13JZ3PWCg{X#2bsn(`?j_5X(-bAB2Q+1CHcSs0jXQTI5Zhp&h z;I-{&BF3mDIPj_kCK4p=YqS$w>++sTjg!mP+(?sGFbU>7OF7>$@GTDA__QuRc{C=PfY-ToiKL2#p#uhdBQw82gIzmShNzdm z9F2MjBzy?3?mJ-kmL_Zkhdup##+5%F_Lz=m*K>9^AR}KKp$wv z)+8>p`k&zJSFQ;z`u6P`f1KKO19dWcR6mncm3a#aDpsi9 z5B2e3Xfv<_L+kinD6WnA+|(P`(^~Gq7Vhe9FcmLzS7e3 zm1ZUhH5(1X*TQkIy9&?c?jC_82UNoi#b5&7xWwTWEpbh(@Js6|XMNZaRt z?a!94EHfghVml8wMH#nN2Tx+P!5QP`!v%TwE8|}DyXU^<|I(SCwAObDWx2JUFKCpL z!e0qVpTSz$j(nU5*WlI`0qDG2_+LoB2;>jNiGZlmm$G@%ZVVB7%wJta(8ECZ{;zx2 zVf;+(=D`|N7vN8b9Zp_|jlw3#G{G^twc$n`42FJ_f8}~#sHd7Ugl1%BGV-5HpH;QX zG!egeTX6&Mzdl>T)AI7ZGVE>hI(*?E^@UPOq+vRw@)cKibnv;L+yfL}laE z9mc=KvoC%JG+N}B>UvT%UghuFg#Q_srNO+xff+MG*%P*@E@$m*TIBzCWS%2~FgwuK z>Ckh7c|}oGpGdK9MYC^Rn9%3j{mv7LNr7`uNOv3?MEXg~LgmtKhcXLOu0_{3PuGZU z^WKQ|yuW|}5Y=$yMl9v?8xIK7kmtr~YxO7W_){UL7r?#)A{hIY%o?ofkRAlASw$K2 ziTJNOHDU(dJqYjS_Ua;z%HjpN4ID_6a(*-d%Ek=urB?Fol+Jsc1|z@xR`P6Am@Z;F}$n?CkHK>EN~9 zTGjhbdxTy|0xxI%g*pGa*rlVy#0h~34l_dqr-@OW33wk3J?Nv{R7!z0OwrI@><9K+ zJyPPv=4!yow8>pp&+Q0cAb5wbNO&C9)@=s?l#Uu%H&3F7Wo#3|Ynu_&p+5>KF*yNr z8g3FdBKDPf8Cb~M*VK~9uG3`V$mH_efG3j-y5VbVtU!1tT+0Tj`WsSKEo`QT#En^ zTkSi9D|iqLTwI3X9lQso+LJpWXDb$9&nTF|XOIz#$N+X3cmEsm)!Kf?`Hau?!F(DI zYR@eCVw!|1i(qs(vKW`amt=19-JCfQQKh9 zj=>ra&UPRyKpL_J-b`EKqXnoh;L4fY>2u~_ll!s*M+YPh>lBa_rX-hZO}c8V9BP4I z@^4gKAC4@6Joa!)RIZz|VY6MdoUCc=B{n#JAPq|JuBs{pl2t&h!X5jBlLXxTA(qem z?rS(Flw_%sK;ZZx=8>VgAblf$m(T>GP8WkFoG+C9K!5WIzS+bIzWm)20t%>9(moWj z{(cQ3YqMcEf=%^qoohlC7xA+uvS)WZ-M@8vd)NgjdmcFKy5YuijUS-7d||ZJ+7l_^ zbJna>Oq2_O$hcXe&JZ<&J0&OJ=>JDyUX~)pQcgu zkay#sh`3NID?(^TFT0aeo04+J`?FH&xT^CU4bR3JhR zSQ;ooHXtN8SnAXQ3Wu@Yyx2j?sGrdSV9kaP&kxym1gSRG_}h2VI@TM$!V5%p7SUed zIfQYz`1aJ-ItD?bGF&Vp!x9;Z^P_m9X#=zE?eUfN+J#1%%0&VOT zez0v}nxS=9#`CuR*Ec(%AYi;Ug8zj&WYPKccw!KDAkstJfQpgHu4d3}_%>VVCMj*$ zp_KIE#Y0F>sx%(H2NX_p_Gedaf52ggcoS8ail@R5?9IT|j~zX<)N%+|GU%KvgA{w>X(M(=$zbk7 zdZD0dw3n!*$*6Z;!lf{y7dWF3Z$_ak47tOIiKW#}B>hyYuaOQ^xGeULPfWjH6d!N1Pe*KVKY z(3x&{Rp(Kj_p>#O-HUKSN8?jK)`7BaUDmxL&z?>#Ek~QjUWz{0+Uj)?*^;W;-_}p^ zYlOw-;(*~QoC*hxauQDwF=HQFMlk(J8Zf)=qH4*3->yeXJ8OcV1^T{BV^690`tjxn z@ez=fpU;L@Y6uBOTS5j%VRI~*rP6x!{ytoFL=du2#bxKmaQ+y&0bhi*k7xsLhQwen z`HjuZ`j+e>DNows*-C^hq6vwc011%%oZ898`78L>H!E1MpGzEN9j|AZN`jbM0J#&& zofxv3x=j)0wA^!*tgDD&YlWYMBttynPG0Mr3}bcftq0YAxuhI)@DQukOgBMscQXU! z$(@>#lE82-NrO4<%ZY2vYN}Ck(-+;A>)^DT?c4ApuR>kbuLo*0iHPf$Uo0f#jgVM; z5ZUR5;;Juj$)9u2xt^JzuMP)y4T(9(WxBzE0HVh4XjCf~U!@&iIw)_K-)VLp@$*=x zzAjvG;B8-|eAeGvn;ZG?;V>A3Y598Zs$ml@Cdc3LWf_s(ea0X+{2R5Xf_umXBnFjQ-Oi+-^~r1v>|%u&3^?;J zoY>{xPM-}nhO(rInf}?TCm!ord0L*Hxk;L=EJu#S&i-(=|39)8|25IY^CoEgOP_$7 z;Kmo1A`{Bh^6>9|V4-fvW5UpzX&O#k;IHibS_{+_UTmM^w2gS1a)D@kZ^___`aYMPM; zz%F$_(xXmc>!j*;s0ZP#ZPVSIb#eArz1y8nS&w#13|y3HHxv|9+c#c&E*Z3oE~yd? z&IU(BOagQwxvtotu~rDA=Hq;*jFOh_g*9w=4{oJiftGd<`TpQI8gq97KwC56&;<|> z>0BcPWV#I!++tPOi9^}s4Zzyh!@~Ik)LWxjv5U>`!WDF$>~#zTydIDYwC=wXL{P8$ zwNsRVSc0W*S4wIzSD;1cfJhob{6WFabvl0vjt&^tM#R3{|2w(u&F$Ocplzs@dq=b- z$|Un&NBlU}%8J~v7SkzRbmb1Hwh%%>^oa;AZcP@b*OFByi;}c z8q^Hpx%f>bG*6*Dnqr25;RpH#SRdu_AD`|A*2h+x{okw)H>qsN;7x|n#g$n~0kX1- zLC@SvHk*OSCM%_thF6HYyq1Xh`gR#A7tLSaVDsAH0`}1nO7OUj0`>m}HYL$GRJspiAGo|BeuY!J^!_ee&GU@fU9R@`-s4YpEg4Cvyh*G)DTP}&rr z5BUS(Jd*<42&H`ES{E$<3#x~zHQu?uZa$vZ`gNF|FbRLYP@4N5-M|({PqS3^47Fi@J5vkLy7Nkz7)_XYKQaO1|}A!<1bnitn|C} z0va${=r6CV`vA1a-RR4zr$`v63|$vg75E{b;ZDWGm4*v4X8=U#jB%~DcUMU*u%0BG zAHLDQ03<@l$wf&09bjz9j;TidiCUj2J<`TQtUYFrECrj3fs%pgEkMajLE|IM)}YA_ z6|p+rnP$?uMhifzpx$*mKVQ@3fw;zTa2)n{D%-clZm^^Kd#d>7Q$hdVCs)pn=;Miq8TfmeC zD1BJs?Z7EwFq0oYmjC0$`1q^)q(N#0&u=86^eO}Df$+4_(qrfG*NQ)m^_QDHJ22Wx zyx0ptxyo@~olDQnO7hH0OwBNNn#0!?Tiv212NSMvFD2gtC~OUaN*6Iuyx(cgzmmhLRmys6+MKB59XUr}5ZbT(A16 zjuYs#Za|OH(k4E#48bg{jj5H%4g>F`>N$xQE%M&H$ucj02axgnG@Lhfqbgiv4)6KgIbjl$KYVR~7nDn^&LH;a{CjuqT|A9=8qqaC>D z&_5hEmJctA61>}J=x0&!2cNDZg&-ONMY8`42+?&plWYKQ)B&e9#IvY~T+?)@I0~l8li1RriV5M}GwUa*K`|$vuKDu;%m)ZCq zrtN9Dt^JHW^Q06`{5=^O68Jx*wxGAE86;v8`4J#uE3;Mnb83bt7ZBd!Nv+3><5vztIJP$N=5jua6%;e#I^iRl`n5 zBn8Yv$T;urnZT1d&2^z1y#e>G<_OfEAobPJz5NI{`o?|G!I1*g15IsW*5sk-X@QLj zzegVetrZJcdOT5lIBS&xo@vFsbRci>Gu@K|hYuey4iFL+}N_ zN=>b<@9{a)`|_S-&Q_fPXD{xaHrf9m-9gX@qT9=Ob{5^nk2L5v?5`H=S{c-O9>p!a|1VJE= zv!UHOkjxp8SpE06S}L9L1&vF7twqzV^(9Pa+VIrW)XRED$wNH2K%}2p9@C& zw?sA-E}RBuoU*2*=cbF6R-o8h&Y@wYq&@o%-y`SM_x74}-4p(g3t=fiF*olg?lVI2 z2o;B3&~?fP=9IifyG&UYr^*?jd^sqR;pEAaEG!v^F6_sy1&z}Lo5XMfe=QH~I-P(- zhI($C7H9G=zyA8{`E#p1>X*$uQMjc*s?$2v(n!GTKkmlD!gAt7(%*Meu>(y2cmz~b z7VWA_6G3`sd#*6}4jrpk1NkK~U2q_Qok;tqw->hQfA)CB?agt5gZBR_S2eF>UB2=7 Fe*r084gvrG literal 0 HcmV?d00001 diff --git a/localization/es/composite-view/README.md b/localization/es/composite-view/README.md new file mode 100644 index 000000000000..dfd77fade57c --- /dev/null +++ b/localization/es/composite-view/README.md @@ -0,0 +1,385 @@ +--- +title: Composite View +category: Structural +language: es +tag: + - Enterprise patterns + - Presentation +--- + +## Propósito + +El objetivo principal del patrón de diseño Composite View es componer objetos en estructuras de árbol para representar +jerarquías parte-todo. Esto permite a los clientes tratar objetos individuales y composiciones de objetos de manera +uniforme, simplificando la gestión de estructuras complejas. + +## Explicación + +Ejemplo del mundo real + +> Un sitio de noticias quiere mostrar la fecha actual y las noticias a diferentes usuarios basándose en las preferencias +> de ese usuario. El sitio de noticias sustituirá en diferentes componentes de alimentación de noticias en función de +> los intereses del usuario, por defecto a las noticias locales. + +En pocas palabras + +> El patrón de vista compuesta consiste en tener una vista principal compuesta por subvistas más pequeñas. El diseño de +> esta vista compuesta se basa en una plantilla. Un View-manager decide entonces qué subvistas incluir en esta +> plantilla. + +Wikipedia dice + +> Vistas compuestas que están formadas por múltiples subvistas atómicas. Cada componente de la plantilla puede incluirse +> dinámicamente en el conjunto y el diseño de la página puede gestionarse independientemente del contenido. Esta +> solución permite crear una vista compuesta basada en la inclusión y sustitución de fragmentos modulares de plantillas +> dinámicas y estáticas. Promueve la reutilización de porciones atómicas de la vista fomentando el diseño modular. + +**Ejemplo programático** + +Dado que se trata de un patrón de desarrollo web, se requiere un servidor para demostrarlo. Este ejemplo utiliza Tomcat +10.0.13 para ejecutar el servlet, y este ejemplo programático sólo funcionará con Tomcat 10+. + +En primer lugar, existe `AppServlet` que es un `HttpServlet` que se ejecuta en Tomcat 10+. + +```java +public class AppServlet extends HttpServlet { + private String msgPartOne = "

This Server Doesn't Support"; + private String msgPartTwo = "Requests

\n" + + "

Use a GET request with boolean values for the following parameters

\n" + + "

'name'

\n

'bus'

\n

'sports'

\n

'sci'

\n

'world'

"; + + private String destination = "newsDisplay.jsp"; + + public AppServlet() { + + } + + @Override + public void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + RequestDispatcher requestDispatcher = req.getRequestDispatcher(destination); + ClientPropertiesBean reqParams = new ClientPropertiesBean(req); + req.setAttribute("properties", reqParams); + requestDispatcher.forward(req, resp); + } + + @Override + public void doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + resp.setContentType("text/html"); + PrintWriter out = resp.getWriter(); + out.println(msgPartOne + " Post " + msgPartTwo); + + } + + @Override + public void doDelete(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + resp.setContentType("text/html"); + PrintWriter out = resp.getWriter(); + out.println(msgPartOne + " Delete " + msgPartTwo); + + } + + @Override + public void doPut(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + resp.setContentType("text/html"); + PrintWriter out = resp.getWriter(); + out.println(msgPartOne + " Put " + msgPartTwo); + + } +} + +``` + +Este servlet no forma parte del patrón, y simplemente reenvía las peticiones GET a la JSP correcta. Las peticiones PUT, +POST y DELETE no están soportadas y simplemente mostrarán un mensaje de error. + +La gestión de la vista en este ejemplo se realiza a través de una clase javabean: `ClientPropertiesBean`, que almacena +las preferencias del usuario. + +```java +public class ClientPropertiesBean implements Serializable { + + private static final String WORLD_PARAM = "world"; + private static final String SCIENCE_PARAM = "sci"; + private static final String SPORTS_PARAM = "sport"; + private static final String BUSINESS_PARAM = "bus"; + private static final String NAME_PARAM = "name"; + + private static final String DEFAULT_NAME = "DEFAULT_NAME"; + private boolean worldNewsInterest; + private boolean sportsInterest; + private boolean businessInterest; + private boolean scienceNewsInterest; + private String name; + + public ClientPropertiesBean() { + worldNewsInterest = true; + sportsInterest = true; + businessInterest = true; + scienceNewsInterest = true; + name = DEFAULT_NAME; + + } + + public ClientPropertiesBean(HttpServletRequest req) { + worldNewsInterest = Boolean.parseBoolean(req.getParameter(WORLD_PARAM)); + sportsInterest = Boolean.parseBoolean(req.getParameter(SPORTS_PARAM)); + businessInterest = Boolean.parseBoolean(req.getParameter(BUSINESS_PARAM)); + scienceNewsInterest = Boolean.parseBoolean(req.getParameter(SCIENCE_PARAM)); + String tempName = req.getParameter(NAME_PARAM); + if (tempName == null || tempName == "") { + tempName = DEFAULT_NAME; + } + name = tempName; + } + // getters and setters generated by Lombok +} +``` + +Este javabean tiene un constructor por defecto, y otro que toma un `HttpServletRequest`. + +Este segundo constructor toma el objeto de solicitud, analiza los parámetros de la solicitud que contienen las +preferencias del usuario para los diferentes tipos de noticias. + +La plantilla para la página de noticias está en `newsDisplay.jsp`. + +```html + + + + + + +<%ClientPropertiesBean propertiesBean = (ClientPropertiesBean) request.getAttribute("properties");%> +

Welcome <%= propertiesBean.getName()%>

+ + + + + + <% if(propertiesBean.isWorldNewsInterest()) { %> + + <% } else { %> + + <% } %> + + + + <% if(propertiesBean.isBusinessInterest()) { %> + + <% } else { %> + + <% } %> + + <% if(propertiesBean.isSportsInterest()) { %> + + <% } else { %> + + <% } %> + + + + <% if(propertiesBean.isScienceNewsInterest()) { %> + + <% } else { %> + + <% } %> + + +
<%@include file="worldNews.jsp"%><%@include file="localNews.jsp"%>
<%@include file="businessNews.jsp"%><%@include file="localNews.jsp"%><%@include file="sportsNews.jsp"%><%@include file="localNews.jsp"%>
<%@include file="scienceNews.jsp"%><%@include file="localNews.jsp"%>
+ + +``` + +Esta página JSP es la plantilla. Declara una tabla con tres filas, con un componente en la primera fila, dos componentes +en la segunda fila y un componente en la tercera fila. + +Los scriplets en el archivo son parte de la estrategia de gestión de vistas que incluyen diferentes subvistas atómicas +basadas en las preferencias del usuario en el Javabean. + +A continuación se muestran dos ejemplos de las subvistas atómicas simuladas utilizadas en el +compuesto: `businessNews.jsp` + +```html + + + + + + +

+ Generic Business News +

+ + + + + + + + + +
Stock prices up across the worldNew tech companies to invest in
Industry leaders unveil new projectPrice fluctuations and what they mean
+ + +``` + +`localNews.jsp` + +```html + + + +
+

+ Generic Local News +

+
    +
  • + Mayoral elections coming up in 2 weeks +
  • +
  • + New parking meter rates downtown coming tomorrow +
  • +
  • + Park renovations to finish by the next year +
  • +
  • + Annual marathon sign ups available online +
  • +
+
+ + +``` + +Los resultados son los siguientes: + +1) El usuario ha puesto su nombre como `Tammy` en los parámetros de la petición y ninguna + preferencia: ![alt text](./etc/images/noparam.png) +2) El usuario ha puesto su nombre como `Johnny` en los parámetros de la petición y tiene preferencia por noticias del + mundo, negocios y ciencia: ![alt text](./etc/images/threeparams.png) + +Las distintas subvistas como `worldNews.jsp`, `businessNews.jsp`, etc. se incluyen condicionalmente en función de los +parámetros de la solicitud. + +**Cómo utilizarlo** + +Para probar este ejemplo, asegúrese de tener Tomcat 10+ instalado. Configure su IDE para construir un archivo WAR a +partir del módulo y despliegue ese archivo en el servidor + +IntelliJ: + +En `Run` y `edit configurations` Asegúrate de que el servidor Tomcat es una de las configuraciones de ejecución. Vaya a +la pestaña de despliegue y asegúrese de que se está construyendo un artefacto llamado `composite-view:war exploded`. Si +no está presente, añada uno. + +Asegúrate de que el artefacto se está construyendo a partir del contenido del directorio `web` y de los resultados de la +compilación del módulo. Apunta la salida del artefacto a un lugar conveniente. Ejecute la configuración y vea la página +de destino, siga las instrucciones de esa página para continuar. + +## Diagrama de clases + +![alt text](./etc/composite_view.png) + +El diagrama de clases aquí muestra el Javabean que es el gestor de vistas. Las vistas son JSP's dentro del directorio +web. + +## Aplicabilidad: + +Utiliza el patrón de diseño Composite View cuando: + +## Desea representar jerarquías parciales de objetos. + +* Esperas que las estructuras compuestas puedan incluir nuevos componentes en el futuro. +* Desea que los clientes puedan ignorar la diferencia entre composiciones de objetos y objetos individuales. Los + clientes tratarán todos los objetos de la estructura compuesta de manera uniforme. + +## Usos conocidos + +* Interfaces gráficas de usuario (GUI) en las que los widgets pueden contener otros widgets (por ejemplo, una ventana + con paneles, botones y campos de texto). +* Estructuras de documentos, como la representación de tablas que contienen filas, que a su vez contienen celdas, todas + las cuales pueden tratarse como elementos de una jerarquía unificada. + +## Consecuencias + +Ventajas: + +* Gran flexibilidad a la hora de añadir nuevos componentes: Como los compuestos y los nodos hoja se tratan de manera + uniforme, es más fácil añadir nuevos tipos de componentes. +* Código cliente simplificado: Los clientes pueden tratar las estructuras compuestas y los elementos individuales de + manera uniforme, lo que reduce la complejidad del código cliente. + +Contrapartidas: + +* Generalización excesiva: El diseño del sistema puede volverse más complejo si haces que todo sea compuesto, + especialmente si tu aplicación no lo requiere. +* Dificultad en la aplicación de restricciones: Puede ser más difícil restringir los componentes de un compuesto a sólo + ciertos tipos. + +## Patrones Relacionados + +* [Decorator](https://java-design-patterns.com/patterns/decorator/): Mientras que Decorator se utiliza para añadir + responsabilidades a los objetos, Composite está pensado para construir estructuras de objetos. +* [Flyweight](https://java-design-patterns.com/patterns/flyweight/): Composite puede combinarse a menudo con Flyweight + para implementar nodos hoja compartidos en una estructura compuesta, reduciendo la huella de memoria. +* [Cadena de responsabilidad](https://java-design-patterns.com/patterns/chain-of-responsibility/): Puede usarse con + Composite para permitir a los componentes pasar peticiones a través de la jerarquía. +* [Composite](https://java-design-patterns.com/patterns/composite/) +* [Ayudante de vista](https://www.oracle.com/java/technologies/viewhelper.html) + +## Créditos + +* [Core J2EE Patterns - Composite View](https://www.oracle.com/java/technologies/composite-view.html) +* [Composite View Design Pattern – Core J2EE Patterns](https://www.dineshonjava.com/composite-view-design-pattern/) +* [Patterns of Enterprise Application Architecture](https://amzn.to/49jpQG3) +* [Head First Design Patterns: Building Extensible and Maintainable Object-Oriented Software](https://amzn.to/3xfntGJ) diff --git a/localization/es/composite-view/etc/composite_view.png b/localization/es/composite-view/etc/composite_view.png new file mode 100644 index 0000000000000000000000000000000000000000..66215d9416b8ae2422e3c4260a6da24f164e3765 GIT binary patch literal 19092 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

%7Lr|HB3qZ+=U@9^}6r_fI<$JNF~Pnx9O? z8I2i`8o093* z#lfjvaY#wv76ql3 ze|=ki!1oNi?8OBA(=V4J2u>9cAMB1yG+a*At;2Gz4>-s)%=tE$*feh_8*d&SsFM&R zKcLkKx6|e2G<&>ixkn{bQ}_G>im2;{TYUbTq43|o9|^3f){B!vE$HBP2Gu)xZ<{e2 z?NFduC`hg_Ik?1AaAc%RRj_2ZZkTn$**9v>9=QwsoyaT~s2t`pF#-mD3$^^k_o4D zSG0YY3m!nv10}4*IFV9=55*T&*Jwj|eMjqVMW^h$%o+jlV|D$Yh5484jLVCWN;A=E z%R@P28&)9vJkH4UpR=Mcl3clEn+3|Egz_VzS@OM8&87aERU; z?m$gFdrmG(U_AHlP z^3XRE7i+qAY>&`>0YnnPK6JNP{vo0J zhJsXr+Sf^4aZ92w#lI{i(`N}q$s;qS6h@p`bJ>&?>ZAwOJXkGOHGLJ=ULImkB1yv}=eVoaGm!Huf8(hVM2) zxwU6ivbUnHHCiP}{yYDL=HyTKf}wWylrVVT@pZ#i4R6G#iA5@5m6DJMC~OEdowO+x zeq|Uf?tac$oLNlSy6Io3T|P`{8y=jLi$%oA&bI)nt$*kL&-?nvuXc{F<(lIr-Vv7d z2fFq8>pLR-eTHh!G@%ymli03Zn%TH||C#hpm&q(y$2`#Vdif7xr&4{Y*AKZHO*Aa; z^VT|jK+TUEE-loRb8owJUB6#jQ7DCw+gxKP4FVViGPWxl#reNNE#BZW&~Wsh{3_(RY&B#~#ks7#BAFz682y-!gjpJ+`LCK=P%b!w=Z`!hj^b2>j?Q5Pf6d7bpF2oi%4}@%f{L`34 zFVoXvQ;Ud*RZBuq zT!R2456P=?0cUGb@5^VM>kn0XXO$IfW0^D7<|+%260mf`m0(O zl_)f-^GCetRl5CmNYH)D$5S~CIA|=Z-Wy%#$K z(_{WWbB)~TV)^~H^|NEvFWiL1XMzQ=4HmvBg+p=G(%z7nQO=)y)aTDeRq*@mcBq0`eusR1J4}An4BW0=DDT1L zA>bkAAp>lP>Up;bEQ-1XJP}8rOANf5TMWEW8~s2WJW^gBx6;nc*eJ@#$hdF`Q>LFM zXrnii)5-RvDWF4i3T4lpIwb|%sqO*Zz0L{THoNEe_uX@OLT??}AgLb@+=;Gn@WJ1| zdFqEJn(e6p?lWJg()=By!2K5Aqo>(G7pqF_*?<3Sip8b2>FYsz+EYIKt25{N&wusr X3WXK?%143cLos-|`njxgN@xNA1M$d) literal 0 HcmV?d00001 diff --git a/localization/es/composite-view/etc/images/noparam.png b/localization/es/composite-view/etc/images/noparam.png new file mode 100644 index 0000000000000000000000000000000000000000..2979cf2bc65756821c7434fa1892bed02e8225ef GIT binary patch literal 72495 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 ?QdGzbD_KUCQgDO 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 qHm{w{Pe0CEm>6EaQg+Gt;r{_?p+dU= literal 0 HcmV?d00001 diff --git a/localization/es/composite-view/etc/images/threeparams.png b/localization/es/composite-view/etc/images/threeparams.png new file mode 100644 index 0000000000000000000000000000000000000000..9338dedb8885a8636f7260d4ac2f8f992270b854 GIT binary patch literal 78650 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 Cada frase se compone de palabras que a su vez se componen de caracteres. Cada uno de estos objetos es imprimible y +> puede tener algo impreso antes o después de ellos, como la frase siempre termina con punto final y la palabra siempre +> tiene espacio antes de ella. + +En pocas palabras + +> El patrón compuesto permite a los clientes tratar uniformemente los objetos individuales. + +Wikipedia dice + +> En ingeniería de software, el patrón compuesto es un patrón de diseño de partición. El patrón compuesto describe que +> un grupo de objetos debe ser tratado de la misma manera que una única instancia de un objeto. La intención de un +> compuesto es "componer" objetos en estructuras de árbol para representar jerarquías parte-todo. La implementación del +> patrón de composición permite a los clientes tratar los objetos individuales y las composiciones de manera uniforme. + +**Ejemplo programático** + +Tomando nuestro ejemplo anterior. Aquí tenemos la clase base `LetterComposite` y los diferentes tipos +imprimibles `Letter`, `Word` y `Sentence`. + +```java +public abstract class LetterComposite { + + private final List children = new ArrayList<>(); + + public void add(LetterComposite letter) { + children.add(letter); + } + + public int count() { + return children.size(); + } + + protected void printThisBefore() { + } + + protected void printThisAfter() { + } + + public void print() { + printThisBefore(); + children.forEach(LetterComposite::print); + printThisAfter(); + } +} + +public class Letter extends LetterComposite { + + private final char character; + + public Letter(char c) { + this.character = c; + } + + @Override + protected void printThisBefore() { + System.out.print(character); + } +} + +public class Word extends LetterComposite { + + public Word(List letters) { + letters.forEach(this::add); + } + + public Word(char... letters) { + for (char letter : letters) { + this.add(new Letter(letter)); + } + } + + @Override + protected void printThisBefore() { + System.out.print(" "); + } +} + +public class Sentence extends LetterComposite { + + public Sentence(List words) { + words.forEach(this::add); + } + + @Override + protected void printThisAfter() { + System.out.print("."); + } +} +``` + +Entonces tenemos un mensajero para llevar mensajes: + +```java +public class Messenger { + + LetterComposite messageFromOrcs() { + + var words = List.of( + new Word('W', 'h', 'e', 'r', 'e'), + new Word('t', 'h', 'e', 'r', 'e'), + new Word('i', 's'), + new Word('a'), + new Word('w', 'h', 'i', 'p'), + new Word('t', 'h', 'e', 'r', 'e'), + new Word('i', 's'), + new Word('a'), + new Word('w', 'a', 'y') + ); + + return new Sentence(words); + + } + + LetterComposite messageFromElves() { + + var words = List.of( + new Word('M', 'u', 'c', 'h'), + new Word('w', 'i', 'n', 'd'), + new Word('p', 'o', 'u', 'r', 's'), + new Word('f', 'r', 'o', 'm'), + new Word('y', 'o', 'u', 'r'), + new Word('m', 'o', 'u', 't', 'h') + ); + + return new Sentence(words); + + } + +} +``` + +Y entonces se puede utilizar como: + +```java +var messenger=new Messenger(); + + LOGGER.info("Message from the orcs: "); + messenger.messageFromOrcs().print(); + + LOGGER.info("Message from the elves: "); + messenger.messageFromElves().print(); +``` + +La salida de la consola: + +``` +Message from the orcs: + Where there is a whip there is a way. +Message from the elves: + Much wind pours from your mouth. +``` + +## Diagrama de clases + +![alt text](./etc/composite.urm.png "Diagrama de clases compuestas") + +## Aplicabilidad + +Utilice el patrón Composite cuando + +* Desea representar jerarquías parciales de objetos. +* Desea que los clientes puedan ignorar la diferencia entre composiciones de objetos y objetos individuales. Los + clientes tratarán todos los objetos de la estructura compuesta de manera uniforme. + +## Usos conocidos + +* Interfaces gráficas de usuario donde los componentes pueden contener otros componentes (por ejemplo, paneles que + contienen botones, etiquetas, otros paneles). +* Representaciones de sistemas de archivos donde los directorios pueden contener archivos y otros directorios. +* Estructuras organizativas en las que un departamento puede contener subdepartamentos y empleados. +* [java.awt.Container](http://docs.oracle.com/javase/8/docs/api/java/awt/Container.html) + y [java.awt.Component](http://docs.oracle.com/javase/8/docs/api/java/awt/Component.html) +* Ãrbol de componentes [Apache Wicket](https://github.com/apache/wicket), + ver [Component](https://github.com/apache/wicket/blob/91e154702ab1ff3481ef6cbb04c6044814b7e130/wicket-core/src/main/java/org/apache/wicket/Component.java) + y [MarkupContainer](https://github.com/apache/wicket/blob/b60ec64d0b50a611a9549809c9ab216f0ffa3ae3/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java) + +## Consecuencias + +Ventajas: + +* Simplifica el código cliente, ya que puede tratar estructuras compuestas y objetos individuales de manera uniforme. +* Facilita la adición de nuevos tipos de componentes, ya que no es necesario modificar el código existente. + +Contrapartidas: + +* Puede hacer que el diseño sea demasiado general. Puede ser difícil restringir los componentes de un compuesto. +* Puede dificultar la restricción de los tipos de componentes de un compuesto. + +## Patrones relacionados + +* [Flyweight](https://java-design-patterns.com/patterns/flyweight/): Composite puede usar Flyweight para compartir + instancias de componentes entre varios composites. +* [Iterador](https://java-design-patterns.com/patterns/iterator/): Puede ser utilizado para atravesar estructuras + Composite. +* [Visitante](https://java-design-patterns.com/patterns/visitor/): Puede aplicar una operación sobre una estructura + Composite. + +## Créditos + +* [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59) +* [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b) +* [Refactoring to Patterns](https://www.amazon.com/gp/product/0321213351/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321213351&linkCode=as2&tag=javadesignpat-20&linkId=2a76fcb387234bc71b1c61150b3cc3a7) +* [Pattern-Oriented Software Architecture, Volume 1: A System of Patterns](https://amzn.to/3xoLAmi) +* [Patterns of Enterprise Application Architecture](https://amzn.to/3vBKXWb) diff --git a/localization/es/composite/etc/composite.urm.png b/localization/es/composite/etc/composite.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..93c160f6450a92da0a2eba5f654b639c736e92a2 GIT binary patch literal 35715 zcmbSzWn5Hm*RF~Q2#Rzg-H3FD)X?1^CEeYE!q71c4U$8552?~E-Q6uA9cKgoc%JvX z=gZ*>^BZRN-uJp!T-UYMO`x2N*h@rQ#0L)^yp$0Cpzz?qW5EXx9%?*)1ia%#GwcEU zqIM8bb1<;BakVh|aBLeI*<(b9s!z}oUP6DR(I z2ah;RmDC*me*eKk;4&^rp-NL$i2|=YbvtjEK)M2$9UNBC>0MpDrOH9VuE}vh$jn9($fy9hU*rf8O>It_M!7>yHoTo(UrH_ua zF=oBnM_VkN7=UB&VoPS9RGFnJx5T4Jf;Q=m^!dnIQ!kk%TP0ee`FvQ=#5|eMR52 z;TqiDH5p*q`(ZMqbSBd*MmNF$G5lJz(<7oVo}qQS^9sSKU@_wtJ1&J3HiiDEc+UI2 zD5b!n?29K~u5}5TNGj+3e~BgvZp}1r)`>AWDchV~vx?Urk2N2jKcLiUz^4QsvnOu3 z@?Sjb9(g@&CTzC--`m*4&;q-EOrRI0t1`JTO_OGRHp zMDIs${W{Cp=&Hd~K}5?5^rn$G+l1YZyGeSo*k^G9bHtIRn_tBds~#gM^s6OC%t2RN zO>WpM_#Qm?{6OM^ppuKucJeb9^pUYP1W@r{ouEMNXY|*|_Q4#K6+K|ob{q^^-$Nyg!Rpjky2BSJ7MBulywESLpa(A`QopGCbChHqd z1?)Km{7!N1>G(_3fcfB3-OWUkS3w%&DV zY3c06{Ws&D@*tPc^6~MZi@*QWGhXLxZD?qyq%^$L9)2cs{}GcVal$N%iL#29+O-by zo=DsNtSOg6*|I}0$+d-r*XZaU*jAT2qn!6B==}{CQ(JT%uvG1ck74e z!KxRtuE)MekrteXm$$R+tDm2Uh)9FmpP;?R_bYoEwyei7uZQdlPw6>W>CU~8<-b~9 zS*i5AIF6!}U36l;``AaW827l-)6*wNm`Zs{)WZJAPY}_u`8-Y!*ZOmL85pe2k2YYE zu`-ElmN9hdnf;`1+nOcVp6V50K zX$ZIdx;JVRyS0uRx6AL3$H!a6Oh&HMe4(v#xeU=Zgem8uulo9V24UlsMsNWXark-%QoV&}%yFOjg<~ z{A>-zGTs4g|HkP`9LNw0e=8DX*agkiu5+pwv&g#+s%23GfrHa2+JN)^6OY|;$MMe8#8fi3bCl0{t?s7<ctt$KJ|jUP2>3Nmc`xV8$Db{rC;nAEEd%e0FI{{8d-~0#6MMU zHj=l0b=}ODLNXO{yYy7DF_Ihu$3HH?Md#D%71> z?I1Tkb#}NmG-W!JweYu-Ghn)5%gV~KT^cPp##fq;l^q8JJRcow^7eKEoKNF8CbWs$ zX}e>VdFh?WFXH3l8Rt1zHUG`!d-ra=Q1HfNWxnPjy)vyzK`Ivi**TUDk*6u6egoe;m5KX8D^zsU<7{&P{@yY(yWOIZ`zg@?bz`^NK4+T-KmrfYqq zlarG%-2q_tnLqV(aJ@2o1V$z5vucwZZ0@LQBOwYiA1fN56xH;b>b#F*xZ1kj@&aQh zU-Zloxb^0m{d$y{aGU$9;XV@(bWV!M393a}64v%>eOEixb6JwHyQ{s4EdIM=#kxT3 z&Y(Rz8eY3RJ2V~4w3WQ{`uue3C}s!gB0&g0ck5)0O|}KF@0wm15q}@%w@fg}@$Sr2 zjy&lxFRH<6Py7M1BTq>EGLSF2Lh&(ZluqZrpxXTH8CXcXAv`)`wWwX)-NBVPv(Jnc zPZN2bHqfh;5WDB^=^&0E1>?tByzTdLn8l`uuvt1HBj&ViPD4Uuhb-cRHBNT;;9iJgjd{Qb-2qM0{FsJEM;u=bLVLDRf|<=tOqw!EqMp1eV3ab&9a2-UFuI1XcsmjXLK&NbpAk zlZob6L>|8%n&ZFIf821jTeml^d8YmvSF{}0s5^$9R8yhSOnKDD6_Tr%J-9`uUiLvu zEOC%u0`;(1n@_k3$0|@%#4D=__^d@ zGcU?B35fR_@7he0f%J-%m9ASu5N>_v>1=R6!DYAV33~Xdz`sn!TahP(;C3MeE$<88 z8nlI2PE~pSo`0B_SN>K4vi`+vI7j{)kE=Y-y?%KzZJr#9FOx!toM0qG{4wHGio>VwX%FamC>BC78$)+l%1PI`Sj^t*0nUe9UC^=||; z!em@(HB*ZR)D>V~_LtgMuWJE_argNL-@Smpe*EFv(a`~v>!_%ACu6Jyf0*8(rhM27 z`%LWF%H!50g7QG%g&p;BLRs_3L(14Izh*>RG+|%PV8Frlrs3~-c#i{7kL@u54|wtXIWgWF930c#Vso-^ zFekUO%8?c0b2LY%KDv?dCl9Cu8T_=Qo$9#em&>wk)JSABNPZ->c0`i$^74N1_5Jzt zXL@>i4c|HN-85-vrok(+&0_|}|Hn5;+~WYqaDIBaJq-wcz@AaJIZ>c**zlru8QgjU)B716mho4q*TFN&q?E;Kr9T(jtE7DV-aeiX zS`4l4412Szfb=0Z8jTL7{^v+DkCWUOG_V*F@us6s^;zOKt+DFD7j!4EJ^_8t4b1kd z>wws#xlWEDJyun0**wtgLlh`@ShV;wHa7&bXz&|9ZHW;g;>vQod z%>L%%$lcmH&t>+lLO&LXY|D09?rR7g=J(%BowT4#s7x=Y30kCQkR&BzUKeMqy=n-L?9l<8Q{*^JoOVYw;OE zApOjU7I)01 zly^Lio5NO!gPGFJe}tfynwP)J`%K7sJG-J*@Bzw=gwT zdm~qim__b**Vv%Aj&7ESN4<_)Hj_@J8DyLx@8b`ig$479*-70nPqp6Y(DtY@v$3Ki zUiX+-M%2Kl5XRdmEd4OxUXRdKG4E@-!q<-+&pgPtN)NT}%EQ_E>G@2SAmN?8Xc1m# zoniUcpp>8bMmtm0Jm#ZPrKK-6HdcEhPUiYk*sW#G=nEIm|Lpv=ATeZ-VWxMDY7c^+ zD4(8|t8kjGZibrh=-D;iv#<`?h@3H`-_Mgqz(kPye zsT|03<|6`&Kb?59AEHK)RdE!oc8xAcWOc`~!(>yc3?-bc_cj)lmhP=SP`W2}hKl_| zL}9PgGhX$2f2`DQDPp6!HBNKR`gE7CxwW;+?a!u-Kk`NxzC_L1k8X3fv7+9alcw;M z>ee6({h7X$Ik~25O7${B8s)C!Np(_q^2X3J`Gcs}xr%RG zunF*K(dC<4aZ~U_``RgP$%ZNI6pVJm^n=tHwm9>qpJ2%IOpL{M3Uj6%)vOHm2)Maua*h@**Wq zxjQIV)10KMVvoyiJ&N|=LSFETs0Mzg1LoHwuQw0!6#g*jUshOYhZjbkuEY}6ROgk8 zv!QT;`Tnxmi#Ltt1B-{9Q5Wo{2l3P5&uqJ(4_Q8Y>@^fLxK*Y{W_!6K-en)UfvPS` zk1@K{x4Bl`=M`Tz2D1;PH*@I{*nelJEb2#}UmnuXsUK~P9iPm#hvSY2drcK;+Pl5R zbFXmNNN)x^yPh&RbjLi2XEq855dXc1?vdhkF0VBFX>_d_b&iO;YAr+TVzfBrtdBc) zLC?V^Rqn&fH_y->akz?f4s{(#zR=PtP+(y`+>e*9b6SarXoZR(VfNVn*;HB8>ll&q z-I=@Dx;QyW;@is$t6HVg z)R>&qQ)aZ3*)ptM@1kcX2(3kUv|4|$%T4FFMfXAGf`J^&2lvhQSg9M$6F+9Wfz_y~ zr-KKAh?4j8Dn6B(c5og6DaHv~77~O(Tj8_=4aQ=&A8+CIXEoOv+ ze)&ac1zjHZ^LwXbfl-V5zVUW%jV%=L<0PgDb4vvN5KC5HN)yfp@Oqz>5NYI%KX~AW zkI-vYDSYwg^UE0Iva~~tchU3?RXDy%_*r;r>e)*?FHmSt^9NBk`Nim{P2VS^bq=OZ zmo?RZOD3|RT2XBTb=(o*Qnp2zOv*xwW|CkdG%;k38Jz4JSO}Gk&Sta{*n9jkL ze^IJ_ynd=8S|&@_;PZ7|uVPWGz1gH!e<;F!z1gg2o9P?!OYLtY!nKsL$3t5{=ukCD z9sWsf)w#InXHZ;4xH?9MssQ4W+S?Qd)~m3mHjziAo$tgB-C%_z3@W(<+%XYXHQwH` z*O&119l$vbmOBNl0TrY78_Ub*af(G+ws3x&6{j6sP~Z=MxbYQ4`iApVOlRvhRsCk- z;s8;l`v)4lc$ie5zHDlA4tvbNphCT>_l=KNK)u@QN_ITCwx{{=(>@qR!y$^%;&844 zEPc#zO9hq-aF@%u8@?j>j7P9V0Z48!;(z8SKY5%~HxIE>&jIY=2aD-!GM8g2zN>>oMztT}ijlQrBRH}+ zV4DB%H*W}E*z2IGVm+ZWWgrsh)R{5pHEf1+2)9$%S7};P5Lv@seea~zt=!Y=0gCYV z)>fKU9^?jq!H9(6PmI5(0e1g`3no=WA}=LrkW9>I;Z`XAgtWy#g8WD`K2OdyZwNJ# zEj8y+XJwiILQ}GeNZB?2ya;Lr2EQNDnsS!;ie{m@1+E>+ZP6%fk79}INnnk#vk>?o zO0iuwdP1+ULrryGI({fOB5GBC4bIdtI4_yUuKbuZ&0#pn6dk8o?qbmT6)C!r@9HRn z$JMSU@nqGs@cIf+q2@e>;u>Jxnz;(Qq@rXzsO64ZKSOYahQ6 z&N)6%P1gFqcsXYB`)Ekkld7mlXNJpiG8KcCB4`GJ&J#lS*ybPzlI?O)^KbU;BoqZ) zU~w@_rC7(SBLbz`dauUbcxqn%whV#G)%o!=)Z;2MW#{?t$G6b{@dpP6 zaw-(4k;K%R${!puWzn_Vx<6Lyf=bF9eV8E^5}VR5_g6wkOd9)&aJvou>o{UOjQ?RL z^D&t;^V$RW<i5!47f27UE#uXE3X$uE2?VLedtC~W(!im`@x}iFGk3=8+!(s9z#l<7&=@go$pdAnR=r*$ zALuByoO%in@oYUUIk}&Q85)u{&q+QLYYnrqbwM+c6vO002TTh3R8H&jk(9D1 z3gLwGrXNoL$Cb};L#K-1)~xE$^->qB6mb-lXl@n{>?cvmRq%&daS^nI?Q~8?X$44j zrpYn{HP7&0dbhE$LpJE1<3&VhSANi=ThsI9ZBNJLZ)_|_#O#TpQKpG0f&*o1oMjpR zyd;5EGn^8S?b6}&H$zvd z98DHQI~8!))=B_N(>&RwU;pX4zbJYfP(F%=FLa+|L23FHiE&=kj@(-3mcLTZA>;-v zP91lv>s@I&;{O5835=|7R63k;huFJ^klvPFnkVg18lp;nKO`nKpZ-OAp)h9e%9oAe zR0-NFug$zwXxA(*mjQNop+Lu;lt6)psZQKv<$9xnVfoxm(ELIM!E<#(s|RyraJ zjr&!c_jY3(^8bBk(GM=4dJ_UK+QaW3)=A&^&cRr6IR`b{DY$Bw|yQq+7n2)>^gqdH*rS1t3a z#i(b?QHx3yZqy&&*!b?of6~TMTq7VZ`LCO$`3DvpuCW8+aivIbKl#iiOP=%3IJF7U zq*$(4dQB-f4%fYdX+wpmBZFXPMukgAMKU8iF}hS~?}pvByE;`l=d{>^f_$+TKQ z=W4T;e$6IuJKYn}Ftkq0j)B`p%l)rMTj63eF|_$o^swFU`=G+I|My7((x;m<@aKVp zLD~!v1??n41EZ``9A~FJsSXtJD#@Z7dOd{}r2YBlydih?`luOzMh#OO@_rkL#tPdq zsAUfmMxmtSfKyR8dkk1M>*BShDyuF(y}5DZ;F8;uz!r=BZ%)(NF8Y;i=k^B-l6<>}_c7wFrFRjINVgl1v1}yQ>rB`VtTeuY2GG~t4>$a!AH-UP?p!GaYv)U|* zB1IxgIa}Th+n#o+<8Y7;$ULzO4X%Wu<}Xl49+%L62!!6VI{hU3bad&!ghAH9;;7CS zG7M}H<7Xn(^kS!sOs8x{>80U<~w=De}#n|5|Fw`nj_vBoO_(v0U=LvGwK2vF@+MgO?R<%xfW|rjpixO z;B%Hyr_88o`wBmQXhB+fBnfcc0_;txTe__nBzo=$;%x6EMQFFGgDw*R4JfXZQ;sYg4q96AEb~--z0_4|E${tFc<={I$Pnjxi$P zu$dX0F;**^S@!Y!+(peSmOV}F#gqdHVl{ws08|ndP1QK)*=Z|G^W3K zKj{@$e$vJ=uD#0voNm%1bVxio)^5Wjvg0kHaq z^3+odGjaD1-W#lyWXL!KhkRaN{${7oTcP=SkJKq1m-PA_ZROcjMIl8dQ5ka=tRm_W z-zf;h8It!*R_sM9H1F=SOphnTIp9eOe+wQyA%8E0>XtwFe0|_gjQ4^vRuK_UcrtH+ zLd3vd2>`+GtyvsL#H;VG3`rN3?LZ49LP-@uKdA^;r>E5`0s+}(J4rq7p0}!S3BP)t9YV)r*@3Ih8Odj{TrI0mdI^zzNpR+T3&@?&^{jU6ZKRwmLH z$8K#-N@R~}3j?k_JstnowbQ{8ugv1GHJy%`I$#l7w^Bxu*70i;+7<~~vXDi+bONjS z=M$1ngpb~$r!8YV!uGWwOVW~|##af5y7fW<(O8vjJ0C;d=OP`LLJx!^Lcd0JQ~!rf zbRVqG(wn6jK-IDh_~#8tiH?kGMR6)gHe zKcl%5(|zF=7^BSZwzNKFuD$ney|m|oRS`3fu;J)-1QTbQ5%rX@^rAPQhC`XnxHwXM z_k%9rdjeoq<30;YnNuoFokkuO50}_SPwcX#6SF+d7H4ONRwRmb!Qn)67hg~TGLOpd z;SB&W*>Bsjc4&n^rGEeg){c~5aj_MtSpB^^{GkMB`qM2f1x)k1-&$PK>6)Dl1QqC{ zE%c@FxKw|6Czc(KkW2>sD5BB~xsLV)OQ3C`=C41SthQEaa64OSZy@5IU0Zrj>V8ZI zRLJp66at<+Wm+uEs)LOogtdO_I3D=T=13GIiL6M-Dsu_%6%*K^KbgC(28ByOJM{+u zI7RoFUS%@AyVF&+hHxGS4uTs0x_Ls`R42^Mkwd9AovL)I(X-n$B7x6S1NV8MMl=%- z46EE2wKs)d)#nlX>dLs>%JpzH^BCwHxw#D2db&R|&x`?3E*4#!aZj9e<+)9__26=O z%grR^@8!n!S#hW7#8hu2B;5!lsaPg zHUA4o1%~GC^n?h48150jx0jq%=Iep+Qr^yw7L!Mk3qM_>uTlW&K-xqi%+x9_HSD1_l!Pd~q-r)84X;ekMxpdYqYS7bueJPHCTAt5s*D}nozQ_mfHT%$Pqhl z4(FPhWr(sae`9Hc8lzw2Fz6mL0l;`gkm<`yJ$Nex^+;undMy^09kiL|g_powb4S$A zpDJYt12D<=Rt#2<8bo-cV}@U`E`L;F9;20ymsdF+OHQB8(1K*tsy3Gt;Is+s#l5(l zFs8cn$vCY6*qzSwPx5;e6hVKN`8uCd#@_D9<(2VRzG|qsgCdUvgj(^b-J^?>8}+ix z3qK^mWnL2#s{Zut+(|LVv%SU(ltZRvUcQ@pMD}RS0%`^AU?cZ5MlsG?+mCDOjTKo& zX|DF-71hT|ahkS;{OHM9mqJrbvmomRwEB)gSa74qS(|9WTPvSssSl{ajp7xwd7+&c z+UI|%*8ejbh1l2y3Tu}7&G=P1?Vz90B1u>t5uugUSWM^-3~(1~O=#q+h>Q$0nGubw zD0Ty|(!#7rYa*5&uife((rA}T(UCr8$FC88r3Bc;E&zDLEw9zCW0SQ5OkA|z&A26%%oVYfN?PdN`Hg3S-^~GarNOYynK7dQ zn`Ipjc&%k%ClY(7uZoHs5P&oNU-AQDRjf{?WUPwotWak@kmZ!~pd`kOGWQDu`@QYr z66~Y}GbArl=?7|1h6>2!P8~OJ<$Tjx{H0<+;^)thJuj8W7Mi$d>f%a+ch%lXurogJ zMJJYKh0j9G7+9(bk?k4KJ4-Fi)m(gk#lk_s9r@0{%}w$!D0n6F4@XT6X7{m>E{cQN zihC_KD&aOv_T&058K5l;0=(nE?%OxTmA+yf0>byJn$9PWjvivtYm_+ejV>cXl3EJ& z$BJMD^2a2ArZYIDSuIp!Im8vP$X0HAz7av4vY}gTr4jiSXl-?K>iu-)v@;wsWnr(S zi%=2gs0Wjboz6I0j&A`PNJUW7jZXjU;6AB2RUahN5EYn}*pp85YSYU2D&3pC0`ge}JIup?k6K-70a`WS4V3yph-h|z_I=MHTEn!NH* zdF5hXe+aX@IqY=@wb5Gsm(5N`@f;l(*SMb)7D~SD(fR-%?k9JbVNlsX7T{Lk6Q&KOBF)Ef7UjQuei;#kCcYXL*{I31v zr%Sl$hA#KhWNq4G*Xv7SIFicedQdd8py1(DMXqddbMsh-(Y2DKZe4?R-Q<{ajM`DH zc%%mw!{gGiGVp6!JzAtvb_+FOFH4a8G0@5LK9pVpbPIV>%LiMj(7tM)yt(E8q~*;P zT4T7qF&2FiAG^wpj8<07)#x@|gXQE=x$Tl$X9`U=8hKEMZbs+5yNXewlXU3gkbIWz zgemAhRV)8wx75Z8Yneh=7XhOX(%l3YSI3#P+-ZIl#MfD0Tbp=NrG_D*xIRe=q8#v4 z!`KXb71v9Iqu2ag_CR6uKW0)q?(5*JG(x>uSQ7F|Z#pxsnsDe-+*SeNxb~FStskjPT*YyH8lIaef35*S=7T%2{&59@mV_iYTBO)i9uSitP40Rqg867wo2qX# zlB4q}hD7={7ngPY91vKZdNq|+>>=bBLZ~DJHgwjKt?obmK0AVn@0l2Nt07DiqHi3a)>(+pF zjexMmjGE!*6r3w+A)hP{l0urc2B}?kBWR_^unaz5hBE)`d_rD#-vHDzL0#g@wsdaN zi*l0I-^60sjDpcLok)!R^tzfHTq##ARynG&T}tr2X=s#)>c2iU@V#4fJz`g7zNe=# ztNAhiu?7Qn_NHD1jb1*=RwY**wTkCzi1%zgr|E^K$0r+Qf+N_9o)T8hbp8I4I~Fx$ zFVPw|syNEpLsdI#^jNdL9OMTs#^ETry4YI-7C@3uC7b^66@ge$_B}lOkA)f$ep>iR zba8BXu>jsv^!i9B`ez$cF?2kgD+3ybxjfwErTBAEm+%#Dh}l2;jCBu4k$3c%ucr+y zI%E$VokiD=wiPu3W}LRw6pFO=0Y$YCfM}qC)_3050TvU?L#=9qRG#$YI!{)}bKI~c zc668vLF0BLPAlexeO<~?*JsAv)9_{!1VH-DygbwNGSihM+gm^8zYGMsdz zk4pmKP*-dtq(deRWA>=Hx@AC(6+t!VWkjWVQ>k*h$4-23V)t8;MCSiBjaTZ|L?sZn z8$>K-=d-!?C_VIC)ybQ@)0vZ%wB_v|Gg}xnObWMxL_Xc}cedN#2so+hJ6Ha?$0=W!{CwM^T56rGr<^;~;zt)EC9ZfANH z?`0LAH)Xxw2MX*z3MZIS+JZv4)cT< zw*J?uoM|4ry108`Tq86{$^mSlXK1nALLv=_Uc{Fi?D*v+{0R z>7g=+6&k^CCOz&< zwY8?3?fNg8gq7b5BS*EeDaDwKgrw>kEwYuw(F$BDT7TTJZG9+W#>!38gpl$!CEA{U z?0f(p{-A!`jX)>Am3dnUBchN%I)BmBb;75<_Z)2Cg@|Go*T89DTMeLA0+RRq?o9W1 zxhR)kbWN=k#8hOq25xdH!}hr#_>wGov%YKXo9VDlStfVGEzQYJ@nSLRdO*GZ`Vnq| zrdEqAow!kY1y9K4BRJ5X>DrpekxMg_SLW@+ez^S#l&eel8DI5(CEP$5wv@?aMp1eK z!mLLyX3EffoQI#xt!<(VH6q!qiavklWN}cj`n*}MwUY(3=(HPZqeX+3D>uh(mb;=0 zx9d=XgHHpWzuFX?@<4f zgrH?I!0u<;?f`@poe}^f%%7yZf6vn>BGPsew%t9D6XV2WrQ-7ZaDu9O9Wb&e!E(Jj zQ^(q{JCcvl@F}W*da<1>CTB1<46Ij{T0e`Fh(S}4n)l5xeyu=H2eYJ?j)8#BJESpZADI6};p#4%J*J~GwDBht?}r7%NaRupNr4)6D8-M& zFIom2i?UG3`Q@AE26^`=Zey`mc;#s^+(YwyIF3pe2gw+XQ;C$;X)@mqBYE_uH1uFn z&+08kXhU8BeEpY%VC43$&S!|SA0p9Yx_(+9gx}KM*{73(QWa9xtXC=W(33s54Fhtf zR}4iUP#K)5tJ^r|Hu=TANTz5gU1UQ5aJT_pBnix#`^6Zd_>))+}Ad7&hwlXseZ?FhjGIde9i67!)5y>BlF)DPMZY?RCXR@hM zgx&N+Z|eV1YzS1);qH;n%+nyxxP7)6O+II*8AYoF%!}OO31>IuZySYb z?{Wr6qNdk!E)S=&U`o;9uR5^UN^J_uHqD#;S(nGSFzi;8gINtZO|K9%3v#xyR9x7t zXOo6yE_N5>gFQh7+4T>(2t@}Ou*_xe)zXYNL9Yx;knT~%Y;SoLCMAmB+KspDR* znzPG5alFoRQDHxX{0?@f;h6wk0(#9Vrrc}e99xye&6fC$ z(4s1$>aTYLf}^h`|FA60|FFI;1ub0wN@l6`Sxc|tjP6RM@Su3623&iZ#uhfJ<qLoFxmns=%EI745FsyTGp~ zb`xm$z7kIqKxtIF0$~~>KPw?^H!>Amw5o*~!fX=-()}R%)coS`?3Q%H*PoV4o zDL07@uFU=?$38Dp6Ma4(%#I2_(NQ*!(@iFNRNI3xSep^T+hyLsejwMV65=8 zF(@0iquE^jf z&0#+#u33o`pZE21l_Md?!0HsEY0m|t|0m_I;jOc&QDmjQH{O2&$s0hkB0A0^4`nySCmoEO41@>&R@klfvy zZu=xk{VtD;0^QS3O{Jp8%s{8UNPDVna^`E4P~||E*21l*F6$mE5G2}OvO)2qR`(0f=0UuvSy6o{oUYwlR_?8JH+toSPl(pEPp%(#3%rvgGt`#Ku4-`cIcMl->-S|9KCzmn#tmENotA@ptC$hHdJTx8}I5 zbfsuk=1CHmFpiTI_P*hNxO@Go9F4kKS%bFnG`)G3JnETd8QnE@H0gWXfx!+b^IK=~ zo|M@2%~QBshDZ_SjGvc)f^rlINXV#1;BsQgm|%>Are?6v0dM`dtEEt` zOK*kCZ~%@<;{M2Jk{ZdQX5qLv>`xgtU-7<{dcBzw2ZO$x@2*D0*r;Uo4#!C6TQ3i) z0}RM8GLWYtWPtWQZaO_7VEkV0DUkfpSynVk^PxPA=QTv?Ag?Z?R!zc|ZGi1p+b`vh zi!F^7kkQq5)cg-uDx0T2bXi7^f(qg573O0lZhsDd39uZz!hHL+EGRi(%9-mrVG0hH z*UpSM)l?KK|CsZ5S)bW9RUh0;BbL1RoJ1nG52od}v4mK~avPn1!Uj~*6>Cyh3vGrL zsv-|{1#V#{MiJ>99U-Ad)K$~>x{!)W@Tw>Y#ug~EPy#8dhpEU^=J}aNE9>^=MdWJ; zt56pj@3jQg>K6qDb5E9LJZoT3?(!Tj>C1zQwgY(TKNH%gkGtCWXM0V5_O!Q50K2|6 zrVJy{j0GmmjGi%ANk^KEK!IX5@N>f4o);OgC;2UnfMiITSI|)0Wj2jKlbKpmk)Y*_ zjwGgqI(*LA=}bT{2Z9!2^LCxmwQ#2M%*k>^yDkP~eIu4C79Il(k*naow*``0^lYP( z3AsYybf4wOmuK#+(I6Eqhs>4>9nsKDK_b4LZ84%~HTZ$?sMSRKddz7ivk^_Lzg_=kq{h}V{3g+_`vd2m3DTC_X2s{rUhlU4!mUriwuDw>zbQ8A%zM_O#9C=1MB&Krgd&HkcYvd+bY%@?x$A@)8sP z3bpT!ZJ$5Klol4$sKE9)v;Y`MfsFnWBa=UC?X{w#lJ>R6&wcz3h9jLo%8RT`d(Dbc=r3^tn>(^x)ya>4Te9H z;3f;%)k8ZJ>I@d!)QBgj5hTnuWHg~wCGLzQy&Y+Q{z?5noj zWFJ2MgSo-O)dZN(F#I``C9T-#VGA^6^ofRyq|q>uigQ7Kp1qPD21eNo+K(Na86)^S zClN9D(9M-6r0q~xoUuOOEHD2QX#EiH5{A88GAYCLOvLR%v8;TwAYLmE%Kh>IaI&Gq z{e*cm$Nt;qUI10{vl7Qe!9f(D$YIA|UDx?!`$bO(ie>S9CGLZfp7}cb*&GGL{jQq| zm1w}`t#*rc)&H;ux~sY;J)v*fF@Q9|@a3_MmdA&Yg)MRV?80#Sisg@sujaHWt>Fmv?-$>KYoDfy;0v!*pbSE+!idVZH7WbzR z@wnJ1w}%lH%$y%8#i)>INw5==?L;sYf#p~IZU{3~`cbUfXiaFd{msX!9-cx?*90r8<8ICZx%R&1Fih0_&7Pcb(~MM3oLVGuo8SI$ukb0S!* zaH`t*uFJMqY!{dxG3xpud8f6!+@ZryQqe01T{#TOFDP+ zTP9G)0Z+h0h(_lx$aJKPSxY!3zX3rh$907+0X{QHthVH4@1|Aq^;1oxdGbHEaGCYqqaR7+AYl}Ud6;X-~fZi#5& z&&mUB-UDmAp~lNo1LqaSfX<8b+E=AY(0|Ry3JA_1K$(%%eMviLu3V_+<>>X?+vR_+x?7l$1K}hvV zEd2N-_OCGQ1tkDiC(BPfk&VZ2WX|r}b#ax>9*DL(3?n+p`T*L1YVuuN*_AQ$r!>Kj z0xnF9&{lyd!?jc(#iNY^YX9uUyMM$IMCp!LhACA*ABow>QmZPxd+>Ya$kwfp?63zpW{~| zGO{9g!Y9ue3cre7Pfur4L^HSr+Q!i&N>Sl)4_Yw?Yit`3(K`UG$SffrfbYYLTip4s zhm#gGY92UM05>fFBFtkWFjH@TY&Z1R+{=hxR4rwgzx9)Tq6oYcOKEMlAMfz_8(V_SE#fzAK zOz;r1ekH<^L3`fV^Y2bAD45qikqLHe(yi^w| zsL_D}jwG>JwNs2zyvxVKXW=DK#MlxgiTRWUV$+qw(9&Yxf&z|COL!lD9iWzEuOWHN zBh~-;wV!eIh#R4QgB-7-l41&U*e8acyl^7gK9@p4U0-8#;C5Q$MYin4&?hzlzmPyC`-I?oM)AOu+*8`WHu9^iv^ z-GtE@64M!W2a}bUi!Ccwm3Iex{vMZ6ql~4X<{Zh<2`8^yCZ!N4C1=<*0qWIolM?lb zUNcv>>LS2nF{mMozyt;`)EZ0Lo;bzSqAdRNl`dLYy4ULPBmrn%80?h3BL!pxT-uHs z6!cgk+}hiQB5*R;R?;I&cUr8of~?@2sxY(0kcp6IJpY`Nicxtr=7aa2&EGllyz2exNsd_Y&l-*9vl43f@MpIplR3bzd3ekMqwr<=626My zESH&Q{tz~;%lM*{O|F)*&Z?fCc9g<-{R+5UOUJD3C$q%3gvx*r0u-3w5i=<(f z>TX_d|B^|77Pg>wURdh0ZPDA1%mG*XiXL;J&}v6EfoCibt@?a=p=NZddn*GFFi9 z9ayf6NQJ(Dzd$rX?@exv-gY8Bd*xis?QkK-7qCx~<}JWdI6%X}kuV2NC8i3lfl{9m zpf|o)7b^YmTEtdlz;UVVC2;$v!1xs_`O*l6%z`*mSyc)7T66jD)9bv(-veCB8Us8)_n{)4=hyu(a`du%x8 z{U}(cont_FU_%89agI&-uTR26gsLf6z-h#2I`9a(jT(W-f6S688~`okml`6#e}+&~ z8<+VXPyFX}-{9{jR(Ev_@H}7K#_xamByro4W&L^~>eBED2Yj2F7BzokzJv>4D8NA8 z(HTS&-92 zBMUtf5~BphIuIEChQ&r{mtp6<`ZFc_}<-~);n5-wCfHQ=K5t2UnX^xIAwpV?D?}8By z*(MKLKX2g)!A@OPl#sr68p&3mn3sKN-lU=u{;76nI4Cd+QQWQI-urp~@~dI%D9qGH z{d+Su&a%S1LXHkWy0aL*$@@Wm<1YpX#{8TY{ZrWiE5ONCygcxTD6j*MwZyTzo0G%@ zHQSBOAMMray0BmO87E`$Q^%J$nreK+{LLf^xL*x=SHAGk$QBmXnI-+4m-&Pf7G}}^ zY3!@RqWreD#{d*?P!VZRQ4mS#Mnp>245)ZlrUhhRy+o z=Gz0mbB^bIzwf#}{(*~`XFqG#z3#R4UTcMT?E8p|W?o>57|)%PqDS=K{`2@BsiJ8m zz8#r6ZnKOFy^5t5XA}JI#+DbY?+DnVN=T1v`%tJw#Jrx&UcsFx&_VuXm!2lL!==(s zoZ$!w2^}VblMu|2Ew4a+A0pm>x0qd#s2v1DHs6XkKR7uyT=3az7jJN{Q(Vh;eQi#p z(mqI>K9np**AW>52(7lL19P~;M^}mQs)CK>u83ydN?=J5A;=!%Jznaxz9y;Xx!I<_W`MA9 z!qU%ym~UMYX9@#5{fY9DiZ`h7?Sq;?&tJ+HphO^^`qx0cn2YBmKgyC!$l^G+V_4f< zALUk$g+NLl0J-R7Z8p3@^scL?EyPwef$l$i3%WlPOwiOxw;3zD{RA|uXoIFzw|{(&>FwEs8K_k4tAFg0{L_a zmp6tZ8#Sz&Ve&fccFx-94)&*a7Vb578Aw9nLnt`gz#8=EKunCeLqb%}L$<(YJJS9^ z!eWOJps^aK`Mcs*1faMPTl(m+c{mm7{pY8iuRo8tAbc2O-UFruqH=)_KZ%&%=kWy$ zkBD$nSUiO0B5u5R!Svdc9&~vQlg2rhmGKh8KqefpOz@K^x{k}pbhAc}Ib^;!)-Zr+ zh2(l`Inl?(PM0OO59&NE66LnLvZ!$$!isDA?#9EsCj8Ect=b5ZJDr=o-g&qlM83T{ zPAKO7edT`5@;1~V&f1CIa~cm~KnB9{XUotPES$RD>8W1?Za$Xx0Dq_x!%&E<5||3r4{m$=vTNzz#4RxEIYfs%1|qmzLO(^sNFChkbKdSztsQ1+_5EZ6 zbF(1|f&4N959RFwF#08Oh2yCDZ9Ie+7jpkdu01i8JmTUz^|k5*?33soli8#t;g;B4`y1j{C@z4x(2X&PusRfVlvDYP9%XS7JIUx;ItbYVYs7#X2xe1O z>2COF)$b&8qD~ot4*?032Jf!!wWX1La~wEk2LsuB+iv3`1LT$zc)uUI=VJhvqbqBI z_f}`kJ*i|>LEo);SKmp~tsWP^c3cmlNvgoei7|%bda?tioFaB8m7{JXWLPtAx|e8h z*YwsbXz7=fvnShrU()P1|B{gx*+;kyGEviTgc%H%H3c1wa7Fs_j1T7ureIC$z24(sKz=cQ zo|?8=yCmM{;saz$=nQhDno94V2YQ_ySXYO+b10DHf%pP=l}Kj?hOoVNecw;T^L#D?*dPJ~0JlCF z4(pe3mqpY_v)^Sx;yN-7u6xsj9w3z8xYz7$z%j`~0-jX4M7RfdHgfb~+r!sJEYg5r zi1I^wH<{g<(0V73+bt0+L7K0FSb7BCk*7?MRXi*JoqBE*jEc9ftrKd4p(agu6%oHOL<~ln#wVhOr1NBo_F0viL3LvjewWKt zo74G(0$8!e*B^JuO_ey&bJ(w}bO?#Zw*aF8k!A#|#!J&`c=WYO-86eF)7XgTrIXon z5CKvEcygbnrj?bR7Xx6OAHN3n%muJ+IBz|(80+XDfO>KdaOjM8r=VckSIvBO0YQqi2wK%j6<(qDr2JST7Vt^hOwH~kEye&&RG+k!VLi_819%La{krT z!_2{nMqiuD$~OU()r+sbDR@)uiDQ{#>gW}uIZuoE?Z%C`)0kzu55J4(`IL*%2Fk~sx`d# zRg|mAAfMbTJ=bS8=_M+bcDB88CMMsITCIur92kRkE`xTA}4t(R`I0T4JnPtG5xi*x#QvKb3Xd1M;a5zAZEau*QI}0V9b)tTw~!tQb_C2 zVMX4_3-JyBt0yLAH*yH<4?Z&UWY?SqfE02YIflhw-ne;4-WR7lY)W7kk3DJlW~K2+ zEu92K2+8%?)yl~sSiXGV3Qo`R7$uLjtKPR0<7P+qI+&g7x?nc}mLCvs^fgG8h0l_0 zlznwi-j%j$X&ylBGVj&0q7?(#?N#>-oP@iY5br&p_)2_8=vRe$fRd|N+$t+%UEe-x za%X}-tS!M5WUS8|_5-C!10Zh4v`(CB*pPEeYt=e;dKYZ0!xKvH^UQqgoK}ed)z(R` zCph971_IfYl2W-8t_1>&mHg=>&fm4vp!kIvpo0Twl;|3E(*aO}k}q!#{>(3cag@p$ zN{ZPBgGVJKB1W5RagpoVk@4Nb^usHup6D|&Yw=0nIoy3@mN&zDet2?Du` zn;5|#ns0VG4)+p*L7KLcV>i#*eZ6?ErV^hgt8}~OfKj-c-}$E%_7ElgeYdgDj(abx z9t$Tk)Z;oLhfC)N71;WM z&*wlQo2R)|nV48dpOvpPV!zSTAGaN?tKrlyL=G%@U80SL6u}2FN>$Sq2+f3tly2Mt2+n)QbR zWKG(2_Vj5(e!bPptcmYUw0YQ?RZuYS&iywV&^rt$#efOgw>$t5i-B4yy~tsO!gi^8 z9W=$Vv+ABK$Lk!v;&t>m9^b=T+S81X*;C`(7pJ=5z4XaI5AD2~wqXfe6m>PR?rw9} zn4tq8L7xQ*=YBkF5j&Tl{x317m=CT7_Yyy_4 zJO*?M(0CN40aBCcFwfzXsy&8@0L$UYn$XY43wI|XvHDemByrs^cV#?X1k+r0%>G`; zJ3_-fQ80gRP4pm;TXlp9rz%)J>q0p|~v>`R}wrPp`$saud-pHhcv3 zGp+5eYz{M^WL7zS3p4d7`uOs8oQgG&1;gD|D?%K^aBqR)V)BPKYnvcyiFr!Dx|*&O z3pm&DTK}kO!CX|7`MNNG{6E%Ua3TOBeQNWNq`AGjx)n`NI?fJ92phr18yGjHwT zOzZffQD`CUY(&=TYPko;A^KpdQSUUF69Le+r8MiDD*gd36!Dh}K;okND}D%s8oJ7j zTyk+{Zo5h*BEpK;lIvY25iUVb9Zt?auW_$MzNTYjXP??~tjY3d%*pAV5QZhbORzka z_9Po!TNd7Fh0-&NJ&wV%wFk28H!;V>#eqzAUtAa%7_7#A(JHnyVpvLmKCjA9qR(e1 z7zr+)DihsVAUYKc0T@pyjo&6G6Q6Sq$LK(Yy-rSTLFLio${iVJSm4uL`5c0-A3NTg zmN^zWOr4hm3nLNQytbR*261!aMLfLsr1|K$wfFinIy_QpC@aVBsF01k-N%hC^&)}TUF{h- zt5Wr!E1~vICmYj9uVMAdexOeP4=F2Pdh8!ER{?O{`VMXi;TK6r$w{xN)RbtgOiVN> zV^XAUY^RS4C)p?uQKViI3ET#b0APTyR+>CEnz5w!z+iWiNf^2|Vu4Ho%z&B9a{3^K z2h0_G-U>Q>EMa*eJ@64JOK`>zwFKKqBPjFYNG9%|sL_0UIsC6SdB@e-5W!z1whGAo#`(=f<__*-3OuxjwX_l@@ewJ|*bP70H1JPwLQ?O%T#>g~iy z!VGfHB$e(8yWP2i=tQZrZcrY*EdWFaP_d08AW11FZjxlRNeVJh&)04jNZCE6;xwU) zWoTeg-bji-Li(VT zzi)$d0z9T5WYFQJ^Tt#oqoP=19LPMXTkU>c2mFq=t4Jy0V7~86@p;IEBYST}sBf0( zB<4!7)~fqvDvF-YX@LY}UiAj{_i67*pKq93)m-g~`E-mmViA&w_87$+;MMd5h`c8Z z@OV98`Lzbud43cR9bYE*pn&PK8eDiE<-#_I-Ql9Eaw|!Z&c6z>_C*|6TWOe3a(>qX z7w;;oQfpitcEM#}a8qQW=0y38UeafVivBd!$-4L7L1r4B*D4^qK{($9Bs;x%gXg3r z>Mo7H$hyB)QId0s^J8s*yvo1 zKT=MY5{%yq7WI};7(uV31st*fN1*o%WVo!{iYN}iz}#YLZ~FDf@|d$1D>a&GiK zimwv2Ho(IW<5B_DR*fm{X_|+h9IZ{qdwKTGg@`lGv_+`J=?!G*+@6sH`8Qf8vY$Wv zjDCqx0-(u`&% zu!YEc+!RJOr6wvV9@_z1?I^!rbO=87)uA>|ISzvZ8ORkJPJzAD$YQCu#!c>QV*Ai+ zzp=yKCkbS~!X{pZB1EtET8>?;o{J(9TQKtnu{aFJP7`uRSk%(jAY1~DWL05_jPHXW z_0Y8;0`ML+d5 z&&4@$x?_j8r5x0@iy>nm24=?zDNJdeTf>$k( zAQ_N#5CJq37w4Fe(5AhRE9O!C%}Yoqp}}7v=`iR3-G6LFyln2&6X$ zrejOA6>YrGmwvhG5(zAfO$Xg9n=?Nji}Z5Ep+yacZ!2)elxnk8bhIL>1_ zf02^sL~9`5V9nFmurX6NakrQ1MGttt;SouPa+{8q(^=wE(isIA+q|uCWXsaX zxYMBnvSYm`@_Lo=iJzmzLrz;T0|7icYwx6ww~;;__i9E|a^;-6nECluLfkg|*Kj2A zInFDDo7g978#`>hei%-M@Z(O_rcmEWTf?}=@6(e_L*iQFzO|MpZDQdxS~HJ;bd1Hq z@iFbldNB{1ev_tzPSWeGcf7_H);8pEUggsf3*+3s*SA7lK9>~Wc5 zLBOcu%L+`3jcDKvY9|xr`i;q&yJKvczZecjTLv#+8%4cZu)xxUSe%-y&&H6S?%)R# zr;WB9jNR+WNHaUyldpws3GmG;K785SGiyzU24*<$0$v~R41^Vz1NVDuOfIog0H9j3 z691xF^wfDJav|ScMXN&MZ_*N_detM4Wd#o*#U%`n^>i8S<;#`o;DM}|85u!3)vIlFYloAcc?e=G_&h>?@t z;k4m^p++3nU!y32`D4L4!u8{%U8fc?4XZ*Q0Flm|emFiE35IE0GrglRWW?eGK7#&k zd5$1tU)P^d$ocLoOtGlA()hE4?VYEVF$a_sgI~^xwqr6%IM^>=vgGRnV;_66dYNS1l}Yoi5=r^T<=NT!a_H62h3r-QOT{WjFPC62p-__9D(>vij-0Y}`WeO#cPCI7rEHQ?YVRfLMjb zn&QctX*DvpjpJigYB$U*9!tdWVeB6JZv{yW#h!_+7`!#6Q3ZyRy_duL@xQyqGpw!- zo<2>8d%7J?cxSNN<*v{CJyfP%FAZWc0+v?mO6Ww_eC*LZtzlN`vavY`7Y+$I0iKVL zFtrHxiig?z6&X`^fCS&i&m+$H`w9~K%!_hC8Ojgq4l=6CLWQjHPwpor>^s`jeH?qA zzO!mxx~37#wwUcEwL5q(@bJSBkj63>y@T{ zxr%Wh{CI8Q)mIof8qpLJxgN1gM@Jb(9)?l((7F2@*MoU)+`#>E2LrGthjgb#Ombt@wuFtqdi~qbZsZ|)erLEF>fd#4gP(o0PzoOnnPqj6Bn<( z=QZowoM!PY0Zg6;1N_(GwLI*kDsh>6RUpnm;5`$>`pjM_#%7fX`C06ld4vvdkUkb0QK7I!!J(~0rRmy2RaUEzd zjGFS*pe;(~zwWA7&%z8IzfXyqhH`s~Y<5?B3L+v55&6_RQL`FiB9G+#eY@YDs!4`F zgRBdUgWJ`#BB*I9yK572^749e;l7E9l1aSfmru&#?8#qk8opTel?l^U4t8*NDcOh= z<*54Vx%?b+vY|*TaKY&_c$Eqlt~d4zoFZmL5-=!3m~mVRzny|5jq&Q3>FTOvS6onb zwwU5*G=En{=JLBjg$S45dY>*=Kqa9C8C^+T>h>K0qkHsBJ`P zRE*+!Dv)3Je0w(pWDtJ!sxLWh{*yH+>j5^$$(E|Ss^TL8FwHzTtV%jQoKdwZ8FZ?RfjCKC|YnyrbmzrSGh!*$EQEw8Sjgq#)1np=BCHOW<*CDU|XO3tpoB~rCdt{l#z-?vQ}Vz1$S zuIM~?A8@*c8X#Z|Nlw6{msNS=x_jkB(&ZI9C@16)PS)#>g(?&k$GdB4$d+yhwr?+) zg6a^m@}ssGWAs!*!F%ZR+KEuF@8%{cJA3e4SJUr3dnF~}*j`lm*DTXR^pi#E<+h}x z%v3w9zrR|Y)DQV94i07ZjVG-vbcGF|R7H$1wru1fuZKy|Ae@Jc$m`vBh4?N0Khv0Q zlGkr0Vq+5Wxwvl`)PA@osV$y$uv!uDTJJjB^)@ygpEN~04BBPm{Qhy_z-I>4EpZ7s zx$=>OzGKGUZY?}3by!qt^+`3Vpi3x_5;HcCCGo@Nor?fH+G=f0cN^ZmiJd;2P~0;# z*r(Twi6e7%Ka3Bx5W(707L8gziRqcY5S(LFy@|zGdF;-*jS`6~9&M~gQJ?Ik++Q71 z)uP|{d<87H`}nx+Ga{_;a%$u<>DZH4duL2VL%GA!QE%363*lW<$v zSV0k`orQe;fbZ(zr3%OQ=?3qJU^PupDaR!CRz6~J}Nw9i1(u#_i7il{3^$1?v*jU$u=K*$S2PC0TRz0ZsvRn3Q@p!|s)Zw6Y z4xy~@qH=Jn!H{D&?m+E%Cq1eyvT}Fb&P#SxIA{yK8Y=`B1s(oQ^M~`1&FeMJ%a^Z_ zGL;7iUAc&XD=1ccd~@6UH+;AJuIzME1))s%!1`(bB!gJApwiOpsX4%+6n9iix0_SC zgNOnJUuu27&Cp8sI^7Iz9F6vWFWkI(kA+=~^=AUT$^*JOhX8-*@W>8)WqCQaj)->* zo}xr61x+*stG~`Go6+g*+*nyx1Z$Ke6jOmxe3OT?Ui8d9G}{ioYu=?c(e`F$Hh>(b z+*&UHlt=79LHy0ZAx0%ZHqC)p5rla!-6*+n{Cqv*pmGv*c^Jc;U}%yf8>>o5_M~B{#?`9aTM74S_d@{PAlzx=Iv?DW&Qj_8UBFPd!$zy?i?!acJGFo1Efpu&#yZ73 z)B5>nLE>qB%kkN)k1fUe!v$K+H5YM-;OEzI3Z{Dkem_;oV`_2H;#FV6BhJ)#j{X_W z2OW0%?|tJ1Nkxs@?HCyw`;;Z+%=?4_+haU0oa28J^9siJ;K3&`Dk`dxq36G&_*tM= z^b|~X@E6frIk1zENo4G9jAu`zSxtd84_wDGuXbAe{DPXn_ng>RUJo5|@}^i}l*y6B z9kHx?(Y;+%Tu{=R#r3VNKA!G9F`kpSHFaF07j}w3fBw8b)M-h=gCa}aDt4B-l}X){ z%SvsRs>)qAa6Y9+l(=qua-uLzGLo$bko~k3cT<>ndS^Qy9M=iX^JIt|_&DRrgnWnK z)>g9s@o&}MS{gsq80$O3#^BympfgU-b@#kQLK@B?B(~x-Z76=El->obq&*^nU%mfB z1nvv83;d{roXHTR9BKxxw&>s~ot+Aaws<>a^D%2n$4fYhpZb6t3m(M+C{WPI59|akeLU$GxcvS_Q(_75w{>hl;u1#>eByw&}e3Zv!J{4yg_%~ z?g8bFQ8VvCO!BCsl#co{q}+NNh`{IG(2M`#35Bu9tKxH>U;9i5>C`|uitiUL0Jy#Y z^_>^BT;#0x3eOhBrUK@SYgHB3>ggaAJ4TjMYsh(|j2&(YZ{Uo;?~*u}zX0t`iQ<}l z&rvg`1@r3c?=P!7d{+ojEviCZ-J^dJAA6#F*3@lWQ#}u$hH$v&BuLo?`=S&Z_oKkY zv_ddFqwNY*fBsMR;Ly* zzxq{)CS`T5^_@QH+7|;&PoPVsBxV3#PKQb<15lu|;ovV*{P7@ho%#Btvz>cFMP1r4=ClyhOd}Fr;)Q^)YUh zfUS3z?P#D~_sdKTmnGRzaxr7jXCVd60VsdTZLnK9J1>yX49SY>>lA?Iz=GkV+%{m zo}73M*L_X#8ts&naX(_pFY)oei0bOXRo?naqTao`q$t@x0Lq_Cn;IKG-3G9m8K{T2 zwi=wGms?O!ZO{DPOG8GcB7hvb8FDG)4GlWAFs6{)y`c(B)fqiS1R{x1o8?w@D9K<% zuF5ypBqN|yzC^@Z+t`SBiG|bLVq)?WnHk8k`0BUB8SPIENOD#AK2MR;+OhZ8qw?{k z!QS?ciZE_}KzTS_%c_7Qg&P~Cb&4;lej`M8V5acoBRUg`f@wa2 z%0D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 mYvnVL0DrDr{*Uw Para una promoción de artes marciales mixtas que esté planificando un evento, es crucial asegurarse de que los combates se organicen entre atletas de la misma categoría de peso. Así se evitan los enfrentamientos entre luchadores de tallas muy diferentes, como un peso pesado contra un peso gallo. + +En pocas palabras + +> Hacer que ciertos métodos dentro de un tipo acepten argumentos específicos de sus subtipos. + +Wikipedia dice + +> El patrón de plantilla curiosamente recurrente (CRTP) es un modismo, originalmente en C++, en el que una clase X deriva de una instanciación de plantilla de clase usando la propia X como argumento de plantilla. + +**Ejemplo programático** + +Definamos la interfaz genérica Fighter + +```java +public interface Fighter { + + void fight(T t); + +} +``` + +La clase `MMAFighter` se utiliza para crear luchadores que se distinguen por su categoría de peso. + +```java +public class MmaFighter> implements Fighter { + + private final String name; + private final String surname; + private final String nickName; + private final String speciality; + + public MmaFighter(String name, String surname, String nickName, String speciality) { + this.name = name; + this.surname = surname; + this.nickName = nickName; + this.speciality = speciality; + } + + @Override + public void fight(T opponent) { + LOGGER.info("{} is going to fight against {}", this, opponent); + } + + @Override + public String toString() { + return name + " \"" + nickName + "\" " + surname; + } +``` + +Los siguientes son algunos subtipos de `MmaFighter` + +```java +class MmaBantamweightFighter extends MmaFighter { + + public MmaBantamweightFighter(String name, String surname, String nickName, String speciality) { + super(name, surname, nickName, speciality); + } + +} + +public class MmaHeavyweightFighter extends MmaFighter { + + public MmaHeavyweightFighter(String name, String surname, String nickName, String speciality) { + super(name, surname, nickName, speciality); + } + +} +``` + +Un luchador puede enfrentarse a un oponente de la misma categoría de peso, si el oponente es de una categoría de peso diferente +se produce un error. + +```java +MmaBantamweightFighter fighter1 = new MmaBantamweightFighter("Joe", "Johnson", "The Geek", "Muay Thai"); +MmaBantamweightFighter fighter2 = new MmaBantamweightFighter("Ed", "Edwards", "The Problem Solver", "Judo"); +fighter1.fight(fighter2); // This is fine + +MmaHeavyweightFighter fighter3 = new MmaHeavyweightFighter("Dave", "Davidson", "The Bug Smasher", "Kickboxing"); +MmaHeavyweightFighter fighter4 = new MmaHeavyweightFighter("Jack", "Jackson", "The Pragmatic", "Brazilian Jiu-Jitsu"); +fighter3.fight(fighter4); // This is fine too + +fighter1.fight(fighter3); // This will raise a compilation error +``` + +## Diagrama de clases + +![alt text](./etc/crtp.png "Diagrama de clases CRTP") + +## Aplicabilidad + +Utilice el Patrón de Plantilla Curiosamente Recurrente cuando + +* Tienes conflictos de tipos al encadenar métodos en una jerarquía de objetos +* Desea utilizar un método de clase parametrizado que pueda aceptar subclases de la clase como argumentos, permitiendo que se aplique a objetos que heredan de la clase +* Desea que ciertos métodos funcionen sólo con instancias del mismo tipo, por ejemplo, para lograr la comparabilidad mutua. + +## Tutoriales + +* [El blog de NuaH](https://nuah.livejournal.com/328187.html) +* Respuesta de Yogesh Umesh Vaity a [¿Qué significa "Recursive type bound" en Generics?](https://stackoverflow.com/questions/7385949/what-does-recursive-type-bound-in-generics-mean) + +## Usos conocidos + +* [java.lang.Enum](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Enum.html) + +## Créditos + +* [How do I decrypt "Enum>"?](http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeParameters.html#FAQ106) +* Chapter 5 Generics, Item 30 in [Effective Java](https://www.amazon.com/gp/product/0134685997/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0134685997&linkCode=as2&tag=javadesignpat-20&linkId=4e349f4b3ff8c50123f8147c828e53eb) diff --git a/localization/es/crtp/etc/crtp.png b/localization/es/crtp/etc/crtp.png new file mode 100644 index 0000000000000000000000000000000000000000..a348c8af6175c4c7c78e972a801eb33c6f549453 GIT binary patch literal 122701 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%0APjwtR+F*dTj5EFV1v1fl#FM4 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 EKlDO2k^lez literal 0 HcmV?d00001 diff --git a/localization/es/decorator/README.md b/localization/es/decorator/README.md new file mode 100644 index 000000000000..6acd633aa314 --- /dev/null +++ b/localization/es/decorator/README.md @@ -0,0 +1,169 @@ +--- +title: Decorator +category: Structural +language: es +tag: + - Gang of Four + - Extensibility +--- + +## También conocido como + +Wrapper + +## Propósito + +Adjunte responsabilidades adicionales a un objeto de forma dinámica. Los decoradores proporcionan una alternativa +flexible a la subclase para ampliar la funcionalidad. + +## Explicación + +Ejemplo real + +> En las colinas cercanas vive un trol furioso. Normalmente va con las manos desnudas, pero a veces lleva un arma. Para +> armar al troll no es necesario crear un nuevo troll sino decorarlo dinámicamente con un arma adecuada. + +En pocas palabras + +> El patrón decorador permite cambiar dinámicamente el comportamiento de un objeto en tiempo de ejecución envolviéndolo +> en un objeto de una clase decoradora. + +Wikipedia says + +> En programación orientada a objetos, el patrón decorador es un patrón de diseño que permite añadir comportamiento a un +> objeto individual, ya sea de forma estática o dinámica, sin afectar al comportamiento de otros objetos de la misma +> clase. El patrón decorador suele ser útil para adherirse al Principio de Responsabilidad Única, ya que permite dividir +> la funcionalidad entre clases con áreas de interés únicas, así como al Principio Abierto-Cerrado, al permitir extender +> la funcionalidad de una clase sin modificarla. + +**Ejemplo programático** + +Tomemos el ejemplo del troll. En primer lugar tenemos un `SimpleTroll` que implementa la interfaz `Troll`: + +```java +public interface Troll { + void atacar(); + int getPoderAtaque(); + void huirBatalla(); +} + +@Slf4j +public class SimpleTroll implements Troll { + + @Override + public void atacar() { + LOGGER.info("¡El troll intenta atraparte!"); + } + + @Override + public int getPoderAtaque() { + return 10; + } + + @Override + public void huirBatalla() { + LOGGER.info("¡El troll chilla de horror y huye!"); + } +} +``` + +A continuación, queremos añadir un palo para el troll. Podemos hacerlo de forma dinámica mediante el uso de un +decorador: + +```java +@Slf4j +public class TrollConGarrote implements Troll { + + private final Troll decorado; + + public TrollConGarrote(Troll decorado) { + this.decorado = decorado; + } + + @Override + public void atacar() { + decorado.atacar(); + LOGGER.info("¡El troll te golpea con un garrote!"); + } + + @Override + public int getPoderAtaque() { + return decorado.getPoderAtaque() + 10; + } + + @Override + public void huirBatalla() { + decorado.huirBatalla(); + } +} +``` + +Aquí está el troll en acción: + +```java +// troll simple +LOGGER.info("Un troll de aspecto simple se acerca."); +var troll = new SimpleTroll(); +troll.atacar(); +troll.huirBatalla(); +LOGGER.info("Poder del troll simple: {}.\n", troll.getPoderAtaque()); + +// cambia el comportamiento del troll simple agregando un decorador +LOGGER.info("Un troll con un enorme garrote te sorprende."); +var trollConGarrote = new TrollConGarrote(troll); +trollConGarrote.atacar(); +trollConGarrote.huirBatalla(); +LOGGER.info("Poder del troll con garrote: {}.\n", trollConGarrote.getPoderAtaque()); +``` + +Salida del programa: + +```java +Un troll de aspecto simple se acerca. +¡El troll intenta atraparte! +¡El troll chilla de horror y huye! +Poder del troll simple: 10. + +Un troll con un enorme garrote te sorprende. +¡El troll intenta atraparte! +¡El troll te golpea con un garrote! +¡El troll chilla de horror y huye! +Poder del troll con garrote: 20. +``` + +## Diagrama de clases + +![alt text](./etc/decorator.urm.png "Decorator pattern class diagram") + +## Aplicabilidad + +Decorator se utiliza para: + +* Añadir responsabilidades a objetos individuales de forma dinámica y transparente, es decir, sin + afectar a otros objetos. +* Para responsabilidades que pueden ser retiradas. +* Cuando la extensión por subclase es poco práctica. A veces es posible un gran número de extensiones independientes + son posibles y producirían una explosión de subclases para soportar cada combinación. O la definición de una clase + puede estar oculta o no estar disponible para subclases. + +## Tutoriales + +* [Decorator Pattern Tutorial](https://www.journaldev.com/1540/decorator-design-pattern-in-java-example) + +## Usos conocidos + +* [java.io.InputStream](http://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html), [java.io.OutputStream](http://docs.oracle.com/javase/8/docs/api/java/io/OutputStream.html), + [java.io.Reader](http://docs.oracle.com/javase/8/docs/api/java/io/Reader.html) + y [java.io.Writer](http://docs.oracle.com/javase/8/docs/api/java/io/Writer.html) +* [java.util.Collections#synchronizedXXX()](http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#synchronizedCollection-java.util.Collection-) +* [java.util.Collections#unmodifiableXXX()](http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#unmodifiableCollection-java.util.Collection-) +* [java.util.Collections#checkedXXX()](http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#checkedCollection-java.util.Collection-java.lang.Class-) + +## Créditos + +* [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59) +* [Functional Programming in Java: Harnessing the Power of Java 8 Lambda Expressions](https://www.amazon.com/gp/product/1937785467/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1937785467&linkCode=as2&tag=javadesignpat-20&linkId=7e4e2fb7a141631491534255252fd08b) +* [J2EE Design Patterns](https://www.amazon.com/gp/product/0596004273/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596004273&linkCode=as2&tag=javadesignpat-20&linkId=48d37c67fb3d845b802fa9b619ad8f31) +* [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b) +* [Refactoring to Patterns](https://www.amazon.com/gp/product/0321213351/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321213351&linkCode=as2&tag=javadesignpat-20&linkId=2a76fcb387234bc71b1c61150b3cc3a7) +* [J2EE Design Patterns](https://www.amazon.com/gp/product/0596004273/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596004273&linkCode=as2&tag=javadesignpat-20&linkId=f27d2644fbe5026ea448791a8ad09c94) diff --git a/localization/es/decorator/etc/decorator.urm.png b/localization/es/decorator/etc/decorator.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..141c0563f0c6c79c0fbeb125278dfbc151ffd6a0 GIT binary patch literal 23530 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 literal 0 HcmV?d00001 diff --git a/localization/es/delegation/README.md b/localization/es/delegation/README.md new file mode 100644 index 000000000000..cf5fe4a6ff1a --- /dev/null +++ b/localization/es/delegation/README.md @@ -0,0 +1,125 @@ +--- +title: Delegation +category: Structural +language: es +tag: + - Decoupling +--- + +## También conocido como + +Proxy Pattern + +## Propósito + +Es una técnica en la que un objeto expresa cierto comportamiento al exterior pero en realidad delega la responsabilidad +de implementar ese comportamiento en un objeto asociado. + +## Explanation + +Real-world example + +> Imaginemos que tenemos aventureros que luchan contra monstruos con diferentes armas dependiendo de sus habilidades y +> destrezas. Debemos ser capaces de equiparles con diferentes sin tener que modificar su código fuente para cada una de +> ellas. El patrón de delegación lo hace posible delegando el trabajo dinámico a un objeto específico que implementa una +> interfaz con métodos relevantes. + +Wikipedia dice + +> En programación orientada a objetos, la delegación se refiere a la evaluación de un miembro (propiedad o método) de un +> objeto (el receptor) en el contexto de otro objeto original (el emisor). La delegación puede hacerse explícitamente, +> pasando el objeto emisor al objeto receptor, lo que puede hacerse en cualquier lenguaje orientado a objetos; o +> implícitamente, mediante las reglas de búsqueda de miembros del lenguaje, lo que requiere soporte del lenguaje para la +> función. + +**Ejemplo programático** + +Tenemos una interfaz `Printer` y tres implementaciones `CanonPrinter`, `EpsonPrinter` y `HpPrinter`. + +```java +public interface Printer { + void print(final String message); +} + +@Slf4j +public class CanonPrinter implements Printer { + @Override + public void print(String message) { + LOGGER.info("Canon Printer : {}", message); + } +} + +@Slf4j +public class EpsonPrinter implements Printer { + @Override + public void print(String message) { + LOGGER.info("Epson Printer : {}", message); + } +} + +@Slf4j +public class HpPrinter implements Printer { + @Override + public void print(String message) { + LOGGER.info("HP Printer : {}", message); + } +} +``` + +El `PrinterController` puede ser utilizado como un `Printer` delegando cualquier trabajo manejado por este +a un objeto que la implemente. + +```java +public class PrinterController implements Printer { + + private final Printer printer; + + public PrinterController(Printer printer) { + this.printer = printer; + } + + @Override + public void print(String message) { + printer.print(message); + } +} +``` + +Now on the client code printer controllers can print messages differently depending on the +object they're delegating that work to. + +```java +private static final String MESSAGE_TO_PRINT = "hello world"; + +var hpPrinterController = new PrinterController(new HpPrinter()); +var canonPrinterController = new PrinterController(new CanonPrinter()); +var epsonPrinterController = new PrinterController(new EpsonPrinter()); + +hpPrinterController.print(MESSAGE_TO_PRINT); +canonPrinterController.print(MESSAGE_TO_PRINT); +epsonPrinterController.print(MESSAGE_TO_PRINT) +``` + +Salida del programa: + +```java +HP Printer : hello world +Canon Printer : hello world +Epson Printer : hello world +``` + +## Diagrama de clases + +![alt text](./etc/delegation.png "Delegate") + +## Aplicabilidad + +Utilice el patrón Delegate para conseguir lo siguiente + +* Reducir el acoplamiento de los métodos a su clase +* Componentes que se comportan de forma idéntica, pero teniendo en cuenta que esta situación puede cambiar en el futuro. + +## Créditos + +* [Delegate Pattern: Wikipedia ](https://en.wikipedia.org/wiki/Delegation_pattern) +* [Proxy Pattern: Wikipedia ](https://en.wikipedia.org/wiki/Proxy_pattern) diff --git a/localization/es/delegation/etc/delegation.png b/localization/es/delegation/etc/delegation.png new file mode 100644 index 0000000000000000000000000000000000000000..375ef4d6b00f30f1cb7f4dccc7d47c00f77a849a GIT binary patch literal 25260 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 T6<_9Y0DhD&YFsE%FuDIP#mU)$ literal 0 HcmV?d00001 diff --git a/localization/es/embedded-value/README.md b/localization/es/embedded-value/README.md new file mode 100644 index 000000000000..2d3b50ff14cd --- /dev/null +++ b/localization/es/embedded-value/README.md @@ -0,0 +1,138 @@ +--- +title: Embedded Value +category: Structural +language: es +tag: + - Data Access + - Enterprise Application Pattern +--- + +## También conocido como + +Asignación agregada, Compositor + +## Propósito + +Muchos objetos pequeños tienen sentido en un sistema OO que no tienen sentido como tablas en una base de datos. Un valor +incrustado asigna los valores de un objeto a campos del registro del propietario del objeto. + +## Explicación + +Ejemplo real + +> Algunos ejemplos son los objetos monetarios y los intervalos de fechas. Aunque el pensamiento por defecto es guardar +> un objeto como una tabla, ninguna persona en su sano juicio querría una tabla de valores monetarios. +> Otro ejemplo serían los pedidos online que tienen una dirección de envío como calle, ciudad, estado. Asignamos estos +> valores del objeto Dirección de envío a los campos del registro del objeto Pedido. + +En pocas palabras + +> El patrón de valores incrustados permite asignar un objeto a varios campos de la tabla de otro objeto. + +**Ejemplo programático** + +Consideremos el ejemplo de un pedido online donde tenemos detalles del artículo pedido y la dirección de envío. Tenemos +la dirección de envío incrustada en el objeto Pedido. Pero en la base de datos asignamos los valores de la dirección de +envío en el registro del pedido en lugar de crear una tabla separada para la dirección de envío y utilizar una clave +externa para hacer referencia al objeto del pedido. + +Primero, tenemos POJOs `Order` y `ShippingAddress`. + +```java +public class Order { + + private int id; + private String item; + private String orderedBy; + private ShippingAddress ShippingAddress; + + public Order(String item, String orderedBy, ShippingAddress ShippingAddress) { + this.item = item; + this.orderedBy = orderedBy; + this.ShippingAddress = ShippingAddress; + } +``` + +```java +public class ShippingAddress { + + private String city; + private String state; + private String pincode; + + public ShippingAddress(String city, String state, String pincode) { + this.city = city; + this.state = state; + this.pincode = pincode; + } +} +``` + +Ahora, tenemos que crear sólo una tabla para el Pedido junto con los campos para los atributos de la dirección de envío. + +```Sql +CREATE TABLE Orders (Id INT AUTO_INCREMENT, item VARCHAR(50) NOT NULL, orderedBy VARCHAR(50) city VARCHAR(50), state VARCHAR(50), pincode CHAR(6) NOT NULL, PRIMARY KEY(Id)) +``` + +Mientras realizamos las consultas e inserciones en la base de datos, encasillamos y desencasillamos los detalles de las +direcciones de envío. + +```java +final String INSERT_ORDER = "INSERT INTO Orders (item, orderedBy, city, state, pincode) VALUES (?, ?, ?, ?, ?)"; + +public boolean insertOrder(Order order) throws Exception { + var insertOrder = new PreparedStatement(INSERT_ORDER); + var address = order.getShippingAddress(); + conn.setAutoCommit(false); + insertIntoOrders.setString(1, order.getItem()); + insertIntoOrders.setString(2, order.getOrderedBy()); + insertIntoOrders.setString(3, address.getCity()); + insertIntoOrders.setString(4, address.getState()); + insertIntoOrders.setString(5, address.getPincode()); + + var affectedRows = insertIntoOrders.executeUpdate(); + if(affectedRows == 1){ + Logger.info("Inserted successfully"); + }else{ + Logger.info("Couldn't insert " + order); + } +} +``` + +## Diagrama de clases + +![alt text](./etc/embedded-value.urm.png "Embedded value class diagram") + +## Aplicabilidad + +Utilice el patrón Valor incrustado cuando + +* Muchos objetos pequeños tienen sentido en un sistema OO que no tienen sentido como tablas en una base de datos. +* Los casos más simples para Embedded Value son los claros y simples Value Objects como dinero y rango de fechas. +* Si está mapeando a un esquema existente, puede utilizar este patrón cuando una tabla contiene datos que desea dividir + en más de un objeto en memoria. Esto puede ocurrir cuando se desea factorizar algún comportamiento en el modelo de + objetos. +* En la mayoría de los casos, sólo utilizará el valor incrustado en un objeto de referencia cuando la asociación entre + ellos tenga un único valor en ambos extremos (una asociación uno a uno). + +## Tutoriales + +* [Dzone](https://dzone.com/articles/practical-php-patterns/practical-php-patterns-3) +* [Ram N Java](https://ramj2ee.blogspot.com/2013/08/embedded-value-design-pattern.html) +* [Five's Weblog](https://powerdream5.wordpress.com/2007/10/09/embedded-value/) + +## Consecuencias + +* La gran ventaja del valor incrustado es que permite realizar consultas SQL contra los valores del objeto dependiente. +* El objeto valor incrustado no tiene ningún comportamiento de persistencia. +* Al usar esto, tienes que tener cuidado de que cualquier cambio en el dependiente marque al propietario como sucio-lo + cual no es un problema con los Objetos de Valor que son reemplazados en el propietario. +* Otro problema es la carga y el guardado. Si sólo carga la memoria del objeto incrustado cuando carga el propietario, + eso es un argumento para guardar ambos en la misma tabla. +* Otra cuestión es si querrás acceder a los datos de los objetos incrustados por separado a través de SQL. Esto puede + ser importante si estás haciendo informes a través de SQL y no tienes una base de datos separada para los informes. + +## Créditos + +* [Fowler, Martin - Patterns of enterprise application architecture-Addison-Wesley](https://www.amazon.com/Patterns-Enterprise-Application-Architecture-Martin/dp/0321127420) +* [Ram N Java](https://ramj2ee.blogspot.com/2013/08/embedded-value-design-pattern.html) \ No newline at end of file diff --git a/localization/es/embedded-value/etc/embedded-value.urm.png b/localization/es/embedded-value/etc/embedded-value.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..52d3ffb6235273bed61c972a87f056707ea02eb0 GIT binary patch literal 107518 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 C3s$lK literal 0 HcmV?d00001 diff --git a/localization/es/event-aggregator/README.md b/localization/es/event-aggregator/README.md new file mode 100644 index 000000000000..c9ca4971ccd2 --- /dev/null +++ b/localization/es/event-aggregator/README.md @@ -0,0 +1,170 @@ +--- +title: Event Aggregator +category: Structural +language: es +tag: + - Reactive +--- + +## Nombre + +Agregador de eventos + +## Intención + +Un sistema con muchos objetos puede resultar complejo cuando un cliente quiere suscribirse a eventos. El cliente tiene +que encontrar y registrarse para +cada objeto individualmente, si cada objeto tiene múltiples eventos entonces cada evento requiere una suscripción +separada. Un Agregador de Eventos actúa como una única fuente +de eventos para muchos objetos. Se registra para todos los eventos de los muchos objetos permitiendo a los clientes +registrarse sólo con el agregador. + +## Explicación + +Un ejemplo real + +> El rey Joffrey se sienta en el trono de hierro y gobierna los siete reinos de Poniente. Recibe la mayor parte de su +> información crítica de Mano del Rey, el segundo al mando. La Mano del Rey tiene muchos consejeros cercanos que le +> proporcionan información relevante sobre los acontecimientos que ocurren en el reino. + +En pocas palabras + +> El Agregador de Eventos es un mediador de eventos que recoge eventos de múltiples fuentes y los entrega a los +> observadores registrados. + +**Ejemplo programático** + +En nuestro ejemplo programático, demostramos la implementación de un patrón agregador de eventos. Algunos de los objetos +son escuchadores de eventos, otros son emisores de eventos, y el agregador de eventos hace ambas cosas. + +```java +public interface EventObserver { + void onEvent(Event e); +} + +public abstract class EventEmitter { + + private final Map> observerLists; + + public EventEmitter() { + observerLists = new HashMap<>(); + } + + public final void registerObserver(EventObserver obs, Event e) { + ... + } + + protected void notifyObservers(Event e) { + ... + } +} +``` + +`KingJoffrey` está escuchando eventos de `KingsHand`. + +```java +@Slf4j +public class KingJoffrey implements EventObserver { + @Override + public void onEvent(Event e) { + LOGGER.info("Received event from the King's Hand: {}", e.toString()); + } +} +``` + +El `ReyMano` está escuchando los acontecimientos de sus subordinados `LordBaelish`, `LordVarys` y `Scout`. +Lo que escuche de ellos, se lo entrega al "Rey Joffrey". + +```java +public class KingsHand extends EventEmitter implements EventObserver { + + public KingsHand() { + } + + public KingsHand(EventObserver obs, Event e) { + super(obs, e); + } + + @Override + public void onEvent(Event e) { + notifyObservers(e); + } +} +``` + +Por ejemplo, `LordVarys` encuentra un traidor cada domingo y lo notifica al `KingsHand`. + +```java +@Slf4j +public class LordVarys extends EventEmitter implements EventObserver { + @Override + public void timePasses(Weekday day) { + if (day == Weekday.SATURDAY) { + notifyObservers(Event.TRAITOR_DETECTED); + } + } +} +``` + +El siguiente fragmento muestra cómo se construyen y conectan los objetos. + +```java + var kingJoffrey = new KingJoffrey(); + + var kingsHand = new KingsHand(); + kingsHand.registerObserver(kingJoffrey, Event.TRAITOR_DETECTED); + kingsHand.registerObserver(kingJoffrey, Event.STARK_SIGHTED); + kingsHand.registerObserver(kingJoffrey, Event.WARSHIPS_APPROACHING); + kingsHand.registerObserver(kingJoffrey, Event.WHITE_WALKERS_SIGHTED); + + var varys = new LordVarys(); + varys.registerObserver(kingsHand, Event.TRAITOR_DETECTED); + varys.registerObserver(kingsHand, Event.WHITE_WALKERS_SIGHTED); + + var scout = new Scout(); + scout.registerObserver(kingsHand, Event.WARSHIPS_APPROACHING); + scout.registerObserver(varys, Event.WHITE_WALKERS_SIGHTED); + + var baelish = new LordBaelish(kingsHand, Event.STARK_SIGHTED); + + var emitters = List.of( + kingsHand, + baelish, + varys, + scout + ); + + Arrays.stream(Weekday.values()) + .>map(day -> emitter -> emitter.timePasses(day)) + .forEachOrdered(emitters::forEach); +``` + +La salida de la consola después de ejecutar el ejemplo. + +``` +18:21:52.955 [main] INFO com.iluwatar.event.aggregator.KingJoffrey - Received event from the King's Hand: Warships approaching +18:21:52.960 [main] INFO com.iluwatar.event.aggregator.KingJoffrey - Received event from the King's Hand: White walkers sighted +18:21:52.960 [main] INFO com.iluwatar.event.aggregator.KingJoffrey - Received event from the King's Hand: Stark sighted +18:21:52.960 [main] INFO com.iluwatar.event.aggregator.KingJoffrey - Received event from the King's Hand: Traitor detected +``` + +## Diagrama de clases + +![alt text](etc/classes.png "Event Aggregator") + +## Aplicabilidad + +Utilice el patrón Agregador de eventos cuando + +* El Agregador de Eventos es una buena opción cuando tienes muchos objetos que son fuentes potenciales de eventos. En + lugar de hacer que el observador se ocupe de registrarse con todos ellos, puedes centralizar la lógica de registro en + el Agregador de Eventos. Además de simplificar el registro, un Agregador de Eventos también simplifica los problemas + de gestión de memoria en el uso de observadores. + +## Patrones relacionados + +* [Observer](https://java-design-patterns.com/patterns/observer/) + +## Créditos + +* [Martin Fowler - Event Aggregator](http://martinfowler.com/eaaDev/EventAggregator.html) diff --git a/localization/es/event-aggregator/etc/classes.png b/localization/es/event-aggregator/etc/classes.png new file mode 100644 index 0000000000000000000000000000000000000000..295719ea37125d8b49bb8967e2269355d6901c6b GIT binary patch literal 45639 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 z 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 E2VMR^U;qFB literal 0 HcmV?d00001 diff --git a/localization/es/facade/README.md b/localization/es/facade/README.md new file mode 100644 index 000000000000..f37c9fbef443 --- /dev/null +++ b/localization/es/facade/README.md @@ -0,0 +1,224 @@ +--- +title: Facade +category: Structural +language: es +tag: + - Gang Of Four + - Decoupling +--- + +## Propósito + +Proporcionar una interfaz unificada a un conjunto de interfaces de un subsistema. La fachada define una interfaz que +facilita el uso del subsistema. + +## Explicación + +Un ejemplo real + +> ¿Cómo funciona una mina de oro? "¡Bueno, los mineros bajan y sacan oro!" dices. Eso es lo que crees porque estás +> usando una interfaz simple que la mina de oro proporciona en el exterior, internamente tiene que hacer un montón de +> cosas para que suceda. Esta interfaz simple al subsistema complejo es una fachada. + +En pocas palabras + +> El patrón Facade proporciona una interfaz simplificada a un subsistema complejo. + +Wikipedia dice + +> Una fachada es un objeto que proporciona una interfaz simplificada a un cuerpo de código mayor, como una biblioteca de +> clases. + +**Ejemplo programático** + +Tomemos el ejemplo de la mina de oro. Aquí tenemos la jerarquía de los trabajadores enanos de la mina. Primero hay una +clase base `DwarvenMineWorker`: + +```java + +@Slf4j +public abstract class DwarvenMineWorker { + + public void goToSleep() { + LOGGER.info("{} goes to sleep.", name()); + } + + public void wakeUp() { + LOGGER.info("{} wakes up.", name()); + } + + public void goHome() { + LOGGER.info("{} goes home.", name()); + } + + public void goToMine() { + LOGGER.info("{} goes to the mine.", name()); + } + + private void action(Action action) { + switch (action) { + case GO_TO_SLEEP -> goToSleep(); + case WAKE_UP -> wakeUp(); + case GO_HOME -> goHome(); + case GO_TO_MINE -> goToMine(); + case WORK -> work(); + default -> LOGGER.info("Undefined action"); + } + } + + public void action(Action... actions) { + Arrays.stream(actions).forEach(this::action); + } + + public abstract void work(); + + public abstract String name(); + + enum Action { + GO_TO_SLEEP, WAKE_UP, GO_HOME, GO_TO_MINE, WORK + } +} +``` + +Luego tenemos las clases concretas enanas `DwarvenTunnelDigger`, `DwarvenGoldDigger` y `DwarvenCartOperator`: + +```java +@Slf4j +public class DwarvenTunnelDigger extends DwarvenMineWorker { + + @Override + public void work() { + LOGGER.info("{} creates another promising tunnel.", name()); + } + + @Override + public String name() { + return "Dwarven tunnel digger"; + } +} + +@Slf4j +public class DwarvenGoldDigger extends DwarvenMineWorker { + + @Override + public void work() { + LOGGER.info("{} digs for gold.", name()); + } + + @Override + public String name() { + return "Dwarf gold digger"; + } +} + +@Slf4j +public class DwarvenCartOperator extends DwarvenMineWorker { + + @Override + public void work() { + LOGGER.info("{} moves gold chunks out of the mine.", name()); + } + + @Override + public String name() { + return "Dwarf cart operator"; + } +} + +``` + +Para manejar a todos estos trabajadores de la mina de oro tenemos la `FachadaDwarvenGoldmine`: + +```java +public class DwarvenGoldmineFacade { + + private final List workers; + + public DwarvenGoldmineFacade() { + workers = List.of( + new DwarvenGoldDigger(), + new DwarvenCartOperator(), + new DwarvenTunnelDigger()); + } + + public void startNewDay() { + makeActions(workers, DwarvenMineWorker.Action.WAKE_UP, DwarvenMineWorker.Action.GO_TO_MINE); + } + + public void digOutGold() { + makeActions(workers, DwarvenMineWorker.Action.WORK); + } + + public void endDay() { + makeActions(workers, DwarvenMineWorker.Action.GO_HOME, DwarvenMineWorker.Action.GO_TO_SLEEP); + } + + private static void makeActions(Collection workers, + DwarvenMineWorker.Action... actions) { + workers.forEach(worker -> worker.action(actions)); + } +} +``` + +Ahora vamos a utilizar la fachada: + +```java +var facade = new DwarvenGoldmineFacade(); +facade.startNewDay(); +facade.digOutGold(); +facade.endDay(); +``` + +Salida del programa: + +```java +// Dwarf gold digger wakes up. +// Dwarf gold digger goes to the mine. +// Dwarf cart operator wakes up. +// Dwarf cart operator goes to the mine. +// Dwarven tunnel digger wakes up. +// Dwarven tunnel digger goes to the mine. +// Dwarf gold digger digs for gold. +// Dwarf cart operator moves gold chunks out of the mine. +// Dwarven tunnel digger creates another promising tunnel. +// Dwarf gold digger goes home. +// Dwarf gold digger goes to sleep. +// Dwarf cart operator goes home. +// Dwarf cart operator goes to sleep. +// Dwarven tunnel digger goes home. +// Dwarven tunnel digger goes to sleep. +``` + +## Diagrama de clases + +![alt text](./etc/facade.urm.png "Facade pattern class diagram") + +## Aplicabilidad + +Utilice el patrón Fachada cuando + +* Quieres proporcionar una interfaz sencilla a un subsistema complejo. Los subsistemas a menudo se vuelven más complejos + a medida que evolucionan. La mayoría de los patrones, cuando se aplican, dan como resultado más clases y más pequeñas. + Esto hace que el subsistema sea más reutilizable y más fácil de personalizar, pero también se vuelve más difícil de + usar para los clientes que no necesitan personalizarlo. Una fachada puede proporcionar una simple vista por defecto + del subsistema que es lo suficiente para la mayoría de los clientes. Sólo los clientes que necesiten más + personalización tendrán que mirar más allá de la fachada. +* Hay muchas dependencias entre los clientes y las clases de implementación de una abstracción. + Introducir una fachada para desacoplar el subsistema de los clientes y otros subsistemas, promoviendo así + independencia y portabilidad del subsistema. +* Quieres estratificar tus subsistemas. Utiliza una fachada para definir un punto de entrada a cada nivel de subsistema. + Si los subsistemas son dependientes, puedes simplificar las dependencias entre ellos haciéndolos que se comuniquen + entre sí únicamente a través de sus fachadas. + +## Tutoriales + +*[DigitalOcean](https://www.digitalocean.com/community/tutorials/facade-design-pattern-in-java) + +* [Refactoring Guru](https://refactoring.guru/design-patterns/facade) +* [GeekforGeeks](https://www.geeksforgeeks.org/facade-design-pattern-introduction/) +* [Tutorialspoint](https://www.tutorialspoint.com/design_pattern/facade_pattern.htm) + +## Créditos + +* [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59) +* [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b) diff --git a/localization/es/facade/etc/facade.urm.png b/localization/es/facade/etc/facade.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..8e3ec7aca45e7119177664ce1349bf7206b47e5b GIT binary patch literal 62013 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 O&n5=AlO-q4NBjpnc;F-e literal 0 HcmV?d00001 diff --git a/localization/es/flux/README.md b/localization/es/flux/README.md new file mode 100644 index 000000000000..881677e204cd --- /dev/null +++ b/localization/es/flux/README.md @@ -0,0 +1,25 @@ +--- +title: Flux +category: Structural +language: es +tag: + - Decoupling +--- + +## Propósito +Flux evita MVC en favor de un flujo de datos unidireccional. Cuando un usuario +usuario interactúa con una vista, ésta propaga una acción a través de un +central, a los distintos almacenes que contienen los datos de la aplicación y la +que actualiza todas las vistas afectadas. + +## Diagrama de clases +![alt text](./etc/flux.png "Flux") + +## Aplicabilidad +Utilice el patrón Flux cuando + +* Debes centrarte en crear rutas de actualización explícitas y comprensibles para los datos de tu aplicación, lo que simplifica el seguimiento de los cambios durante el desarrollo y facilita la localización y corrección de errores. + +## Créditos + +* [Flux - Application architecture for building user interfaces](http://facebook.github.io/flux/) diff --git a/localization/es/flux/etc/flux.png b/localization/es/flux/etc/flux.png new file mode 100644 index 0000000000000000000000000000000000000000..9cb596eaf03d0a97523b8efe50495f407f3bab38 GIT binary patch literal 62348 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%0ADKlO=7zK=?WZ6o=By;0+ozLGT-uIlRPo_yFzP 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

nDi@2?%Cy6*Q98iYqFx4O(t;E{y-U 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 La tienda del alquimista tiene estanterías llenas de pociones mágicas. Muchas de las pociones son las mismas, por lo +> que no es necesario crear un nuevo objeto para cada una de ellas. En su lugar, una instancia de objeto puede +> representar +> múltiples elementos de la estantería para que la huella de memoria siga siendo pequeña. + +En pocas palabras + +> Se utiliza para minimizar el uso de memoria o los gastos computacionales compartiendo todo lo posible con objetos +> similares. + +Wikipedia dice + +> En programación informática, flyweight es un patrón de diseño de software. Un flyweight es un objeto que minimiza el +> uso de memoria compartiendo tantos datos como sea posible con otros objetos similares; es una forma de utilizar +> objetos +> en grandes cantidades cuando una simple representación repetida utilizaría una cantidad inaceptable de memoria. + +**Ejemplo programático** + +Traduciendo nuestro ejemplo de la tienda de alquimia de arriba. En primer lugar, tenemos diferentes tipos de +pociones `Potion`: `HealingPotion`, `HolyWaterPotion` e `InvisibilityPotion`: + +```java +public interface Potion { + void drink(); +} + +@Slf4j +public class HealingPotion implements Potion { + @Override + public void drink() { + LOGGER.info("You feel healed. (Potion={})", System.identityHashCode(this)); + } +} + +@Slf4j +public class HolyWaterPotion implements Potion { + @Override + public void drink() { + LOGGER.info("You feel blessed. (Potion={})", System.identityHashCode(this)); + } +} + +@Slf4j +public class InvisibilityPotion implements Potion { + @Override + public void drink() { + LOGGER.info("You become invisible. (Potion={})", System.identityHashCode(this)); + } +} +``` + +Luego la clase Flyweight `PotionFactory`, que es la fábrica para crear pociones. + +```java +public class PotionFactory { + + private final Map potions; + + public PotionFactory() { + potions = new EnumMap<>(PotionType.class); + } + + Potion createPotion(PotionType type) { + var potion = potions.get(type); + if (potion == null) { + switch (type) { + case HEALING -> { + potion = new HealingPotion(); + potions.put(type, potion); + } + case HOLY_WATER -> { + potion = new HolyWaterPotion(); + potions.put(type, potion); + } + case INVISIBILITY -> { + potion = new InvisibilityPotion(); + potions.put(type, potion); + } + default -> { + } + } + } + return potion; + } +} +``` + +`AlchemistShop` contiene dos estantes de pociones mágicas. Las pociones se crean utilizando la antes +mencionada `PotionFactory`. + +```java +@Slf4j +public class AlchemistShop { + + private final List topShelf; + private final List bottomShelf; + + public AlchemistShop() { + var factory = new PotionFactory(); + topShelf = List.of( + factory.createPotion(PotionType.INVISIBILITY), + factory.createPotion(PotionType.INVISIBILITY), + factory.createPotion(PotionType.STRENGTH), + factory.createPotion(PotionType.HEALING), + factory.createPotion(PotionType.INVISIBILITY), + factory.createPotion(PotionType.STRENGTH), + factory.createPotion(PotionType.HEALING), + factory.createPotion(PotionType.HEALING) + ); + bottomShelf = List.of( + factory.createPotion(PotionType.POISON), + factory.createPotion(PotionType.POISON), + factory.createPotion(PotionType.POISON), + factory.createPotion(PotionType.HOLY_WATER), + factory.createPotion(PotionType.HOLY_WATER) + ); + } + + public final List getTopShelf() { + return List.copyOf(this.topShelf); + } + + public final List getBottomShelf() { + return List.copyOf(this.bottomShelf); + } + + public void drinkPotions() { + LOGGER.info("Drinking top shelf potions\n"); + topShelf.forEach(Potion::drink); + LOGGER.info("Drinking bottom shelf potions\n"); + bottomShelf.forEach(Potion::drink); + } +} +``` + +En nuestro escenario, un valiente visitante entra en la tienda del alquimista y se bebe todas las pociones. + +```java +// create the alchemist shop with the potions +var alchemistShop = new AlchemistShop(); +// a brave visitor enters the alchemist shop and drinks all the potions +alchemistShop.drinkPotions(); +``` + +Salida del programa: + +```java +Drinking top shelf potions +You become invisible. (Potion=1509514333) +You become invisible. (Potion=1509514333) +You feel strong. (Potion=739498517) +You feel healed. (Potion=125130493) +You become invisible. (Potion=1509514333) +You feel strong. (Potion=739498517) +You feel healed. (Potion=125130493) +You feel healed. (Potion=125130493) +Drinking bottom shelf potions +Urgh! This is poisonous. (Potion=166239592) +Urgh! This is poisonous. (Potion=166239592) +Urgh! This is poisonous. (Potion=166239592) +You feel blessed. (Potion=991505714) +You feel blessed. (Potion=991505714) +``` + +## Diagrama de clases + +![alt text](./etc/flyweight.urm.png "Flyweight pattern class diagram") + +## Aplicabilidad + +La eficacia del patrón Flyweight depende en gran medida de cómo y dónde se utilice. Aplique el patrón +Flyweight cuando se cumplan todas las condiciones siguientes: + +* Una aplicación utiliza un gran número de objetos. +* Los costes de almacenamiento son altos debido a la gran cantidad de objetos. +* La mayor parte del estado de los objetos puede hacerse extrínseco. +* Muchos grupos de objetos pueden ser reemplazados por relativamente pocos objetos compartidos una vez que el estado extrínseco + extrínseco. +* La aplicación no depende de la identidad de los objetos. Dado que los objetos flyweight pueden ser compartidos, las pruebas de identidad + devolverán verdadero para objetos conceptualmente distintos. + +## Usos conocidos + +* [java.lang.Integer#valueOf(int)](http://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html#valueOf%28int%29) y + de forma similar para Byte, Carácter y otros tipos envueltos (Wrappers). + +## Créditos + +* [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59) +* [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b) diff --git a/localization/es/flyweight/etc/flyweight.urm.png b/localization/es/flyweight/etc/flyweight.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..299cdb7bdf8676c3c04d04e63ea9cc907a31946d GIT binary patch literal 54844 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 literal 0 HcmV?d00001 diff --git a/localization/es/front-controller/README.md b/localization/es/front-controller/README.md new file mode 100644 index 000000000000..ca59227eead0 --- /dev/null +++ b/localization/es/front-controller/README.md @@ -0,0 +1,33 @@ +--- +title: Front Controller +category: Structural +language: es +tag: + - Decoupling +--- + +## Propósito +Introducir un gestor común para todas las solicitudes de un sitio web. De esta +manera podemos encapsular funcionalidad común como la seguridad, +internacionalización, enrutamiento y registro en un solo lugar. + +## Diagrama de clases +![alt text](./etc/front-controller.png "Front Controller") + +## Aplicabilidad +Utilice el patrón del controlador frontal cuando + +* Desea encapsular la funcionalidad común de gestión de peticiones en un único lugar. +* Desea implementar la gestión dinámica de peticiones, es decir, cambiar el enrutamiento sin modificar el código. +* hacer portable la configuración del servidor web, sólo necesitas registrar el manejador de forma específica para el servidor web + +## Ejemplos del mundo real + +* [Apache Struts](https://struts.apache.org/) + +## Créditos + +* [J2EE Design Patterns](https://www.amazon.com/gp/product/0596004273/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596004273&linkCode=as2&tag=javadesignpat-20&linkId=48d37c67fb3d845b802fa9b619ad8f31) +* [Presentation Tier Patterns](http://www.javagyan.com/tutorials/corej2eepatterns/presentation-tier-patterns) +* [Patterns of Enterprise Application Architecture](https://www.amazon.com/gp/product/0321127420/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321127420&linkCode=as2&tag=javadesignpat-20&linkId=d9f7d37b032ca6e96253562d075fcc4a) +* [J2EE Design Patterns](https://www.amazon.com/gp/product/0596004273/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596004273&linkCode=as2&tag=javadesignpat-20&linkId=f27d2644fbe5026ea448791a8ad09c94) diff --git a/localization/es/front-controller/etc/front-controller.png b/localization/es/front-controller/etc/front-controller.png new file mode 100644 index 0000000000000000000000000000000000000000..77c14ef019cc2864c159a9600095e7117c479916 GIT binary patch literal 27672 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 Gateway actúa como una verdadera puerta de entrada de una ciudad determinada. Las personas dentro de la ciudad se llaman sistema interno, y las diferentes ciudades externas se llaman servicios externos. La puerta de enlace está aquí para proporcionar acceso al sistema interno a diferentes servicios externos. + +En pocas palabras + +> La pasarela puede proporcionar una interfaz que permita al sistema interno utilizar un servicio externo. + +Wikipedia dice + +> Un servidor que actúa como front-end de la API, recibe solicitudes de la API, aplica políticas de estrangulamiento y seguridad, pasa las solicitudes al servicio back-end y, a continuación, devuelve la respuesta al solicitante. + +**Ejemplo programático** + +La clase principal de nuestro ejemplo es el `ExternalService` que contiene elementos. + +```java +class ExternalServiceA implements Gateway { + @Override + public void execute() throws Exception { + LOGGER.info("Executing Service A"); + // Simulate a time-consuming task + Thread.sleep(1000); + } +} + +/** + * ExternalServiceB is one of external services. + */ +class ExternalServiceB implements Gateway { + @Override + public void execute() throws Exception { + LOGGER.info("Executing Service B"); + // Simulate a time-consuming task + Thread.sleep(1000); + } +} + +/** + * ExternalServiceC is one of external services. + */ +class ExternalServiceC implements Gateway { + @Override + public void execute() throws Exception { + LOGGER.info("Executing Service C"); + // Simulate a time-consuming task + Thread.sleep(1000); + } + + public void error() throws Exception { + // Simulate an exception + throw new RuntimeException("Service C encountered an error"); + } +} +``` + +Para operar estos servicios externos, aquí está la clase `App`: + +```java +public class App { + /** + * Simulate an application calling external services. + */ + public static void main(String[] args) throws Exception { + GatewayFactory gatewayFactory = new GatewayFactory(); + + // Register different gateways + gatewayFactory.registerGateway("ServiceA", new ExternalServiceA()); + gatewayFactory.registerGateway("ServiceB", new ExternalServiceB()); + gatewayFactory.registerGateway("ServiceC", new ExternalServiceC()); + + // Use an executor service for asynchronous execution + Gateway serviceA = gatewayFactory.getGateway("ServiceA"); + Gateway serviceB = gatewayFactory.getGateway("ServiceB"); + Gateway serviceC = gatewayFactory.getGateway("ServiceC"); + + // Execute external services + try { + serviceA.execute(); + serviceB.execute(); + serviceC.execute(); + } catch (ThreadDeath e) { + LOGGER.info("Interrupted!" + e); + throw e; + } + } +} +``` + +La interfaz `Gateway` es extremadamente sencilla. + +```java +interface Gateway { + void execute() throws Exception; +} +``` + +Salida del programa: + +```java + Executing Service A + Executing Service B + Executing Service C +``` + +## Diagrama de clases + +![alt text](./etc/gateway.urm.png "gateway") + +## Aplicabilidad + +Utilizar el patrón Gateway + +* Para acceder al contenido de un objeto agregado sin exponer su representación interna. +* Para la integración con múltiples servicios externos o APIs. +* Para proporcionar una interfaz uniforme para recorrer diferentes estructuras de agregados. + +## Tutoriales + +* [Pattern: API Gateway / Backends for Frontends](https://microservices.io/patterns/apigateway.html) + +## Usos conocidos + +* [API Gateway](https://java-design-patterns.com/patterns/api-gateway/) +* [10 most common use cases of an API Gateway](https://apisix.apache.org/blog/2022/10/27/ten-use-cases-api-gateway/) + +## Créditos + +* [Gateway](https://martinfowler.com/articles/gateway-pattern.html) +* [What is the difference between Facade and Gateway design patterns?](https://stackoverflow.com/questions/4422211/what-is-the-difference-between-facade-and-gateway-design-patterns) diff --git a/localization/es/gateway/etc/gateway.urm.png b/localization/es/gateway/etc/gateway.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..2d8ad6c9a8f839b82d4ad148d1e3eb25945e6710 GIT binary patch literal 46237 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 C)*Mp+ literal 0 HcmV?d00001 diff --git a/localization/es/marker/README.md b/localization/es/marker/README.md new file mode 100644 index 000000000000..292751803657 --- /dev/null +++ b/localization/es/marker/README.md @@ -0,0 +1,28 @@ +--- +title: Marker Interface +category: Structural +language: es +tag: + - Decoupling +--- + +## Propósito +Utilización de interfaces vacías como marcadores para distinguir objetos con un tratamiento especial. + +## Diagrama de clases +![alt text](./etc/MarkerDiagram.png "Marker Interface") + +## Aplicabilidad +Utilice el patrón de interfaz de marcador cuando + +* Desea identificar los objetos especiales de los objetos normales (para tratarlos de forma diferente) +* Desea indicar que un objeto está disponible para cierto tipo de operaciones. + +## Ejemplos del mundo real + +* [javase.8.docs.api.java.io.Serializable](https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html) +* [javase.8.docs.api.java.lang.Cloneable](https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.html) + +## Créditos + +* [Effective Java](https://www.amazon.com/gp/product/0134685997/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0134685997&linkCode=as2&tag=javadesignpat-20&linkId=4e349f4b3ff8c50123f8147c828e53eb) diff --git a/localization/es/marker/etc/MarkerDiagram.png b/localization/es/marker/etc/MarkerDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed4f9c567809787d9317733a2e4fe40cbe3284c GIT binary patch literal 6461 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 WzLyy+Lj79=qN54ic(48-^uGXLahsh0 literal 0 HcmV?d00001 diff --git a/localization/es/module/README.md b/localization/es/module/README.md new file mode 100644 index 000000000000..dc2e27c810cd --- /dev/null +++ b/localization/es/module/README.md @@ -0,0 +1,164 @@ +--- +title: Module +category: Structural +language: es +tag: + - Decoupling +--- + +## Propósito +El patrón de módulos se utiliza para implementar el concepto de módulos de software, definido por la programación modular, en un lenguaje de programación con soporte directo incompleto para el concepto. + +## Explicación + +Ejemplo real + +> En una bulliciosa ciudad del software, distintos componentes de software, como la base de datos, la interfaz de usuario y la API, a menudo necesitan colaborar. En lugar de que cada componente hable directamente con los demás, confían en el gestor de módulos. Este gestor de módulos actúa como un mercado central, donde cada componente registra sus servicios y solicitudes para los demás. Esto garantiza que los componentes permanezcan desacoplados y que los cambios en uno de ellos no afecten a todo el sistema. + + +> Imagina un smartphone moderno. Tiene distintas aplicaciones, como mensajería, cámara y reproductor de música. Aunque cada una funciona de forma independiente, a veces necesitan compartir recursos como el acceso a los contactos o el almacenamiento. En lugar de que cada aplicación tenga su propia forma de acceder a estos recursos, utilizan los módulos integrados del teléfono, como el módulo de contactos o el de almacenamiento. Esto garantiza una experiencia coherente para el usuario y evita posibles conflictos entre aplicaciones. + +En pocas palabras + +> El patrón Módulo encapsula funciones y datos relacionados en una sola unidad, lo que permite tener componentes de software organizados y manejables. + +Wikipedia dice + +> En ingeniería de software, el patrón módulo es un patrón de diseño utilizado para implementar el concepto de módulos de software, definido por la programación modular, en un lenguaje de programación con soporte directo incompleto para el concepto. + +> Este patrón se puede implementar de varias maneras dependiendo del lenguaje de programación anfitrión, como el patrón de diseño singleton, miembros estáticos orientados a objetos en una clase y funciones globales de procedimiento. En Python, el patrón está integrado en el lenguaje, y cada archivo .py es automáticamente un módulo. Lo mismo ocurre en Ada, donde el paquete puede considerarse un módulo (similar a una clase estática). + +**Ejemplo programático** + +```java +//Define Logger abstract class +abstract class Logger { + protected String output; + protected String error; + + public abstract void prepare(); + public abstract void unprepare(); + public abstract void printString(String message); + public abstract void printErrorString(String errorMessage); +} + +//File log module +class FileLoggerModule extends Logger { + private static final String OUTPUT_FILE = "output.log"; + private static final String ERROR_FILE = "error.log"; + + private static FileLoggerModule instance; + + private FileLoggerModule() { + this.output = OUTPUT_FILE; + this.error = ERROR_FILE; + } + + public static FileLoggerModule getSingleton() { + if (instance == null) { + instance = new FileLoggerModule(); + } + return instance; + } + + @Override + public void prepare() { + // For example, open file operation + // add the action you want + } + + @Override + public void unprepare() { + // For example, close file operation + // add the action you want + } + + @Override + public void printString(String message) { + System.out.println("Writing to " + output + ": " + message); + } + + @Override + public void printErrorString(String errorMessage) { + System.out.println("Writing to " + error + ": " + errorMessage); + } +} + +//Console log module +class ConsoleLoggerModule extends Logger { + private static ConsoleLoggerModule instance; + + private ConsoleLoggerModule() {} + + public static ConsoleLoggerModule getSingleton() { + if (instance == null) { + instance = new ConsoleLoggerModule(); + } + return instance; + } + + @Override + public void prepare() { + //Initialize console operation + } + + @Override + public void unprepare() { + //End console operation + } + + @Override + public void printString(String message) { + System.out.println("Console Output: " + message); + } + + @Override + public void printErrorString(String errorMessage) { + System.err.println("Console Error: " + errorMessage); + } +} + + +public class App { + public void prepare() { + FileLoggerModule.getSingleton().prepare(); + ConsoleLoggerModule.getSingleton().prepare(); + } + + public void unprepare() { + FileLoggerModule.getSingleton().unprepare(); + ConsoleLoggerModule.getSingleton().unprepare(); + } + + public void execute(String message) { + FileLoggerModule.getSingleton().printString(message); + ConsoleLoggerModule.getSingleton().printString(message); + } + + public static void main(String[] args) { + App app = new App(); + app.prepare(); + app.execute("Hello, Module Pattern!"); + app.unprepare(); + } +} +``` + +Resultados del programa: + +``` +Writing to output.log: Hello, Module Pattern! +Console Output: Hello, Module Pattern! +``` + +## Diagrama de clases +![alt text](./etc/module.png "Module") + +## Aplicabilidad +El patrón Módulo puede considerarse un patrón de creación y un patrón estructural. Gestiona la creación y organización de otros elementos, y los agrupa como lo hace el patrón estructural. + +Un objeto que aplica este patrón puede proporcionar el equivalente de un espacio de nombres, proporcionando el proceso de inicialización y finalización de una clase estática o de una clase con miembros estáticos con una sintaxis y una semántica más limpias y concisas. + +## Créditos + +* [Module](https://en.wikipedia.org/wiki/Module_pattern) diff --git a/localization/es/module/etc/module.png b/localization/es/module/etc/module.png new file mode 100644 index 0000000000000000000000000000000000000000..a26807d290c0d2aced42c5e5d48cf0780e9c4d2b GIT binary patch literal 18027 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�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 b&*xx@wCm+^Q{eyCf+Z;`E0Qa$`}Y3>Bi8;O literal 0 HcmV?d00001 diff --git a/localization/es/page-controller/README.md b/localization/es/page-controller/README.md new file mode 100644 index 000000000000..e4b97e5f82ea --- /dev/null +++ b/localization/es/page-controller/README.md @@ -0,0 +1,162 @@ +--- +title: Page Controller +category: Structural +language: es +tags: +- Decoupling +--- + +## Nombre / clasificación + +Page Controller + +## Propósito + +Se trata de un enfoque de una página que conduce a un archivo lógico que gestiona acciones o peticiones en un sitio web. + +## Explicación + +Un ejemplo real + +> En un sitio web de compras, hay una página de registro para dar de alta un perfil de usuario. Una vez finalizado el registro, la página de registro se redirigirá a una página de usuario para mostrar la información registrada del usuario. + +En pocas palabras + +> El controlador de página gestiona las peticiones HTTP y los datos en una página específica usando la idea MVC. +> La idea es que una página contiene un controlador que maneja el modelo y la vista. + +**Ejemplo programático** + +Aquí está el controlador Signup cuando un usuario registra su información para un sitio web. + +```java +@Slf4j +@Controller +@Component +public class SignupController { + SignupView view = new SignupView(); + /** + * Signup Controller can handle http request and decide which model and view use. + */ + SignupController() { + } + + /** + * Handle http GET request. + */ + @GetMapping("/signup") + public String getSignup() { + return view.display(); + } + + /** + * Handle http POST request and access model and view. + */ + @PostMapping("/signup") + public String create(SignupModel form, RedirectAttributes redirectAttributes) { + LOGGER.info(form.getName()); + LOGGER.info(form.getEmail()); + redirectAttributes.addAttribute("name", form.getName()); + redirectAttributes.addAttribute("email", form.getEmail()); + redirectAttributes.addFlashAttribute("userInfo", form); + return view.redirect(form); + } +} +``` +Aquí está el modelo y la vista de Signup que son manejados por el controlador de Signup. + +```java +@Component +@Getter +@Setter +public class SignupModel { + private String name; + private String email; + private String password; + + public SignupModel() { + } +} +``` + +```java +@Slf4j +public class SignupView { + public SignupView() { + } + + public String display() { + LOGGER.info("display signup front page"); + return "/signup"; + } + + /** + * redirect to user page. + */ + public String redirect(SignupModel form) { + LOGGER.info("Redirect to user page with " + "name " + form.getName() + " email " + form.getEmail()); + return "redirect:/user"; + } +} +``` + +Este es el Controlador de Usuario para manejar la petición Get en una página de usuario. + +```java +@Slf4j +@Controller +public class UserController { + UserView view = new UserView(); + + public UserController() {} + + /** + * Handle http GET request and access view and model. + */ + @GetMapping("/user") + public String getUserPath(SignupModel form, Model model) { + model.addAttribute("name", form.getName()); + model.addAttribute("email", form.getEmail()); + return view.display(form); + } +} +``` + +Aquí están el Modelo de Usuario y la Vista que son manejados por el controlador de Usuario. + +```java +@Getter +@Setter +public class UserModel { + private String name; + private String email; + + public UserModel() {} +} +``` + +```java +@Slf4j +public class UserView { + /** + * displaying command to generate html. + * @param user model content. + */ + public String display(SignupModel user) { + LOGGER.info("display user html" + " name " + user.getName() + " email " + user.getEmail()); + return "/user"; + } +} +``` + +## Diagrama de clases +![alt text](./etc/page-controller.urm.png) + +## Aplicabilidad +Utilice el patrón Page Controller cuando +- implementas un sitio donde la mayor parte de la lógica del controlador es simple +- implementa un sitio en el que determinadas acciones se gestionan con una página de servidor concreta + +## Créditos +- [Page Controller](https://www.martinfowler.com/eaaCatalog/pageController.html) +- [Pattern of Enterprise Application Architecture](https://www.martinfowler.com/books/eaa.html) \ No newline at end of file diff --git a/localization/es/page-controller/etc/page-controller.urm.png b/localization/es/page-controller/etc/page-controller.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..d46bb018755b5ff6aeee6add3a708d65e56838d7 GIT binary patch literal 75946 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 literal 0 HcmV?d00001 diff --git a/localization/es/page-object/README.md b/localization/es/page-object/README.md new file mode 100644 index 000000000000..74d58406841c --- /dev/null +++ b/localization/es/page-object/README.md @@ -0,0 +1,86 @@ +--- +title: Page Object +category: Structural +language: es +tag: +- Decoupling +--- + +# Patrón de objetos de página en Java + +## Ejemplo del mundo real + +Considera un escenario de automatización web donde necesitas interactuar con una página web usando un framework de pruebas como Selenium. El patrón Page Object puede aplicarse para modelar cada página web como una clase Java. Cada clase encapsula la estructura y el comportamiento de la página web correspondiente, facilitando la gestión y actualización del código de automatización. + +## Intención + +Page Object encapsula la interfaz de usuario, ocultando el widget de interfaz de usuario subyacente de una aplicación (normalmente una aplicación web) y proporcionando una API específica de la aplicación para permitir la manipulación de los componentes de interfaz de usuario necesarios para las pruebas. De este modo, permite a la clase de prueba centrarse en la lógica de la prueba. + +## En pocas palabras + +El patrón Page Object en Java es un patrón de diseño utilizado en la automatización de pruebas para representar páginas web como clases Java. Cada clase corresponde a una página web específica y contiene métodos para interactuar con los elementos de esa página. Este patrón mejora el mantenimiento y la legibilidad del código en las pruebas automatizadas. + +## Wikipedia dice + +Aunque no hay una entrada específica en Wikipedia para el patrón Page Object, se utiliza ampliamente en las pruebas de software, en particular en el contexto de la automatización de la interfaz de usuario. El patrón Page Object ayuda a abstraer los detalles de una página web, proporcionando una forma más limpia y fácil de mantener para interactuar con elementos web en pruebas automatizadas. + +## Ejemplo programático + +Vamos a crear un ejemplo programático simple del patrón Page Object para una página de login utilizando Selenium en Java: + +```java +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +public class LoginPage { + private final WebDriver driver; + + // Web elements on the login page + private final By usernameInput = By.id("username"); + private final By passwordInput = By.id("password"); + private final By loginButton = By.id("login-button"); + + public LoginPage(WebDriver driver) { + this.driver = driver; + } + + // Methods to interact with the login page + + public void enterUsername(String username) { + WebElement usernameElement = driver.findElement(usernameInput); + usernameElement.sendKeys(username); + } + + public void enterPassword(String password) { + WebElement passwordElement = driver.findElement(passwordInput); + passwordElement.sendKeys(password); + } + + public void clickLoginButton() { + WebElement loginButtonElement = driver.findElement(loginButton); + loginButtonElement.click(); + } + + // Other methods specific to the login page if needed +} +``` + +En este ejemplo, la clase `LoginPage` representa la página de login de una aplicación web. Encapsula los elementos web de la página y proporciona métodos para interactuar con esos elementos. La instancia real de Selenium WebDriver se pasa al constructor, permitiendo a los métodos realizar acciones en la página web. + +Este objeto de página se puede utilizar en scripts de prueba para interactuar con la página de inicio de sesión sin exponer los detalles de la estructura de la página en el código de prueba, lo que favorece el mantenimiento y la reutilización. + +## Aplicabilidad + +Utilice el patrón Page Object cuando + +* Estás escribiendo pruebas automatizadas para tu aplicación web y quieres separar la manipulación de la interfaz de usuario necesaria para las pruebas de la lógica de prueba real. +* Haga sus pruebas menos frágiles, y más legibles y robustas. + +## Otro ejemplo con diagrama de clases +![alt text](./etc/page-object.png "Page Object") + +## Créditos + +* [Martin Fowler - PageObject](http://martinfowler.com/bliki/PageObject.html) +* [Selenium - Page Objects](https://github.com/SeleniumHQ/selenium/wiki/PageObjects) diff --git a/localization/es/page-object/etc/page-object.png b/localization/es/page-object/etc/page-object.png new file mode 100644 index 0000000000000000000000000000000000000000..4240b438efbb2179ff5efc7f1795d4a1b431e580 GIT binary patch literal 49696 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 Imagina una torre donde los magos locales van a estudiar sus hechizos. A la torre de marfil sólo se puede acceder a través de un proxy que asegura que sólo los tres primeros magos pueden entrar. Aquí el proxy representa la funcionalidad de la torre y le añade control de acceso. + +En palabras llanas + +> Usando el patrón proxy, una clase representa la funcionalidad de otra clase. + +Wikipedia dice + +> Un proxy, en su forma más general, es una clase que funciona como interfaz de otra cosa. Un proxy es una envoltura o un objeto agente que está siendo llamado por el cliente para acceder al objeto real de servicio detrás de las escenas. El uso del proxy puede ser simplemente el reenvío al objeto real, o puede proporcionar lógica adicional. En el proxy se puede proporcionar funcionalidad adicional, por ejemplo, almacenamiento en caché cuando las operaciones en el objeto real consumen muchos recursos, o comprobación de condiciones previas antes de invocar operaciones en el objeto real. + +**Ejemplo programático** + +Tomando el ejemplo anterior de nuestra torre de asistentes. En primer lugar tenemos la interfaz `WizardTower` y la clase `IvoryTower`. + +```java +public interface WizardTower { + + void enter(Wizard wizard); +} + +@Slf4j +public class IvoryTower implements WizardTower { + + public void enter(Wizard wizard) { + LOGGER.info("{} enters the tower.", wizard); + } + +} +``` + +A continuación, una simple clase `Wizard`. + +```java +public class Wizard { + + private final String name; + + public Wizard(String name) { + this.name = name; + } + + @Override + public String toString() { + return name; + } +} +``` + +Luego tenemos el `WizardTowerProxy` para añadir control de acceso a `WizardTower`. + +```java +@Slf4j +public class WizardTowerProxy implements WizardTower { + + 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); + } + } +} +``` + +Y aquí está el escenario de entrada a la torre. + +```java +var proxy = new WizardTowerProxy(new IvoryTower()); +proxy.enter(new Wizard("Red wizard")); +proxy.enter(new Wizard("White wizard")); +proxy.enter(new Wizard("Black wizard")); +proxy.enter(new Wizard("Green wizard")); +proxy.enter(new Wizard("Brown wizard")); +``` + +Salida del programa: + +``` +Red wizard enters the tower. +White wizard enters the tower. +Black wizard enters the tower. +Green wizard is not allowed to enter! +Brown wizard is not allowed to enter! +``` + +## Diagrama de clases + +![alt text](./etc/proxy.urm.png "Proxy pattern class diagram") + +## Aplicabilidad + +El proxy es aplicable siempre que se necesite una referencia a un objeto más versátil o sofisticada que un simple puntero. +que un simple puntero. He aquí varias situaciones comunes en las que el patrón Proxy es +aplicable. + +* Un proxy remoto proporciona un representante local para un objeto en un espacio de direcciones diferente. +* El proxy virtual crea objetos caros bajo demanda. +* Un proxy de protección controla el acceso al objeto original. Los proxies de protección son útiles cuando + objetos deben tener diferentes derechos de acceso. + +Típicamente, el patrón proxy se utiliza para + +* Controlar el acceso a otro objeto +* Inicialización perezosa +* Implementar el registro +* Facilitar la conexión de red +* Contar referencias a un objeto + +## Tutoriales + +* [Controlling Access With Proxy Pattern](http://java-design-patterns.com/blog/controlling-access-with-proxy-pattern/) + +## Usos conocidos + +* [java.lang.reflect.Proxy](http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Proxy.html) +* [Apache Commons Proxy](https://commons.apache.org/proper/commons-proxy/) +* Mocking frameworks [Mockito](https://site.mockito.org/), +[Powermock](https://powermock.github.io/), [EasyMock](https://easymock.org/) +* [UIAppearance](https://developer.apple.com/documentation/uikit/uiappearance) + +## Patrones relacionados + +* [Ambassador](https://java-design-patterns.com/patterns/ambassador/) + +## Créditos + +* [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59) +* [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b) diff --git a/localization/es/proxy/etc/proxy.urm.png b/localization/es/proxy/etc/proxy.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..a0c94fc7c71722efadfc63ebe641121e87bfeb3a GIT binary patch literal 28797 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 literal 0 HcmV?d00001 diff --git a/localization/es/role-object/README.md b/localization/es/role-object/README.md new file mode 100644 index 000000000000..f23dbf3293f5 --- /dev/null +++ b/localization/es/role-object/README.md @@ -0,0 +1,32 @@ +--- +title: Role Object +category: Structural +language: es +tag: + - Extensibility +--- + +## También conocido como +Patrón Post, Patrón Extension Object + +## Propósito +Adaptar un objeto a las necesidades de diferentes clientes mediante objetos de rol adjuntos de forma transparente, cada uno de los cuales representa un papel +que el objeto debe desempeñar en el contexto de ese cliente. El objeto gestiona su conjunto de roles de forma dinámica. Al representar los roles como +objetos individuales, los distintos contextos se mantienen separados y se simplifica la configuración del sistema. + +## Diagrama de clases +![alt text](./etc/role-object.urm.png "Role Object pattern class diagram") + +## Aplicabilidad +Utiliza el patrón Objeto Rol, si: + +- Quieres manejar una abstracción clave en diferentes contextos y no quieres poner las interfaces específicas de contexto resultantes en la misma interfaz de clase. +- Quieres manejar los roles disponibles dinámicamente para que puedan ser adjuntados y removidos bajo demanda, es decir en tiempo de ejecución, en lugar de fijarlos estáticamente en tiempo de compilación. +- Quiere tratar las extensiones de forma transparente y necesita preservar la identidad lógica del objeto del conglomerado de objetos resultante. +- Desea mantener los pares rol/cliente independientes entre sí, de modo que los cambios en un rol no afecten a los clientes que no estén interesados en ese rol. + +## Créditos + +- [Hillside - Role object pattern](https://hillside.net/plop/plop97/Proceedings/riehle.pdf) +- [Role object](http://wiki.c2.com/?RoleObject) +- [Fowler - Dealing with roles](https://martinfowler.com/apsupp/roles.pdf) diff --git a/localization/es/role-object/etc/role-object.urm.png b/localization/es/role-object/etc/role-object.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..65201c68aff488a00d7ecb816c17dd0d3d23ab78 GIT binary patch literal 64455 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 M`lfn0x~H!F2a)o-djJ3c literal 0 HcmV?d00001 diff --git a/localization/es/separated-interface/README.md b/localization/es/separated-interface/README.md new file mode 100644 index 000000000000..d65b7440e9a6 --- /dev/null +++ b/localization/es/separated-interface/README.md @@ -0,0 +1,133 @@ +--- +title: Separated Interface +category: Structural +language: es +tag: + - Decoupling +--- + + +## Propósito + +Separe la definición de la interfaz y su implementación en paquetes diferentes. Esto permite al cliente desconozca por completo la implementación. + +## Explicación + +Ejemplo del mundo real + +> Se puede crear un generador de facturas con capacidad para utilizar diferentes calculadoras de impuestos que se pueden añadir en la factura en función del tipo de compra, región, etc. + +En pocas palabras + +> El patrón de interfaz separada anima a mantener las implementaciones de una interfaz desacopladas del cliente y su definición, para que el cliente no dependa de la implementación. + +Un código cliente puede abstraer algunas funcionalidades específicas a una interfaz, y definir la definición de +la interfaz como una SPI ([Service Programming Interface](https://en.wikipedia.org/wiki/Service_provider_interface) +es una API pensada y abierta para ser implementada o ampliada por terceros). Otro paquete puede +implementar esta definición de interfaz con una lógica concreta, que se inyectará en el código del cliente en tiempo de ejecución (con un tercero). +cliente en tiempo de ejecución (con una tercera clase, inyectando la implementación en el cliente) o en tiempo de compilación +(utilizando el patrón Plugin con algún archivo configurable). + +**Ejemplo programático** + +**Cliente** + +La clase `InvoiceGenerator` acepta el coste del producto y calcula el importe total a pagar, impuestos incluidos. +total a pagar, impuestos incluidos. + +```java +public class InvoiceGenerator { + + private final TaxCalculator taxCalculator; + + private final double amount; + + public InvoiceGenerator(double amount, TaxCalculator taxCalculator) { + this.amount = amount; + this.taxCalculator = taxCalculator; + } + + public double getAmountWithTax() { + return amount + taxCalculator.calculate(amount); + } + +} +``` + +La lógica de cálculo de impuestos se delega en la interfaz `TaxCalculator`. + +```java +public interface TaxCalculator { + + double calculate(double amount); + +} +``` + +**Paquete de aplicación** + +En otro paquete (que el cliente desconoce por completo) existen múltiples implementaciones +de la interfaz `TaxCalculator`. Una de ellas es `ForeignTaxCalculator`, que aplica un impuesto del 60 +para los productos internacionales. + +```java +public class ForeignTaxCalculator implements TaxCalculator { + + public static final double TAX_PERCENTAGE = 60; + + @Override + public double calculate(double amount) { + return amount * TAX_PERCENTAGE / 100.0; + } + +} +``` + +Otra es `DomesticTaxCalculator`, que grava con un 20% los productos internacionales. + +```java +public class DomesticTaxCalculator implements TaxCalculator { + + public static final double TAX_PERCENTAGE = 20; + + @Override + public double calculate(double amount) { + return amount * TAX_PERCENTAGE / 100.0; + } + +} +``` + +Estas dos implementaciones son instanciadas e inyectadas en la clase cliente por la clase `App.java`. +en la clase cliente. + +```java + var internationalProductInvoice = new InvoiceGenerator(PRODUCT_COST, new ForeignTaxCalculator()); + + LOGGER.info("Foreign Tax applied: {}", "" + internationalProductInvoice.getAmountWithTax()); + + var domesticProductInvoice = new InvoiceGenerator(PRODUCT_COST, new DomesticTaxCalculator()); + + LOGGER.info("Domestic Tax applied: {}", "" + domesticProductInvoice.getAmountWithTax()); +``` + +## Diagrama de clases + +![alt text](./etc/class_diagram.png "Separated Interface") + +## Aplicabilidad + +Utilice el patrón de interfaz separada cuando + +* Estás desarrollando un paquete de framework, y tu framework necesita llamar a algún código de aplicación a través de interfaces. +* Tienes paquetes separados que implementan las funcionalidades que pueden ser conectadas a tu código cliente en tiempo de ejecución o de compilación. +* Su código reside en una capa a la que no se le permite llamar a la capa de implementación de la interfaz por norma. Por ejemplo, una capa de dominio necesita llamar a un mapeador de datos. + +## Tutoriales + +* [Separated Interface Tutorial](https://www.youtube.com/watch?v=d3k-hOA7k2Y) + +## Créditos + +* [Martin Fowler](https://www.martinfowler.com/eaaCatalog/separatedInterface.html) +* [Patterns of Enterprise Application Architecture](https://www.amazon.com/gp/product/0321127420/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=0321127420&linkId=e08dfb7f2cf6153542ef1b5a00b10abc) diff --git a/localization/es/separated-interface/etc/class_diagram.png b/localization/es/separated-interface/etc/class_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..10d509801f79b7c9172c87731233d6753d597efd GIT binary patch literal 32958 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 literal 0 HcmV?d00001 diff --git a/localization/es/single-table-inheritance/README.md b/localization/es/single-table-inheritance/README.md new file mode 100644 index 000000000000..c8f8a5ca623a --- /dev/null +++ b/localization/es/single-table-inheritance/README.md @@ -0,0 +1,146 @@ +--- +title: Single Table Inheritance Pattern +category: Structural +language: es +tag: + - Data access +--- + +## Single Table Inheritance(STI) + +## Propósito + +Representa una jerarquía hereditaria de clases como una única tabla que tiene columnas para todos los campos de las distintas clases. + +## Explicación + +Un ejemplo real + +> Puede haber muchos tipos diferentes de vehículos en este mundo pero todos ellos se engloban bajo el único paraguas de Vehículo + +En palabras llanas + +> Mapea cada instancia de clase de un árbol de herencia en una única tabla. + +Wikipedia dice + +> La herencia de tabla única es una forma de emular la herencia orientada a objetos en una base de datos relacional. Al mapear desde una tabla de la base de datos a un objeto en un lenguaje orientado a objetos, un campo de la base de datos identifica a qué clase de la jerarquía pertenece el objeto. Todos los campos de todas las clases se almacenan en la misma tabla, de ahí el nombre de "herencia de tabla única". + +**Ejemplo programático** + +Baeldung - Herencia de Hibernate + +> Podemos definir la estrategia que queremos utilizar añadiendo la anotación @Inheritance a la superclase: + +```java +@Entity +@Inheritance(strategy = InheritanceType.SINGLE_TABLE) +public class MyProduct { + @Id + private long productId; + private String name; + + // constructor, getters, setters +} +``` + +El identificador de las entidades también se define en la superclase. + +A continuación, podemos añadir las entidades de la subclase: + +```java +@Entity +public class Book extends MyProduct { + private String author; +} +``` + +```java +@Entity +public class Pen extends MyProduct { + private String color; +} +``` +Valores del discriminador + +- Dado que los registros de todas las entidades estarán en la misma tabla, Hibernate necesita una forma de diferenciarlos. + +- Por defecto, esto se hace a través de una columna discriminadora llamada DTYPE que tiene como valor el nombre de la entidad. + +- Para personalizar la columna discriminadora, podemos utilizar la anotación @DiscriminatorColumn: + +```java +@Entity(name="products") +@Inheritance(strategy = InheritanceType.SINGLE_TABLE) +@DiscriminatorColumn(name="product_type", + discriminatorType = DiscriminatorType.INTEGER) +public class MyProduct { + // ... +} +``` +- Aquí hemos optado por diferenciar las entidades de la subclase MyProduct mediante una columna entera llamada product_type. + +- A continuación, tenemos que indicar a Hibernate qué valor tendrá cada registro de subclase para la columna product_type: + +```java +@Entity +@DiscriminatorValue("1") +public class Book extends MyProduct { + // ... +} +``` +```java +@Entity +@DiscriminatorValue("2") +public class Pen extends MyProduct { + // ... +} +``` + +- Hibernate añade otros dos valores predefinidos que puede tomar la anotación: null y not null: + + - @DiscriminatorValue("null") significa que cualquier fila sin valor discriminador se asignará a la clase de entidad con esta anotación; esto puede aplicarse a la clase raíz de la jerarquía. + - @DiscriminatorValue("not null"): cualquier fila con un valor discriminador que no coincida con ninguno de los asociados a las definiciones de entidad se asignará a la clase con esta anotación. + +## Diagrama de clases + +![alt text](./etc/single-table-inheritance.urm.png "Singleton pattern class diagram") + +## Aplicabilidad + +Utilice el patrón Singleton cuando + +## Use STI Cuando Las Subclases Tienen Los Mismos Campos/Columnas Pero Diferente Comportamiento +- Una buena indicación de que STI es correcto es cuando las diferentes subclases tienen los mismos campos/columnas pero diferentes métodos. En el ejemplo de cuentas anterior, esperamos que todas las columnas de la base de datos sean utilizadas por cada subclase. De lo contrario, habrá muchas columnas nulas en la base de datos. +

+* Utilizar STI cuando esperamos realizar consultas en todas las subclases + - Otra buena indicación de que STI es correcto es si esperamos realizar consultas a través de todas las clases. Por ejemplo, si queremos encontrar las 10 cuentas con los saldos más altos en todas las clases, STI nos permite utilizar sólo una consulta, mientras que MTI requerirá manipulación en memoria. + +### Tutoriales + +-
Cerebros de Java - Herencia de tabla única + +## Consecuencias + +* Los campos a veces son relevantes y a veces no, lo que puede confundir a la gente que usa las tablas directamente. +* Las columnas utilizadas sólo por algunas subclases hacen que se desperdicie espacio en la base de datos. + Hasta qué punto esto es realmente un problema depende de las características + específicas de los datos y de lo bien que la base de datos comprima las columnas vacías. + Oracle, por ejemplo, es muy eficiente en el recorte de espacio desperdiciado, particularmente columnas opcionales a la derecha de la tabla de la base de datos. + Cada base de datos tiene sus propios trucos para esto. +* La tabla única puede acabar siendo demasiado grande, con muchos índices y frecuentes, lo que puede perjudicar el rendimiento. Puede evitar esto teniendo + tablas de índices separadas que o bien enumeran claves de filas que tienen una determinada propiedad o que copien un subconjunto de campos relevantes para un índice. +* Sólo se dispone de un único espacio de nombres para los campos, por lo que hay que asegurarse de que + de no utilizar el mismo nombre para diferentes campos. Los nombres compuestos con el nombre de la clase como prefijo o sufijo. + +## Patrones relacionados + +* MappedSuperclass +* Single Table +* Joined Table +* Table per Class + +## Créditos + +* [Single Table Inheritance - martinFowler.com](https://www.martinfowler.com/eaaCatalog/singleTableInheritance.html) +* [Patterns of Enterprise Application Architecture](https://books.google.co.in/books?id=vqTfNFDzzdIC&pg=PA278&redir_esc=y#v=onepage&q&f=false) diff --git a/localization/es/single-table-inheritance/etc/single-table-inheritance.urm.png b/localization/es/single-table-inheritance/etc/single-table-inheritance.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..f3abe8df6fec30ee0c98cfd85216da47d751b885 GIT binary patch literal 141489 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

WGPJP%%!*h|2o1I$EhPL+=v9H{FdHu8VIWN_ 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 Q_=VDvvIpY!{eAI&00pKuXaE2J literal 0 HcmV?d00001 diff --git a/localization/es/strangler/README.md b/localization/es/strangler/README.md new file mode 100644 index 000000000000..8d02fb6bcd07 --- /dev/null +++ b/localization/es/strangler/README.md @@ -0,0 +1,28 @@ +--- +title: Strangler +category: Structural +language: es +tag: + - Extensibility + - Cloud distributed +--- + +## Propósito +Migrar de forma incremental un sistema heredado sustituyendo gradualmente piezas específicas de funcionalidad +con nuevas aplicaciones y servicios. A medida que se sustituyen las funciones del sistema heredado, el nuevo +sistema acaba cubriendo todas las funciones del sistema antiguo y puede tener sus propias funciones nuevas, con lo que +estrangulando el sistema antiguo y permitiéndole retirarlo del servicio. + +## Diagrama de clases +![alt text](./etc/strangler.png "Strangler") + +## Aplicabilidad +Este patrón estrangulador es una manera segura de eliminar gradualmente una cosa por algo mejor, más barato, o +más expandible. Especialmente cuando se quiere actualizar el sistema heredado con nuevas técnicas y se necesita +desarrollar continuamente nuevas características al mismo tiempo. Tenga en cuenta que este patrón requiere un esfuerzo adicional, +por lo que normalmente se utiliza cuando el sistema no es tan simple. + +## Créditos + +* [Strangler pattern](https://docs.microsoft.com/en-us/azure/architecture/patterns/strangler) +* [Legacy Application Strangulation : Case Studies](https://paulhammant.com/2013/07/14/legacy-application-strangulation-case-studies/) diff --git a/localization/es/strangler/etc/strangler.png b/localization/es/strangler/etc/strangler.png new file mode 100644 index 0000000000000000000000000000000000000000..c69305e5d510465a75b001096cdd7c8c15631ed5 GIT binary patch literal 77937 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

#F}1lmPB;v?LX5AgNsNa&jF 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 literal 0 HcmV?d00001 diff --git a/localization/es/table-module/README.md b/localization/es/table-module/README.md new file mode 100644 index 000000000000..79af28f2b359 --- /dev/null +++ b/localization/es/table-module/README.md @@ -0,0 +1,133 @@ +--- +title: Table Module +category: Structural +language: es +tag: + - Data access +--- + +## Propósito +El módulo de tablas organiza la lógica del dominio con una clase por tabla de la base de datos, y una única instancia de una clase contiene los distintos procedimientos que actuarán sobre los datos. + +## Explicación + +Ejemplo del mundo real + +> Cuando tratamos con un sistema de usuarios, necesitamos algunas operaciones sobre la tabla de usuarios. Podemos utilizar el patrón de módulo de tabla en este escenario. Podemos crear una clase llamada UserTableModule e inicializar una instancia de esa clase para manejar la lógica de negocio para todas las filas de la tabla de usuarios. + +En palabras simples + +> Una única instancia que maneja la lógica de negocio para todas las filas de una tabla o vista de la base de datos. + +**Ejemplo programático** + +En el ejemplo del sistema de usuarios, necesitamos manejar la lógica de dominio del login y registro de usuarios. Podemos utilizar el patrón de módulo de tabla y crear una instancia de la clase `UserTableModule` para manejar la lógica de negocio de todas las filas de la tabla de usuarios. + +Aquí está la entidad básica `User`. + +```java +@Setter +@Getter +@ToString +@EqualsAndHashCode +@AllArgsConstructor +public class User { + private int id; + private String username; + private String password; +} +``` + +Aquí está la clase `UserTableModule`. + +```java +public class UserTableModule { + private final DataSource dataSource; + private Connection connection = null; + private ResultSet resultSet = null; + private PreparedStatement preparedStatement = null; + + public UserTableModule(final DataSource userDataSource) { + this.dataSource = userDataSource; + } + + /** + * Login using username and password. + * + * @param username the username of a user + * @param password the password of a user + * @return the execution result of the method + * @throws SQLException if any error + */ + public int login(final String username, final String password) throws SQLException { + // Method implementation. + + } + + /** + * Register a new user. + * + * @param user a user instance + * @return the execution result of the method + * @throws SQLException if any error + */ + public int registerUser(final User user) throws SQLException { + // Method implementation. + } +} +``` + +En la clase `App`, usamos una instancia del `UserTableModule` para manejar el login y registro de usuarios. + +```java +// Create data source and create the user table. +final var dataSource = createDataSource(); +createSchema(dataSource); +userTableModule = new UserTableModule(dataSource); + +//Initialize two users. +var user1 = new User(1, "123456", "123456"); +var user2 = new User(2, "test", "password"); + +//Login and register using the instance of userTableModule. +userTableModule.registerUser(user1); +userTableModule.login(user1.getUsername(), user1.getPassword()); +userTableModule.login(user2.getUsername(), user2.getPassword()); +userTableModule.registerUser(user2); +userTableModule.login(user2.getUsername(), user2.getPassword()); + +deleteSchema(dataSource); +``` + +La salida del programa: + +```java +12:22:13.095 [main] INFO com.iluwatar.tablemodule.UserTableModule - Register successfully! +12:22:13.117 [main] INFO com.iluwatar.tablemodule.UserTableModule - Login successfully! +12:22:13.128 [main] INFO com.iluwatar.tablemodule.UserTableModule - Fail to login! +12:22:13.136 [main] INFO com.iluwatar.tablemodule.UserTableModule - Register successfully! +12:22:13.144 [main] INFO com.iluwatar.tablemodule.UserTableModule - Login successfully! +``` + +## Diagrama de clases + +![](./etc/table-module.urm.png "table module") + +## Aplicabilidad + +Utilice el patrón de módulo de tabla cuando + +- La lógica del dominio es simple y los datos están en forma tabular. +- La aplicación sólo utiliza unas pocas estructuras de datos comunes compartidas orientadas a tablas. + +## Patrones relacionados + +- [Transaction Script](https://java-design-patterns.com/patterns/transaction-script/) + +- [Domain Model](https://java-design-patterns.com/patterns/domain-model/) + +## Créditos + +* [Table Module Pattern](http://wiki3.cosc.canterbury.ac.nz/index.php/Table_module_pattern) +* [Patterns of Enterprise Application Architecture](https://www.amazon.com/gp/product/0321127420/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=0321127420&linkId=18acc13ba60d66690009505577c45c04) +* [Architecture patterns: domain model and friends](https://inviqa.com/blog/architecture-patterns-domain-model-and-friends) \ No newline at end of file diff --git a/localization/es/table-module/etc/table-module.urm.png b/localization/es/table-module/etc/table-module.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..9c4bc0b189dba5c86aeddf9235946135019added GIT binary patch literal 77337 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 literal 0 HcmV?d00001 diff --git a/localization/es/twin/README.md b/localization/es/twin/README.md new file mode 100644 index 000000000000..864f450e30c7 --- /dev/null +++ b/localization/es/twin/README.md @@ -0,0 +1,156 @@ +--- +title: Twin +category: Structural +language: es +tag: + - Extensibility +--- + +## Propósito +Twin pattern es un patrón de diseño que proporciona una solución estándar para simular herencia múltiple en java + +## Explicación + +Ejemplo real + +> Consideremos un juego con una pelota que necesita características de dos tipos, Game Item, e hilos para funcionar sin problemas en el juego. Podemos utilizar dos objetos, con un objeto compatible con el primer tipo y el otro compatible con el segundo tipo. El par de objetos juntos pueden funcionar como una pelota en el juego. + +En palabras llanas + +> Proporciona una forma de formar dos subclases estrechamente acopladas que pueden actuar como una clase gemela que tiene dos extremos. + +Wikipedia dice + +> En ingeniería de software, el patrón Gemelo es un patrón de diseño de software que permite a los desarrolladores modelar herencia múltiple en lenguajes de programación que no soportan herencia múltiple. Este patrón evita muchos de los problemas de la herencia múltiple. + +**Ejemplo programático** + +Tomemos nuestro ejemplo anterior de la bola de juego. Consideremos que tenemos un juego en el que la pelota necesita ser tanto un `GameItem` como un `Thread`. +En primer lugar, tenemos la clase `GameItem` dada a continuación y la clase `Thread`. + + +```java + +@Slf4j +public abstract class GameItem { + + public void draw() { + LOGGER.info("draw"); + doDraw(); + } + + public abstract void doDraw(); + + + public abstract void click(); +} + +``` + +A continuación, tenemos las subclases `BallItem` y `BallThread` que las heredan, respectivamente. + +```java + +@Slf4j +public class BallItem extends GameItem { + + private boolean isSuspended; + + @Setter + private BallThread twin; + + @Override + public void doDraw() { + + LOGGER.info("doDraw"); + } + + public void move() { + LOGGER.info("move"); + } + + @Override + public void click() { + + isSuspended = !isSuspended; + + if (isSuspended) { + twin.suspendMe(); + } else { + twin.resumeMe(); + } + } +} + + +@Slf4j +public class BallThread extends Thread { + + @Setter + private BallItem twin; + + private volatile boolean isSuspended; + + private volatile boolean isRunning = true; + + /** + * Run the thread. + */ + public void run() { + + while (isRunning) { + if (!isSuspended) { + twin.draw(); + twin.move(); + } + try { + Thread.sleep(250); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + } + + public void suspendMe() { + isSuspended = true; + LOGGER.info("Begin to suspend BallThread"); + } + + public void resumeMe() { + isSuspended = false; + LOGGER.info("Begin to resume BallThread"); + } + + public void stopMe() { + this.isRunning = false; + this.isSuspended = true; + } +} + +``` + +Ahora, cuando necesitemos la pelota, podemos instanciar objetos tanto del `BallThread` como del `BallItem` como un par y pasarlos a su objeto par para que puedan actuar juntos según convenga. + +```java + +var ballItem = new BallItem(); +var ballThread = new BallThread(); + +ballItem.setTwin(ballThread); +ballThread.setTwin(ballItem); + +``` + + +## Diagrama de clases +![alt text](./etc/twin.png "Twin") + +## Aplicabilidad +Utilice el lenguaje Twin + +* Para simular herencia múltiple en un lenguaje que no soporta esta característica. +* Para evitar ciertos problemas de la herencia múltiple como los choques de nombres. + +## Créditos + +* [Twin – A Design Pattern for Modeling Multiple Inheritance](http://www.ssw.uni-linz.ac.at/Research/Papers/Moe99/Paper.pdf) diff --git a/localization/es/twin/etc/twin.png b/localization/es/twin/etc/twin.png new file mode 100644 index 0000000000000000000000000000000000000000..724092525bd6a90f6da664b1038c2493228fb5e5 GIT binary patch literal 29682 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

{=^~r1=1stT~bBS&d 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 Date: Thu, 4 Apr 2024 12:26:16 -0500 Subject: [PATCH 044/580] translation: Translate Iterator pattern to Spanish (#2891) --- localization/es/iterator/README.md | 153 ++++++++++++++++++++ localization/es/iterator/etc/iterator_1.png | Bin 0 -> 53045 bytes 2 files changed, 153 insertions(+) create mode 100644 localization/es/iterator/README.md create mode 100644 localization/es/iterator/etc/iterator_1.png diff --git a/localization/es/iterator/README.md b/localization/es/iterator/README.md new file mode 100644 index 000000000000..cd98b17c788d --- /dev/null +++ b/localization/es/iterator/README.md @@ -0,0 +1,153 @@ +--- +title: Iterator +category: Behavioral +language: es +tag: + - Gang of Four +--- + +## También conocido como + +Cursor + +## Propósito +Proporcionar una forma de acceder a los elementos de un objeto agregado secuencialmente sin exponer su +representación subyacente. + +## Explicación + +Ejemplo del mundo real + +> El cofre del tesoro contiene un conjunto de objetos mágicos. Hay múltiples tipos de artículos tales como anillos, +> Los objetos pueden buscarse por tipo utilizando un iterador que proporciona +> el cofre del tesoro. + +En palabras sencillas + +> Los contenedores pueden proporcionar una interfaz de iterador agnóstica de representación +> para proporcionar acceso a los elementos. + +Wikipedia dice + +> En programación orientada a objetos, el patrón iterador es un patrón de diseño en el que +> se utiliza un iterador para recorrer un contenedor y acceder a sus elementos. + +**Ejemplo programático** + +La clase principal de nuestro ejemplo es `TreasureChest` que contiene ítems. + +```java +public class TreasureChest { + + private final List items; + + public TreasureChest() { + items = List.of( + new Item(ItemType.POTION, "Potion of courage"), + new Item(ItemType.RING, "Ring of shadows"), + new Item(ItemType.POTION, "Potion of wisdom"), + new Item(ItemType.POTION, "Potion of blood"), + new Item(ItemType.WEAPON, "Sword of silver +1"), + new Item(ItemType.POTION, "Potion of rust"), + new Item(ItemType.POTION, "Potion of healing"), + new Item(ItemType.RING, "Ring of armor"), + new Item(ItemType.WEAPON, "Steel halberd"), + new Item(ItemType.WEAPON, "Dagger of poison")); + } + + public Iterator iterator(ItemType itemType) { + return new TreasureChestItemIterator(this, itemType); + } + + public List getItems() { + return new ArrayList<>(items); + } +} +``` + +Esta es la clase `Item`: + +```java +public class Item { + + private ItemType type; + private final String name; + + public Item(ItemType type, String name) { + this.setType(type); + this.name = name; + } + + @Override + public String toString() { + return name; + } + + public ItemType getType() { + return type; + } + + public final void setType(ItemType type) { + this.type = type; + } +} + +public enum ItemType { + + ANY, WEAPON, RING, POTION + +} +``` + +La interfaz `Iterator` es extremadamente sencilla. + +```java +public interface Iterator { + + boolean hasNext(); + + T next(); +} +``` + +En el siguiente ejemplo, iteramos a través de los objetos de tipo anillo encontrados en el cofre. + +```java +var itemIterator = TREASURE_CHEST.iterator(ItemType.RING); +while (itemIterator.hasNext()) { + LOGGER.info(itemIterator.next().toString()); +} +``` + +Salida del programa: + +```java +Ring of shadows +Ring of armor +``` + +## Diagrama de clases + +![alt text](./etc/iterator_1.png "Iterator") + +## Aplicabilidad + +Utilizar el patrón Iterator + +* Para acceder al contenido de un objeto agregado sin exponer su representación interna. +* Para soportar múltiples recorridos de objetos agregados. +* Proporcionar una interfaz uniforme para recorrer diferentes estructuras de agregados. + +## Tutoriales + +* [How to Use Iterator?](http://www.tutorialspoint.com/java/java_using_iterator.htm) + +## Usos conocidos + +* [java.util.Iterator](http://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html) +* [java.util.Enumeration](http://docs.oracle.com/javase/8/docs/api/java/util/Enumeration.html) + +## Créditos + +* [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59) +* [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b) diff --git a/localization/es/iterator/etc/iterator_1.png b/localization/es/iterator/etc/iterator_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d8313bc5881f1d5554e0e1b6f395bc5319fbeb93 GIT binary patch literal 53045 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 F{y)Fqbt(V= literal 0 HcmV?d00001 From 423efcf84e79ff093d96c2c9a6e94c56440f8e71 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 4 Apr 2024 20:27:00 +0300 Subject: [PATCH 045/580] docs: add DavidMedinaO as a contributor for translation (#2892) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index e1142c794e4f..15bd40a1d813 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -3057,6 +3057,15 @@ "contributions": [ "code" ] + }, + { + "login": "DavidMedinaO", + "name": "David Medina Orozco", + "avatar_url": "https://avatars.githubusercontent.com/u/53974843?v=4", + "profile": "https://github.com/DavidMedinaO", + "contributions": [ + "translation" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 41044a559212..2f6020adc81f 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=iluwatar_java-design-patterns&metric=coverage)](https://sonarcloud.io/dashboard?id=iluwatar_java-design-patterns) [![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) -[![All Contributors](https://img.shields.io/badge/all_contributors-335-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-336-orange.svg?style=flat-square)](#contributors-)
@@ -505,6 +505,7 @@ This project is licensed under the terms of the MIT license.
Jun Kang
Jun Kang

💻 Kishalay Pandey
Kishalay Pandey

💻 drishtii7
drishtii7

💻 + David Medina Orozco
David Medina Orozco

🌠From 982526f2862741018880c39f719e518bcf761384 Mon Sep 17 00:00:00 2001 From: David Medina Orozco <53974843+DavidMedinaO@users.noreply.github.com> Date: Fri, 5 Apr 2024 15:12:59 -0500 Subject: [PATCH 046/580] translation: Translate to Spanish (#2893) * Translate Iterator pattern to Spanish * Translate to Spanish: Servant pattern Sharding pattern Spatial-partition pattern Special-case pattern specification pattern State pattern Strategy pattern Subclass-case pattern * Update language to es * Fixing Missing translation --- localization/es/servant/README.md | 235 +++++++++++ .../es/servant/etc/servant-pattern.png | Bin 0 -> 30103 bytes localization/es/sharding/README.md | 27 ++ localization/es/sharding/etc/sharding.urm.png | Bin 0 -> 63822 bytes localization/es/spatial-partition/README.md | 73 ++++ .../etc/spatial-partition.urm.png | Bin 0 -> 102875 bytes localization/es/special-case/README.md | 366 ++++++++++++++++++ .../es/special-case/etc/special_case_urm.png | Bin 0 -> 459244 bytes localization/es/specification/README.md | 213 ++++++++++ .../es/specification/etc/specification.png | Bin 0 -> 49425 bytes localization/es/state/README.md | 167 ++++++++ localization/es/state/etc/state_urm.png | Bin 0 -> 34673 bytes localization/es/strategy/README.md | 187 +++++++++ localization/es/strategy/etc/strategy_urm.png | Bin 0 -> 143387 bytes localization/es/subclass-sandbox/README.md | 112 ++++++ .../etc/subclass-sandbox.urm.png | Bin 0 -> 22259 bytes 16 files changed, 1380 insertions(+) create mode 100644 localization/es/servant/README.md create mode 100644 localization/es/servant/etc/servant-pattern.png create mode 100644 localization/es/sharding/README.md create mode 100644 localization/es/sharding/etc/sharding.urm.png create mode 100644 localization/es/spatial-partition/README.md create mode 100644 localization/es/spatial-partition/etc/spatial-partition.urm.png create mode 100644 localization/es/special-case/README.md create mode 100644 localization/es/special-case/etc/special_case_urm.png create mode 100644 localization/es/specification/README.md create mode 100644 localization/es/specification/etc/specification.png create mode 100644 localization/es/state/README.md create mode 100644 localization/es/state/etc/state_urm.png create mode 100644 localization/es/strategy/README.md create mode 100644 localization/es/strategy/etc/strategy_urm.png create mode 100644 localization/es/subclass-sandbox/README.md create mode 100644 localization/es/subclass-sandbox/etc/subclass-sandbox.urm.png diff --git a/localization/es/servant/README.md b/localization/es/servant/README.md new file mode 100644 index 000000000000..97b18456d98f --- /dev/null +++ b/localization/es/servant/README.md @@ -0,0 +1,235 @@ +--- +title: Servant +category: Behavioral +language: es +tag: +- Decoupling +--- + +## Propósito +Servant se utiliza para proporcionar algún comportamiento a un grupo de clases. +En lugar de definir ese comportamiento en cada clase - o cuando no podemos factorizar +este comportamiento en la clase padre común - se define una vez en el Servant. + +## Explicación + +Ejemplo del mundo real + +> El Rey, la Reina y otros miembros reales de palacio necesitan sirvientes que les den de comer, +> organizar bebidas, etc. + +En otras palabras + +> Garantiza que un objeto servidor preste determinados servicios a un grupo de clases atendidas. + +Wikipedia dice + +> En ingeniería de software, el patrón Servant define un objeto utilizado para ofrecer alguna funcionalidad +> a un grupo de clases sin definir esa funcionalidad en cada una de ellas. Un Servant es una clase +> cuya instancia (o incluso sólo clase) proporciona métodos que se encargan de un servicio deseado, mientras que +> los objetos para los que (o con los que) el Servant hace algo, se toman como parámetros. + +**Ejemplo programático** + +La clase Servant puede prestar servicios a otros miembros reales de palacio. + +```java +/** + * Servant. + */ +public class Servant { + + public String name; + + /** + * Constructor. + */ + public Servant(String name) { + this.name = name; + } + + public void feed(Royalty r) { + r.getFed(); + } + + public void giveWine(Royalty r) { + r.getDrink(); + } + + public void giveCompliments(Royalty r) { + r.receiveCompliments(); + } + + /** + * Check if we will be hanged. + */ + public boolean checkIfYouWillBeHanged(List tableGuests) { + return tableGuests.stream().allMatch(Royalty::getMood); + } +} +``` + +Royalty es una interfaz. Es implementada por las clases King, y Queen para obtener servicios de servant. + +```java +interface Royalty { + + void getFed(); + + void getDrink(); + + void changeMood(); + + void receiveCompliments(); + + boolean getMood(); +} +``` +La clase King implementa la interfaz Royalty. +```java +public class King implements Royalty { + + private boolean isDrunk; + private boolean isHungry = true; + private boolean isHappy; + private boolean complimentReceived; + + @Override + public void getFed() { + isHungry = false; + } + + @Override + public void getDrink() { + isDrunk = true; + } + + public void receiveCompliments() { + complimentReceived = true; + } + + @Override + public void changeMood() { + if (!isHungry && isDrunk) { + isHappy = true; + } + if (complimentReceived) { + isHappy = false; + } + } + + @Override + public boolean getMood() { + return isHappy; + } +} +``` +La clase Queen implementa la interfaz Royalty. +```java +public class Queen implements Royalty { + + private boolean isDrunk = true; + private boolean isHungry; + private boolean isHappy; + private boolean isFlirty = true; + private boolean complimentReceived; + + @Override + public void getFed() { + isHungry = false; + } + + @Override + public void getDrink() { + isDrunk = true; + } + + public void receiveCompliments() { + complimentReceived = true; + } + + @Override + public void changeMood() { + if (complimentReceived && isFlirty && isDrunk && !isHungry) { + isHappy = true; + } + } + + @Override + public boolean getMood() { + return isHappy; + } + + public void setFlirtiness(boolean f) { + this.isFlirty = f; + } + +} +``` + +Luego: + +```java +public class App { + + private static final Servant jenkins = new Servant("Jenkins"); + private static final Servant travis = new Servant("Travis"); + + /** + * Program entry point. + */ + public static void main(String[] args) { + scenario(jenkins, 1); + scenario(travis, 0); + } + + /** + * Can add a List with enum Actions for variable scenarios. + */ + public static void scenario(Servant servant, int compliment) { + var k = new King(); + var q = new Queen(); + + var guests = List.of(k, q); + + // feed + servant.feed(k); + servant.feed(q); + // serve drinks + servant.giveWine(k); + servant.giveWine(q); + // compliment + servant.giveCompliments(guests.get(compliment)); + + // outcome of the night + guests.forEach(Royalty::changeMood); + + // check your luck + if (servant.checkIfYouWillBeHanged(guests)) { + LOGGER.info("{} will live another day", servant.name); + } else { + LOGGER.info("Poor {}. His days are numbered", servant.name); + } + } +} +``` + +La salida de la consola + +``` +Jenkins will live another day +Poor Travis. His days are numbered +``` + + +## Diagrama de clases +![alt text](./etc/servant-pattern.png "Servant") + +## Aplicabilidad +Utiliza el patrón Servant cuando + +* Cuando queremos que algunos objetos realicen una acción común y no queremos definir esta acción como un método en cada clase. + +## Créditos + +* [Let's Modify the Objects-First Approach into Design-Patterns-First](http://edu.pecinovsky.cz/papers/2006_ITiCSE_Design_Patterns_First.pdf) diff --git a/localization/es/servant/etc/servant-pattern.png b/localization/es/servant/etc/servant-pattern.png new file mode 100644 index 0000000000000000000000000000000000000000..a8237775e332609268debd3c61870d25d0de3424 GIT binary patch literal 30103 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 Ze`JaFroT8T3jFGvyo`$U$Hy<<{y#X`r}O{- literal 0 HcmV?d00001 diff --git a/localization/es/sharding/README.md b/localization/es/sharding/README.md new file mode 100644 index 000000000000..36cfa424fd23 --- /dev/null +++ b/localization/es/sharding/README.md @@ -0,0 +1,27 @@ +--- +title: Sharding +category: Behavioral +language: es +tag: + - Performance + - Cloud distributed +--- + +## Propósito +El patrón sharding significa dividir el almacén de datos en particiones horizontales o shards. Cada fragmento tiene el mismo esquema, pero contiene su propio subconjunto de datos. +Un fragmento es un almacén de datos en sí mismo (puede contener los datos de muchas entidades de diferentes tipos), que se ejecuta en un servidor que actúa como nodo de almacenamiento. + +## Diagrama de clases +![alt text](./etc/sharding.urm.png "Sharding pattern class diagram") + +## Aplicabilidad +Este patrón ofrece las siguientes ventajas: + +- Se puede ampliar el sistema añadiendo más fragmentos que se ejecuten en nodos de almacenamiento adicionales. +- El sistema puede utilizar hardware comercial en lugar de ordenadores especializados (y caros) para cada nodo de almacenamiento. +- Se puede reducir la contención y mejorar el rendimiento equilibrando la carga de trabajo entre los shards. +- En la nube, los shards pueden ubicarse físicamente cerca de los usuarios que accederán a los datos. + +## Créditos + +* [Sharding pattern](https://docs.microsoft.com/en-us/azure/architecture/patterns/sharding) \ No newline at end of file diff --git a/localization/es/sharding/etc/sharding.urm.png b/localization/es/sharding/etc/sharding.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..e7f412af3f01d2d03350df8fdf7be3e3b9d84e59 GIT binary patch literal 63822 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

  • vSg5AihuIjt}=!jl?ou)nhYy?zMx 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 b=M!~ECT)q$cA8A literal 0 HcmV?d00001 diff --git a/localization/es/spatial-partition/README.md b/localization/es/spatial-partition/README.md new file mode 100644 index 000000000000..c88c9f2b2dfc --- /dev/null +++ b/localization/es/spatial-partition/README.md @@ -0,0 +1,73 @@ +--- +title: Spatial Partition +category: Behavioral +language: es +tag: + - Performance + - Game programming +--- + +## Propósito + +Como se explica en el libro [Game Programming Patterns](http://gameprogrammingpatterns.com/spatial-partition.html) +por Bob Nystrom, spatial partition pattern ayuda a localizar eficazmente los objetos almacenándolos en una +estructura de datos organizada por sus posiciones. + +## Explicación + +Digamos que usted está construyendo un juego de guerra con cientos, o incluso miles de jugadores, que se enfrentan en el campo de batalla. +La posición de cada jugador se actualiza en cada fotograma. La forma más sencilla de manejar +todas las interacciones que tienen lugar en el campo es comprobar la posición de cada jugador con la de todos los demás. +posición de cada jugador: + +```java +public void handleMeLee(Unit units[], int numUnits) { + for (var a = 0; a < numUnits - 1; a++) + { + for (var b = a + 1; b < numUnits; b++) + { + if (units[a].position() == units[b].position()) + { + handleAttack(units[a], units[b]); + } + } + } +} +``` + +Esto incluirá un montón de controles innecesarios entre jugadores que están demasiado alejados como para tener alguna +influencia entre ellos. Los bucles anidados dan a esta operación una complejidad O(n^2), que tiene que ser +cada fotograma, ya que muchos de los objetos del campo pueden moverse en cada fotograma. La idea +detrás del patrón de diseño de Partición Espacial es permitir una rápida localización de los objetos utilizando una estructura de datos que está organizada por sus posiciones. +que está organizada por sus posiciones, de modo que cuando se realiza una operación como la anterior, +no es necesario cotejar la posición de cada objeto con la de todos los demás. La estructura de datos +puede utilizarse para almacenar objetos en movimiento y estáticos, aunque para seguir la pista de los objetos en movimiento, +sus posiciones tendrán que restablecerse cada vez que se muevan. Esto significaría tener que crear una nueva +instancia de la estructura de datos cada vez que un objeto se mueva, lo que consumiría memoria adicional. La dirección +estructuras de datos comunes utilizadas para este patrón de diseño son: + +* Grid +* Ãrbol Quad +* Ãrbol K-d +* BSP +* Jerarquía de volúmenes límite + +En nuestra implementación, utilizamos la estructura de datos Quadtree que reducirá la complejidad temporal de +O(n^2) a O(nlogn), lo que reduce significativamente los cálculos necesarios en el caso de un gran número de objetos. +significativamente en el caso de un gran número de objetos. + +## Diagrama de clases + +![alt text](./etc/spatial-partition.urm.png "Spatial Partition pattern class diagram") + +## Aplicabilidad + +Utilice el patrón Spatial Partition cuando: + +* Cuando se necesita mantener un registro de un gran número de posiciones de objetos, que se actualizan cada fotograma. +* Cuando es aceptable cambiar memoria por velocidad, ya que la creación y actualización de la estructura de datos consumirá memoria extra. + +## Créditos + +* [Game Programming Patterns/Spatial Partition](http://gameprogrammingpatterns.com/spatial-partition.html) por Bob Nystrom +* [Quadtree tutorial](https://www.youtube.com/watch?v=OJxEcs0w_kE) por Daniel Schiffman diff --git a/localization/es/spatial-partition/etc/spatial-partition.urm.png b/localization/es/spatial-partition/etc/spatial-partition.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..5172bdb36a7972007be454aa0c7ea3a9d4d4a7f2 GIT binary patch literal 102875 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 C+J-v- literal 0 HcmV?d00001 diff --git a/localization/es/special-case/README.md b/localization/es/special-case/README.md new file mode 100644 index 000000000000..36d8277953c0 --- /dev/null +++ b/localization/es/special-case/README.md @@ -0,0 +1,366 @@ +--- +title: Special Case +category: Behavioral +language: es +tag: + - Extensibility +--- + +## Propósito + +Define algunos casos especiales, y los encapsula en subclases que proporcionan diferentes comportamientos especiales. + +## Explicación + +Ejemplo del mundo real + +> En un sistema de comercio electrónico, la capa de presentación espera que la capa de aplicación produzca cierto modelo de vista. +> Tenemos un escenario de éxito, en el que el modelo de vista de recibo contiene datos reales de la compra, +> y un par de escenarios de fracaso. + +En otras palabras + +> El patrón Special Case permite devolver objetos reales no nulos que realizan comportamientos especiales. + +En [Patterns of Enterprise Application Architecture](https://martinfowler.com/books/eaa.html) se dice +la diferencia con el Patrón de Objeto Nulo + +> Si me perdonas el juego de palabras irresistible, yo veo el Objeto Nulo como un caso especial de Caso Especial. + +**Ejemplo programático** + +Para centrarnos en el patrón en sí, implementamos la BD y el bloqueo de mantenimiento del sistema de comercio electrónico mediante la instancia singleton. + +```java +public class Db { + private static Db instance; + private Map userName2User; + private Map user2Account; + private Map itemName2Product; + + public static Db getInstance() { + if (instance == null) { + synchronized (Db.class) { + if (instance == null) { + instance = new Db(); + instance.userName2User = new HashMap<>(); + instance.user2Account = new HashMap<>(); + instance.itemName2Product = new HashMap<>(); + } + } + } + return instance; + } + + public void seedUser(String userName, Double amount) { + User user = new User(userName); + instance.userName2User.put(userName, user); + Account account = new Account(amount); + instance.user2Account.put(user, account); + } + + public void seedItem(String itemName, Double price) { + Product item = new Product(price); + itemName2Product.put(itemName, item); + } + + public User findUserByUserName(String userName) { + if (!userName2User.containsKey(userName)) { + return null; + } + return userName2User.get(userName); + } + + public Account findAccountByUser(User user) { + if (!user2Account.containsKey(user)) { + return null; + } + return user2Account.get(user); + } + + public Product findProductByItemName(String itemName) { + if (!itemName2Product.containsKey(itemName)) { + return null; + } + return itemName2Product.get(itemName); + } + + public class User { + private String userName; + + public User(String userName) { + this.userName = userName; + } + + public String getUserName() { + return userName; + } + + public ReceiptDto purchase(Product item) { + return new ReceiptDto(item.getPrice()); + } + } + + public class Account { + private Double amount; + + public Account(Double amount) { + this.amount = amount; + } + + public MoneyTransaction withdraw(Double price) { + if (price > amount) { + return null; + } + return new MoneyTransaction(amount, price); + } + + public Double getAmount() { + return amount; + } + } + + public class Product { + private Double price; + + public Product(Double price) { + this.price = price; + } + + public Double getPrice() { + return price; + } + } +} + +public class MaintenanceLock { + private static final Logger LOGGER = LoggerFactory.getLogger(MaintenanceLock.class); + + private static MaintenanceLock instance; + private boolean lock = true; + + public static MaintenanceLock getInstance() { + if (instance == null) { + synchronized (MaintenanceLock.class) { + if (instance == null) { + instance = new MaintenanceLock(); + } + } + } + return instance; + } + + public boolean isLock() { + return lock; + } + + public void setLock(boolean lock) { + this.lock = lock; + LOGGER.info("Maintenance lock is set to: " + lock); + } +} +``` + +Primero presentaremos la capa de presentación, la interfaz del modelo de vista de recibo y su implementación de un escenario exitoso. + +```java +public interface ReceiptViewModel { + void show(); +} + +public class ReceiptDto implements ReceiptViewModel { + + private static final Logger LOGGER = LoggerFactory.getLogger(ReceiptDto.class); + + private Double price; + + public ReceiptDto(Double price) { + this.price = price; + } + + public Double getPrice() { + return price; + } + + @Override + public void show() { + LOGGER.info("Receipt: " + price + " paid"); + } +} +``` + +Y aquí están las implementaciones de los escenarios de fracaso, que son los casos especiales. + +```java +public class DownForMaintenance implements ReceiptViewModel { + private static final Logger LOGGER = LoggerFactory.getLogger(DownForMaintenance.class); + + @Override + public void show() { + LOGGER.info("Down for maintenance"); + } +} + +public class InvalidUser implements ReceiptViewModel { + private static final Logger LOGGER = LoggerFactory.getLogger(InvalidUser.class); + + private final String userName; + + public InvalidUser(String userName) { + this.userName = userName; + } + + @Override + public void show() { + LOGGER.info("Invalid user: " + userName); + } +} + +public class OutOfStock implements ReceiptViewModel { + + private static final Logger LOGGER = LoggerFactory.getLogger(OutOfStock.class); + + private String userName; + private String itemName; + + public OutOfStock(String userName, String itemName) { + this.userName = userName; + this.itemName = itemName; + } + + @Override + public void show() { + LOGGER.info("Out of stock: " + itemName + " for user = " + userName + " to buy"); + } +} + +public class InsufficientFunds implements ReceiptViewModel { + private static final Logger LOGGER = LoggerFactory.getLogger(InsufficientFunds.class); + + private String userName; + private Double amount; + private String itemName; + + public InsufficientFunds(String userName, Double amount, String itemName) { + this.userName = userName; + this.amount = amount; + this.itemName = itemName; + } + + @Override + public void show() { + LOGGER.info("Insufficient funds: " + amount + " of user: " + userName + + " for buying item: " + itemName); + } +} +``` + +En segundo lugar, está la capa de aplicación, la implementación de los servicios de aplicación y la implementación de los servicios de dominio. + +```java +public class ApplicationServicesImpl implements ApplicationServices { + private DomainServicesImpl domain = new DomainServicesImpl(); + + @Override + public ReceiptViewModel loggedInUserPurchase(String userName, String itemName) { + if (isDownForMaintenance()) { + return new DownForMaintenance(); + } + return this.domain.purchase(userName, itemName); + } + + private boolean isDownForMaintenance() { + return MaintenanceLock.getInstance().isLock(); + } +} + +public class DomainServicesImpl implements DomainServices { + public ReceiptViewModel purchase(String userName, String itemName) { + Db.User user = Db.getInstance().findUserByUserName(userName); + if (user == null) { + return new InvalidUser(userName); + } + + Db.Account account = Db.getInstance().findAccountByUser(user); + return purchase(user, account, itemName); + } + + private ReceiptViewModel purchase(Db.User user, Db.Account account, String itemName) { + Db.Product item = Db.getInstance().findProductByItemName(itemName); + if (item == null) { + return new OutOfStock(user.getUserName(), itemName); + } + + ReceiptDto receipt = user.purchase(item); + MoneyTransaction transaction = account.withdraw(receipt.getPrice()); + if (transaction == null) { + return new InsufficientFunds(user.getUserName(), account.getAmount(), itemName); + } + + return receipt; + } +} +``` + +Por último, el cliente envía solicitudes a los servicios de la aplicación para obtener la vista de la presentación. + +```java + // DB seeding + LOGGER.info("Db seeding: " + "1 user: {\"ignite1771\", amount = 1000.0}, " + + "2 products: {\"computer\": price = 800.0, \"car\": price = 20000.0}"); + Db.getInstance().seedUser("ignite1771", 1000.0); + Db.getInstance().seedItem("computer", 800.0); + Db.getInstance().seedItem("car", 20000.0); + + var applicationServices = new ApplicationServicesImpl(); + ReceiptViewModel receipt; + + LOGGER.info("[REQUEST] User: " + "abc123" + " buy product: " + "tv"); + receipt = applicationServices.loggedInUserPurchase("abc123", "tv"); + receipt.show(); + MaintenanceLock.getInstance().setLock(false); + LOGGER.info("[REQUEST] User: " + "abc123" + " buy product: " + "tv"); + receipt = applicationServices.loggedInUserPurchase("abc123", "tv"); + receipt.show(); + LOGGER.info("[REQUEST] User: " + "ignite1771" + " buy product: " + "tv"); + receipt = applicationServices.loggedInUserPurchase("ignite1771", "tv"); + receipt.show(); + LOGGER.info("[REQUEST] User: " + "ignite1771" + " buy product: " + "car"); + receipt = applicationServices.loggedInUserPurchase("ignite1771", "car"); + receipt.show(); + LOGGER.info("[REQUEST] User: " + "ignite1771" + " buy product: " + "computer"); + receipt = applicationServices.loggedInUserPurchase("ignite1771", "computer"); + receipt.show(); +``` + +Salida del programa de cada solicitud: + +``` + Down for maintenance + Invalid user: abc123 + Out of stock: tv for user = ignite1771 to buy + Insufficient funds: 1000.0 of user: ignite1771 for buying item: car + Receipt: 800.0 paid +``` + +## Diagrama de clases + +![alt text](./etc/special_case_urm.png "Special Case") + +## Aplicabilidad + +Utilice el patrón Special Case cuando: + +* Tienes varios lugares en el sistema que tienen el mismo comportamiento después de una comprobación condicional + para una instancia de clase en particular, o el mismo comportamiento después de una comprobación nula. +* Devuelve un objeto real que realiza el comportamiento real, en lugar de un objeto nulo que no realiza nada. + +## Tutorial + +* [Special Case Tutorial](https://www.codinghelmet.com/articles/reduce-cyclomatic-complexity-special-case) + +## Créditos + +* [How to Reduce Cyclomatic Complexity Part 2: Special Case Pattern](https://www.codinghelmet.com/articles/reduce-cyclomatic-complexity-special-case) +* [Patterns of Enterprise Application Architecture](https://martinfowler.com/books/eaa.html) +* [Special Case](https://www.martinfowler.com/eaaCatalog/specialCase.html) \ No newline at end of file diff --git a/localization/es/special-case/etc/special_case_urm.png b/localization/es/special-case/etc/special_case_urm.png new file mode 100644 index 0000000000000000000000000000000000000000..03ca646f38161e276ac30adbf955d05d6ede106d GIT binary patch literal 459244 zcmd431ys~q`!6UIV2eO_-U0t(wv*Jb)3bWvY;Is^ha+WRX<+lr&Ora#bLVTuc6KiWIXGUJKeM#6 zw=iedv$D9tDL{>ba~8)$MZ@mb_c*7(W1JH5)wQgK`G`Hpz8&8?>mC}`{357~Dv;h- ziT}QmE7w(iSMt4k%B8X@*U$MEhZ*j#Ffb~mKH9zd^xj_@y^bBb9f^AhxXqGbH*2qb zWI1*AOhO+2=`UV-H!h~tUVAgkq^BJ4@3pdipuKhZ{-~E;0VT}Gn?6=Xt zhP$U=FJf^C!i-t_gDd-&yID;Vf@0V2%_qDQGY_4%iY6d>b1~HIlf#D38ik67(xWQ` zB%O?UmwYzfJ9@kA5M@*ZkDt4CIx|0wJ()&|sjZPo++c_C!gOEvW2lN5UAsU4?u{F! z=S#!_t=(NrzWI;OUZz)5IHP*N@lw?6luYeBJWYj0Cyw(;lh472BNjbNpGmz0;MsczPO>* zN{p{a+RkoUgbk@moy`#Jhziu{5G1tEp>fkGCSfP03P(`w5r5EAPuHJTlW~yxaufZ6 zOmIV0nxcUNm%xNzGt{Jr=bUPZnHlH#JBxo+R$jHM(DZ4&>}rn-BS=$JIbT_ps%);A zjhnLKXP6Rm85TjVJm4hZKNo~iwpcQWYj)fuQ!6c!$D?f$$Jv8iG5DzGD-1AH=Kuw9f1m?%7smvpA1G z2$tN8Ow#XV})Btz3Axk@3Y zpqq{oG@93FM&dp$L79iIACV{@MT$^J&P(^;BDZ)tE!iG+G2$47nfUOOYq-9u(RI3( zZZgiO_9mBQQF8{rUz;2++db#}8&7s27&<%>Q6gPhGEe-K>X`8>t_8=c@3x0N&*9dy zJcoe`MXgqJQ#={gyOJbGqDKwegT&@sovP6Yxd6i?Bn`5B}?c=KC_(-;U>D#ptln|@CZyY<5K3Tm?>KA(TZA0$C}7Oy#O zPahcIk$RpxJ~ab}KywTh2yt*;;yiwEU&TpxarBag%H~m%H7N;dmzGx}%dRQ@W`T+5w z01-UH`8na01ZNGjb7t)$W>y2gI|9c-ho2#^YZrX9Q^tI3iw{>8>Ul?Ulj3c z#V?<$Jb|ZLPx*g=d$R*gEMwJUl2U zC>o#ryZ{GBL3@$yAdBP_ad++ZSguIWlSD!L&Loiw1k`tJrXHD^n!32`#qt=j>s0A$ z|9ULWK>gUK5XhB#^s;ex9=lSS43}AGYmam!3Pps6gBxFL%yw;TY#@08<#x9Wj{fd{*pZ?tK>cbG)e31y@jjs|P zKYnCUF9-ymkdW~bBY9KP+beH=E$SXuVfkvB8gWrk(Ik7o+qawqXS~sCAw^5WZ)wOa)|pa_+|XVj~# z9WpdC;C}xtMa5Drme{G9QX=#5I`^kfzfCj*s26Bc5D`Vh#5Di!+?$$~1}Dl>%~iX1 zul|!aZZw+~DFsEP?Tp;N#Fm*uF!|ER`l!VrNo99&xZLW?+bbe28^-;4n!p-@KEH^? zGzF?AZIIheb*IZ59UTn`1k(ud-MV#)mDPM{2)?$q222L1hO^*rZQ$VezpM35&Jhee zW8lZ6D!S00uRPP8qslVLd2}87pj0TrV@SYZuG`?~U{@xJ^%5cB@!kRqm{50j_l}d~ zujiN>SbhJoyfYUFX#-nI>=*jSJ@(u0x(%kwL~kt)rnQfhTP0gpTqEPqJ=hwyG8kQ{ z+h-RN8s>EQR)31ZKO}@BN8XHuB(l?wh^fqCI76pm1W%fvoE2U>tLx#gs@lO=ioWIOXp~HA3pSP5G-y5atr*tYrVF%=oNta+O3C- zOtY~@xTqm;EwwvWS6?hqgH2MAlUEpbrB1g+OG!#H-nc<6;?f)G`^)5TUc~2mC%aL-Ouqh}h8r^f*T?Kh7f#fjDmCKpcSoW{pfY?Awfz z-EYbmB4e!Ec~M#3=lsTFu=o)8C!9c>9A0}iYXsRM4&PY#x zAAi(kA>VYjoqs%!t!BAu!LG;FVx&SbpWAxk!DnOOz6O;rm=y#PS2k6>Qb#51RH%Ix z9+ly;Id79SH#fJ}2b{<}CW9GTSK|?vZh@Y1bf0onsdliiX!-ux7atReL?Ru>-OD`= z_e||&8~jOtF&M{~j|FI395STHB?^`pwsYsD4;CB9_!7{xMzUnyY)hXVM|hf==2)B3 zs?&C&C%aeEVduPB(Gce^dqo46by=R-**rY64kx( z%RID56n03$bMOPt2-4Hj14~!s!5?$q*5S1UW<|oHcBi8v&#*m?iqHJ3#og!>HEKTd z7|WpJuv$7{rx%;^edwV5y}jj;%AP`5o|*Juj3U2j1HFV#*7UgNajj)g!WD*xSt)!L zL$kgf$A^yj%_d!`-jKU)J1=<07YnMFyAgrN21r*opY0Qr5i*9WYL39H0W;HCZaE4O zQ(pP*OUH-gUo==8D5{$Cq!e)}ebzA7lexdMLq0QIxl}fcl#K}pF`5bS7uS_I3~g*k zE3Sg(j(bxtpnBe`!*qwHXhmF_iNs&LC_I>IY;0T}EMXE6N!-4F?(hBAi*{T_d{Xv) zW&N!fpNem1Z!gCLZib@eGauMrK^*sMS&8gUMev&St9VO2c;HnR94vu57AEkTMID{9;4wrhL;wdK zNs+j~tCA^~Sm%5mkNiD)N@K*ZBN8?9>H;mNom{YKLx||!qxQV{SNfpyD?L=yw#_!HpKiLuvFX-m#1Fo||E9kF-tGdhMT1N~Kfmnk>>9$` zzl>_jT4RUgQXeV#g>~(U7vCGHtW<2{?wCB^`B0vh$GWs6*qJN_^Nel?W01-b7#tiN zt+H2^AQWD$PhNm(mOD+?a&mEUD)70kPqhFoK*gpeCovsDD+z-3^B{!p<-jb4%l7cm zZO++~ZoNSeMS?oF-Swe$DO%?TY#>dA#KAO641*|_Myt!qIJvkK*+z;D+SVqU`k=fr z(d?>Pp=P;sHq#{}`IbGaBI~USfqKuMD=8^G*VEf<&q}J33-=Jdxv}UnNTb%-+p;SQ%ko%Tfn}!KrG4jvWp5a znv$~2a1Qt*s@w77{3cQzgu$)$^{uU=)z5@v?AjH;gh0dxnxPf2@j7XeyJQ}clBxua zuY^JVHGLft5>jW#sZp%&7pDm~?F0TiFSWfgzOuBGf75)pOcsA`A?h;8?JtduIVqiD z$J+SLI+}Ct`%C4fyYAbgnNdO$A9|TzVC7V5((_Pjd1fZlzucrJ!vwc4vp@T26NnTT z_&Y}aF{iYlw+zh8%tP}NDZaGbgq2Dx=(ZL~%k7-ooCH%{h}{$n z*|~Wm(X}r`jo%Xz8iS~EFYWQ~_M+IVYB!@mumRi1qW@gYODp8?1b-BuiMeH4>!XYP=o?&>unsl@CP8tF@4pQprqbi*whcSB&E~K^B$#^S`_c!WYF#wzm&XvtAK)TVQ*%yF-b(@q zPeaye362WP#|yeUx^zVIPoEs#WcfPwDdAn`}b@akv#vc{>(9 z0q|qrSC9~I$jBw!O{smPDCY^_$53c_`8IgQ?KB3d;NGYQ4<5{xGk};QVv9zC05&fs zE^iG}D=n3sK{bU*_!9IL=xCMqX>Tr|lDQ3}fyr7s+;@E}FORZlWDyh;l-dqg_`b3- zes5;T45lhk>$2I+H?cP2f>yTQw=x}WukjxJeV?C{+m1Ap%{ z1>GSbQ6&N4;f}?SifqgslW=PdDKXoFoi(gt>)iKqE&=$Y&?W*`Lw0o3q2tUpBydSt zzaCWqM^EBOnf7aTdJ-=DIE(eHimZr_yPDK_hx*hA`4_R1G6ysB}v3}gAh-$ z0O?P{f)|mvGJUX%sls=%7$~HlX_ZPOnolqIp(Mei>oq=6!L9Qiws~%3>xqVjPIE8n zR3rvrP_Yw8Zz9a|ySj>s>Qn0GG|x??I@o=c4IYep$QPp|=ZCVhC|ELNIUAmeO%c7b zU=yV*-)3eU=X;qcYQOtXm8OWg?=6m2tM6Btp$hic4mNt^RdZCjd_W9kLRqX$G;nco z?a5D;Kv=4Zu)2=QWBvzgBtz*$7wKeFAc9EcB0E2$`YIY*H>oecep6(LG;8x8hiLAd0up`7c@ zRtAYzg$V1L3SlUJAWC(P+#!Hc%f3F&R{k~%szTVq%@xJis3?aXS^jK#+kB_R0j_+_ zEAv4t0GFf$fq1QuuZ8e%ht-rVMngTitiA*IqGY=v8yG=p^4SO9bT-L#xr@+b1iRaa z$!~Ep3qky23i07)sdP4V(T-!zQb7P!C}>saw_Jr6n)cw`R?Ux?0XYj|Mo*^v{{DWh!1jnO7N-YBtdkqc z#d1rE33?nj@!HKKIvN@nWT#w*kqFt%zV}J;*fX(6iBQU{?^4%wmJ9*_O~vd9Vt=_> zXt_dyZMzkwMr_ltVf#Q@+Mn+O2MurW8jD&-i%D-*7$r#7xsan4rsS+?EM^5^SEt$` zn_f%|QCfQE&^TCY*v`YyzkmM@^*pp!QVJJl-ThPU_-h||LlqTCUIRb}5DKr9w(Alcyh$6pGMrH+Lq2(| zNKdLSY<3(|qFrgTQiJIr6gyZw+#V01Oxm0*QeXkQd2=)9ZW0I+Vq>jQJA78^^g?bywG?m5olU{{0=!Dt*}OW0?@>F5+@gu z+bS0?Ufi**c9!D9^>~yvq|IOUM?a2eVA#AADo-=b zXTCo_J~1($u8&oxs?=d=$P|(;9XaN)zl2N1ZVo6J>B!rryFx29X=*L4t&}{5fk>4! z-6}{|kOire`+6;Uoh?@#mINu-+20SL5$Yc?q}VD3-gFp1T)RFt)-zILS_h12d9->) zt5V1FaI;wGvl}P{J36bHVb6liqzvp4pthz2Fe|JpP0Gxy#TmGc*xkDtb@}Vcg#b_d zlm1Cnz4u-HQ4Sk`T1>pW_U&=JLqgYqHL}vve^g|%2BZ|I(Jjybbzu&@_}YP)huI9a zL@;eifJdoHG=me8yc@vZO>j3|xjbJaVieoGami9sQ>W}+zj?E{ zayLh<*OT;plJ;d@spFLJ34lUPXA#GTFpozo0BsI6Xcs+i$X3qmwGrqI4gE{A&g0PK z&?ZP5`S$Ha3cxtjRept+wx5Q{*P*m+SHFFXi6O5v9(wa^e{0F6YlDc`b}cF~vDSV; zP1Ee->vNAEKW-#>0&veEDB_KUt`c~h#|#-sK8-nvY{ml0mReEHHPzqfDS z1_a2+$)Qi=Y6u|ya+2dyYbmO2%y(`lJu+W=05%5#GcZ*;)n@2-8X;InTuskYtNUQGeFsS zBBS#aVR^-~Ps;-X@x;W$oRijm7ER87r2C&H7a&Q}|5L#LA zk&%&+m+x$DzH5tqVrYm4aVd~R!{`U?`uiyZvT&PAmo5Q|1*H&31K3+-WZFQfh(z8g zz-|PPy1%b}%HP*2DJj{|*l0OkCjtMVweWe~gY;0&?ym>R@!-o%)7AlaM3t{}RXJ zIvV)<+j}0M5#hwGnxJpwDRZ$4-1+klFB!ppg(=|I>4U|8iJ|@~_6dQIu)m~I)c&^B zrAh>di=XdVNSlh=E-fz%it z5uvQ4G$nQn><<`JY;5d*yF9B6ur1|Q<4K@}k&xgv)f`q@TFPV8LGJmhCVr>-d)cWT zf>BUl9`wh%Aprpq<2c|w)6p-n9!~go`{HG>KUPv{YOI`0+g5k0439cb@pw9|)Q;*g zH7BpbS;MB$EngzQlSp-dsgVNf1PcUR1n_>a?xZBkgOtB}2?}b!N>}xJ{daF-zMv0n zMF%%RKBn{yXUXUX2ewkjGGp4Q=+i~!sc4)AU!TJj7Z?BZ`7>A!h~rF5OquEF6#ub@ zRC#Wn~2p%g4tD!U49cCGj_X`93dI?d-RfED}{Ynt{UXh4;rgeMHl?r9dT2V_qtWjgX+mD4_ zSZiP@fj>vD4fF+7p&k4kw>7F5dk1hyMYY5Y+MHpUi>=iuQQiN(B@O<(zd$x|Z^pqN zKe;enxwn{6rHsQh%)Ny+sOg@x8}PB8lG6ZNs*i|lhgf&^GFKYul;{ljoNHwNdSCS7 zQN^+6dHaQNOqeAN?ZW7E^5^})gguw1i`Owv-1YZ|W>{Nk+kNj#JN^4%A0cbKukh(3 zA?$0Gw1T!(l^5@9y}rca8|XfWC_uQd_pv}z4&Kl}I>u`TYEu0dCASz|-yOyg`n;R^ zvyTU(B4sNMsUYDAo|?qLdDjBr+G_b|Q%4^{$f^F)=d6XMO_PXYj*+62VL_apt~%Xd z^rGUHnJBqZ`0r#`f7O0`pl;X?r0MyyfoE_OwoDtw5jvG$s&~U%**>Qx)_zeac5)ra z_pFu`@fK8knty9QT%^^*UCGzL8=x%#^}I0i7aKv%=81asqL zb>wt1{h=;hR+3mEOQG7kW?BP8u_K0_E;Lgn1@*Szt5r*4^EHiLajrXj7JY$8qqoO=|xB>aw4tVWc49;ua>9wydj>7F{C zn^Vj+?ls3&edd@aEv1q@WLAVc9Q;zhpYM!mKQ({R-QAslPS-3+;xf?*VY!x_6jrec zi=oa?WuDsb2*g?^6ue>v(~Pr;%&x4KRL0!N4LfWdn~)`*;xwr4uL{t(KUEA&!si)1^JuQJKjey`0K@UVs?F1o7(%IW7zBZ^QP! z`=-A+Z;y%s*EN4aZZDp&$m)=JNf2@vA`>CjD;Iif%o=8(T;=XQb}m&V;MIMmDmSRZ4@|Bqi)i+G@Fp2_^$o*KEIMc1Cv{ z@Bejwdg~^Bdr#iO9}y;$fr~DQrP9vC=*{`fDJRgXVZ&tUAMR-mo$5^74=(%iSaxS3 zK*YcqxakINe#bxMkN7Qr#p250Zy@X(Jg}WHdUU8|sUV*e=XfSFF7vT&;?~~l3P$ua zx)~%78$9$GTP`zH$41q9!&@JHgQaelCUiTMnT(3;&PGoN)@TiZdQ=Ov6{9-i`R^mn z<^IDM?gVJCLdFFZNJ)L%TepJ7^>0EBVi!JrqUnMU_=~IYSy_44C=TYxM8wd!x%u*6%%Rl z*;gz+Klc*96@k;v_kE6J|7aMj^V`SK&V)fzjnRLqy;nr_U#W)Cx)U!l0)GkPU$n(D z9qA~QGb2Bv{VOx>hH3)}M$7Za*G@*(`J%Cum_7PKV5h} zSFhK(#(yo`UGL<=2Xjdni{uHSF!;`HFDs9EZs?=d9gdwIhy(~K{X!t^7xWzS`n}X< zTpdm(EUJGbEd3t|>#HDhSxoz7mVzwu?euOi-KIo-jsCHHW>CcZeS_9DUYk`tH= zgw3Qp^M3z9&FVUjJVb)M@n@ze%S*hdSCSEIDaG!C0gEzQ#=_^7CjNa>Ah>DVkTxW! zBF)UQ#7SOWE3N_DVK7(+Frgx;f~EO|QGau$8!H%MgEl+=biqH#6d?O= zEv-)ZF^SujSpW`8e@Y@JC#@YAA+93VR4;pPAzjwunjE$DC;R=t^J!{G+5Q5No(vx~ zQ)U$X2kG3eqA)KDZGB7p#0Tg$NO6Jr{W1ov2n)(>acQkT>i>b%6fud%N_mJv&?VdwSF-2-R_Wo@wvfZ=gALueEzvT3i!_=Zh0<+-lGzx z-FwwRc7K}9m1AK`T;n+GPZifk9m`?XQiaA3@22{b=fF<>QBsZ^dZ+Ua<@~dx{Fi{T zNN|xYhg87@vB$RcNV+jstL=eH>zQtBGWwOy+-o2HLpnFUDE`N$uTI?hkH=oJCjO6= zdELGI2b*FuGPkLuIJNh`h48;eB4qdziN8(zy}lRcuuOrWrNTvepZ}dN!R?p}ZC8{U z|7Dc_m9O~y(4Tc*n%e(0lK4TV{A+ppZDtK*(8a-WE0j((X{;|^3vy&@E;DVYtQMx0 zKfj*f(5I?O>sHwEj`_2E(ujFdp3Tw0R;L&pfUmhOn+5$zc(Cf_xSO(;3**Oh$?jWf z&(LO4mK|SHYN^}jP_TsybTw60&Hh>)X2p@idA7T8ee(IQ{G>FO!_MkZF06pLXQuEQDYzMrdvb$KDEc6DTQxDCPio@CNF&o%N6jkC^NBzu~PFbQefQN%PbS= z{^A_l4WQH!IL~JD+N!1tVKrU=N{eKX{iVq!J)~_h#&oE#kkE%27xT-{H+#ifR&@w}=+5aI;OSp{P@zFf=(@cb>6lsvaqEyMX$0OGJFKTXEtR z-RXSK&DMRK=IORfD#N6^McD>zBP?@~+kE-!Mu~#(3j~Wdp?0&YFI{<#cNn(5`>vo2 z)pDk0BDaI#VPPekww4ts1+36=%Z#npid@gXl{tyS)qLFBA17k`YW9+_f{#cdiqq zbKigrmuPXbXI|{;n02s;jLk1Gti^)5$J*NOJu+NM25ViTTc9B{ z!#n+2XWZOv;~zx#$oI z9*wASOZO1SRSE&ED3t>3wP=YQpi(tjWOUQ~c zhCi=$Q9nMwm>!=0U#}Tnj%R!M3D!OwYvS~cb7P7d)u%j zfn0%ZZEjz9hAfq{&Y;d*iBV^9oqP4XSU}g`w&1*6*`e1|_r5mXY_hRDNrcKOX-@aD z@cE^79fK90X~1_J9NcbJQ0b+%cwFtU+j%G2Tg|9H&pEQrIbWx`iq&ns#lbXAjfM2t zFhu2qYoQEI(m8;)+?wyZf3wtTd<3{vW+xGMrfP0=-_@lv=Y~rwQNo&6X+%&gD{vRf z&Y!NeR6-)3FrWe(>sv=X`<%qpX~%JnRszgP8hq-_{@gBst!PprS;YD~6Sy1h_Gptr z5(l#s-;`Ob@Bl)8E-mAC?`9QGH+t{{|06Ate^;;3I935}I<1^p79&-H(RIq)R02T< z%9g-wP{Eq5QS`|QAsMgEg#yUjsQSf}X|NiLv>NP4Wf;sC@gO5cAH8Z?olPTb^(r5y zHP-N0o9F-yo|dmDsAo3Y+yIwjM%_}+b9P*vf_f>khSq zl2S}UHLKh4VHmJ8{g$!XHd^dKt^)xlJ20)h4fJ_n!Qf?O-%kuzfa4+TL=76IvZYyI3fGgaY z%Opwm5NsVs_^?`aO%(KGPU2~a+8XAvqLOgHv|iWdf)R~K)%SzlrQ)is+kz6Z#`bj) z4C=7>J1GBfFniXTQA3S5Qfd=g!NUfkT?V{OYa6`zd3>6oHkOq$1gQM@-33^f*g@gO zCdwB2Ndp*~h-=hbIiDf&>Cy%mr}G%KM>Ugysm0hkbBwzaYfZ3Q_jQt)XKvvh9^4M3 z+D@hJ1|wc_k2JW=`s1;#-~QXPzEPA?W&U7A!d>C1EZ|H7+HAg8j0%oR=1{Zt@c1%G zD;4@32Xr|-+9gq-q_4)HWw2z8K}uA;==m}(8mW)+j$N5*ogD`!eTLEYVaT!(tC{x%?yMTYQDnEv#~_{y{kv#j~4f+Sy% z*3WRZx2@Yn=g!Vn?xMe@zqh^Ez*3+c;XJ@FzX!QobD27&Ptk_}cC$J|8?q|nGs%Ux= zrlzMA++xQykdEg7-`spcUS&Co#LSe(mq%HZlHIJ^8p5FIQAS5=Qi~G}%K9r;cMFzA zDj&IStFT#Hzp|<4ZmOAp{<}(2Gm})xu$k-bs9vtpIl{e4y7kJrw>CEYKkFDj>3j7% ztE=+8xD+6?^&*bNro`y@N9{&|f|lD^`+n>AXKQmSy4Sy}%ND-<`3B={EZ4g=9sr2N z{w&4zrY5br0tmbtxZr4#X3Uo_Zk8Ua#72KmflcK*Fp}`i?Hn7!E>#qS6gvzWXLlkq zSq-c7qWZx|n)og>&SLX&z zg!x_5=Fm(ek-6;tRy&A{Nl~O}Q3+y*TI)$ItIFv;+nI@W%wx?z;UBb8EKgYN%WC-Z zr=OxpnC#YQP}z-Bo_7*A4;W6pp^NG1^pxfYZEAzw8tGRi{dq;g%5Y=r=mX7Kmp%~k zk+$ZoIjYIca!m5Hh8lH1I>iTv+fs4r^ak{Q@4O^%f=imh-Uv&iiBBbV!$!t zm})dv-M5L>Y!|?1&IJfh{=TR^QD7nw0lY9T+5a7s? zp{>pMe(6&58P$|5`OF%_qTP{KXp+P!5c6Alda<391$G@s8!BIGTrcTn<#(Sd?kbnf z%%NPWNJ`!ui(%5KMkLfj6P(F#?-U6_?uQFwo=9mj3c3_HzjZp%GfuU9aFU43L-~)> zX)Op9C~rDe&qFh_LRb+l(vGnVJngwN@j$4iy;)!c(H7Ld2lj)-BjvQ4TU%q*jg-00=iP=C=0j<6A6zTUX5$EfQ4Ty6y?i zqZ~kW1w4;#P`FR{`64C0Os07V0`b>h!6edP7xI_5KU*VI{?z-k3jeebm;AfC@pE;P zg7AHt&`Mbq=NnH8!At|X4^4DHxsGYRjW z$S#n~Mui^;i_T}h0h}6j(O$q=?4B>udlP~)y5UdYHYeac&Vu6^on7+=$co6^o)HTH z-BF(KebDqMy8p&yZ)XqP??0cYs7f8_eYk%t5w*R5>YGQtI#b;OWs-Gi;gprp7`VVa zRJAFBrk_{?k?7@V%|pr8KX>>Eun+ehXZ(}z&~iL;EQ)a+w@w`L5coR6EUjM|$d?>{ zEJZ?Tvt{lE>c!gH+TpU=&QNfuMk1*K)Pw{yRjEmKDx?kz{c=$ulzpgqWJ`o^3sfrD zt%Fk*oVBc-wx15T_IMCGRYcqz1ikS?#}}FPfzsdU|1+9Z*z>=@e4Hj}bnK6lJTxPn zHp^GeyPMJ$CDGQ-5=TUQ=W$XZt;dcB=4++x+R+iOzTHR#*=8F}q&GfgFQ#f;R#_*3 z0+gXgdtZnMDKbp3=EyAwY7(rHLCU)KYGmh^0K^|2lDcdZ_xARJi6d~%8XRs0b4U7y zhPq&Ca;J?2hZwi7^<;T7QcJbd&>;XR(Ks9}kTnuHepLT-SGlfVu%X_Iqdj*jp3h=A z(kQbbAT!4I2Ec_(X<$*+b|#sStVnNQbf`}4YKIKgjcu6qmU&Gd7>XJO=>q}+eqNr= zUMz&xB`dqU+!5Pp`MuixU#tD};E*)#g(f(iW@BRmrtuGiMA+Ea7#J9MczXV)#a_1N ze*q%uP<6_DkNGkV88q|OAcz;>m_?sD3W*#sq>a1*+MDvwh5mLGTzK(U6l!LzNec$q zYyo|pI*%1O<)Oxx0cR7B)8PVCWT`LheWq&^wqW!SVMtonAaK1maysRk5$}g{&GK z9N-K+dIxJKN|+iyK8hCRt^I)*BLV9eE&z)9`)pmUpJI8&E0)TrdNJ{!gB>F3(q34w zz(YuTR^#nr@V`F3S{1?chBDk@WZMPKYe=jcxEHC=!^q3rWddxEiOlh?t z`gypy0}(Z+?-eO*r=DaZJ?BR2p`JkpyEA>6@=dY6Dsl+}H*7&x$&JdAe*#2U=CFhu zEE(6Wc(GojN7cSiC92GAKmP)BTtS_a%?L=e8YM==sWVA;*85pM^TK$Bf_!3IhpAd5#H=oVAzXQSXh{wn;VR0f`Lv(Mn(~l z(Vw~oTT9C89mQ8MNO5jniVX(_G+G7E)hgdgk*Fj=1B@Pbr!pU$uj$Z|pBVh%`H@vv z&kIKq#cy}+>i3A9_f@k>^YCvEQv_MYpw5{AD6ttzz6s5(Z^O=E{+QfkKZbw<8Lq(O zz@g@~Xmy-hq(JGyn%UJvkaY)MM37W$Zv6bz@(yc1J@)tnVxvMnq z5q9kZ5)FFl@l^zS4`WT4benxJDH9RnW~(Vqt(x3tfugmjfY+*mmcF z(97_^AM<1Oj%OsqGtQk2blkY&x7>c?#`r3X7+BYjy%opg>9}Ud;%5(VZ)d`7+Cpcb zmxe2vwXX~MA*12g@i%j+vYW$qmc6mcZCoXEz+nVam^ku{qxS$R_e{sR_XiIca*{|Oa9NYCM~bg2Y*5+;k>_haQ*(H z#~pJLin&xGVfzx05}jG(96IA`P_u)+S+VS3vH5t7GDtEX$UlheH?}V*Tsj&g2m@j z*|#qduPhhY$z&CgvAUIcwMIox)fpDCtoTTSm+yQ&`Enh=dOp>kGRN2uHUm!AafM*C zoI{uw{_Zdt%?26idw*Yqtu4y^mJIkE0u8pX1Q9A&`xEKQxVZcEHQuK`|JnDG|HYsl z5ZM65(MN*!H?U<}i|~=TNwq4BvmF`Tu?{5W9A=A8S`G*IIIQDE>9@CO(co;?6n|pkv$A zP{ZNbib7xVbjGsT!lxP=Jq&1V7+ts7!6_7JgojSMM7m&hwjxMH5iGVdiTof%Z@2Sb zu$%8q1<^?@f0<9dEKXe4mW;u54U_v+m))d$ijPAl|5hv@?7+xczi1Wh4;#5X#c|au z^m=FZ87lGHaP5gvVeGKx730NoL}~;S`^8{N&3^nI%*}h9(7{;16Z0J7f4i9M*GwU> zy)PL*tS5FaXsFJJ>38qx%V<5DZxnyLP`#rz6QGz``Q?vriO9&vX+*X|#71_%M1$xC zjyV*7&J&=#R~CF?rhhG77LKl?pS?%eA%{L zCnO!R)}5ZXo)3Pm!Hm_NWmo+&03l1*P{_v!TEOcJ6ze-Uw&#o=eT`yt9I?%;()-qo zRJBDe%rpELWNg16fmH+XPc$9u9E$p!eXoU^FZ?x{60&W;|d?*nD&~^R%4JvuDbkkf4;%to~l`I7MR$=UAy$Q#+_>& zEo(YC?m7M*82jPgpv(g2LSJq;gD(Y@U+q+0E-~!(MzfzY7W3x0nk?-1{7vR(>LL{?`NZ`E;lU!;Z8i7(Aws$__x3nu#9>)9y7akh zdY`AxMl?a|06Dk)_La{rXe8}c+Rg%pp4-6%ujKfbf%*`ulUE<7QjKJ_jxp&o1Sva}f|Y zxG_B>X4n3X;ea(f-|wC|C<5nAsN(ox3?^EtA0B=5Ji0X9 zSD=fZ@^rLH^+Ucv8I&%W(V*3>1@N#a-)O)EK5Yq?WR4L-7?c>ovzQ@kWfoM~-Ih;o zTNw3bB@rVdn8++b<9J!R14P}2S{oSzZS)Btrt`h8o?o%uvt!D6YMG>mK@UD>c3vE~ z$!E?izXx%I^ku3H+b|4nBdo=7?HE|2f%5y*P^*igOKp(LzwL4`x zWdP|Evn!9;jhMF|LMViZcWY|SFXp~i-S?njVoek_nBM4kQx$ozH_ECWUwVD>(V^1H zo%7aDhg>(Z;+Su}xmn=gVE_8Hnx70s=H7?*V>Ny>!W9@_s&6zvgKsw@)spSG-T@+) zi0ZQyVu?hi>dw9XF5IG9$}y%1`?NNbCsCI+WcT~fr=svX)r5BD}U7kvFmN;1BIU(VPq zE-}RS3&2cRH3ct8kWk*qx>?4NQE^+Xw5Y6XsH}bS`{zl1OX}NNWjD^vv{SX@S`1Ez zhuwc8_*hHNbQ~5W>j#AG<6SA{dBlR44^zuD?XyuCN|R#oFZniB8*rJpIdhNG*#U!o z27Wl{V3*Cri*ZR1w4&2;gir!Uax;hOJWt_<(! zS>8nWWV)ca?NT|O8Bd8xgJeLXlH0nzl=T((PvzVwA-Z%i#pbBe8vl^oopLj3=HRUF z6S_w9tAtMtmtpv0*YYQ6sJ?L)2KZ(BshKp`e(dGgl+*j`LPo7{{y>U^vO_suu^EaK z{Hzf#o$2w>(g*nq{E*GZ_hnPTuu=9+?l-X7qUHEVw94mcY!6h<`K*F{EPJZ z6EA6So+1kc-dr}3#JN{?qr~XUs2+c8Wm$G@m*SIKHdIy=PwcZYDk^Tt+y!U#Z*p-Z zT%fv>l_6ctr|5#}Idw)br@Q@9qTqD4boE;W%HDSq#bssTv=Jo|+ee4PYt1`r?#!U$ z@Ry01schzWj%u5q0=Xr1eqL+!XDRN zdn^6Q6;8EwLLYC8| zx2<0qb-E~fpFX$#_)VOWw(Az_J2gF2(dPW7NXW*5(f`BRTgOG&wNaxOU?5@;3IYO( z($Y!_NO!{^Aw8ssbg3XJh;*04(A|xIlynOSDBaz8u0fyYjqiEScm6o@H$P_XeeZq6 zTI*U{#;?w+K|C#mEy|_NkRh?W-G`IY#cMVum`Om(=X? zCz5qfLRVYO6ah@)ffzo3aKTflT=AV*=3($NGXr)oiOBaHvz}8V_&XvqbNRixLZi1f z^!=4UVG6RYHd?1mW^PIrmwkI&(Lz-rJy`8zfgV#{eV2rqO~6;^@;Ba`S3$|c-XCu` zjxaW0(bXND%+zZSI&Kj{Tot%~{oDcuhOS5JO+`@{Zp*zJ#zUOk+UvQ=j?=Qx>)C~; z_-#LbEK!OD#b1D|+p*(Q>3^nC%34&Ap^+r5ALOwS9XjT}S!|cXT?g_O6Hhwzt@wN* zm3J;BQsF(a&UWiEiGveiFmC5Kl2BrQnP}uKcBKv)1+u(jro_UcFo$~bfx>p_*0>O` zaJ`vPgYr!Napn<*#?3Rn%9k#v39iod(!T%C-GaY18$_AHSI>xee}OLy+lEfgxzQb^ z@YR@8w4(cl(VejsnB>pb5g)wsqleYH59}eZ)jEgEoRQOk?-mbw6wNt}F#tcSg6 zH;_?PN1To3=?=@9J6?qM2G)zv|PMHFr!wf-D(Yl&965to_y{5 zaNQNe{Y3N0!rq=%Q`p~wp#z_F>;)V7E^0LrWL3UR?K|6~0+WH277~p#w$PDUf!6U3*Yk%z0~cfb4N(S)9aIq(wzKL&h2K@84Vgl z@$-*#ne6t#{#)mo7YEs%Ij-G$)WWLIxyky_j*Ux%vSQhUAPJwPK>wvE?cN>($_{eo zSD_xycsvY@M&B0cJGb30?rvB2cwtt|Z{p=SGdD0sf29hJY>g$=VIxTxL0)3LW@(2A ze}?eOFUXL>Uz^NJKt96l;?9#Lr}dm}K^`p@X@xLoL>4H-3)i_G?J^qHcMHHd&EvzF z=-7y!swHIDS>v*Q@M5}+y29AE=y8B+xK(aa)pgj!A>Im-{Hu+1UPth1znioz3@k5^ zNz6l}lv5hy{3idB8EG}yY7#5H-~AY&u;sM3TxD^4n7PZvhitSSp^V~jf8z;6C9Oln z%UQb|%dOisP!x0#B+Rl7PC=#dzHYX$u|Cl~NJ-OSacrz*-sn-ybh~SYX2lztMN5Cy z>=%>boztq>+Ac^ErVOJmG68*WT@4?yN)IS-_nMzO|EuBJ@3Yx{KX8bPI$~v<_BJE% zr%`QK%IeETQ-k$3^V&>FqVkdA^Ch?hgo7kmrTJ5ptJtC?DBK zsTQf+(i7ZCo>A;_$m+@U=+VE9A*Up~IB`4sZsWbXdoL{s;Kl8GTPuovEUX&=7RY7Z1>~}*)oTzYLPe5c1b#Q;M^@qOp}(Gh7{%sGHMzCF#WTPC-E}Rs)}KFn7nCX76VomrGiEW| zd3h1o1hI*xrs5qG5DPRGMN^gOMHFT-)HN8jMu3%BjE^g^63H%3x8(fs*{(CLZ^4tt zQey^lXe$5a;bF+S1bvE{izEJ`NU^2voGIF?uh@S5fmgYmB{R)8LBzeN{J6FlDvQ^s zxZz>L&fr*!Hed1-SMAhm*D}X!UR`l{V)^AV#sh=zk^FD-DKKuU$JGvex!!-qsx8Mb zOlX$PYa@IT&#K)_#QG~{Zz}t*1Sy2yA^&`}+q@kn{h!lFOQAz6G+1bMCnGpcr0S{7 z-0RD>C|A_}jNBbZ#gB>k6am9jJ-ybUstHxK9@g>oTsEfllyn(0^JR+4EKvmt>NLXg zJ!b2YW;aQ?JjWZhQN?BZbbnVizst@GjP&aM;mQZkK87v^3?v%PUH|%M_u|C$`57uG zV?O)6ukDsM>++<-6k4guCuWK}S5c5dOlkEJ z|B>lD=m}`7Mb64=l|O7++Rd>T6-PdW!zhYQ-ct6h3Q62*k(X)h9z1xCS+?WT7&H2! zGcG6B@kMTd&GYO4EM#1oc$u&Q(Zpde9RBIW(EdykZMP7!mDgt!$n1IbzhS6hJ8686 z(vXyt6cFSPCk#wIJdds~tEHn%>x7FTHCi9B+GDqd_l~);eA5dF=pqQfs$0Y$KY0IN zRn?QCyw^i*rqBqc?UI-rfs>O@>;_|n!J|47OZ7S-)|5Z520wKJ7ZQNA5^DI-yW@iN z!L2$`&r-bp2#y>fPrUrXLWlh=H}#E~AB-WFrv_raT_)=J@M&UJwZFko4EFdy%#zEo z^BK*6%jWtVBeAvGsd+kePjUt%srSc61M}5!oewudQgM%|itN{WYLT4GAxhGQi#@@f zet6bHPxt9-2U|=LIWC8(1_p_)#~F+3F3$sDBKT(9(38^wM$gBmOFJ1mZD-Ch4c*Io zHeXM3K}dq&zuzG#sg-Kf`}elzNEVbMyOX#+1QBy&N(+H+p^k+;VkShZP&CbKgj+o* zcrjpviEYwZCtb+vl8q(!L?jq%YI>pgnK0`p59WBLpv1}B$*NiktVi?Nc4tQc#FRov|J`!cBF_Zl6 zlmCoa02SL;tdc<=-{E^6Q(M*5M2yx__cD^#lbY0vU+7om8+_Xr>T^%nA#?%M;_3>4!GMGcr$c(<{k0&6DNlOSzD)Q4|VhHDVF@V=KRgXU#^+3Gxil z?{02;l%p}E-JfK%w5)y1)r_W)5zYsyxDnZnB`3Q@Sj@RiYdtN^;i5$;3@yD%hPZQ^ z_l8dOmoNAzar`LOCZ_vFz0gg5Cx8trzok+iM=6p>$|4iRDNCo*^{P3DR)|*g-4b-m z0CefJQ>LhP3Ol$jPqE7f*_cprW+oaR>^wRwxGn)Z$HOdh5?uz;WY{eZo-$T*T9D%W z(+y5TH`tMF>{_5x#!Hf5Mc?cctV1%~5}t;yk{Q`J7s)y%^^)e^zMEOME}5<^Ez$9=b*FP4r$f|ePV z^r^_WA^t@|hA*Tzjs4-DBCsyaG=kYHrdOV0Wa22J)&5pVy1q-sv>y2lzS;nL3M zpY?g2vB7x7R6BKvCIQBi2d?q7V`&yUKX1Ni+rNT>vqnIxm;5`oox`R0PQrf^huDRX zY`KBV3@l7>!v_f|sfpyDLKR6XdmES`vZr^Ftg4u2ML}Y1<4vTL6r@qO&;Y3yU7yhl z@N2#!Fm!cl1wYgL!EPL87D-y=bR$Z$;9ozr@9hVS5Hd>Vw!f(+%MCpm{D6Y0rxtJ$ zb9Da_qZwwo=~qv^@vTpB<_Z&*KKERKzgc~5b85Ui9U|EWMBKe+(vQrP!F zI!Gblo&(~AH}$NI{39vUOr%zRsB<1NgX^6iM;2z#-hNfYTz{(4hmoa`ipL7r3!Z{H zi-RdTZY`4DzU2;V3CQm7a%cN#{X*NdG`js z5OZAaWV%B_BjI*@L@Zu?PbMy*+Ht#v+V1#>vFkR8Mpy%aXt19V>9lZo+K@PRFB?Z;j-Y)%6N%tZ&YhC;4iSdJG zcUj2E-}jmPs$qiSd9=du^~M%2^X$$*t**3cD3?qRs>((u<%U>id8<&bd6*;$UsrcK zG-CSaBP4yD99Ze^uYtTm)l-p%9&FWt41QI86BF9m9*w@!%g(D~IXWijHy|N$ zD~f9k`;a_JemVAQwuweqh(RYth1*4BRQfpGCBg0$J&f9310OWmIPTN!%zI{{EW9kUrq zTY09du?VG)q9m+njQi3F9Mh=j6Z9!O4T9+08W|UK4Wtm3+e?_~gDDEptQqf!3&Vor4=2-$5mxz`&l8Ua;-i3?2+|} zChKwGIqe>(QG}*jC7i!Hg5|}UD0EKmaOQ$veNTc-fV8=ygvR!D8{kG$?iUWJf$DusN^aOr`psB6 zX6dVz1P<;foy#NC@6<98k1p(uz2~@D*)kp)Mu)BksHHBbyDl`&0jtELx~dET~!7 zgn{yXSkJypB}+%Minn#tcur+5T}@CCxlN)};p!Bxn1ksF5#qBbBxO|p`rUgmB{qu~ zjv0sNDJhGZNWDe?nLuPi&(9ragzzhcg5#l2L&LtB>O|ts)}j@P-e~Tsz>eJ4Q;vOK zidftSly*Z#9{&xixi1UWQHQ@MEq=JJaUFvUdymvpOFHGC|24Xa?f5DZ2EnLzZ@Qjs zLw5t&qu#RHbgRnF-&8ZOfw{fh3>#(5?XsFaRL+Z^FN${)Cgg0^<-OMXZazDaMY zo{4&d>0o{$;F!=ltCj--Io)=+{nBbFl&L}qS+shKHMx7LH4nVhB%9^k2?9qV6crGn z%};vf`;!I&NK)d-T#WdP72BbkgaZ*@zpO~h!|ph74QPjo?1 z-8mZ;8k%j~6Q8bVhCSaWrSFADqsR7KyCIC_-1fZTaj#09(f9IC!Ia>@X$>e>g<}y| z{dURlN!dQnju$eju6=jhe4RF28LD6!`GlXvmd-}QNzx>u#4&FchdBIrzH2J@T&eM) zxcog2t1^nbCG%U=2G*OuF)1f98tKkJ$US*>vp3w;=rYkd;=|qhXy6s`7b>oNf{Jei z%n=eQ)=;tWP}OlK*|$;^?0=l=cm45dkDhp{K)f|QIbV|2V<{1+3nI6N4;CRf--Pn~ z<@4+zbSApS5tgPbg+@Uclu+W2jAaobu-N-gdP=OIsW>Q_C1O8dU}*Ew+vdM(KEj=z z!pKw;h{A_62(n?ltJHwC1!*LP`4`ruD(wp^=gFg((I$7NTVL)44HR2iDQ095d!RogIem824I1 z$mi!zJKCX?P4^9a>B&Z0c5gc1o*W*Yl@Nfv3Qxl^B*e;IPv_`HB!>VHYww#XH_;Nt z!%YErSm;J@-R>F6(MoS`ul2Q!mk}(6#a>?P!SoDWl~0iR$RH>^Z}F6VsHdat?a7iX z%r)k)-t zhweAe^}z2{N3zq3x^IXWkA+vg%QMHiiP3W(z7#tzkS5*q2kdDt?)NHPa~Gz~G||M;?_eIDDTA7YY{PCF~V#v6RVrZgI^*w|WB-<1(C+4+blsR+ouz*l*C z4Z6xN2N(jazf;CpIE3CEqlAocS}0p`t}4p1uTMTBY=sx2az^wgBAE^waGr;AzFhl; zY%W*Xjl#KRB97WhA)NDaz6|m3g_LyeZYX~f~uzt8IhEEQ#D#D8pYeu4$t_Z47N>bV~WP zj9t(&4jW9;OlGviKz~KtzkLPQ3J-YyCTNJfe95}V0|F(Zb89=Ry69y+q0$U@c<}_1 z#n3PH71d6rJh!yl6_=+m8hiu?O2mvdtvWO2_L{O}g0^|{cqz_vLJLHoN>D_g_cvC| zB43Hq#PS)gEQj_|@qAs~w<|RFj?I_tePUv?oR!I>5YRYXWTnp@s_!K)X1Ar zXl%1Ryl8JDdoP6~CV!e*zPXVae$0U?MMfyw4ZXscmwa>WI3}M4aJQR6INx?8Xt@lD zzIztJk&(EkLwSWr`KWGaH5!mP5Qv{Wcdq*~_)=1VhaZ^S9|d#}p}W5rLf|1jUwAtO zeDBJvj_-AxD*}^}rG!nDf zDhtx(0VrT$Wxzfa?#j6V)@oqFINe6_uT_E#_lgQH{2c84B(LauM7Q15o~?zAhR|)b z1~>?}H{|9(WUY#K{F?rZQ{EZj8H^%GCNcIN4BS2qnlOXdKflku@Oa~!U&r#h3iTiP zl@@H%&TY}vChZ;zhw1@};?~Jjy@uGroR?5GU+c+xv{2jRXi|ok5pJls4jP`DH|hgwIE70N@O zNQ$J&NOb0E?l@8aoMQY~& zaCyamULUgdb5)o^+qZrN%vU-3?K*cdXUi?WYHM?GtKYvIBl_o6#O@Un-UN+Sy!>n+ zhPIv!Y$3)q!y(%u$!!Z}`{Q~qoxVTs`fXX3pj+Ao?^)nFzf9M`O)Xil46rgYGcz3> z9Y23+!@}@jyy9`3DSBLWeovz#%gu#yLn3z6>);;L3o+Njcseo2S+SsC&=|?*O!dlh zJ*9p`OMsF`FG}V2^YAlvt}1cf#kdg`zQ|YRVmjJ?S#f~NHO*P!O`T-yWqGb1q5}JD zc@bl+1w4UaMF+As5Fmc8k3n3@H<1t({p|b{ea08id+0pI`AZ3-rw=J+Z27A$?|FAH zzI9<-i@5@aN?LCYeW=bmzu0XYJ!hl2sp@L^s|K6FYF5iZ>Z+$#5L#JHDTiJVBfcS5 zo5N67Cdbs-b*1gYdB*n_1fo!V$x_CTcGB1z=>!B*{$3Kecmx0hi;?m$2xPD@;0*}2 zo4OdUbQ}KHk_^Tey@K;Y?%p9w6Lk&a620NR*fzz0wPz*%t!;}#1xcJa>H;x(N0dh1 z`?6R8x8%RROh{h73$g@!AM%_nph6I)Ay_}ec>MI%A;AnGe--wgb%%w!3-yMh-?2Le z#!oAOX7o{puew4ci&8lKDz?{@Z}*a8bezmAsrUq5SPyf-a?n& z!vWY7ONom+znV<)l$ zy}&15hNX0}j4VTZ92Or`2G{Z2`eO*YUrQb@hV;|(rlQpQBk|O4r#Np#)lq%0`P9GS^dJEFC7(i!N4~1FLioL)zx}qks%mK244LcMN*8BD zx{V{CsgKpp^d-~8|fkJ!qCPAA1>%A(3E&BgJPpN-M5aRBA-I! zdNsS@M61c_)}n~$!fYOchdeCKXd{+ISiEVCPu8pQ-}?XqW8*P*-kFn?eiob}D~|DC z$A%z}`2t@?Z1JdV?bm!Qk54!9eW&T(Q@pLhn@`AcwKkkPZ1*<#`dVzUJBhwPD?M}* zG-M_8>V3^IqyE-Wv?^`BzL$uYu8DZhiJdX;O|4W7tOTl8zS0SaC=?HR0a}@==hYlk z2K`;AaiGaYpn=G7AxK^?y&;R<5A$aKuphp%aQ!}I24NRbXEEF?44G)H(ifk5E?bRI zPaQBT9)l)GqC&))l;*Oe@!N~+J(U0t&>gK!iUG9`!CetPolX|_~N}P@6CeTc)OLsJe@X1!A%)j*n^Ib z$;+Ay37oK383fG(N%Z@tvGmuvy7JS-hOMpyXIn}()$kAhtK|60kqA71y!hT zKww?Gtl2sTQxV!Np(FUTgLsUZV7NY)>sRhfOiVDvi}cq8%0gA7H`RH3Z0ulf6FFd) z;QYZaAwdC+d3b}_fX(JylT-DmE3Wo@vH7r~T0~qvzX$HJX6zfO9GyO;)IfC*_?ZSN z@GgY(nNKv5=G)LCdMW^m^ct-orYc-mtO)gFw}_@U;YUC$)LozU$<0fvWfub6sL-T; zV&&In7w6zdU#FGZI&G1^7RGOz^reeRG|kf#w^3e?&W9LeX$?;wKf+nJ?U6 zAC0Siwg{>QSd|#ZU-?q<(i1ezr-eI}tIsDtJ~j2|YlQ0yY=RaUYqVGk$9!N+=b2x` z7(iOIDh%ogqWtV_TZ<8*0jfiVCGy#_#9rLTt#OfxH_ZK#$?8G=4}5&7>Jm9LO&Lk;?h>>DIt)^$A!U#el-5<*IX{>b`vg zrM*EKN@9U@YCZLdXM2ps2YJ%F*Pf5Xnti~e=t&;ft zNigF4E7HC=$(2%hhs_bn3LT^79-)if!fpxpXVj&Wes8rrnV7;JyUjWLuN3C!-z+^| z-)pZ2@<+U!?8XXxFYGE~U(LKoP>s@QTA^iw)CyD06hapZP1TlnR?QSgn@yP1Q$WxO zu-5aJ3(u!oqB$&dl4NXkR;{L;?65(WqzMR1Ys9;OA;b2#s{Ksv-kgGr)_Ku=aHy>O z?g+amh&E(%<7K=}T)b`e#E+lVQTDBHJ5F{cAQeAKdzJc_13dWgX_RPcnO&)oX_9^r zCwU$4s56@O=ru}@^^j zTm3N&N=rF8QixqOBgT9+4x6d6&_ymWYE??yyGP{_!!u8x5fFF4>z?6336$eS^ccG%<0TfN8Y+gMP?Y7*=Vgr~)ym1}@>1 zl~JJ=Ey48ja^S{&%-~=G>Kq|pehKJqL`6DzV8-xx8PMv(9@SzNCFQI1uFHBlz-Xd2 z2Wyfd9l?&HZ`s%1lX6D?s?y-awS${#plrGb;b_ti!l0eL5`uSmZ?lK)HU|JdeVj7U zPhF30wzyf0)=#xX1WUo!xEQa^gOhr<=_IQJwb3AwVr3Zfm=&~CV?$Ea8cBQ z=vLu;xW`&12iK74qI%n6wx5}OBfVJcy#G{baPtlKsgyp0R%1D~ISHZ(=iQz1=Ge8y zj#v#n`fNuRak4DYN;}IJuvZt}NYo4t(tz}U(X5}rI^*3XKaQY#G7O&Y-dRjt9a;WS zLa7%7wn69QDfH?cUR8axHUzshvXN(Qq*)`TJe+yZ%wuZMW6Z^`+>4l-q~iq?2Row z=V22vD7S>y!NqHIn%3WxAiUI{h_L=KygZ;8)8NPp!l53TtXYuqVblodm%W63XuCq4 zj_vMpRz7vhfn2f_ebCmz&6l=rvSAD4PH@dhbj5IvE-7())vtO%gTNley7yfOITUXWpb%qczpI*rk|3PkeQ@N&pZGoG#xqjR z{OB>z6SPMQHG78okO~zV$%Sk(>pbznYeJ;mHI!b5ly-Bg`J>mmj)X>KWH@uV>v0H# zv8l#qRL+qJ>6jz?tK&movGlEbD2U1J_cqLvVFPJ=!vQLW+59gK z_pV*9t;0fD=ied^5Y7dCRrJ$zL_y?Ek1!N==_Y95!tc**q3*wmsvw2gz*lnBU7myn z7Nyq-h{q=gWV11~4t1rX7%f(0#GUSI)jx)si?8B^` zjB>KJAU#^hB{VVK;0Nw9awz>xyPBqf5?Z1A41Ksb!=ge^0ZzA9m92cbiwOw*{fzqV zcW9++J>%0AeUopDg0~)KQ&zwQhF9rp(sCL&JUPVif%a-)&^HCf zj4)*6eX6JhQ{T_by?+Uc$KPu2)H2Hz~CZ`6vcltmq9L(!-YoOHn3=RF$;xEwB ztQA982?%KaKG>HS2Z=bl5%?B*x)%yx8>ZdvaYgeTFIB(Jz0(K$krFb5JonvYUMD+l zG?RL8urAYO49cRopFn`2_;Y|GfQFq|Ne(C(XvfKq*{a7EuYkO1KNQMDRylH!$MP_)es-f7P>#Kp8a&$%mJQRvs3q zPvU~|mZc&4d@hDA2P<7%*iS2AHt%^JuMdRj5s31Sc)#;oYNkBLu{^F*NWD7&# zPFs}ui3T59LaXUEv1+(MPCVpf8v)C$%1!glZA4gPd1XtJu7Zg9t{HZA5_ccy9W)Z{ zXXP;@sy$U~AQj0wEXztAid$QgB#JwZkRJ|x=4TtQxuRYS>$|C0;ea_{?TsdL8S}}0 zF;WZ**JtXhp^5(yFqr`N;CwY|(09N6SIXmx)IQ z{b}LOOlQS?bI{cg7>1RTxh^z}j8r-Y^0;+$F}H(kDJt@ocrYEJ^yO++C5>=33?xNA zTGy&nKy#_MB;rzD;bCFCjs#K`hHbYbExhpaNSPCwp|e3+8?+M1$33}v5oFDKSyh+U zFb7&yK5$yol$BnN4+nA!7`fPQUFDyF`2+2SF1oV$mRlH((B6)|>q*GS4f8B>;Lqqd zc-xE6XA(l#Gw34Wa-`3TCC_RR^wUd+SQb4Xvl=a&7MyWGW2 zyJvwLrCoW?ZU3S(nUt5ijlt^<+`AVl4N9rmDR%!c=+tyAVDz9G5db}qBLuwM`O`po zSzB5rJ`*+R3QfU8vcWE`cuD<=p4U{BBL^7NEX}%)w+7rM)gHlI5p_kEV#L)hn@o*; zbtERp^goeAteQybqg&qE2X@W3^sl=(VNPKF351`|jfIi?#*OkM-^#;A-9ierjZ5@1 zw2a`%7h;dfZiG|dg{VjoRu+c_k)uh!xK~^2buBS1)Vk~|cZ58gG)i;7*POG75`n>> zG2c*_^nq)+-uLup$$0g$+K<=A`uehg{KC&~=zEYWGejD3Gb$<%FKqb(s56l(P|mSq z4IDnA&UM^=Q~R!;&)MOP5QyJVE^clre1HI@eQ^G8l}hOT5!^tm@z#D>^I<`uPTdni z!fE|xmmgKGY|9dXeXJBZ^IMCw9oqMS^}rB&!mns`=5#Q+Q>ZApub@yR51}_Z2vjw0 zL9N+uxokg?Jk0K^)olZHT|(Mzw%V(S31;qs@A?$D^2dxBMJN9!o^+ch=?`i{kR~hs zCAotI(!;`jJg}$Zt){nMd_TDc*{3mTo>#$=9KB6ve_eV!pX2I zTsCc>0M`mk1x{A%c8~o3MB}>n{^}90L67)=W8Wj*}bm*VF@OlX*I`iPGVaK z$IiXGyn+3}zQ0WQ0ILt$;|QahI!+*Zka45S;WUhFdAhxpbqpGLx3Zj9tv+@CZ|(QV zF5qcg`3v>HQbE@Qv91WefP=Zs4Ckwz6$U#9R(;}*hVp0bhs9OgxRv%>0-EYx14p0> za$0AFCo8fL&*nb9XSui2$}Q$cJ{p+8Q26BsALZtr=pQcf|1)eEU-JsKA7tC3H88X1 zYilScAM&pxkcxL~EiPcB*zGmZl!_QQTJ|E8!(2Ydcmv?;_19Q|gWHTf{y?hMJ$oEV z4UdVY^L~GfJEs16HV=Sq;n|+Rvjy&~tYIBPp|eYcbN@RjZ4F<$h+2k>l#nH{?>`86_z!%bgX15^*e%jxvh40yFDYPIn2>@sFnAT z(-2lrcK?eL$^y7R#nz%X@z=tHj9GTddS1&h_JlmdIL|_RY)+YxOp3;`Pd?(GC;$Eh z_ha4~$8TMD6#S*TKHZeX1k$zo>#DP=MgHE4b&Ka$6@2#=_Huq^4a!QzWR)&!x$*-Z zPgg*oSV>zTxv0RX(|={|_J99>08qbwi zEBYMeLc?w-hn{*@e;o2<*3F_Vp*vL$t!cB&Lo&SU`~G#6_C%fX09o%9MN}Op*)f@f zeo}OG?YFNCmXa31t03KjdwBA!*)WlFFwioR^%7ijmG$%N|QsTbDE)l_e=&q_7(8wEc7t zEN`95!%V?67BRgga0rDdn)LboN#>sha=@i@Yo_yCU*Xp7I-5YiVi7bmoe*|G#Tk<`Bl%s&Ls@1G>=2IS<1?e}bRXioz< zUmAt%u8TnI+^X{m&~Y9IE3hNhLHDy7(jnze_AdY%oNNwBjOPX(2dWgv`~$glLg^{_ zd+BeFx(uZ%8tUvn2zlWj2aj3E4K^+JXMh>2jduzY)k`+AEMjz&EKI& z2C;gSvQxZD>n8qvoqh|BNl36AZwNz2&gV0hTclA(gVQeE?&_zH&{RSJO2eRY$5>oSe+KYqV)lbi!JvSQ zbKa-g+VYkNyf0t@a&-n}Wkghe&20pTyGFK`wde_`QwIww9XZk!Q{vEqNkBlnE|Cnr z<&6iFAO{nDQ07vAfr%G*mp}GTiPWuqE9NQh+V<-x6`nq=r^PF8nxF24Xezjm>FA$_ zrp);~A0692Bx;9fqvGfLKZ9A8GJi<`wMVbqC>yN&qsZcJg|y_QDhD>SREC(NE&XW; z9oPAAE?f8FK&Il~nG)24AB1Mhp8vXm$bz{`u%-z-2iwXN#P{jx`J7pA`B_u*bwU_g zXNT-yvX#{S=%7DWUqU%;3oHk6fNBTWq(|hWkljMo{aeV|KO2*3Y>yyni^SbRG5ykPv* z6p%N{`GJmqb)0M(!TAGmEYW^cJd{2G2& zEbmD?fy$5SE^m2x^|7jgVWryXi-qqkUzA-Zi13f3%Zj@BGI~+aXab$p)gJu=)$n=f zgNIZS$5f=Q1<{%sL%fL%p&VpjSQ^j!3K&5d#RJxtJuIv!*eTWqq_O zsr~cf){YoaZGp)-J$ySKF|j0@h0y7RAJ(9)!h;blp1R}hDrcRD>gu$VnWIB3J^IGf zy85LsF59!}hfwwx>3cN;yxMi~<|l7%$3DmUOZWO3VI;V2BRf>NXIf#rxvOD%xyor{ zMpMzOH&qNsnvhM}M0}8~f|(J8W`P)SAwcjJmAjsOD#|COUCw~?YbzRw(?V%5#@Oz5 zb!!|t=iH26CY`LM{U0G(`fF7LEA`)zo}!0(*lQ071{48P+D6?lyaV zNTDW(HI5hAb{Kt517&yovvp%MJ*EBn^ln@ncLL5g^!zqxJkv4fqK*pkTdot8$|2ru z+U>0DQArtRhmY59#_qhqjGwgzDP%7D@gYag4{i~d<=@rdsVn##yEWtI5S4rhIVTs9 zlcB~^*FtAKziRe9Nk$#{7S9?fLlYq3;urtDPD#y3hsyjv+hnNb>si!WY3UDvns0f$4uhc3&_zl zgWo~OsHA)VjLX7ZDYcj1*3|q^bDzWmg}cqKHx}Z9-OF%0b}7u-GIKh-d#M)833_hj zqk~|WNj(_%`O+F;2pVkJj;1DZk;{32(nf=&#I15pP=j7v`p)FTIFzB@yf`!s_hf3G z-GwpT`F!hnES-HFM2?VGDQhU&nBpp%xtWkx$(%z9Vaj(u(O=3Qe6cA6zRp<*lm31N}VFVBmMFN5neM0fv22N0TEB3v4Nv~Q3 z+N7s2f&()_@?BU9lLes_!F^(erl2#N{uUH4L3Rs=jzYlYW?Eu?oOuk9dZA_o4O~wR zcQK!~mO2BM+~Q#Z3vw`2bj(90SJ(%bRYK9>UQ=Fn3k>nerg(Yf{rhXl&L4X_5V7=k zS*`+6Xu6sBAmAF=w-BZ)oGn}A2X_FXjC1h$r}}&0gU5OiZjNJ&c$Pw-`05*MPC1fP zY6gaI7q~u+DU#&k?hajS5!lwg)$B%3HwP$3@HpPDi(pM5$I0!H`&EMp;QKFrn=@T- zi8m>C@uzc+n|sl3z-=v%fq{+r1+mh7&GKy4`&1LE?nLMyf%}PM=-nH1N@pM@TUG&v zxX`#~0j*s|fwtU$W^ZdK3$;B0Hz0V6YfxmsOtnguMJFAw4x}Pcj8>Oh1b2%@O*L}2n9Y~3|8J?Piybrns-}exSli#F3^L7(EnebX_xw>BfhGIb0)%9NWYO!H@hP= zZI?&Hl^5Ij+^EeVo>j=*lOWmMXAJ4nYbvx~7Z!J0h(=wf+6ZB5=5g#(53(7ON6IQ7 zEFlth884jXx51T3k%@^8Wo_#G!F^7h-*Lab>mFt*$+fb(3xJ~7yKfd7whO3@qi=-8 zXET2qCGv?xLh5EAvRf7*RY*W7vh}$Lknt}2z|ZWu@wgN)DCJ3~`T(&dE1Uw__fltL zQ?=C#pFl<(y8|q;9@{R0i__+Fkr#n?5Pc(D^%^T)c3z$i?Oqt$c9Qs15q_8c9o7HX z(gvGN@&9$RVK%6QmK5d;aXx9GdZBLjP~q>z`WAG!AbTH(?FzVZ;kt!LSfmpbOo1uF zg$=GHl1z&sYrHVH-z|xhm6Sy#pbm``d-_3zz-67Qgp5)SgvtF?)u7UR3b-2;gZ)k% zOtdpBF=`Pb%0HNEKaX z>gn}d5MWYJ=yu$eC$nl~;8HJFZB^2TftvWZ&!3gJ_L{$BD7 zQFhqLsn#Un62q;gKl!rV?HzU|2-=!AWF$bN zd9sElO2SaL*AF66I(VOKlKw-*hHgu(c*4`mnwnY)ychebb)^0BM<2a`+4W`?*Ko;u z8FovNxDo`wqUAJBG=17A)NL@x4X0Z)G&ZJj=8paSw1BB9INRlQ(23H1y5YAcD+uR# zVG+t9CB#$mq(TuGu?d4ZSpIEChd1!wK_gd`6tL4rYu;j)JMAvnq{ksXNzFm?kfunT zbS?9IOL)ExfS0MbF^{R!?0dQ3J4~48{Fo@??W8Y(!8~AEG;$R3_-?&alI!9d+62_^EAq+ zy8gV=tg0jb5f~|Yud=f{9djR$MfK9a@0B;i@o{7E!tPr&U*$k0 zFVD5l+HjshFVSSYrU{%zZx^#nio6gC`-OU8x=7IRj^I!hE4sTYIFTdHfHHk0Kz7#o z{T$CfDWr<7<8X}?=CSq|p& zgYN>+^!G;!&EiFTC{UXNO3t9C0ZZwl7*_#C&5amV>dkBQpagO`<^c9b1PODPw! z61=lhfw2*QcGq<_V04_GXi2B|<*QREeahWG)!0`+p{_yQqWR!<#mm6>}IX zI1e^f8*7LkNisvDExi=<(L!;kF;Ts*0Fy^sA-g9g!Id}E^_ zLttF`yX^kX^dEYO^$#B44=`VvG=if@+mQ;+Cb>liZv=9j!E%Km!^q66 zj(FM$e3-k+NxFxfm7%cKV*?mH!o`O`d)WIK=t>%63CLYi_4cE()-eiSd0zqPZ_4g0uXHH&WQZN+6Cj40RH0#$NB@ZcaIm}1z3`LF?e z&p0S|V1lu(uFf8Y>p&Xp3UiU^*GVee5CLpL-U=(rRX(C_khJg)*4wp7?RQpoU~D=0 z5DHyhX9tSAi?gplQj@qeHdfAB0Nbd`oK~EFR>{G3*#nA=7|;|$(rmIE--G#4hr_-6 zm(&aeVDv^obU{qe(|ee*q6&hmzGg{o%v>bbG$jG5yN2)B-F%QW!0Z|LhvgHD<<9yn z_GQE%s~=f;D9pk@7c!%cfP$h>e)+?PU)*sv+z1zAZnYh-z5oWOXW9SmI0&G88R`^= znm^u@hLTzFD`kEkXskf`O4@!9PG;ntWYz&EdG|jEUlPA@almM znC{FTsOp5hQ^9Xm1*AF@${zpPaxGiWY?J`W_&4+=(&*KIFi*GV1PuHX78VS&BH$dP z!^HZce)zv~+3Nw`mdyWzSYKVoc`%ghieS3C7+y!rA+PWOp3sM^c^L;A&HMcX*d>(hofLJ9xbY^Vq<2?FLYh(n_>GGey0{s)*AIzUD0eZ{_6f`G-;gjz4G0ww3 zIDDSw|L^~T>CDc#Ka$%V>X`D=ZZ$=Dc9C0;hQM=7eQ0pHegC~s{ZFtr0ZEk3EjZQJ zMoKr=5BICyTgGn!yG=-1srFGY83i3bl7bZ?n2y|@fiYH{VJup(Dac*^<|K`tMb=%q z!gm2(8VQ{DezH4(e*>>Fs?LfhCQr**>Eov=3d*7nLS(~Wm64IYwztnn=*6o+#>;Jv z9;b1#uTtd%T@6hQ^_uAdC~{^fmxlT^>E8U1j7nEggsjQxPr^0zL1+SoLQ^)toTV;K zMtYFV8!jmW{(d3hDa@^d(h-5yV;UGJ?R9_j*=B)ZZS z7@$0c{h=U|Gl6>fidQj=Gb>IH7M!8>Skee^YL0oBqd|99tCAbducvmvjB$=42l!%% zjqZYFqLFiz^=Adtx>KmTlf(y0yJr?SLuFLE!L~16T#*oiq4IPAQ0nQVn8N@~)D_&UKXqZ5 zGL*aFKgnJdyQ1>~x%*0d<8<=LgNN}D6qmG3>Y?Ta?W{7qig%K95~V%$QK0k5D=ZY3 zyad|->8E^f=cT2kd1u_x>NwVsMlrO2_jo{H%AnjRJ(q_wd++BjrfC><=Z=#x*=r2A z1psPYmuY}kP#UFgLG&NJVUdj|5)4*60ULhq`|6_UY4?oX(7tTBph8Ehtt7DUE^-?xm zS&!;&6pdWmc}x)YT$?AZGUnq7mfi;sudjQ0U~o9o+`jZGT)!)rgM~#u0&$SF0!#Yn zMX2-cBq0>`ud$f9pk7jtgTNXw2fm3tXKffxUT4Sm2`fePi4JTb#Re<_9xCSLOp+K) zFK@=b5a0?x=%H%?`xWD%!cNEn9Oh2Xk8>s_SQNdT4j#%AjRKj9DJaO1Y8F7lh+r*L zxCf|Tk~ppJxy$KrV-ewIZ=BFDxco6_aw|JvzS>AomF=KO)izOg?7GtcMwdYa>l0!< z(LC5GDR2-KqOMXpeEquM-%IX8I?Vdgh%ogr52$F}Jm~wtX2763F$~c8Q*=c|+0fkPy&4Z`IU7lq68czxiE+^=1WOV0Vb{=zaY4(6o zc6_*YaA}THk{g7V7MP=_sl%%lq2@~BTu88KkIqmVhr+naCc$9mgH_5^<2;yyg}e?& zsB0b)wP$bfO>;7{Ij3twvWkNe9vR5vR@Z&@;L0!1e9m^n&cfg_l(0ccpYh?KMiY>6 zWVQnvgKC~?HVgxA)eNdlfUWM9DN0Dv8m|*~8gf%3(zA>_M!OING@YI;;cQRnbP|uL z6RIryT*7spbQissIM&V7;>!TDA~0*!hJw}g(At;%Aw7e{n@aoZ`*nnG#e--+R7=S+Lr*>0Nn>3Vb)`BD7@{!7^SW< zp||ViI><6oDi^40pl(S5qf+dI>LeK%SzpxR0OL{v*}mK|*qDNI7gG204s=E|2qTjQ*Gw7aFk@G!Z zVN`5C9i&0KVo4D6a6|ZEroP;=u$@^SCl~v0N*=h5!iW;6-?rq}Xb~XfBLoix4}~ae zMnL!h5gEnzh2CAW3v-gS@#WDrlS=~B^3$37A5CN99%pA4{JN{J&B8SVvnLjvEb7ORw{@-qv2FyFHj0=EayzE?3Jq#lBQd{ zpD;>r`v+AtaYlG>?az0QP6%)nfk$u^o^)I(NfJwF7K&Ka*Nbg~uQoUD-i3p8>oBg^ z1}FMvcb5i@T4QwyxckjM?`Om&GQc5;X6{!W8Js-Y|T!HmWlD`Zq6yVo7*Z&Up5#&faMwdjSz*>v8B7GtvW%u@&nt1T>0hjjX7ACrBEI3Q;KnvLW| zqx@pILpCb~@f{iz_=y?S^_;9^1?P%Bxw>9|A>jTFOM;FLygw)M^J!Wvq$)m5M?w=C zDl;fE=sey(X*4>wPZjZjdk1RZOSBzKUD@Cf;*M2okda_r4i<$0vsIZvrPOq9k`{cY?l*s?F{!855P*}>#Y`@6 zxjX|77NTNlJ}c20_a1p}7ZnU31Kq_^*vZ7v0r$P--9M{szU(GkX0LrU*ADi6y!Tw? zt|NR?1!kDFNciLBbDNwN-6B3HM6b+I6-x^6-M2(JH98uEwlj@8N09NSld(6-8OU)K ze58xMA}LfF^TH{VX&YUR6@mcGhgDITX?Djg$J){eq??&1L!Bu*7Txb%?|Qw){e8(c zvSS@zLc0l0CPRQR^+WMli3TzvS3_Oh{pEr((+|Uk-hlTEPBd9*#oU-FN{l4dH5neU zW*gmoQN%;FbOjYw=8qk_QbpI;VuM}b4= ziQ1M@DQqmJ@V^7^ffWHBp7%5GK|kB+=;#32c1(11bbS0i7pwQm{qyBM{)1t_p>^Ck z-}%g#bl9Zah|wx>eI(^dA=Q2g15I}}9j(f0!E#tCg3M}uvL~v{DAFIM8nWl|kRW6Y zKQq&URJz9U$&<nwx;Pg5IUrV`!G1 zx^V7Q4YI{h7<@g0K0&mZ6Pw;oQGB)^?)TR}r#<_>d97;KSfX!}uh1!4s5c%77~1Jg z6_%r|&FHAKd9O6_2I{oFv)B>tpNx`D6x9k|H*B`HRIc{8F4Dp(*R0Q4O{9{cvwAmQ zeFsAb&h7PTCdNSil1pCgWNq{_Ro+A^L+3=fiD4+ST5PCJ@jQjeNq5ii) zb%k?k`JslqN~*pwZ%sfgh1KADmWeXhlX_XlZFvp7V-0Dl91u>)OT-XN0q=t z1l=+_Xgoq35y`AW96ZmY%s}!uP+E7o;VrMPK?#d$9fiL-820C?p(7YMgV(r!bGUhn z#q;(BrE_?N>Kjr1*T%M0?|lL)YHH=sLZKyAM84t8y)~wiz`vI-e$f=1Cd!TLM+ygi z$TQn+^B-9ekdOk1Jxon$9M?euVY|h|Rz$E)ZWt?7q zm3>Sq0(h^giY4;bGxK*DUF|0Y_V-FOS^hs?ENlev zl2+)0%(J5(RvSux4&_%9%c+CV>7Q%3X5&BRYe#<4Sb*kZ6n!K)&jj^8K?~?G4{cfZ zZZFabPr2e=OW=5P1hLciuk4RHGM17v)zBo37YL^%_WYlxOpyCuPnkj}U2DnRWoCZA z2Yxh}TPGp)@p0 zNnIFv8;S^${}hxm&Y6`^?o?keK6`H7ZlL(|_wQZTWlAN&wJ?qvjY+hw1VH30!Rob@ z`*6R%H$_xO{JrcL$x8R;HU|Ey4S&GVHbaOoN`wb#kmPLcPOj z4sFebeJ@iRk-w{9YDGtfU0jR>_$b|d!&gd*Y6K`kKIwzoZ>QuOM*W*ZDc;bv?_91pu)0yFm^#9?eeA8GyksL>@47=wd7FO4uPYv4!-G571{$5pXG&$_5|cz3m8T-iqf+y!_NbZo-5lX6I}f8ms;sr-!0RB0Me8S@ z_}5F?m`EDu?iMy!F49aHd(D;rR{ z6deu1r3MmMHwygJ(1l)OrnZ=jMA{mQC0U4m5%HoJu)tL=CCtXl0WNCk&{LwJgV$k9 zh1&G(T>M4|D?wtf(fp)b%oB#H@Hyz$m%~OfNQOW~yROx0w5ii&GZEc3j|-KUD&ii4 zUb}rx*umeSaSyG|c2NCS1n);<5j()c-Wf=!6;4d$t!%gPeo{MeKb(g@X*5&ln282m z4%k#P3_|*ifOD=}U|PnrI8q@Q!(Vv1){B&ps`l|w+l21Ne}C1}h)&V}f4Mrug*a`F zcsy$cr?&sVZ85e!*Cj`J`Ag%Cvb?=HQPW}NheRjwj<%4yxp-@8e&&7{`P)+%woewRs9mLkr7UnHnqvNw>J*)$ zg^=Z8VGgZpk?YN$XH*2T%2ZLpmXHE#>X1h5vPuD+iXfXFh7(a(!EQHBLOioUx5C9> z*yy8O(kO|yWmgjD8U88U&G|}2{1hs!UP{|ppk`xIvTe{eF3EjJxXgzzzfj3 zDdb8&ZY5-7^O-1rYn@qxbOe2prewL;`}kqShy8Z9OcXZwX!+^OOL+3~)m`@xjMt4l zgPSz|Bw^S-S3ke*ZVRKG_MTa|qjK$CKC(HM{LHbp$SB|NyedB9Bhf`T31mUTXy5Qf zgY0}QF8kb1gyKq|Vt~}~H>rdFxjY9VSq1H53OA%$qC^x5AONM%sfMMy;H8uF6SJIL zXk?w4bbvj>}XqkUNCQG@oAMpBlt;tA$eNqVM;7wGeQVm!v`%KnRG{xj_r~1 z6q3t#E8dSXlX8T#ioGJ}TpvaLY_bmiT37zm&}pD%IR6an;o0pCRsI6|;fKw>i`8@v zGYseAzd0T}@NVfghk>v2-3?AbM(h^T4AgGTZch9T+vgt+w(bo7DeA1)OS9|ae~boQ z3)9umRhwpY18kj~9yY&9hjkazIDE;s>y0w}d?{=LF`8}B?2481PY|26m zF4vWZ^Y;IT@BZcI z4st*{wRd%ixll_oG4}Br&?j>g$kkXTnNPZU6EwLw!SX1VYGUA0!yzv8wmYa0zA`H3 zv1FGWE~fD=+n+5*uj4TLQADpwPAUc)!sm+f#5rEWPiwJBnZ% zTsZyaO$md;4$8&(LAk3PLs8IwrGfj$#@3=D3(&EEIp|nJt=SnT;cSJGRY|sCk-W^L z&+PnEA|=FO#ZL-xpzpvML&RfQb?@RaBPJpWVq&{^jY-uuo!J$iyO)ziprNVW5`iy= z9YF}Um~1{t6MT_vIvB?G4-A-r`Ce_yWV4(~_lY73;|>{S>EGi-rR?Ze)Kn14;q|&$ zzWKfW-Ps7D$$;_CZE*i6R0{4@NqBhp^nnR`761k_&mM)n zWLk9e_7+*+II$%zelMYOyHhI^-i!T=0(aua;@S^D{NN&3l7v=K&Xqm_6YVVYOL=uW?+yD4`zv&hUw11oW*Ekq5VZ)JXyl92#G# zU<_ghu>=je!dU+zy<4Y;+tBD;@Py2#=)BiE-<+|AOf(X`;ZTg2_=e_RdsS6qwVx-Q zL`bb&Yn>K)DF{j+J{^FGufOo<|gl%(aPzjfc%YTRy{1A+wIk}{k#ll$708sYbVqea7Z5+aG{(x`{*nkuf5H-N za$azR7Ai>%C9<+GSiWA2K_OIC&Xc8-e4|oo31|uZHt96zB@9+kkheI;!nOzT{o;_? zVNgr3S{XN5OrQ44z8m(%hGi6osum+FjTFNHQ^8kPB1GJ!+z#J(U$dzcN%QMB_g&FT zr}4oolBmAjzzHJM-(&mibxMv!tcq88DdM4NfY0G->uyE2h>eT?8EJ;ldScsRyEh42 z>9;%4VsJRlP!Zlx>T7YwB(4&{DhC>yB4sD6wL6uh@lYpyn7u`fHqGyJ9GKY z_>Fv`*Vo8-9;$TPMsCiYqL4jesa+;oTBE=ce+__B6)YfNkWg2cT1S%Nt1YMv2Tc?8 z4DB7Ha+l)exMA$vuF6{dP6n_QeP3n}@m3(P`9H10$lhHs>s1ElgAuv?L`6vJ6VRMj zn2GoSpU>`>i!IH3fSUsgtD7j_it+ijMQgnVPdZS8pjQBAPvK_9Yo|}-HTwfQ^_3kp zbzWRoR=GqjGAWKmnqeZa-sp^yOzcl!cE0(e%w!N-BFy;_Qr`lWSWrMSSDFkbuK>AE zQOd+)^t*Eyi_P%Idi(cq6Io)#Bd~v4)0f2};fyjinG^XPCQKpJqcW1aB%tYHd zUQ2{x+yo>2J^@^?YlLv`acfx_GM9%dF8Gsgdt{3qUY(iDLSM+bUo8A})cP%rgScU- za`1?ZZpqjhYTtE1)p z8J7wi_Cc z4xmD=T>MB6hQl@PYPSkuRTkr4BH#OQg}?|ez|X(16COkpRKo!sYDj0~bB0oEih`a! zS5TY`U24Q-(B`-A2zq~YbciYPQZ6INa*hqV9caa%w8+U(G{Ku+>+qk~t+hFZ=}{@W zc4Dh;az)=e7PNT0*8}D2t*b2{vm_Y1Pd4Af@hrEJ6eR!z+-J35EE0ctpmqW}{;4|3 z6p*Wo2E;4Hc1TMgVdLKkpKT)}!ku8?o=kSbh-tJeIslNUQ9B%9X$z4nd$_Z{{%3$0 zk=La!xm-ooalZ!%m3Y@s95-JizYiYM3y&o6{2k3)(draP7!M3NqZB#?@k*q;jdNpcwSa=F`xXA0W*1nd)Ef+Y;qZ4$) z{y3xaZZ&+LJNac~Aj>)>slqe)UJ@8z{-%{one4T8 ze2nrpXo8bbyE%I~k%=RfuN2l6uVRX+>ZgW>H0_XR7zkbWaWbMen^9te1~B H3{2 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

    sHU$)a&qczB*R_nmVVqMAJlHBsO{Y;>{Ja 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 Al observar un mamut en su hábitat natural parece cambiar su comportamiento en función de la +> situación. Al principio puede parecer tranquilo, pero con el tiempo, cuando detecta una amenaza, se enfada y se vuelve peligroso para su entorno. +> peligroso para su entorno. + +En palabras sencillas + +> El patrón de estado permite a un objeto cambiar su comportamiento. + +Wikipedia dice + +> El patrón de estado es un patrón de diseño de software de comportamiento que permite a un objeto alterar su +> comportamiento cuando cambia su estado interno. Este patrón es cercano al concepto de máquinas de estado finito. +> máquinas de estado finito. El patrón de estado puede ser interpretado como un patrón de estrategia, que es capaz de cambiar una estrategia a través de invocaciones de métodos definidos por el usuario. +> estrategia a través de invocaciones de métodos definidos en la interfaz del patrón. + +**Ejemplo programático** + +Esta es la interfaz de estado y sus implementaciones concretas. + +```java +public interface State { + + void onEnterState(); + + void observe(); +} + +@Slf4j +public class PeacefulState implements State { + + private final Mammoth mammoth; + + public PeacefulState(Mammoth mammoth) { + this.mammoth = mammoth; + } + + @Override + public void observe() { + LOGGER.info("{} is calm and peaceful.", mammoth); + } + + @Override + public void onEnterState() { + LOGGER.info("{} calms down.", mammoth); + } +} + +@Slf4j +public class AngryState implements State { + + private final Mammoth mammoth; + + public AngryState(Mammoth mammoth) { + this.mammoth = mammoth; + } + + @Override + public void observe() { + LOGGER.info("{} is furious!", mammoth); + } + + @Override + public void onEnterState() { + LOGGER.info("{} gets angry!", mammoth); + } +} +``` + +Y aquí está el mammoth que contiene el Estado. + +```java +public class Mammoth { + + private State state; + + public Mammoth() { + state = new PeacefulState(this); + } + + public void timePasses() { + if (state.getClass().equals(PeacefulState.class)) { + changeStateTo(new AngryState(this)); + } else { + changeStateTo(new PeacefulState(this)); + } + } + + private void changeStateTo(State newState) { + this.state = newState; + this.state.onEnterState(); + } + + @Override + public String toString() { + return "The mammoth"; + } + + public void observe() { + this.state.observe(); + } +} +``` + +He aquí el ejemplo completo de cómo se comporta el mammoth a lo largo del tiempo. + +```java + var mammoth = new Mammoth(); + mammoth.observe(); + mammoth.timePasses(); + mammoth.observe(); + mammoth.timePasses(); + mammoth.observe(); +``` + +Salida del programa: + +```java + The mammoth gets angry! + The mammoth is furious! + The mammoth calms down. + The mammoth is calm and peaceful. +``` + +## Diagrama de clases + +![alt text](./etc/state_urm.png "State") + +## Aplicabilidad + +Utiliza el patrón State en cualquiera de los siguientes casos: + +* El comportamiento de un objeto depende de su estado, y debe cambiar su comportamiento en tiempo de ejecución dependiendo de ese estado. +* Las operaciones tienen grandes sentencias condicionales multiparte que dependen del estado del objeto. Este estado suele estar representado por una o más constantes enumeradas. A menudo, varias operaciones contendrán esta misma estructura condicional. El patrón State coloca cada rama de la condicional en una clase separada. Esto permite tratar el estado del objeto como un objeto en sí mismo que puede variar independientemente de otros objetos. + +Traducción realizada con la versión gratuita del traductor www.DeepL.com/Translator + +## Usos conocidos + +* [javax.faces.lifecycle.Lifecycle#execute()](http://docs.oracle.com/javaee/7/api/javax/faces/lifecycle/Lifecycle.html#execute-javax.faces.context.FacesContext-) controlled by [FacesServlet](http://docs.oracle.com/javaee/7/api/javax/faces/webapp/FacesServlet.html), the behavior is dependent on current phase of lifecycle. +* [JDiameter - Diameter State Machine](https://github.com/npathai/jdiameter/blob/master/core/jdiameter/api/src/main/java/org/jdiameter/api/app/State.java) + +## Créditos + +* [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59) +* [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b) +* [Refactoring to Patterns](https://www.amazon.com/gp/product/0321213351/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321213351&linkCode=as2&tag=javadesignpat-20&linkId=2a76fcb387234bc71b1c61150b3cc3a7) diff --git a/localization/es/state/etc/state_urm.png b/localization/es/state/etc/state_urm.png new file mode 100644 index 0000000000000000000000000000000000000000..c2cf9f562943f5395185497621565f69e56f0f53 GIT binary patch literal 34673 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 Matar dragones es un trabajo peligroso. Con la experiencia, se hace más fácil. Los veteranos de +> Los matadragones han desarrollado diferentes estrategias de lucha contra distintos tipos de dragones. + +En palabras sencillas + +> El patrón de estrategia permite elegir el algoritmo más adecuado en tiempo de ejecución. + +Wikipedia dice + +> En programación informática, el patrón de estrategia (también conocido como patrón de política) es un patrón de > diseño de software de comportamiento que permite seleccionar un algoritmo en tiempo de ejecución. +> patrón de diseño de software que permite seleccionar un algoritmo en tiempo de ejecución. + +**Ejemplo programático** + +Presentemos primero la interfaz de la estrategia para matar dragones y sus implementaciones. + +```java +@FunctionalInterface +public interface DragonSlayingStrategy { + + void execute(); +} + +@Slf4j +public class MeleeStrategy implements DragonSlayingStrategy { + + @Override + public void execute() { + LOGGER.info("With your Excalibur you sever the dragon's head!"); + } +} + +@Slf4j +public class ProjectileStrategy implements DragonSlayingStrategy { + + @Override + public void execute() { + LOGGER.info("You shoot the dragon with the magical crossbow and it falls dead on the ground!"); + } +} + +@Slf4j +public class SpellStrategy implements DragonSlayingStrategy { + + @Override + public void execute() { + LOGGER.info("You cast the spell of disintegration and the dragon vaporizes in a pile of dust!"); + } +} +``` + +Y aquí está el poderoso cazador de dragones, que puede elegir su estrategia de lucha en función del +oponente. + +```java +public class DragonSlayer { + + private DragonSlayingStrategy strategy; + + public DragonSlayer(DragonSlayingStrategy strategy) { + this.strategy = strategy; + } + + public void changeStrategy(DragonSlayingStrategy strategy) { + this.strategy = strategy; + } + + public void goToBattle() { + strategy.execute(); + } +} +``` + +Por último, aquí está el cazador de dragones en acción. + +```java + LOGGER.info("Green dragon spotted ahead!"); + var dragonSlayer = new DragonSlayer(new MeleeStrategy()); + dragonSlayer.goToBattle(); + LOGGER.info("Red dragon emerges."); + dragonSlayer.changeStrategy(new ProjectileStrategy()); + dragonSlayer.goToBattle(); + LOGGER.info("Black dragon lands before you."); + dragonSlayer.changeStrategy(new SpellStrategy()); + dragonSlayer.goToBattle(); +``` + +Salida del programa: + +``` + Green dragon spotted ahead! + With your Excalibur you sever the dragon's head! + Red dragon emerges. + You shoot the dragon with the magical crossbow and it falls dead on the ground! + Black dragon lands before you. + You cast the spell of disintegration and the dragon vaporizes in a pile of dust! +``` + +Además, las expresiones lambda de Java 8 proporcionan otro enfoque para la implementación: + +```java +public class LambdaStrategy { + + private static final Logger LOGGER = LoggerFactory.getLogger(LambdaStrategy.class); + + public enum Strategy implements DragonSlayingStrategy { + MeleeStrategy(() -> LOGGER.info( + "With your Excalibur you severe the dragon's head!")), + ProjectileStrategy(() -> LOGGER.info( + "You shoot the dragon with the magical crossbow and it falls dead on the ground!")), + SpellStrategy(() -> LOGGER.info( + "You cast the spell of disintegration and the dragon vaporizes in a pile of dust!")); + + private final DragonSlayingStrategy dragonSlayingStrategy; + + Strategy(DragonSlayingStrategy dragonSlayingStrategy) { + this.dragonSlayingStrategy = dragonSlayingStrategy; + } + + @Override + public void execute() { + dragonSlayingStrategy.execute(); + } + } +} +``` + +Y aquí está el cazador de dragones en acción. + +```java + LOGGER.info("Green dragon spotted ahead!"); + dragonSlayer.changeStrategy(LambdaStrategy.Strategy.MeleeStrategy); + dragonSlayer.goToBattle(); + LOGGER.info("Red dragon emerges."); + dragonSlayer.changeStrategy(LambdaStrategy.Strategy.ProjectileStrategy); + dragonSlayer.goToBattle(); + LOGGER.info("Black dragon lands before you."); + dragonSlayer.changeStrategy(LambdaStrategy.Strategy.SpellStrategy); + dragonSlayer.goToBattle(); +``` + +La salida del programa es la misma que la anterior. + +## Diagrama de clases + +![alt text](./etc/strategy_urm.png "Strategy") + +## Aplicabilidad + +Utilice el patrón Strategy cuando + +* Muchas clases relacionadas sólo difieren en su comportamiento. Las estrategias proporcionan una forma de configurar una clase con uno de varios comportamientos +* Necesita diferentes variantes de un algoritmo. Por ejemplo, puede definir algoritmos que reflejen diferentes compensaciones espacio/tiempo. Las estrategias pueden utilizarse cuando estas variantes se implementan como una jerarquía de clases de algoritmos +* Un algoritmo utiliza datos que los clientes no deberían conocer. Utilice el patrón Strategy para evitar exponer estructuras de datos complejas específicas del algoritmo. +* Una clase define muchos comportamientos, y éstos aparecen como múltiples sentencias condicionales en sus operaciones. En lugar de muchas condicionales, mueva las ramas condicionales relacionadas a su propia clase Strategy. + +## Tutorial + +* [Strategy Pattern Tutorial](https://www.journaldev.com/1754/strategy-design-pattern-in-java-example-tutorial) + +## Créditos + +* [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59) +* [Functional Programming in Java: Harnessing the Power of Java 8 Lambda Expressions](https://www.amazon.com/gp/product/1937785467/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1937785467&linkCode=as2&tag=javadesignpat-20&linkId=7e4e2fb7a141631491534255252fd08b) +* [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b) +* [Refactoring to Patterns](https://www.amazon.com/gp/product/0321213351/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321213351&linkCode=as2&tag=javadesignpat-20&linkId=2a76fcb387234bc71b1c61150b3cc3a7) diff --git a/localization/es/strategy/etc/strategy_urm.png b/localization/es/strategy/etc/strategy_urm.png new file mode 100644 index 0000000000000000000000000000000000000000..67d19acae62d2f4b36ca6dbe9e28aaf91f659ae8 GIT binary patch literal 143387 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 Zl30hkOwC^G@j~P!%l+2-XkY(u;otDb3PAt> literal 0 HcmV?d00001 diff --git a/localization/es/subclass-sandbox/README.md b/localization/es/subclass-sandbox/README.md new file mode 100644 index 000000000000..efc97b9e6e1c --- /dev/null +++ b/localization/es/subclass-sandbox/README.md @@ -0,0 +1,112 @@ +--- +title: Subclass Sandbox +category: Behavioral +language: es +tag: + - Game programming +--- + +## Propósito +El patrón Subclass Sandbox describe una idea básica, aunque no tiene una mecánica muy detallada. Necesitarás el patrón cuando tengas varias subclases similares. Si tienes que hacer un pequeño cambio, entonces cambia la clase base, mientras que todas las subclases no deberían tener que ser tocadas. Así que la clase base tiene que ser capaz de proporcionar todas las operaciones que una clase derivada necesita realizar. + +## Explicación +Ejemplo del mundo real +> Consideremos que queremos crear algunos superpoderes en el juego, y necesitan moverse acompañados de un efecto de sonido y desovar partículas. ¿Crear muchas clases que contengan métodos similares o necesitar una clase base para derivarlos? El patrón subclase-base te permite tratar este problema de la segunda manera. + +En palabras sencillas +> El subclass-sandbox consiste en trasladar los métodos solapados en las subclases a una clase base que reduzca la tasa de redundancia en las clases. + +Wikipedia dice +> A base class defines an abstract sandbox method and several provided operations. Marking them protected makes it clear that they are for use by derived classes. Each derived sandboxed subclass implements the sandbox method using the provided operations. + +**Ejemplo programático** +Comenzamos con la clase base `Superpower`. Contiene un método abstracto sandbox `active()` y algunas operaciones proporcionadas. + +``` +public abstract class Superpower { + + protected Logger logger; + + protected abstract void activate(); + + protected void move(double x, double y, double z) { + logger.info("Move to ( " + x + ", " + y + ", " + z + " )"); + } + + protected void playSound(String soundName, int volume) { + logger.info("Play " + soundName + " with volume " + volume); + } + + protected void spawnParticles(String particleType, int count) { + logger.info("Spawn " + count + " particle with type " + particleType); + } +} +``` +A continuación podemos crear una subclase derivada sandboxed que implemente el método sandbox usando las operaciones proporcionadas. Aquí está la primera Superpower: +``` +public class SkyLaunch extends Superpower { + + public SkyLaunch() { + super(); + logger = LoggerFactory.getLogger(SkyLaunch.class); + } + + @Override + protected void activate() { + move(0, 0, 20); + playSound("SKYLAUNCH_SOUND", 1); + spawnParticles("SKYLAUNCH_PARTICLE", 100); + } +} +``` +Aquí está la segunda Superpower. +``` +public class GroundDive extends Superpower { + + public GroundDive() { + super(); + logger = LoggerFactory.getLogger(GroundDive.class); + } + + @Override + protected void activate() { + move(0, 0, -20); + playSound("GROUNDDIVE_SOUND", 5); + spawnParticles("GROUNDDIVE_PARTICLE", 20); + } +} +``` +Por último, aquí están los superpower en activo. +``` + LOGGER.info("Use superpower: sky launch"); + var skyLaunch = new SkyLaunch(); + skyLaunch.activate(); + LOGGER.info("Use superpower: ground dive"); + var groundDive = new GroundDive(); + groundDive.activate(); +``` +Salida del programa: +``` +// Use superpower: sky launch +// Move to ( 0.0, 0.0, 20.0 ) +// Play SKYLAUNCH_SOUND with volume 1 +// Spawn 100 particle with type SKYLAUNCH_PARTICLE +// Use superpower: ground dive +// Move to ( 0.0, 0.0, -20.0 ) +// Play GROUNDDIVE_SOUND with volume 5 +// Spawn 20 particle with type GROUNDDIVE_PARTICLE +``` +## Diagrama de clases +![alt text](./etc/subclass-sandbox.urm.png "Subclass Sandbox pattern class diagram") + +## Aplicabilidad +El patrón Subclass Sandbox es un patrón muy simple y común que se encuentra en muchas bases de código, incluso fuera de los juegos. Si tienes un método protegido no virtual por ahí, probablemente ya estés usando algo como esto. Subclass Sandbox es un buen ajuste cuando: + +- Usted tiene una clase base con un número de clases derivadas. +- La clase base es capaz de proporcionar todas las operaciones que una clase derivada puede necesitar realizar. +- Hay solapamiento de comportamiento en las subclases y desea que sea más fácil compartir código entre ellas. +- Usted quiere minimizar el acoplamiento entre las clases derivadas y el resto del programa + +## Créditos + +* [Game Programming Patterns - Subclass Sandbox](https://gameprogrammingpatterns.com/subclass-sandbox.html) diff --git a/localization/es/subclass-sandbox/etc/subclass-sandbox.urm.png b/localization/es/subclass-sandbox/etc/subclass-sandbox.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..db81e12cc815e3deea076db34574ac9f096b625c GIT binary patch literal 22259 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 CTVlTe literal 0 HcmV?d00001 From 20e804ba9528e2b179a1ae1f177544d8ebafaead Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 6 Apr 2024 10:14:46 +0300 Subject: [PATCH 047/580] docs: improvements to the Context Object docs --- context-object/README.md | 136 ++++++++---------- .../context/object/ServiceContext.java | 1 - 2 files changed, 61 insertions(+), 76 deletions(-) diff --git a/context-object/README.md b/context-object/README.md index 15848371bccc..711c91ddc63d 100644 --- a/context-object/README.md +++ b/context-object/README.md @@ -1,74 +1,49 @@ --- -title: Context object -category: Creational +title: Context Object +category: Behavioral language: en tags: -- Data access + - Context + - Decoupling + - Encapsulation --- -## Name / classification - -Context Object - ## Also known as -Context, Encapsulate Context +* Context +* Context Encapsulation +* Context Holder ## Intent -Decouple data from protocol-specific classes and store the scoped data in an object independent -of the underlying protocol technology. +Encapsulate the context (state and behaviors) relevant to the user or the request being processed in order to decouple application components from the complexities of the environment. ## Explanation Real-world example -> This application has different layers labelled A, B and C with each extracting specific information -> from a similar context for further use in the software. Passing down each pieces of information -> individually would be inefficient, a method to efficiently store and pass information is needed. +> This application has different layers labelled A, B and C with each extracting specific information from a similar context for further use in the software. Passing down each pieces of information individually would be inefficient, a method to efficiently store and pass information is needed. In plain words -> Create an object and store the data there and pass this object to where it is needed. +> Create an object to store the context data and pass it where needed. [Core J2EE Patterns](http://corej2eepatterns.com/ContextObject.htm) says -> Use a Context Object to encapsulate state in a protocol-independent way to be shared throughout your application. +> Use a Context Object to encapsulate state in a protocol-independent way to be shared throughout your application. **Programmatic Example** -We define what data a service context object contains. +Define the data that the service context object contains. ```Java +@Getter +@Setter public class ServiceContext { - String ACCOUNT_SERVICE, SESSION_SERVICE, SEARCH_SERVICE; - - public void setACCOUNT_SERVICE(String ACCOUNT_SERVICE) { - this.ACCOUNT_SERVICE = ACCOUNT_SERVICE; - } - - public void setSESSION_SERVICE(String SESSION_SERVICE) { - this.SESSION_SERVICE = SESSION_SERVICE; - } - - public void setSEARCH_SERVICE(String SEARCH_SERVICE) { - this.SEARCH_SERVICE = SEARCH_SERVICE; - } - - public String getACCOUNT_SERVICE() { - return ACCOUNT_SERVICE; - } - - public String getSESSION_SERVICE() { - return SESSION_SERVICE; - } - - public String getSEARCH_SERVICE() { - return SEARCH_SERVICE; - } - - public String toString() { return ACCOUNT_SERVICE + " " + SESSION_SERVICE + " " + SEARCH_SERVICE;} + String accountService; + String sessionService; + String searchService; } ``` @@ -83,10 +58,10 @@ public class ServiceContextFactory { } ``` -Instantiate the context object in the first layer and the adjoining layer upcalls the context in the current layer, which -then further structures the object. +Instantiate the context object in the first layer. The adjoining layer calls the context in the current layer, which then further structures the object. ```Java +@Getter public class LayerA { private static ServiceContext context; @@ -95,15 +70,12 @@ public class LayerA { context = ServiceContextFactory.createContext(); } - public static ServiceContext getContext() { - return context; - } - public void addAccountInfo(String accountService) { context.setACCOUNT_SERVICE(accountService); } } +@Getter public class LayerB { private static ServiceContext context; @@ -112,15 +84,12 @@ public class LayerB { this.context = layerA.getContext(); } - public static ServiceContext getContext() { - return context; - } - public void addSessionInfo(String sessionService) { context.setSESSION_SERVICE(sessionService); } } +@Getter public class LayerC { public static ServiceContext context; @@ -129,54 +98,71 @@ public class LayerC { this.context = layerB.getContext(); } - public static ServiceContext getContext() { - return context; - } - public void addSearchInfo(String searchService) { context.setSEARCH_SERVICE(searchService); } } ``` + Here is the context object and layers in action. ```Java -var layerA = new LayerA(); -layerA.addAccountInfo(SERVICE); -LOGGER.info("Context = {}",layerA.getContext()); -var layerB = new LayerB(layerA); -layerB.addSessionInfo(SERVICE); -LOGGER.info("Context = {}",layerB.getContext()); -var layerC = new LayerC(layerB); -layerC.addSearchInfo(SERVICE); -LOGGER.info("Context = {}",layerC.getContext()); +var layerA=new LayerA(); + layerA.addAccountInfo(SERVICE); + LOGGER.info("Context = {}",layerA.getContext()); + var layerB=new LayerB(layerA); + layerB.addSessionInfo(SERVICE); + LOGGER.info("Context = {}",layerB.getContext()); + var layerC=new LayerC(layerB); + layerC.addSearchInfo(SERVICE); + LOGGER.info("Context = {}",layerC.getContext()); ``` Program output: ```Java -Context = SERVICE null null -Context = SERVICE SERVICE null -Context = SERVICE SERVICE SERVICE +Context=SERVICE null null + Context=SERVICE SERVICE null + Context=SERVICE SERVICE SERVICE ``` ## Class diagram ![alt text](./etc/context-object.png "Context object") -## Application +## Applicability -Use the Context Object pattern for: - -* Sharing information across different system layers. -* Decoupling software data from protocol-specific contexts. -* Exposing only the relevant API's within the context. +* When there is a need to abstract and encapsulate context information from different parts of an application to avoid cluttering the business logic with environment-specific code. +* In web applications, to encapsulate request-specific information and make it easily accessible throughout the application without passing it explicitly between functions or components. +* In distributed systems, to encapsulate contextual information about the task being performed, user preferences, or security credentials, facilitating their propagation across different components and services. ## Known uses + +* Web application frameworks often implement a Context Object to encapsulate HTTP request and response objects, session information, and other request-specific data. +* Enterprise applications use Context Objects to manage and propagate transactional information, security credentials, and user-specific settings across different layers and services. * [Spring: ApplicationContext](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/ApplicationContext.html) * [Oracle: SecurityContext](https://docs.oracle.com/javaee/7/api/javax/ws/rs/core/SecurityContext.html) * [Oracle: ServletContext](https://docs.oracle.com/javaee/6/api/javax/servlet/ServletContext.html) +## Consequences + +Benefits: + +* Decoupling: Components and services are decoupled from the specificities of the execution environment, enhancing modularity and maintainability. +* Centralization: Contextual information is centralized in one place, making it easier to manage, access, and debug. +* Flexibility: The pattern allows for flexible and dynamic context management, which can adapt to changes in the environment or requirements. + +Trade-offs: + +* Overhead: Introducing a Context Object can add overhead in terms of performance, especially if not implemented efficiently. +* Complexity: If the Context Object is not well-designed, it can become a bloated and complex monolith, difficult to manage and understand. + +## Related Patterns + +* [Singleton](https://java-design-patterns.com/patterns/singleton/): The Context Object is often implemented as a Singleton to ensure a global point of access. +* [Strategy](https://java-design-patterns.com/patterns/strategy/): Context Objects can use Strategies to adapt their behavior based on the context they encapsulate. +* [Decorator](https://java-design-patterns.com/patterns/decorator/): Can be used to dynamically add responsibilities to the Context Object. + ## Credits * [Core J2EE Design Patterns](https://amzn.to/3IhcY9w) diff --git a/context-object/src/main/java/com/iluwatar/context/object/ServiceContext.java b/context-object/src/main/java/com/iluwatar/context/object/ServiceContext.java index dcd4e1450602..2092ddf7898b 100644 --- a/context-object/src/main/java/com/iluwatar/context/object/ServiceContext.java +++ b/context-object/src/main/java/com/iluwatar/context/object/ServiceContext.java @@ -26,7 +26,6 @@ import lombok.Getter; import lombok.Setter; -import lombok.ToString; /** * Where context objects are defined. From 8f777cdc981877545194e513ac87f336f2e6fc00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 6 Apr 2024 10:43:40 +0300 Subject: [PATCH 048/580] refactor: converter pattern docs and refactoring --- converter/README.md | 120 +++++++++++------- .../java/com/iluwatar/converter/User.java | 18 +-- .../com/iluwatar/converter/UserConverter.java | 5 +- .../java/com/iluwatar/converter/UserDto.java | 20 +-- .../java/com/iluwatar/converter/AppTest.java | 1 - .../com/iluwatar/converter/ConverterTest.java | 16 +-- 6 files changed, 87 insertions(+), 93 deletions(-) diff --git a/converter/README.md b/converter/README.md index f5d9921d5115..aa782f37d335 100644 --- a/converter/README.md +++ b/converter/README.md @@ -1,25 +1,27 @@ --- title: Converter -category: Creational +category: Structural language: en tag: - - Decoupling + - Compatibility + - Data transformation + - Object mapping --- +## Also known as + +* Mapper +* Translator + ## Intent -The purpose of the Converter pattern is to provide a generic, common way of bidirectional -conversion between corresponding types, allowing a clean implementation in which the types do not -need to be aware of each other. Moreover, the Converter pattern introduces bidirectional collection -mapping, reducing a boilerplate code to minimum. +The purpose of the Converter pattern is to provide a generic, common way of bidirectional conversion between corresponding types, allowing a clean implementation in which the types do not need to be aware of each other. Moreover, the Converter pattern introduces bidirectional collection mapping, reducing a boilerplate code to minimum. ## Explanation Real world example -> In real world applications it is often the case that database layer consists of entities that need -> to be mapped into DTOs for use on the business logic layer. Similar mapping is done for -> potentially huge amount of classes and we need a generic way to achieve this. +> In real world applications it is often the case that database layer consists of entities that need to be mapped into DTOs for use on the business logic layer. Similar mapping is done for potentially huge amount of classes, and we need a generic way to achieve this. In plain words @@ -27,35 +29,34 @@ In plain words **Programmatic Example** -We need a generic solution for the mapping problem. To achieve this, let's introduce a generic -converter. +We need a generic solution for the mapping problem. To achieve this, let's introduce a generic converter. ```java public class Converter { - private final Function fromDto; - private final Function fromEntity; + private final Function fromDto; + private final Function fromEntity; - public Converter(final Function fromDto, final Function fromEntity) { - this.fromDto = fromDto; - this.fromEntity = fromEntity; - } + public Converter(final Function fromDto, final Function fromEntity) { + this.fromDto = fromDto; + this.fromEntity = fromEntity; + } - public final U convertFromDto(final T dto) { - return fromDto.apply(dto); - } + public final U convertFromDto(final T dto) { + return fromDto.apply(dto); + } - public final T convertFromEntity(final U entity) { - return fromEntity.apply(entity); - } + public final T convertFromEntity(final U entity) { + return fromEntity.apply(entity); + } - public final List createFromDtos(final Collection dtos) { - return dtos.stream().map(this::convertFromDto).collect(Collectors.toList()); - } + public final List createFromDtos(final Collection dtos) { + return dtos.stream().map(this::convertFromDto).collect(Collectors.toList()); + } - public final List createFromEntities(final Collection entities) { - return entities.stream().map(this::convertFromEntity).collect(Collectors.toList()); - } + public final List createFromEntities(final Collection entities) { + return entities.stream().map(this::convertFromEntity).collect(Collectors.toList()); + } } ``` @@ -64,27 +65,26 @@ The specialized converters inherit from this base class as follows. ```java public class UserConverter extends Converter { - public UserConverter() { - super(UserConverter::convertToEntity, UserConverter::convertToDto); - } - - private static UserDto convertToDto(User user) { - return new UserDto(user.getFirstName(), user.getLastName(), user.isActive(), user.getUserId()); - } + public UserConverter() { + super(UserConverter::convertToEntity, UserConverter::convertToDto); + } - private static User convertToEntity(UserDto dto) { - return new User(dto.getFirstName(), dto.getLastName(), dto.isActive(), dto.getEmail()); - } + private static UserDto convertToDto(User user) { + return new UserDto(user.firstName(), user.lastName(), user.active(), user.userId()); + } + private static User convertToEntity(UserDto dto) { + return new User(dto.firstName(), dto.lastName(), dto.active(), dto.email()); + } } ``` Now mapping between `User` and `UserDto` becomes trivial. ```java -var userConverter = new UserConverter(); -var dtoUser = new UserDto("John", "Doe", true, "whatever[at]wherever.com"); -var user = userConverter.convertFromDto(dtoUser); +var userConverter=new UserConverter(); + var dtoUser=new UserDto("John","Doe",true,"whatever[at]wherever.com"); + var user=userConverter.convertFromDto(dtoUser); ``` ## Class diagram @@ -95,11 +95,37 @@ var user = userConverter.convertFromDto(dtoUser); Use the Converter Pattern in the following situations: -* When you have types that logically correspond with each other and you need to convert entities -between them. -* When you want to provide different ways of types conversions depending on the context. -* Whenever you introduce a DTO (Data transfer object), you will probably need to convert it into the -domain equivalence. +* When there are types that logically correspond with each other, and there is a need to convert between them. +* In applications that interact with external systems or services that require data in a specific format. +* For legacy systems integration where data models differ significantly from newer systems. +* When aiming to encapsulate conversion logic to promote single responsibility and cleaner code. + +## Known Uses + +* Data Transfer Objects (DTOs) conversions in multi-layered applications. +* Adapting third-party data structures or API responses to internal models. +* ORM (Object-Relational Mapping) frameworks for mapping between database records and domain objects. +* Microservices architecture for data exchange between different services. + +## Consequences + +Benefits: + +* Separation of Concerns: Encapsulates conversion logic in a single component, keeping the rest of the application unaware of the conversion details. +* Reusability: Converter components can be reused across the application or even in different applications. +* Flexibility: Makes it easy to add new conversions without impacting existing code, adhering to the [Open/Closed Principle](https://java-design-patterns.com/principles/#open-closed-principle). +* Interoperability: Facilitates communication between different systems or application layers by translating data formats. + +Trade-offs: + +* Overhead: Introducing converters can add complexity and potential performance overhead, especially in systems with numerous data formats. +* Duplication: There's a risk of duplicating model definitions if not carefully managed, leading to increased maintenance. + +## Related Patterns + +* [Adapter](https://java-design-patterns.com/patterns/adapter/): Similar in intent to adapting interfaces, but Converter focuses on data models. +* [Facade](https://java-design-patterns.com/patterns/facade/): Provides a simplified interface to a complex system, which might involve data conversion. +* [Strategy](https://java-design-patterns.com/patterns/strategy/): Converters can use different strategies for conversion, especially when multiple formats are involved. ## Credits diff --git a/converter/src/main/java/com/iluwatar/converter/User.java b/converter/src/main/java/com/iluwatar/converter/User.java index ab6a878cb16b..a8287af76614 100644 --- a/converter/src/main/java/com/iluwatar/converter/User.java +++ b/converter/src/main/java/com/iluwatar/converter/User.java @@ -24,21 +24,7 @@ */ package com.iluwatar.converter; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.ToString; - /** - * User class. + * User record. */ -@ToString -@EqualsAndHashCode -@Getter -@RequiredArgsConstructor -public class User { - private final String firstName; - private final String lastName; - private final boolean active; - private final String userId; -} +public record User(String firstName, String lastName, boolean active, String userId) {} diff --git a/converter/src/main/java/com/iluwatar/converter/UserConverter.java b/converter/src/main/java/com/iluwatar/converter/UserConverter.java index 862b684ece5a..4ded637129c8 100644 --- a/converter/src/main/java/com/iluwatar/converter/UserConverter.java +++ b/converter/src/main/java/com/iluwatar/converter/UserConverter.java @@ -34,11 +34,10 @@ public UserConverter() { } private static UserDto convertToDto(User user) { - return new UserDto(user.getFirstName(), user.getLastName(), user.isActive(), user.getUserId()); + return new UserDto(user.firstName(), user.lastName(), user.active(), user.userId()); } private static User convertToEntity(UserDto dto) { - return new User(dto.getFirstName(), dto.getLastName(), dto.isActive(), dto.getEmail()); + return new User(dto.firstName(), dto.lastName(), dto.active(), dto.email()); } - } diff --git a/converter/src/main/java/com/iluwatar/converter/UserDto.java b/converter/src/main/java/com/iluwatar/converter/UserDto.java index ba028ca9d5cd..9703292b7058 100644 --- a/converter/src/main/java/com/iluwatar/converter/UserDto.java +++ b/converter/src/main/java/com/iluwatar/converter/UserDto.java @@ -24,23 +24,7 @@ */ package com.iluwatar.converter; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.ToString; - /** - * User DTO class. + * UserDto record. */ -@RequiredArgsConstructor -@Getter -@EqualsAndHashCode -@ToString -public class UserDto { - - private final String firstName; - private final String lastName; - private final boolean active; - private final String email; - -} +public record UserDto(String firstName, String lastName, boolean active, String email) {} diff --git a/converter/src/test/java/com/iluwatar/converter/AppTest.java b/converter/src/test/java/com/iluwatar/converter/AppTest.java index 164e8a9bb034..c22a0e7d66da 100644 --- a/converter/src/test/java/com/iluwatar/converter/AppTest.java +++ b/converter/src/test/java/com/iluwatar/converter/AppTest.java @@ -35,7 +35,6 @@ class AppTest { /** * Issue: Add at least one assertion to this test case. - * * Solution: Inserted assertion to check whether the execution of the main method in {@link App#main(String[])} * throws an exception. */ diff --git a/converter/src/test/java/com/iluwatar/converter/ConverterTest.java b/converter/src/test/java/com/iluwatar/converter/ConverterTest.java index df0b85736a9e..d2f9c6a85123 100644 --- a/converter/src/test/java/com/iluwatar/converter/ConverterTest.java +++ b/converter/src/test/java/com/iluwatar/converter/ConverterTest.java @@ -65,20 +65,20 @@ void testConversionsStartingFromDto() { void testCustomConverter() { var converter = new Converter( userDto -> new User( - userDto.getFirstName(), - userDto.getLastName(), - userDto.isActive(), + userDto.firstName(), + userDto.lastName(), + userDto.active(), String.valueOf(new Random().nextInt()) ), user -> new UserDto( - user.getFirstName(), - user.getLastName(), - user.isActive(), - user.getFirstName().toLowerCase() + user.getLastName().toLowerCase() + "@whatever.com") + user.firstName(), + user.lastName(), + user.active(), + user.firstName().toLowerCase() + user.lastName().toLowerCase() + "@whatever.com") ); var u1 = new User("John", "Doe", false, "12324"); var userDto = converter.convertFromEntity(u1); - assertEquals("johndoe@whatever.com", userDto.getEmail()); + assertEquals("johndoe@whatever.com", userDto.email()); } /** From faac96b21b3074cc7196713ab029810b68db4961 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 6 Apr 2024 13:35:40 +0300 Subject: [PATCH 049/580] docs: Explanation for CQRS (#2896) * refactor * fix run app * remove apptest --- cqrs/README.md | 78 ++++++++++++++++++++++++++++++++++---- cqrs/pom.xml | 100 ++++++++++++++++++++++++------------------------- 2 files changed, 120 insertions(+), 58 deletions(-) diff --git a/cqrs/README.md b/cqrs/README.md index 6ac6061ef70e..e4af36bc3c51 100644 --- a/cqrs/README.md +++ b/cqrs/README.md @@ -3,25 +3,89 @@ title: CQRS category: Architectural language: en tag: - - Performance - - Cloud distributed + - Event-driven + - Performance + - Scalability --- ## Intent -CQRS Command Query Responsibility Segregation - Separate the query side from the command side. + +CQRS aims to segregate the operations that modify the state of an application (commands) from the operations that read the state (queries). This separation allows for more flexible and optimized designs, especially in complex systems. + +## Explanation + +Real world example + +> Imagine a modern library where the tasks of borrowing and returning books (commands) are handled at the front desk, while the task of searching for books and reading them (queries) happens in the reading area. The front desk optimizes for transaction efficiency and record-keeping, ensuring books are properly checked in and out. Meanwhile, the reading area is optimized for comfort and accessibility, making it easy for readers to find and engage with the books. This separation improves the library's overall efficiency and user experience, much like the CQRS pattern enhances a software system's performance and maintainability. + +In plain words + +> The CQRS design pattern separates the actions of modifying data (commands) from the actions of retrieving data (queries) to enhance performance, scalability, and maintainability in software systems. + +**Programmatic Example** + +One way to implement the Command Query Responsibility Segregation (CQRS) pattern is to separate the read and write operations into different services. + +1. Command Service: The `CommandServiceImpl` class is used for write operations. It provides methods to create authors and books, and to add books to authors. Here's a snippet of how it's used: + +```java +var commands=new CommandServiceImpl(); + commands.authorCreated(AppConstants.E_EVANS,"Eric Evans","evans@email.com"); + commands.bookAddedToAuthor("Domain-Driven Design",60.08,AppConstants.E_EVANS); +``` + +2. Query Service: The `QueryServiceImpl` class is used for read operations. It provides methods to get author and book details. Here's a snippet of how it's used: + +```java +var queries=new QueryServiceImpl(); + var evans=queries.getAuthorByUsername(AppConstants.E_EVANS); + var dddBook=queries.getBook("Domain-Driven Design"); +``` + +This separation of concerns allows for flexibility in how the application handles data access and manipulation, and is a key aspect of the CQRS pattern. ## Class diagram + ![alt text](./etc/cqrs.png "CQRS") ## Applicability -Use the CQRS pattern when -* You want to scale the queries and commands independently. -* You want to use different data models for queries and commands. Useful when dealing with complex domains. -* You want to use architectures like event sourcing or task based UI. +* Systems requiring distinct models for read and write operations for scalability and maintainability. +* Complex domain models where the task of updating objects differs significantly from the task of reading object data. +* Scenarios where performance optimization for read operations is crucial, and the system can benefit from different data models or databases for reads and writes. + +## Known Uses + +* Distributed Systems and Microservices Architecture, where different services manage read and write responsibilities. +* Event-Sourced Systems, where changes to the application state are stored as a sequence of events. +* High-Performance Web Applications, segregating read and write databases to optimize load handling. + +## Consequences + +Benefits: + +* Scalability: By separating read and write models, each can be scaled independently according to their specific demands. +* Optimization: Allows for the optimization of read models for query efficiency and write models for transactional integrity. +* Maintainability: Reduces complexity by separating the concerns, leading to cleaner, more maintainable code. +* Flexibility: Offers the flexibility to choose different technologies for the read and write sides according to their requirements. + +Trade-Offs: + +* Complexity: Introduces complexity due to synchronization between read and write models, especially in consistency maintenance. +* Overhead: Might be an overkill for simple systems where the benefits do not outweigh the additional complexity. +* Learning Curve: Requires a deeper understanding and careful design to implement effectively, increasing the initial learning curve. + +## Related Patterns + +* [Event Sourcing](https://java-design-patterns.com/patterns/event-sourcing/): Often used in conjunction with CQRS, where changes to the application state are stored as a sequence of events. +* Domain-Driven Design (DDD): CQRS fits well within the DDD context, providing clear boundaries and separation of concerns. +* [Repository](https://java-design-patterns.com/patterns/repository/): Can be used to abstract the data layer, providing a more seamless integration between the command and query sides. ## Credits +* [Patterns, Principles, and Practices of Domain-Driven Design](https://amzn.to/3vNV4Hm) +* [Implementing Domain-Driven Design](https://amzn.to/3TJN2HH) +* [Microsoft .NET: Architecting Applications for the Enterprise](https://amzn.to/4aktRes) * [Greg Young - CQRS, Task Based UIs, Event Sourcing agh!](http://codebetter.com/gregyoung/2010/02/16/cqrs-task-based-uis-event-sourcing-agh/) * [Martin Fowler - CQRS](https://martinfowler.com/bliki/CQRS.html) * [Oliver Wolf - CQRS for Great Good](https://www.youtube.com/watch?v=Ge53swja9Dw) diff --git a/cqrs/pom.xml b/cqrs/pom.xml index 58ad7f29a62c..ec78265cff66 100644 --- a/cqrs/pom.xml +++ b/cqrs/pom.xml @@ -26,55 +26,53 @@ --> - 4.0.0 - - com.iluwatar - java-design-patterns - 1.26.0-SNAPSHOT - - cqrs - - - org.junit.jupiter - junit-jupiter-engine - test - - - com.h2database - h2 - - - org.hibernate - hibernate-core - - - org.glassfish.jaxb - jaxb-runtime - test - - - javax.xml.bind - jaxb-api - test - - - - - - org.apache.maven.plugins - maven-assembly-plugin - - - - - - com.iluwatar.cqrs.app.App - - - - - - - - + 4.0.0 + + com.iluwatar + java-design-patterns + 1.26.0-SNAPSHOT + + cqrs + + + org.junit.jupiter + junit-jupiter-engine + test + + + com.h2database + h2 + + + org.hibernate + hibernate-core + + + org.glassfish.jaxb + jaxb-runtime + + + javax.xml.bind + jaxb-api + + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + + + + com.iluwatar.cqrs.app.App + + + + + + + + From 85823b47325c5cb45e3c657d022b5ff13a6863e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 6 Apr 2024 19:56:37 +0300 Subject: [PATCH 050/580] docs: improve crtp documentation --- cqrs/README.md | 2 +- .../main/java/com/iluwatar/cqrs/app/App.java | 2 +- crtp/README.md | 161 +++++++++++------- 3 files changed, 103 insertions(+), 62 deletions(-) diff --git a/cqrs/README.md b/cqrs/README.md index e4af36bc3c51..cd389cef85e8 100644 --- a/cqrs/README.md +++ b/cqrs/README.md @@ -10,7 +10,7 @@ tag: ## Intent -CQRS aims to segregate the operations that modify the state of an application (commands) from the operations that read the state (queries). This separation allows for more flexible and optimized designs, especially in complex systems. +Command Query Responsibility Segregation (CQRS) aims to segregate the operations that modify the state of an application (commands) from the operations that read the state (queries). This separation allows for more flexible and optimized designs, especially in complex systems. ## Explanation diff --git a/cqrs/src/main/java/com/iluwatar/cqrs/app/App.java b/cqrs/src/main/java/com/iluwatar/cqrs/app/App.java index 6e73318afffb..4552ede3d7d7 100644 --- a/cqrs/src/main/java/com/iluwatar/cqrs/app/App.java +++ b/cqrs/src/main/java/com/iluwatar/cqrs/app/App.java @@ -32,7 +32,7 @@ /** * CQRS : Command Query Responsibility Segregation. A pattern used to separate query services from - * commands or writes services. The pattern is very simple but it has many consequences. For + * commands or writes services. The pattern is very simple, but it has many consequences. For * example, it can be used to tackle down a complex domain, or to use other architectures that were * hard to implement with the classical way. * diff --git a/crtp/README.md b/crtp/README.md index 67627f44da7f..cfb438c06895 100644 --- a/crtp/README.md +++ b/crtp/README.md @@ -1,31 +1,29 @@ --- -title: Curiously Recurring Template Pattern +title: CRTP language: en category: Structural tag: -- Extensibility -- Instantiation + - Extensibility + - Idiom + - Instantiation --- -## Name / classification - -Curiously Recurring Template Pattern - ## Also known as -Recursive Type Bound, Recursive Generic +* Recursive Type Bound +* Recursive Generic +* Static Polymorphism +* Mixin Inheritance ## Intent -Allow derived components to inherit certain functionalities from a base component that are compatible with the derived type. +Curiously Recurring Template Pattern (CRTP) is used to achieve a form of static polymorphism by having a class template derive from a template instantiation of its own class, allowing method overriding and polymorphic behavior at compile time rather than at runtime. ## Explanation Real-world example -> For a mixed martial arts promotion that is planning an event, ensuring that the fights are organized between athletes -> of the same weight class is crucial. This prevents mismatches between fighters of significantly different sizes, such -> as a heavyweight facing off against a bantamweight. +> For a mixed martial arts promotion that is planning an event, ensuring that the fights are organized between athletes of the same weight class is crucial. This prevents mismatches between fighters of significantly different sizes, such as a heavyweight facing off against a bantamweight. In plain words @@ -33,82 +31,102 @@ In plain words Wikipedia says -> The curiously recurring template pattern (CRTP) is an idiom, originally in C++, in which a class X -> derives from a class template instantiation using X itself as a template argument. +> The curiously recurring template pattern (CRTP) is an idiom, originally in C++, in which a class X derives from a class template instantiation using X itself as a template argument. **Programmatic example** -Let's define the generic interface Fighter +Let's define the generic interface Fighter. ```java public interface Fighter { - void fight(T t); + void fight(T t); } ``` -The MMAFighter class is used to instantiate fighters distinguished by their weight class +The MMAFighter class is used to instantiate fighters distinguished by their weight class. ```java public class MmaFighter> implements Fighter { - private final String name; - private final String surname; - private final String nickName; - private final String speciality; - - public MmaFighter(String name, String surname, String nickName, String speciality) { - this.name = name; - this.surname = surname; - this.nickName = nickName; - this.speciality = speciality; - } - - @Override - public void fight(T opponent) { - LOGGER.info("{} is going to fight against {}", this, opponent); - } - - @Override - public String toString() { - return name + " \"" + nickName + "\" " + surname; - } + private final String + name; + private final String + surname; + private final String + nickName; + private final String + speciality; + + public MmaFighter( + String name, + String surname, + String nickName, + String speciality) { + this.name = + name; + this.surname = + surname; + this.nickName = + nickName; + this.speciality = + speciality; + } + + @Override + public void fight( + T opponent) { + LOGGER.info( + "{} is going to fight against {}", + this, + opponent); + } + + @Override + public String toString() { + return + name + + " \"" + + nickName + + "\" " + + surname; + } +} ``` -The followings are some subtypes of MmaFighter +The followings are some subtypes of MmaFighter. ```java class MmaBantamweightFighter extends MmaFighter { - public MmaBantamweightFighter(String name, String surname, String nickName, String speciality) { - super(name, surname, nickName, speciality); - } + public MmaBantamweightFighter(String name, String surname, String nickName, String speciality) { + super(name, surname, nickName, speciality); + } } public class MmaHeavyweightFighter extends MmaFighter { - public MmaHeavyweightFighter(String name, String surname, String nickName, String speciality) { - super(name, surname, nickName, speciality); - } + public MmaHeavyweightFighter(String name, String surname, String nickName, String speciality) { + super(name, surname, nickName, speciality); + } } ``` -A fighter is allowed to fight an opponent of the same weight classes, if the opponent is of a different weight class -there is an error +A fighter is allowed to fight an opponent of the same weight classes. If the opponent is of a different weight class, an error is raised. ```java -MmaBantamweightFighter fighter1 = new MmaBantamweightFighter("Joe", "Johnson", "The Geek", "Muay Thai"); -MmaBantamweightFighter fighter2 = new MmaBantamweightFighter("Ed", "Edwards", "The Problem Solver", "Judo"); -fighter1.fight(fighter2); // This is fine +MmaBantamweightFighter fighter1=new MmaBantamweightFighter("Joe","Johnson","The Geek","Muay Thai"); + MmaBantamweightFighter fighter2=new MmaBantamweightFighter("Ed","Edwards","The Problem Solver","Judo"); + fighter1.fight(fighter2); // This is fine -MmaHeavyweightFighter fighter3 = new MmaHeavyweightFighter("Dave", "Davidson", "The Bug Smasher", "Kickboxing"); -MmaHeavyweightFighter fighter4 = new MmaHeavyweightFighter("Jack", "Jackson", "The Pragmatic", "Brazilian Jiu-Jitsu"); -fighter3.fight(fighter4); // This is fine too + MmaHeavyweightFighter fighter3=new MmaHeavyweightFighter("Dave","Davidson","The Bug Smasher","Kickboxing"); + MmaHeavyweightFighter fighter4=new MmaHeavyweightFighter("Jack","Jackson","The Pragmatic","Brazilian Jiu-Jitsu"); + fighter3.fight(fighter4); // This is fine too -fighter1.fight(fighter3); // This will raise a compilation error + fighter1.fight(fighter3); // This will raise a compilation error ``` ## Class diagram @@ -117,22 +135,45 @@ fighter1.fight(fighter3); // This will raise a compilation error ## Applicability -Use the Curiously Recurring Template Pattern when - -* You have type conflicts when chaining methods in an object hierarchy -* You want to use a parameterized class method that can accept subclasses of the class as arguments, allowing it to be applied to objects that inherit from the class +* When you need to extend the functionality of a class through inheritance but prefer compile-time polymorphism to runtime polymorphism for efficiency reasons. +* When you want to avoid the overhead of virtual functions but still achieve polymorphic behavior. +* In template metaprogramming to provide implementations of functions or policies that can be selected at compile time. +* You have type conflicts when chaining methods in an object hierarchy. +* You want to use a parameterized class method that can accept subclasses of the class as arguments, allowing it to be applied to objects that inherit from the class. * You want certain methods to work only with instances of the same type, such as for achieving mutual comparability. ## Tutorials * [The NuaH Blog](https://nuah.livejournal.com/328187.html) -* Yogesh Umesh Vaity answer to [What does "Recursive type bound" in Generics mean?](https://stackoverflow.com/questions/7385949/what-does-recursive-type-bound-in-generics-mean) +* Yogesh Umesh Vaity's answer to [What does "Recursive type bound" in Generics mean?](https://stackoverflow.com/questions/7385949/what-does-recursive-type-bound-in-generics-mean) ## Known uses +* Implementing compile-time polymorphic interfaces in template libraries. +* Enhancing code reuse in libraries where performance is critical, like in mathematical computations, embedded systems, and real-time processing applications. * [java.lang.Enum](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Enum.html) +## Consequences + +Benefits: + +* Elimination of virtual function call overhead, enhancing performance. +* Safe reuse of the base class code without the risks associated with multiple inheritances. +* Greater flexibility and extensibility in compile-time polymorphism scenarios. + +Trade-offs: + +* Increased complexity in understanding and debugging due to the interplay of templates and inheritance. +* Can lead to code bloat because each instantiation of a template results in a new class. +* Less flexibility compared to runtime polymorphism as the behavior must be determined entirely at compile time. + +## Related Patterns + +* [Factory Method](https://java-design-patterns.com/patterns/factory-method/): Can be used in conjunction with CRTP to instantiate derived classes without knowing their specific types. +* [Strategy](https://java-design-patterns.com/patterns/strategy/): CRTP can implement compile-time strategy selection. +* [Template Method](https://java-design-patterns.com/patterns/template-method/): Similar in structure but differs in that CRTP achieves behavior variation through compile-time polymorphism. + ## Credits +* [Effective Java](https://www.amazon.com/gp/product/0134685997/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0134685997&linkCode=as2&tag=javadesignpat-20&linkId=4e349f4b3ff8c50123f8147c828e53eb) * [How do I decrypt "Enum>"?](http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeParameters.html#FAQ106) -* Chapter 5 Generics, Item 30 in [Effective Java](https://www.amazon.com/gp/product/0134685997/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0134685997&linkCode=as2&tag=javadesignpat-20&linkId=4e349f4b3ff8c50123f8147c828e53eb) From b1f8a16b9c42add590c05c02d5c965a9ca28b7a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 6 Apr 2024 20:31:19 +0300 Subject: [PATCH 051/580] docs: update currying --- currying/README.md | 249 ++++++++++-------- .../java/com/iluwatar/currying/Genre.java | 2 +- 2 files changed, 142 insertions(+), 109 deletions(-) diff --git a/currying/README.md b/currying/README.md index 9f32c9066e06..19bc5aa72bea 100644 --- a/currying/README.md +++ b/currying/README.md @@ -1,156 +1,170 @@ --- title: Currying -category: Functional +category: Functional language: en tag: -- Decoupling + - Functional decomposition --- -## Name / classification -Currying +## Also known as + +* Partial Function Application ## Intent -Currying decomposes a function that takes multiple arguments into a sequence of functions that each take a single argument. -Curried functions are useful since they can be used to create new functions with lower arity to perform more specialised tasks -in a concise and readable manner. This is done via partial application. + +Currying decomposes a function that takes multiple arguments into a sequence of functions that each take a single argument. It helps in creating a higher-order function by partial application of its arguments. ## Explanation + Real-world example -> Consider a librarian who wants to populate their library with books. The librarian wants functions which can create -> books corresponding to specific genres and authors. Currying makes this possible by writing a curried book builder -> function and utilising partial application. + +> Consider a librarian who wants to populate their library with books. The librarian wants functions which can create books corresponding to specific genres and authors. Currying makes this possible by writing a curried book builder function and utilising partial application. In plain words -> Decompose a function that take multiple arguments into multiple functions that take a single argument. + +> Decompose a function that take multiple arguments into multiple functions that take a single argument. Wikipedia says -> Currying is the technique of converting a function that takes multiple arguments into a sequence of functions that -> each take a single argument. Given a function $f:(X \times Y) \rightarrow Z$, currying constructs a new function -> $h:X \rightarrow (Y\rightarrow Z)$. $h$ takes an argument from $X$ and returns a function which maps $Y$ to $Z$. Hence, -> $h(x)(y) = f(x, y)$. -Programmatic example +> In mathematics and computer science, currying is the technique of translating a function that takes multiple arguments into a sequence of families of functions, each taking a single argument. + +Programmatic example + We have a `Book` class and `Genre` enum. + ```java public class Book { - private final Genre genre; - private final String author; - private final String title; - private final LocalDate publicationDate; - - Book(Genre genre, String author, String title, LocalDate publicationDate) { - this.genre = genre; - this.author = author; - this.title = title; - this.publicationDate = publicationDate; - } + private final Genre genre; + private final String author; + private final String title; + private final LocalDate publicationDate; + + Book(Genre genre, String author, String title, LocalDate publicationDate) { + this.genre = genre; + this.author = author; + this.title = title; + this.publicationDate = publicationDate; + } } public enum Genre { - FANTASY, - HORROR, - SCI_FI; + FANTASY, + HORROR, + SCI_FI; } ``` + We could easily create a `Book` object with the following method: + ```java -Book createBook(Genre genre, String author, String title, LocalDate publicationDate) { - return new Book(genre, author, title, publicationDate); -} +Book createBook(Genre genre,String author,String title,LocalDate publicationDate){ + return new Book(genre,author,title,publicationDate); + } ``` + However, what if we only wanted to create books from the `FANTASY` genre? We could pass in the `FANTASY` parameter on each method call; however, this is repetitive. We could define a new method specifically for creating `FANTASY` books; however, it is infeasible to create a new method for each book genre. The solution is to create a curried function. + ```java -static Function>>> book_creator - = genre - -> author - -> title - -> publicationDate - -> new Book(genre, author, title, publicationDate); +static Function>>>book_creator + =genre + ->author + ->title + ->publicationDate + ->new Book(genre,author,title,publicationDate); ``` + Note that the order of the parameters is important. `genre` must come before `author`, `author` must come before `title` and so on. We must be considerate of this when writing curried functions to take full advantage of partial application. Using the above function, we can define a new function `fantasyBookFunc`, to generate `FANTASY` books as follows: + ```java -Function>> fantasyBookFunc = Book.book_creator.apply(Genre.FANTASY); +Function>>fantasyBookFunc=Book.book_creator.apply(Genre.FANTASY); ``` -Unfortunately, the type signature of `BOOK_CREATOR` and `fantasyBookFunc` are difficult to read and understand. We can improve this by using the [builder pattern](https://java-design-patterns.com/patterns/builder/) and [functional interfaces](https://www.geeksforgeeks.org/functional-interfaces-java/#:~:text=A%20functional%20interface%20is%20an,any%20number%20of%20default%20methods). + +Unfortunately, the type signature of `BOOK_CREATOR` and `fantasyBookFunc` are difficult to read and understand. We can improve this by using the [builder pattern](https://java-design-patterns.com/patterns/builder/) and [functional interfaces](https://www.geeksforgeeks.org/functional-interfaces-java/#:~:text=A%20functional%20interface%20is%20an,any%20number%20of%20default%20methods). + ```java -public static AddGenre builder() { - return genre - -> author - -> title - -> publicationDate - -> new Book(genre, author, title, publicationDate); -} +public static AddGenre builder(){ + return genre + ->author + ->title + ->publicationDate + ->new Book(genre,author,title,publicationDate); + } public interface AddGenre { -Book.AddAuthor withGenre(Genre genre); + Book.AddAuthor withGenre(Genre genre); } public interface AddAuthor { -Book.AddTitle withAuthor(String author); + Book.AddTitle withAuthor(String author); } public interface AddTitle { -Book.AddPublicationDate withTitle(String title); + Book.AddPublicationDate withTitle(String title); } public interface AddPublicationDate { -Book withPublicationDate(LocalDate publicationDate); + Book withPublicationDate(LocalDate publicationDate); } ``` -The semantics of the `builder` function can easily be understood. The `builder` function returns a function `AddGenre`, which adds the genre to the book. Similarity, the `AddGenre` function returns another function `AddTitle`, which adds the title to the book and so on, until the `AddPublicationDate` function returns a `Book`. -For example, we could create a `Book` as follows: + +The semantics of the `builder` function can easily be understood. The `builder` function returns a function `AddGenre`, which adds the genre to the book. Similarity, the `AddGenre` function returns another function `AddTitle`, which adds the title to the book and so on, until the `AddPublicationDate` function returns a `Book`. For example, we could create a `Book` as follows: + ```java -Book book = Book.builder().withGenre(Genre.FANTASY) +Book book=Book.builder().withGenre(Genre.FANTASY) .withAuthor("Author") .withTitle("Title") - .withPublicationDate(LocalDate.of(2000, 7, 2)); + .withPublicationDate(LocalDate.of(2000,7,2)); ``` + The below example demonstrates how partial application can be used with the `builder` function to create specialised book builder functions. + ```java -public static void main(String[] args) { - LOGGER.info("Librarian begins their work."); - - // Defining genre book functions - Book.AddAuthor fantasyBookFunc = Book.builder().withGenre(Genre.FANTASY); - Book.AddAuthor horrorBookFunc = Book.builder().withGenre(Genre.HORROR); - Book.AddAuthor scifiBookFunc = Book.builder().withGenre(Genre.SCI_FI); - - // Defining author book functions - Book.AddTitle kingFantasyBooksFunc = fantasyBookFunc.withAuthor("Stephen King"); - Book.AddTitle kingHorrorBooksFunc = horrorBookFunc.withAuthor("Stephen King"); - Book.AddTitle rowlingFantasyBooksFunc = fantasyBookFunc.withAuthor("J.K. Rowling"); - - // Creates books by Stephen King (horror and fantasy genres) - Book shining = kingHorrorBooksFunc.withTitle("The Shining") - .withPublicationDate(LocalDate.of(1977, 1, 28)); - Book darkTower = kingFantasyBooksFunc.withTitle("The Dark Tower: Gunslinger") - .withPublicationDate(LocalDate.of(1982, 6, 10)); - - // Creates fantasy books by J.K. Rowling - Book chamberOfSecrets = rowlingFantasyBooksFunc.withTitle("Harry Potter and the Chamber of Secrets") - .withPublicationDate(LocalDate.of(1998, 7, 2)); - - // Create sci-fi books - Book dune = scifiBookFunc.withAuthor("Frank Herbert") - .withTitle("Dune") - .withPublicationDate(LocalDate.of(1965, 8, 1)); - Book foundation = scifiBookFunc.withAuthor("Isaac Asimov") - .withTitle("Foundation") - .withPublicationDate(LocalDate.of(1942, 5, 1)); - - LOGGER.info("Stephen King Books:"); - LOGGER.info(shining.toString()); - LOGGER.info(darkTower.toString()); - - LOGGER.info("J.K. Rowling Books:"); - LOGGER.info(chamberOfSecrets.toString()); - - LOGGER.info("Sci-fi Books:"); - LOGGER.info(dune.toString()); - LOGGER.info(foundation.toString()); -} +public static void main(String[]args){ + LOGGER.info("Librarian begins their work."); + + // Defining genre book functions + Book.AddAuthor fantasyBookFunc=Book.builder().withGenre(Genre.FANTASY); + Book.AddAuthor horrorBookFunc=Book.builder().withGenre(Genre.HORROR); + Book.AddAuthor scifiBookFunc=Book.builder().withGenre(Genre.SCI_FI); + + // Defining author book functions + Book.AddTitle kingFantasyBooksFunc=fantasyBookFunc.withAuthor("Stephen King"); + Book.AddTitle kingHorrorBooksFunc=horrorBookFunc.withAuthor("Stephen King"); + Book.AddTitle rowlingFantasyBooksFunc=fantasyBookFunc.withAuthor("J.K. Rowling"); + + // Creates books by Stephen King (horror and fantasy genres) + Book shining=kingHorrorBooksFunc.withTitle("The Shining") + .withPublicationDate(LocalDate.of(1977,1,28)); + Book darkTower=kingFantasyBooksFunc.withTitle("The Dark Tower: Gunslinger") + .withPublicationDate(LocalDate.of(1982,6,10)); + + // Creates fantasy books by J.K. Rowling + Book chamberOfSecrets=rowlingFantasyBooksFunc.withTitle("Harry Potter and the Chamber of Secrets") + .withPublicationDate(LocalDate.of(1998,7,2)); + + // Create sci-fi books + Book dune=scifiBookFunc.withAuthor("Frank Herbert") + .withTitle("Dune") + .withPublicationDate(LocalDate.of(1965,8,1)); + Book foundation=scifiBookFunc.withAuthor("Isaac Asimov") + .withTitle("Foundation") + .withPublicationDate(LocalDate.of(1942,5,1)); + + LOGGER.info("Stephen King Books:"); + LOGGER.info(shining.toString()); + LOGGER.info(darkTower.toString()); + + LOGGER.info("J.K. Rowling Books:"); + LOGGER.info(chamberOfSecrets.toString()); + + LOGGER.info("Sci-fi Books:"); + LOGGER.info(dune.toString()); + LOGGER.info(foundation.toString()); + } ``` + Program output: + ``` Librarian begins their work. Stephen King Books: @@ -164,28 +178,47 @@ Book{genre=SCI_FI, author='Isaac Asimov', title='Foundation', publicationDate=19 ``` ## Class diagram + ![currying-uml](./etc/currying.urm.png) ## Applicability -A curried function which has only been passed some of its arguments is called a partial application. Partial application -allows for the creation of functions with some pre-defined data in their scope, since partial application can be used to -create specialised functions with lower arity. This abstraction can help keep code readable and concise. Therefore, currying is useful when frequently calling functions with fixed parameters. + +* When functions need to be called with some arguments preset. +* In functional programming languages or paradigms to simplify functions that take multiple arguments. +* To improve code reusability and composability by breaking down functions into simpler, unary functions. ## Known uses -Most functional programming languages support curried functions. A popular example is [Haskell](https://www.haskell.org/), in which all functions are considered curried. + +* Functional programming languages like Haskell, Scala, and JavaScript. +* Event handling in UIs where a function with specific parameters needs to be triggered upon an event. +* APIs that require configuration with multiple parameters. ## Consequences -Pros -* Currying allows for partial application, which can be used to create specialised functions concisely. -Cons -* The order of the parameters in a curried function is important since we want to take advantage of partial application. It is best to input the most general parameters first and input specific parameters last. -* As shown in the programmatic example above, curried functions with several parameters have a cumbersome type signature (in Java). +Benefits: + +* Increases function reusability by allowing the creation of specialized functions from more generic ones. +* Enhances code readability and maintainability by breaking complex functions into simpler, single-argument functions. +* Facilitates function composition, leading to more declarative and concise code. + +Trade-offs: + +* Can lead to performance overhead due to the creation of additional closures. +* May make debugging more challenging, as it introduces additional layers of function calls. +* Can be less intuitive for developers unfamiliar with functional programming concepts. +* As shown in the programmatic example above, curried functions with several parameters have a cumbersome type signature in Java. ## Related patterns -* [Builder pattern](https://java-design-patterns.com/patterns/builder/) + +* Function Composition: Currying is often used in conjunction with function composition to enable more readable and concise code. +* [Decorator](https://java-design-patterns.com/patterns/decorator/): While not the same, currying shares the decorator pattern's concept of wrapping functionality. +* [Factory](https://java-design-patterns.com/patterns/factory/): Currying can be used to create factory functions that produce variations of a function with certain arguments preset. ## Credits + +* [Java 8 in Action: Lambdas, Streams, and functional-style programming](https://amzn.to/3J6vEaW) +* [Modern Java in Action: Lambdas, streams, functional and reactive programming](https://amzn.to/3J6vJLM) +* [Functional Programming in Java: Harnessing the Power Of Java 8 Lambda Expressions](https://amzn.to/3TKeZPD) * [Currying in Java](https://www.baeldung.com/java-currying) * [What Is Currying in Programming](https://towardsdatascience.com/what-is-currying-in-programming-56fd57103431#:~:text=Currying%20is%20helpful%20when%20you,concise%2C%20and%20more%20readable%20solution.) * [Why the fudge should I use currying?](https://medium.com/dailyjs/why-the-fudge-should-i-use-currying-84e4000c8743) diff --git a/currying/src/main/java/com/iluwatar/currying/Genre.java b/currying/src/main/java/com/iluwatar/currying/Genre.java index 58e639f4ce3c..8e9fbfd63e6d 100644 --- a/currying/src/main/java/com/iluwatar/currying/Genre.java +++ b/currying/src/main/java/com/iluwatar/currying/Genre.java @@ -30,5 +30,5 @@ public enum Genre { FANTASY, HORROR, - SCIFI; + SCIFI } From b376f1de9a538f60b679928ba4bb544c70951dcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 7 Apr 2024 10:37:05 +0300 Subject: [PATCH 052/580] docs: update dao --- dao/README.md | 203 +++++++++++------- .../com/iluwatar/dao/CustomException.java | 10 +- .../test/java/com/iluwatar/dao/AppTest.java | 1 - .../com/iluwatar/dao/DbCustomerDaoTest.java | 22 +- .../iluwatar/dao/InMemoryCustomerDaoTest.java | 4 +- 5 files changed, 131 insertions(+), 109 deletions(-) diff --git a/dao/README.md b/dao/README.md index 3b08987172c5..7376c353f915 100644 --- a/dao/README.md +++ b/dao/README.md @@ -1,30 +1,35 @@ --- title: Data Access Object -category: Architectural +category: Structural language: en tag: - - Data access + - Data access + - Layered architecture + - Persistence --- +## Also known as + +* Data Access Layer +* DAO + ## Intent -Object provides an abstract interface to some type of database or other persistence mechanism. +The Data Access Object (DAO) design pattern aims to separate the application's business logic from the persistence layer, typically a database or any other storage mechanism. By using DAOs, the application can access and manipulate data without being dependent on the specific database implementation details. ## Explanation Real world example -> There's a set of customers that need to be persisted to database. Additionally we need the whole -> set of CRUD (create/read/update/delete) operations so we can operate on customers easily. +> There's a set of customers that need to be persisted to database. Additionally, we need the whole set of CRUD (create/read/update/delete) operations, so we can operate on customers easily. In plain words -> DAO is an interface we provide over the base persistence mechanism. +> DAO is an interface we provide over the base persistence mechanism. Wikipedia says -> In computer software, a data access object (DAO) is a pattern that provides an abstract interface -> to some type of database or other persistence mechanism. +> In computer software, a data access object (DAO) is a pattern that provides an abstract interface to some type of database or other persistence mechanism. **Programmatic Example** @@ -33,114 +38,113 @@ Walking through our customers example, here's the basic `Customer` entity. ```java public class Customer { - private int id; - private String firstName; - private String lastName; + private int id; + private String firstName; + private String lastName; - public Customer(int id, String firstName, String lastName) { - this.id = id; - this.firstName = firstName; - this.lastName = lastName; - } - // getters and setters -> - ... + public Customer(int id, String firstName, String lastName) { + this.id = id; + this.firstName = firstName; + this.lastName = lastName; + } } ``` -Here's the `CustomerDao` interface and two different implementations for it. `InMemoryCustomerDao` -keeps a simple map of customers in memory while `DBCustomerDao` is the real RDBMS implementation. +Here's the `CustomerDao` interface and two different implementations for it. `InMemoryCustomerDao` keeps a simple map of customers in memory while `DBCustomerDao` is the real RDBMS implementation. ```java public interface CustomerDao { - Stream getAll() throws Exception; + Stream getAll() throws Exception; - Optional getById(int id) throws Exception; + Optional getById(int id) throws Exception; - boolean add(Customer customer) throws Exception; + boolean add(Customer customer) throws Exception; - boolean update(Customer customer) throws Exception; + boolean update(Customer customer) throws Exception; - boolean delete(Customer customer) throws Exception; + boolean delete(Customer customer) throws Exception; } public class InMemoryCustomerDao implements CustomerDao { - private final Map idToCustomer = new HashMap<>(); + private final Map idToCustomer = new HashMap<>(); - // implement the interface using the map - ... + // implement the interface using the map } @Slf4j public class DbCustomerDao implements CustomerDao { - private final DataSource dataSource; + private final DataSource + dataSource; - public DbCustomerDao(DataSource dataSource) { - this.dataSource = dataSource; + public DbCustomerDao( + DataSource dataSource) { + this.dataSource = + dataSource; } // implement the interface using the data source - ... +} ``` -Finally here's how we use our DAO to manage customers. +Finally, here's how we use our DAO to manage customers. ```java - final var dataSource = createDataSource(); - createSchema(dataSource); - final var customerDao = new DbCustomerDao(dataSource); - - addCustomers(customerDao); - log.info(ALL_CUSTOMERS); - try (var customerStream = customerDao.getAll()) { - customerStream.forEach((customer) -> log.info(customer.toString())); - } - log.info("customerDao.getCustomerById(2): " + customerDao.getById(2)); - final var customer = new Customer(4, "Dan", "Danson"); - customerDao.add(customer); - log.info(ALL_CUSTOMERS + customerDao.getAll()); - customer.setFirstName("Daniel"); - customer.setLastName("Danielson"); - customerDao.update(customer); - log.info(ALL_CUSTOMERS); - try (var customerStream = customerDao.getAll()) { - customerStream.forEach((cust) -> log.info(cust.toString())); - } - customerDao.delete(customer); - log.info(ALL_CUSTOMERS + customerDao.getAll()); - - deleteSchema(dataSource); + final var dataSource=createDataSource(); + createSchema(dataSource); +final var customerDao=new DbCustomerDao(dataSource); + + addCustomers(customerDao); + log.info(ALL_CUSTOMERS); + try(var customerStream=customerDao.getAll()){ + customerStream.forEach((customer)->log.info(customer.toString())); + } + log.info("customerDao.getCustomerById(2): "+customerDao.getById(2)); +final var customer=new Customer(4,"Dan","Danson"); + customerDao.add(customer); + log.info(ALL_CUSTOMERS+customerDao.getAll()); + customer.setFirstName("Daniel"); + customer.setLastName("Danielson"); + customerDao.update(customer); + log.info(ALL_CUSTOMERS); + try(var customerStream=customerDao.getAll()){ + customerStream.forEach((cust)->log.info(cust.toString())); + } + customerDao.delete(customer); + log.info(ALL_CUSTOMERS+customerDao.getAll()); + + deleteSchema(dataSource); ``` The program output: ```java -customerDao.getAllCustomers(): -Customer{id=1, firstName='Adam', lastName='Adamson'} -Customer{id=2, firstName='Bob', lastName='Bobson'} -Customer{id=3, firstName='Carl', lastName='Carlson'} -customerDao.getCustomerById(2): Optional[Customer{id=2, firstName='Bob', lastName='Bobson'}] -customerDao.getAllCustomers(): java.util.stream.ReferencePipeline$Head@7cef4e59 -customerDao.getAllCustomers(): -Customer{id=1, firstName='Adam', lastName='Adamson'} -Customer{id=2, firstName='Bob', lastName='Bobson'} -Customer{id=3, firstName='Carl', lastName='Carlson'} -Customer{id=4, firstName='Daniel', lastName='Danielson'} -customerDao.getAllCustomers(): java.util.stream.ReferencePipeline$Head@2db0f6b2 -customerDao.getAllCustomers(): -Customer{id=1, firstName='Adam', lastName='Adamson'} -Customer{id=2, firstName='Bob', lastName='Bobson'} -Customer{id=3, firstName='Carl', lastName='Carlson'} -customerDao.getCustomerById(2): Optional[Customer{id=2, firstName='Bob', lastName='Bobson'}] -customerDao.getAllCustomers(): java.util.stream.ReferencePipeline$Head@12c8a2c0 -customerDao.getAllCustomers(): -Customer{id=1, firstName='Adam', lastName='Adamson'} -Customer{id=2, firstName='Bob', lastName='Bobson'} -Customer{id=3, firstName='Carl', lastName='Carlson'} -Customer{id=4, firstName='Daniel', lastName='Danielson'} -customerDao.getAllCustomers(): java.util.stream.ReferencePipeline$Head@6ec8211c +customerDao.getAllCustomers(): + Customer{id=1,firstName='Adam',lastName='Adamson'} + Customer{id=2,firstName='Bob',lastName='Bobson'} + Customer{id=3,firstName='Carl',lastName='Carlson'} + customerDao.getCustomerById(2):Optional[Customer{id=2,firstName='Bob',lastName='Bobson'}] + customerDao.getAllCustomers():java.util.stream.ReferencePipeline$Head@7cef4e59 + customerDao.getAllCustomers(): + Customer{id=1,firstName='Adam',lastName='Adamson'} + Customer{id=2,firstName='Bob',lastName='Bobson'} + Customer{id=3,firstName='Carl',lastName='Carlson'} + Customer{id=4,firstName='Daniel',lastName='Danielson'} + customerDao.getAllCustomers():java.util.stream.ReferencePipeline$Head@2db0f6b2 + customerDao.getAllCustomers(): + Customer{id=1,firstName='Adam',lastName='Adamson'} + Customer{id=2,firstName='Bob',lastName='Bobson'} + Customer{id=3,firstName='Carl',lastName='Carlson'} + customerDao.getCustomerById(2):Optional[Customer{id=2,firstName='Bob',lastName='Bobson'}] + customerDao.getAllCustomers():java.util.stream.ReferencePipeline$Head@12c8a2c0 + customerDao.getAllCustomers(): + Customer{id=1,firstName='Adam',lastName='Adamson'} + Customer{id=2,firstName='Bob',lastName='Bobson'} + Customer{id=3,firstName='Carl',lastName='Carlson'} + Customer{id=4,firstName='Daniel',lastName='Danielson'} + customerDao.getAllCustomers():java.util.stream.ReferencePipeline$Head@6ec8211c ``` ## Class diagram @@ -151,14 +155,47 @@ customerDao.getAllCustomers(): java.util.stream.ReferencePipeline$Head@6ec8211c Use the Data Access Object in any of the following situations: -* When you want to consolidate how the data layer is accessed. -* When you want to avoid writing multiple data retrieval/persistence layers. +* There is a need to abstract and encapsulate all access to the data source. +* The application needs to support multiple types of databases or storage mechanisms without significant code changes. +* You want to keep the database access clean and simple, and separate from business logic. ## Tutorials * [The DAO Pattern in Java](https://www.baeldung.com/java-dao-pattern) * [Data Access Object Pattern](https://www.tutorialspoint.com/design_pattern/data_access_object_pattern.htm) +## Known Uses + +* Enterprise applications that require database interaction. +* Applications requiring data access to be adaptable to multiple storage types (relational databases, XML files, flat files, etc.). +* Frameworks providing generic data access functionalities. + +## Consequences + +Benefits: + +* Decoupling: Separates the data access logic from the business logic, enhancing modularity and clarity. +* Reusability: DAOs can be reused across different parts of the application or even in different projects. +* Testability: Simplifies testing by allowing business logic to be tested separately from the data access logic. +* Flexibility: Makes it easier to switch underlying storage mechanisms with minimal impact on the application code. + +Trade-offs: + +* Layer Complexity: Introduces additional layers to the application, which can increase complexity and development time. +* Overhead: For simple applications, the DAO pattern might introduce more overhead than necessary. +* Learning Curve: Developers might need time to understand and implement the pattern effectively, especially in complex projects. + +## Related Patterns + +* [Service Layer](https://java-design-patterns.com/patterns/service-layer/): Often used in conjunction with the DAO pattern to define application's boundaries and its set of available operations. +* [Factory](https://java-design-patterns.com/patterns/factory/): Can be used to instantiate DAOs dynamically, providing flexibility in the choice of implementation. +* [Abstract Factory](https://java-design-patterns.com/patterns/abstract-factory/): Helps in abstracting the creation of DAOs, especially when supporting multiple databases or storage mechanisms. +* [Strategy](https://java-design-patterns.com/patterns/strategy/): Might be employed to change the data access strategy at runtime, depending on the context. + ## Credits * [J2EE Design Patterns](https://www.amazon.com/gp/product/0596004273/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596004273&linkCode=as2&tag=javadesignpat-20&linkId=48d37c67fb3d845b802fa9b619ad8f31) +* [Core J2EE Patterns: Best Practices and Design Strategies](https://amzn.to/49u3r91) +* [Patterns of Enterprise Application Architecture](https://amzn.to/3U5cxEI) +* [Expert One-on-One J2EE Design and Development](https://amzn.to/3vK3pfq) +* [Professional Java Development with the Spring Framework](https://amzn.to/49tANF0) diff --git a/dao/src/main/java/com/iluwatar/dao/CustomException.java b/dao/src/main/java/com/iluwatar/dao/CustomException.java index 4de6d9e43a4a..ce8ca56423a6 100644 --- a/dao/src/main/java/com/iluwatar/dao/CustomException.java +++ b/dao/src/main/java/com/iluwatar/dao/CustomException.java @@ -24,20 +24,16 @@ */ package com.iluwatar.dao; +import java.io.Serial; + /** * Custom exception. */ public class CustomException extends Exception { + @Serial 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/test/java/com/iluwatar/dao/AppTest.java b/dao/src/test/java/com/iluwatar/dao/AppTest.java index ee8f4f4a389a..64d8b2805eee 100644 --- a/dao/src/test/java/com/iluwatar/dao/AppTest.java +++ b/dao/src/test/java/com/iluwatar/dao/AppTest.java @@ -35,7 +35,6 @@ class AppTest { /** * Issue: Add at least one assertion to this test case. - * * Solution: Inserted assertion to check whether the execution of the main method in {@link App#main(String[])} * throws an exception. */ diff --git a/dao/src/test/java/com/iluwatar/dao/DbCustomerDaoTest.java b/dao/src/test/java/com/iluwatar/dao/DbCustomerDaoTest.java index cfa7e9882981..759ab155c2f2 100644 --- a/dao/src/test/java/com/iluwatar/dao/DbCustomerDaoTest.java +++ b/dao/src/test/java/com/iluwatar/dao/DbCustomerDaoTest.java @@ -87,7 +87,7 @@ void setUp() throws Exception { } /** - * Represents the scenario when DAO operations are being performed on a non existing customer. + * Represents the scenario when DAO operations are being performed on a non-existing customer. */ @Nested class NonExistingCustomer { @@ -206,39 +206,29 @@ private DataSource mockedDatasource() throws SQLException { @Test void addingACustomerFailsWithExceptionAsFeedbackToClient() { - assertThrows(Exception.class, () -> { - dao.add(new Customer(2, "Bernard", "Montgomery")); - }); + assertThrows(Exception.class, () -> dao.add(new Customer(2, "Bernard", "Montgomery"))); } @Test void deletingACustomerFailsWithExceptionAsFeedbackToTheClient() { - assertThrows(Exception.class, () -> { - dao.delete(existingCustomer); - }); + assertThrows(Exception.class, () -> dao.delete(existingCustomer)); } @Test void updatingACustomerFailsWithFeedbackToTheClient() { final var newFirstname = "Bernard"; final var newLastname = "Montgomery"; - assertThrows(Exception.class, () -> { - dao.update(new Customer(existingCustomer.getId(), newFirstname, newLastname)); - }); + assertThrows(Exception.class, () -> dao.update(new Customer(existingCustomer.getId(), newFirstname, newLastname))); } @Test void retrievingACustomerByIdFailsWithExceptionAsFeedbackToClient() { - assertThrows(Exception.class, () -> { - dao.getById(existingCustomer.getId()); - }); + assertThrows(Exception.class, () -> dao.getById(existingCustomer.getId())); } @Test void retrievingAllCustomersFailsWithExceptionAsFeedbackToClient() { - assertThrows(Exception.class, () -> { - dao.getAll(); - }); + assertThrows(Exception.class, () -> dao.getAll()); } } diff --git a/dao/src/test/java/com/iluwatar/dao/InMemoryCustomerDaoTest.java b/dao/src/test/java/com/iluwatar/dao/InMemoryCustomerDaoTest.java index 855dd01d3e0d..340a0920c7f1 100644 --- a/dao/src/test/java/com/iluwatar/dao/InMemoryCustomerDaoTest.java +++ b/dao/src/test/java/com/iluwatar/dao/InMemoryCustomerDaoTest.java @@ -48,7 +48,7 @@ void setUp() { } /** - * Represents the scenario when the DAO operations are being performed on a non existent + * Represents the scenario when the DAO operations are being performed on a non-existent * customer. */ @Nested @@ -78,7 +78,7 @@ void deletionShouldBeFailureAndNotAffectExistingCustomers() throws Exception { } @Test - void updationShouldBeFailureAndNotAffectExistingCustomers() throws Exception { + void updateShouldBeFailureAndNotAffectExistingCustomers() { final var nonExistingId = getNonExistingCustomerId(); final var newFirstname = "Douglas"; final var newLastname = "MacArthur"; From 356ba272720da7eb9cf3d622a4768c0957fa0e87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 7 Apr 2024 11:29:35 +0300 Subject: [PATCH 053/580] docs: update data bus --- data-bus/README.md | 218 ++++++++++++++++++++++++++------------------- 1 file changed, 128 insertions(+), 90 deletions(-) diff --git a/data-bus/README.md b/data-bus/README.md index 23585681b0d9..7524ee04be38 100644 --- a/data-bus/README.md +++ b/data-bus/README.md @@ -1,22 +1,28 @@ --- title: Data Bus -category: Architectural +category: Behavioral language: en tag: - - Decoupling + - Decoupling + - Event-driven + - Messaging + - Publish/subscribe --- +## Also known as + +* Event Bus +* Message Bus + ## Intent -Allows send of messages/events between components of an application -without them needing to know about each other. They only need to know -about the type of the message/event being sent. +The Data Bus design pattern aims to provide a centralized communication channel through which various components of a system can exchange data without being directly connected, thus promoting loose coupling and enhancing scalability and maintainability. ## Explanation Real world example -> Say you have an app that enables online bookings and participation of events. You want the app to send notifications such as event advertisements to everyone who is an ordinary member of the community or organisation holding the events. However, you do not want to send such notifications like advertisements to the event administrators or organisers but you desire to send them and them only the time whenever a new advertisement is sent to all members of the community. The Data Bus enables you to selectively notify people of a community by type, whether it be ordinary community members or event administrators, by making their classes or components only accept messages of a certain type. Ultimately, there is no need for the components or classes of ordinary community members nor administrators to know anything about you in terms of the classes or components you are using to notify the entire community except for the need to know the type of the messages you are sending. +> Say you have an app that enables online bookings and participation of events. You want the app to send notifications such as event advertisements to everyone who is an ordinary member of the community or organisation holding the events. However, you do not want to send such notifications like advertisements to the event administrators or organisers, but you desire to send them and them only the time whenever a new advertisement is sent to all members of the community. The Data Bus enables you to selectively notify people of a community by type, whether it be ordinary community members or event administrators, by making their classes or components only accept messages of a certain type. Ultimately, there is no need for the components or classes of ordinary community members nor administrators to know anything about you in terms of the classes or components you are using to notify the entire community except for the need to know the type of the messages you are sending. In plain words @@ -29,77 +35,78 @@ Translating the online events app example above, we firstly have our Member inte ```java public interface Member extends Consumer { - void accept(DataType event); + void accept(DataType event); } ``` -Then we have a databus to subscribe someone to be a member or unsubcribe, and also to publish an event so to notify every member in the community. +Then we have a data bus to subscribe someone to be a member or unsubscribe, and also to publish an event so to notify every member in the community. ```java public class DataBus { - private static final DataBus INSTANCE = new DataBus(); - - private final Set listeners = new HashSet<>(); - - public static DataBus getInstance() { - return INSTANCE; - } - - /** - * Register a member with the data-bus to start receiving events. - * - * @param member The member to register - */ - public void subscribe(final Member member) { - - this.listeners.add(member); - } - - /** - * Deregister a member to stop receiving events. - * - * @param member The member to deregister - */ - public void unsubscribe(final Member member) { - this.listeners.remove(member); - } - - /** - * Publish and event to all members. - * - * @param event The event - */ - public void publish(final DataType event) { - event.setDataBus(this); - - listeners.forEach( - listener -> listener.accept(event)); - } + private static final DataBus INSTANCE = new DataBus(); + + private final Set listeners = new HashSet<>(); + + public static DataBus getInstance() { + return INSTANCE; + } + + /** + * Register a member with the data-bus to start receiving events. + * + * @param member The member to register + */ + public void subscribe(final Member member) { + + this.listeners.add(member); + } + + /** + * Deregister a member to stop receiving events. + * + * @param member The member to deregister + */ + public void unsubscribe(final Member member) { + this.listeners.remove(member); + } + + /** + * Publish and event to all members. + * + * @param event The event + */ + public void publish(final DataType event) { + event.setDataBus(this); + + listeners.forEach( + listener -> listener.accept(event)); + } } ``` - + As you can see, the accept method is applied for each member under the publish method. - -Hence, as shown below, the accept method can be used to check the type of message to be published and successfully send/handle that message if the accept method has an instance for that message. Otherwise, the accept method cannot as is for the case of the MessageCollectorMember (the ordinary community members) when the type of message being sent is StartingData or StoppingData (information on the time whenever a new advertisement is sent to all members). + +Hence, as shown below, the accept method can be used to check the type of message to be published and successfully send/handle that message if the accept method has an instance for that message. Otherwise, the accept method cannot as is for the case of the MessageCollectorMember (the ordinary community members) when the type of message being sent is StartingData or StoppingData (information on the time whenever a new advertisement is sent to all members). ```java public class MessageCollectorMember implements Member { - private final String name; + private final String name; - private final List messages = new ArrayList<>(); + private final List messages = new ArrayList<>(); - public MessageCollectorMember(String name) { - this.name = name; - } + public MessageCollectorMember(String name) { + this.name = name; + } - @Override - public void accept(final DataType data) { - if (data instanceof MessageData) { - handleEvent((MessageData) data); + @Override + public void accept(final DataType data) { + if (data instanceof MessageData) { + handleEvent((MessageData) data); + } } - } +} ``` However, the StatusMember(the event administrators or organisers) can accept such types of messages as @@ -107,58 +114,89 @@ However, the StatusMember(the event administrators or organisers) can accept suc ```java public class StatusMember implements Member { - private final int id; + private final int id; - private LocalDateTime started; + private LocalDateTime started; - private LocalDateTime stopped; - @Override - public void accept(final DataType data) { - if (data instanceof StartingData) { - handleEvent((StartingData) data); - } else if (data instanceof StoppingData) { - handleEvent((StoppingData) data); + private LocalDateTime stopped; + + @Override + public void accept(final DataType data) { + if (data instanceof StartingData) { + handleEvent((StartingData) data); + } else if (data instanceof StoppingData) { + handleEvent((StoppingData) data); + } } - } +} ``` +Here is the App class to demonstrate the Data Bus pattern in action: -Thus, the data bus outputs as follows: - ```java class App { - public static void main(String[] args) { - final var bus = DataBus.getInstance(); - bus.subscribe(new StatusMember(1)); - bus.subscribe(new StatusMember(2)); - final var foo = new MessageCollectorMember("Foo"); - final var bar = new MessageCollectorMember("Bar"); - bus.subscribe(foo); - bus.publish(StartingData.of(LocalDateTime.now())); + public static void main(String[] args) { + final var bus = DataBus.getInstance(); + bus.subscribe(new StatusMember(1)); + bus.subscribe(new StatusMember(2)); + final var foo = new MessageCollectorMember("Foo"); + final var bar = new MessageCollectorMember("Bar"); + bus.subscribe(foo); + bus.publish(StartingData.of(LocalDateTime.now())); + } +} ``` - -//OUTPUT: +Thus, the data bus outputs as follows: + +``` //02:33:57.627 [main] INFO com.iluwatar.databus.members.StatusMember - Receiver 2 sees application started at 2022-10-26T02:33:57.613529100 //02:33:57.633 [main] INFO com.iluwatar.databus.members.StatusMember - Receiver 1 sees application started at 2022-10-26T02:33:57.613529100 +``` Evidently, due to MessageCollectorMembers only accepting messages of type MessageData and none of either StartingData nor StoppingData, the MessageCollectorMembers are prevented from seeing what the StatusMembers (the event administrators or organisers) are shown: information on the time whenever a new advertisement is sent to all members. - + ## Class diagram + ![data bus pattern uml diagram](./etc/data-bus.urm.png "Data Bus pattern") ## Applicability -Use Data Bus pattern when -* you want your components to decide themselves which messages/events they want to receive -* you want to have many-to-many communication -* you want your components to know nothing about each other +* When multiple components need to share data or events but direct coupling is undesirable. +* In complex systems where the flow of information varies dynamically. +* In distributed systems where components might be deployed across different environments. + +## Known Uses + +* Event handling systems in large-scale applications. +* Microservices architectures for inter-service communication. +* Real-time data processing systems, such as stock trading platforms. +* In frameworks like Spring, particularly with its application event mechanism. + +## Consequences + +Benefits: + +* Loose Coupling: Components can interact without having direct dependencies on each other. +* Flexibility: New subscribers or publishers can be added without impacting existing components. +* Scalability: The pattern supports scaling components independently. +* Reusability: The bus and components can be reused across different systems. + +Trade-offs: + +* Complexity: Introducing a data bus can add complexity to the system architecture. +* Performance Overhead: The additional layer of communication may introduce latency. +* Debugging Difficulty: Tracing data flow through the bus can be challenging, especially in systems with many events. ## Related Patterns -Data Bus is similar to -* Mediator pattern with Data Bus Members deciding for themselves if they want to accept any given message -* Observer pattern but supporting many-to-many communication -* Publish/Subscribe pattern with the Data Bus decoupling the publisher and the subscriber +* [Mediator](https://java-design-patterns.com/patterns/mediator/): Facilitates communication between components, but unlike Data Bus, it centralizes control. +* [Observer](https://java-design-patterns.com/patterns/observer/): Similar in nature to the publish-subscribe mechanism used in Data Bus for notifying changes to multiple objects. +* Publish/Subscribe: The Data Bus pattern is often implemented using the publish-subscribe mechanism, where publishers post messages to the bus without knowledge of the subscribers. + +## Credits + +* [Enterprise Integration Patterns](https://amzn.to/3J6WoYS) +* [Pattern-Oriented Software Architecture, Volume 4: A Pattern Language for Distributed Computing](https://amzn.to/3PTRGBM) From ea55eb4e58dc7c0b3517dfb92c3a9b7cec1f6954 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 7 Apr 2024 12:15:09 +0300 Subject: [PATCH 054/580] docs: data locality docs (#2899) --- data-locality/README.md | 126 ++++++++++++++++-- .../data/locality/ApplicationTest.java | 1 - 2 files changed, 116 insertions(+), 11 deletions(-) diff --git a/data-locality/README.md b/data-locality/README.md index 212bd663a08d..c44ba1a34fa5 100644 --- a/data-locality/README.md +++ b/data-locality/README.md @@ -1,29 +1,135 @@ --- title: Data Locality -category: Behavioral +category: Performance optimization language: en tag: - - Game programming - - Performance + - Caching + - Data access + - Game programming + - Memory management + - Performance --- +## Also known as + +* Cache-Friendly Design +* Data-Oriented Design + ## Intent -Accelerate memory access by arranging data to take advantage of CPU caching. -Modern CPUs have caches to speed up memory access. These can access memory adjacent to recently accessed memory much quicker. Take advantage of that to improve performance by increasing data locality keeping data in contiguous memory in the order that you process it. +The Data Locality design pattern aims to minimize data access times and improve cache utilization by arranging data in memory to take advantage of spatial locality. This pattern is particularly useful in high-performance computing and game development where access speed is crucial. + +## Explanation + +Real-world example + +> Consider a supermarket where items are arranged based on purchase patterns and categories for efficiency. Just like the Data Locality pattern organizes data in memory for quick access, the supermarket places frequently bought items together and in easily accessible areas. This layout minimizes the time shoppers spend searching for items, enhancing their shopping experience by ensuring that related and popular items are close at hand, much like how data locality improves cache utilization and reduces access latency in computing. + +In plain words + +> The Data Locality pattern organizes data in memory to reduce access times and improve performance by ensuring that data frequently accessed together is stored close together. + +Programmatic Example + +The Data Locality pattern is a design pattern that aims to improve performance by arranging data in memory to take advantage of spatial locality. This pattern is particularly useful in high-performance computing and game development where access speed is crucial. + +In the data-locality module, the pattern is demonstrated using a game loop that processes a bunch of game entities. These entities are decomposed into different domains: AI, physics, and rendering. + +The GameEntity class is the main class that represents a game entity. It contains an array of AiComponent, PhysicsComponent, and RenderComponent objects. These components represent different aspects of a game entity. + +```java +public class GameEntity { + private final AiComponent[] aiComponents; + private final PhysicsComponent[] physicsComponents; + private final RenderComponent[] renderComponents; +// ... +} +``` + +The GameEntity class has a start method that initializes all the components. + +```java +public void start() { + for (int i = 0; i < numEntities; i++) { + aiComponents[i] = new AiComponent(); + physicsComponents[i] = new PhysicsComponent(); + renderComponents[i] = new RenderComponent(); + } +} +``` + +The GameEntity class also has an update method that updates all the components. This method demonstrates the data locality pattern. Instead of updating all aspects of a single entity at a time (AI, physics, and rendering), it updates the same aspect (e.g., AI) for all entities first, then moves on to the next aspect (e.g., physics). This approach improves cache utilization because it's more likely that the data needed for the update is already in the cache. + +```java +public void update() { + for (int i = 0; i < numEntities; i++) { + aiComponents[i].update(); + } + for (int i = 0; i < numEntities; i++) { + physicsComponents[i].update(); + } + for (int i = 0; i < numEntities; i++) { + renderComponents[i].update(); + } +} +``` + +The Application class contains the main method that creates a GameEntity object and starts the game loop. + +```java +public class Application { + public static void main(String[] args) { + var gameEntity = new GameEntity(NUM_ENTITIES); + gameEntity.start(); + gameEntity.update(); + } +} +``` + +In this way, the data-locality module demonstrates the Data Locality pattern. By updating all components of the same type together, it increases the likelihood that the data needed for the update is already in the cache, thereby improving performance. ## Class diagram + ![alt text](./etc/data-locality.urm.png "Data Locality pattern class diagram") ## Applicability -* Like most optimizations, the first guideline for using the Data Locality pattern is when you have a performance problem. -* With this pattern specifically, you’ll also want to be sure your performance problems are caused by cache misses. +This pattern is applicable in scenarios where large datasets are processed and performance is critical. It's particularly useful in: + +* Game development for efficient rendering and physics calculations. +* High-performance computing tasks that require rapid access to large data sets. +* Real-time data processing systems where latency is a critical factor. + +## Known Uses + +* Game engines (e.g., Unity, Unreal Engine) to optimize entity and component data access. +* High-performance matrix libraries in scientific computing to optimize matrix operations. +* Real-time streaming data processing systems for efficient data manipulation and access. + +## Consequences + +Benefits: + +* Improved Cache Utilization: By enhancing spatial locality, data frequently accessed together is stored close together in memory, improving cache hit rates. +* Reduced Access Latency: Minimizes the time taken to fetch data from memory, leading to performance improvements. +* Enhanced Performance: Overall system performance is improved due to reduced memory access times and increased efficiency in data processing. + +Trade-offs: + +* Complexity in Implementation: Managing data layout can add complexity to the system design and implementation. +* Maintenance Overhead: As data access patterns evolve, the layout may need to be re-evaluated, adding to the maintenance overhead. +* Less Flexibility: The tight coupling of data layout to access patterns can reduce flexibility in how data structures are used and evolved over time. -## Real world example +## Related Patterns -* The [Artemis](http://gamadu.com/artemis/) game engine is one of the first and better-known frameworks that uses simple IDs for game entities. +* [Flyweight](https://java-design-patterns.com/patterns/flyweight/): Can be used in conjunction with Data Locality to share data efficiently among multiple objects. +* [Object Pool](https://java-design-patterns.com/patterns/object-pool/): Often used together to manage a group of initialized objects that can be reused, further optimizing memory usage and access. +* [Iterator](https://java-design-patterns.com/patterns/iterator/): Facilitates navigation through a collection of data laid out with data locality in mind. ## Credits -* [Game Programming Patterns Optimization Patterns: Data Locality](http://gameprogrammingpatterns.com/data-locality.html) \ No newline at end of file +* [Game Programming Patterns](https://amzn.to/3vK8c0d) +* [High-Performance Java Persistence](https://amzn.to/3TMc8Wd) +* [Java Performance: The Definitive Guide](https://amzn.to/3Ua392J) +* [Effective Java](https://amzn.to/4cGk2Jz) +* [Game Programming Patterns Optimization Patterns: Data Locality](http://gameprogrammingpatterns.com/data-locality.html) diff --git a/data-locality/src/test/java/com/iluwatar/data/locality/ApplicationTest.java b/data-locality/src/test/java/com/iluwatar/data/locality/ApplicationTest.java index 1f5986c9f2bc..1f1689425f41 100644 --- a/data-locality/src/test/java/com/iluwatar/data/locality/ApplicationTest.java +++ b/data-locality/src/test/java/com/iluwatar/data/locality/ApplicationTest.java @@ -36,7 +36,6 @@ class ApplicationTest { /** * Issue: Add at least one assertion to this test case. - * * Solution: Inserted assertion to check whether the execution of the main method in {@link Application#main(String[])} * throws an exception. */ From 39acd1d0fb3ba2d70acde009de52bfd3d356e189 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 7 Apr 2024 13:59:26 +0300 Subject: [PATCH 055/580] docs: data mapper docs (#2900) --- data-mapper/README.md | 235 ++++++++---------- .../datamapper/DataMapperException.java | 3 + .../java/com/iluwatar/datamapper/Student.java | 2 + .../datamapper/StudentDataMapperImpl.java | 6 +- .../java/com/iluwatar/datamapper/AppTest.java | 1 - .../com/iluwatar/datamapper/StudentTest.java | 2 +- 6 files changed, 110 insertions(+), 139 deletions(-) diff --git a/data-mapper/README.md b/data-mapper/README.md index 7f8b141ee71e..9bf3f1d5124e 100644 --- a/data-mapper/README.md +++ b/data-mapper/README.md @@ -1,183 +1,132 @@ --- title: Data Mapper -category: Architectural +category: Behavioral language: en tag: -- Decoupling + - Data access + - Decoupling + - Object mapping + - Persistence --- +## Also known as + +* Object-Relational Mapping (ORM) + ## Intent ->Data Mapper is the software layer that separates the in-memory objects from the database. ->Its responsibility is to transfer data between the objects and database and isolate them from each other. ->If we obtain a Data Mapper, it is not necessary for the in-memory object to know if the database exists or not. ->The user could directly manipulate the objects via Java command without having knowledge of SQL or database. + +The Data Mapper pattern aims to create an abstraction layer between the database and the business logic, allowing them to evolve independently. It maps data from the database objects to in-memory data structures and vice versa, minimizing direct dependencies between the application's core logic and the underlying database structure. ## Explanation Real world example ->When a user accesses a specific web page through a browser, he only needs to do several operations to the browser. -> The browser and the server will take the responsibility of saving data separately. -> You don't need to know the existence of the server or how to operate the server. + +> When a user accesses a specific web page through a browser, he only needs to do several operations to the browser. The browser and the server will take the responsibility of saving data separately. You don't need to know the existence of the server or how to operate the server. In plain words ->A layer of mappers that moves data between objects and a database while keeping them independent of each other. + +> A layer of mappers that moves data between objects and a database while keeping them independent of each other. Wikipedia says ->A Data Mapper is a Data Access Layer that performs bidirectional transfer of data between a persistent data store -> (often a relational database) and an in-memory data representation (the domain layer). The goal of the pattern is to -> keep the in-memory representation and the persistent data store independent of each other and the data mapper itself. -> This is useful when one needs to model and enforce strict business processes on the data in the domain layer that do -> not map neatly to the persistent data store. -**Programmatic Example** +> A Data Mapper is a Data Access Layer that performs bidirectional transfer of data between a persistent data store (often a relational database) and an in-memory data representation (the domain layer). The goal of the pattern is to keep the in-memory representation and the persistent data store independent of each other and the data mapper itself. This is useful when one needs to model and enforce strict business processes on the data in the domain layer that do not map neatly to the persistent data store. ->We have the student class to defining Students' attributes includes studentId, name and grade. ->We have an interface of StudentDataMapper to lists out the possible behaviour for all possible student mappers. ->And StudentDataMapperImpl class for the implementation of actions on Students Data. +**Programmatic Example** -```java +The Data Mapper is a design pattern that separates the in-memory objects from the database. Its responsibility is to transfer data between the two and also to isolate them from each other. This pattern promotes the [Single Responsibility Principle](https://java-design-patterns.com/principles/#single-responsibility-principle) and [Separation of Concerns](https://java-design-patterns.com/principles/#separation-of-concerns). -public final class Student implements Serializable { +In the data-mapper module, the pattern is demonstrated using a Student class and a StudentDataMapper interface. - private static final long serialVersionUID = 1L; +The Student class is a simple POJO (Plain Old Java Object) that represents a student. It has properties like studentId, name, and grade. - @EqualsAndHashCode.Include +```java +public class Student { private int studentId; private String name; private char grade; - - - public interface StudentDataMapper { - - Optional find(int studentId); - - void insert(Student student) throws DataMapperException; - - void update(Student student) throws DataMapperException; - - void delete(Student student) throws DataMapperException; - } - - public final class StudentDataMapperImpl implements StudentDataMapper { - @Override - public Optional find(int studentId) { - return this.getStudents().stream().filter(x -> x.getStudentId() == studentId).findFirst(); - } - - @Override - public void update(Student studentToBeUpdated) throws DataMapperException { - String name = studentToBeUpdated.getName(); - Integer index = Optional.of(studentToBeUpdated) - .map(Student::getStudentId) - .flatMap(this::find) - .map(students::indexOf) - .orElseThrow(() -> new DataMapperException("Student [" + name + "] is not found")); - students.set(index, studentToBeUpdated); - } - - @Override - public void insert(Student studentToBeInserted) throws DataMapperException { - Optional student = find(studentToBeInserted.getStudentId()); - if (student.isPresent()) { - String name = studentToBeInserted.getName(); - throw new DataMapperException("Student already [" + name + "] exists"); - } - - students.add(studentToBeInserted); - } - - @Override - public void delete(Student studentToBeDeleted) throws DataMapperException { - if (!students.remove(studentToBeDeleted)) { - String name = studentToBeDeleted.getName(); - throw new DataMapperException("Student [" + name + "] is not found"); - } - } - - public List getStudents() { - return this.students; - } - } + // ... } - ``` ->The below example demonstrates basic CRUD operations: Create, Read, Update, and Delete between the in-memory objects -> and the database. +The StudentDataMapper interface defines the operations that can be performed on Student objects. These operations include insert, update, delete, and find. ```java -@Slf4j -public final class App { - - private static final String STUDENT_STRING = "App.main(), student : "; - - public static void main(final String... args) { - - final var mapper = new StudentDataMapperImpl(); +public interface StudentDataMapper { + void insert(final Student student); - var student = new Student(1, "Adam", 'A'); + void update(final Student student); - mapper.insert(student); + void delete(final Student student); - LOGGER.debug(STUDENT_STRING + student + ", is inserted"); + Optional find(final int studentId); + // ... +} +``` - final var studentToBeFound = mapper.find(student.getStudentId()); +The StudentDataMapperImpl class implements the StudentDataMapper interface. It contains the actual logic for interacting with the database. - LOGGER.debug(STUDENT_STRING + studentToBeFound + ", is searched"); +```java +public class StudentDataMapperImpl implements StudentDataMapper { + // ... + @Override + public void insert(final Student student) { + // Insert student into the database + } - student = new Student(student.getStudentId(), "AdamUpdated", 'A'); + @Override + public void update(final Student student) { + // Update student in the database + } - mapper.update(student); + @Override + public void delete(final Student student) { + // Delete student from the database + } - LOGGER.debug(STUDENT_STRING + student + ", is updated"); - LOGGER.debug(STUDENT_STRING + student + ", is going to be deleted"); + @Override + public Optional find(final int studentId) { + // Find student in the database + } + // ... +} +``` - mapper.delete(student); - } +The App class contains the main method that demonstrates the use of the StudentDataMapper. It creates a Student object, inserts it into the database, finds it, updates it, and finally deletes it. - private App() { - } +```java +public class App { + public static void main(final String... args) { + final var mapper = new StudentDataMapperImpl(); + var student = new Student(1, "Adam", 'A'); + mapper.insert(student); + final var studentToBeFound = mapper.find(student.getStudentId()); + student = new Student(student.getStudentId(), "AdamUpdated", 'A'); + mapper.update(student); + mapper.delete(student); + } } ``` Program output: -15:05:00.264 [main] DEBUG com.iluwatar.datamapper.App - App.main(), student : Student(studentId=1, name=Adam, grade=A), is inserted -15:05:00.267 [main] DEBUG com.iluwatar.datamapper.App - App.main(), student : Optional[Student(studentId=1, name=Adam, grade=A)], is searched -15:05:00.268 [main] DEBUG com.iluwatar.datamapper.App - App.main(), student : Student(studentId=1, name=AdamUpdated, grade=A), is updated -15:05:00.268 [main] DEBUG com.iluwatar.datamapper.App - App.main(), student : Student(studentId=1, name=AdamUpdated, grade=A), is going to be deleted - - - -This layer consists of one or more mappers (or data access objects) that perform data transfer. The scope of mapper implementations varies. -A generic mapper will handle many different domain entity types, a dedicated mapper will handle one or a few. - -## Explanation - -Real-world example - -> When accessing web resources through a browser, there is generally no need to interact with the server directly; -> the browser and the proxy server will complete the data acquisition operation, and the three will remain independent. - -In plain words - -> The data mapper will help complete the bi-directional transfer of persistence layer and in-memory data. - -Wikipedia says - -> A Data Mapper is a Data Access Layer that performs bidirectional transfer of data between a -> persistent data store (often a relational database) and an in-memory data representation (the domain layer). - -Programmatic example +``` +13:54:29.234 [main] DEBUG com.iluwatar.datamapper.App -- App.main(), student : Student(studentId=1, name=Adam, grade=A), is inserted +13:54:29.237 [main] DEBUG com.iluwatar.datamapper.App -- App.main(), student : Optional[Student(studentId=1, name=Adam, grade=A)], is searched +13:54:29.237 [main] DEBUG com.iluwatar.datamapper.App -- App.main(), student : Student(studentId=1, name=AdamUpdated, grade=A), is updated +13:54:29.238 [main] DEBUG com.iluwatar.datamapper.App -- App.main(), student : Student(studentId=1, name=AdamUpdated, grade=A), is going to be deleted +``` ## Class diagram + ![alt text](./etc/data-mapper.png "Data Mapper") ## Applicability + Use the Data Mapper in any of the following situations -* when you want to decouple data objects from DB access layer -* when you want to write multiple data retrieval/persistence implementations +* When there's a need to decouple the in-memory objects from the database entities to promote the [Single Responsibility Principle](https://java-design-patterns.com/principles/#single-responsibility-principle) and [Separation of Concerns](https://java-design-patterns.com/principles/#separation-of-concerns). +* In applications requiring an ORM tool to bridge the gap between object-oriented models and relational databases. +* When working with complex database schemas where direct data manipulation and object creation lead to cumbersome and error-prone code. ## Tutorials @@ -186,16 +135,36 @@ Use the Data Mapper in any of the following situations * [Data Transfer Object Pattern in Java - Implementation and Mapping (Tutorial for Model Mapper & MapStruct)](https://stackabuse.com/data-transfer-object-pattern-in-java-implementation-and-mapping/) ## Known uses + +* ORM frameworks such as Hibernate in Java. +* Data access layers in enterprise applications where business logic and database management are kept separate. +* Applications requiring database interactions without tying the code to a specific database implementation. * [SqlSession.getMapper()](https://mybatis.org/mybatis-3/java-api.html) ## Consequences -> Neatly mapped persistence layer data -> Data model follows the single function principle +Benefits: + +* Promotes [Single Responsibility Principle](https://java-design-patterns.com/principles/#single-responsibility-principle) by separating persistence logic from business logic. +* Enhances maintainability and readability by centralizing data interaction logic. +* Improves application's ability to adapt to changes in the database schema with minimal changes to the business logic. + +Trade-offs: + +* Introduces complexity through the additional abstraction layer. +* Might lead to performance overhead due to the abstraction layer, especially in large-scale applications or with complex queries. +* Requires developers to learn and understand the abstraction layer in addition to the database and ORM framework being used. ## Related patterns -* [Active Record Pattern](https://en.wikipedia.org/wiki/Active_record_pattern) -* [Object–relational Mapping](https://en.wikipedia.org/wiki/Object%E2%80%93relational_mapping) + +* Active Record: Combines data access logic and business logic in the domain entities themselves, contrary to Data Mapper's separation of concerns. +* Object–Relational Mapping (ORM): A technique to map object-oriented programming language data to a relational database. +* [Repository](https://java-design-patterns.com/patterns/repository/): Provides an abstraction of the data layer, acting as a collection of domain objects in memory. +* [Unit of Work](https://java-design-patterns.com/patterns/unit-of-work/): Manages transactions and keeps track of the objects affected by a business transaction to ensure changes are consistent and transactional. ## Credits + +* Patterns of Enterprise Application Architecture +* [Java Persistence with Hibernate](https://amzn.to/3VNzlKe) +* [Clean Architecture: A Craftsman's Guide to Software Structure and Design](https://amzn.to/3xyEFag) * [Data Mapper](http://richard.jp.leguen.ca/tutoring/soen343-f2010/tutorials/implementing-data-mapper/) diff --git a/data-mapper/src/main/java/com/iluwatar/datamapper/DataMapperException.java b/data-mapper/src/main/java/com/iluwatar/datamapper/DataMapperException.java index 3e5419286f70..803adc53114e 100644 --- a/data-mapper/src/main/java/com/iluwatar/datamapper/DataMapperException.java +++ b/data-mapper/src/main/java/com/iluwatar/datamapper/DataMapperException.java @@ -24,6 +24,8 @@ */ package com.iluwatar.datamapper; +import java.io.Serial; + /** * Using Runtime Exception for avoiding dependency on implementation exceptions. This helps in * decoupling. @@ -32,6 +34,7 @@ */ public final class DataMapperException extends RuntimeException { + @Serial private static final long serialVersionUID = 1L; /** diff --git a/data-mapper/src/main/java/com/iluwatar/datamapper/Student.java b/data-mapper/src/main/java/com/iluwatar/datamapper/Student.java index a2c1007854bf..1691d1233246 100644 --- a/data-mapper/src/main/java/com/iluwatar/datamapper/Student.java +++ b/data-mapper/src/main/java/com/iluwatar/datamapper/Student.java @@ -24,6 +24,7 @@ */ package com.iluwatar.datamapper; +import java.io.Serial; import java.io.Serializable; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; @@ -41,6 +42,7 @@ @AllArgsConstructor public final class Student implements Serializable { + @Serial private static final long serialVersionUID = 1L; @EqualsAndHashCode.Include diff --git a/data-mapper/src/main/java/com/iluwatar/datamapper/StudentDataMapperImpl.java b/data-mapper/src/main/java/com/iluwatar/datamapper/StudentDataMapperImpl.java index 9f7d3c9d967a..9da1c8f7d169 100644 --- a/data-mapper/src/main/java/com/iluwatar/datamapper/StudentDataMapperImpl.java +++ b/data-mapper/src/main/java/com/iluwatar/datamapper/StudentDataMapperImpl.java @@ -27,10 +27,12 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; +import lombok.Getter; /** * Implementation of Actions on Students Data. */ +@Getter public final class StudentDataMapperImpl implements StudentDataMapper { /* Note: Normally this would be in the form of an actual database */ @@ -70,8 +72,4 @@ public void delete(Student studentToBeDeleted) throws DataMapperException { throw new DataMapperException("Student [" + name + "] is not found"); } } - - public List getStudents() { - return this.students; - } } diff --git a/data-mapper/src/test/java/com/iluwatar/datamapper/AppTest.java b/data-mapper/src/test/java/com/iluwatar/datamapper/AppTest.java index 1f954ff811c8..f45f6cc3266e 100644 --- a/data-mapper/src/test/java/com/iluwatar/datamapper/AppTest.java +++ b/data-mapper/src/test/java/com/iluwatar/datamapper/AppTest.java @@ -36,7 +36,6 @@ final class AppTest { /** * Issue: Add at least one assertion to this test case. - * * Solution: Inserted assertion to check whether the execution of the main method in {@link App#main(String[])} * throws an exception. */ diff --git a/data-mapper/src/test/java/com/iluwatar/datamapper/StudentTest.java b/data-mapper/src/test/java/com/iluwatar/datamapper/StudentTest.java index e1c3e21edead..9a9866e3bcfc 100644 --- a/data-mapper/src/test/java/com/iluwatar/datamapper/StudentTest.java +++ b/data-mapper/src/test/java/com/iluwatar/datamapper/StudentTest.java @@ -41,7 +41,7 @@ final class StudentTest { * @throws Exception if any execution error during test */ @Test - void testEquality() throws Exception { + void testEquality() { /* Create some students */ final var firstStudent = new Student(1, "Adam", 'A'); From b8f5d46ba71ee19a5ce3c450e1d28c6e14f2e419 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 7 Apr 2024 18:06:46 +0300 Subject: [PATCH 056/580] docs: update delegation --- delegation/README.md | 142 +++++++++++------- .../com/iluwatar/delegation/simple/App.java | 4 +- .../delegation/simple/PrinterController.java | 4 +- .../simple/printers/EpsonPrinter.java | 2 +- .../delegation/simple/printers/HpPrinter.java | 2 +- .../iluwatar/delegation/simple/AppTest.java | 1 - .../delegation/simple/DelegateTest.java | 6 +- 7 files changed, 95 insertions(+), 66 deletions(-) diff --git a/delegation/README.md b/delegation/README.md index def547ec6def..7774c5694274 100644 --- a/delegation/README.md +++ b/delegation/README.md @@ -1,34 +1,29 @@ --- title: Delegation -category: Structural +category: Behavioral language: en tag: - - Decoupling + - Delegation --- ## Also known as -Proxy Pattern + +* Helper +* Surrogate ## Intent -It is a technique where an object expresses certain behavior to the outside but in -reality delegates responsibility for implementing that behaviour to an associated object. + +The Delegation pattern in Java allows an object to delegate one or more tasks to a helper object. It is a technique where an object expresses certain behavior but actually delegates responsibility for implementing that behavior to an associated helper object. ## Explanation Real-world example -> Imagine that we have adventurers who fight monsters with different weapons depending on their -> abilities and skills. We must be able to equip them with different ones without having to -> modify their source code for each one. The delegation pattern makes it possible by delegating -> the dynamic work to a specific object implementing an interface with relevant methods. +> In a restaurant, the head chef delegates tasks to sous-chefs: one manages grilling, another handles salads, and a third is in charge of desserts. Each sous-chef specializes in their area, allowing the head chef to focus on overall kitchen management. This mirrors the Delegation design pattern, where a main object delegates specific tasks to helper objects, each expert in their domain. Wikipedia says -> In object-oriented programming, delegation refers to evaluating a member (property or method) of -> one object (the receiver) in the context of another original object (the sender). Delegation can -> be done explicitly, by passing the sending object to the receiving object, which can be done in -> any object-oriented language; or implicitly, by the member lookup rules of the language, which -> requires language support for the feature. +> In object-oriented programming, delegation refers to evaluating a member (property or method) of one object (the receiver) in the context of another original object (the sender). Delegation can be done explicitly, by passing the sending object to the receiving object, which can be done in any object-oriented language; or implicitly, by the member lookup rules of the language, which requires language support for the feature. **Programmatic Example** @@ -36,84 +31,119 @@ We have an interface `Printer` and three implementations `CanonPrinter`, `EpsonP ```java public interface Printer { - void print(final String message); + void print(final String message); } @Slf4j public class CanonPrinter implements Printer { - @Override - public void print(String message) { - LOGGER.info("Canon Printer : {}", message); - } + @Override + public void print(String message) { + LOGGER.info("Canon Printer : {}", message); + } } @Slf4j public class EpsonPrinter implements Printer { - @Override - public void print(String message) { - LOGGER.info("Epson Printer : {}", message); - } + @Override + public void print(String message) { + LOGGER.info("Epson Printer : {}", message); + } } @Slf4j public class HpPrinter implements Printer { - @Override - public void print(String message) { - LOGGER.info("HP Printer : {}", message); - } + @Override + public void print(String message) { + LOGGER.info("HP Printer : {}", message); + } } ``` -The `PrinterController` can be used as a `Printer` by delegating any work handled by this + +The `PrinterController` can be used as a `Printer` by delegating any work handled by this interface to an object implementing it. + ```java public class PrinterController implements Printer { - - private final Printer printer; - - public PrinterController(Printer printer) { - this.printer = printer; - } - - @Override - public void print(String message) { - printer.print(message); - } + + private final Printer printer; + + public PrinterController(Printer printer) { + this.printer = printer; + } + + @Override + public void print(String message) { + printer.print(message); + } } ``` Now on the client code printer controllers can print messages differently depending on the -object they're delegating that work to. +object they're delegating that work to. ```java -private static final String MESSAGE_TO_PRINT = "hello world"; +public class App { + + private static final String MESSAGE_TO_PRINT = "hello world"; -var hpPrinterController = new PrinterController(new HpPrinter()); -var canonPrinterController = new PrinterController(new CanonPrinter()); -var epsonPrinterController = new PrinterController(new EpsonPrinter()); + public static void main(String[] args) { + var hpPrinterController = new PrinterController(new HpPrinter()); + var canonPrinterController = new PrinterController(new CanonPrinter()); + var epsonPrinterController = new PrinterController(new EpsonPrinter()); -hpPrinterController.print(MESSAGE_TO_PRINT); -canonPrinterController.print(MESSAGE_TO_PRINT); -epsonPrinterController.print(MESSAGE_TO_PRINT) + hpPrinterController.print(MESSAGE_TO_PRINT); + canonPrinterController.print(MESSAGE_TO_PRINT); + epsonPrinterController.print(MESSAGE_TO_PRINT); + } +} ``` Program output: -```java -HP Printer : hello world -Canon Printer : hello world -Epson Printer : hello world +``` +HP Printer:hello world +Canon Printer:hello world +Epson Printer:hello world ``` ## Class diagram -![alt text](./etc/delegation.png "Delegate") + +![Delegate class diagram](./etc/delegation.png "Delegate") ## Applicability -Use the Delegate pattern in order to achieve the following -* Reduce the coupling of methods to their class -* Components that behave identically, but realize that this situation can change in the future. +* When you want to pass responsibility from one class to another without inheritance. +* To achieve composition-based reuse instead of inheritance-based. +* When you need to use several interchangeable helper classes at runtime. + +## Known Uses + +* Java's java.awt.event package, where listeners are often used to handle events. +* Wrapper classes in Java's Collections Framework (java.util.Collections), which delegate to other collection objects. +* In Spring Framework, delegation is used extensively in the IoC container where beans delegate tasks to other beans. + +## Consequences + +Benefits: + +* Reduces subclassing: Objects can delegate operations to different objects and change them at runtime, reducing the need for subclassing. +* Encourages reuse: Delegation promotes the reuse of the helper object's code. +* Increases flexibility: By delegating tasks to helper objects, you can change the behavior of your classes at runtime. + +Trade-offs: + +* Runtime Overhead: Delegation can introduce additional layers of indirection, which may result in slight performance costs. +* Complexity: The design can become more complicated since it involves additional classes and interfaces to manage delegation. + +## Related Patterns + +* [Composite](https://java-design-patterns.com/patterns/composite/): Delegation can be used within a composite pattern to delegate component-specific behavior to child components. +* [Strategy](https://java-design-patterns.com/patterns/strategy/): Delegation is often used in the strategy pattern where a context object delegates tasks to a strategy object. +* https://java-design-patterns.com/patterns/proxy/: The proxy pattern is a form of delegation where a proxy object controls access to another object, which it delegates work to. ## Credits +* [Effective Java](https://amzn.to/4aGE7gX) +* [Head First Design Patterns](https://amzn.to/3J9tuaB) +* [Refactoring: Improving the Design of Existing Code](https://amzn.to/3VOcRsw) * [Delegate Pattern: Wikipedia ](https://en.wikipedia.org/wiki/Delegation_pattern) -* [Proxy Pattern: Wikipedia ](https://en.wikipedia.org/wiki/Proxy_pattern) diff --git a/delegation/src/main/java/com/iluwatar/delegation/simple/App.java b/delegation/src/main/java/com/iluwatar/delegation/simple/App.java index f81e033bd968..7986643c69a9 100644 --- a/delegation/src/main/java/com/iluwatar/delegation/simple/App.java +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/App.java @@ -38,9 +38,9 @@ * *

    In this example the delegates are {@link EpsonPrinter}, {@link HpPrinter} and {@link * CanonPrinter} they all implement {@link Printer}. The {@link PrinterController} class also - * implements {@link Printer}. However neither provide the functionality of {@link Printer} by + * implements {@link Printer}. However, neither provide the functionality of {@link Printer} by * printing to the screen, they actually call upon the instance of {@link Printer} that they were - * instantiated with. Therefore delegating the behaviour to another class. + * instantiated with. Therefore, delegating the behaviour to another class. */ public class App { diff --git a/delegation/src/main/java/com/iluwatar/delegation/simple/PrinterController.java b/delegation/src/main/java/com/iluwatar/delegation/simple/PrinterController.java index 8e9a3896dbc4..28488d4855db 100644 --- a/delegation/src/main/java/com/iluwatar/delegation/simple/PrinterController.java +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/PrinterController.java @@ -27,7 +27,7 @@ /** * Delegator Class to delegate the implementation of the Printer. This ensures two things: - when * the actual implementation of the Printer class changes the delegation will still be operational - - * the actual benefit is observed when there are more than one implementors and they share a + * the actual benefit is observed when there are more than one implementor, and they share a * delegation control */ public class PrinterController implements Printer { @@ -41,7 +41,7 @@ public PrinterController(Printer printer) { /** * This method is implemented from {@link Printer} however instead on providing an implementation, * it instead calls upon the class passed through the constructor. This is the delegate, hence the - * pattern. Therefore meaning that the caller does not care of the implementing class only the + * pattern. Therefore, meaning that the caller does not care of the implementing class only the * owning controller. * * @param message to be printed to the screen diff --git a/delegation/src/main/java/com/iluwatar/delegation/simple/printers/EpsonPrinter.java b/delegation/src/main/java/com/iluwatar/delegation/simple/printers/EpsonPrinter.java index 88240a806cf5..4fcac417f370 100644 --- a/delegation/src/main/java/com/iluwatar/delegation/simple/printers/EpsonPrinter.java +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/printers/EpsonPrinter.java @@ -28,7 +28,7 @@ import lombok.extern.slf4j.Slf4j; /** - * Specialised Implementation of {@link Printer} for a Epson Printer, in this case the message to be + * Specialised Implementation of {@link Printer} for an Epson Printer, in this case the message to be * printed is appended to "Epson Printer : ". * * @see Printer diff --git a/delegation/src/main/java/com/iluwatar/delegation/simple/printers/HpPrinter.java b/delegation/src/main/java/com/iluwatar/delegation/simple/printers/HpPrinter.java index 63a4ccbae52c..1705a775e7cf 100644 --- a/delegation/src/main/java/com/iluwatar/delegation/simple/printers/HpPrinter.java +++ b/delegation/src/main/java/com/iluwatar/delegation/simple/printers/HpPrinter.java @@ -28,7 +28,7 @@ import lombok.extern.slf4j.Slf4j; /** - * Specialised Implementation of {@link Printer} for a HP Printer, in this case the message to be + * Specialised Implementation of {@link Printer} for an HP Printer, in this case the message to be * printed is appended to "HP Printer : ". * * @see Printer diff --git a/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java b/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java index e0dcf31c42ee..cd57181c260c 100644 --- a/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java +++ b/delegation/src/test/java/com/iluwatar/delegation/simple/AppTest.java @@ -35,7 +35,6 @@ class AppTest { /** * Issue: Add at least one assertion to this test case. - * * Solution: Inserted assertion to check whether the execution of the main method in {@link App#main(String[])} * throws an exception. */ diff --git a/delegation/src/test/java/com/iluwatar/delegation/simple/DelegateTest.java b/delegation/src/test/java/com/iluwatar/delegation/simple/DelegateTest.java index 10d896cfa3ed..4c0273f68b71 100644 --- a/delegation/src/test/java/com/iluwatar/delegation/simple/DelegateTest.java +++ b/delegation/src/test/java/com/iluwatar/delegation/simple/DelegateTest.java @@ -59,7 +59,7 @@ void tearDown() { private static final String MESSAGE = "Test Message Printed"; @Test - void testCanonPrinter() throws Exception { + void testCanonPrinter() { var printerController = new PrinterController(new CanonPrinter()); printerController.print(MESSAGE); @@ -67,7 +67,7 @@ void testCanonPrinter() throws Exception { } @Test - void testHpPrinter() throws Exception { + void testHpPrinter() { var printerController = new PrinterController(new HpPrinter()); printerController.print(MESSAGE); @@ -75,7 +75,7 @@ void testHpPrinter() throws Exception { } @Test - void testEpsonPrinter() throws Exception { + void testEpsonPrinter() { var printerController = new PrinterController(new EpsonPrinter()); printerController.print(MESSAGE); From 99f77f811978a71475485ac27ea386baf5a4b0df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 7 Apr 2024 18:44:04 +0300 Subject: [PATCH 057/580] docs: data transfer object + refactor --- data-transfer-object/README.md | 135 +++++++++--------- .../java/com/iluwatar/datatransfer/App.java | 14 +- .../datatransfer/customer/CustomerDto.java | 9 +- .../customer/CustomerResource.java | 19 +-- .../datatransfer/product/ProductResource.java | 40 +++--- .../customer/CustomerResourceTest.java | 25 ++-- 6 files changed, 113 insertions(+), 129 deletions(-) diff --git a/data-transfer-object/README.md b/data-transfer-object/README.md index 87252898b5da..96d4d286e367 100644 --- a/data-transfer-object/README.md +++ b/data-transfer-object/README.md @@ -1,22 +1,28 @@ --- title: Data Transfer Object -category: Architectural +category: Structural language: en tag: - - Performance + - Client-server + - Data transfer + - Layered architecture + - Optimization --- +## Also known as + +* Transfer Object +* Value Object + ## Intent -Pass data with multiple attributes in one shot from client to server, to avoid multiple calls to -remote server. +The Data Transfer Object (DTO) pattern is used to transfer data between software application subsystems or layers, particularly in the context of network calls or database retrieval in Java applications. It reduces the number of method calls by aggregating the data in a single transfer. ## Explanation Real world example -> We need to fetch information about customers from remote database. Instead of querying the -> attributes one at a time, we use DTOs to transfer all the relevant attributes in a single shot. +> Imagine you're at a grocery store with a long shopping list. Instead of calling a friend from every aisle to ask what's needed, you compile the entire list into one message and send it over. This is akin to a Data Transfer Object (DTO) in software, where instead of making multiple requests for data, a single, compiled set of data (like the complete shopping list) is transferred in one go, optimizing communication and efficiency. In plain words @@ -24,97 +30,98 @@ In plain words Wikipedia says -> In the field of programming a data transfer object (DTO) is an object that carries data between -> processes. The motivation for its use is that communication between processes is usually done -> resorting to remote interfaces (e.g. web services), where each call is an expensive operation. -> Because the majority of the cost of each call is related to the round-trip time between the client -> and the server, one way of reducing the number of calls is to use an object (the DTO) that -> aggregates the data that would have been transferred by the several calls, but that is served by -> one call only. +> In the field of programming a data transfer object (DTO) is an object that carries data between processes. The motivation for its use is that communication between processes is usually done resorting to remote interfaces (e.g. web services), where each call is an expensive operation. Because the majority of the cost of each call is related to the round-trip time between the client and the server, one way of reducing the number of calls is to use an object (the DTO) that aggregates the data that would have been transferred by the several calls, but that is served by one call only. **Programmatic Example** -Let's first introduce our simple `CustomerDTO` class. +Let's first introduce our simple `CustomerDTO` record. ```java -public class CustomerDto { - private final String id; - private final String firstName; - private final String lastName; - - public CustomerDto(String id, String firstName, String lastName) { - this.id = id; - this.firstName = firstName; - this.lastName = lastName; - } - - public String getId() { - return id; - } - - public String getFirstName() { - return firstName; - } - - public String getLastName() { - return lastName; - } -} +public record CustomerDto(String id, String firstName, String lastName) {} ``` -`CustomerResource` class acts as the server for customer information. +`CustomerResource` record acts as the server for customer information. ```java -public class CustomerResource { - private final List customers; - - public CustomerResource(List customers) { - this.customers = customers; - } - - public List getAllCustomers() { - return customers; - } - - public void save(CustomerDto customer) { - customers.add(customer); - } - - public void delete(String customerId) { - customers.removeIf(customer -> customer.getId().equals(customerId)); - } +public record CustomerResource(List customers) { + + public void save(CustomerDto customer) { + customers.add(customer); + } + + public void delete(String customerId) { + customers.removeIf(customer -> customer.id().equals(customerId)); + } } ``` Now fetching customer information is easy since we have the DTOs. ```java - var allCustomers = customerResource.getAllCustomers(); - allCustomers.forEach(customer -> LOGGER.info(customer.getFirstName())); - // Kelly - // Alfonso +var customerOne = new CustomerDto("1", "Kelly", "Brown"); +var customerTwo = new CustomerDto("2", "Alfonso", "Bass"); +var customers = new ArrayList<>(List.of(customerOne, customerTwo)); +var customerResource = new CustomerResource(customers); +LOGGER.info("All customers:"); +var allCustomers = customerResource.getCustomers(); +printCustomerDetails(allCustomers); +``` + +The output will be: + +``` +18:31:53.868 [main] INFO com.iluwatar.datatransfer.App -- All customers: +18:31:53.870 [main] INFO com.iluwatar.datatransfer.App -- Kelly +18:31:53.870 [main] INFO com.iluwatar.datatransfer.App -- Alfonso ``` ## Class diagram -![alt text](./etc/data-transfer-object.urm.png "data-transfer-object") +![DTO class diagram](./etc/data-transfer-object.urm.png "data-transfer-object") ## Applicability Use the Data Transfer Object pattern when: -* The client is asking for multiple information. And the information is related. -* When you want to boost the performance to get resources. -* You want reduced number of remote calls. +* When you need to optimize network traffic by reducing the number of calls, especially in a client-server architecture. +* In scenarios where batch processing of data is preferred over individual processing. +* When working with remote interfaces, to encapsulate the data transfer in a serializable object that can be easily transmitted. ## Tutorials * [Data Transfer Object Pattern in Java - Implementation and Mapping](https://stackabuse.com/data-transfer-object-pattern-in-java-implementation-and-mapping/) * [The DTO Pattern (Data Transfer Object)](https://www.baeldung.com/java-dto-pattern) +## Known Uses + +* Remote Method Invocation (RMI) in Java, where DTOs are used to pass data across network. +* Enterprise JavaBeans (EJB), particularly when data needs to be transferred from EJBs to clients. +* Various web service frameworks where DTOs encapsulate request and response data. + +## Consequences + +Benefits: + +* Reduces network calls, thereby improving application performance. +* Decouples the client from the server, leading to more modular and maintainable code. +* Simplifies data transmission over the network by aggregating data into single objects. + +Trade-offs: + +* Introduces additional classes into the application, which may increase complexity. +* Can lead to redundant data structures that mirror domain models, potentially causing synchronization issues. +* May encourage design that leads to an anemic domain model, where business logic is separated from data. + +## Related Patterns + +* [Service Layer](https://java-design-patterns.com/patterns/service-layer/): Often involves using DTOs to transfer data across the boundary between the service layer and its clients. +* [Facade](https://java-design-patterns.com/patterns/facade/): Similar to DTO, a Facade may aggregate multiple calls into one, improving efficiency. +* [Composite Entity](https://java-design-patterns.com/patterns/composite-entity/): DTOs may be used to represent composite entities, particularly in persistence mechanisms. + ## Credits * [Design Pattern - Transfer Object Pattern](https://www.tutorialspoint.com/design_pattern/transfer_object_pattern.htm) * [Data Transfer Object](https://msdn.microsoft.com/en-us/library/ff649585.aspx) * [J2EE Design Patterns](https://www.amazon.com/gp/product/0596004273/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596004273&linkCode=as2&tag=javadesignpat-20&linkId=f27d2644fbe5026ea448791a8ad09c94) * [Patterns of Enterprise Application Architecture](https://www.amazon.com/gp/product/0321127420/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321127420&linkCode=as2&tag=javadesignpat-20&linkId=014237a67c9d46f384b35e10151956bd) +* [Core J2EE Patterns: Best Practices and Design Strategies](https://amzn.to/4cKndQp) diff --git a/data-transfer-object/src/main/java/com/iluwatar/datatransfer/App.java b/data-transfer-object/src/main/java/com/iluwatar/datatransfer/App.java index e9164600ce7e..ac96e53c416b 100644 --- a/data-transfer-object/src/main/java/com/iluwatar/datatransfer/App.java +++ b/data-transfer-object/src/main/java/com/iluwatar/datatransfer/App.java @@ -67,15 +67,15 @@ public static void main(String[] args) { var customerResource = new CustomerResource(customers); - LOGGER.info("All customers:-"); - var allCustomers = customerResource.getAllCustomers(); + LOGGER.info("All customers:"); + var allCustomers = customerResource.customers(); printCustomerDetails(allCustomers); LOGGER.info("----------------------------------------------------------"); LOGGER.info("Deleting customer with id {1}"); - customerResource.delete(customerOne.getId()); - allCustomers = customerResource.getAllCustomers(); + customerResource.delete(customerOne.id()); + allCustomers = customerResource.customers(); printCustomerDetails(allCustomers); LOGGER.info("----------------------------------------------------------"); @@ -83,7 +83,7 @@ public static void main(String[] args) { LOGGER.info("Adding customer three}"); var customerThree = new CustomerDto("3", "Lynda", "Blair"); customerResource.save(customerThree); - allCustomers = customerResource.getAllCustomers(); + allCustomers = customerResource.customers(); printCustomerDetails(allCustomers); // Example 2: Product DTO @@ -131,10 +131,10 @@ public static void main(String[] args) { productResource.save(createProductRequestDto); LOGGER.info( "####### List of products after adding PS5: {}", - Arrays.toString(productResource.getProducts().toArray())); + Arrays.toString(productResource.products().toArray())); } private static void printCustomerDetails(List allCustomers) { - allCustomers.forEach(customer -> LOGGER.info(customer.getFirstName())); + allCustomers.forEach(customer -> LOGGER.info(customer.firstName())); } } diff --git a/data-transfer-object/src/main/java/com/iluwatar/datatransfer/customer/CustomerDto.java b/data-transfer-object/src/main/java/com/iluwatar/datatransfer/customer/CustomerDto.java index 556adae0e60d..402075e4d927 100644 --- a/data-transfer-object/src/main/java/com/iluwatar/datatransfer/customer/CustomerDto.java +++ b/data-transfer-object/src/main/java/com/iluwatar/datatransfer/customer/CustomerDto.java @@ -33,11 +33,4 @@ * *

    Dto will not have any business logic in it. */ -@Getter -@RequiredArgsConstructor -public class CustomerDto { - private final String id; - private final String firstName; - private final String lastName; - -} +public record CustomerDto(String id, String firstName, String lastName) {} diff --git a/data-transfer-object/src/main/java/com/iluwatar/datatransfer/customer/CustomerResource.java b/data-transfer-object/src/main/java/com/iluwatar/datatransfer/customer/CustomerResource.java index f45509b008e6..0fcae3e91d0a 100644 --- a/data-transfer-object/src/main/java/com/iluwatar/datatransfer/customer/CustomerResource.java +++ b/data-transfer-object/src/main/java/com/iluwatar/datatransfer/customer/CustomerResource.java @@ -25,25 +25,14 @@ package com.iluwatar.datatransfer.customer; import java.util.List; +import lombok.Getter; import lombok.RequiredArgsConstructor; /** * The resource class which serves customer information. This class act as server in the demo. Which * has all customer details. */ -@RequiredArgsConstructor -public class CustomerResource { - private final List customers; - - /** - * Get all customers. - * - * @return : all customers in list. - */ - public List getAllCustomers() { - return customers; - } - +public record CustomerResource(List customers) { /** * Save new customer. * @@ -59,6 +48,6 @@ public void save(CustomerDto customer) { * @param customerId delete customer with id {@code customerId} */ public void delete(String customerId) { - customers.removeIf(customer -> customer.getId().equals(customerId)); + customers.removeIf(customer -> customer.id().equals(customerId)); } -} \ No newline at end of file +} diff --git a/data-transfer-object/src/main/java/com/iluwatar/datatransfer/product/ProductResource.java b/data-transfer-object/src/main/java/com/iluwatar/datatransfer/product/ProductResource.java index 9adafc8be4d6..dc40f068822b 100644 --- a/data-transfer-object/src/main/java/com/iluwatar/datatransfer/product/ProductResource.java +++ b/data-transfer-object/src/main/java/com/iluwatar/datatransfer/product/ProductResource.java @@ -30,16 +30,13 @@ * The resource class which serves product information. This class act as server in the demo. Which * has all product details. */ -public class ProductResource { - private final List products; - +public record ProductResource(List products) { /** * Initialise resource with existing products. * * @param products initialize resource with existing products. Act as database. */ - public ProductResource(final List products) { - this.products = products; + public ProductResource { } /** @@ -49,11 +46,11 @@ public ProductResource(final List products) { */ public List getAllProductsForAdmin() { return products - .stream() - .map(p -> new ProductDto.Response.Private().setId(p.getId()).setName(p.getName()) - .setCost(p.getCost()) - .setPrice(p.getPrice())) - .toList(); + .stream() + .map(p -> new ProductDto.Response.Private().setId(p.getId()).setName(p.getName()) + .setCost(p.getCost()) + .setPrice(p.getPrice())) + .toList(); } /** @@ -63,10 +60,10 @@ public List getAllProductsForAdmin() { */ public List getAllProductsForCustomer() { return products - .stream() - .map(p -> new ProductDto.Response.Public().setId(p.getId()).setName(p.getName()) - .setPrice(p.getPrice())) - .toList(); + .stream() + .map(p -> new ProductDto.Response.Public().setId(p.getId()).setName(p.getName()) + .setPrice(p.getPrice())) + .toList(); } /** @@ -76,12 +73,12 @@ public List getAllProductsForCustomer() { */ public void save(ProductDto.Request.Create createProductDto) { products.add(Product.builder() - .id((long) (products.size() + 1)) - .name(createProductDto.getName()) - .supplier(createProductDto.getSupplier()) - .price(createProductDto.getPrice()) - .cost(createProductDto.getCost()) - .build()); + .id((long) (products.size() + 1)) + .name(createProductDto.getName()) + .supplier(createProductDto.getSupplier()) + .price(createProductDto.getPrice()) + .cost(createProductDto.getCost()) + .build()); } /** @@ -89,7 +86,8 @@ public void save(ProductDto.Request.Create createProductDto) { * * @return : all the products entity that stored in the products list */ - public List getProducts() { + @Override + public List products() { return products; } } diff --git a/data-transfer-object/src/test/java/com/iluwatar/datatransfer/customer/CustomerResourceTest.java b/data-transfer-object/src/test/java/com/iluwatar/datatransfer/customer/CustomerResourceTest.java index cc14c059a2a1..1a90a15e1201 100644 --- a/data-transfer-object/src/test/java/com/iluwatar/datatransfer/customer/CustomerResourceTest.java +++ b/data-transfer-object/src/test/java/com/iluwatar/datatransfer/customer/CustomerResourceTest.java @@ -29,8 +29,6 @@ import java.util.ArrayList; import java.util.List; -import com.iluwatar.datatransfer.customer.CustomerDto; -import com.iluwatar.datatransfer.customer.CustomerResource; import org.junit.jupiter.api.Test; /** @@ -42,12 +40,12 @@ class CustomerResourceTest { void shouldGetAllCustomers() { var customers = List.of(new CustomerDto("1", "Melody", "Yates")); var customerResource = new CustomerResource(customers); - var allCustomers = customerResource.getAllCustomers(); + var allCustomers = customerResource.customers(); assertEquals(1, allCustomers.size()); - assertEquals("1", allCustomers.get(0).getId()); - assertEquals("Melody", allCustomers.get(0).getFirstName()); - assertEquals("Yates", allCustomers.get(0).getLastName()); + assertEquals("1", allCustomers.get(0).id()); + assertEquals("Melody", allCustomers.get(0).firstName()); + assertEquals("Yates", allCustomers.get(0).lastName()); } @Test @@ -57,10 +55,10 @@ void shouldSaveCustomer() { customerResource.save(customer); - var allCustomers = customerResource.getAllCustomers(); - assertEquals("1", allCustomers.get(0).getId()); - assertEquals("Rita", allCustomers.get(0).getFirstName()); - assertEquals("Reynolds", allCustomers.get(0).getLastName()); + var allCustomers = customerResource.customers(); + assertEquals("1", allCustomers.get(0).id()); + assertEquals("Rita", allCustomers.get(0).firstName()); + assertEquals("Reynolds", allCustomers.get(0).lastName()); } @Test @@ -69,10 +67,9 @@ void shouldDeleteCustomer() { var customers = new ArrayList<>(List.of(customer)); var customerResource = new CustomerResource(customers); - customerResource.delete(customer.getId()); + customerResource.delete(customer.id()); - var allCustomers = customerResource.getAllCustomers(); + var allCustomers = customerResource.customers(); assertTrue(allCustomers.isEmpty()); } - -} \ No newline at end of file +} From e09cada960c0899ba6d8a9f116aa4791f2983130 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 7 Apr 2024 18:59:47 +0300 Subject: [PATCH 058/580] docs: improve decorator --- decorator/README.md | 147 ++++++++++-------- .../java/com/iluwatar/decorator/AppTest.java | 1 - .../iluwatar/decorator/SimpleTrollTest.java | 2 +- 3 files changed, 82 insertions(+), 68 deletions(-) diff --git a/decorator/README.md b/decorator/README.md index 3df72d6671e8..c770a7fcc2d7 100644 --- a/decorator/README.md +++ b/decorator/README.md @@ -3,100 +3,96 @@ title: Decorator category: Structural language: en tag: - - Gang of Four - - Extensibility + - Gang of Four + - Enhancement + - Extensibility + - Wrapping --- ## Also known as -Wrapper +* Smart Proxy +* Wrapper ## Intent -Attach additional responsibilities to an object dynamically. Decorators provide a flexible -alternative to subclassing for extending functionality. +The Decorator pattern allows for the dynamic addition of responsibilities to objects without modifying their existing code. It achieves this by providing a way to "wrap" objects within objects of similar interface. ## Explanation Real-world example -> There is an angry troll living in the nearby hills. Usually, it goes bare-handed but sometimes it -> has a weapon. To arm the troll it's not necessary to create a new troll but to decorate it -> dynamically with a suitable weapon. +> There is an angry troll living in the nearby hills. Usually, it goes bare-handed, but sometimes it has a weapon. To arm the troll it's not necessary to create a new troll but to decorate it dynamically with a suitable weapon. In plain words -> Decorator pattern lets you dynamically change the behavior of an object at run time by wrapping -> them in an object of a decorator class. +> Decorator pattern lets you dynamically change the behavior of an object at run time by wrapping them in an object of a decorator class. Wikipedia says -> In object-oriented programming, the decorator pattern is a design pattern that allows behavior to -> be added to an individual object, either statically or dynamically, without affecting the behavior -> of other objects from the same class. The decorator pattern is often useful for adhering to the -> Single Responsibility Principle, as it allows functionality to be divided between classes with -> unique areas of concern as well as to the Open-Closed Principle, by allowing the functionality -> of a class to be extended without being modified. +> In object-oriented programming, the decorator pattern is a design pattern that allows behavior to be added to an individual object, either statically or dynamically, without affecting the behavior of other objects from the same class. The decorator pattern is often useful for adhering to the Single Responsibility Principle, as it allows functionality to be divided between classes with unique areas of concern as well as to the Open-Closed Principle, by allowing the functionality of a class to be extended without being modified. **Programmatic Example** -Let's take the troll example. First of all we have a `SimpleTroll` implementing the `Troll` -interface: +Let's take the troll example. First of all we have a `SimpleTroll` implementing the `Troll` interface: ```java public interface Troll { - void attack(); - int getAttackPower(); - void fleeBattle(); + void attack(); + + int getAttackPower(); + + void fleeBattle(); } @Slf4j public class SimpleTroll implements Troll { - @Override - public void attack() { - LOGGER.info("The troll tries to grab you!"); - } + @Override + public void attack() { + LOGGER.info("The troll tries to grab you!"); + } - @Override - public int getAttackPower() { - return 10; - } + @Override + public int getAttackPower() { + return 10; + } - @Override - public void fleeBattle() { - LOGGER.info("The troll shrieks in horror and runs away!"); - } + @Override + public void fleeBattle() { + LOGGER.info("The troll shrieks in horror and runs away!"); + } } ``` Next, we want to add a club for the troll. We can do it dynamically by using a decorator: ```java + @Slf4j public class ClubbedTroll implements Troll { - private final Troll decorated; + private final Troll decorated; - public ClubbedTroll(Troll decorated) { - this.decorated = decorated; - } + public ClubbedTroll(Troll decorated) { + this.decorated = decorated; + } - @Override - public void attack() { - decorated.attack(); - LOGGER.info("The troll swings at you with a club!"); - } + @Override + public void attack() { + decorated.attack(); + LOGGER.info("The troll swings at you with a club!"); + } - @Override - public int getAttackPower() { - return decorated.getAttackPower() + 10; - } + @Override + public int getAttackPower() { + return decorated.getAttackPower() + 10; + } - @Override - public void fleeBattle() { - decorated.fleeBattle(); - } + @Override + public void fleeBattle() { + decorated.fleeBattle(); + } } ``` @@ -105,17 +101,17 @@ Here's the troll in action: ```java // simple troll LOGGER.info("A simple looking troll approaches."); -var troll = new SimpleTroll(); +var troll=new SimpleTroll(); troll.attack(); troll.fleeBattle(); -LOGGER.info("Simple troll power: {}.\n", troll.getAttackPower()); +LOGGER.info("Simple troll power: {}.\n",troll.getAttackPower()); // change the behavior of the simple troll by adding a decorator LOGGER.info("A troll with huge club surprises you."); -var clubbedTroll = new ClubbedTroll(troll); +var clubbedTroll=new ClubbedTroll(troll); clubbedTroll.attack(); clubbedTroll.fleeBattle(); -LOGGER.info("Clubbed troll power: {}.\n", clubbedTroll.getAttackPower()); +LOGGER.info("Clubbed troll power: {}.\n",clubbedTroll.getAttackPower()); ``` Program output: @@ -124,13 +120,13 @@ Program output: A simple looking troll approaches. The troll tries to grab you! The troll shrieks in horror and runs away! -Simple troll power: 10. +Simple troll power:10. A troll with huge club surprises you. The troll tries to grab you! The troll swings at you with a club! The troll shrieks in horror and runs away! -Clubbed troll power: 20. +Clubbed troll power:20. ``` ## Class diagram @@ -141,12 +137,10 @@ Clubbed troll power: 20. Decorator is used to: -* Add responsibilities to individual objects dynamically and transparently, that is, without -affecting other objects. +* Add responsibilities to individual objects dynamically and transparently, that is, without affecting other objects. * For responsibilities that can be withdrawn. -* When extension by subclassing is impractical. Sometimes a large number of independent extensions -are possible and would produce an explosion of subclasses to support every combination. Or a class -definition may be hidden or otherwise unavailable for subclassing. +* When extending a class is impractical due to the proliferation of subclasses that could result. +* For when a class definition might be hidden or otherwise unavailable for subclassing. ## Tutorials @@ -154,12 +148,32 @@ definition may be hidden or otherwise unavailable for subclassing. ## Known uses - * [java.io.InputStream](http://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html), [java.io.OutputStream](http://docs.oracle.com/javase/8/docs/api/java/io/OutputStream.html), - [java.io.Reader](http://docs.oracle.com/javase/8/docs/api/java/io/Reader.html) and [java.io.Writer](http://docs.oracle.com/javase/8/docs/api/java/io/Writer.html) - * [java.util.Collections#synchronizedXXX()](http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#synchronizedCollection-java.util.Collection-) - * [java.util.Collections#unmodifiableXXX()](http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#unmodifiableCollection-java.util.Collection-) - * [java.util.Collections#checkedXXX()](http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#checkedCollection-java.util.Collection-java.lang.Class-) +* GUI toolkits often use decorators to dynamically add behaviors like scrolling, borders, or layout management to components. +* [java.io.InputStream](http://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html), [java.io.OutputStream](http://docs.oracle.com/javase/8/docs/api/java/io/OutputStream.html), [java.io.Reader](http://docs.oracle.com/javase/8/docs/api/java/io/Reader.html) and [java.io.Writer](http://docs.oracle.com/javase/8/docs/api/java/io/Writer.html) +* [java.util.Collections#synchronizedXXX()](http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#synchronizedCollection-java.util.Collection-) +* [java.util.Collections#unmodifiableXXX()](http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#unmodifiableCollection-java.util.Collection-) +* [java.util.Collections#checkedXXX()](http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#checkedCollection-java.util.Collection-java.lang.Class-) + +## Consequences + +Benefits: + +* Greater flexibility than static inheritance. +* Avoids feature-laden classes high up in the hierarchy. +* A decorator and its component aren't identical. +* Responsibilities can be added or removed at runtime. + +Trade-offs: + +* A decorator and its component aren't identical, so tests for object type will fail. +* Decorators can lead to a system with lots of small objects that look alike to the programmer, making the desired configuration hard to achieve. +* Overuse can complicate the code structure due to the introduction of numerous small classes. + +## Related Patterns +* [Adapter](https://java-design-patterns.com/patterns/adapter/): A decorator changes an object's responsibilities, while an adapter changes an object's interface. +* [Composite](https://java-design-patterns.com/patterns/composite/): Decorators can be viewed as a degenerate composite with only one component. However, a decorator adds additional responsibilities—it isn't intended for object aggregation. +* [Strategy](https://java-design-patterns.com/patterns/strategy/): Decorator lets you change the skin of an object, while Strategy lets you change the guts. ## Credits @@ -169,3 +183,4 @@ definition may be hidden or otherwise unavailable for subclassing. * [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b) * [Refactoring to Patterns](https://www.amazon.com/gp/product/0321213351/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321213351&linkCode=as2&tag=javadesignpat-20&linkId=2a76fcb387234bc71b1c61150b3cc3a7) * [J2EE Design Patterns](https://www.amazon.com/gp/product/0596004273/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596004273&linkCode=as2&tag=javadesignpat-20&linkId=f27d2644fbe5026ea448791a8ad09c94) +* [Pattern-Oriented Software Architecture, Volume 1: A System of Patterns](https://amzn.to/4aKFTgS) diff --git a/decorator/src/test/java/com/iluwatar/decorator/AppTest.java b/decorator/src/test/java/com/iluwatar/decorator/AppTest.java index 32609d3b9003..15285dd11bfb 100644 --- a/decorator/src/test/java/com/iluwatar/decorator/AppTest.java +++ b/decorator/src/test/java/com/iluwatar/decorator/AppTest.java @@ -35,7 +35,6 @@ class AppTest { /** * Issue: Add at least one assertion to this test case. - * * Solution: Inserted assertion to check whether the execution of the main method in {@link App#main(String[])} * throws an exception. */ diff --git a/decorator/src/test/java/com/iluwatar/decorator/SimpleTrollTest.java b/decorator/src/test/java/com/iluwatar/decorator/SimpleTrollTest.java index e0bde46db5ad..65bde0455f5a 100644 --- a/decorator/src/test/java/com/iluwatar/decorator/SimpleTrollTest.java +++ b/decorator/src/test/java/com/iluwatar/decorator/SimpleTrollTest.java @@ -67,7 +67,7 @@ void testTrollActions() { assertEquals(2, appender.getLogSize()); } - private class InMemoryAppender extends AppenderBase { + private static class InMemoryAppender extends AppenderBase { private final List log = new LinkedList<>(); From c1466eb66eda14ade0b7d0728c73f9753291385f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Mon, 8 Apr 2024 21:01:38 +0300 Subject: [PATCH 059/580] dcos: update license years --- LICENSE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE.md b/LICENSE.md index b239e798719e..bcae7daadee9 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright © 2014-2021 Ilkka Seppälä +Copyright � 2014-2024 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 From 0b850aa76424465b5212a1332088f2472555426a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Mon, 8 Apr 2024 21:20:50 +0300 Subject: [PATCH 060/580] docs: update dependency injection --- dependency-injection/README.md | 93 ++++++++++++------- .../iluwatar/dependency/injection/App.java | 4 +- .../injection/AdvancedSorceressTest.java | 2 +- .../injection/AdvancedWizardTest.java | 2 +- .../dependency/injection/AppTest.java | 1 - .../dependency/injection/GuiceWizardTest.java | 4 +- 6 files changed, 68 insertions(+), 38 deletions(-) diff --git a/dependency-injection/README.md b/dependency-injection/README.md index 0f7a6c8ff011..77c479f5045f 100644 --- a/dependency-injection/README.md +++ b/dependency-injection/README.md @@ -1,47 +1,49 @@ --- title: Dependency Injection -category: Creational +category: Structural language: en tag: - - Decoupling + - Decoupling + - Dependency management + - Inversion of control --- +## Also known as + +* Inversion of Control (IoC) +* Dependency Inversion + ## Intent -Dependency Injection is a software design pattern in which one or more dependencies (or services) -are injected, or passed by reference, into a dependent object (or client) and are made part of the -client's state. The pattern separates the creation of a client's dependencies from its own behavior, -which allows program designs to be loosely coupled and to follow the inversion of control and single -responsibility principles. +Dependency Injection is a software design pattern in which one or more dependencies (or services) are injected, or passed by reference, into a dependent object (or client) and are made part of the client's state. The pattern separates the creation of a client's dependencies from its own behavior, which allows program designs to be loosely coupled and to follow the [Inversion of Control](https://java-design-patterns.com/principles/#inversion-of-control) and [Single Responsibility](https://java-design-patterns.com/principles/#single-responsibility-principle) principles. ## Explanation Real world example -> The old wizard likes to fill his pipe and smoke tobacco once in a while. However, he doesn't want -> to depend on a single tobacco brand only but likes to be able to enjoy them all interchangeably. +> The old wizard likes to fill his pipe and smoke tobacco once in a while. However, he doesn't want to depend on a single tobacco brand only but likes to be able to enjoy them all interchangeably. In plain words -> Dependency Injection separates creation of client's dependencies from its own behavior. +> Dependency Injection separates creation of client's dependencies from its own behavior. Wikipedia says -> In software engineering, dependency injection is a technique in which an object receives other -> objects that it depends on. These other objects are called dependencies. +> In software engineering, dependency injection is a technique in which an object receives other objects that it depends on. These other objects are called dependencies. **Programmatic Example** Let's first introduce the `Tobacco` interface and the concrete brands. ```java + @Slf4j public abstract class Tobacco { - public void smoke(Wizard wizard) { - LOGGER.info("{} smoking {}", wizard.getClass().getSimpleName(), - this.getClass().getSimpleName()); - } + public void smoke(Wizard wizard) { + LOGGER.info("{} smoking {}", wizard.getClass().getSimpleName(), + this.getClass().getSimpleName()); + } } public class SecondBreakfastTobacco extends Tobacco { @@ -59,44 +61,73 @@ Next here's the `Wizard` class hierarchy. ```java public interface Wizard { - void smoke(); + void smoke(); } public class AdvancedWizard implements Wizard { - private final Tobacco tobacco; + private final Tobacco tobacco; - public AdvancedWizard(Tobacco tobacco) { - this.tobacco = tobacco; - } + public AdvancedWizard(Tobacco tobacco) { + this.tobacco = tobacco; + } - @Override - public void smoke() { - tobacco.smoke(this); - } + @Override + public void smoke() { + tobacco.smoke(this); + } } ``` And lastly we can show how easy it is to give the old wizard any brand of tobacco. ```java - var advancedWizard = new AdvancedWizard(new SecondBreakfastTobacco()); - advancedWizard.smoke(); +var advancedWizard=new AdvancedWizard(new SecondBreakfastTobacco()); +advancedWizard.smoke(); ``` ## Class diagram -![alt text](./etc/dependency-injection.png "Dependency Injection") +![Dependency Injection](./etc/dependency-injection.png "Dependency Injection") ## Applicability -Use the Dependency Injection pattern when: +* When aiming to reduce the coupling between classes and increase the modularity of the application. +* In scenarios where the object creation process is complex or should be separated from the class usage. +* In applications requiring easier unit testing by allowing dependencies to be mocked or stubbed. +* Within frameworks or libraries that manage object lifecycles and dependencies, such as Spring or Jakarta EE (formerly Java EE). + +## Known Uses + +* Frameworks like Spring, Jakarta EE, and Google Guice use DI extensively to manage component lifecycles and dependencies. +* Desktop and web applications that require flexible architecture with easily interchangeable components. + +## Consequences + +Benefits: + +* Enhances modularity and separation of concerns. +* Simplifies unit testing by allowing for easy mocking of dependencies. +* Increases flexibility and maintainability by promoting loose coupling. + +Trade-offs: + +* Can introduce complexity in the configuration, especially in large projects. +* Might increase the learning curve for developers unfamiliar with DI patterns or frameworks. +* Requires careful management of object lifecycles and scopes. + +## Related Patterns -* When you need to remove knowledge of concrete implementation from object. -* To enable unit testing of classes in isolation using mock objects or stubs. +* [Factory Method](https://java-design-patterns.com/patterns/factory-method/) and [Abstract Factory](https://java-design-patterns.com/patterns/abstract-factory/): Used to create instances that the DI mechanism will inject. +* [Service Locator](https://java-design-patterns.com/patterns/service-locator/): An alternative to DI for locating services or components, though it does not decouple the lookup process as effectively as DI. +* [Singleton](https://java-design-patterns.com/patterns/singleton/): Often used in conjunction with DI to provide a single instance of a service across the application. ## Credits +* [Spring in Action](https://amzn.to/4asnpSG) +* [Dependency Injection: Design patterns using Spring and Guice](https://amzn.to/4aMyHkI) +* [Java Design Pattern Essentials](https://amzn.to/3xtPPxa) +* [Pro Java EE Spring Patterns: Best Practices and Design Strategies Implementing Java EE Patterns with the Spring Framework](https://amzn.to/3J6Teoh) * [Dependency Injection Principles, Practices, and Patterns](https://www.amazon.com/gp/product/161729473X/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=161729473X&linkId=57079257a5c7d33755493802f3b884bd) * [Clean Code: A Handbook of Agile Software Craftsmanship](https://www.amazon.com/gp/product/0132350882/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0132350882&linkCode=as2&tag=javadesignpat-20&linkId=2c390d89cc9e61c01b9e7005c7842871) * [Java 9 Dependency Injection: Write loosely coupled code with Spring 5 and Guice](https://www.amazon.com/gp/product/1788296257/ref=as_li_tl?ie=UTF8&tag=javadesignpat-20&camp=1789&creative=9325&linkCode=as2&creativeASIN=1788296257&linkId=4e9137a3bf722a8b5b156cce1eec0fc1) diff --git a/dependency-injection/src/main/java/com/iluwatar/dependency/injection/App.java b/dependency-injection/src/main/java/com/iluwatar/dependency/injection/App.java index f4d060a104e4..1b52a315fc5d 100644 --- a/dependency-injection/src/main/java/com/iluwatar/dependency/injection/App.java +++ b/dependency-injection/src/main/java/com/iluwatar/dependency/injection/App.java @@ -28,7 +28,7 @@ /** * Dependency Injection pattern deals with how objects handle their dependencies. The pattern - * implements so called inversion of control principle. Inversion of control has two specific rules: + * implements so-called inversion of control principle. Inversion of control has two specific rules: * - High-level modules should not depend on low-level modules. Both should depend on abstractions. * - Abstractions should not depend on details. Details should depend on abstractions. * @@ -37,7 +37,7 @@ * concrete implementation which cannot be changed. * *

    anM~zt zf3bhqUHsd?fF)ZX!u^5b!~{%q%7Fgk@Z;(}dk4PESKtEf3LiT3bO(;?5VnU3tzK*| zw~O_Ho+}X%5hl3*cL)QWDz!O6(ND4}wKKX+(t7z z8`bXD?^viarm>{{WI`oB4nNy@Df*L-@HvImPo&~Lb;vp*KjvKL`;nPUDDneRzLrUR zXr5^Au+>PhVU7y(g*wWg9}_^R$-SGsV_{>M*Goa@Hmk>QsE-OmFcB6O_ARj$2YPWI zYqA)5_dreYU9!wyz_**=&<4IMyxXszyr0|+_wQ4G;_NN%=LQMRz5M(sJcNUUxSysY ZdsM#qrnOo#>`J&lOG_do(!{i0{2x-4wGsdT literal 0 HcmV?d00001 diff --git a/localization/es/trampoline/README.md b/localization/es/trampoline/README.md new file mode 100644 index 000000000000..11270760a009 --- /dev/null +++ b/localization/es/trampoline/README.md @@ -0,0 +1,149 @@ +--- +title: Trampoline +category: Behavioral +language: es +tag: + - Performance +--- + +## Propósito + +El patrón Trampoline se utiliza para implementar algoritmos recursivamente en Java sin volar la pila +y para intercalar la ejecución de funciones sin codificarlas juntas. + +## Explicación + +La recursión es una técnica frecuentemente adoptada para resolver problemas algorítmicos en un estilo de divide y vencerás. +Por ejemplo, el cálculo de la suma acumulativa de Fibonacci y los factoriales. En este tipo de +problemas, la recursividad es más directa que su homóloga de bucle. Además, la recursividad puede +necesitar menos código y parecer más concisa. Hay un dicho que dice que todo problema de recursión puede resolverse +utilizando un bucle a costa de escribir código más difícil de entender. + +Sin embargo, las soluciones de tipo recursivo tienen una gran advertencia. Para cada llamada recursiva, normalmente se necesita +un valor intermedio almacenado y hay una cantidad limitada de memoria de pila disponible. Quedarse sin +memoria de pila crea un error de desbordamiento de pila y detiene la ejecución del programa. + +Trampoline pattern es un truco que permite definir algoritmos recursivos en Java sin desbordar la +pila. + +Ejemplo del mundo real + +> Un cálculo Fibonacci recursivo sin el problema de desbordamiento de pila utilizando el patrón Trampoline. + +En palabras sencillas + +> El patrón Trampoline permite la recursión sin agotar la memoria de la pila. + +Wikipedia dice + +> En Java, trampoline se refiere al uso de reflection para evitar el uso de clases internas, por ejemplo en +> eventos. La sobrecarga de tiempo de una llamada a reflection se intercambia por la sobrecarga de espacio de una clase interna. +> Trampolines en Java generalmente implican la creación de un GenericListener para pasar eventos a una clase externa. + +**Ejemplo programático** + +Esta es la implementación de `Trampoline` en Java. + +Cuando se llama a `get` sobre el Trampoline devuelto, internamente se itera llamando a `jump` sobre el +siempre que la instancia concreta devuelta sea `Trampoline`, deteniéndose una vez que la instancia +instancia devuelta sea `done`. + +```java +public interface Trampoline { + + T get(); + + default Trampoline jump() { + return this; + } + + default T result() { + return get(); + } + + default boolean complete() { + return true; + } + + static Trampoline done(final T result) { + return () -> result; + } + + static Trampoline more(final Trampoline> trampoline) { + return new Trampoline() { + @Override + public boolean complete() { + return false; + } + + @Override + public Trampoline jump() { + return trampoline.result(); + } + + @Override + public T get() { + return trampoline(this); + } + + T trampoline(final Trampoline trampoline) { + return Stream.iterate(trampoline, Trampoline::jump) + .filter(Trampoline::complete) + .findFirst() + .map(Trampoline::result) + .orElseThrow(); + } + }; + } +} +``` + +Uso del `Trampoline` para obtener valores Fibonacci. + +```java +public static void main(String[] args) { + LOGGER.info("Start calculating war casualties"); + var result = loop(10, 1).result(); + LOGGER.info("The number of orcs perished in the war: {}", result); +} + +public static Trampoline loop(int times, int prod) { + if (times == 0) { + return Trampoline.done(prod); + } else { + return Trampoline.more(() -> loop(times - 1, prod * times)); + } +} +``` + +Salida del programa: + +``` +19:22:24.462 [main] INFO com.iluwatar.trampoline.TrampolineApp - Start calculating war casualties +19:22:24.472 [main] INFO com.iluwatar.trampoline.TrampolineApp - The number of orcs perished in the war: 3628800 +``` + +## Diagrama de clases + +![alt text](./etc/trampoline.urm.png "Trampoline pattern class diagram") + +## Aplicabilidad + +Utilice el patrón Trampoline cuando: + +* Para implementar funciones recursivas de cola. Este patrón permite encender una operación sin pila. +* Para intercalar la ejecución de dos o más funciones en el mismo hilo. + +## Usos conocidos + +* [cyclops-react](https://github.com/aol/cyclops-react) + +## Créditos + +* [Trampolining: a practical guide for awesome Java Developers](https://medium.com/@johnmcclean/trampolining-a-practical-guide-for-awesome-java-developers-4b657d9c3076) +* [Trampoline in java ](http://mindprod.com/jgloss/trampoline.html) +* [Laziness, trampolines, monoids and other functional amenities: this is not your father's Java](https://www.slideshare.net/mariofusco/lazine) +* [Trampoline implementation](https://github.com/bodar/totallylazy/blob/master/src/com/googlecode/totallylazy/Trampoline.java) +* [What is a trampoline function?](https://stackoverflow.com/questions/189725/what-is-a-trampoline-function) +* [Modern Java in Action: Lambdas, streams, functional and reactive programming](https://www.amazon.com/gp/product/1617293563/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=1617293563&linkId=ad53ae6f9f7c0982e759c3527bd2595c) +* [Java 8 in Action: Lambdas, Streams, and functional-style programming](https://www.amazon.com/gp/product/1617291994/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=1617291994&linkId=e3e5665b0732c59c9d884896ffe54f4f) diff --git a/localization/es/trampoline/etc/trampoline.urm.png b/localization/es/trampoline/etc/trampoline.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..f2e9c7439a327dac019a1a420eaf460ef2092a52 GIT binary patch literal 15316 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 literal 0 HcmV?d00001 diff --git a/localization/es/transaction-script/README.md b/localization/es/transaction-script/README.md new file mode 100644 index 000000000000..77cf8a2f1bb9 --- /dev/null +++ b/localization/es/transaction-script/README.md @@ -0,0 +1,117 @@ +--- +title: Transaction Script +category: Behavioral +language: es +tag: + - Data access +--- + +## Propósito + +Transaction Script organiza la lógica de negocio por procedimientos donde cada procedimiento maneja una única +solicitud de la presentación. + +## Explicación + +Ejemplo del mundo real + +> Necesitas crear un sistema de reservas de habitaciones de hotel. Dado que los requisitos son bastante simples +> utilizar el patrón Transaction Script. + +En palabras sencillas + +> Transaction Script organiza la lógica de negocio en transacciones que el sistema necesita llevar a cabo. + +Ejemplo programático + +La clase `Hotel` se encarga de reservar y cancelar las reservas de habitaciones. + +```java +@Slf4j +public class Hotel { + + private final HotelDaoImpl hotelDao; + + public Hotel(HotelDaoImpl hotelDao) { + this.hotelDao = hotelDao; + } + + public void bookRoom(int roomNumber) throws Exception { + + Optional room = hotelDao.getById(roomNumber); + + if (room.isEmpty()) { + throw new Exception("Room number: " + roomNumber + " does not exist"); + } else { + if (room.get().isBooked()) { + throw new Exception("Room already booked!"); + } else { + Room updateRoomBooking = room.get(); + updateRoomBooking.setBooked(true); + hotelDao.update(updateRoomBooking); + } + } + } + + public void cancelRoomBooking(int roomNumber) throws Exception { + + Optional room = hotelDao.getById(roomNumber); + + if (room.isEmpty()) { + throw new Exception("Room number: " + roomNumber + " does not exist"); + } else { + if (room.get().isBooked()) { + Room updateRoomBooking = room.get(); + updateRoomBooking.setBooked(false); + int refundAmount = updateRoomBooking.getPrice(); + hotelDao.update(updateRoomBooking); + + LOGGER.info("Booking cancelled for room number: " + roomNumber); + LOGGER.info(refundAmount + " is refunded"); + } else { + throw new Exception("No booking for the room exists"); + } + } + } +} +``` + +La clase `Hotel` tiene dos métodos, uno para reservar y otro para cancelar una habitación respectivamente. Cada uno de ellos +transacción en el sistema, haciendo que `Hotel` implemente el patrón Transaction Script +Transaction Script. + +El método `bookRoom` consolida todos los pasos necesarios como comprobar si la habitación ya está reservada +o no, si no está reservada entonces reserva la habitación y actualiza la base de datos utilizando el DAO. + +El método `cancelRoom` consolida pasos como comprobar si la habitación está reservada o no, +si está reservada, calcula el importe del reembolso y actualiza la base de datos utilizando el DAO. + +## Diagrama de clases + +![alt text](./etc/transaction-script.png "Transaction script model") + +## Aplicabilidad + +Utilice el patrón Transaction Script cuando la aplicación tenga sólo una pequeña cantidad de lógica y esa +lógica no será extendida en el futuro. + +## Consecuencias + +* A medida que la lógica de negocio se complica, + se hace progresivamente más difícil mantener el script de transacción + en un estado bien diseñado. +* Puede ocurrir duplicación de código entre scripts de transacciones. +* Normalmente no es fácil refactorizar el script de transacciones a otros patrones de lógica de dominio. + del dominio. + +## Patrones relacionados + +* Domain Model +* Table Module +* Service Layer + +## Créditos + +* [Transaction Script Pattern](https://dzone.com/articles/transaction-script-pattern#:~:text=Transaction%20Script%20(TS)%20is%20the,need%20big%20architecture%20behind%20them.) +* [Transaction Script](https://www.informit.com/articles/article.aspx?p=1398617) +* [Patterns of Enterprise Application Architecture](https://www.amazon.com/gp/product/0321127420/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=0321127420&linkId=18acc13ba60d66690009505577c45c04) diff --git a/localization/es/transaction-script/etc/transaction-script.png b/localization/es/transaction-script/etc/transaction-script.png new file mode 100644 index 0000000000000000000000000000000000000000..6d0cffb6a55170dbd710f528ddf5fd95b89757c1 GIT binary patch literal 66480 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]}MK;#%=!jm}b^t!DS(p2a*I^M5!#^f!%y^aJ* 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 QQM>EQODjv2Nf-tE5A9LpApigX literal 0 HcmV?d00001 diff --git a/localization/es/typeobjectpattern/README.md b/localization/es/typeobjectpattern/README.md new file mode 100644 index 000000000000..3c5d1d51839e --- /dev/null +++ b/localization/es/typeobjectpattern/README.md @@ -0,0 +1,209 @@ +--- +title: Type-Object +category: Behavioral +language: es +tag: + - Game programming + - Extensibility +--- + +## Propósito +Como se explica en el libro Game Programming Patterns de Robert Nystrom, el patrón objeto tipo ayuda a + +> Permitir la creación flexible de nuevas "clases" mediante la creación de una única clase, cada instancia de la cual representa un tipo diferente de objeto + +## Explicación +Ejemplo del mundo real +> Estás trabajando en un juego con muchas razas diferentes de monstruos. Cada raza de monstruo tiene diferentes valores para los atributos, como ataque, salud, inteligencia, etc. Quieres crear nuevas razas de monstruos, o modificar los atributos de una raza existente, sin necesidad de modificar el código y recompilar el juego. + +En palabras sencillas +> Definimos una clase de objeto de tipo y una clase de objeto tipado. Damos a cada instancia de objeto de tipo una referencia a un objeto tipado, que contiene la información para ese tipo. + +**Ejemplo programático** + +Supongamos que estamos desarrollando un juego de Candy Crush. Hay muchos tipos de caramelos diferentes, y es posible que queramos editar o crear nuevos con el tiempo a medida que desarrollamos el juego. + +En primer lugar, tenemos un tipo para los caramelos, con un nombre de campo, padre, puntos y Tipo. + +```java +@Getter(AccessLevel.PACKAGE) +public class Candy { + + enum Type { + CRUSHABLE_CANDY, + REWARD_FRUIT + } + + String name; + Candy parent; + String parentName; + + @Setter + private int points; + private final Type type; + + Candy(String name, String parentName, Type type, int points) { + this.name = name; + this.parent = null; + this.type = type; + this.points = points; + this.parentName = parentName; + } + +} +``` + +Los datos de campo de los tipos de caramelos se almacenan en el archivo JSON ``candy.json``. Se pueden añadir nuevos caramelos simplemente añadiéndolos a este archivo. + +```json +{"candies" : [ + { + "name" : "fruit", + "parent" : "null", + "type" : "rewardFruit", + "points" : 20 + }, + { + "name" : "candy", + "parent" : "null", + "type" : "crushableCandy", + "points" : 10 + }, + { + "name" : "cherry", + "parent" : "fruit", + "type" : "rewardFruit", + "points" : 0 + }, + { + "name" : "mango", + "parent" : "fruit", + "type" : "rewardFruit", + "points" : 0 + }, + { + "name" : "purple popsicle", + "parent" : "candy", + "type" : "crushableCandy", + "points" : 0 + }, + { + "name" : "green jellybean", + "parent" : "candy", + "type" : "crushableCandy", + "points" : 0 + }, + { + "name" : "orange gum", + "parent" : "candy", + "type" : "crushableCandy", + "points" : 0 + } + ] +} +``` + +El archivo JSON se analiza, instanciando cada tipo de caramelo y almacenándolo en una tabla hash. El campo ``type`` se compara con el enum ``Type`` definido en la clase Candy. + +```java +public class JsonParser { + Hashtable candies; + + JsonParser() { + this.candies = new Hashtable<>(); + } + + void parse() throws JsonParseException { + var is = this.getClass().getClassLoader().getResourceAsStream("candy.json"); + var reader = new InputStreamReader(is); + var json = (JsonObject) com.google.gson.JsonParser.parseReader(reader); + var array = (JsonArray) json.get("candies"); + for (var item : array) { + var candy = (JsonObject) item; + var name = candy.get("name").getAsString(); + var parentName = candy.get("parent").getAsString(); + var t = candy.get("type").getAsString(); + var type = Type.CRUSHABLE_CANDY; + if (t.equals("rewardFruit")) { + type = Type.REWARD_FRUIT; + } + var points = candy.get("points").getAsInt(); + var c = new Candy(name, parentName, type, points); + this.candies.put(name, c); + } + setParentAndPoints(); + } + + void setParentAndPoints() { + for (var e = this.candies.keys(); e.hasMoreElements(); ) { + var c = this.candies.get(e.nextElement()); + if (c.parentName == null) { + c.parent = null; + } else { + c.parent = this.candies.get(c.parentName); + } + if (c.getPoints() == 0 && c.parent != null) { + c.setPoints(c.parent.getPoints()); + } + } + } +} +``` + +## En palabras sencillas + +El patrón Tipo-Objeto en Java es un método para encapsular propiedades y comportamientos específicos de un tipo dentro de un objeto. Este patrón de diseño facilita la adición de nuevos tipos sin necesidad de realizar cambios en el código existente, mejorando así la expansión y el mantenimiento de la base de código. + +## Wikipedia dice + +Aunque no existe una entrada específica en Wikipedia para el patrón Tipo-Objeto, se trata de una técnica de uso común en la programación orientada a objetos. Este patrón ayuda a gestionar objetos que comparten características similares pero tienen valores diferentes para esas características. Su uso está muy extendido en el desarrollo de juegos, donde numerosos tipos de objetos (como los enemigos) comparten un comportamiento común pero tienen propiedades diferentes. + +## Ejemplo programático + +Consideremos un ejemplo en el que intervienen distintos tipos de enemigos en un juego. Cada tipo de enemigo tiene propiedades distintas, como velocidad, salud y daño. + +```java +public class EnemyType { + private String name; + private int speed; + private int health; + private int damage; + + public EnemyType(String name, int speed, int health, int damage) { + this.name = name; + this.speed = speed; + this.health = health; + this.damage = damage; + } + + // getters and setters +} + +public class Enemy { + private EnemyType type; + + // Encapsulating type information in an object + public Enemy(EnemyType type) { + this.type = type; + } + + // other methods +} +``` + +En el ejemplo anterior, `EnemyType` encapsula propiedades específicas del tipo (nombre, velocidad, salud, daño), y `Enemy` utiliza una instancia de `EnemyType` para definir su tipo. De esta forma, puedes añadir tantos tipos de enemigos como quieras sin modificar la clase "Enemigo". + +## Aplicabilidad +Este patrón puede utilizarse cuando: + +* No sabemos de antemano qué tipos vamos a necesitar. +* Queremos ser capaces de modificar o añadir nuevos tipos sin tener que recompilar o cambiar el código. +* La única diferencia entre los diferentes "tipos" de objetos son los datos, no el comportamiento. + +## Otro ejemplo con diagrama de clases +![alt text](./etc/typeobjectpattern.urm.png "Type-Object pattern class diagram") + +## Créditos + +* [Game Programming Patterns - Type Object](http://gameprogrammingpatterns.com/type-object.html) +* [Types as Objects Pattern](http://www.cs.sjsu.edu/~pearce/modules/patterns/analysis/top.htm) diff --git a/localization/es/typeobjectpattern/etc/typeobjectpattern.urm.png b/localization/es/typeobjectpattern/etc/typeobjectpattern.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..477dac5f2a2e667db112fd2231d9731f372f6ef3 GIT binary patch literal 67712 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 y&(~l-=oUzET~csU89WC%2^Etr;TsUB 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 Considere una estructura de árbol con unidades del ejército. El comandante tiene dos sargentos bajo él y cada sargento +> tiene tres soldados bajo él. Dado que la jerarquía implementa el patrón visitante, podemos +> crear fácilmente nuevos objetos que interactúen con el comandante, los sargentos, los soldados, o todos ellos. + + +Ejemplo del mundo real + +> El patrón Visitante define las operaciones que se pueden realizar en los nodos de la estructura de datos. + +Wikipedia dice + +> En programación orientada a objetos e ingeniería de software, el patrón de diseño visitante es una forma de +> separar un algoritmo de una estructura de objetos sobre la que opera. Un resultado práctico de esta +> separación es la capacidad de añadir nuevas operaciones a estructuras de objetos existentes sin modificarlas. +> las estructuras. + +**Ejemplo programático** + +Dado el ejemplo anterior de la unidad del ejército, primero tenemos los tipos básicos Unit y UnitVisitor. + +```java +public abstract class Unit { + + private final Unit[] children; + + public Unit(Unit... children) { + this.children = children; + } + + public void accept(UnitVisitor visitor) { + Arrays.stream(children).forEach(child -> child.accept(visitor)); + } +} + +public interface UnitVisitor { + + void visit(Soldier soldier); + + void visit(Sergeant sergeant); + + void visit(Commander commander); +} +``` + +Luego tenemos las unidades de hormigón. + +```java +public class Commander extends Unit { + + public Commander(Unit... children) { + super(children); + } + + @Override + public void accept(UnitVisitor visitor) { + visitor.visit(this); + super.accept(visitor); + } + + @Override + public String toString() { + return "commander"; + } +} + +public class Sergeant extends Unit { + + public Sergeant(Unit... children) { + super(children); + } + + @Override + public void accept(UnitVisitor visitor) { + visitor.visit(this); + super.accept(visitor); + } + + @Override + public String toString() { + return "sergeant"; + } +} + +public class Soldier extends Unit { + + public Soldier(Unit... children) { + super(children); + } + + @Override + public void accept(UnitVisitor visitor) { + visitor.visit(this); + super.accept(visitor); + } + + @Override + public String toString() { + return "soldier"; + } +} +``` + +He aquí, pues, algunos visitantes concretos. + +```java +@Slf4j +public class CommanderVisitor implements UnitVisitor { + + @Override + public void visit(Soldier soldier) { + // Do nothing + } + + @Override + public void visit(Sergeant sergeant) { + // Do nothing + } + + @Override + public void visit(Commander commander) { + LOGGER.info("Good to see you {}", commander); + } +} + +@Slf4j +public class SergeantVisitor implements UnitVisitor { + + @Override + public void visit(Soldier soldier) { + // Do nothing + } + + @Override + public void visit(Sergeant sergeant) { + LOGGER.info("Hello {}", sergeant); + } + + @Override + public void visit(Commander commander) { + // Do nothing + } +} + +@Slf4j +public class SoldierVisitor implements UnitVisitor { + + @Override + public void visit(Soldier soldier) { + LOGGER.info("Greetings {}", soldier); + } + + @Override + public void visit(Sergeant sergeant) { + // Do nothing + } + + @Override + public void visit(Commander commander) { + // Do nothing + } +} +``` + +Por último, podemos mostrar el poder de los visitantes en acción. + +```java +commander.accept(new SoldierVisitor()); +commander.accept(new SergeantVisitor()); +commander.accept(new CommanderVisitor()); +``` + +Salida del programa: + +``` +Greetings soldier +Greetings soldier +Greetings soldier +Greetings soldier +Greetings soldier +Greetings soldier +Hello sergeant +Hello sergeant +Good to see you commander +``` + +## Diagrama de clases + +![alt text](./etc/visitor_1.png "Visitor") + +## Aplicabilidad + +Utilice el patrón Visitor cuando + +* Una estructura de objetos contiene muchas clases de objetos con diferentes interfaces, y desea realizar operaciones en estos objetos que dependen de sus clases concretas. +* Es necesario realizar muchas operaciones distintas y no relacionadas en los objetos de una estructura de objetos, y se desea evitar "contaminar" sus clases con estas operaciones. Visitor permite mantener juntas las operaciones relacionadas definiéndolas en una clase. Cuando la estructura de objetos es compartida por muchas aplicaciones, utilice Visitor para poner las operaciones sólo en aquellas aplicaciones que las necesiten. +* Las clases que definen la estructura del objeto raramente cambian, pero a menudo se quieren definir nuevas operaciones sobre la estructura. Cambiar las clases de la estructura del objeto requiere redefinir la interfaz para todos los visitantes, lo que es potencialmente costoso. Si las clases de la estructura del objeto cambian a menudo, probablemente sea mejor definir las operaciones en esas clases. + +## Tutoriales + +* [Refactoring Guru](https://refactoring.guru/design-patterns/visitor) +* [Dzone](https://dzone.com/articles/design-patterns-visitor) +* [Sourcemaking](https://sourcemaking.com/design_patterns/visitor) + +## Usos conocidos + +* [Apache Wicket](https://github.com/apache/wicket) component tree, Mire [MarkupContainer](https://github.com/apache/wicket/blob/b60ec64d0b50a611a9549809c9ab216f0ffa3ae3/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java) +* [javax.lang.model.element.AnnotationValue](http://docs.oracle.com/javase/8/docs/api/javax/lang/model/element/AnnotationValue.html) y [AnnotationValueVisitor](http://docs.oracle.com/javase/8/docs/api/javax/lang/model/element/AnnotationValueVisitor.html) +* [javax.lang.model.element.Element](http://docs.oracle.com/javase/8/docs/api/javax/lang/model/element/Element.html) y [Element Visitor](http://docs.oracle.com/javase/8/docs/api/javax/lang/model/element/ElementVisitor.html) +* [java.nio.file.FileVisitor](http://docs.oracle.com/javase/8/docs/api/java/nio/file/FileVisitor.html) + +## Créditos + +* [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59) +* [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b) +* [Refactoring to Patterns](https://www.amazon.com/gp/product/0321213351/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321213351&linkCode=as2&tag=javadesignpat-20&linkId=2a76fcb387234bc71b1c61150b3cc3a7) diff --git a/localization/es/visitor/etc/visitor.png b/localization/es/visitor/etc/visitor.png new file mode 100644 index 0000000000000000000000000000000000000000..5bbee60eeabf0d474e4cad4c09249c5947abe593 GIT binary patch literal 22790 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 literal 0 HcmV?d00001 diff --git a/localization/es/visitor/etc/visitor_1.png b/localization/es/visitor/etc/visitor_1.png new file mode 100644 index 0000000000000000000000000000000000000000..de5285d7fdc36722b8ffac4190f25ba7427feb02 GIT binary patch literal 47078 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

      dT_9 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 WkM_vCm+q&L|HsH)kja!XaQ_$hI!I&y literal 0 HcmV?d00001 From 63dd063372cd221b373d7a1f9f23f4a514dccb68 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 9 Apr 2024 20:17:31 +0300 Subject: [PATCH 064/580] docs: add luismateoh as a contributor for review (#2906) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] --------- Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 3 ++- README.md | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 15bd40a1d813..281639027cf3 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2992,7 +2992,8 @@ "avatar_url": "https://avatars.githubusercontent.com/u/44934142?v=4", "profile": "https://github.com/luismateoh", "contributions": [ - "translation" + "translation", + "review" ] }, { diff --git a/README.md b/README.md index 2f6020adc81f..1abcb2c802fa 100644 --- a/README.md +++ b/README.md @@ -495,7 +495,7 @@ This project is licensed under the terms of the MIT license. Aditya
      Aditya

      📖 💻 nooynayr
      nooynayr

      📖 CYBERCRUX2
      CYBERCRUX2

      📖 - Luis Mateo Hincapié Martinez
      Luis Mateo Hincapié Martinez

      🌠+ Luis Mateo Hincapié Martinez
      Luis Mateo Hincapié Martinez

      🌠👀 guqing
      guqing

      💻 From 1e4edc80d095db58257cf25082119dee0f91fe13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20Mateo=20Hincapi=C3=A9=20Martinez?= <44934142+luismateoh@users.noreply.github.com> Date: Tue, 9 Apr 2024 12:19:21 -0500 Subject: [PATCH 065/580] translation: Translated missing behavioral patterns category to Spanish (Task of issue #2277) (#2895) * Translate behavioral patterns to Spanish * Translate behavioral patterns to Spanish * Translate behavioral patterns to Spanish * Update bytecode.urm.png image in spanish translation * Update translations --------- Co-authored-by: luis.hincapie --- localization/es/bytecode/README.md | 255 ++++++ localization/es/bytecode/etc/bytecode.urm.png | Bin 0 -> 86123 bytes .../es/chain-of-responsibility/README.md | 200 +++++ .../etc/chain-of-responsibility.urm.png | Bin 0 -> 134845 bytes localization/es/client-session/README.md | 116 +++ .../etc/session_state_pattern.png | Bin 0 -> 50158 bytes .../es/collecting-parameter/README.md | 219 +++++ .../etc/collecting-parameter.urm.png | Bin 0 -> 55073 bytes localization/es/command/README.md | 243 +++++ localization/es/command/etc/command.png | Bin 0 -> 51106 bytes localization/es/commander/README.md | 131 +++ .../es/commander/etc/commander.urm.png | Bin 0 -> 322274 bytes localization/es/composite-entity/README.md | 2 +- localization/es/data-locality/README.md | 29 + .../data-locality/etc/data-locality.urm.png | Bin 0 -> 68133 bytes localization/es/dirty-flag/README.md | 27 + localization/es/dirty-flag/etc/dirty-flag.png | Bin 0 -> 9192 bytes localization/es/double-buffer/README.md | 241 +++++ .../double-buffer/etc/double-buffer.urm.png | Bin 0 -> 35073 bytes localization/es/extension-objects/README.md | 142 +++ .../extension-objects/etc/extension_obj.png | Bin 0 -> 38018 bytes localization/es/feature-toggle/README.md | 75 ++ .../es/feature-toggle/etc/feature-toggle.png | Bin 0 -> 55425 bytes localization/es/game-loop/README.md | 245 +++++ .../es/game-loop/etc/game-loop.urm.png | Bin 0 -> 57585 bytes localization/es/health-check/README.md | 451 ++++++++++ .../es/health-check/etc/health-check.png | Bin 0 -> 162347 bytes localization/es/identity-map/README.md | 191 ++++ .../es/identity-map/etc/IdentityMap.png | Bin 0 -> 83033 bytes localization/es/intercepting-filter/README.md | 165 ++++ .../etc/intercepting-filter.png | Bin 0 -> 75351 bytes localization/es/interpreter/README.md | 169 ++++ .../es/interpreter/etc/interpreter_1.png | Bin 0 -> 46272 bytes localization/es/leader-election/README.md | 835 ++++++++++++++++++ .../etc/leader-election.urm.png | Bin 0 -> 173701 bytes localization/es/mediator/README.md | 190 ++++ localization/es/mediator/etc/mediator_1.png | Bin 0 -> 59727 bytes localization/es/memento/README.md | 169 ++++ localization/es/memento/etc/memento.png | Bin 0 -> 22492 bytes localization/es/null-object/README.md | 174 ++++ .../es/null-object/etc/null-object.png | Bin 0 -> 14069 bytes localization/es/observer/README.md | 155 ++++ localization/es/observer/etc/observer.png | Bin 0 -> 18867 bytes localization/es/parameter-object/README.md | 124 +++ .../parameter-object/etc/parameter-object.png | Bin 0 -> 182925 bytes localization/es/partial-response/README.md | 23 + .../etc/partial-response.urm.png | Bin 0 -> 27781 bytes localization/es/pipeline/README.md | 110 +++ localization/es/pipeline/etc/pipeline.urm.png | Bin 0 -> 31882 bytes localization/es/poison-pill/README.md | 216 +++++ .../es/poison-pill/etc/poison-pill.png | Bin 0 -> 15833 bytes localization/es/presentation-model/README.md | 192 ++++ .../etc/presentation-model.urm.png | Bin 0 -> 123766 bytes .../es/presentation-model/etc/result.png | Bin 0 -> 13254 bytes localization/es/priority-queue/README.md | 195 ++++ .../priority-queue/etc/priority-queue.urm.png | Bin 0 -> 52777 bytes localization/es/proxy/README.md | 2 +- localization/es/retry/README.md | 120 +++ localization/es/retry/etc/retry.png | Bin 0 -> 52004 bytes .../es/single-table-inheritance/README.md | 2 +- localization/es/twin/README.md | 2 +- 61 files changed, 5406 insertions(+), 4 deletions(-) create mode 100644 localization/es/bytecode/README.md create mode 100644 localization/es/bytecode/etc/bytecode.urm.png create mode 100644 localization/es/chain-of-responsibility/README.md create mode 100644 localization/es/chain-of-responsibility/etc/chain-of-responsibility.urm.png create mode 100644 localization/es/client-session/README.md create mode 100644 localization/es/client-session/etc/session_state_pattern.png create mode 100644 localization/es/collecting-parameter/README.md create mode 100644 localization/es/collecting-parameter/etc/collecting-parameter.urm.png create mode 100644 localization/es/command/README.md create mode 100644 localization/es/command/etc/command.png create mode 100644 localization/es/commander/README.md create mode 100644 localization/es/commander/etc/commander.urm.png create mode 100644 localization/es/data-locality/README.md create mode 100644 localization/es/data-locality/etc/data-locality.urm.png create mode 100644 localization/es/dirty-flag/README.md create mode 100644 localization/es/dirty-flag/etc/dirty-flag.png create mode 100644 localization/es/double-buffer/README.md create mode 100644 localization/es/double-buffer/etc/double-buffer.urm.png create mode 100644 localization/es/extension-objects/README.md create mode 100644 localization/es/extension-objects/etc/extension_obj.png create mode 100644 localization/es/feature-toggle/README.md create mode 100644 localization/es/feature-toggle/etc/feature-toggle.png create mode 100644 localization/es/game-loop/README.md create mode 100644 localization/es/game-loop/etc/game-loop.urm.png create mode 100644 localization/es/health-check/README.md create mode 100644 localization/es/health-check/etc/health-check.png create mode 100644 localization/es/identity-map/README.md create mode 100644 localization/es/identity-map/etc/IdentityMap.png create mode 100644 localization/es/intercepting-filter/README.md create mode 100644 localization/es/intercepting-filter/etc/intercepting-filter.png create mode 100644 localization/es/interpreter/README.md create mode 100644 localization/es/interpreter/etc/interpreter_1.png create mode 100644 localization/es/leader-election/README.md create mode 100644 localization/es/leader-election/etc/leader-election.urm.png create mode 100644 localization/es/mediator/README.md create mode 100644 localization/es/mediator/etc/mediator_1.png create mode 100644 localization/es/memento/README.md create mode 100644 localization/es/memento/etc/memento.png create mode 100644 localization/es/null-object/README.md create mode 100644 localization/es/null-object/etc/null-object.png create mode 100644 localization/es/observer/README.md create mode 100644 localization/es/observer/etc/observer.png create mode 100644 localization/es/parameter-object/README.md create mode 100644 localization/es/parameter-object/etc/parameter-object.png create mode 100644 localization/es/partial-response/README.md create mode 100644 localization/es/partial-response/etc/partial-response.urm.png create mode 100644 localization/es/pipeline/README.md create mode 100644 localization/es/pipeline/etc/pipeline.urm.png create mode 100644 localization/es/poison-pill/README.md create mode 100644 localization/es/poison-pill/etc/poison-pill.png create mode 100644 localization/es/presentation-model/README.md create mode 100644 localization/es/presentation-model/etc/presentation-model.urm.png create mode 100644 localization/es/presentation-model/etc/result.png create mode 100644 localization/es/priority-queue/README.md create mode 100644 localization/es/priority-queue/etc/priority-queue.urm.png create mode 100644 localization/es/retry/README.md create mode 100644 localization/es/retry/etc/retry.png diff --git a/localization/es/bytecode/README.md b/localization/es/bytecode/README.md new file mode 100644 index 000000000000..9558ac24927f --- /dev/null +++ b/localization/es/bytecode/README.md @@ -0,0 +1,255 @@ +--- +title: Bytecode +category: Behavioral +language: es +tag: + - Game programming +--- + +## Propósito + +Permite codificar el comportamiento como instrucciones para una máquina virtual. + +## Explicación + +Ejemplo del mundo real + +> Un equipo está trabajando en un nuevo juego en el que los magos luchan entre sí. El comportamiento de los magos necesita ser cuidadosamente ajustado e iterado cientos de veces a través de pruebas de juego. No es óptimo pedir al programador que haga cambios cada vez que el diseñador del juego quiere variar el comportamiento, así que el comportamiento del mago se implementa como una máquina virtual basada en datos. + +En palabras sencillas + +> El patrón Bytecode permite un comportamiento dirigido por datos en lugar de por código. + +[Gameprogrammingpatterns.com](https://gameprogrammingpatterns.com/bytecode.html) indica la documentación: + +> Un conjunto de instrucciones define las operaciones de bajo nivel que pueden realizarse. Una serie de instrucciones se codifica como una secuencia de bytes. Una máquina virtual ejecuta estas instrucciones de una en una, utilizando una pila para los valores intermedios. La combinación de instrucciones permite definir comportamientos complejos de alto nivel. + +**Ejemplo programático** + +Uno de los objetos más importantes del juego es la clase Mago `Wizard`. + +```java + +@AllArgsConstructor +@Setter +@Getter +@Slf4j +public class Wizard { + + private int health; + private int agility; + private int wisdom; + private int numberOfPlayedSounds; + private int numberOfSpawnedParticles; + + public void playSound() { + LOGGER.info("Playing sound"); + numberOfPlayedSounds++; + } + + public void spawnParticles() { + LOGGER.info("Spawning particles"); + numberOfSpawnedParticles++; + } +} +``` + +A continuación, mostramos las instrucciones disponibles para nuestra máquina virtual. Cada una de las instrucciones tiene su propia semántica sobre cómo opera con los datos de la pila. Por ejemplo, la instrucción ADD toma los dos elementos superiores de la pila, los suma y coloca el resultado en la pila. + +```java + +@AllArgsConstructor +@Getter +public enum Instruction { + + LITERAL(1), // e.g. "LITERAL 0", push 0 to stack + SET_HEALTH(2), // e.g. "SET_HEALTH", pop health and wizard number, call set health + SET_WISDOM(3), // e.g. "SET_WISDOM", pop wisdom and wizard number, call set wisdom + SET_AGILITY(4), // e.g. "SET_AGILITY", pop agility and wizard number, call set agility + PLAY_SOUND(5), // e.g. "PLAY_SOUND", pop value as wizard number, call play sound + SPAWN_PARTICLES(6), // e.g. "SPAWN_PARTICLES", pop value as wizard number, call spawn particles + GET_HEALTH(7), // e.g. "GET_HEALTH", pop value as wizard number, push wizard's health + GET_AGILITY(8), // e.g. "GET_AGILITY", pop value as wizard number, push wizard's agility + GET_WISDOM(9), // e.g. "GET_WISDOM", pop value as wizard number, push wizard's wisdom + ADD(10), // e.g. "ADD", pop 2 values, push their sum + DIVIDE(11); // e.g. "DIVIDE", pop 2 values, push their division + // ... +} +``` + +En el corazón de nuestro ejemplo está la clase `VirtualMachine`. Toma instrucciones como entrada y las ejecuta para proporcionar el comportamiento del objeto de juego. + +```java + +@Getter +@Slf4j +public class VirtualMachine { + + private final Stack stack = new Stack<>(); + + private final Wizard[] wizards = new Wizard[2]; + + public VirtualMachine() { + wizards[0] = new Wizard(randomInt(3, 32), randomInt(3, 32), randomInt(3, 32), + 0, 0); + wizards[1] = new Wizard(randomInt(3, 32), randomInt(3, 32), randomInt(3, 32), + 0, 0); + } + + public VirtualMachine(Wizard wizard1, Wizard wizard2) { + wizards[0] = wizard1; + wizards[1] = wizard2; + } + + public void execute(int[] bytecode) { + for (var i = 0; i < bytecode.length; i++) { + Instruction instruction = Instruction.getInstruction(bytecode[i]); + switch (instruction) { + case LITERAL: + // Read the next byte from the bytecode. + int value = bytecode[++i]; + // Push the next value to stack + stack.push(value); + break; + case SET_AGILITY: + var amount = stack.pop(); + var wizard = stack.pop(); + setAgility(wizard, amount); + break; + case SET_WISDOM: + amount = stack.pop(); + wizard = stack.pop(); + setWisdom(wizard, amount); + break; + case SET_HEALTH: + amount = stack.pop(); + wizard = stack.pop(); + setHealth(wizard, amount); + break; + case GET_HEALTH: + wizard = stack.pop(); + stack.push(getHealth(wizard)); + break; + case GET_AGILITY: + wizard = stack.pop(); + stack.push(getAgility(wizard)); + break; + case GET_WISDOM: + wizard = stack.pop(); + stack.push(getWisdom(wizard)); + break; + case ADD: + var a = stack.pop(); + var b = stack.pop(); + stack.push(a + b); + break; + case DIVIDE: + a = stack.pop(); + b = stack.pop(); + stack.push(b / a); + break; + case PLAY_SOUND: + wizard = stack.pop(); + getWizards()[wizard].playSound(); + break; + case SPAWN_PARTICLES: + wizard = stack.pop(); + getWizards()[wizard].spawnParticles(); + break; + default: + throw new IllegalArgumentException("Invalid instruction value"); + } + LOGGER.info("Executed " + instruction.name() + ", Stack contains " + getStack()); + } + } + + public void setHealth(int wizard, int amount) { + wizards[wizard].setHealth(amount); + } + // other setters -> + // ... +} +``` + +Ahora podemos mostrar el ejemplo completo utilizando la máquina virtual. + +```java + public static void main(String[]args){ + + var vm=new VirtualMachine( + new Wizard(45,7,11,0,0), + new Wizard(36,18,8,0,0)); + + vm.execute(InstructionConverterUtil.convertToByteCode("LITERAL 0")); + vm.execute(InstructionConverterUtil.convertToByteCode("LITERAL 0")); + vm.execute(InstructionConverterUtil.convertToByteCode("GET_HEALTH")); + vm.execute(InstructionConverterUtil.convertToByteCode("LITERAL 0")); + vm.execute(InstructionConverterUtil.convertToByteCode("GET_AGILITY")); + vm.execute(InstructionConverterUtil.convertToByteCode("LITERAL 0")); + vm.execute(InstructionConverterUtil.convertToByteCode("GET_WISDOM")); + vm.execute(InstructionConverterUtil.convertToByteCode("ADD")); + vm.execute(InstructionConverterUtil.convertToByteCode("LITERAL 2")); + vm.execute(InstructionConverterUtil.convertToByteCode("DIVIDE")); + vm.execute(InstructionConverterUtil.convertToByteCode("ADD")); + vm.execute(InstructionConverterUtil.convertToByteCode("SET_HEALTH")); + } +``` + +Aquí está la salida de la consola. + +``` +16:20:10.193 [main] INFO com.iluwatar.bytecode.VirtualMachine - Executed LITERAL, Stack contains [0] +16:20:10.196 [main] INFO com.iluwatar.bytecode.VirtualMachine - Executed LITERAL, Stack contains [0, 0] +16:20:10.197 [main] INFO com.iluwatar.bytecode.VirtualMachine - Executed GET_HEALTH, Stack contains [0, 45] +16:20:10.197 [main] INFO com.iluwatar.bytecode.VirtualMachine - Executed LITERAL, Stack contains [0, 45, 0] +16:20:10.197 [main] INFO com.iluwatar.bytecode.VirtualMachine - Executed GET_AGILITY, Stack contains [0, 45, 7] +16:20:10.197 [main] INFO com.iluwatar.bytecode.VirtualMachine - Executed LITERAL, Stack contains [0, 45, 7, 0] +16:20:10.197 [main] INFO com.iluwatar.bytecode.VirtualMachine - Executed GET_WISDOM, Stack contains [0, 45, 7, 11] +16:20:10.197 [main] INFO com.iluwatar.bytecode.VirtualMachine - Executed ADD, Stack contains [0, 45, 18] +16:20:10.197 [main] INFO com.iluwatar.bytecode.VirtualMachine - Executed LITERAL, Stack contains [0, 45, 18, 2] +16:20:10.198 [main] INFO com.iluwatar.bytecode.VirtualMachine - Executed DIVIDE, Stack contains [0, 45, 9] +16:20:10.198 [main] INFO com.iluwatar.bytecode.VirtualMachine - Executed ADD, Stack contains [0, 54] +16:20:10.198 [main] INFO com.iluwatar.bytecode.VirtualMachine - Executed SET_HEALTH, Stack contains [] +``` + +## Diagrama de clases + +![alt text](./etc/bytecode.urm.png "Bytecode class diagram") + +## Aplicabilidad + +Utiliza el patrón Bytecode cuando tengas que definir muchos comportamientos y el lenguaje de implementación de tu juego no sea el adecuado porque: + +* Es demasiado de bajo nivel, por lo que es tedioso o propenso a errores para programar. +* Iterar en él lleva demasiado tiempo debido a tiempos de compilación lentos u otros problemas de herramientas. +* Tiene demasiada confianza. Si quieres asegurarte de que el comportamiento definido no puede romper el juego, necesitas separarlo del resto del código base. + +## Usos Conocidos + +* Java Virtual Machine (JVM) utiliza bytecode para permitir que los programas Java se ejecuten en cualquier dispositivo que tenga JVM instalado. +* Python compila sus scripts a bytecode que luego es interpretado por la Máquina Virtual Python. +* NET Framework utiliza una forma de bytecode llamada Microsoft Intermediate Language (MSIL). + +## Consecuencias + +Ventajas: + +* Portabilidad: Los programas pueden ejecutarse en cualquier plataforma que disponga de una máquina virtual compatible. +* Seguridad: La máquina virtual puede aplicar controles de seguridad al código de bytes. +* Rendimiento: Los compiladores JIT pueden optimizar el código de bytes en tiempo de ejecución, mejorando potencialmente el rendimiento respecto al código interpretado. + +Desventajas: + +* Sobrecarga: Ejecutar bytecode normalmente implica más sobrecarga que ejecutar código nativo, lo que puede afectar al rendimiento. +* Complejidad: Implementar y mantener una máquina virtual añade complejidad al sistema. + +## Patrones relacionados + +* [Intérprete](https://java-design-patterns.com/patterns/interpreter/) se utiliza a menudo dentro de la implementación de VMs para interpretar instrucciones bytecode. +* [Comando](https://java-design-patterns.com/patterns/command/): Las instrucciones bytecode pueden ser vistas como comandos ejecutados por la VM. +* [Método de fábrica](https://java-design-patterns.com/patterns/factory-method/): Las VMs pueden utilizar métodos de fábrica para instanciar operaciones o instrucciones definidas en el bytecode. + +## Créditos + +* [Game programming patterns](http://gameprogrammingpatterns.com/bytecode.html) +* [Programming Language Pragmatics](https://amzn.to/49Tusnn) diff --git a/localization/es/bytecode/etc/bytecode.urm.png b/localization/es/bytecode/etc/bytecode.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..51335fa0a4b40a73957b56e79805aa9aed7e4cd1 GIT binary patch literal 86123 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 El Rey Orco da órdenes en voz alta a su ejército. El más cercano a reaccionar es el comandante, luego un oficial y después un soldado. El comandante, el oficial y el soldado forman una cadena de responsabilidad. + +En palabras sencillas + +> Ayuda a construir una cadena de objetos. Una solicitud entra por un extremo y sigue pasando de un objeto a otro hasta que encuentra un gestor adecuado. + +Wikipedia dice + +> En diseño orientado a objetos, el patrón de cadena de responsabilidad es un patrón de diseño que consiste en una fuente de objetos de comando y una serie de objetos de procesamiento. Cada objeto de procesamiento contiene lógica que define los tipos de objetos de comando que puede manejar; el resto se pasa al siguiente objeto de procesamiento de la cadena. + +**Ejemplo programático** + +Traduciendo nuestro ejemplo con los orcos de arriba. Primero, tenemos la clase `Request`: + +```java +import lombok.Getter; + +@Getter +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 void markHandled() { + this.handled = true; + } + + @Override + public String toString() { + return getRequestDescription(); + } +} + +public enum RequestType { + DEFEND_CASTLE, TORTURE_PRISONER, COLLECT_TAX +} +``` + +A continuación, mostramos la jerarquía del gestor de peticiones. + +```java +public interface RequestHandler { + + boolean canHandleRequest(Request req); + + int getPriority(); + + void handle(Request req); + + String name(); +} + +@Slf4j +public class OrcCommander implements RequestHandler { + @Override + public boolean canHandleRequest(Request req) { + return req.getRequestType() == RequestType.DEFEND_CASTLE; + } + + @Override + public int getPriority() { + return 2; + } + + @Override + public void handle(Request req) { + req.markHandled(); + LOGGER.info("{} handling request \"{}\"", name(), req); + } + + @Override + public String name() { + return "Orc commander"; + } +} + +// OrcOfficer and OrcSoldier are defined similarly as OrcCommander + +``` + +El Rey Orco da las órdenes y forma la cadena. + +```java +public class OrcKing { + + private List handlers; + + public OrcKing() { + buildChain(); + } + + private void buildChain() { + handlers = Arrays.asList(new OrcCommander(), new OrcOfficer(), new OrcSoldier()); + } + + public void makeRequest(Request req) { + handlers + .stream() + .sorted(Comparator.comparing(RequestHandler::getPriority)) + .filter(handler -> handler.canHandleRequest(req)) + .findFirst() + .ifPresent(handler -> handler.handle(req)); + } +} +``` + +La cadena de responsabilidad en acción. + +```java +var king=new OrcKing(); + king.makeRequest(new Request(RequestType.DEFEND_CASTLE,"defend castle")); + king.makeRequest(new Request(RequestType.TORTURE_PRISONER,"torture prisoner")); + king.makeRequest(new Request(RequestType.COLLECT_TAX,"collect tax")); +``` + +La salida de la consola. + +``` +Orc commander handling request "defend castle" +Orc officer handling request "torture prisoner" +Orc soldier handling request "collect tax" +``` + +## Diagrama de clases + +![alt text](./etc/cadena-de-responsabilidad.urm.png "Diagrama de clases de la cadena de responsabilidad") + +## Aplicabilidad + +Utilice Cadena de Responsabilidad cuando + +* Más de un objeto puede gestionar una petición, y el gestor no se conoce a priori. El gestor debe determinarse automáticamente. +* Se desea enviar una petición a uno de varios objetos sin especificar explícitamente el receptor. +* El conjunto de objetos que pueden gestionar una solicitud debe especificarse dinámicamente. + +## Usos conocidos + +* Burbujeo de eventos en frameworks GUI donde un evento puede ser manejado en múltiples niveles de la jerarquía de un componente UI. +* Frameworks de middleware en los que una petición pasa a través de una cadena de objetos de procesamiento. +* Marcos de trabajo de registro donde los mensajes pueden pasar a través de una serie de registradores, cada uno posiblemente manejándolos de manera diferente. +* [java.util.logging.Logger#log()](http://docs.oracle.com/javase/8/docs/api/java/util/logging/Logger.html#log%28java.util.logging.Level,%20java.lang.String%29) +* [Apache Commons Chain](https://commons.apache.org/proper/commons-chain/index.html) +* [javax.servlet.Filter#doFilter()](http://docs.oracle.com/javaee/7/api/javax/servlet/Filter.html#doFilter-javax.servlet.ServletRequest-javax.servlet.ServletResponse-javax.servlet.FilterChain-) + +## Consecuencias + +Ventajas: + +* Acoplamiento reducido. El emisor de una petición no necesita conocer el manejador concreto que procesará la petición. +* Mayor flexibilidad a la hora de asignar responsabilidades a los objetos. Se pueden añadir o cambiar responsabilidades para gestionar una petición cambiando los miembros y el orden de la cadena. +* Permite establecer un gestor por defecto si no hay ningún gestor concreto que pueda gestionar la solicitud. + +Desventajas: + +* Puede ser difícil depurar y entender el flujo, especialmente si la cadena es larga y compleja. +* La petición puede quedar sin gestionar si la cadena no incluye un gestor "catch-all". +* Pueden surgir problemas de rendimiento debido a la posibilidad de pasar por varios gestores antes de encontrar el correcto, o no encontrarlo en absoluto. + +## Patrones Relacionados + +* [Comando](https://java-design-patterns.com/patterns/command/): puede ser usado para encapsular una petición como un objeto, que puede ser pasado a lo largo de la cadena. +* [Composite](https://java-design-patterns.com/patterns/composite/): la Cadena de Responsabilidad se aplica a menudo junto con el patrón Composite. +* [Decorator](https://java-design-patterns.com/patterns/decorator/): los decoradores pueden encadenarse de forma similar a las responsabilidades en el patrón Cadena de responsabilidad. + +## Créditos + +* [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59) +* [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b) +* [Pattern-Oriented Software Architecture, Volume 1: A System of Patterns](https://amzn.to/3PAJUg5) +* [Refactoring to Patterns](https://amzn.to/3VOO4F5) +* [Pattern languages of program design 3](https://amzn.to/4a4NxTH) diff --git a/localization/es/chain-of-responsibility/etc/chain-of-responsibility.urm.png b/localization/es/chain-of-responsibility/etc/chain-of-responsibility.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..af1bd105455b7b9bdc540248ce3b9d3d4220d541 GIT binary patch literal 134845 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

      P$|nVfGFUS8`f=q!dG_>ob#|ia2?5Us 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 UzM=;+L_r37y85}Sb4q9e01i2RNB{r; literal 0 HcmV?d00001 diff --git a/localization/es/client-session/README.md b/localization/es/client-session/README.md new file mode 100644 index 000000000000..fbb31b9e926b --- /dev/null +++ b/localization/es/client-session/README.md @@ -0,0 +1,116 @@ +--- +title: Client Session +category: Behavioral +language: es +tags: + - Session management + - Web development +--- + +## También conocido como + +* User session + +## Propósito + +El patrón de diseño Client Session tiene como objetivo mantener el estado y los datos de un usuario a través de múltiples peticiones dentro de una aplicación web, asegurando una experiencia de usuario continua y personalizada. + +## Explicación + +Ejemplo real + +> Quieres crear una aplicación de gestión de datos que permita a los usuarios enviar peticiones al servidor para modificar y realizar cambios en los datos almacenados en sus dispositivos. Estas peticiones son pequeñas y los datos son individuales para cada usuario, negando la necesidad de una implementación de base de datos a gran escala. Utilizando el patrón de sesión de cliente, se pueden gestionar múltiples peticiones simultáneas, equilibrando la carga de clientes entre diferentes servidores con facilidad debido a que los servidores permanecen sin estado. También se elimina la necesidad de almacenar identificadores de sesión en el lado del servidor debido a que los clientes proporcionan toda la información que un servidor necesita para realizar su proceso. + +En pocas palabras + +> En lugar de almacenar información sobre el cliente actual y la información a la que se está accediendo en el servidor, se mantiene sólo en el lado del cliente. El cliente tiene que enviar datos de sesión con cada solicitud al servidor y tiene que enviar un estado actualizado de vuelta al cliente, que se almacena en la máquina del cliente. El servidor no tiene que almacenar la información del cliente. ([ref](https://dzone.com/articles/practical-php-patterns/practical-php-patterns-client)) + +**Ejemplo programático** + +Aquí está el código de ejemplo para describir el patrón cliente-sesión. En el siguiente código estamos creando primero una instancia del Servidor. Esta instancia del servidor se utilizará entonces para obtener objetos Session para dos clientes. Como puedes ver en el siguiente código, el objeto Session puede ser utilizado para almacenar cualquier información relevante que sea requerida por el servidor para procesar la petición del cliente. Estos objetos Session serán pasados con cada Request al servidor. La solicitud tendrá el objeto Session que almacena los detalles relevantes del cliente junto con los datos requeridos para procesar la solicitud. La información de sesión en cada solicitud ayuda al servidor a identificar al cliente y procesar la solicitud en consecuencia. + +```java +public class App { + + public static void main(String[] args) { + var server = new Server("localhost", 8080); + var session1 = server.getSession("Session1"); + var session2 = server.getSession("Session2"); + var request1 = new Request("Data1", session1); + var request2 = new Request("Data2", session2); + server.process(request1); + server.process(request2); + } +} + +@Data +@AllArgsConstructor +public class Session { + + /** + * Session id. + */ + private String id; + + /** + * Client name. + */ + private String clientName; + +} + +@Data +@AllArgsConstructor +public class Request { + + private String data; + + private Session session; + +} +``` + +## Diagrama de arquitectura + +![alt text](./etc/session_state_pattern.png "Session State Pattern") + +## Aplicabilidad + +Utilice el patrón de estado del cliente cuando: + +* Aplicaciones web que requieran autenticación y autorización del usuario. +* Aplicaciones que necesiten realizar un seguimiento de las actividades y preferencias del usuario a lo largo de múltiples peticiones o visitas. +* Sistemas donde los recursos del servidor necesitan ser optimizados descargando la gestión del estado al lado del cliente. + +## Usos conocidos + +* Sitios web de comercio electrónico para rastrear el contenido de la cesta de la compra a lo largo de las sesiones. +* Plataformas en línea que ofrecen contenidos personalizados basados en las preferencias y el historial del usuario. +* Aplicaciones web que requieren el inicio de sesión del usuario para acceder a contenidos personalizados o seguros. + +## Consecuencias + +Beneficios: + +* Mejora del rendimiento del servidor al reducir la necesidad de almacenar el estado del usuario en el servidor. +* Mejora de la experiencia del usuario a través de contenidos personalizados y navegación fluida a través de las diferentes partes de la aplicación. +* Flexibilidad en la gestión de sesiones a través de varios mecanismos de almacenamiento del lado del cliente (por ejemplo, cookies, Web Storage API). + +Desventajas: + +* Riesgos potenciales de seguridad si se almacena información sensible en las sesiones del cliente sin el cifrado y la validación adecuados. +* Dependencia de las capacidades y ajustes del cliente, como las políticas de cookies, que pueden variar según el navegador y la configuración del usuario. +* Mayor complejidad en la lógica de gestión de sesiones, especialmente en la gestión de la caducidad, renovación y sincronización de sesiones en varios dispositivos o pestañas. + +## Patrones relacionados + +* Sesión Servidor: A menudo se utiliza junto con el patrón Client Session para proporcionar un equilibrio entre la eficiencia del lado del cliente y el control del lado del servidor. +* [Singleton](https://java-design-patterns.com/patterns/singleton/): Asegurar una única instancia de la sesión de un usuario en toda la aplicación. +* [Estado](https://java-design-patterns.com/patterns/state/): Gestionar las transiciones de estado en una sesión, como los estados autenticado, invitado o caducado. + +## Créditos + +* [DZone - Practical PHP patterns](https://dzone.com/articles/practical-php-patterns/practical-php-patterns-client) +* [Client Session State Design Pattern - Ram N Java](https://www.youtube.com/watch?v=ycOSj9g41pc) +* [Professional Java for Web Applications](https://amzn.to/4aazY59) +* [Securing Web Applications with Spring Security](https://amzn.to/3PCCEA1) diff --git a/localization/es/client-session/etc/session_state_pattern.png b/localization/es/client-session/etc/session_state_pattern.png new file mode 100644 index 0000000000000000000000000000000000000000..f1e23be957669215ed6829e444cc31fa152e58e3 GIT binary patch literal 50158 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 + + /* + * Using numerous sub-methods to collaboratively add information to the result collecting parameter + */ + addA4Papers(result); + addA3Papers(result); + addA2Papers(result); + } +} +``` + +Utilizamos los métodos `addA4Paper`, `addA3Paper` y `addA2Paper` para rellenar el parámetro de recogida `result` con los trabajos de impresión adecuados según la política descrita anteriormente. Las tres políticas se codifican a continuación, + +```java +public class App { + static PrinterQueue printerQueue = PrinterQueue.getInstance(); + + /** + * Adds A4 document jobs to the collecting parameter according to some policy that can be whatever the client + * (the print center) wants. + * + * @param printerItemsCollection the collecting parameter + */ + public static void addA4Papers(Queue printerItemsCollection) { + /* + Iterate through the printer queue, and add A4 papers according to the correct policy to the collecting parameter, + which is 'printerItemsCollection' in this case. + */ + for (PrinterItem nextItem : printerQueue.getPrinterQueue()) { + if (nextItem.paperSize.equals(PaperSizes.A4)) { + var isColouredAndSingleSided = + nextItem.isColour && !nextItem.isDoubleSided; + if (isColouredAndSingleSided) { + printerItemsCollection.add(nextItem); + } else if (!nextItem.isColour) { + printerItemsCollection.add(nextItem); + } + } + } + } + + /** + * Adds A3 document jobs to the collecting parameter according to some policy that can be whatever the client + * (the print center) wants. The code is similar to the 'addA4Papers' method. The code can be changed to accommodate + * the wants of the client. + * + * @param printerItemsCollection the collecting parameter + */ + public static void addA3Papers(Queue printerItemsCollection) { + for (PrinterItem nextItem : printerQueue.getPrinterQueue()) { + if (nextItem.paperSize.equals(PaperSizes.A3)) { + + // Encoding the policy into a Boolean: the A3 paper cannot be coloured and double-sided at the same time + var isNotColouredAndSingleSided = + !nextItem.isColour && !nextItem.isDoubleSided; + if (isNotColouredAndSingleSided) { + printerItemsCollection.add(nextItem); + } + } + } + } + + /** + * Adds A2 document jobs to the collecting parameter according to some policy that can be whatever the client + * (the print center) wants. The code is similar to the 'addA4Papers' method. The code can be changed to accommodate + * the wants of the client. + * + * @param printerItemsCollection the collecting parameter + */ + public static void addA2Papers(Queue printerItemsCollection) { + for (PrinterItem nextItem : printerQueue.getPrinterQueue()) { + if (nextItem.paperSize.equals(PaperSizes.A2)) { + + // Encoding the policy into a Boolean: the A2 paper must be single page, single-sided, and non-coloured. + var isNotColouredSingleSidedAndOnePage = + nextItem.pageCount == 1 && + !nextItem.isDoubleSided + && !nextItem.isColour; + if (isNotColouredSingleSidedAndOnePage) { + printerItemsCollection.add(nextItem); + } + } + } + } +} +``` + +Cada método toma como argumento un parámetro de recogida. A continuación, añade elementos, tomados de una variable global, a este parámetro de recogida si cada elemento satisface un criterio determinado. Estos métodos pueden tener la política que desee el cliente. + +En este ejemplo de programación, se añaden tres trabajos de impresión a la cola. Sólo los dos primeros trabajos de impresión deben añadirse al parámetro de recogida según la política. Los elementos de la variable `result` después de la ejecución son, + +| paperSize | pageCount | isDoubleSided | isColour | +|-----------|-----------|---------------|----------| +| A4 | 5 | false | false | +| A3 | 2 | false | false | + +que es lo que esperábamos. + +## Diagrama de clases + +![alt text](./etc/collecting-parameter.urm.png "Collecting Parameter") + +## Aplicabilidad + +Utilice el patrón de diseño Recopilación de parámetros cuando + +- Cuando múltiples métodos producen una colección de resultados y quieres agregar estos resultados de una manera unificada. +- En escenarios donde reducir el número de colecciones creadas por métodos puede mejorar la eficiencia de memoria y el rendimiento. +- Al refactorizar métodos grandes que realizan varias tareas, incluida la recopilación de resultados de varias operaciones. + +## Tutoriales + +Los tutoriales para este método se encuentran en: + +- [Refactoring To Patterns](http://www.tarrani.net/RefactoringToPatterns.pdf) por Joshua Kerivsky +- [Smalltalk Best Practice Patterns](https://ptgmedia.pearsoncmg.com/images/9780134769042/samplepages/013476904X.pdf) por Kent Beck + +## Usos conocidos + +Joshua Kerivsky da un ejemplo real en su libro 'Refactoring to Patterns'. Da un ejemplo de uso del patrón de diseño "Collecting Parameter" para crear un método `toString()` para un árbol XML. Sin utilizar este patrón de diseño, esto requeriría una función voluminosa con condicionales y concatenación que empeoraría la legibilidad del código. Un método de este tipo puede dividirse en métodos más pequeños, cada uno de los cuales añade su propio conjunto de información al parámetro de recogida. Véase esto en [Refactoring To Patterns](http://www.tarrani.net/RefactoringToPatterns.pdf). + +Otros ejemplos son: + +- Agregar mensajes de error o fallos de validación en un proceso de validación complejo. +- Recopilar elementos o información mientras se recorre una estructura de datos compleja. +- Refactorización de funcionalidades de informes complejas en las que varias partes de un informe se generan mediante métodos diferentes. + +## Consecuencias + +Ventajas: + +- Reduce la duplicación de código centralizando el manejo de las colecciones en un único lugar. +- Mejora la claridad y la capacidad de mantenimiento al hacer explícito dónde y cómo se recogen los resultados. +- Mejora el rendimiento al minimizar la creación y gestión de múltiples objetos de recopilación. + +Desventajas: + +- Aumenta el acoplamiento entre el invocador y los métodos invocados, ya que deben ponerse de acuerdo sobre la colección a utilizar. +- Puede introducir efectos secundarios en los métodos si no se gestionan con cuidado, ya que los métodos ya no son autónomos en su gestión de resultados. + +## Patrones relacionados + +- [Composite](https://java-design-patterns.com/patterns/composite/): Puede utilizarse junto con Collecting Parameter cuando se trabaja con estructuras jerárquicas, permitiendo que los resultados se recojan a través de una estructura compuesta. +- [Visitante](https://java-design-patterns.com/patterns/visitor/): A menudo se utiliza conjuntamente, donde Visitor se encarga de recorrer y realizar operaciones en una estructura, y Collecting Parameter acumula los resultados. +- [Comando](https://java-design-patterns.com/patterns/command/): Los comandos pueden utilizar el parámetro de recopilación para agregar resultados de varias operaciones ejecutadas por los objetos de comando. + +## Créditos + +- [Refactoring To Patterns](http://www.tarrani.net/RefactoringToPatterns.pdf) by Joshua Kerivsky +- [Smalltalk Best Practice Patterns](https://ptgmedia.pearsoncmg.com/images/9780134769042/samplepages/013476904X.pdf) by Kent Beck +- [Wiki](https://wiki.c2.com/?CollectingParameter) +- [Refactoring: Improving the Design of Existing Code](https://amzn.to/3TVEgaB) +- [Clean Code: A Handbook of Agile Software Craftsmanship](https://amzn.to/4aApLP0) diff --git a/localization/es/collecting-parameter/etc/collecting-parameter.urm.png b/localization/es/collecting-parameter/etc/collecting-parameter.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..785d6ecc2da1db937e309089917138e578927fa0 GIT binary patch literal 55073 zcmeFZWmJ}J*DiX42q+4o0@9@jA|Nd-(jXlo2%-Ygog!fZ0@9t5f;1={N_UBLcS|>{ zdE@g6&+~rYx5hix+GFfJ#{LD|+*h3Eb)It`^Ei%qxy#9joj*%-7J)#Vmk<|LKp;?4 z5r|U~n5giHsOI)4{GhWEQMGz%YG!Ywqicl_(=pMpcxR+ zm9?=E<5N>(+*@2EaF*NpN~%`>`W%4*r?HDjQ~G8ydh0@o*eJPZ#6^Y}zjm_Nlp9!` zDK{}~^b3^uLbQn<%-!~Vnq%;JA#dsG1-CN;B}(t9dR8Z!R=2!NEt-1WE!v7EE6 zP~P(=Bbelj6KA^jwp`AV@Y%gAH1->IhFpk`TK3o#H~Sb-1}POED(txmzP?Z%Tlyl7 zJIvMjYd4cf?3^+dz6d>y9orhgO`*Udo@oVNm+V?$#wt5ZamU@~60*!wW z8l4$y*SXPrrtAlr7kRXi(zb(`{zY0W#%=mZW$$EDr<}m4rZmB)h81tVZRgO>T->ZG z84WW~mYEn&_j>-qV0Iwvqs`iDI=i;`AGD*YNy&F;aD2@Texe5Re*Z++TorX-@7ku?y(LntvlL^ zezyPgjl8@^q;>Pu;l+1(V-B>4s4*w?dz9D7eetNGI>ytamv!x$-xy!nyGp-;b}Hl< z?e(#xPW1lz^Y@eQeG+NbX6HdLVhm(Fthk7$|FW}@aEz7puA*p&C|ehbXLhOc2#+Go zQz0iDM1o?NW(nG@7iI^jzv>qf9(Oh~BM>eK31LAcJI(pXGj@0)g_}a!5-#Et7lJTf zmj}MNb_eqUx{tJL)n_5OGqQHDM-+Tm^>SK@@QeMFKHE{(L$QCzXTMUs|5LqF*>UH`ZbpZr48|TN zELnv5MG79|Pc0k@$a$X!Ve)`~XF9IzaDQn<|2zUQ zEP9zrtIqFQ-hhod0+Gk^@#9B2I=aJ6=fmsKLvUm|rH4yghfOa`trPYdn!wu_IG#|^W&b@d`Oawj$$`dF*Cc>Q}cmz?6E>|0fULnVt?p4 zgP{39`ulz*Rx=9OEm3?@Hrm=(dmcG$PcS(xd-R!>MQ-%L!NtYAgQ#Kz)zmoT{QcQF z4Mj_(yJ`gKiaAf8X{^t6E&WXEgJYWZ1yVM?&syZWR_9o>Cn#UlsbD1a5w0k*kzdGqlN z2R+o@ymvSFHv22ycMIR63(dH#Um_zV#G;2%qdu8=#ZtY0Z#vGqHh*)_q0Xcu@%%MB zwLM>Hdij+O8T&xzgVku~osQ^Q2`S5DTwIOr06N8#loZB?`DRb;n!MfHbd_zE2KNVS zhZcs)qURqStOTcu=MiKT=GGbY>g(uCOg4p|dV}jr6w{Qfn8Z!;;nCqvSG5{EhTC}i zlbmH|F2tXz*ja8935z~QgYi=N@z+4{r@>B@$YHfoBnib~#$3B>?^*V3@RL0C%A*2{ zxAX8g{7LcgtKWB9?FEL>jmy8WJ@prDIo zkJursGvdpaf21gXhUfQE`6K%i1%-m~2aJbBB)7~*g`cJ^kJTvRCevnP z;E*-GPbDX(_vP*zrx1V5?tYn=?G-(QXD#6Jy2SdpFBISN~#whmXHec}aF}J;QmzNzKQ4X%HC%1C%@; z{j?b3cigdx=68Jc`n5h&-&f;H9!|wUTOA!8&cz!gF0N$H-GZI=mTTJD+F+fQZB;QH zz#3MV@g!ueEqm4y1(Edio{%dx`x*ZYoi)4JkiF>_-5N?tmzDK zU_l(F zXgqiBMzIA_A%38COM5^NO1PQtxNDP5SCCB=Jds1Km~DIlJ~KKvdwgj=nm zfH2}y)$c#I0og1F72(o!`}x`@-s`9tACYHv((O!977-Bvgpf(@ zu({Y&U+j*ba^TssWp<$kduZ-{4gZ?&bNgX$MH^1{Q< zkch?xovQp9au6=jFEJ5|a`F$dmP$C28l!$X*S5qJihMEXe1Cv*g~jZ7d*i0%U`9%c zA3eg%9|d=q_4oDept%s`%%u%DVr+Qq+eg<-No(wjPByqc8rT%Tm=@?6cPDL4IvfxX z__c^qK!o7DbOD852stf#=iniu=uGIyHiosA*sgtF*ALjTc2*)9D5{xH(!H;wR4a`z zvqYS{(yW4}Cjaw!$BL!0XHzu~swyQPokY1Oy`9A^&~&k?$xRN z>VS;BxLSwBvd!eAXg^}qVH(8WzWHS7Wyyep*wXFA9ahA$_ozelMtyU0Q243xp*v_> z=l(T?<=o23%I3D4oMkw7HpRZ6bJ}*z;MlD>^(1NDT-FC`0o!yIaW_Q0h}iYpH0 zfzJ@eVa%;lfBEdK%~M*Z|8`GFQhAI_fEx$HeFDkj$8HCVeiP=s;rN;zj; zGvp(Vg^BNPu^LOCuN#b2d;J&p0Y(BqT=vc0 zz${baXi7&Oo0+R3Gzrak8Oy|6mXqg-uK74XuTy+Hy^Z{dXMbwo- zVuRQpYwfI{pzz`aFIMX|N+znXON$&bhzXp+MWiY!E3?~8Ul?OT*WI6KIt-L#gjI`zfO_T!3op?goXAQ~wtDVdvRjWgZ2@!r!jULlO|t5HvTyTp?x zRAp!}tN&Odj7An^M2AZ)s-y=gL`X{1bOK*eR)hGg&7FMuZt(w z)FCAGdB-`op%&vjbMo7W^5&Cq2SWF$6JZd6m_K*&Ss^kZ zy#Fhxy1S&Q=P{l}Aa=8i`#An=U0u4PTzBQq2N0?dT95*c=K|pp`SQe)`e$xHbi;fd z$GQLMV3UiuX7k<5J*Q33Ak~>3hw%K%C{tyOff}8znu8|?l?jNh#a1(ZB(nmQ<{HIz%&e@e{QL*c z&8phYa0ASlw z7}(n3{j%-PNC-;e{LaF1g8`1irHtR|RxNA(}5!sRINskvV=MmvA#TBK-pn=x-ceJ6#*( z5!vd2M@T4vC9U?5=KA&PG&B~@ckiNdLBZ0%Q4qbN=;Y+2tlas5l!vy?T!7V0I-EmC zTRR{q2p=CmT|MuE5gGN@p3nC)TKIQ8yPiOengRf@@u$vB|BVbWb+^1%KXf5@B}iz# zfk_@Zo@6VkJH;2YEaY7@Qyq6Vn2Ta!C}5B8dXoz_yhz@n#Fbi_KGoK+RKjDG_44t=mJIh zK~EBDwFm0j6ODYcmpuU*M4Tp#`@u|)@GJ5KAH!uh^xLoAp`fL8t8p`KFHJeO|FKFB zs`pTauXHA1xz2pOcZ>1t(#p%rfBpI;;ZGA7uos_zYUYN>KXV)_1E|VFR=l!Z1ex$# z4DP2tg!*OjU`{aXUgE0a>_t{Wu@vG+a(;e(Tbo0v+AQX*SFc`WV)Ax$ z<)@~8+7>JFgTgp5F%g@LSM{uJtEAO%`AcF>lhl-y*!4v>TG)U&+rAt*nq5!<8`Q->Nc4|Y-T;YoIY$Nk=h2Cnl1!SFDe^P;` zm~iyx(0~Aobzq_RP|+o$m9j;}ouOe}jm174N65 z`}0i6bFj{yjg5_M+#mgds0PSv4!p~-^6~SF#MH~*Dt+tPo{uShsHN>u91w78w?2^m+qZ9%2LSAXf`eJZ1;fWL^TAC$ zIC)d58%0fzXP(lOZClNLWZM~f-gz5f=(FaC$9ZTLEfWpF>Uk!P8}kobS$n3&$A5{h zu&PhtU}5dfe$EJKqP=<3Xt20o8tT55*}jb&V2S?Ts~ zgU&}{^cy!)^7BN`tVwvo?)Lo83vJv6reNfvWb`2r^Gvlon?o{@`pr zrB$fdC4Kz(hTISXoT#;r9zN`c01Z^6l*s)I&4uo)xHX~gRK?Q%)m2TYsW(>u?uc0h z1qJaRY>fe|0Jsr;>oKZxwtPAJ?2qJ27cbrwdHeS56OrgF=fi`M3fBfrMJtRq9WjEZ zdM3^e>YkrfbN%4_Z@uf0Y&Zu4CFRTQszONejg5`t0;cm%J!MsG$b(&*F*6ii z7vh5eGSmBI4ye`UXaU)bT43V`5~ag~A2~hvP=w3LqmrY>9+R4y3OU!RbYfz{cbtKi zR<-m6S4lol=zcL#5mR)!cDZ`?3wk3W->KTC@ z#YDFjWl4ZgSXgl%eEUaaCF8fC$^j_y@)Sn*#|Nc;$+?*HV9hKNr`{M#)Xp%=JQI4kHR@xX(xS6M?z8xvi~ogD9@Lned5v zz8Pf>A?OyY=kSd zo7rK}?6Q!_p2;Gnif1RdsY<~GFi1i}=c`iNgjotP)5@U3QdV&1V?8n6&QnTL2v*OU zk)*NdH*e{RJ{omA*H~SB-y8ptS^ck|zrp>th@Vir|G2^V`FpL=zLu|!PO%CY!eU|> znk8W>thw*RrKJ<>{kQL@sxCLOw)jLV=;oOWY&ob;Igk5_X*%y)>t1r$n77{=aScuD zJDo9?ZSHC*^RefRXMB7-R8E#<;*TFchC(5f;ivU&f@C&wsPPJ-Ex?wYSIZHqQ7zDtLf0-M1j%4=pjkR%P@Bse@LBBOXI@D>j(%mYx5}Ou-7!Pl~O^lp5 zydq)5@0wKiGmc8g12b5T;5D3$5X&t1==9cj2E zCjItwzIIlgim^lf_`64L9C^9H5;PS9)+ zxNAJ!y%)lZ#%nKbY+BhopMOVa(dyMI`B^5CyAeN$SFL5)HosZc-HS=uP4G23;p)q= zYK<#NI2vOCM!=hh6W)%Pv&)8@C``*Kr>pbz_BA{L0!5mbK+a9G_=97iZ$;0+Q?yZuZzB2Ha40P+qI8oSAk5H{@28p+Ro4St90^I z$1QGmdUahB&mx^s!fB0$X`tXpn0qG?-mkCFwO9OvR_yuOwEO@b%AY_jdL5OBvD9?r zBO4hjJH`Mw(jSe@4SSfuRC@E{sO!E1{X!pZa0>Gdi}T^Oob=A2PrT zg$~3^TpA=2q`yMOG>Bcds2*=k$)H*w`mr$g=LmD5hPbr5#wfMl-tU>AcY4!sf3-N> zA`{s5%MSEy5U>Yn2uDk=3U$%5c#e8^T{QN0r1MU~o36UZWXG(RB^9Up^+#C4$PWt5 zZNe+wY*Di)JC=9sN%BW-Exb#YUSvx)bkcN(jo{{_fCqB&-EHgRY!it&?ZXUsV>o#; z=!U=<)gl{XU@7#@I|9wuktDln8yVuwq)|BDE?azfusi?Z>ds*^&yrc034y3k*A|ok z5&m`7;%1pt=uMJPhj7_0l5GAe6uq}o@k~}NS?*bgbWYiF5e{}Iqu$$Gh@|=X`7<3! ztg-`z)>VduzXxwIlh<8B)YaKj{cWY_&TY1CNYN}jSFgSyKU;q%AS=XpJ|z8q?qqsu zYCuH&VnKhfMF$|gD^8{;Q?%9?7c+|BTAf_1^hN4AMSE$(mQEz@+#kd#=}OP zASAp*LpjTR9Pwq)jQE#n%C2k89&8snpz6((3%nFCA4PNK+*lmgU2PF~w((KO_2CX7 z8)bWLcaki5TXNsqHaQNb$wopODT-B|2)Z)sxu5fX@fF+lOL5-(J2e6az8JU9b-Z_z zaJI0p2$AMV(6|+DL2S&TE}Z8PC+58po0)lQS;`MNUP5nA_n{}71`qE)W3BuK1$l?n z%^<&aB3`>&ISy;nlup7eW%9bnAwzr`t>HSSv-xmQszAT_Js$lQpNo~BY!olB6E5-3 zbaiPg-=|GXO%;*ISdS4_qv^Ap9k5H=vL5)Qq>*4uLh7p73gW1g4EmqK1@LdBp>zFW z_6FzV5OxgvGNe)3w00xLK@YKJNEF~KQ0tRdu$_5kG*lXSu@8jE8{F1Kw}|Si>Avu8 z_FLX`$@xtN`Y!hk9Y9bleR#nv{)2nSnyV7#LKurQh@OX0%A%s^3m+ob&L<=$uB6f| zyi)i9g^*rJw&j$JQ=B41b=t?jt_(27CwhvB_QnUAXljx*SmGDmA1jnp=jw*oX*K(U z4q{nAf0YM89uR`54{~6yX15bOdLdu@pv6vrl+&u@`9{yP8MHV86NuQwg||rtUo|+= zaW;MYreM*VZ~hbjE37p!fY9@AY`&p(H~A?^5;}rKfzefQzz#R)W~ec8!mJNwqlia! zt>+C#h-KC|W5j~lk?g_i#W#{BTiJ-?AXCTOFAd0ao>38B zQMf$2*U86O*);pJvxj@yQ8*)c-uk#G$frX^)YRWo(tt&;H`Bsdl7%%arboK8(&ghK z=H~9s^V)!q+VQGG z#<6U+rGeJ!9Cp4d^#L_r8UR$l`hJSST{L26udo~Zh?nr+GR?WAwDqZpOyJc_uJi?}Yg9(=972Yy25A zq_k0-kjKgaMLuB{z0Wnxz#_*wcP_pf3Y@wK5`5hRhnwBc2O#76l!4HZQM@9lrltng zgC!Rs)^7NO;bFc{k0(&KYYTnBJ$tOg&%G8)cTEm%kqurlxy@D*Tfy$Mw*~c(%}o2- z{k2zY5R2+cJ!=&2&cCY#F&6(Xv|L9{OQCGV1t`uVWX~wmE(POLGm7pN?+V$Pwli3Y zHbOm#>xGk3fpsnDHC0s;lauwD*N-!oJEp4RTIUDCOT>)Zo9Tw+9eg|#u&!X)=7xP_ z7d9}s(G=cT_N40lvncy_djTv}SENgUU*jmwf)HV(_z_k9kLO(eLnL`-1U^xkURF}UsJf0EY6Y)97dk`4YfkL9D-wBFe&uD5yAy;h2+{APgXp|CTI@RJr6Mx#6BYDp^lb?u?OT2IHUYfu-`S4Czn zd4rKL@!lPJ)5Q_-{hq(rBiaP!aQq^Wxf*FI*DUw8%omf^&r2J>@Tb(kYF#+0Ag;?q z$n6w#JlRZ958fZ-Cne9`7GpvJz}$I`0#TXQ6J04~TcaM3Kw0{_nKd%R1>Bw9-6k;! zpO>=dO)C%Xq5^&ZFL>aI?-2$Hrl_)sSLD0nj7{tPx;r49n8w&5Ndj4XeI%hP`C@$^ z?c_A*9p3%^ba#@GEBnoU6R!_Z(c^a{jZNicEi5QkN6gER(7hmGjcKa2X#ptrpgQgOXHk zK27*F`gyx>ZMR*&a~c`7K9$j9)gxwo+K=kT^iMy}s>ISfr#7E0HhKG8S^t4of#7P*8jl{BVcCCZpQg`m1^79^(b<^ELo=8nMru8F78ZazW>& zE-_Ey99~*M0)`Sd+kj;O(?lW{q@2A$)Mj65u`NFGCx*GU!4=6S#TJh9w@BZb6sznN zn%JeJH{0lmO1ioYO5gqQw`w4tepP%UHPx#Kqh&jU@Gbbb#WV`x=XRR9@C zEK&B8g!mNJ_bTHB;_vEprP3YneFnOrmy}DNNK#r_*$Jy{^k?cZ{am+!3#` zotDmbm_FjBv8gzhfJ*W2m>Iu`%{xQwOa1$ykv)T-zeXw&T8xmz1-8%_BoL)8yP^m3 z^0*U}H%crf>cM_NR|;C>Rf0qKS((1wGaoXa z?a53NV&7v&zkw6GG~aX*rlH)>n%og{~p*{z=mb{d5!A*(OLS=9@!b#|~eteSmr;#2NXr-|LaDA}9>#-c` zxI9|b*m&=NxP)Kyd03{Hnf5^S@4))~>Aqh#W!$P*LIApf8g<%x8gfUZD+2{cWCyGXg-tG#!k- zR;in83Fuh(e%q0j_*rX20~xjO=X(cNEJVTU5+nHf1IX~zQi>OwdiM&JX!a@TI$}jU zfDModWf6IyEq~-ixMJ-&{$Z=3^0#qe{(gT?MtM6CGY3b|-p$F@k3xHNmZ|S8AWx0@ ze&j0o?PvJ01@{)}U-3QF%KNl>M$zL6^c7Ci!M(uyni5h{Sm)1AkecbC^MFbDEfxVw zxH+iGPyn$MWoNT+aTO?kRsng-cF2*_nTmYr3@1sLX4?pnfYS?jf<;y{-<_N#h_Fq+ zX+NqSqocGD(*Es`@QI+mpFS>&=Xay`A>{h5l^pfdD-C26YiqkR3o3__$)})j252SynNUqAJ~6SqxNeVL zCDm>+^jWPeo#Ko756y?Q)ZWDhJ9CXR8z7PXs=#4Y&%@H}(iy{^inyC|2I*mISL{r7 zBSmA@%q49WxzQxn$T1@e-3V!`pWGD0!Q`}R+M7#9P5nCPE2uRmndd0VT|7sHtN#hC zCgn8ghgsFDPrL_&mN2)<6O4e@Uhm&Se~EWU(@47+^p%VXIZpr2oHK#*)>T*S^oFEM zGw*;WdAH2vpujVlY+``~lvS2OU5SB6)MRcI0lDWnr^MgsrNfO;>e0A21mndqF9I?# z({f=CRT!Dq$E}k%yUy(ebZ@o4iAgA6Cch2$YQEFTE>lNCMfED+WktaUFg2x41NH=s zLnl-;;+=3&etrlGN?LJ&EA{%bp;E_2Mq1jKfNCSPd2o#|hhOMu0dIFf^iNKkOz{yFp8{Tw~PD|TuxnKFL6P>QOkj-V5x;QIyfq~|UNBywaJS#%nl_x?hTctTw5 z!0yeaV;)CUZroP0Wk)QW1asWX@!Ay{shV0r8Cvi56gGZ-Sm+yj1LBvSKX^cxQ+BXp z80_?9yw-QEkS9W5&9Q}V)2vJ=2P^KQ;fvoAvKEJ+jfzT8h5hM(pmigW(R}k8XYxh0 zw6yH(wvd%R^)AWIK`YVQ9<~B_@*zDS*pH;)=Dr$P9$oO6FBMTEXnz%GcsWHXa{Moz zIrdgUG!Gz3U|+q>whf}Xl(D~p74M1ZH6k{>^1iD={lVJP&qdIO2weY-XKsiJpSqPh zX>ps~Etvn*nA5xEzo_@}^RD`wR)19)l2@-?6It_5!90H+uRh~Ay-W+2M>2U52%HI7 zZ+52p!!-ZrINIlM#FZR>iDzutkKu7UIln`@WPoRY^zl zN7~Q+OrzKA=tSaxc|WPLs>ROy^kxq1prO;>KYjy`Mqm#mCFP!+9D1y0l@U^hiDl1Q z3ovj^bT|S@;FWqeq+ZTtF^*X_C1m8av53?i?x%Z`CdRdTb-jPobzZi!vj@9LeC9%1 zk%U{}u|))!RwlAO+#vpU1DEa`Qmc5~AG~x&3gh6+p8KWiTSZyGg-1IdaOL2Ta*wyS z#GLU>tO6^)o6G>C=ez7>NEeyvsG&n6#p}tyHG@vx5T^qO_B zQ#A<8bXg@kv!7!Xfj|ZERG|S1%No?%NH;O3Y1Fuq3_a)xLO0&nNQctU(YZUf+<X1Xt4p7lZ?Ijf6Ck zc?gl<4-ANkl95~l2@dHp_?g-R^YdWFgQ=8uF!fn+^atWXO}^dv9IIDtSb5fSDw-N3 zkav!1j#e!?F5~|Etdx}5wV4iTQBO>pyG2?k^STl@5KWuJB0@$#ih)DDry0fUCB{469`d3kxZV0rEUCsS8lSv9r}-cp0k8}v@D ztDhf$Q74!`r*q-E-tBWHfmWVR zu->ybiH;dG9x4hz!6xkS_UHak$^WUl>)&wmj}T}^tYZX+*a>{egsW97)>RAe5gLAU9=-gzGaMFi_JZ2A=QL{32if75pJRz6HT#4z^p znB6h$W^i_?S+BEeuH0!kj7o8^L6oS1u#bs_WjI*8O`lQh2WC$qA~oRDpq$Be@xLzn zfsC&ZimzP1#r}d-FumK0m}u+jeuYk-Tesv=?SKb3aA9}V=lKl{_wrh&TB3(QqydzU zY)M>tyI*Y}CnslQbhC;z$&E1%0|Vnxp_RL76cFfq?sX6t*EpHmb_IS1Xo8>$*>a|V zsqAVS1^TeAf>oCqAz!Fg2Ve`WoSeM2|2lJ z&ySFW+WhD1H*h8oz~(1DXR5&icG*d00N+<}L!>+HRaI2*djQc#LIhs>bthO!MP+hw z5@`n|<<5n~2}YQwPUfBpoDV<9bjfB(>*sv>M9apeM2m*7L!1=dxl6X_fl%5m(@5C8 zTHdeuTVOs;`@}hsj0^IG6D!{zeJRjw9eMrJEZ|6RUyp0QBr$HK+dw^}drOTty3*;2i z@0LHL!{Z6KY$d7e*|TR-3D{Gvv!Y37z{fV#(>wBlhHt|3#3kLof4^%ZONA(ZeH_2J zaqko#O!ZG6I#FrQFgcipq$?q?9jV4S7>0m8vf5tJsV}YP8Me~TfV?F3fn>xfc;OcG zIIw_R?&o(=G7E+|nE+ZZlKiP!Ly|uO_A06}w?)?? zr=s<|#^zRHdUT=Ps}G|0?s>{#B7PxGZu-nuAqfE-43@yFLvtXVrQ#$ja@=twbQ?`N zJQ2{xSqPRFf!&@Kco>RhPL7k%*_-elHipilOZi#VWw*XoeERgs4m4JYS8|GAF@sn$ z-gO{x0VK;$02;A{tTi?(rF8_PM`!eSx5xeOQXT;U0D8 zmHz}9MeEY@AY_|Pj^8iaQHCf*GIAPh*O_PP_ZVd#*Ha+woYw>E?0h@)Kmnn-UQeIl zV?|3(ub!iO-k6&No2$9w#PTqGe8BY*M7vpVD~sUFAS~XKLC4GQ6=UzGfR3UiJ6-at zU5e@Ln>Xi(*rwrY{oCKMn81zg-_u_Jn-|3DpP%n9rR5DiAw$QCVc&<*G7|Hfjw7ARvRHM?(+WT(5m#i zD?VXiVNp@d^IKb65E_x1sx0sFo6Gj=v&tsnc{42km^EZX8hWwX1a_gr=)>*kemeA! z+jE_tZD-oA>B>fOulvjLZ$r;Ghe>~TnX@yUUrY&bn8nN0#7KtFFr(xrc#L9VVl1bc zvlI+wn>dH|<{lkNF8orf=SUMfF>K^*w^|gNk5$8q2$;6-Zv<{@&fF6h*Xz!t%mMl@ z8Q0)F%Rcli#fziUy%QsMWV?AY6_A@$FypleW@K++5j0$K|{oB9QB_f^nCqtm*Djhz8WSua494%k(NjEiI&`^fu3jh&I(D=In?qfa39#c zh6#jBoPH`FGse~t47Q)vp3@>?@Q=UsLlXB+zw_ZfbX{NXK)HuT!fS`@c9P{=4< z_{2cFTEtsJ_Zp(6JK&M}{lg8@Ls4#*a|#GtTwIVT_?-`m|N0`bN!lhJ1_KEaPH_#_ ztcKJUc7P@LDlIPjzA7@B`ojA+6n2(?L8iYBEXzKuMJ5asgaPhRtF#O0HjoC$<;Hxv z732<>`+C>}y>E}2tF;t$TcVnT5p*tK<87!q@p)$&rm2l~7=0_sc3FgrqV%QG}FUqQTIoi zVhL>}4vkI*HX~IjHh7XMt z;R%EBjzRL_y7$EN?;j>mvr!b?lv7jV{=2uHfPkPuuw3Zxch`7tr{(&jH2V#gqFA2QaRw?8 znMeUX9jEvG(_Uzp$@@_KgocJLFE4j_dx+wvp-cqec=J(dF%&#U zHu#s}Ha5UMmcKkzCC(yFpLZS zT)?#*6kJLTXguAYv)N*5JKsx}{Vd?JgmsaaZ7^{OE}daeK!9A>xX76^XL4!5HC>lGVgir}-V!Q=?F(3Pho$R8E=t(ef=Z>$tc$=v}`$Oa!fN0KP$zx3TO4ou5rplJU@&v?(K zyt@vkjfXzhzN2SGwq&KKYp~Xt{^?LJztE1&e7nT^dyL z#8Qf$RGoFgp_n)Tl?&D_I3Q`@9ZFnPTYGyiO7#;Q>Hj%t6r7xSL*=*WzAV-E#qGV< znjbDz7?1h(I(1LRWxnv8QYEML0eJM_B~Kfyrw9oNflh=8{MZBp0Z@HX-_EI};*i`n z`@0104+dC#Ip9HH8Oi zUpYmt5nH@xrhoL@38Pl8vW;bN*Wv?KKa>xw54`)q%KrNS-O zi>tt#0Oj!M3HSkXAiIuEx5Yi6+uaZZt{<$1;32L0JlC6HQateY9gNi29jdC8HhWMq zqPsyV8d6{DLAm-+(`j3$2a6Zw#QriCK|rGx?@Dl7s(^^u&~=Pa^7qkD-1lF|aNnUioJM2}QH%d;#^Y}Yj$~8_jBb*Z_jTCXINIs>fL*94YrY_Oy z>F6_OQ>UF~5A`mjPmby%!sX(LH4^TD5Vf({0O1g0fR9#xM3H!~e`OYwN85W`R`d3CeN|Gl6EByM8{D{auF(}M`HNyW00D(yGIRD(Nx{iX#hdSI zLjRll>@TDm20)+vIV^wZdy|AQX;%}x`Q%?0cay?3JD5}Gv9@f54gr%6p1ZVJ@4H_O zfk5;}RhLs$rN!Vf=jsmg`kb3<1ymkr=Qz;PcnB|rfX>UH*DmNMo{uH2*=&Pfy6j@& zp~W|8mk=zCNs(*ppC_(WHUn@z(fj@_|9_Wh&Yn2!C0w}&%GQVNwmsxM7Fqrv)q0W( zlmdaEQE0V2{2C`jQS$B!f6qTHPeh#VU`x%+%mh`toh298tFBnjZV=g_zXEXi!cn7B zJEP~fN~nMI{D0!x)$roZp!yQyUQzsjm z4{niSac+}-)A?{VM%P3sg>WFU)HAhE=ttqbIexP&>a$V#$%fGw;^FmM>ZE@g#Xp+r z8^bwGL6r{30{TQ~#)r%LjEm=+H)v`P!Djh0A6cGxdV03Ew}1cs9XJ)=CPVqy`j!@W z56+Wx>h`XKrBQB#gAb>*L){lCv#0;U!LYGtRu zu2Q+3JhBNtsLM|=7*QLOkTXrd3H9nliaQLex9UZC?-@zYD4~NP-B)@}P3_w%wgN=iB@XrR0st3IzY1Z``!5(dZuM)@5<@XtB$ z^J;(XPR!SDKUmkpTF!$ekUywc5?AZqw&;WMn7}7GItk;KFWs@X=NkHP4IO=gl9|EW z>Wgq$JDqX+chKodz#$I3Fq}cK2EPJvZ}>A6obA7$w?KmfmX`^pijU3J*tyqu&~2|U z0LCbyFVmDCNVwWF9tr4rERPx*Ak)|1t}c4C)p(Lhem-B}7$e_K@IZwE=f$^r+)H9w?a$*U=AKHuE0tqpIc{I^txR6ryTetFubR4kt zF-llNf84hvl=yxD`;~Dp{)1s1NPCu~D@>({D!q9Zoj)T%*mm0KJL^X;of;PLq>54F z1(^#{N79!8Fi&kuYtJ(lLsMhezUw){*n2Y7O|Xo?)F!VBIO?9XG%3__ES{$C-nkC*_=_~OR6<2)P#KBr-O#cstH_ATPO?K@rAesF zY?YNHvO;JeWN#T|%ckt{J1$i3_kDjp-~WD(-{bdqeEa8q=ho|WUC--!p3n0<&f_>v zpxIm^ypgpBk=nxfEL>vcv*?D4&ILDm?yznb_*^!z_0D!*M_S^#&27B=^o#sumfzrj z&!h+h^&DuF_$Za3zpJEaKQ zM?XK?8ciFCUzJKQ;)~u$A};`sTAv8n1o`g6l30y3&sKc%^7cj{y;o4sx*^pZhJ<0~ zR+GsK6^XXS#z*? z90rP0n3FyFr?w=eddRHL9-o~W0L!NV--&l+rq9gD)Afei;OzPyZU(He(UQ0M zk#;=kFzH!B!c}l2vAt4Hk*+L$FZ9p8HrE9VN~Nve-b^{`oOa^BbP~NSExIC~n;Qay zE(ndSxB5|uLf{F+&r{LcccgrJa&n0gE9EA%-O#tPQCF{*njNBfySkQU9&pwAB(y!7 zZLfv%dadwfR&H1)SbTb@UIMuisWtc|&<)$c8fAf>p^<{-^ZTOQU?8nXJjmgfy<(%BzrEwD{00w|_gVtk@dD)D~zBrN&=s6@ddZgaid` zWoDMV@=ZE9f5vMYVPdgq)0u_l8{e+Gx5J+kdIs3rJyuOabQPwe7n91(5m;e|@}u)@SO;0qk~An4UpD_WJe1OGgsy9=ww0w90d1v;oWi1POi+ zkbXX28dG}%h2qfi73NT$=7g+b?U!lbuWKbjvuf&b(fsl(Kdx|V;;8#IyuC5T8rPaz zcJ{se`fOo%jY9B?n7W;T^mP#rNaZ24`gy$wbbzD!rLIq>Zpw9A5SeafWYkbb2|#eh zR(lG*t$5xKRPRJCjC4Lnyt*p2f4o4Y4YKMM7ges70CxK}1#=|^v!z)!rwRJJiz@^( zTH^3A(|T@Sb-8%|jWEXOwI27#EJ0EtOk20kKmz%BX*ToXCg^u1sVnmaB%DGm@mAZx zBtuwU$*;U52n|N+b)oHBJj#;tgV?QdXl@z)$~V1qvgEDjp`K%-o0#uzJ3c7yDWOG_ zpZM;_y^tzv$6Z;&ym`~6O?X2f>6#5}C(X<+#dfIRPh_oEyiaNYh4T55K|8XRW1xe8IKa8YxYPVl_T-66wroa7(dZ?L_;CXVGzj=Go3c!alv`u&uf z&0^6SEV4Xq_q^5QJ8P^yDuHKyNb2-f6fB2f3WOD(9lR^`d1+|!BD91hC-jYI6+OXO zVKMiMwTM4<1V?0$e@g(9VwFlg2y)+2YEG#KiQ8R0aNxZkuO8q2{o%)Mb{J$DUi46H ziM`@!S?J6)@sq+g9^|beveExhU(O|v6v4H64Xs85zZiYj!rc$4{Hp0$n zp}tG3pJzD#yS!s71kHKSB~3zAsA(m(%UN)pf0p0t(h>;DN{fp~J=>UeB0a4;6jch+uop;^+qc*M+? zT(&Ay>u}rG(AU1m6J_n{$_M{{~So2pQh*Lapb)?L|Zs zkf_s4kG7cAkDo*`fg6$e=Ov*690J)J6@>EWP4z`kcK$v zb#OU~QZtFYOOsaob3xr!AY0qrzvgA*KflB5a5g+ECPqT$&i(z4t0VWw3;dDG>m7Db z60UuOB68Itbe(Z8U_0x#Eq@NVgXhnOF}3Z?t{Pd!_9$q15}hg*VbNBz1IBmp|p3!|Pvpdyt9Gr1mvHDPGEJ zrK0lLDb3fvBF`6DX?^%?a~TzR%@YI4%xi<@LwS$cLtngbDcGqEX`rp>9x02C2Y$zw zaD0a(~OL9rO zKVf!J051dVj+1=gyt8br;qL^!%fzXJY%I&K{79F6o&on3sK;PD$YY9BGUCH+IeHWk2Y|B_tN_ z1ZmrKczU$$u3dl8@hB}xuyUAPdTrx#m6P1}m8=+CC3cxIZr*(M^y%$KKBJ8@-t$v; z78%^cQ??O}$IXOTbe437e$VbB(lqLk)Y-e1)k`dXj$i<}w6v5kHIPxLw?-y5EkRbE z3c29-BYUpGg3%=(s_eLE>`y#HFr8F?RM#zzp#C+1S`{lw=t@ z`}=S4`PSCvg;K;g`e|Nn?r>33hndlJ=nMr|Oum%rUbygl6NQ995Ied5I~b#HnU;z@ zeK}x2nSCeGpS0?1JoPbISqlpbJ)X{*sw%hu0d;rXj({S8WcEtHNofS0N#UFi=?R}D;%39B$H6k|zC6+DAyvSc z?Y_H5%%Ai+j9!q!bX`y$8oj67>vO@J0dD!}*o6yi09A=c$jMKERN7W8v{7l{O&P7B zN=$&S2s#OVZiefanVW1Sx(?#k;PL!5%_@dz>D1!=lu{*@B4r1BUgx(Ab}oh)%$Dz~ z=eL+WY98nwG_@#3Wfrzs7&Xa2L_>%IaF0LVMHi-}>CYBcrId=47$_e=##-5Rm4*>^ zOKRlC#n;w=lB8Z7A)k%D_Er`ao}=%X_srkcwkcyuBD=iHRsGo1G?r}&|6}Is(`zA{ zY|8vqfC8;vC_g{V%?`|AEf)V#ShXP~(}US8BnWo{L@m3%_4iAHc0U?@AU83h1r*br zcfWkM5Y*EMhoHd*%)P6X&#leRU8<|-!|7mUgM z<$=DwojpBpG2C&foNOeAf&{s4P+%as<+(SRWYO9g8Xb+0g>?b@TmnmbppRMl^_gof zQ{&@A0l>{&R8iqMKoY@7fw^Tnd_ugvt56Oilfi-W3w4k9N{ro(a%bVB_ zw;ez9ai}~sG0`ipPWl=*xdk}VCA|}C;Z|uL>u3;=cafU+?Yn08=b@q5AJnLDnI~mu zAY=I!K>72?!qzerpl~eDQ>>HF&ktkk-PJu)+4bxG)zi*1Q)3m>mm%1KOVs$1sF;`@ zWMI&9gv(xPT`MFaDmpnisSqswL}B~Hi~4$X!Aq_VS3sY*7`R+QTzve?EroGg_v%1# z16_@wJr_lt+VwKG1t}%)x>j_vGgho6`ek`ZqhY4ZzHH-()>p(f{9wkhF!7YS+LW^T zm8O{PrxpIH2mlIyt}=*W&ieZe{w6A}sjr31vaRhqoo_J5QZ8A79tvSwdHVDR7U>*a zZB0#6!M&2hC!VXQ2kdTDHqY7q{;aV^dn%%2M%rs(o?DjX$7@I)BTVLHk5k#E*!K!r zX~f2#Wq-_FClrexaLxaKx6ys!$<|V#UBk}Kj=+9Ii$XN?cQhua^M$Mnp*~iq9pk`G zE*>4Pn8JZOO~KE>@dL~u6Nhiv6mQJC%g$ZMU-C{>oS*+E_~QBIv zjy+K7Ig}@>R1_=`Fjp8@EoqPwkY?7RtCUi;CE()rv&PMdE%J@}=JC;AjoiAek?gd& zvL|Lxk7L%v9O_GPAWT+PR>PvDYZgxG=T%heUQC|q2}##8boe=W_~LTu;o)JNVVatn z(Mvw(=dWjx?heeYsi`R}G=_D>rB+og=E@7HZ{J#B_)G3jTTy5;)3{t7Y!w?N8f*!P zwUwsctx%2*sfP<|?!Ue!LNNqBmBkjHWMXZV#^leL{76>Ut2p3n-Jp~BLX(N7(S84= zFW+#Luc<@d0X*FJ>z=B^uF&zDlv}-C=We%^Xh}XKSlCuc=^K|PVfkAsX`fdDjZ8hUL1&_2K@Q*)vFFytSyim9Q}}u6H^Sj$B@Bz zSNSjN?(Qb4CZoi^yZ`9%FdmZnz|b7 zUjz=@5p*@+DVYBD?NTZ#LIKAf(X#xQ`Y6UzvGBT#;_!a652l2HDPPFUtujXVD}y*>h_Vp|o5Q};UP@&Y1cejTx^$pT*N zSrfHu#p>1k3hVTBmh3SIoCs*1?f^km{K_{X^)KAsqF#nkGX~dQAail`+*jbZjP0VM zuNn2l4bmf_M2-?o4RGR=v~)H+cbG0e4gMBv-*0Yd`COgz(rk!z(riuE>_zc@I5vh< z)YYA>Kf$EI{Jfsn$^Jz}MX-I;%Y6c(f<}hzP^x+Bfit9?<-O@U&MeV?0u7#t<4yQ2J+oRwyE?n!wx(fmzxNl><27jnY0nW|p|N zX^t_BuWp$2keCk$yY`ne1d*tM|HlH36Y_g`#c*-yzt7dkSUwx>0&VN01M>XIuuGeS z@!y&iE4tt*j5y~smfj45?t8^y6Rwo7)?;z}Sw=u7*aUa(+(}>!k{GCa(}@hs5!7ON z-!lhAz{w8X3|EJJ4&zr^sU#x|C+s)KE6Pd`N_eNq?p>p6572KE8XFuGw(dQnso97G zM()2ZNg8diwug_9PmA)PrQqS}x@sm^#NraVJAoHuG1{pgU{tLwTt5?Qk%6uipiu5U zbnsx8TpG5I&*f`+c)O-+m@eKQ+2ge#RJ_0+YzhL&Vr#>lWJcP1fgDhMjXG;&! zl&wa?22?UZg>S7$w7}*$yOLwS6nZIOnxiq9V0~+8PLWMtJ>ABQhj;zNUW314P>dJFuXn&(VTAuAkkvhHE}x$VZ6mH% z&P4#V0;BHatlpA+M;BfI)SOL{Ln-f_?5Z8R53x%M`oR;&*4}<!aa~Q$$OCn6R?nk9iU5l`O*YnH2)>@G*@CG z8j$bGl~C%+`SV9385R=qog@YC)5#`@21M>3hbjmUc|@3zP=>QqC0O^V`+q7O{3SkZ zzv?Z-=itn~j#oV;6dyxWnjs+Z!9MM>sm?wSq5^N~QvJO1j)`ETW??2(h4#2=lUo%Efx;y^4USg%nVs4Y~N>EwyRO2_N~xk(QbEubW8kJ@7xCQ0mmr}w23Nk1|dH)=SmRi$aZ!a&mrG4F2y3!+j=<4J5-@piB4fVWE z9~nRHV2^~BW#j<*myAl(1LfhaUeW=;WM@Dk;U^RX6Za)A4%Z2bYU^un)-T=rgWdX< zYVy*Fjd4*?sYy59OVbPm2M1$GaxG~|I@|ty?N9j-R!Q2y56hiSOVUcSy-iM5br*c~ zvVeEZxbF|Gw^wtjs#H#}!U53ngvJ;gp#+qGrS;$OwyChS&YrT%#zTeHYk(T+Q3=P%M5e0U z(=C3>V78&B=f91WRr&-gnvBm*OcP_P;6gv$X8*s`@%p>>?(J~(>3zXA(bUugG=Jlc zix)3SN=o8Bm&udP-2U@QevUcXoMv1^ds&uwwZ_2-gOPtD@rKc=qghi_VZH zBPd6&sdnv(gy>vdmM$o{-8U*JM!v}7-o4NcXSdDjNQpM?2o*w2&#_n}+-J|;fO8wI zOJqI}Mlp(6a|NZpNlh4Z)!Tx1e_X&%(oxjOkd>R;Euw{I(CKH{QLnQnPiE6^KCxKv z?|}!d0ah!KW})C`q550!YhxP=3P|zto=Ph>Fb9?S->YJDp0?CPS6}A?azd0iJC3@Q z+D+%WF}6pU!tN9IeB#03BS)AKgZ}*_P2Unp$McHIvunx8df=r1%(`Aj>LdCiw;*aN4|d$9RqE{M4iIk`PWS5l)jD&s1(eN632-e73QmYnzohur_e#ICzQh@FdL-G1c}TA`I6+%e1_6X6To?NcXwA%Pypts zXFhr((~_PMb-k~zzWB%g0V1fN#ooU7;TDlGGNZDbOJs32Qp<-I@wgBzAJD79k`jg; ztEJZ6-xztKx1%Fht!(|oi4g~$q%Vt_zBQ_>f_(hk>zcAAoJC~f|+#lPiiIWlCxJ0sHdL19V;p8p(X0l z;xbsBz0XCi(SG|z3n8{M%xH1BefXsVYQ$V~(YMe2i&`Hjy9kRG5;kg##`3~A>&)Xe z#cI+mV6px`UC601-rnA5P6h)P*0zF!Qf76p$~J}YBrN&#+2v(~J+A(aPb%_heW-05 zG!M{{RKxz%r^T*L>4VZ+%qZzu)cfQ4wG{X^okK}AnZO(5KJsDyOu1rie%?I(;UMpt zDB;aSR&!iW)FOQUIK1JG89zaSgxnL($S7R%dT%8%Ixs63tL;%Zy7SWM=#ig4H|~fS z64|GS;D}nVh_q`MGpLbnecPzhH0;-QRtUy0t5- zgLmi&d4eSlhY!K|A7m#hSlgWsUAdEfrvleb2d-t|GNMV1Kp^0eh?H8S7618a&FaZ?}@=Ps5u5yp-uc+4ucFU`4USbq6l;%MpP)atdeU-4p}zVtaMO3gYSt#+(cm$fx9!Ao5MMH`dnZ|y^5LH03M>tBbc7B zu(06G8@h2t-QM8%Ipe$GrU0|@;c1mL7abYQf%xv>QG)3n2Y6wtC(3N0W_>{(SVxkGTv-Z%^E2&y$Q8!1#i zGrd;e?+%G#lLv?A?-{YqpG5XK^mnrpAUMMoR^EX@u}p5V~i+R)gDqU^Ke>O4Q^w>D4iSE#>=h#)FLjOIl;5!Q^_9Pomd zr%5-;$*ub@t!5;Au<04&ga(pXZkG4GyEqY8RGVD)k2}YK`)RqO`8kjfp;~zOFnfo* zZnDp&bg-L23C5%d7Z(>JV`EuaS>MOU03lZCpXh(wF~m_l+@G+!Swgba|#tNFjRnKii(JU)8@7`$8gOHSHa-llbB*s z(Z7A-)RdWMk4k7-{D8W02aE6(vXd{({>84~hhzIKQfAg2CWiQ?>#jL6k~qv=_?Wxd z8oIiTV?#rAu+dak_m7O+)l6~FqC6}gxy3@I<1``Q~7_Y@$ zKUcT>B^uxu_d^UZ#-W{~I8ahtT>SZSRCF|&wa=Kgyb)G>n0x0=Nox3VgL%x`@`yd? zgJ^sH48=J~9F&qdK6!Q7I>S$ML}1W2?n^`X-nKOFVeQlMTq}>JAIhXHL8;AudW-iA zaVMKpXLEGz?9I-aE666Jls`&{&ggJXJi+W=2zpYN%v=TvKC%rJlCG zzGwG!8Hr|>Wy)<{=FI%&Wi5f=EQfh2;P`s7ed;l@^Qp~13For_$(-&j=|nZ9QczK$ z^uW*hE6t5u6h~P}@8!iuk{c4_8&w?)$=V?;$>)%(@m-e2?)%foBTII-=IB#yXx4~w zVE^VW*8feO6f`n)_t*=?mR7!9l6Ql4@i~_m_WdgvG^tPb!oC;YoInRu zvg$tjR)4k$s204m&PB?sbXi|Ky(tiy*p(nP1bZ3WOzoJWNdzz0{&IDsu)D=l^ z5K-|$euVAJwYvlPuuyj?SN_=OCh(J!8b=T5JXqC+m=N$T_Ns}4<%xg2 z@h8=^Q+}SbM%n~C-{wlSr`b&F!@x3DBpSTDa9MFtzX5*NZ0VEVr`UPff1hG=TT*nR z*F{#P85nAaR)ilN1@E`Arlw-z=lt0d8WC}aO;|((Zo1{_9CyJMzeE!oJprkq^4mJU zFd5Oe4D;8xE?zf3H)YJnbQE}e-7q|P{uCDK^5pgoST!TXzyJUcltskE-sk{{LL&g^ zA;$CNx^J}yBa~iIR`%Hn`?7kM@PmP>Jx|?u+)qHVo3W0GNse*Z(xn7>UGRactDbS4 z#wR37aE{KxDBR4q)zk7tksZg=h7IS-v0J=N7X72lH|c4`URtd($_X$p6tqWAg6$vi z^k1hBohWrvs`)dfB)9)OhAtTt9U}d+DmqWQZr!?vo}NmJCs4AbDu+Hf`9E5;iHv_A z(#cf;WSq-jC8VaMO^%Pt!CGl9l5|EF5Gj_^M9vvgrTDdI`j-9U$oardBCW<}oLDGn z=T9gM8u6ZvTv}?mP`??#k1RJtbUDc<{mSpjd+>#3uEEf_xEk zUqT)~9){@mvy(bW9`H9lIT0R?zMt+50QA#~uafTYBgtVM5Qb}D~P<#f>V-)}Q z*Gd1MuT0m{#`yM!*vm)O8n!A47;qMRV~<@j8lkssG8T$D6>=4 zN+7isd5)+rUwDMfC4%FZO_km9bbaztk6n}eMV-Lm_ zV8-6T2Y@nB7b-3OPW#<`K=r>K9s8O!`zsE>0I)+dQ&Vo5h{#AZeEi((_KAt5!;>Ag z_CN;I3;VckD0~79w)6Y<^(-uN7Z+?R*^SrD`+-`6UY;WNKP=?LdV)5AeP}T$-OBotEbB2Ek|@ARq@cN@3cLmZJ%G5iwmIOYOtn8L*q@^YDK>O4-g* zWD<5=VRy&p>NtB|@d;m_CX6%R41vpJxWV70UDl1?CXx5Y<;jWkq~1I8F;r}uPu1vUv?i~9zJ~V7 z6#_5VEl9C3GRa{*srPr zsU&$>B?VY_oUE+h;E#G0AGm5E(u&Q2I8UgR5$199oT7y;pT%eeB&|C;DaZ>nGtxDT z$lA^^hsj%hPR1p#@fb}@cnIw0=l62#qa@WXK<%O0KmfH-#t;M0=}0;@3%`Gz zXj2hR29m5Rq-nfo%os0jqK8_Nf(N{HP-^?P} zlJ#`p?Nqm2$*b#}7On4VZ01HBC*}2A4$svz9@4#Y*-8Iy#%5BsJOW#N2%w!W4(6B6 zD35^y{(%h-Aoj%jNrxrZ|0woB*n7S8`a+X&hIQ9U4)6Mhu5Bc z$@Z0!+&=$n@b~^Wu=Vn}Z_U%qjjfT2tGlY+dCEp+E}`svr7#gU)xUWY-S%*qW{a_- zQ<9H&nSS|BI9H{nr=u8&fB8~Q!AM%a!LY|D7l=pVFA7`{!cfuYeKB%$>4}OTPlHaCqaa-o`{mDzomypeuUWRD- z(ywB<=tM<1hX=DQ{eu}hMD%9eOKjdvemACh;GrZ)k!UJs@<7~B@AR+O*jOtIi`Ezb z{0@$edb+a`_s_hJR>ROQU(`&PV~7UbnTL9Yp#7tR0XjZmzclwEG_YdW6oFXrU;Vt{ ztt65x(QXzx`0=0+b3KRmD6^xJjFb7EC#!5P)JQe;FqAuGf799HnY>llAQTsn(a(pC zpnPrO1~2s3-Jc?2$U) zi&(O&Yay&iIXE~z;S%1=KN}>24l(0fqZ8+{+~+)ITbiaFd^ZZshM785ji?Pjce`Je z@?Uk|(sT@J-rV`VtIJ@h=fm=~(~3O0x(dwv@qNI84X?Bp&~5Sc@fj9YTt=#x{}K@1 za!aTHpx?k3i0&0yo+~wXot>5caBw2;-2f2R7BI+jFnCa_s;+i<@*iBJ2D{%}q;QH^ z51N)_k`59+vUMx^@m3vQogSS?SCkf-be*a&c6E!%{Q2gZe#gC2JMb3lKXo8n#i8u6 zEkf}p-4ZZ~VtGk^NGL-a{iK{`dn-jw8?ua54s`PrS48%FY3I2-`IXU(F3U6CzOOO< z(Bzt4o{N(E2kPFAbQE|BUV3^{{q*akmIe5*!!DDR@m9VQ4*bI@{nv}11M)~$bj z9G)voANqi_*y>FrIe<^4!H@*5+055gbZ}&D z73*vpbK~aqTaSM&sGuNc60IA3;D^40Q@0v-wVjCjH8LvIXhe@IK#2r6D zFp>)t=KVg_+Qh*(XLjSOQ-<1O!Y^oJ+e zvXDrAWIVjBF>!GvB_$zvgl5-A0>Hv?a&jVq=E;WMIZ6__77m>(Vv*0D zkQKOkOqyZW-7TCvJfPZL!;u7-{^N%a;3#tFZ{ih;q&wS_@KS&VUwv52fKtKnEFGWT z@);ksGZ9d3?%a6+q$v0?#zjZl4ZIrz0W{OR^@vDZd^J~8bsCp(5yq#AmQ@Fk(Zs{834R2uZ17XI=N=?$eB`WDEe?5|Z$-wGo%s%RN@f)k5$6g{yoScb2 zSRCL)yO~KVdU4R>&z)oXB@I9e*p8TW?>9z-Sm>L<)qnIV8$jHU9R@7BC;ejA>06!` zJ>48NWy2}0XJ@rUYdVU2iiOZ-0H0pAY*~U1*g%AT6KDE?nWF2uC@}FnVhmr~4z=X5 zI0fcR1YV+jF0+MDpre$9z(MyWb>i`3$3EkQ2KWf34PkUZUz27KE8Ki{o}0f~U1O0R z`o?ylv1Hhccn9y}U*KY=vjb-Me?+#1ktuA&L2y72+mx z%hob|&TD{j4HV<-+(ZPvZQ5*Gw_yHNO!8N%*U(nKaTF~{^C;Vcc}$j^|w;?Bz{FTWAf6fOx-+_hMAdp zEoHFu=sc#>vkCN;8Wr?xSsEPZe$v5U(A3x<}UJ!T}H!T7PC z7}_BIzI0IaJq#4z@T#2CIvKqVXlep)NQKGGu&@oTOTF{B4+m6MPIor5fVBlr$=qCZ zhFH2zhDH=07k7ZjQ4gIzuw{ap=H+G3XR&`Ra-;fZg7s8^lL;>d5``#(>vg9OnRm-j zv_4fq&)eCuMRxg~SK%DOu)7k(^e2W8^+-<>!H$3cc~+<`)R$Im=>4JF3jPdmd|$Vu zz3QCBJpPlx=;FSK|6Eh!+o9hIXUAB_%emXItL-a~1d!Rk%NV0y1NWM+H*Lf#Xp`dY z>pM2k>;#4{!`^d{D1nJMG(23Np6N9m-gYZ#X*bEagsO7lS6QclfUAtXbsoXTQz|E|wu0HL_kI_SaF6n}r zJcQwrRmlXkXk`&C;6GxP6F5D1#59b8y?{pAVtyb%fAIr19w2!@an-6`P^CC(e~ zT$`|$L?6Ka!I)0@Q8kAPNG|^Bv}$TKutdOIlf~WX7>vPi@?9Mrf?!%1@thIo;o%V$ z_S<{=6`RqW#L=_HQg{c7YZ2`6rwC#5ZxCFJUX9@PYtCoG!U{1MqhdZAG5a$ z?Wv=hk9Vr5+A2lH~Q#xH$RVChu@&@!0lP@XZZ5ZiWdI#EL zr@o|`FU5x2LzI@SsbBuo>b5~nQGeS)&)t9qyeH?IH?4bX-wR>vaqoQIr?)C3n1V#^ zFzk^hP3?WpX!T=&=7Q~3-4J@Y$a-`D(BJf`cCno|^6wm!0=wt*&BU(KL6scn9AaW) zK_=_FMNRws)yVQc zzQPNOQEpdvExPAKkVA7H{tqDBx|(h#krMp{8>#N`Q2E)OBG+saT?1i;W2^U75#O82 z0Xb%EJ#}v)y;!-+b>N&};(*oQ!TR&AdMa*+m4n5 z)9t&C3-JJ7L6kr68&0i~pI`fJU!$wg@}>tiCs?9m&R}T>Mz~(FvGLs?E-ubQ<#6!O z$NfK0Mpz1p!^05Us{DRZV(dRj?VXhcDYu++Zy0E9Q#XGjc08)}IFKC-JrlgwS@8`7 z1M$ee*V6jftbu-??hKS2T?lM&+Z)BE-yGL&`_P3Y&Q#eGDQP&>p+iNqvTE{0PO~aE zR=y4hVDxx%0BIynp1Rsw;F0ta*uf&g2Y!u3K` zwVJRm0{U-!TF$t<7_Ou$iDm5HDt%QPBj2qbtfX&cagpU&xv9qE=1t02T|I;8+-y97 zp|h7on=k5_$3Q!8E-1<`C}}^68J~`Jfol#PI;0pPS(LjS(FAKfD8rF$(_p@wal{nf zv3t*@X6HixzfUYuHIprI?ctu4WiA1Y$F;S!XZ>X$My&2De;%})M2azZCNJ$dILWJ% zO@`B5DRmFQFnr?sVpZ%@T7w@;YFj{n{WO+NF!O}%J&etlOQ|8ElUzc2vI! zme{uNLdG@m@$u1ft3zKe!?s^QzzS0mxNyO}pgs{UzI&q*6ZyHh`!Ge=C%LG&I6{~W zO1U49uL}PAGV`;urRz%|M)>jNlMT;PWN@i{y)URgmy|^ERX{AJ`e8!-QEEZypy&*W zH@p~791yy7$SCObOXxAR5yzkt_-E7G4PIlI4Z`7%otWS)(;k>NaSQaUr&O?^Lhf+d z`{EFC*NmU#vdZhRv%A}bVO1|>SDeD8tZm3`O1QZb57gD`fb;0@Hwr@)8PFK;Jt!m( zixXS(i2k2)M{;t@JkjamOGzAHwNFONr~_gd6b!t0QoK>qw9+#Ve~&g5N4QZ7)}y2=t3>VV{muC`o|2{QxJ2s zoL4ab)28UgJYP}KOO0joOKzfi&9gD{ROIZ2^LO@M#u<*19T8gD1M5)S zg7gU(V1y2Sh*7UIKj}4#V67%Q#s-YG$AZHYW@w&pf9313GlP^`x zy~ljG&ThZ{rWlgA;+E6D+FkiE<#Z3m{%!s=u;0WeDS7f14nHB&H0pKQEA|aNC22N* z7G6iFag3~6f6Wo9L%1kNIF2+Vn7wxlW^IJEh2@i=`9EMi2&wrye9 z(;2%@pX%haw$X+im1iC>i9B}u`0-2 z4xfn;G|nk1uRqDTmPBGTB%)Jk4jy}1zGzS=96rP#uFC;-4L{WGw#?8_X@?~`i0_!m z!=}V3%{Xj(b9VD$*PYa)J10gA6tOM-|XgH%sMIu+%to0|+YH$BinggycwA8Vv=Ll}W+^`Kq zfOsXa87sO?PM$2qaWB{D`CI*+1$E$X+|sAhf7IfKKKiaxRZ|<0N8@pzwe{ovI93ml^UtONy7}O4Oyf=<`m%~1dWJ`IQSh2B+vRwT`krFO+^Gf zLOFX&+?xt-QtXa^Z`k9dxfauACMb1vwoedXb+ zv}LMXi=AmVY>0Y3^dsDRfFQ7gMDl$C1VNK8l~q+xf>t~k!`u?sH>bj0Iym1#a^`0R zQkPk;)ao{$ZyJ9UhEB&Hhe1>AvZcY4ho66wlURHx*3>sW(l-smrVpuI8F zwN>U(@g1BXb+*`7;I(0(F&xFX;G|h4%NfEEuDoJ%W>`6(fiER*?ATRGp{*!wALftE z=RU8yyuOeZ;uy=nHEx>~z9b;=cL}^&vw_g-jbpvg#xs%IRrEVp#Y=OH96EH!@R6I$ z=^H=6f@s!PQ&O@3kMT8ciJYQhC(pYf@O4&T14op)LRN#9Q3>X_eWHy1vS@&^w6LH6s03yVCtEAd92J}+5cNe9Qnu}DL6&_s+i`ISY%aait)Ao zka>S12G&L2aDF>b-BTIu$;5ZJr0#*Kca!5-BW%|`m#IQbGW2DC$@tV1Aau-y+6P}-gPmr?6|V}UWWhjh{w6&i>UApy53i>ULiL@jpw~z{blr+#haQJY_$Htx0+oy z;ZOkrk$;@NB8@9nxaL8+kLo#D&*11zP(}tra*EsxO{3X1)xGld@`C zm%Md3)gbT8R$yr`QEO0d+*p)4I>BC4t7oaAuO@D9;1*ih8J zBysd8XR$!*tBckO$A4d7aJ7mG6#E5d*vLlNbZA)Uy zQ|F6LI|9vb8IIoCo~dego6)SWyf$_7^6M~WL{xv9p6;=Ee+Odo>6-^yCxz^5wtErQ zRP_%p_t$9I7xf0R4~twZ4RvHySG%X$(5qn7cw?(_N-A}PSv!5xyCU{uu4~;`gbw!& ztz?-OYe{NvOzLL;=GKyNnKMsfp8u8jM~%hWxU+I!xk|2@8;ex%EMG~W2w?_rxqiMY zbZuzpU?9hQN61;d_>W(SL6Kp8vWMiP0Tf6{l$H!3uyhQXbrIWVTF)=~gm9!69BqVKb<(z=S78H422kePs zu5f6>Uvc zU3xXRZp65Qa#PdqrZ2qBsAHFur5#Lcxny&?XYETXS7TmB&XmD^Q^5o3mIl+Q=kF&w z+(v>J=(1{Ijf(|5e#_|f-)H`um(jOs#3v*?ekCtj)DmMWmP z?a#~DJK7G=ehn74d%Vn&{#YwaiQ!hzokVg$Vi@4I=gI8qaSr#09}9fv;klLZ_jlQCwkGpz?RKN^l{4EvsHjx6(b0SM<1Y5Ja z>o4i01ta4Qr;6=qew?lfPRTrlMd3nGarD2IYUfNehnYF|zu!l$GM~6X0-;c&s<)&q zwHq>HU_RC=4_YFpxKD23@ilh~P<^9gRh~~9^l?a~((C^J-oi69YRVlpH9RyVce4d; z9}_vT2B68AF3h@JCVWWqnQg{9)F;?SkBZX+^-%`uQ>p2`Mc@V40jYgd4La zZWv&ZGQEdP^$ln+2%}Ts?wwI5BDc`gQD@>GZ3s1g{xd31n=jOUsfTf&9Fp%G`=sXt z%;fo{<(CC#^w3OQZ}UC2mwekwPHBBF*lhcH^YUWXHJZ0TxAzLQnqlNhH7+x~)>khe zm}%MlxK1Q#nEQLE`R|Rpg}*<0?Us~O`ryzEZw=cq!2nin(M=MU{n|_K#9c9BpLauu zk{6u2>_Fln%62Xo?`?fbGE)256kZr$7NHz##Hx|z0DkUoy(#JV_rW(Ed% z?U39=!Acj-`y#o&H(3pIaJ+OnLu-zhU^QgDY`Ej2Q2GP}{R@74UcL294}Fd9r0V7G zjbBY}zVEu6-AZp%s3xqrj*j7cJ2%SfGZs5*?Cr$u6-hJw@kTe<2B_B=YVPs*)GcW< z`O`4-Ghy#g`}OM-PBdKypj;+$w9BZdUK1V~yQnexDaY|-hem?br@XwQ4k23`!=l&5 zFXm;Jh`j7zJ;kXh(OkTqw0R#4`rcMQI=$nAmiTrQMezIBZ+S`DsYLe{GdmK6{9I(R zEfyZrEF+&90XEXl-+d8t#9`w@v8j*E-ED6(#?fi7GewN~$iP_9SDs=8fE25 z2ncEkKmAMdaAWmvY$)1ld39P&(xzSaQm(EVXu3qZ`iRXE=9H5fnIF1uj(=5V!z!@G zF+29W5>QO#w%cdYxW8a+wvJ`n_E=6CPK8)vl6Ly}1sLsc5j){RG;AM`l&sr2cGJO1c&}b{uGr zH8H4e)M&7~c=LWb1>>d)^(vpZD;%7bXFn8Z^oCKt-UZ;{nT2F#l$BXUdFAwIlqS;- zDe84e7fQN&?`GN6X6}g-eZ4=`TjMM|uEyDSt@kGj-t|u>tT4=#3Xdp_e0_#otH8s> z_(w3ID-TfA_e69@Daw;Ecr)<4hnL#c+RY6GvG-T5oO6;vtGzxDT^D$0CH(&PqxKKv z8%O?wyR7L@v6)1^9TiH9B6n{BYxHjys}gx`+vAt=XPe!bqo#u$<<1DD7bsUp# zOaqMxnh3#o9bR&mkD63}^C+|3g&Y?;Xu6fBh!YvmF3=~D==)%hblsX~YZ?fFzq%${XtUJ(L3Nl-)##qXM6cycBds%3r1a;6EP&)+ z@|`_%9R2W8GRIyO1NsbXRpbF^>(t=rt$0E(A!tR##74dlexN2?nC^TGaB!Vpi5zGh zC?|I%ul=v3i6YHuANt0^@F zBGq{HvL&nfF(?2Q{KYvH6%{$`*}_EmoOtX#G>e2WqMRTr4g{!(Uc$-&EX0tIX2i&> zseZ9N+#oj}$iCU~1vwDc=VS6D`$#ZnS?0r+j)3la!J=Wgn6EgKz%ZM5T1#~@uzFaA z^m)U=+IfPpbSuDm&_7QhsQ+dV?`C7WT`-quSTW7Gnpu1t zL)#wVQWv}qNfMK=tU){Xy(k&3d2aA<{3pG*{P}Uvi$yJW&#lFbI<M_2X8qT}#WLB=x$_@A=X=P@3CN?0#BKMbUMG_!(I+?A5D& z*b-?Wt2%9<2}I`V3X?eWCuSK*uNOYd^aGA5IK`TfO79XCYs3H3+LedJxWE0U5luNQ zgi?|$m5wE%v?+D8pq&<^IF^wTN{hBh5hqg|OPjQjN>SR5wkee4w4v0bg*H^uzE1Og zCg(NzUGMU{-s|;;t8Jcn=J_u7_r5>N{lsiafk=h(5F9fdNRi?%1+Nn>4#3{~qqwMR zr#%i)&f}&w<@J~S`maBW=B1h=u2D$Q2B{O$(U3~8{6;#|2LfyaX#(^Ih+!JcsiDSe z1JXt+sjake@ptX~g-tOtUeznz66ZR6MQpzMMzzB)M|lLxqYgZ_uc*lk{G>!%t<_go znktyxRvO`J4dzJ7F826nM%X?wD1>9vpHW6j=5Mssea$ld@NPUNQ+v*wRjf+?E{jK{ zX4FW~Nq+o&hyihy5ElOEBdO5#@z;UxBxE|h^J^bHDF1X%xZ1qB6`Q!K%BFeS8N4p_ z+$$@?$0j@iY7WPXg?P3L9x;`ackN&4zC2YIANJ-ykEQz&Z|SR7;`7B!v&tr&h>x)N zTP!+Q9kkzF<$8rp(lza>j+vh|o&AKo2QPWhnt4v$j|%pib4Pn0?T?`7#cleVZ%@YB z6%I5Qd0DM`M9tziATl<7ACvQuo4Js7rfJ7sF&gacS8C?2sx19>byBeDy3C%$2ao77 zM@Fd6d+64a+pJp)d@J9_X!C&A36SvC&6}5b%`N_$YU08ko!0#zAE)5NGW}4G85B<5 zxN$F-rf`z<=>?cty0;A7PBp!~-=@FkR{oGX>vO}Q&U|6@&Xi2aB_bC8peRSD3C)T^ zl9Kd8#ebmPo=FcKrog7Auc2^jTlp97&!2?8RDImG%(+!SbIq9R_}KgQUZ>0tpSi>W zl{0!mKWMk<)9@gYD$^aG|6Q+c*Q7d9(I|Z5?WgTrX}rr&?>~9+q`fBxky-8W9g(rT zt@yI6>^GwC&{Zz(54z%}^I>jIyGv^3|(>p&{Dk%Q4%5YJ)3L z@DkSPUY?$A(i3aXwfOSX?QL&+!lLKr^8fK=#{eO)U_M!nZ;m_f9R1r=zULvb55y1~$M71tkoHRHH z=V&SQxn0gH$z03AQVUjaQ|B*P!~NU#3J0;tK+PN-7H`mbE-l z`c;-IHLCsdi%dzrzkcE8YHV!WeZ)!?E`mrCcc(fw=D-AEA>h&R&r(P}!5@j;b2Qx@ zcvmug+Jiq8yEo*{$oJoNv;uOWoN{tfSPS_c=o3|n^?TPgM22lXVgCE?aW!tOHwalC z%Qd%P>j$m;amlZuLL|+N2fcL3#HuZpQ`uzFxBuQKMyb$pxZ>V~5r!~olw9f4ZVF#x*G!{U$-wSN^t$&KC$qo(;A)2Ns-s7@P zJJzi>Tlw@yZlCqO!FO+@Licj+z}CMht#=U&a4x_}6YdOe9*MJl8Xj;V{%#(h+rTaV zCtbKoW3-2QCHwWDc)roPl7)=sW)?_F$!r&6yd5YI$&GK{E)W$hWx%>Dqm;2X=YA;M zbBFgn#UsE-q$^6YErix@w!NZQ0nR)_`BvXtDPpB?t*bv_eBSQ@)x$@|w%)WsNd75Z zIQ2}C8sofo+{nw~zfN7eZ~-L3*OL)nKooZx)3aM+nHr6!n47B#^wQ@Zh$qm-MW{41 zG{BqF9Bpb|q|eb7+z?R?qU7$WeS7z!uK*(YT?uzo$HWxm<)giBRF|N<2uut5Ehk_a zyu#8H$&Wuz&%Z`QW?7^p)vYa9Q#fVhe&%D6$gSYX^>f71gh`;XEMLAH@?2T2C0ji$ z#YvRYGx zt@g}Oo-tep$jdNsx_rj3-|<^f&ZWNH>QVAJsYd%+N4-V-vSs&V)U~`E_%AdHp%d&YMNs~87j1-E8gLBc%^?6rA{+ulKy&WHWd&;JB6VvWp z{bV*eb?<#L7)9x^wB{jxpUrun-vfxQmXX=$Plc`yY%2n^-l0;7aRY}hF;mq(B1DM< z=WPTep{3<~sAb&Lbk3Tl3K11^eq5NOMQjo0ymA2vg^g!wM5nR2`Nbb=OiHkqn|l4< zyabu6#s2^F-ao%k?S_ysbcU>R=-ZbWsjjXLyJ`3*z8Pz2 z!fWBsp+kT>vlM`xYG_2o7J>|&jczViuSQ$Xl{e?yRvj8h< z=pAwX{CUhx*qtVpPb8-2=0;=!aY1Ywm7{L(|M4`6WVwxNe7+P`Zp}4)=an1cZPp;m z1MjuFckddnK+{VF1vC0NV-F7x3MHXH#C8oH|KX?OK|;h1c|NX96D+S*_X0hKFV)Gc zpyETk0sOFqqL|||*lmYLCW?kXs45p5ht$#1uF}LJM0;G3PrVk zEF{|nB%Lz`nr3Fgxht=Z7{7$f(EjAfqk+&mH6y2uni`bZO4$A_HS=@S&hu0)v{&rx z==h=nOdL5);%T5}XhGDcNko%5H{qg1^;#6TYWeb5KydGx>+2UUg>w<`EMevB2D6akhcp(mZ( zOXiB^_9sp$a!vzFcaXs)kM_w&P-j&5`f{b$FA)-I>FIIU7zSIgj1ycXd_P|6A26Q; zC=T|7s3K-YX0)TUH9R=zjQZl;yUCC&=Pt5M<_vYJFzF&Qy=d3YopW>jG~thv>CSp% zq~V1{ssn_-kSG|4vd>wC_dVYRBC?Bvwpw%R(j{_I zU(OU*gP^MHZFu)C+kN0D`XZn$>mPGrpjA!d78RZ`+*`PbD`uSUg-C_$qG&f!AJQa<^k zGcQPVkqabj6(b;(I~xh}ECl)-!JmES^7aUUf~)y{_Kw?q382J41Lj z{`@Td*WD-e74vI|_pihm&TfNQLx=`*Zs+Gg|CiZvfeP}VykMa+TAy()QTj}ktL5;& zd5NE+_5U>C{^h;3sLKn$v-J{D6XUFa!xxDVllSTgxw#$y3;+f}?rlk-P#|%!un@69 zCM9WrdJuqE`#$#O1qZS#4MT>l?@Ja zbz;>BqrG1pNs9h;X@|PhnEZTejZZO;oeY{eq~N3Ce^rAZ%Zb*PFW_H{9``&^9XPao|6z2O^6IK(}!w_4#XLp zF;7oVV`HK6o;%Q;!~0W_Dk5rK^k&`B!-q%5#tgt9>=@5jUCSm&96oZSZv)cf%k}nI z0{L+p*1{Fg4t7eOqGwH4MF0~5jph|!a&v{@QWfV*!v`4|$LVOz=XB;w{I0NAujm?E znM`M%QlubW6Fu3UX(=hRJH>WRErT+1W}b8kB#>nE@^Z&!GToc59`fh%|NT!{yf!k=4ovSJXSE zAoM@Zd`e3n@du0z{ghtiQ8!)rgGOn0J9PHPT)G zOysy3s=m=W08ByZ`E)Zf{?FZcvq+>mVmSPv!>2`X4Fjx;;u@o&0bU$>4z-et7uUaj z-T!RXoXv`g6=4binVI76A0L@pzGiHBO6(yg6vtqg@tCh@yr;VjRZvwG6m+(`O zfO`{0+C@Q0YuFED!4!&tzdew><$#2JNIX)uv6}Ynwk412QN*#q=0+qHDl*PT*DQJk zGi@Y?8G@ah=YcKC<_@#aG3v7jD|bcLZULsiIi(^+p4%EecjUMt#u^K}R9CLNo0zDt zbg>pjd5^QQLYeYf>3Zqe6%~d}Xo_xM8~t*5ZyV(mWF=cpoKQ-bSVJ|p&T})#Ep51c zQik16GTqQ_;M<07!=UF7r$GgBTpC(IJGt%fZftvyp{mo9lcUlw{c#83U6MA8igbMA zZU=`RFR$g%UiMg>7u3SvpQ!cGbuB?l*$RepPC`O@RyBsbkzC2Ezhg&PdHE5CI2wGY zP0qD4wK$9Zik2p2+tbQm){7^P z`X8`-J`Gv#d*;mF7#kcM95~0|xs}ERDl&Y@rSg}K`aTuX6t6b?_4v) z@Q(L+Uc2_@WcuY$G!-KcDC z8!41RMDchSq$-CKp;^D|XSb6wP0MC#`XWjzA@_JU1|3KGPN8INrB9umu4vC&K-s+| zpiw_As~YnS759vH}G*ADlifqKzkNJ`R@GLzizCOAilKdd10=&PFjuIB7A676f?k$~OcdBF|Gj7l9Qe31=z?1;6Fl})uRBK63tEChnw z8TjnA`h{DO3OYuNx;i~oO`cM^DaAR~+2~;B?bK_iiNRCoqTg2UR30v!HTv7bCEm$& zmdgSwK}0!Debbk0hWhUrTfBtI-;L?c(vjIQvcRQ+SN!BVwi#g`Ox6P#z3X<97 zy-|mMO6Cf;?6I~s5H|CA^d{QfNl%Y#gMG1JIBrnacTf9iZq6)jy+CL=6+!s>#Y4gZ zfKqw!aZ)3=5ojs_Z0E7J3NP&bv|nuXBy$nN-%EKoY_|lA9OGILKj9kq<6!*%b_8Fh zz+HFXzWNTpb)N&*7nCy4={vSKrYm5BTl=UwNWkdez(_qfYr@YfxB_CW13t_llvo4> zgHb~R*3%d9UM>0hv!K!}{w18V#AyjqhAV%3iC3e-I~8Z21T}Oa>(g+bxD>i89;Us` zdG6QkSZuHbwr^%;Lw-8Cu7667E4vb$9l6_|TK1^G?d!V;nRe#x(PMsz7iZ6z(@$?Q zLQ^vo;(8%1uc`t!R64I#no@>q!Mv}^ zwEGgnBO^9h_F-qg-Jv&oPptLP+qX}go-5d}I3#AYG3YN6zD}9${q@Yk2{)F?NJRs04qOu0i|-~ zEnB=W2@c!{!>EN04-Z3qZW=L^PM>9z-ub;Wo>swDH718=hQVRazSp09vFg>tjrz9TzJf#D<;b@i&IUwz6|aIKI;X1J=i*iVOj8jWV&N}FpGSp8(S z0B4$-kVA)>Dl@X@H|?>u_4xGzb_27shtofxEjNJsx~9gP(=mQH6^T*?)FOF4U~MID zyWRq?);@2Y2`d6-ejYYaWQuFtg9m{meuJ-@yXbMM{xGsmcfr}{`G{+Q67I{!!s5k5 zWu&TznAn#OAJRC{-nnxnxJ78PkV#Wqr?yt7bJ3QWX;w?0I?Ouc0s^S{$A%}q$FWsA zZ!K83(8Moko=pz0WWGa1EIGo|?A~oOY{T=L z`t3)Zep0~Ayj2_3MB5&A;a*tgaaQ#mvxsKlV6?)8$0=~3KmId3lq;}gE;&EYa9+5J6^_ArKr zUA!Y3_3Bn%brFaGRXy{#1&%pZ4V22WM%!}l=idVUbByhNRj#{e!Gdo)`9C~MWc+yImft>rl{W}Jgq~CQ0y<&yU&8dkr&WW1=YwV_j?~VxqjW>F#h}@ zCD&tQ-6|?52mMo6Cf(ik;dW-qm1Sjn(+SZBCFhrPu8sRucE zDk@q!pExn?KKxFWFMkR)VOb~o5jkiR6DK2PMm0I_#6+0?6=W2ltbv+iEffse5ocUo zkA3z%3$uXFE_W6o#y{*ic!e*%eIX-fSo;k6YHVVxZDy|b(Qas*_Ex_S8f8348L*0qXQN!Oj)LhF+F}c z_b(hI<>@Ftmw!hQTPx&XhiNQm&H9#TV>XX;@u!kcOH*!*yx}KStMUfUu*E?F+B)yY z#y?$4L~omiQ$Dk(y87Suzy&1m3?BG|ai20q@ze*tbwez1LT$(Q@^3;)iaLVw)Xn*Y z^GrwpkR}_Nr{Y=7M2pG%X`rVV;xnJwE!<#zvS9Jn#o{5{o=+ojFk$JN4w4|nwN9@! zf*@YVu&bK*BFKpS_V{8+6dUKn7hASYKNLuNJg48AAX-NM%?k}lwZLKR?lwe=9B*7o zl)jZU>6Fxq0}8{?i#&?xO{s!UkGQo4etX3R6rz#-{_!pwR#MN~0AeHL#E6#~lOF_a z@cY6oXiQXuP+w~L^Px(Ne=(^b literal 0 HcmV?d00001 diff --git a/localization/es/command/README.md b/localization/es/command/README.md new file mode 100644 index 000000000000..4c824e169dc7 --- /dev/null +++ b/localization/es/command/README.md @@ -0,0 +1,243 @@ +--- +title: Command +category: Behavioral +language: es +tag: + - Gang of Four +--- + +## También conocido como + +* Action +* Transaction + +## Propósito + +El patrón de diseño Command encapsula una petición como un objeto, permitiendo así la parametrización de clientes con colas, peticiones y operaciones. También permite soportar operaciones deshechas. + +## Explicación + +Ejemplo real + +> Hay un mago lanzando hechizos sobre un goblin. Los hechizos se ejecutan sobre el duende uno a uno. El primer hechizo encoge al duende y el segundo lo hace invisible. A continuación, el mago invierte los hechizos uno a uno. Cada hechizo es un objeto de comando que se puede deshacer. + +En palabras simples: + +> Almacenar peticiones como objetos de comando permite realizar una acción o deshacerla en un momento posterior. + +Wikipedia dice: + +> En programación orientada a objetos, el patrón de comandos es un patrón de diseño de comportamiento en el que un objeto se utiliza para encapsular toda la información necesaria para realizar una acción o desencadenar un evento en un momento posterior. + +**Ejemplo programático** + +Aquí está el código de ejemplo con mago `Wizard` y duende `Goblin`. Empecemos por la clase Mago `Wizard`. + +```java + +@Slf4j +public class Wizard { + + private final Deque undoStack = new LinkedList<>(); + private final Deque redoStack = new LinkedList<>(); + + public Wizard() { + } + + public void castSpell(Runnable runnable) { + runnable.run(); + undoStack.offerLast(runnable); + } + + public void undoLastSpell() { + if (!undoStack.isEmpty()) { + var previousSpell = undoStack.pollLast(); + redoStack.offerLast(previousSpell); + previousSpell.run(); + } + } + + public void redoLastSpell() { + if (!redoStack.isEmpty()) { + var previousSpell = redoStack.pollLast(); + undoStack.offerLast(previousSpell); + previousSpell.run(); + } + } + + @Override + public String toString() { + return "Wizard"; + } +} +``` + +A continuación, tenemos al duende `Goblin` que es el objetivo `Target` de los hechizos. + +```java + +@Slf4j +public abstract class Target { + + private Size size; + + private Visibility visibility; + + public Size getSize() { + return size; + } + + public void setSize(Size size) { + this.size = size; + } + + public Visibility getVisibility() { + return visibility; + } + + public void setVisibility(Visibility visibility) { + this.visibility = visibility; + } + + @Override + public abstract String toString(); + + public void printStatus() { + LOGGER.info("{}, [size={}] [visibility={}]", this, getSize(), getVisibility()); + } +} + +public class Goblin extends Target { + + public Goblin() { + setSize(Size.NORMAL); + setVisibility(Visibility.VISIBLE); + } + + @Override + public String toString() { + return "Goblin"; + } + + public void changeSize() { + var oldSize = getSize() == Size.NORMAL ? Size.SMALL : Size.NORMAL; + setSize(oldSize); + } + + public void changeVisibility() { + var visible = getVisibility() == Visibility.INVISIBLE + ? Visibility.VISIBLE : Visibility.INVISIBLE; + setVisibility(visible); + } +} +``` + +Por último, tenemos al mago en la función principal lanzando hechizos. + +```java +public static void main(String[]args){ + var wizard=new Wizard(); + var goblin=new Goblin(); + + // casts shrink/unshrink spell + wizard.castSpell(goblin::changeSize); + + // casts visible/invisible spell + wizard.castSpell(goblin::changeVisibility); + + // undo and redo casts + wizard.undoLastSpell(); + wizard.redoLastSpell(); +``` + +Este es el ejemplo en acción. + +```java +var wizard=new Wizard(); + var goblin=new Goblin(); + + goblin.printStatus(); + wizard.castSpell(goblin::changeSize); + goblin.printStatus(); + + wizard.castSpell(goblin::changeVisibility); + goblin.printStatus(); + + wizard.undoLastSpell(); + goblin.printStatus(); + + wizard.undoLastSpell(); + goblin.printStatus(); + + wizard.redoLastSpell(); + goblin.printStatus(); + + wizard.redoLastSpell(); + goblin.printStatus(); +``` + +Aquí está la salida del programa: + +```java +Goblin,[size=normal][visibility=visible] + Goblin,[size=small][visibility=visible] + Goblin,[size=small][visibility=invisible] + Goblin,[size=small][visibility=visible] + Goblin,[size=normal][visibility=visible] + Goblin,[size=small][visibility=visible] + Goblin,[size=small][visibility=invisible] +``` + +## Diagrama de clases + +![alt text](./etc/command.png "Command") + +## Aplicabilidad + +Utilice el patrón Comando (Command) para: + +* Parametrizar objetos mediante una acción a realizar. Puedes expresar dicha parametrización en un lenguaje procedimental con una función callback, es decir, una función que se registra en algún lugar para ser llamada en un momento posterior. Los comandos son un sustituto orientado a objetos de las retrollamadas. +* Especifican, ponen en cola y ejecutan peticiones en diferentes momentos. Un objeto Command puede tener una vida independiente de la petición original. Si el receptor de una petición puede ser representado de una manera independiente del espacio de direcciones, entonces puedes transferir un objeto comando para la petición a un proceso diferente y cumplir la petición allí. +* Soporta deshacer. La operación de ejecución del comando puede almacenar el estado para revertir sus efectos en el propio comando. La interfaz del Comando debe tener una operación añadida de des-ejecutar que revierta los efectos de una llamada previa a ejecutar. Los comandos ejecutados se almacenan en una lista de historial. La funcionalidad de deshacer y rehacer a nivel ilimitado se consigue recorriendo esta lista hacia atrás y hacia delante llamando a un-ejecutar y ejecutar, respectivamente. +* Soporta el registro de cambios para que puedan volver a aplicarse en caso de caída del sistema. Al aumentar la interfaz de comandos con operaciones de carga y almacenamiento, puede mantener un registro persistente de los cambios. La recuperación de un fallo implica volver a cargar los comandos registrados desde el disco y volver a ejecutarlos con la operación de ejecución. +* Estructurar un sistema en torno a operaciones de alto nivel construidas sobre operaciones primitivas. Esta estructura es común en los sistemas de información que admiten transacciones. Una transacción encapsula un conjunto de cambios de datos. El patrón Command ofrece una forma de modelar las transacciones. Los comandos tienen una interfaz común que permite invocar todas las transacciones de la misma manera. El patrón también facilita la ampliación del sistema con nuevas transacciones. +* Mantener un historial de peticiones. +* Implementar la funcionalidad de callback. +* Implementar la funcionalidad de deshacer. + +## Usos conocidos + +* Botones GUI y elementos de menú en aplicaciones de escritorio. +* Operaciones en sistemas de bases de datos y sistemas transaccionales que soportan rollback. +* Grabación de macros en aplicaciones como editores de texto y hojas de cálculo. +* [java.lang.Runnable](http://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html) +* [org.junit.runners.model.Statement](https://github.com/junit-team/junit4/blob/master/src/main/java/org/junit/runners/model/Statement.java) +* [Netflix Hystrix](https://github.com/Netflix/Hystrix/wiki) +* [javax.swing.Action](http://docs.oracle.com/javase/8/docs/api/javax/swing/Action.html) + +## Consecuencias + +Ventajas: + +* Desacopla el objeto que invoca la operación del que sabe cómo realizarla. +* Es fácil añadir nuevos Comandos, porque no tienes que cambiar las clases existentes. +* Puedes ensamblar un conjunto de comandos en un comando compuesto. + +Desventajas: + +* Aumenta el número de clases para cada comando individual. +* Puede complicar el diseño al añadir múltiples capas entre emisores y receptores. + +## Patrones Relacionados + +* [Composite](https://java-design-patterns.com/patterns/composite/): Los comandos pueden ser compuestos usando el patrón Composite para crear macro comandos. +* [Memento](https://java-design-patterns.com/patterns/memento/): Puede usarse para implementar mecanismos de deshacer. +* [Observador](https://java-design-patterns.com/patterns/observer/): El patrón puede ser observado para cambios que activan comandos. + +## Credits + +* [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59) +* [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b) +* [Refactoring to Patterns](https://www.amazon.com/gp/product/0321213351/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321213351&linkCode=as2&tag=javadesignpat-20&linkId=2a76fcb387234bc71b1c61150b3cc3a7) +* [J2EE Design Patterns](https://www.amazon.com/gp/product/0596004273/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596004273&linkCode=as2&tag=javadesignpat-20&linkId=f27d2644fbe5026ea448791a8ad09c94) +* [Pattern-Oriented Software Architecture, Volume 1: A System of Patterns](https://amzn.to/3PFUqSY) diff --git a/localization/es/command/etc/command.png b/localization/es/command/etc/command.png new file mode 100644 index 0000000000000000000000000000000000000000..0f026464ecc4ad0218a06f388d259368f971d1d2 GIT binary patch literal 51106 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 %d-|A2TNuh`Ty%@a2^Oz=yM-`RNka~xT) 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 Imagine que organiza un gran festival internacional de música en el que están programadas actuaciones de varios grupos de todo el mundo. La llegada, la prueba de sonido y la actuación de cada grupo son como transacciones individuales en un sistema distribuido. El organizador del festival actúa como el "Comandante", coordinando estas transacciones para garantizar que si el vuelo de una banda se retrasa (similar a un fallo de transacción), hay un plan de respaldo, como reprogramar o intercambiar franjas horarias con otra banda (acciones compensatorias), para mantener intacto el programa general. Esta configuración refleja el patrón del Comandante en las transacciones distribuidas, en las que varios componentes deben coordinarse para lograr un resultado satisfactorio a pesar de los fallos individuales. + +En palabras sencillas + +> El patrón Commander convierte una petición en un objeto independiente, permitiendo la parametrización de comandos, la puesta en cola de acciones y la implementación de operaciones de deshacer. + +**Ejemplo programático** + +La gestión de transacciones a través de diferentes servicios en un sistema distribuido, como una plataforma de comercio electrónico con microservicios separados de Pago y Envío, requiere una cuidadosa coordinación para evitar problemas. Cuando un usuario realiza un pedido pero un servicio (por ejemplo, Pago) no está disponible mientras que el otro (por ejemplo, Envío) está listo, necesitamos una solución robusta para manejar esta discrepancia. + +Una estrategia para resolver este problema consiste en utilizar un componente Commander que orqueste el proceso. Inicialmente, el pedido es procesado por el servicio disponible (Envío en este caso). A continuación, el comandante intenta sincronizar el pedido con el servicio no disponible en ese momento (Pago) almacenando los detalles del pedido en una base de datos o poniéndolo en cola para su procesamiento futuro. Este sistema de colas también debe tener en cuenta posibles fallos al añadir solicitudes a la cola. + +El comandante intenta repetidamente procesar los pedidos en cola para garantizar que ambos servicios reflejen finalmente los mismos datos de transacción. Este proceso implica garantizar la idempotencia, lo que significa que incluso si la misma solicitud de sincronización de pedidos se realiza varias veces, sólo se ejecutará una vez, evitando transacciones duplicadas. El objetivo es lograr una coherencia final entre los servicios, en la que todos los sistemas se sincronicen a lo largo del tiempo a pesar de los fallos o retrasos iniciales. + +En el código proporcionado, el patrón Commander se utiliza para manejar transacciones distribuidas a través de múltiples servicios (PaymentService, ShippingService, MessagingService, EmployeeHandle). Cada servicio tiene su propia base de datos y puede lanzar excepciones para simular fallos. + +La clase Commander es la parte central de este patrón. Toma instancias de todos los servicios y sus bases de datos, junto con algunos parámetros de configuración. El método placeOrder de la clase Commander se utiliza para realizar un pedido, lo que implica interactuar con todos los servicios. + +```java +public class Commander { + // ... constructor and other methods ... + + public void placeOrder(Order order) { + // ... implementation ... + } +} +``` + +Las clases Usuario y Pedido representan un usuario y un pedido respectivamente. Un pedido lo realiza un usuario. + +```java +public class User { + // ... constructor and other methods ... +} + +public class Order { + // ... constructor and other methods ... +} +``` + +Cada servicio (por ejemplo, PaymentService, ShippingService, MessagingService, EmployeeHandle) tiene su propia base de datos y puede lanzar excepciones para simular fallos. Por ejemplo, el PaymentService puede lanzar una DatabaseUnavailableException si su base de datos no está disponible. + +```java +public class PaymentService { + // ... constructor and other methods ... +} +``` + +Las clases DatabaseUnavailableException, ItemUnavailableException y ShippingNotPossibleException representan diferentes tipos de excepciones que pueden ocurrir. + +```java +public class DatabaseUnavailableException extends Exception { + // ... constructor and other methods ... +} + +public class ItemUnavailableException extends Exception { + // ... constructor and other methods ... +} + +public class ShippingNotPossibleException extends Exception { + // ... constructor and other methods ... +} +``` + +En el método principal de cada clase (AppQueueFailCases, AppShippingFailCases), se simulan diferentes escenarios creando instancias de la clase Commander con diferentes configuraciones y llamando al método placeOrder. + +## Diagrama de clases + +![alt text](./etc/commander.urm.png "Commander class diagram") + +## Aplicabilidad + +Utilice el patrón Commander para transacciones distribuidas cuando: + +* Necesites asegurar la consistencia de los datos entre servicios distribuidos en caso de fallos parciales del sistema. +* Las transacciones abarcan múltiples microservicios o componentes distribuidos que requieren un commit o rollback coordinado. +* Está implementando transacciones de larga duración que requieren acciones compensatorias para la reversión. + +## Usos conocidos + +* Protocolos Two-Phase Commit (2PC): Coordinación de commit o rollback a través de bases de datos o servicios distribuidos. +* Implementaciones del patrón Saga: Gestión de procesos de negocio de larga duración que abarcan múltiples microservicios, con cada paso teniendo una acción compensatoria para la reversión. +* Transacciones distribuidas en arquitectura de microservicios: Coordinación de operaciones complejas entre microservicios manteniendo la integridad y consistencia de los datos. + +## Consecuencias + +Beneficios: + +* Proporciona un mecanismo claro para gestionar transacciones distribuidas complejas, mejorando la fiabilidad del sistema. +* Permite la implementación de transacciones compensatorias, que son cruciales para mantener la coherencia en transacciones de larga duración. +* Facilita la integración de sistemas heterogéneos en un contexto transaccional. + +Contrapartidas: + +* Aumenta la complejidad, especialmente en situaciones de fallo, debido a la necesidad de mecanismos de reversión coordinados. +* Potencialmente afecta al rendimiento debido a la sobrecarga de la coordinación y las comprobaciones de coherencia. +* Las implementaciones basadas en Saga pueden llevar a una mayor complejidad en la comprensión del flujo global del proceso de negocio. + +## Patrones relacionados + +[Saga Pattern](https://java-design-patterns.com/patterns/saga/): A menudo se discute junto con el patrón Commander para transacciones distribuidas, centrándose en transacciones de larga duración con acciones compensatorias. + +## Créditos + +* [Distributed Transactions: The Icebergs of Microservices](https://www.grahamlea.com/2016/08/distributed-transactions-microservices-icebergs/) +* [Microservices Patterns: With examples in Java](https://amzn.to/4axjnYW) +* [Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems](https://amzn.to/4axHwOV) +* [Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions](https://amzn.to/4aATcRe) diff --git a/localization/es/commander/etc/commander.urm.png b/localization/es/commander/etc/commander.urm.png new file mode 100644 index 0000000000000000000000000000000000000000..6b5ebba75bd64a971924f4a3f8a2a89b7df905d7 GIT binary patch literal 322274 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

      vrI-9HR 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

    The second and third wizards({@link AdvancedWizard} and {@link AdvancedSorceress}) are more - * flexible. They do not depend on any concrete implementation but abstraction. They utilizes + * flexible. They do not depend on any concrete implementation but abstraction. They utilize * Dependency Injection pattern allowing their {@link Tobacco} dependency to be injected through * constructor ({@link AdvancedWizard}) or setter ({@link AdvancedSorceress}). This way, handling * the dependency is no longer the wizard's responsibility. It is resolved outside the wizard diff --git a/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedSorceressTest.java b/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedSorceressTest.java index 6680985c19a2..e010e05b7f27 100644 --- a/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedSorceressTest.java +++ b/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedSorceressTest.java @@ -58,7 +58,7 @@ void tearDown() { * her through the setter's parameter */ @Test - void testSmokeEveryThing() throws Exception { + void testSmokeEveryThing() { List tobaccos = List.of( new OldTobyTobacco(), diff --git a/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedWizardTest.java b/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedWizardTest.java index bad5ee804199..257d177e868e 100644 --- a/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedWizardTest.java +++ b/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AdvancedWizardTest.java @@ -57,7 +57,7 @@ void tearDown() { * through the constructor parameter */ @Test - void testSmokeEveryThing() throws Exception { + void testSmokeEveryThing() { List tobaccos = List.of( new OldTobyTobacco(), diff --git a/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AppTest.java b/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AppTest.java index 2684cfcd2c47..3d3d4d409305 100644 --- a/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AppTest.java +++ b/dependency-injection/src/test/java/com/iluwatar/dependency/injection/AppTest.java @@ -35,7 +35,6 @@ class AppTest { /** * Issue: Add at least one assertion to this test case. - * * Solution: Inserted assertion to check whether the execution of the main method in {@link App#main(String[])} * throws an exception. */ diff --git a/dependency-injection/src/test/java/com/iluwatar/dependency/injection/GuiceWizardTest.java b/dependency-injection/src/test/java/com/iluwatar/dependency/injection/GuiceWizardTest.java index 5d4c991c1190..d6b09b31c8c9 100644 --- a/dependency-injection/src/test/java/com/iluwatar/dependency/injection/GuiceWizardTest.java +++ b/dependency-injection/src/test/java/com/iluwatar/dependency/injection/GuiceWizardTest.java @@ -58,7 +58,7 @@ void tearDown() { * through the constructor parameter */ @Test - void testSmokeEveryThingThroughConstructor() throws Exception { + void testSmokeEveryThingThroughConstructor() { List tobaccos = List.of( new OldTobyTobacco(), @@ -83,7 +83,7 @@ void testSmokeEveryThingThroughConstructor() throws Exception { * through the Guice google inject framework */ @Test - void testSmokeEveryThingThroughInjectionFramework() throws Exception { + void testSmokeEveryThingThroughInjectionFramework() { List> tobaccos = List.of( OldTobyTobacco.class, From fc5b8c3d56c4f49fcfe021cb1cc595fd79dbc5ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Mon, 8 Apr 2024 21:27:11 +0300 Subject: [PATCH 061/580] docs: update contributing.md --- CONTRIBUTING.MD | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.MD b/CONTRIBUTING.MD index 39087fbf12d3..8346d331ebfd 100644 --- a/CONTRIBUTING.MD +++ b/CONTRIBUTING.MD @@ -1,4 +1,3 @@ -This is great you have something to contribute! +The project guidelines can be found in [Java Design Patterns developer wiki](https://github.com/iluwatar/java-design-patterns/wiki). -Before going any further please read the [wiki](https://github.com/iluwatar/java-design-patterns/wiki) -with conventions and rules we used for this project. +A good place to start is: https://github.com/iluwatar/java-design-patterns/wiki/01.-How-to-contribute From 1a50353b490a371fc9366bcbc564b73bacb8673e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Apr 2024 20:03:41 +0300 Subject: [PATCH 062/580] build(deps): bump com.h2database:h2 from 2.2.220 to 2.2.224 (#2901) Bumps [com.h2database:h2](https://github.com/h2database/h2database) from 2.2.220 to 2.2.224. - [Release notes](https://github.com/h2database/h2database/releases) - [Commits](https://github.com/h2database/h2database/compare/version-2.2.220...version-2.2.224) --- updated-dependencies: - dependency-name: com.h2database:h2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- slob/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slob/pom.xml b/slob/pom.xml index a53a6f4c409f..4fc040ccf560 100644 --- a/slob/pom.xml +++ b/slob/pom.xml @@ -66,7 +66,7 @@ h2 com.h2database - 2.2.220 + 2.2.224 From d45dcb1a6306215aeb4ebbf200ae7a6123208048 Mon Sep 17 00:00:00 2001 From: David Medina Orozco <53974843+DavidMedinaO@users.noreply.github.com> Date: Tue, 9 Apr 2024 12:16:21 -0500 Subject: [PATCH 063/580] translation: Translate to Spanish (#2894) * Translate Iterator pattern to Spanish * Translate to Spanish: Servant pattern Sharding pattern Spatial-partition pattern Special-case pattern specification pattern State pattern Strategy pattern Subclass-case pattern * Update language to es * Fixing Missing translation * Translate to Spanish: template method pattern throttling pattern trampoline pattern transaction-script pattern type object pattern Update method pattern visitor pattern * Fixing Missing translation --- localization/es/template-method/README.md | 155 ++++++++++++ .../etc/template_method_urm.png | Bin 0 -> 36470 bytes localization/es/throttling/README.md | 218 ++++++++++++++++ .../es/throttling/etc/throttling_urm.png | Bin 0 -> 53754 bytes localization/es/trampoline/README.md | 149 +++++++++++ .../es/trampoline/etc/trampoline.urm.png | Bin 0 -> 15316 bytes localization/es/transaction-script/README.md | 117 +++++++++ .../etc/transaction-script.png | Bin 0 -> 66480 bytes localization/es/typeobjectpattern/README.md | 209 ++++++++++++++++ .../etc/typeobjectpattern.urm.png | Bin 0 -> 67712 bytes localization/es/update-method/README.md | 33 +++ .../update-method/etc/update-method.urm.png | Bin 0 -> 39843 bytes localization/es/visitor/README.md | 232 ++++++++++++++++++ localization/es/visitor/etc/visitor.png | Bin 0 -> 22790 bytes localization/es/visitor/etc/visitor_1.png | Bin 0 -> 47078 bytes 15 files changed, 1113 insertions(+) create mode 100644 localization/es/template-method/README.md create mode 100644 localization/es/template-method/etc/template_method_urm.png create mode 100644 localization/es/throttling/README.md create mode 100644 localization/es/throttling/etc/throttling_urm.png create mode 100644 localization/es/trampoline/README.md create mode 100644 localization/es/trampoline/etc/trampoline.urm.png create mode 100644 localization/es/transaction-script/README.md create mode 100644 localization/es/transaction-script/etc/transaction-script.png create mode 100644 localization/es/typeobjectpattern/README.md create mode 100644 localization/es/typeobjectpattern/etc/typeobjectpattern.urm.png create mode 100644 localization/es/update-method/README.md create mode 100644 localization/es/update-method/etc/update-method.urm.png create mode 100644 localization/es/visitor/README.md create mode 100644 localization/es/visitor/etc/visitor.png create mode 100644 localization/es/visitor/etc/visitor_1.png diff --git a/localization/es/template-method/README.md b/localization/es/template-method/README.md new file mode 100644 index 000000000000..bb427d1257ce --- /dev/null +++ b/localization/es/template-method/README.md @@ -0,0 +1,155 @@ +--- +title: Template method +category: Behavioral +language: es +tag: + - Gang of Four +--- + +## Propósito + +Define el esqueleto de un algoritmo en una operación, difiriendo algunos pasos a subclases. Plantilla +Método que permite a las subclases redefinir ciertos pasos de un algoritmo sin cambiar la estructura del algoritmo. +del algoritmo. + +## Explicación + +Ejemplo del mundo real + +> Los pasos generales para robar un objeto son los mismos. Primero, eliges al objetivo, luego lo confundes... +> y finalmente, robas el objeto. Sin embargo, hay muchas maneras de implementar estos +> pasos. + +En palabras sencillas + +> El patrón Template Method esboza los pasos generales en la clase padre y deja que las implementaciones hijas concretas definan los detalles. + +Wikipedia dice + +> En programación orientada a objetos, el método de plantillas es uno de los patrones de diseño de comportamiento +> identificados por Gamma et al. en el libro Design Patterns. El método de plantilla es un método en una +> superclase, normalmente una superclase abstracta, y define el esqueleto de una operación en términos de +> una serie de pasos de alto nivel. Estos pasos son a su vez implementados por métodos de ayuda adicionales +> en la misma clase que el método de plantilla. + +**Ejemplo programático** + +Presentemos primero la clase de método de plantilla junto con sus implementaciones concretas. +Para asegurarse de que las subclases no sobrescriben el método de plantilla, el método de plantilla (en nuestro caso +método `steal`) debe ser declarado `final`, de lo contrario el esqueleto definido en la clase base podría +ser sobreescrito en subclases. + +```java +@Slf4j +public abstract class StealingMethod { + + protected abstract String pickTarget(); + + protected abstract void confuseTarget(String target); + + protected abstract void stealTheItem(String target); + + public final void steal() { + var target = pickTarget(); + LOGGER.info("The target has been chosen as {}.", target); + confuseTarget(target); + stealTheItem(target); + } +} + +@Slf4j +public class SubtleMethod extends StealingMethod { + + @Override + protected String pickTarget() { + return "shop keeper"; + } + + @Override + protected void confuseTarget(String target) { + LOGGER.info("Approach the {} with tears running and hug him!", target); + } + + @Override + protected void stealTheItem(String target) { + LOGGER.info("While in close contact grab the {}'s wallet.", target); + } +} + +@Slf4j +public class HitAndRunMethod extends StealingMethod { + + @Override + protected String pickTarget() { + return "old goblin woman"; + } + + @Override + protected void confuseTarget(String target) { + LOGGER.info("Approach the {} from behind.", target); + } + + @Override + protected void stealTheItem(String target) { + LOGGER.info("Grab the handbag and run away fast!"); + } +} +``` + +Aquí está la clase ladrón halfling que contiene el método de plantilla. + +```java +public class HalflingThief { + + private StealingMethod method; + + public HalflingThief(StealingMethod method) { + this.method = method; + } + + public void steal() { + method.steal(); + } + + public void changeMethod(StealingMethod method) { + this.method = method; + } +} +``` + +Y por último, mostramos cómo el ladrón halfling utiliza los diferentes métodos de robo. + +```java + var thief = new HalflingThief(new HitAndRunMethod()); + thief.steal(); + thief.changeMethod(new SubtleMethod()); + thief.steal(); +``` + +## Diagrama de clases + +![alt text](./etc/template_method_urm.png "Template Method") + +## Aplicabilidad + +El patrón Template Method debería utilizarse + +* Para implementar las partes invariantes de un algoritmo una vez y dejar que las subclases implementen el comportamiento que puede variar. +* Cuando el comportamiento común entre subclases debe ser factorizado y localizado en una clase común para evitar la duplicación de código. Este es un buen ejemplo de "refactorizar para generalizar", tal y como lo describen Opdyke y Johnson. Primero se identifican las diferencias en el código existente y luego se separan las diferencias en nuevas operaciones. Por último, se sustituye el código diferente por un método de plantilla que llama a una de estas nuevas operaciones +* Para controlar las extensiones de las subclases. Puede definir un método de plantilla que llame a operaciones "gancho" en puntos específicos, permitiendo así extensiones sólo en esos puntos + +## Tutoriales + +* [Template-method Pattern Tutorial](https://www.journaldev.com/1763/template-method-design-pattern-in-java) + +## Usos conocidos + +* [javax.servlet.GenericServlet.init](https://jakarta.ee/specifications/servlet/4.0/apidocs/javax/servlet/GenericServlet.html#init--): +El método `GenericServlet.init(ServletConfig config)` llama al método sin parámetros `GenericServlet.init()` que está pensado para ser sobreescrito en subclases. +El método `GenericServlet.init(ServletConfig config)` es el método plantilla en este ejemplo. + +## Créditos + +* [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59) +* [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b) +* [Refactoring to Patterns](https://www.amazon.com/gp/product/0321213351/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321213351&linkCode=as2&tag=javadesignpat-20&linkId=2a76fcb387234bc71b1c61150b3cc3a7) diff --git a/localization/es/template-method/etc/template_method_urm.png b/localization/es/template-method/etc/template_method_urm.png new file mode 100644 index 0000000000000000000000000000000000000000..b7babccff96da7d88fb99ae5a705c7d4f025904c GIT binary patch literal 36470 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∈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 U>vZmeO~f^#f|76Z__aR&f82J0kN^Mx literal 0 HcmV?d00001 diff --git a/localization/es/throttling/README.md b/localization/es/throttling/README.md new file mode 100644 index 000000000000..d6612caba281 --- /dev/null +++ b/localization/es/throttling/README.md @@ -0,0 +1,218 @@ +--- +title: Throttling +category: Behavioral +language: es +tag: + - Performance + - Cloud distributed +--- + +## Propósito + +Garantizar que un cliente determinado no pueda acceder a los recursos del servicio más allá del límite asignado. + +## Explicación + +Ejemplo del mundo real + +> Un joven humano y un viejo enano entran en un bar. Empiezan a pedir cervezas al camarero. +> El camarero se da cuenta inmediatamente de que el joven humano no debe consumir demasiadas bebidas demasiado rápido +> y se niega a servir si no ha pasado suficiente tiempo. Para el viejo enano, el ritmo de servicio puede ser mayor. +> ser mayor. + +En palabras sencillas + +> El patrón de Throttling se utiliza para limitar la velocidad de acceso a un recurso. + +[Microsoft documentation](https://docs.microsoft.com/en-us/azure/architecture/patterns/throttling) dice + +> Controlar el consumo de recursos utilizados por una instancia de una aplicación, un tenant individual, +> o un servicio completo. Esto puede permitir que el sistema continúe funcionando y cumpla con los acuerdos de nivel de servicio, incluso cuando un aumento de la demanda impone una carga extrema sobre los recursos. + +**Ejemplo programático** + +La clase `BarCustomer` presenta los clientes de la API `Bartender`. La clase `CallsCount` registra el número de +llamadas por `BarCustomer`. + +```java +public class BarCustomer { + + @Getter + private final String name; + @Getter + private final int allowedCallsPerSecond; + + public BarCustomer(String name, int allowedCallsPerSecond, CallsCount callsCount) { + if (allowedCallsPerSecond < 0) { + throw new InvalidParameterException("Number of calls less than 0 not allowed"); + } + this.name = name; + this.allowedCallsPerSecond = allowedCallsPerSecond; + callsCount.addTenant(name); + } +} + +@Slf4j +public final class CallsCount { + private final Map tenantCallsCount = new ConcurrentHashMap<>(); + + public void addTenant(String tenantName) { + tenantCallsCount.putIfAbsent(tenantName, new AtomicLong(0)); + } + + public void incrementCount(String tenantName) { + tenantCallsCount.get(tenantName).incrementAndGet(); + } + + public long getCount(String tenantName) { + return tenantCallsCount.get(tenantName).get(); + } + + public void reset() { + tenantCallsCount.replaceAll((k, v) -> new AtomicLong(0)); + LOGGER.info("reset counters"); + } +} +``` + +A continuación, se introduce el servicio al que llaman los inquilinos. Para realizar un seguimiento del número de llamadas, se utiliza un temporizador de estrangulamiento. + +```java +public interface Throttler { + + void start(); +} + +public class ThrottleTimerImpl implements Throttler { + + private final int throttlePeriod; + private final CallsCount callsCount; + + public ThrottleTimerImpl(int throttlePeriod, CallsCount callsCount) { + this.throttlePeriod = throttlePeriod; + this.callsCount = callsCount; + } + + @Override + public void start() { + new Timer(true).schedule(new TimerTask() { + @Override + public void run() { + callsCount.reset(); + } + }, 0, throttlePeriod); + } +} +``` + +El `Bartender` ofrece el servicio `orderDrink` a los `BarCustomer`s. Los clientes probablemente no +saben que la tasa de servicio de cerveza está limitada por su apariencia. + +```java +class Bartender { + + private static final Logger LOGGER = LoggerFactory.getLogger(Bartender.class); + private final CallsCount callsCount; + + public Bartender(Throttler timer, CallsCount callsCount) { + this.callsCount = callsCount; + timer.start(); + } + + public int orderDrink(BarCustomer barCustomer) { + var tenantName = barCustomer.getName(); + var count = callsCount.getCount(tenantName); + if (count >= barCustomer.getAllowedCallsPerSecond()) { + LOGGER.error("I'm sorry {}, you've had enough for today!", tenantName); + return -1; + } + callsCount.incrementCount(tenantName); + LOGGER.debug("Serving beer to {} : [{} consumed] ", barCustomer.getName(), count+1); + return getRandomCustomerId(); + } + + private int getRandomCustomerId() { + return ThreadLocalRandom.current().nextInt(1, 10000); + } +} +``` + +Ahora es posible ver el ejemplo completo en acción. BarCustomer` el joven humano está limitado a 2 +llamadas por segundo y el viejo enano a 4. + +```java +public static void main(String[] args) { + var callsCount = new CallsCount(); + var human = new BarCustomer("young human", 2, callsCount); + var dwarf = new BarCustomer("dwarf soldier", 4, callsCount); + + var executorService = Executors.newFixedThreadPool(2); + + executorService.execute(() -> makeServiceCalls(human, callsCount)); + executorService.execute(() -> makeServiceCalls(dwarf, callsCount)); + + executorService.shutdown(); + try { + executorService.awaitTermination(10, TimeUnit.SECONDS); + } catch (InterruptedException e) { + LOGGER.error("Executor service terminated: {}", e.getMessage()); + } +} + +private static void makeServiceCalls(BarCustomer barCustomer, CallsCount callsCount) { + var timer = new ThrottleTimerImpl(1000, callsCount); + var service = new Bartender(timer, callsCount); + // Sleep is introduced to keep the output in check and easy to view and analyze the results. + IntStream.range(0, 50).forEach(i -> { + service.orderDrink(barCustomer); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + LOGGER.error("Thread interrupted: {}", e.getMessage()); + } + }); +} +``` + +Un extracto de la salida de consola del ejemplo: + +``` +18:46:36.218 [Timer-0] INFO com.iluwatar.throttling.CallsCount - reset counters +18:46:36.218 [Timer-1] INFO com.iluwatar.throttling.CallsCount - reset counters +18:46:36.242 [pool-1-thread-2] DEBUG com.iluwatar.throttling.Bartender - Serving beer to dwarf soldier : [1 consumed] +18:46:36.242 [pool-1-thread-1] DEBUG com.iluwatar.throttling.Bartender - Serving beer to young human : [1 consumed] +18:46:36.342 [pool-1-thread-2] DEBUG com.iluwatar.throttling.Bartender - Serving beer to dwarf soldier : [2 consumed] +18:46:36.342 [pool-1-thread-1] DEBUG com.iluwatar.throttling.Bartender - Serving beer to young human : [2 consumed] +18:46:36.443 [pool-1-thread-1] ERROR com.iluwatar.throttling.Bartender - I'm sorry young human, you've had enough for today! +18:46:36.443 [pool-1-thread-2] DEBUG com.iluwatar.throttling.Bartender - Serving beer to dwarf soldier : [3 consumed] +18:46:36.544 [pool-1-thread-1] ERROR com.iluwatar.throttling.Bartender - I'm sorry young human, you've had enough for today! +18:46:36.544 [pool-1-thread-2] DEBUG com.iluwatar.throttling.Bartender - Serving beer to dwarf soldier : [4 consumed] +18:46:36.645 [pool-1-thread-2] ERROR com.iluwatar.throttling.Bartender - I'm sorry dwarf soldier, you've had enough for today! +18:46:36.645 [pool-1-thread-1] ERROR com.iluwatar.throttling.Bartender - I'm sorry young human, you've had enough for today! +18:46:36.745 [pool-1-thread-1] ERROR com.iluwatar.throttling.Bartender - I'm sorry young human, you've had enough for today! +18:46:36.745 [pool-1-thread-2] ERROR com.iluwatar.throttling.Bartender - I'm sorry dwarf soldier, you've had enough for today! +18:46:36.846 [pool-1-thread-1] ERROR com.iluwatar.throttling.Bartender - I'm sorry young human, you've had enough for today! +18:46:36.846 [pool-1-thread-2] ERROR com.iluwatar.throttling.Bartender - I'm sorry dwarf soldier, you've had enough for today! +18:46:36.947 [pool-1-thread-2] ERROR com.iluwatar.throttling.Bartender - I'm sorry dwarf soldier, you've had enough for today! +18:46:36.947 [pool-1-thread-1] ERROR com.iluwatar.throttling.Bartender - I'm sorry young human, you've had enough for today! +18:46:37.048 [pool-1-thread-2] ERROR com.iluwatar.throttling.Bartender - I'm sorry dwarf soldier, you've had enough for today! +18:46:37.048 [pool-1-thread-1] ERROR com.iluwatar.throttling.Bartender - I'm sorry young human, you've had enough for today! +18:46:37.148 [pool-1-thread-1] ERROR com.iluwatar.throttling.Bartender - I'm sorry young human, you've had enough for today! +18:46:37.148 [pool-1-thread-2] ERROR com.iluwatar.throttling.Bartender - I'm sorry dwarf soldier, you've had enough for today! +``` + +## Diagrama de clases + +![alt text](./etc/throttling_urm.png "Throttling pattern class diagram") + +## Aplicabilidad + +El patrón Throttling debe utilizarse: + +* Cuando se necesita restringir el acceso al servicio para no tener un alto impacto en el rendimiento del mismo. +* Cuando varios clientes consumen los mismos recursos del servicio y la restricción debe hacerse en función del uso por cliente. + +## Créditos + +* [Throttling pattern](https://docs.microsoft.com/en-us/azure/architecture/patterns/throttling) +* [Cloud Design Patterns: Prescriptive Architecture Guidance for Cloud Applications (Microsoft patterns & practices)](https://www.amazon.com/gp/product/B00ITGHBBS/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=B00ITGHBBS&linkId=12aacdd0cec04f372e7152689525631a) diff --git a/localization/es/throttling/etc/throttling_urm.png b/localization/es/throttling/etc/throttling_urm.png new file mode 100644 index 0000000000000000000000000000000000000000..a9824e24b5a4da2e24fffd0e96903c138e55d6c3 GIT binary patch literal 53754 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Ί>&&iSzoIS3W*cr3^drORH&8b-d=}4D z|BzEUA)yqmKGDibA(}11-pJF~cQ5nOU)0%?E3m}Iz2<1teB(jwo1Y{m|Jxr4u%yru zuOQg(BFwuZLRh5A07c?~ufEc}{>uG12MQW2h zR&DRDoRj%kdT{@}@@1;Gta#Z5?-+z}#@;R|*kGRsuy@~rTFop*{Zuu!M{6gW} z8HprX4&__kFIer$1ucZ)ro#B>_!47wtgqKabh$Qhv=*S_MEH?6Z-F|xoqM3$`HLe4 zn`ozrOi=ib0Sz6=qgw<>MF4}~=g*(dv9K(8-r05L>ezFKHRCiMUXFc|8K-xCX8VS^pvH5=nl8j<(%{y98Qsg<0x|X)H*Wm# z*^3gcUI@fYU$GG*h3!R_+t)dA5Paz zw>|%ad$93DAP0+m?-w#zd$R3=QFONP)+V>G7<;hgSJ1X(W;@(DlJWE6=)*Fsp1Po|NdppN_mR~0+G-c=}G@trwQCqUUdj9YoO5+}c%JtEYM(X#lO|Nhu5Ws4M= zU4O(`>6cvc@MwT@WB zv}AbZMevCuP>S(mvb#Hbjo(hUF!RK5#0tTu$ZsHGy7TU7^NL4Y_bx7zpSt%?uQfZa zx?&uiwn|6s^>Hh;+PJb-YyH6q@nDCPmI80rd z)^yfhxb(3~wUqb-2^k5Nt}GsjbJecN@xs{rw*LE(X<86rvy+n`0J=$D1xLXAq zICRVW=hBWvUiPch!l47FK(F$JENgz_E^9A zyv3kt%oDL)U+-WaHoe%+yC0}ABBYhRC*u{7z(+kUT&B8)c02#Nf*AQs%= zbY01Iw5EMFRuZ#4>)iA}zieA?!CUsE+E8YjZ?;qyZb~=slgs@~)Alr*$~phjU9Cko zjDOt0cm@fXUY)c!SPwCH7B?!U}dnJMzz zI@dlId0mOAuKo_`9Nu1*{M5=^p^4C^?@6antakrg2(9-X>Z=7FQ~qLzLrC!ltn$-16Z_pCFytv)_4A!zL;g)sbs4$ed1e%ITCq?1xneS4Q8Sb_dZ3pc|Ec%2S zgypJBy-`PRWH@+UKELiMFp@&E-t%j_rf^JkSN z-}G}WM>f30oDB@r-r37yvGbwv8$^?6;QhN@Y+zbl%G~dIH%eb_w~o(+pC^| zo#s%0hv2p#?`?{4k9V5;915!b?Zwu}!NHyeG$;Vm%B&VYd*P2B{gfcJl7?C`)7orP zNqTvB@+b{WyyZf5NCh<3i+IkVdI6l4AZq%yhRuLjDDAGIO-U7(q^p!|JE9qty{!|^ zg^ypmwzIvVQ7F&kIyDGoz$`8T#HAd>gl+#MR~zXW4<-P)4tvgu?)H@l*&|hx)8}w%HX~&r?r@s*D!`{Bcc2vfow>h@qv|ZslN=F{94je^IN{H9J(iY zBQP4k;VL`9H9Q*UtMr7g|9K4r`3k=IW zAwy8$f&PFD**~E;S-Ii+pN+oH_F?b-!s4yB4%vC`sQz(6r4yS?@7jUe<-yJbW2-yM zJXL3;46cjPLKjmdrL!>eL(0Y1f66aBQ;2 zl=p&Y!t}&b$!S&mL@OkzK!cNI*Ok4euNNiCgmv@15kQYJ2Nrq`_}Z%4Lwd#gBYDSJ*cKkWNjAmaw!{{)Bf_u-lm^I_m{piS^)>xQK* zNaRxOV}W)GhYp=KaJzd?;XxCV=i1Ozms&QXeV_BfOD3Ug&3G#=G|8l$XWB-y)>=nvD_xk;F z9*z)kW#+t|v=@S*Fa@LeGCUJJ1!9KH2Ur?t)!^lSf>*C|^Keoq^s9~LiOs*ewz2b0 z(!ZMnOpq;Qn51Mg-93WtHv!73f#J0HHbYgcVl^ELyCRPwMlALa{d9ut$_&G0o`yVPTBg&tBv}oOQlc^S<5!8}7-n8)xajQdn_M`A{+;PqA)+S4|M!`;+%U zt&RfPuHw_rPrq84)$uP>@6G4E$M}AoQS23tc&4!P{cV-C9u!v^Z_nm@-7=v;9jB-8 z0ctcS^U&kN2){v*Y@B)T>S+5urfL>i_PeWu5{nKVeY(Zvnr1l$GMX767Juov#OZXX|WLz zwNPxZy&x^t-;$87kpwWiB(z0OuM8lvMEt&&3f7!a+~sS=vdnbO^EFcS#g{@;P)Z^S z+}WvxcHY%9>&w&eVpr%iu%~v`WO;NnH@@B8+4dQt*M0Y?me~b4)do6fr=n$4{`Y=b~&@tiv$8& z6$PLzVxk-$u*#TA6k2sjn5e>!duZ5yT#i_ zF@%60Q5~X5-Bj@q|07j}tF38NKDOKO=QpUtNbHYo4_D`6y7uu#Y~8axU$D_zi>;2v zP_X)@dGs<7lP;E<|9Bi~A4S(OW1-s$k4j+`>hhJxrRMX$?e>0Cg=?CtnBrYv3M~doJaae8#zsvyfxlP#+hmzqZj= zzK7zX^YeO#AY#_06t_E%jWPk>DCqiDfxVUi*$uo?v4wU!Pzl?I{smR$XxBk6(*PT+ zdU#u^ijt(BJN{)J@I(12fWPqo+4>Pq-((nKOuA#0Xax-JSP*E*_ob9BAK5|5qSTh2qjHJQfZ~$o9d<&%2@h zwb2z7ep0m{*XYPLzU<*a3{&iXJqO%ctXQdXK!KhJ91Q7VtRTR&!)ieZACHY?ss$gT zA9tAXd*+72f*$6KBCqPapei7MCajpV^6@!ATaGl(c8|tOnbVq0f)^gnFHJ@_piy~l zGA9vp>fW95;5U-y9a2jZwcp-E8H#dp4*zUsn;?GtXbI(XG(w@-cY9_!BP5gS8+e1~ zaRY@f9((BQtUvIsn2f2*NR=l1e5ZcrtrYg*m(!<3lxJ+p&8@XW#JMqt*6W=vD`gwi zwK&eNj0&g_y*+}7wJv=o(W{@BS*;6A38yJ_3+0NZ5iO^28p5SHxCG*u@|7a zLcY-@5CRfQJDfhhu$J;)MfySTg^IZgFRa*|PjdiWVE(#$6~I!9Q(e#zz8@qmHVdP? zFf|swfAShlmxEGuDPqYNUQ+MejTRVVLRa+UJBDA>`f4*~q@8coiAUFgLubTg?zMW$@YN(Rj&m7Tf@ z^#i861=iOmR|cGuZ$f>|evjg(S(5HvW^h759;F~``Ab<9nn7K#SIaB_?_ zd`p`YAv#!Vk5r81jMcuc)J>z&Xhh=Rky9D_MqLcBG=}mS_;{n$*{1oCI%6?hwy|7| zNdx+rwn$Ao#$&yCC(lU=8ap<|tgQ^$jOJPofJLIkdG&NmV+Cx3;4fFK%8#*a7as>i zEGkxHOuB6)#5asRvZ|bMa*gWLY>1K{C-rsJNBt%5XQnkI6lMp#nXeE;W_quQiN*Tw zvE@%wR~`o^kAH@=d|DjfkSZ>muWB~re?6WcZRg-2d`qwAIsM8nXi|obc-v*hlC9~a zN9BQ^$8X$i^IfhV6%-E_=__xja+x-*soE01tf%;6Ocs0LuZX|5q;Lu19274NI#aiY zmCJCt$7-M-n&ss}|3J{*ZZ?UJY0yvp!ATTc?ga<+n4 zSW0|+tN8;a8|zeWh4IAYY5olT#fitx<&yF7w~U}!9(4@A>Agp@7YmE*Kjm4@<7_ed zo?GLf#%?SK>Ke}iH@+PfQ=aY6*DkLL`UaQ^wlgSqDzj=VKka5t*%`;hq*%{!5-J^> z=)Y2PeI+l{lu~@?_r(Ke&YMfPo?p!0V^_ktVS;7)Xp)ED^i%qMCI(kFbmb;A63^!C zN|@4Ewz|%$Jpy%~kZgVi?h6;zqeTy#tpUK}4>8!t^iV}!q5~QoKTkRH-^EDMBPh15 zl(hvxg^aK!n*2}jHu*JHmNIRfo6i1P18@H) zs6@iX#Q(y^)SnRC1kL_XiHK8(lqEzPq8{(~zJpK8g3Q){9?>NP0Wf;c_WY z7S1`O2jBEngRf%*ty|LBfZu+6o-*4rskbg2H|{4_<}q2n$DQ7+&YD@uQ`N?<4!3v! z@eF4vhWc!qO0mOTpPR1ja{tZe6{@+hOZ?%x-lZ~U^uCNY54e9bY{(7BDW@N5O=_xw zmDp3JQPt$_K9@k8eWFX5!PO8lU8iRRCYgND$$j%?7_>6KSL^_VG?)H-66u8)C8cO> z4>rYxH7`97yI^l=Dfv#lug*^Nl18kY$W9A6oGt*65CLSP*{5!OYiS9HkFJ<+ zxZZNnYCe*?ZrPYOn|E>-z{;}F<0&|AdXA2HtK1>G?OOh}AbD7xxI(vP1f=c=!s%&F zjr?5cX7c2IG;+6;wj?qmCKdMAp2$*7M|nWIS=)SX&^tWxFBdI#Z`Igx{j~SjH4=XT z-Hjp*@$2>R`u*M8hA$_k-)V#LcAgU%gCn>0 zBgb4@?f52svv~eDkI&W-VtYv60OkTQ+^=t_POQez%ukel{D}_9|GY%%G*+Nb#{Yrx zLgu53gx3JU`#wXXPc>Um`B_}QH+y{tXCm-&@=u%ZU3w9o9E&NjGVjIjh(hJcwp}=&Tw9IdypkLf9jf;s~367tkA;aes*Gs zfM)@O;D-5J$E?tN%#ysu$cq6^cdF%gOuOsqN*BbFRY<7#lMUz==kUN?3i*R9%M_ZY zs)MsH){t%5MMH?sI7Dopt51Q0oyXJl`674oIZ5)`m=OU(do3}l!Ck&WOPSx5%Z741 z;4TtzA4$~Y#{h(&FudQsK%68K6sHj*RWhU!nBSfQOIaL)Ns3>E)i$uGHquq(`CZkW zD(|Srob3IXqWMeL@&hsLh_E5}9GNvEkKY-!YdHqdKpf1gZf&JwmV`QMV2+PG_?Wp} zwNBPS9RKGONOS|n6i6|Srq+R?!_8y&*##9bD`eu2)^UnFEN7zrbqg=RsXXsz3eU6l zZF}tO2*s{nnHtWYxjho{F-uGFS9}0V_U~DtoL%Qi)zF}!823JUV7;4;CQ0#&$!A`@ zu0FfPh%Kol(he;xM&8oEVz8-8*JLsa;ZyE}y_3WUvz#MOBnoAUe?9yoc-WwWlpSQ1 zh&0_lrx`Lgp)UTfRS5?DzgPn@@h$NZrO={gbGsO0UppP~;z;Ne3?AuHNOwtuM@zi` zdF9qUc_Bi8#ZC{DPXfjd`H<$i#8-&kS5NcVv-8@?y?QeHN#`=@Zz+B)>^HulNSnG; ztn>G$qG9YSd3tO$LoQlB*JWX|Uk2xa^zA<^D_xiV3Hqr(Z_hey)7aC~L$W;9(Uzq} zeSB`Krhw~re>`iJCZNUz)au=BF;9=_5Ej4Nw@g6PycDJ=79U51eo*h1P%;c1b+>yy+>?xZX*WidrBHa(4*O6+ zvolYyKZRYTzrSBb?Lj5Y|M{vlr6?QEXhFrm`Bz*U+WC)5)%|_;>*biZ4V3A&1?>UY zS@_ZYr+Jl4*0bRp?u~J}Y@RqBp*+_Wbw=SUP>zuZ&foi!zza+xfm8YlaXbo2PRa(juK@1+7z@X@M^=pCFcd3Iuu1 zeq!KTt)L}p1xZoOCj|AYb|^!40JdTkG<32zjZ^-hFpcgH6oT~R;60#P&rzUzm8>2P znr!w!k+FwY+~P!5BDksuIDIu;IS!rGr&}9iD2=x;{h%;rTWSiSuJqzg!)tCoi&{5s zn6s~8&epKatFIQh=#F&d7pSV3-boZY>?(4pmRKDw(U@|9{QkC9?F662)Rwuq?~CA6Q{9Vk9?hz*zHgaSsBY1g^1;8F`-6*qVSKNn z*TE6~B2BPSCSs#=MJgFPS)xm$v@RnPn5spy&K_(I?e6T3aPO)LOIPy#CjFqzb&7kyyQM=-B6OKH*`eMFF7+36**r3 zB#O85JsQ=gPcPRNLZW&#l(*5Xe?FltBfhn$Yd<#>G!W`%U82-fB56DO{TAKI{Je5` z(9g%|CJbNGp1N40DpwNo;+cOmvEfcHfMw4-w|`xW#jL#SIi}* zGnJI|dpSi~@+9}4T@h;Y{lonvjfd-(bj%%i;tBmO$2*vp)4JCmedhhLP&S^fEQAOR zq-p*f1CIAdB75uR+7~xBVZ3Eeip>xz@S3^ALWh|!k>J~%|I)lKVx3LAE897Mm6MZI z<%2&T-eu{Uzz<3M2gas%H~UW4ptzU-yo>$ZjXxfP|2|=K1 zkE!sZy&7L8lm{G3H(~$TVKLaD3o!8_6&+#`roAQmCiMI5q%nIT16$tO?QBr+G~?c% zWRKxo>PjaG(+@3G2bM-7PE-hRSx(gpVZ-?N_5FSD1odcDBU(QE{ZEhV=lav}MmQQM z!pNBe`!_Amot=9lTcVCK8_V)WCGyc7KTxTGW3SkKJJQr{)hT8x4rAn>lI-8pj>_)vC6;ZZ)z>n$S8O=Xgqk!= z)H(rWIfUwZchkPG6Q}Rbi)90e2kf!mw;xH~v2xq8bIt_Mg4mL|d;Q9zs<)`vk(=`y zk>cZI6Dj{?qI`9??KM*X4=L}lnV~D1#I0Fq83fYI;6aLMt*wa=#+iRjAwYt;$;DzD z!#Wkk2-^a6Y=sKfTg6$uV~W@U*L(~oWwIhMS#oBqP>#v7q`<%F?UK6=*T&-74IZfY zs!$9nwM0-c{kC%RadKyd>Eq-#D;3`cw%d}QiYV}QC5qL%Y|IOgJw#>BC8lD8s?eJ! z__E2J43QcKW-cHEAO#u8Y?B5Hy_4vO5m{^jfYd;qL*gaSTb(5tc4MR2Q|%h)H~WmE zzAVy}0cx6NZDfx;DvFB$WbIz5z$r7P$09cEzMnqjw4D`rc<(wV=bghYi@o@0_n}G- zzBl})c|iG^a|LLRBeaJgBTNeOGM--#A2;gnuU!6GP*Ab&+Yw=juZ?sx_^H(VVVn7m zk6mOIBJuvj^kb4D0FJROtadH4jf9DA2F-v|LY%0q-%0MD#GNm-5r(dd4`ZRXn3|Yn z_o83cMFM?O1WIXs(3|_TqeqMN+WcimUj>$FHm50GyfP9h=)rOG7N?!8AVG&yO|`iH zJ@_b#SY-NeU1Yk))=%8A06fYrNj;oD^iwFCpGD8rt@@}4XrRH@^md^^kP$dm(MR_$ zihDi0)9%acxk&(zg7voda`5hS-QsvSLHx_-W$|#5)lWk4Ay@-Y&3`?Rkslh@XF1JP z11WIf`InbVA2Y8E$ifj3ezefjb!BFAgXjU|L4ToLqat*R{X&g-g99<)3It()xF2aT zegytF;wrO0DGuDu*3|Q*rLjIuK5mz(gqCd$vvs65Q(nv@%e7mhf0zgvz)518S6NmZxLlu7SGCRq(0LtZUgEVTC4JNXRL`*Gsh5;kF4riDW!_Oo;j9{xW@iT_Mvb$Wn&yV;j2;pDDJ-Kw0~B*< zP@AMi!!^(=i3mTwP#KsDG@lmX4U6D2hf@UB>B71xm==KOW$GMwD_WSJ0bP7Hm_6(9 zR+k9cGUr$T<_qVN9nPetiZgbz;R0C`5k+M4@v$eB@3ZzdLrcu307L<@*m{Js)= zA-a(6MihLk#aPSr>dDzC{rq3DvmgJCt`G1`3%{c#kqqX)(3AhW(BxNmPIBGUzRvdUWD#Y<@m*<{NNPLK1{kGo09Z0@wM=i)3P z=mu8Bz^?5u-E9ldJroqq%3QhQOT)#=`x_u;SQRTA;2l@!0IswI#ZyMgH_13LKVQKz zj~B_LAn=bsB*=P&rQx-XwYSX;;wmh$%v+j>lauADv>mQC5j`vbl}FdNH-Zx4Z)J4I zb{BX=7nFq_xz%C>qqOoOmQr`SzGuEyODAnS;JE3M8Ob_RpPY6E?5w$*^Je)KZeS=3 zWG%2xwz*A&mJyvAn7V{?R~~SMlJAb&El+Vys%FFf0hBwxq(UqTnsO!rX+2Tch1KSo z#D`wZjP%O<>n#rFH|l7jJ|v0SycTPIMkGTbol(uT&i@3yXWD%?dPvEr{8jgxe_dCqyj#Q%~2MPBVl%q^o6U1hgms_Hd9v6GK9Cf-C-^5-~y}&3#F2 z<2d{43jBO+#Ji`viv_H7(7+@Sw5CyVul?75CI}iw+fS;S_vAH$g9tFTNd^l*4m|nWY8b$#_^Sl zbqH^MHg>1?>4UUUkQTx0**fn2dE2eCl1si&zDoO*p>mw}U^ugDex z1V!JhUWl_Id>%#I#z+Im3ThWMhnvs-N~D@LX1I+;RT*8zV=ect^;qiFOE%oJz_C{f2);N?BA28Zc(C1Cq(*sK%l7NL?T!%i$jp>#+4Q{U4 z)eS`P86(@z0u9T#XYE>>Acq*8qZV_zy|;Yz$MuE#2G-gO*s*@@+xyR^UTO1vG6`Dq z!jGCP&Se=H^ZnCu8cSwp&NAq2-C+{{#7sqCM`rGscD{a(f5|45rLmfM7O7Iq+*d78 z<+r_0T6SJ4bX#LL`UnhvKDaUJFc|Y8QcQ1!?EV=1;)jUJ8t5xDRaK=M-Zs@pLtES3 zzj^rkAA0?XK`<{vSLD-bZhVGP>Cls1%rygi*&bVo;A$Xb8;}g6&)fLy%?F^K&)VAI zJO~xb)q6{O6tCZIAEPuT+E1v4`+?$m6Y9gZ(|hhPgV!=OJzZ*0(Nsy(mqMdkZrP9@ z=b8_S)5I3oLwJgSD*|C*FniquJtIqI|F`6)FJg2-p(g&caN{$W<@u&?yuFxzfrkoa@39~Lz9?jCInpiuD2~(FC2a1hqNP(r6^@OI=`vOp(?RZqgwE7?taJV=b9>XUDd~|9`3fav|&3p5{cL#Ox*h`r3yM>+XD}Y)Tt*g%gb-A1h@|2bjlG1T}3c z%$t_H{Qzgz zOkdti-=D`9MO@BuMdti(#S38%$T)i<%|xsxX&VCvF*3hFOsKXhqFQ#c9joL8%@FiO z*B@RUvWbRnh!4KFd@X8Of&&J2bda@bU%3tC=R7vJE1v?onESB#*{DGLZSM~R-BUm| zdu5Ebr^njY`lQha0Ahu1NnB1-8_Jku15rmqC|j7bdy=g23g~~hHzsjw(5U7TA)ISv z_33WPA8VEsUX)S=jy**-b>Ojb9tMxqsd_vqdbr&l(ipzn#!ZmPY4uaq?_K}tz`!&L z6P0{Vb285o3~gBDaouk82`J07G~%vhO#xls?Y(&{rqsiIp~U&NRM3oou`I@Z@;sCy zta0g^ot;kC2#UVeJT`_Ye=FkXV^LdF83QH0YRjM_rfDpn?Nq0-mSN-E&;bjA^B9Bt z)|O}Rm*9jx2p8<1BGUh|vggBjpY-Kh;36Ut`b`~7kI zT;@RU!gRrH@qNF1@0SQ|p{#&?7>f`pGm7x7L4W^s?8Z0rzO^M0l52Pj(3by)ueXki zGF{`wab0y?R}2;@0Tl(65)lw73lI?ykWLAa?vBAVX#@djY3XKYq#L9Ln4zS*hmQAp zX7C*MyubJN&-t8{nP=|j&g;6qaUZC|;D~~-8TbpndgWP6gI531E?j_Z7y(;}$OJcq zIlcy|GhDmDqfz34Tbu46Jm~@=#qxj(%kIumso-`d4E+wn!OuR|dp>br;n_LpnV9|TVle;pBnJz686XGs0OBJb%lTX6`hNyHxBdu9@LyJ*$z-13md^2_WQQK=c? z5B-z`5u3AS1>C?B9$bE+d&?FJeRmwCBMFK@k~AVVipbWWVNu_Gg(d`^YS67EC)wsZ zZ-yMSK=oIE+aA1Alc8H4}HWeg%Mf8WP{q>|}TP9@`m5m)eLt z{Mi8?f5l&BM#=xW8z3+b`3POJv)yrg^D{h3MDYs^5tJwP7Ks@i4BK(upkhZ*;%*07<^_#Qw>k?$$0YJ|f1aN%QMO zBI&b)p>v^1-i%MS(CDe+me2kJJ$vo0BL>^4SrGHkZDl&$h!NEGh(R@{1c!oGNy z*D8=0I&ecb9%vIm^MHj<^lYX1@V^7tUjPCP!IO61G%8;-J}^NPj+Iixo(uhTo;~Wi zls2Hat)*a3a!e=P{>A1wXX-`QjFq6@EV~0l`=_pit`Z>O4EkSyybql-<5Meux-$3- z0B_>>$xR5j_!(BwLKHy;g?j<>#2vNgED=+T?J^qRw;pTA#F+bCU*1`11@g6Bt#>fy z8d|~c6Iu5HSGPjaY(LHE(~B|I{N+%64k*l8sEdA2Q~$trii|alULaNKaKzu_F55ub zBId}1XI}zL;^@gFr2Yw^tldn?C^lCD&KkcXkjiAX#DBG#{QfLld}pdHCKqm$2md|% z=qgf_zY{RJiSLetydqzx{_4!%VmE5C+rt3fIDb0>2L#lV8G(;Leyv`Sdf3nJTMdo?l zA}g)BjR8ZH?|#D|=E!kIzyPK*u}NLb7^V8oMCY!5kc%|+WS;@WQUnS3fLMQ**1j$J zNb?9%YDHc{YvvGorIy}u%)AROMVR^9{K~YF5_q2DKR7Rz?@WJWX^&f(A1LXX!|@R^ z?!A}h&bk&?;%J|Tl%bB1&Vt=367ypc?e3?3cs2nr`hHW_*uA1m{nk2_A6vHwJ6*ny zr)|%_05G&+wM6ZN9QB}}+CotC$1_xDHg6`8)X%Icfl!=OrT}A4-P{Xf-R{b3vr7u1 zF5^v)XN;&NAz_XHvKvswUydLrLH3IsF#EzJUw#fXo$Cs0D*20tGX=xi4TcMw`#l`w z0U2$gEO2(Ljh869WvnbJ5DTQfS42qka<>Ab!h9>kAU<|;8`xip>c6}Hea-hP#UbD% zv!O`C$7a-o=`t_U?@l60UIK^W+iu)|q9p=pKmZd~Xel$kpf1t9J*K)#Bd{$yQz&~! zexty+bU`EN3{{ZQjNI^J;H*MUsQ`hYeZFKUMk-Xm#VHt#wskuzd>-IrCNPNlm>mJ< zqV=?(&f4s&to0w2LfMjWKQ7N1o1}(&I^pFU@n6^Qv^wDu75VCn1*Lvpdw%Sxl{$H< zCfhEwU=s6@jvvLA`y-o)gTm&>d#VHZ$RpBeH7-J-md60;Zr#F;YnYH#mj$^&yh?|Z z@Ln2EoWH?2wf&~(ByteXZk5b}GR7eL@KLABBZDruw&#iD;OM*s3J>sik5MhC1=iDI z`7u+3EIzXakWD{ihqSjdE?l}~x3giYL(wXruoZ4gUH8Fy3C0EB=jU@+^2R{cuHsFP zWO*;n_@k%h*>J(UmaceZfMop>owt9>T>>fLNDrXD_1Ul|Y}WUJ_hV*9g7y}sxhePG-puNl z?^l7Ms#yG}i0?>!q!2pHI{Xg#m}z~Dmux4wR}7aaYyE;~0oB+U>!sm4#(e?VoNJdv zudECA!xge}*Ktto$<3{+n^fygRv4>iqPL$(4MM^ywf+Fhk6vFxuK)~fzZ0ZU>VHqD ztbF{QLd%^!Twh3{?6$IP?3Dm35*ENq!El`$%-zb`Bv*#)Er($>B$@=_PqtpGa)|@45+lmd-u@&oLGzsPfvfK1Lfwh7ZFcH^ z^v+IoaI9HxEMCHA)-gpo#ey<`6PV}(DGL|hizbSjcu2{Gh2MTozjBO)83Y6rbfs!I z>wj{i?{Gu+7?ec=qK`F#Ya|iYT+%b?T+Nm+O8ScyyR(Hh#@9xms0a4Qvyi-BL@A=0 z+5-gWgut*V;c;Rj_^ru*eaZ-=+~sx1T66#aH{Yjwh3sz4IG*mqVlG06@aHJA+;te7 zp8Gp`2^b)KKQ_5i8-6TSnUP{_&lq^VgVCUe~o zg+{TSK*UBXVGI%C=s)TuSS4Tr$nuGeibbtyoqs*iB5=d3Zp4Q|p<4#o>5&51NdZ&v#lG$k$u`+3v0@S}4747|3dg4}F#RANJMANw)u`TrB7XB`yeZ zp(NYRQ?&}+*up*4jl)l4KuNN96`)@GDpH!YK~bkX<4`sR1k(V#f;L{6v(IAGbk8=Kuk%2fXc9{ow0>)e{Y=!!IrwZIwU3jN?bs)-G#hhT!L4v zC#LVQ#aC~>^|za9dkDaz(v@H8E1P_b-&{yCY?6TixZsMo+>W=f0+*p$5(Kci^WL@F zcJiRq)6H>r*TTBTz9~?)jlI^t#{+Pa( zZe=!DP%ed6q?hfDt}Ye?U6qcNiGz!McUV;RMtlmuwcEEGSfqV`C8+4Ts8;W*+6cG_ zyvvVh#4tQrv>#nlGTW!7x}5?3lshZj&|0MBL&yi!T?FQA~zFoA))GT-6F)`vWH5jdn z@aBuu;5e0pjs;2rnCn@3l}8BR8irur7WLna#{?euNcAtOI3NaIGbk_Jf6QoTDm6PxS`!2 z1H~0<5krh8I*sS7LUml%;fQ>Cq0Lcas?G6G((#!Z>X}~Nh50zEsk0NU>0Ah%0&6~z z?KW;I0ETWKD?1hQUD!;Xu^*4f<($X$l~if)y?vLaknlxtW~$B7w0AiUDEO3!X=MYH zix^&nlFtyn0 z+;CnsZVp+p;D9xtkoJ2bux~`_>pa-yxiuO;c;rUoDfYCQK|Y;z8;VdE*2{J_LF~s8 zFGa~EE9BVjjJR3*B#AptCr-;ShUp`8D)iIQ{sFB>$}L9dBWkIc-CW{#9k;ZF;v ziIo3@L{hc=J|WHFG`k=F?mDHPtA*5pt04gVUYHBZ8VE4w!a2^)gmz~si8g7CgPMyg zf-3|{W=UM2Af4vfWPGwA?^X9nbrtWmwCyCKnnIpxnnKfC#PbCL5QvUJH+#R@UFy#8 z*YdOceD$kSyPfPuULf%PXirnN$naoHA#&l;%aUkbb2(LPo5Qe+5oj@}HkWGmvrRgJ zzxVQv^mrtZ*LrPZ`M-9#r$siFD6nJx+d&|#OqP5O=yl7s{pIJWEC=Oq_Ek=)=80Xwi`NF#{!z}XfciZXCrp88QKp2p6TbL1O z)@akZG%?w-$4Nmio6OaDvHqiBe<-u#GqfK|M_$U6G8ZlP#})Y_1OCwxoN47eM}MAm{v8X z{Q6;Vp&`c#2^D+ybyoet_ zfi$zp9YJ>O$fHS0w@@#n_vFL1AQK4S!Z6oRTc%#sZ;OuLH-SKiX&)(DQg<3u3pxw> zdgK}^baIpbeM_l^Q?~)=YUi|XV0h9~t39{$(?H2CBK-DcXjgm2^VQH<0f!v8dcu{s z*QXjjn~#I*pXbekl?$zMIEEcgz7XIuH0Zp_Zs@Q+Z{(SuC2GyA3#upZ55O2xOOpqc z?VrNt+vLDj4+Z_p4C%!(urV>~O?YavgL_3O6mbk$oK3t5(!DFs2wOJK@S-w8wxea|N$ojCIe38$6NsZ5iL znCv2F$M^Ql%<0ekxqvis0~8zDFDJM7?JXKKL4O9zIFyHyYICp}JR2H9KoE12-AvgV zL$)4szU%O*QN&$h(=IG6{9qn3POFY)vcC49@Oef7MhxA05%#bLH2zS=YY7A>-~1O{ltt6)X@d44c=N`$3SxW7TCdceZ}l-_B&pS-;=k_ zn+?)Zjxn)&dOW`6R$MJgh)6F8dKdk=B{HrfXl^S@;5ILWq0Nc6N=s%UWuLVfRD*DE zb6L1d*J#g}6-1kV(Ngce3V@y=rR#HsBNQ0IpjJ)t1pf16BuYLMO+SO%%{<2mFW>Z; z4~tX@>pd#*$9=X~V;ig>22CX`y_4MURQ+ zQ=x8+&wkAYW2+)sQ=kas{pVPffhdFp4VY84d!*czK%g;!e2vM*$3iywaV~(MAPF=A z_Z7H|G~K9IX1w9v?r(8@eEy91z|bY|i81JNKvu(;-TC-d<-~kDo6Py@0Ohve&zANh zUXwnf4FX7Tz-RUHx+oq@JjPhgn?GYu3$s>57jOY#)~srKtfZwVR~GU}FO5_H&tCv3 z6IAMa>np9em#L|cA%NZ=E>T2y%R1ReK^~a0Xf%3FEghp$A26}3?IXZ)BEm5($6i*s zGZ1!w$r_F-p_zu2x`6DAciReMAk#!5oZnXB3ALbqD#<7|bnVpX-rw_be5hKMD0O&U zp{L;cw?6B!L!0aWoFu0C7Z_{Re&vh%<8q@LBC^Gq-gz#RtR34--!WG6)yz@mz$h9D z*8{{d?QHg-@*P)`K(ITWRbTIXwdYDp_m%+u*|imJkdE$eP8jFt!v15^w;36f2>FD!!`BgF^!db39y^x;CwFJR?=!w6&*C&ftxZDt4qrAJ* zro|kN;w4MIy=8LJ@ZT|)Kj2^b@3`ztM0SCRuiaD}3iVmGx;op#nw<^fE*aE128=Y2 z{ocUTMMVgfwBrXOVM`h*Y)&;Vv1tdHXDlEg2suS%xHA! zZ}|&(x!aO-zB4pd-30I*@!oj$Yqxd?VBFUuAZZRkePG6b1d-1|X9?&>IZH5`Rq~#M zLXMK9t3A9GUj#&pdTS`07|<0v@jg15+uBRni)Kfpl^qG|{$6nRTW{evNLLu5c;>@x zNu|~ z`CPZa&*Ag{pVgf2y9hoVifD%8$Ab~%1?W{Y=;tY-GppZrZ=3XWd-n*6hYa;r7Y2d- zd&5vyGEMVq3v#MrkiFYOWKr-{7x0-Cs4w+70Kk$}uIR&*29cLds0vy4$54jW$N2AZ zZpjqgemN7RAVe;(?Hnw!*=z~Hm#EH+OYD}9c#g=+xJ?u|EsrjP^cIt{8HQIDX?h!o zt3BPC!raQBSFHE^9ROMFXwyXf0!=7c70-9U~h>eJAnV4qE*%jzjE#J9FC_R3|gR`ik3VxT)e^= zR$!sKFd$IM{&Nvv@*a)YLuxitl1dc}lC4PrVvi^u4TIh-AYKo{A< z7s(4ZI(P49+cKGPckR>HE;RM5M}N8$C%nAke{1b(?B5L`m&Bv4KFo_2OFZ2m|H*H+ zsefnmorNx<%^R2{fRrgWw`YwPsiFm4$Fm^O*Og<^%nX zKIiKvQKVnwo4k69?d3b-tw)BrsS|FJ=3bh2^El&pPH?rbZ|Q!7F^%o#^*0w2Ztoa= z>0_l3!0=z$i@$RWNw^*XRjuzxZuA2&iT<@dOY$fB&fgg8Ur7rVd^#=A5x+@UM*Z}7 zu9is?e&)xuYx<~ps~YI6H9ij0x2SRli*yy-hJS3&ZENa$(X;F|E$qFD^TBP0lDi0% z{ktHX{{b$3v<+R!&pQ%M1>N3Sa(LsbN+DF%wyY^+YZ7Pfp05reRP&nCZc%T{yS}kJ z7ybsnuxQD{>n(xvgNDZFJA_K>BYHwJfm3@L>YKAxFSE+}dYwuP=+2wUPq;cxw+A|x zMsV#ecNN$SrJ7Gj!W{v~Ehwy}N((pqX7W;vY1%2IPbnNSn z1?!F4cgvdoByr_4YcJa$T9z@nd_Ll)1}#B@N5Y1*0)%QLBuu;8r_xyWs(Qz|?u1AT z9II)OCP?K-TxZ~gwxa=-|0cG-_xc1M+Mw|tnRNJ!c!U9Y(Zq*4L`YH<1af`dn=2FR zv%O^J&Ye4Z_U!4?H^67S3}}~kNJ!=%s&9{yKUF_A*7a1KY%D-poxUsR$xz;5?TL-? zL|tzCbVDr9HEzjpA__@p88agzN_uluQ66n}+mqikQ?t*l_G|M?4lbZ<;eT9hnHV&e3l7be_<%-7!7zr91yCf2bS z2svAvY;y!_|Y^w-Mmcn_026WVIQubB9qRC zLe>QLL0=`L-N%m~ho*bExqal@f*We0;SyQkd(i$rTQ0MVr};5gdMmWpS-^09ZF6p) z<(%~q-`8`LH}1`sFelj#JKjZBz=abqhn?eMV=rI6Tvc1EQR09Hbe@BQ1MKL9PX50} z)8yLxQ!7okcdx3|1<7;N!w*~J^{BnyUB;~8lkDwhT!<|g0IxwohWr zT~fWwl$4HUqve6MDN1X?kek^OKSjbeT(@wdnQ`IEO^HqJr^uqIvp5jND)^fHSl;pT zg1`EgMokl#xTJNBi!RhQ72*dgi8j9EuFtKUza$> zUTn&3zde@j=p_GhefkO#zs>saSQ;tIo_p_TN&fxDMjYu^B0GQtHZJ66R8mxf!b`h0-pMsngMov0 zj;aWzztaRYQ&9l=nvutx>SW+xN}4(W{yRU zr#det*iRF|K-UrCFe;D2KC?jEtW z*tmiR%efnMr$nH6hUSL{i`$FPF|Mi?7>#OSL~e!_ z@1DT$-5%IMo%1OC%}iKfoqnZJqkC3*qylSv@EeZA-{4g?kXiPAMdn;$02887!)|}N zRD1f*Z*od3$5z2lNUE4v9cHH}0S+YCxKkFrba`;)F+ z2Mbc2*!LD;GqtU0CW{|?M_GH9+v-MVcsj{lle1&v;glcfEEf$&+CsBn6N`XALeU#%zN9R3pO&I9O_SY9P$T;P`)U!=fZRsJ_v!BA(~)V z508~S*fR(}GVe+pal(Imqy2dpBmbFym^j{qKato1pPu;t;D3imiO)9j3;7&NN}T_r zXNk?Vxt)E>$^30#!nrhACgL|Nh)?=fFdWlrY9!EOv>ce?SdxC{WInnxc65VG@4!R6 z1!1(1klgmT!aMe@hxd>$4NMQv^ec&U3cEVu=2k-a??^VOrAZPVYe7j|aM!fB=T+s$ z)aE4IX;e;m`v|6|k@O7&&`P^(PH#A1iZfh_4mP&u#8$He+Hu%ecAGZSaWye6RFf-5 zC{e>cVKy@&6(lq$O~;5@r%P@jyp;vwstSj|j3SF@{E=q%UTFJTqlWFef~>3wW0E0B zU)DsZK4yB?4eg&kc(6tC0;2)GENnq8oeA73GAk zAR+0k^7Ersj`4uC9=E-IuzvK2tARwve>X-Co(n5<#k?Hpbl;hS8Io0*d$@M@grd;i z>g@6#2WxfYVB^VpU^O)DdI`@UL>YB3R>T=_fx-NJbS3VTmyo%9ILS~x@Vk(uPvADW z_7SJzBbAD`jW`FdwMG@3(X#jCE!BewZN^00qLC0lVDQNambI+j(YYBp&gIGllQ3^- z3gSFG*y)E*EcMq!T~to5n#pF@t7Mfb?L$8#c_42AivWg5Gfs`?G6butjML(@vz7)w z3Vro(24$7ssnyt0wpD&^>uJza%p+YOYQ1<_LDV_1GFMd!MPqw?5o}hbqmaATf>za}p;XEW6T0@?@dnu)Q znFm54QMn^(073+z~$A2g8HYnS?|VPGUuA#K7I$Ycl<1f+-(r55lje0EivcOQ`ATBYk~+ z{rsX!Pycoolcm^6IMnaX19j||Z{bXF*?LkCu0cdKN^b*E55!m!j~+eM_~X!pnb^KZ zit4G_otIGu0c0bLzdRvTP-WO+#wOv2F7@DeNkvXhPD@KmMn*U2@}c)=bJ*^7@j;6>%ruCwOb%qKi;VTU)!|DTyv7 zG>D6d!|H?=6}lNf&(>D<+qV_>>?x?Ikj^0^i-BKrhX9 z%bo9-6zNs$UA`r*la6YNMG|Vif2%i%C`)l(HbZ6?A%q3D=5!rw^-z-CMAA zCbIqJ%UYrAWHN`RajrlIBl(Z(3E~KfabNzS)f3WP_;USL8IRB(iUO@Y)L5#5RHJ*i zPe!tNMt!sws{}>_bB6=M-|w90?2_b8vELV0SxaOl(FxK)eb#eEdRssP4tN#t;RE2FsRr@~=AyagS>wK!q@C-B$d}IE>7z z$1#$b2Fc&N_6*qV)_W(}Rk&3KvwOm%9$a~oFPHkqP=rUn<>ic?#uMUYfu}8ni7PE1 zoP3b&=QeX94pWNh!d?^XXu1|29q6@}<=pE57VKZ?4qvPahYjgMD1_hR6*X$!Ri8}*3-xLpB56*4dnOzB3Wy)E7qJFE(P6bz2s^gQTF;af|e&6K+ zH0VXG_v3BfZ;qw19xH>8;UFm>ndjQo%3Wc*!;4<*kh&XAavqG3viO7cNpCuK-k?Y# z%eWJRrhGgue3XB)Pj)L?>FB&7a|7Ygy+upDs)CU3qIQ<7YrRcx8BO-biLYd8ZzseW zaj_LK71)_KuTE87F*m32%6_Bs+(Iq&rI>_3uI5})ki*OOb3teuyCQaWQ@$^0g!rE1 zTS>e|ip_v9)5JNKt>a(GTp8eAia@5F@CXZ^<%Le1;@-8Xn?nzF6IrxvQ^>Cntl<0Y z9tF1)STgT#jLZP}EYF~8ad&-iwmZENZc-#W%T1&3!uUMa)M6O}!1~p)%upT%9fOr| zrNhT;3_9YMKrOSoF#;9Fzu+oK`@}??Cylu}(0-C>+m}Wz)+pW2x={ccoKhDCgMSu= z|76WQOv=(`Ry#2=64RPILp*kUIVXeE!)@E@3*JV${5JhNl8E``isk2&v!iIU^}N1) z=dBrUdNN*ubIb><$isO|b?#S;pAvFX z>91nlUT@_wsj`ofzuX(BD$QIY8acSMx$*7n$=nBOs!_U~zYii2zcsP-bz-YC$t^{b zqkR=pLWit>Gy5IREbRG^oA>4=U97Rm;gJ{nOE(^&=sG?*eC@0n(lGAcFbUt64+^A< zptI?6=X)83nU)16U3P`r0kKtO=$ z38hYPRJfQ}ufyu3)=1GQPV}HR?VxYs+MGrBgdu?c6dhn+eM7^l%?H zI9{K@DRY!C)K@%Z_A?SEO($m;o1O5*%rtJR|r_)OB3V`zVQ)qIR03 zaiTu*7LV+g?KZc(W#Z40F#xC1x+C?S=~zQz4Q>FD(0`ZYy;QL^ejle}Qg)KYq0w$( zU=IH=Ki>;z2tnob{_n5i3d|YqZ#z8`e<$kqmM|LU)tNqn` zyg57P0X26@s5!@=-@}oC+eZcT~t!(V0D8ugdUGJI#OVoE#zN?d90tBlqoR4RJu@W5+ z0JcA$%-!;GBT;nU)B2OK#)D4T5!|}4&4+$=+ieM6Dd{V=n)16Tlh{s%g(W+kZ5R}p zXVma1s>bVO{SaIklb_+xlVJjGF)SLTo}&Q@>fmO>4g=&BT4<#|XFKRDlRmJ5ZD5LI z!KL(ydr<7JNasv-xr4*Q$60C8%KUrxZwA3I{8pC=^)^B%Jmiw&5e8O}`Mj`h-}2IG zIcI+{^|GnSld9K?IXWq&6*BlBf#%nj_3!L7j(Z#cz0{QyWiBt}v=i^Nx!jNiVU+=c ziwh?D+0lT2neP3>aLp%8)SKEK=T7d~wxCa*@405VJ%?LYvsPi0t$a67U#|irT~;9q zR%ONX^-r<3m$62QJ(25!8hutXp4a6ZhQSmYbB=%CshU&ozA>7Cnciv9#TW=P!()v> z*VKzY?97gIJW%m{k$N@z=A~oy)14M$-~On#f=ETDptCCWdx+X8Zys4TLVOY0!DbNx zIKepVs^`WRJC`gpmJNF=d)BT^eNXV;yUfVX&%cw$dV{U;p$^<^VR5;pGMnlBDfV{K zDew{CXu*z`?K>+6mTU}LV(I5n$Xmlz5>Y)<{~Q_drc+}nu+ldkUjv(J>Vg8atuECR zHur5_Znj=(u7=s79Xq>}aVX4!?xV*310U-;>;1)ZB{Suc-({UJ-W@1;g%!=fB+7E} zZbtfO3b^n;RIwj)uKw+CZG5~*N6jfZRqz2RTg%Rr2jM~bm`}Ak`9Nl+0`K+v^Nf&_ zW%aG?VNf_0`y@GwzLN*hn&hv8+AH)TCs*F744pYAyR6JNbIfJhJ@Bf5s(%6T5(&@u zdQugYdN1Fv*3xUx=oxp!im@ummpW0+`Pg9G1FcHiZggzt#^U?kmCvzICX|?ew@R+0 z;mz_{J`=A`=N7BinuldOdzKsLy)Y=Gk$fG*RGlJ)wx;@pU4OoRCz+|HPZK8({yyEs z_A8_HBe_PsIwM-p_+AZWWf@s1_5m}b6!)8}`0XOC>~uYevf^C(&xAwqUvII}{6_)% zrtN~M(e|fKm)tZMv&TYPzUC6+mmGt%eHl3DA_R_~43DO5?<)|Z)H9B8{xEs?RA0jG z5}RT5lZ9?Sm(-U9c$113&FbxWMuqq@@zT=wwv0kVFSQAFu6nQw-Z059=})@Zm1nHo zn0m^SRjGYTzS;pF!IRdht-?ItHl!T)Je!xhwYMZ#Lzgd`8QHMq6ePkroW; zly`{&EQ_q!dZtDLRB@v+2lTp*BDgXg4_;mE@X^Py%OzEnIE&<8 zzc%OPnZ>oaS>=Y3C#AtO=gau0Gn@2n1g&}bJa}it#l|o??=O%$+&gv#lHuh>6%}0f zFp~-$C7-C;?-$lj7%mm?*C>>9R>BEFEOYev*nI4OvIvhTY>_wCP-v}$JvG?&yzIrl zm@6?_1P!KsRr*+13yJKzd!qL~dM(Yo;QkXI`qiTLJ zYBdGQLk2~QjVg}XGv#^;M)KW<%#OcLVDlAqK!SXxmLx*qn*<&E-xH6eY06g#7I$h} z3oPzUr=|-+w0+-O*uL`x-6r`AvSEC8qD~n z`ED(Z)UU$ZBy#4%RWjmtM9-3w#{%Vf*QoFQ{vNF^5Xaw-PQcC5`plwU)7q+uqUq#g z3Q;90nfKp{wuT+&O1nJDHWI761Xa-=3r&(!oyT~L*08#1u6y`V>TSK2b!;<_X&xp`pH9qahmrRLRT$jY zZGM7PrBthMSG~Tfst!2H_4J@taWjvj!!5}774baXzEhJV7YV?2i8;qbTYr{xa;YXY zI+@JWJPD2Tkmt?YkxE$~eIER-ssh#jWdqtVY5F$(18~$#8!IeH2I$jy2&*b$mg1{;CMywK)87gq01cL0IAZBk2AAZD^33!uAeuv_oVut44UrA4KKz*k?!;x+Fe(er*w_3pG(ZKCQ=@nTCa};k8RIm<4O*2|;q z6dF#F@qbdV<)ikUocZ~k-r4y3`if!eA_NYRGY58GzXfmn**Ak1$lP*4SB5Z&p2)=8{UzOW&}t&EGzszM`bg%&1mi zWANjS_@AayzxP!a$f-C97;cRxT61Xm9Q1_gF9Qy7wAL$HwI`oY_%`*_L=le+cOm)1M3cr(M z*nJL;y+DLRKZTD9jE!ZL;(zX}9nE4l5zdI8DH|Fav)|vXPLNn>%hSdc>eF9Q{&Kgp z{B==Xpz$Efos^Cd?>^t@%CaZU(S|#u@}J7h%p(0>!D= zo&h3!-KTk`MO<*UL1+DD#_Sf9c2r>b9sm2;-L+E(NAub*huVMgBn3jAge3&%4WITW z4&S%7Ul~i4Pv0tvw3_TeTQ-a2di>3vtT9PZ+fP@YRMK)>bqxk z7mWu^@=A=4iY~9T9?n^~*D05_GujX!>vinHu^k{-;nIKrSLP#i%9y)Zxy>Tkr?Un$ zcshNI7lVP6;96wJjAi4=A`3P5S=EAUpo#5CEAMj?zYPcLs`aXaGNfrwZq8^$8d(Pp> zwrammC{(|;!8F|AFgB*Qu{>6$T97r6e{Fl+as0_wqy6FP{jR{Xz5Q!*<4V~gf6?z{ z8tGtfMfMl%dZBZ5>@JImsc;*I@WP&W@19UX?@O%7<(n33Fo>{-RM0IFPdqylAfz!Y zJ2Wy84vO<Xt575nc4DB3LONNmbvg_r%Cn}_S5KvXb@bGfEJVFUit#Lj#5M; z>R7OV!N$2Hnhb}C%$;q8Gx^R@Yg7rgR<+8~gq!yo2E5)s{KNcxUzGe`Y6Z`iXXQ-s z>+FiA0B&>zJs_s17o4}M4e-&(4hnarnTu2mOtaZuhq@S?%8wyhwJQ*QuzQ?U015&` zpnCYN8dTd0NiL&`&>Hpc_E{FcW)`gQOgCOU$k+vUwYcDk)W{Quy;A^wuAP;x zL@nReKJv1O2j#R+zi=J+(p#LNX`Pj)a<(#>`~DCbNnNc|Puae%D7t3IPkH}C=)**E zz5T826w=)ZfxUP^!Trn^p+~)ZgzP1qS&2n zXgt2%;!b;uX~yzIvf5 zq16*Ad~r&BP>%~FxUtt9hDXT3BkXlGB0Ki7d;R0@Kq-~@bu%7f;oICGEmDzOb)L&G zdjp#Bofm3)JjcUhN~ENrB^>i1r-x12G}>|&4dH>zF0tY2#gocjCtMP>LH;TuEXlTN6zzq_pZS4Sz>nSYqR%HID##L?h8w}FRC}+pFhw=<3Ym6=rH2gHn7=&+w~ z5Ipk6N#z8^uha{}YhZ>@On7^tcK`WO}S_c4b(N?2MU*ltoFq8?^IUHkPhdSVi4dllQu zZ!$9HC=TAr8!6(idSt+>6TmRn+feUZrWlZN_c}nM%^(u|FG>e*MVQDJ43ScFO>!oD z@lhJ^3W*CM>l}O-0a{$d$Ptvz<3H3kCgNiM*?s?74L|#W@Q+~t$swisH>ZcG|F=~A zbASjRGy{Xr|6dsIXIsA^H)Z|A$q0BbeE;XVB0_|J2-A8A*&O}o+g^7b>83GyuY>r9r%~LN=1&h+z zXMmCjWUxy!=^6vg4s&&0U=(HSUM|oV<>83 z1?7;N>i$eV-IHz30cv_|HhXK()3h)h^4&rw*pDGGR*&sppT7_j*rD@VuWwLsi-tlaaeZW+IDf(Ft7G&2x?a>>x1s7nFNAWDo56VL z6hj&SY~yR_J5F|O&gQmQzR^{078J80dSW~y(4>a)p3Tt>{ z+}r$}E=8moNJTSkQJR`~3REk?^?f?cP@Aw_dGY3EfL|6K-#t@j6mVTCF5VjzgaCqV2`{g1!*>uMQg$nvbmbg6r0uX~#LNszyq)&A++(CHzLgO0S;Q+q0Zb)B zGi;5^S5Qy@eC4897FTFkdH8KjbfMr+#aTMn7Sk2RJIHJZF2>%lzEuaNgr5UN*LkJ0 zFk{}77;=;7wNw9Yf^2GyR-4;(R*1=<{IV?p$F|J2f>s&2<6K;0)R9xMd6>W0eI zbVl1m#hFc?KVkp*T5<9zPk%^Lo#%{?gx3Q77<1$3H&0oIS>AV`f-A;j8nGR3F=Zhp z&WA>!BKRpFh%Gf$wstG@R{z##`At*Mzzgjx8gE9KkAwuPP|?t=H88UqAfk2CLcCjU zRFteyH&`b5dIILBZ~tnMG9WB4qNz{3x-fTy-(kkl!8g6p`u8j675!*y=~#_Wt{qw+sE(YZ%3Bl zda};^0dDY8u!j^UL6X)WtX&(1C|oO5S%gf`<498DJJ};8l&*%jq zbt660JvX7}?Ch07AH}icpmbNp@wyoDAI>84d%TGA*m1(yiCnC z0l1qsfD75(3IcXb9W1R%#@0TeAhIu*#f+%ipV_;51-k0qVJWOR{is_3aiFe&*ZuHv6C@R#s$&IDM5@9Q_necoQg4ZpML|X{U(8T8_)OL9+bGfB@M9Qm)-1==CwU zN{oR439^+UDv=r&QfYY`BmPbbgb|L_1=41xR=+ukeeiVF=b52pVn9CN+H zYg{f+?MFlZ!fl#j=T@h?Ft_7G9V1oYY?x$#7Tww{D#~hxIwPO0iOIH_=fNTf0gPiB z>h0UNx*Gx_i_IA-@^4xejBvc9pTF*?P$Mgg9&3%1ikD9fN%AV*vA{BW=|;scFBGMJ zHeONA(lMuU0y_)5u5#+OsWu;r~K1OrvYnsl`H_5G=Kz?}? z_+Ji>*8eq>!&Pptb?<$=^mZ5o5PGcW0lNge3=~+1qhyrNxpoRQ&lKo_3B3d1`@S#kl}j#G``VuBD$B+|i~=l$}5=T#|q&_>C_M zoO6WfMG{tJ75ZyP@NordBRqqvpSVDr)eBD!zGGulALA1k*b8pc*JbHZePF3q%s?~2%ao0r7EJTn?J39Mv$dSMW1gT}R>u*|ji%W>`Z zx`M_bA0d~(kU|L&Q10$eC+Ft0J`SM2nF+?5aaf+)Y>GEpY!)6Pv9=P#c*JJjcKe^% zW|=!&x{j+qH6{FlHkI5Ft}J!lGP?p%fWD!hKbjl*C6Jt19_~RD1bkWQF%~Wgs5nk` z6ntCm*BEy1Er4#NA#h}br#^q}hJN>a*H|Np*V#c>ODncd)sZ4xhU`wE;A@8NK^}d; z?!|*710{mnQTuU$&npW9*fnZ4$lvAF4^gfTs<%cMOQ1`K%%J?H*Yak*pXRovE1uO8 zT=lSM)6zLi=~hya%@(+~qeed-8+#8o^7&A!dRx^0GryzN&hj8fh;EvE4ijmYyFNA7G|Ed^rakcDgF+-qQ}X9A zjR02?I1Fx@C|Qh%R6+Gn;fpK&q@_sKOp#J#`9~9O zUiLDli!-q4vUV_|wv9ipiHN9xV?bf4E70rwuKYKCpQJ$li*g`pSl!dS0#Q>BnUa2S z0SBOuaM6RQ{&GieMB{bJ!Q>VW|C_guj`3Im zkk5Mp0_q#bpOm=ro(%o?wXu=YYRy5{Q%>-@|=u zV*sTN%!{Q?!ii9J`0&)nZMUTsFteQkYE)f`%&;lj_JZT`MnBf_K-X}W^ovIRzvwOS z?R+?DYtZp$qTkp8R}u*hd>!ASw`J&x#Uu19iJW;7UI^VZt)&Re#LJD)U86GFqRpQ~ zO*Auu(&vTZi2;N!C+v_v>5tHC6DyluMgS-v7?e7adXU4`ar`THyU^{%cV1w>^xbks zKc`a&F{`hRBxo1-k?dxS8MDn9Z8Kz4h zogC~y`o7%5s}=2d%JzoEOUyKUZ2G*EYW}#r3?&*Y0G9LS*Sp6W0`QSe?P(9)qOq2b zBKXzWix+1!tFVy)18Lr8vEV_}2du78(>e~y&Vafyx z1ugAL5C#7eCJv`Qc+BO=t??EftIHC^j1Gdc^hM+G`@Gv6Zv&NV_5JO9-yKC9{H!R zKY^A|? z)0u{p#!h$eRag6m6DQO@&|aD%|;1cZmad^SZk=?$%ZbGYWMVSv*TW#8wS^dp%$#3L=@jxP^ z5qT8t9;h1^l)o6C53Dh+A+qE{p@$+MaAY(*lF`r&p=t_Tk!l`(<}Lmy^Lqr#9zX<; z@9&;<7`a6*DDaM{J}99}B-9u0XZkYT7=2?j+iuAJrL_B%7_oqubLpa{SGpm17-JL= zuQ1tr^>+>im@*Yr+S&Z?o@cUQI1Jz2n?5kbQafzPM&*xCNO}u-7d4!7i=18 z?b}V^{*>z`{rpF*s({qOM+vb&)Z`jeamLLB1zTWx)t%189w%%y#IXnjhyzrePfiBD zkJ*Jc7k52+<#Mqs2GR zt~ST5SB^K}9{JROCK^Qng0PRC_pFQc*3zW5P2V{U+tWTkKe$$bM)1|sJ$z__*%LL_ zP0M0c1sPAdb??~Y$4z*rn{5npHi3@8q(`L^Y*H=VFCj~g;Dpm?6Wey8)MGaH8Rl?! zgn3KG0!!mpyN{0R6sFBvC|g4WwpkmZP!sfQs_=Ra!gH}|5~`4Em2~B+b1@a}OId&# z-PjFM37LW_%DovV$;^%T@!v6(OmbeYWAk2shcANc-7s2-uK2q3lA20Yw;y58fwP>#_KspF~zZv#`c%yO*2T~)DuZuCvDWbl8A-3icyL{ z7|e+9wrFOtQt0)Yt6NzZR^JU%ov)*~fRx1y+@abkKPzkT^LMVv!EJJU#{L~%zvr8w z(4mS4Zt{68t6Q~K=*c&r7v{n~0>P43Peb;_dpLb5-WB4i`03Pz+FQT}AOJmYaiBN? zqOz!61|{dZ6@e!@-}8-c-_`KbmQpXLM{}1vMdF}p=|}_MoY>&aM8$E4O8Nz^EN#C6 zpw*ZUq{v!j(WhQt?~a2h$oCt*f&>?&bS*wM!<(XJK9tmt(oir<8TzsP6MMNd(iS>w zV;cA&$9(Y`(&I8uqVWCq6FCZgyP2(<980TXB%RadZdF4$7ffH?hssJ5h*2W%Syr{D zYHvUsB;!$F)1H#M!uI(baAc0bs(M68IGuVAwapa0`1={LbK+7du%yb9{=zRs1Ful> zD3U8$r($!TFw6t2so$LrarMey6aG}+8eG|qDaRv`xr(&7XD(f6Jq!RVSF8P}qds<> zS?P3RxP(3p>KFI(fHo!!qjYXqRso~T2-PVAJrZ!ft-5BDAprH-a5$>b)#>XJZx=b% zB3Dr$8}afQr{Z$kp7ssBcS%l)%#AEcXQ1-k_bdbByW;Q!(bu2eYi?2T0EXk zu}ekLJp5yp!{<=McHE`7xs<>SdH1vr&~5HkP%!D|GJgljFKwOv$tD)o=9~AZh}#G@ zG+nWUD_O0C2a%)!@`QBObR$R(D`v~(LtUF`&=TSq&NQ38}{j7 z^kHhi_fJnc`_^WAhur}xc6WzDu z0P5+hyq-fZrJxBl(<2JY=pu@&X!pBwnYi%v_~bc76wl+PYX3u_hcwgJYSPT zp8y!VQ3y-pwXrBde50Em70wEXx)8*t%^|OX(++H#%ix&lsGR>XpQ-MfhNuy+nT~~T z1x5>nw>}nuE5&KNqD1WPMEwRu4e!GlpY7S~!!9Ei!I{sodc8_b@UpIaI!(bRHevD2 zZF&cf1yuzuiKb`^;%cIIoF%{|;k3RKs=(BZcXN5mn+$EzoHEtAqt8#qA=QCA@))?| z;etjK?Xlhar+`M%2lU?BdVqs6vLJymfoS#E366>S&{X8ymO}xxK~_FH*@)lupZgCo zn|x_Fax(YtEjGm*EbxI6JcD5TcgRj(HYFMxclD^AJf)b86m^C=JrGu5Twt!_l9cV- zZ0`+bO5ij16>PTYcR+|qwLnjY@f^7ZiQFg6GS5VEaanim8Nb3HuwemY*@npLk-tTT zK+fsqmFT@i=0i!jI!TiZh0hzAwDkwFNj#xFngSJ*yMV#0uPy+nHw=`iYO~0De?L2y znAo-5EeS?u1CK%lv1=bpHQHg6>269y`Ut3{faC`&jr_47fX}CPD9g_SVNPdo2^kW+ z92)$N2uiVG=EVwr)kn?ua$E*@B>1rP{6>KEexC-hQioHDJ8^XPPVw_VT~96<*eepw zmc=VIX=$$+_*rT-2Ao>7u3Ym!m(Bh7&yz6wOQz7fa-AA&$&DJka!R-eF{?rPW z1Q+N=cgDAaMxl0=&h5EL^LQR_3LgY&l|m4?6cwuS>rdizH4gn%z>yb7Ep+@hPlMxy z?;o$kno_~IQG(Cq`9WDY^()CRnU(@aKlFgcm^5fF9RH`DLx_&hWS z7N3R_DCQ@1Y%V4hL=KunIF3@unl$>}7sYjE!_sp4uq*VSI|Q z?Y~a>^J1v^%qq`LxL3zaZX5wBG#dhZph~_JjP`umXxl4Xb3URJ&O!#*qS|83jOEX- zFT}w$eYy=Z4S>B?;+)CCDD}#5oGq09*%PwGkE>H-1l6}czu?D-7~^HGgy-g&ePK}G zpbaZrTYHIHG*JID?L_0?#Tl-7# z=+ugX)ja*0fJa9*CCGK1hoQC-{D0#e7euapwh?v-HjNN_g2Hr1%Pp-GbIWdB7i?AXE z(VbFwfRe(lIH^KB6f!c^6Y)h33AlX7o}0sJGSw1X$3LEwW0xxUyi!n&Tm)Egw1zI6 zwKI#DFqx2ZS_xxX_j!564JvfAnYS;&*pm7@Kb5F1q%HZ7*Sd`ktYv~n_Qmy;9MB6g zDkieF)KY@->r0GjN}2TIP)9oaP9O52X<_4j^8%5vb6=)IqJ z{Z+^PZ%@o2MYJqcYyrI=!S51X6ulptKz?%$P0on77o(RX)Gwx8sUzM9KXB18@R-w; z@Q6Q!`eUQo9cvqPpR1}o{=G7`y4q!HE5Tz}zakUoVOJ_X&pKZoAGBI&vhG!}>TJ|q zZdEFiy*i4ulVAqDQl1()NiZO0LZ;g4+ ztvH&SoF-OPN5x$-+t(HpKb@MYv zfzciT!%jlY=y?Z>601#$9mkjP_&l20x4a>R59!5OFMVnjp9vaT;EQ7Id zXa0)7Vwj>ZgHY2df0E!p)3x`wXx>#cD3-IpY|RZKDu`7NtvE8`!X|snvbXQBn)DfQ zh{(TLj(vFe)syInLM_Eh63TP0Y3X};oy^qasknVf{#v6LA>#r)M4ybeZyVLhyehoo zir_oI+=f~hk{{J02-mQPvWY0piZ3jF+_S)^JJ1A90fTOGd~ z^ZL{l(!NWlf|q$|HjL{3dXzFD@l*(SW!s#G3ehCdDyW+a$Br<1Gmu8S7gf9rX) zYpIt4yz_uLq#7jKw*sj!)jXuhECT7!UtnjNbS?Vk-n|~nb7^M`H(q3=Yh{MIzcX(U z6Vp&Puh4anA>A!ji7J>nDrBjkTxg3nHG6ZB7@*xTjd^=g%B3;?B-X7}I&FUO+p~tt z3O46$RrZO>=v3nF;P5 zq3z&}fF#Hd`wOoyPzGbd?YH9lK2`^0Hhk?!CpY=nVSAhJkZLb622CMg8kLgku)(>- zXSY12IOLq>%+=Bn*JgySWgzt5-ST(u?a4)%y)!61RsGyj3q*-*d%reD`~24(Yq$Qm z4EINQEH5rbHbtIs@1AbQ z1*DHzRVA@qLLt~g{EwQW>2V$D*6R!XZ!>N{BCG#b&1m3r(fI|epXxmShW~HxRB6&f zo>(e)j3@#95}`E6rF0 z$YdzbIv4=)peC&dqq=EOhG+rhh=dTbqs6}VR!ysCfE;eOCjiv+Pl!3xMB zGajD#j>r2xe`(^Md7(k?>5K!?fw|QR8kWQcoV7XhMp9{zmQ`?pP&+t&M_9{s1Gtt> zrNQ(d1L?Q@^jf`8=WAzDo-6VcfNz*cGVvIZ(nqn>&Se9)KXJKG9k*j@t%+ zkH_Q=j{US$kY9RkRA5FzIER^ixYeFUoNm1=#MtifN#A(%UZK=YZkD%x7n}{U)=QX9$nxD(rGHEUUhL-5VL9 z8gx2Z7xj5Qi!$>$$Y1*VhjMY-S+U)M`oC-E^d$kiiVKFTd|m0=`go7{1Q}a#VHtY` zw=IK2)9XKXY89wBcHhj8J#hZ@O2GS0--@y>1ojHAFwPi#x-MZ@TXpoy7q!kp@2&Ec z#Ts^S0D0s>gn!_WCz&L$M4RBA5=og7mf#+cL9Pz+?k{UQlu93UFctGQ$*h4?Ef}ZH zCkwZPpYvz-@i)uALmL$W6B(oZpj;M4LbAb(az_{b*_*im6;d%)mb_ej9?Xrm_pnEl6kbQ5ld#DT~!oBLz!te3p~;r!ZYWTLoZh_4;Z(06n${7T5ci6_=^oA>4DR=`=fgjgmA=hPL;;`tVho zEfh1#e= z@2vI-K0*vm!o`|UNf#y5Jeiu1?SMCZ36A*NHzP(qM32rXHqY-^n|^Go_-Q_N)caU> zv*uU{((1z9Gxl)qlrvzm9ij6q=0YMu+Iw>k!7%G;)2kqMX{NVBbsEdK)mO*~Sb!}0 zIe}v#@kgwx@Z;phqnh#F*oV?<6K0@juf3km#GW^`{M>&kpY&Yj1ycQlTo9udwgwUB1XN`1r@VVL%X@LG?J{s4fEJw zKB^rI(X@<*SPWym(TABMp}D-tnEH(iL6NnzCv$V98hsoYmnMTYr&Eucn2uHpM)AjZ zuFNVD(Cr?edwQ0+?4E_6`wiQXF@+r-zR~%c&K``FA++KIz?gwd9!{J9KVVA0JcG0qQXeB_N1N_zxXrNP! z1px9 z*~9Ntx9P0GAi4kR0cZi%FoSU{iHd}wQt|H_M0VSO9#*zZ%>5W$?=4?E8XHfIK?_fC zh}ohB!_=*H|Ea>eEI%K?O7Jp6o8!0jctCf8}NG{o-1`2 zw{-JcRYeb*QR^l&F90mxvt87Thb5s#M@1CAp!~MdjL6^d2Am~$7~r~6zG??xhtAIj zzisn=TmBM;902Ny{p)S6EA!t$D8%Xqsud^#I-mdg&IkRV+-UzLruv`9boZApS`Sn!mX9-Xyw}HBrMBo%HHPG0Q5V9Z z0m6#CbXz1ypJp_Gpe#(OEz5A+R*CrqulKHOEMNP8Q^EFGv8QNv9*E9BfZVTfO`!Wx zvHw^PN{UO~&&PhauG~qs9ooPo7%7i3zJt)Bx&z{aIz_IE&5|(^!GL7b&apbAcX5SR zdcz8JRSldBpSEgejq+12kyyFUOQG~FnW%M!rk6rj*wp~7{1AQJ11!1G&9v4h2?unk zru+l{*{i?&`OzQAh0T=D+(Ie*!?^tzt4oJJr_RN&d z^Ky+s_iMZ)W-FX$!F9F=xQQn~i@&Y#>wFP}|9u1-pl}a)ZCnBxhD&%+O&O3m2jH4RqO|G8A((4?^FJ-2=$5+ zn#ti_y0^S`!nf;`NoU=R++mQzQ^Io*_qFeai;JaA8ttjxplbi}kNw9|hrd(-_v~I> zs4KrN{)L&e&8n2Gz7exGaXe+>BPCY&2m#0`u34eob^|@-u6D28b#Hn&dW_bOd-WFj z(l&;Lcll8=l4DZY1_2UF_yXBXp8uVmK7ureO`u8Gx4*i6ylT#j{1)L=Wd&B6c zTjvHtp3-Jg@~_$60Fvg-zn>`0&sWS+!PLnjlYVkOF2dYY1RiCdzpc7iwN=2K zRkx9)z$Z1*f}Fwv`K0Tyr)0fciyc>MEe76P5 z(r>~7I}8UQcv0I3)g`_5`7m9>S9raIxtF8&)NDQU)9EWnmM^pR{?7DP%`9WAVG=h! z4w7A}z5VKmS$5B+ga~RWlHP41%+8l%wI@tF)ILURe6KvyTL=K*jE3^xS*~$u-A~S+ z7GwOmHM#h(R23<|gm%koER8l%a}4*?$W^=PtzV9=KJ>ToFS07pu^;F(KglTYc-TRS zO;^OE`nbticrw5oxh7k-ZW&6OH(z1i{|8GBmQ0+i!rQ=9z3~Z%WVOVBpI#tyebr;8 zW7Tn~KBA%FD|s~vp$GJ7|7)FTi!b-DKv0imjWAugJPrXztA=}e-Au>um!2W8D}7F8 z4UrIXIGczW$qpZr@T8o7rEn?NY$GpSV=UTm3xs2DeR-V?XtvM_FtolY4<<^7LSmkw zlN*~AUMlP58PHf=J-;@UI20s1!({#CHRP{O{Nieh&zBqH)MWY$MT(5Y;Mi4`(NiV*WHA@0hoHs$7Jjw(ttyu*3*06VuXbud2 zffi*Sx{@?I&Jz=B#E8Z?si^%7dKT zvy6hkRcwYqQi#CHIL~;P1SC^@$i?!zb!%z00B>2g%d)l2;}bL50M!t7>o#}-RH5c} zweHipcmd{IYx}Lu0yPQWsP-fFE;{7so<2WHYA&luK2aIN*KrY&MQbI(i1X`1W$(+nX1kf1-3fCdSI4| z0&7%`ogwj}i+txr-t1!`Y|eQg9|EaLan%wxvF1ijbZ4zEy@r;OR}HJXrjNiLD~n#& z1;f{>ZpBhWXSd~6N9bP!l22#|y!06Dl0!@JT;7+nrJD=!PGe;^l{Zs^m76nR=vw_6 z2qp24{tqV?gBejvMP#nZidInOr3p$FL_l8~sfk}bDijFPZ`7E9BpZ{(qmdFW6q@mC zB@|RY62vl{;e-TIOi@$c zTNBJhM98Nn`(mXE>zLk`RjaS8ym__(UI|jU3`GzoF-W@dP`}ubO=_j$@TEDM#SsM% z%gH!U?|CL;Geocel)X@Y!hoEu$V3-&LJI|bl9IF5QHw#aWqO=3C~=G69j80?dt`{* zrcQ{soh@?~oI!smsa^9J!6|9^SPdllDJ5~ATh{0ed-qOonI}R|!h4oS=BaY096rai zGo!_HY^2Iw>m4m?U!~3|kCW!F_!q}*9c|M-f-}-IPchs|VnV6KvW55sIlb}@bZO4q zs-9N+7;n*>37AjBqU(@*m2kY~-(l~}%^2u`>eaWjs(LUef_f^B!uti@e{(mfE6Ttu zAgja9_Jw7~khffMQ1dH*46*=T=w@;#r^)AbXa%QcrS=vP4xPdnjZ_B99P1bCy>1hY zyBkT;?EVdznIaZZQj0qQ-mrB__w_!zc^k+;s;cL|h#Pmvt$Z%j z36H>H-M2QJl37}D>?)@9k!y#9mR^@AL1HuE8mJ|je=MZ9R$VYmSoIKN&}kdxC8CMi zG{AkEJO(92#9dA>dAxIF_^@7_9qgTDaJdt-UYo>cV&()j-`3U7(+7*!&ZiP5?@pGH z7Fbf{c6p>oda}=tUYht*G`|bK}AzaI^pKF`4s#$+s zf0aBDnHDunSV(Xzj}jaP>6>x2tOxuQ$6r~RxNe60Hr+> zBk6R_~(%5|QIoHBftC*RTBtoNUb2IO3E+jF=(Q(E+^6p7Q5^k9YJ5hD;>|4Yl{r1G zeSa`CnzL!H7Fo1wPf(H6NwRLC8kXTROrY991|46-N{`j#6 z6|@b}IyQIA89^;%C^5&Xdy>Gz3HA0U(bYlMLYSEJ%N@0mx9)xO-SIbp#Ne6m!C{m% zQ8&6)ln34<#wdC0o*Fc{pYfRyVc}P2uPnIJbdO*&*B7WQ>kR0%kwsuh(H86_IMIF# z{B9$kB^w^O%)P381cw9TpE{#XOH0;7*}uBm^KPa(zzA88veK14(S&1ZSa$q$%!zEG z=9zj~;B`WH+G$zd?97!C`Y3FoYbm)Sr!yILY)!&@#1f2l0GRJXzztgBkQvBmckwyw4dt>!*w zeoFWBMo4flN1lg9cPh;`&m<%@|9>yhTZK{6vI{;L+e`F&kSk$9W!6kn-Z>r}sNfny|CmsYIA@!CBbcz~)VasSSzj z4&(ixd3)k2`eng7rc|HrDrNYcif7CXlh4!f@2z!*SB9G}DY(d&KdN8jq5zWCPAfqoP6T4=b4Az$|tcq`EuxW9os-lMT&5t@?T3SDuQGR{X=FXh5=0U|} z(j=I4=P(BT8Qqx#kl3gzY>|ce9E}C0Ls`PK+pAMLGV;&WVb{v6Sgclwq&=kt_MS|^ zmHdM8v7)6`a!OK@T9J}DvgCUY{2SPr8{8lRcx+zkGBe;xSAN>uO$XB~E>NXI&5|ET z_5KXRU%5m{b1bqCwq)FC-FT%yL^}JrD~g4Ql4uE^tLDlk<3}7>R_ATX>$C8SHFov0 zajrwqB6SLa>doO_XItd7S$y!$-#!J>Z8#zM0O}Q|O9AJdo=)Gn?}Q$#pa1#6!-QTF zfRAj8iL1jc;SNT_Wq`MJJkQwcG}#=XNuObiEs`_-jKe#}OBZ+LYz-f6vxV0Brrz;& z*mjZUEN))v+7Et$N!`O^i=3QeG@P6xKJwo8?Ava+P~e+stnf@WQ8xzV_) zHN)RISFrcERVPpLpp;65@=e`b;|%Q+S!5;h;2W!!kPA(IAO*(v=oWmvr?yGtZtND% znSEMZ2<;ZSg|_s1BT8H>K7bw$pj_3NVd$u(kWjz>BGi|U<|O7>F|KMo3z4f>h?m*d zam91Pwzu%tUGw1{Lbk~xBZ<80p3`j%OO%4u&8}-PVqcg*!6@_oe?q;PBingDJ#Qx| zQM^^Jt?*33Gd6sf9rrc28l4ngTB3SA$59{Eh1Lj)MQn3gnXRsTc8Q<-UZT)(vnTBQ zThlv)gQfYTNvJ5#c;0P&J2XGI?*Q9=;&S^h&`#mL_Dxv0C#i1BaQ+ljnVleWYb?)W z`>#FUC6U9Wl@T8G3~6h|tj62n`&|>vCK}y#p?R*8zOPDAVFwv{u>S8ouSfADO~w&| zlI#2JECV6OXEaK^+nl6KhCs#og`ifnkja7VslGG|Y>LCLjFo&GzV1WQD#! zCZ`(>MQ`qSHyv6e)C=MhTn9qTm#1X&&4bS0oAMT{QmG_MqUm84-0|sw;wJ+z`z$?- zd)4FXLl3j)3U7raGjh_3DeSMIp&{WRD5eU_+Vsg2NN<$bcs#ycEFuO%DILm;w$b<{ zKIj3jxm|g`{@XChwH2Uy7zidX&&@S!F}%sl46O7`8t{>$l$5xz!f*x4F_u zlYk*WQCoR~hn%w+qNIk6K+SjJo?P%LL1ZikAIsx49{*(vm!oAF-R^NOc{8`vn!)MQsH^o z7=Ok{R-yd#)w(cl?e6RrDHLnl%G|If8u?L&r#@;`gmkeq-)|jKlo&BIj}Oo?Bpr<7 z{A&a01r0BIPiir;cLJ3_GtIujg7KJhZHt^>f%SEKyV?baEN={=Z>HVYq?FTiUN4{} zApQ>ph|1DOk$m`YKKgo$qUDYGT&+ytk7vgVnFO=AuMTQ=3PXX;m~7(u?fG(&&ep&P zarCds3mnh&g$5|?Kp6`&9-9C~>)Fcp7J;OiHn()-B1}im9T+%9_6n0cQMzy2mo&&J zHS;ayC3*d!8dUpS7V3F+#Il*TWV3923A5bsi8?^Xv2bR!#)~Nv>BYnHDRTD{SduATdE&yZONn{ek&_% z5_npa1Av8(pD8~N=8_5{A83|ZC^Px+K$Ud;cZizZok`22LnnPfRIPU7m&k0&T629P z1vIsk^Gz;6aY&y;PTQHCkt7IQ!G}m8Df6Cp@ldqts@a>%jeRhSE;KaEzeBRC;Fs|{ zf9|~7C+HFlpx(zhLV+&Fq;~Ep0?jgIS6=E#3}2e`{!%FaoK3qq z^V|_%iXmoN-=i8O;;#HgangIEX{W#-{K$d7;h*V}4}~vq4q#N*`B*uRmFJW~npoB( zgpwyXqi_wsD{BqhH-zp=6aDo`Ylvc?YVn>*CwQ?D4JoZqlRvPyqcwZ8AA1 zXtg%Pj*0Wag;BGbUw?f%1^WJvlbrs}+@X$f>6KO0^F$T$ZzUv(=kl*D!mcrdFtz7K59qQDn_X|77qDues@-k}_sm7<6{oJq_H95>9byo^)!I9ceVtt0gNZTYS%duqS^zDeFfZC@G^9^V_L23u=^w{qu^5Tm+ z6+!|-cV-)$$p^Fdjne=C)EwbDWRN!ToXg+HaERmzwX$qO{v#q3D4|WJb84de0)5gR2Y_sxGWachg?k6$n5k;cm+XDpg$vP z|5X@z517Qp=DM)NGe3Gh&+&SM$#*#4k!Bf)GsyS1p8T=8FjOv2A=e>*%di{7>a5TB zz35FrP`E%$(1e9CYmhW7K5tgPZpj5k)pPxOrJ27dl;9hlM@2<#tXI-)dF<)lO`9=M z`weP8yE_Fb=(&(t^H?3(bfrnWfBLWG-|(7Ue=&1p%Mjc9!&C@q)dA}*q$#-ovA;*A z9WprXim5b4Uqwr=X*Y?)ZIFs|>l2tu{qhon1ktzkpCAMUFfmN%{Jpz$dLs>g2885b zSx#|6OOK?iS0Qm?AA^6$B1FpRjAw?5a!aoqtl?t`I!09GX97ZwXFt?Dh}z}j>0`^& z1X0Xb$e{+w4cY0-BFbGzx-eFyfDc?*YGAxL5{t>bzvt07mVxZ7#JE`=D{| z4v!Kf@cjP;1AWJ_wQ1qUfz&Spjxjs=L zMMJORbpNtVl3!#@g4~wR{gWdfeK;l}D1`x1!F_^~nYb6x?8SbV*jdB^9JF_yQYg|M zyz}}>OKtbzQ)SSfR1e6mS;5r^{NFb$Sc+Q3jgF1&Z`N2Jzo9V7C7npZaJFx?9C{%BQ8yP_FI0h-ew@+Jm$&>8M?86DDfm7Sqk^V7(*AR>DXLhKd3fACWYw*VhEFuRwg1i zgn%;#K?HGcFQtmpK7I@me|&vfzgagA8EQcUxoTG6x)8O@16F(* z`bSO0RvtfQjZ>_bU>?z1SbjSABOG=fI0GH!A?3+$5dP;&&aFN-*UG=^)%4aAEmi;+zx&tQv%LT!AZQVh^m5g3r4b1Eug3B@Gs7 z50^x6ZA82mBtlDgyyX4mVMhJUwb6^Z(5S7|5DBy3?_anBW#&w^gV66@2t#5ua%;G) z7tS`e@(k%NG^WV>xW!~9bnL&XJqmRL<@uWVI=Alm@roE)ohy9?CF4w0b#OoDn_3ey z)nawbJ&&?iltSa9Bf@*J>eiAlkip<}(o;$~P3&LX#_PLywdxzb?qR^x>BQ|6aSaa9WBfVzN}us>dOyD|gBQV`tv@J4}(8pOK3 zidG8f07H^sRA*3%6{Vv9;lgWxm!9z}w2n3acQaFYL?PGs$sXDnmc#i?dDq%XS5@+M zjk4a*f|5+_YY?-Fm~iO*gjyXmfXWo5C_XBP?dbs=0^724qtw8|{%~T%e^CVrxHxXN ze5-sD3e@!F-uINcYTidE)wQR##fn;`czAfk7*!R)fg-ZTirKuTQ0K2m{?#jKO9=x_ zpCX0!nE|s5R<}3TB;FI|cUZx8uIW#Jexp-=b7ZO9o@+LD8kv%0Z#zsj6QLxUSH{f? zM%^ET6R5YjLjk&W>CmASrY)eu)N%b?QU8f+^W(9$<73M3Ds#93^)I(?>~Av7_Fw)h zK21v9x97mzjA$2I0?_`qf8wA2ljw4}M52`ZHT08OUEK=qG4Th=`7`M$DM$n7`eZ;? zt@%Aan#BFNT6YKM zLOmlpCqjB3UPNt*lt(otx+10mk$rDGWIGh99OKl3X*d92gswK#} zeZS@Aww9rldGX>!&`*~$Z;tJSI}ycioNO`1>z``5i!VFXVv9d!j_Ug@l%aepD8ej0 z$hXIC=cV;R9Q;*ZQ&ZE_bPR^Vjz`^w{^Sc6E-b+)s(m!_2+kHG{FzfNW_bToEmrv1 zQ!Nf%sWQiP_jcRqJlnn%`4x!G&oi>JqQ+`N$m^?igC(Lc%nH5*ribl=0gaYpM3wle zvEpm-tz+)j;|Iqinn~~XP`6AHWmC_ORQcie{Rv=D#a@71BaB{vli}Y*b38L-QqY|t zY*N@=F>F%Q-6d@DJg%LM`Y(eajrmag^5x64w6xKhASFe``QZw0>O@}LFaHNu6%Z3! zfeWjvtK+Tg;nr(wYkl_6&Ho==c5Q8~r>6%l?#C#osHCK%pb#gEB7vHzZh*9RUH(hy zs5+5X(m8ecG14`<2`kh)eh?1FkNUsx-z&fTII-}D2S=#C>eakBK!`I?iW??pQbi$Y zlLfcu%ymS-*YJI(FxH9k8O8hz??OSil=D+fI!-S6*-dnVISXQn)GJHuNkTtZkVwUz#) zT@S^!PCj9Y>n-cvIg?+7w`-ao!g@y!yAW7B7Na=3wnwqjJm}b&!nnQe!N2~feNz6& z^Z)Eu$M;ELyrN`eKki6C+n0hRfh*{CemrQj>%Lb1(!^yPRqOV{9Pkw3SEe$H-6I7U z_Cv7PV;bbu^oKtdyC16C@PS(6>^MnAM4}ZK2reUXSmuczugjLYR;DKboUo~qY5L7( zlaGuvJa1pS6YhOwqrQ$v2Wxem@2t-7f#L2MueoLSAFH`D^jr7g;AZ<*!C%WWz`(e= zutxmpI#>eNhMx~{)Lqj!Up=1rjei|Jz&M_^xZWZE<2%-=&lueoQOS+a_LP8kn)F>G z^^?m^sfMO)*Y*w%PDd{-9D~OsTl55g?o1QCGd}c} z%~uuo9X5BvcI%`!D&Xe&@nFKt+uP{4!C=vm{JGBC55>HdKkxf3N69EJoBHjwp48P_ zc5+$&_$3bw2ZF=3OG?`6$&VA05B?24+vX#~@olm-AJ+CDEYbRBt0*ry%bn4e!7r#w zY|H4hu?(0ce2ZUM<^oP!^c#s5M^zht&`8}b_Bo?|;%9g|PQz;ej_5yLLmqY0e=xAs zFD}VnuYtR*o0wRj)EBg=cWVmTzwmz#O7%C!uYi;N=#IPW#b8bC*`=wyNj-Yvk|nq1 zp8WPKE0OxIbpK*OQU2|Y0i*uve{0+RhhJHQ*psWbdgr>-sUM=FnzSTjMHa z{?6Ok`HXyh_Av=!Wxm~>zKxSO+;Y(x?%>X<(geXNJzkl{m;dO!K{m(db_=#`Tk&kqAMMI*q`#@o6U0@?$?vGJL}5Onvd=t}Kfoc+rU#e?^ie+p{#pYu&N0uzd+m#5poAGWr(G71{{zj*N?ARr(psBn`? zi-yC>1FK(q7TDTuF8;%d<>IW;ZfAvs@wFkGcsYM?#NZCAtMTqTqt)cQ;OHK&ggA1f zSIDcTd-w<&8y0G&5F~)RW|Q-h=H=x*b*h@Q;{<5rQ=oXiI zhlGUSxBTG}$StZ<03#U=d(#w@BUA)fk**`9b_ZJGH&bThP1$GHXE=kEgxVU{qSZ3k2{oFZIraO-r+T)~mpeeQ_-7M(q zuLS=+mxCJXS#)`Dgn&OoB}`&JIN7}d#o!w^zWCDfjcqYYxz78;kFReYtk?k0eWS7J zR8p-)ajv@EP7p{F3OoCFrRfrKaU-aq(#R8~p8cwN^j+HB%GWG5K1dh3dA!Sa9C^%$ zh*UJ)@V0X74A-l(AA{N39|S7_ z?H7#h+EGr9%HL8cL2G>Qt(|$d50bVYs{s?Xwbx)dc@g z#fkLVtZl{i!5am~`&-3TuS~pHl#*RIB~I4noB}KP_0f%9WB|J8w62fDiGZZ1g$= z%nVJ$U1|__J!bc2_s4eb>Fc*y{+<9zR^40I1Nnbq>@XSklvLg^y*l`tO`zb=tsR5> zpabIa;M;j>Xt(hxlG*CH2u_3LuTFlI*v@^Q-gD3D^`=>rg9lm=##6;&trjD>%&PS@MpFE*cAh>#B z_2lZ^!95p+LFIsIqaIMS1>x2&q1PIUasy4ybR0Jw^t57pdHIyUtF~nCRfK`z-Hwb! z5kYYej9raub-A3l=R<7Uv0f}GR-sr4CH{L|@V^Yl;u>-hpMZOW@A_jogFzYMxRSrzUFB%3V~Ura(-?M)4XAi=|Ey2A z9U3*ptY;H`ka3T@R8B*snz2qn;6nQxBO`!v~9#tn(Pp&V= zm0sRX%L}z3{)W7EhrC1+Z0PUTIbZtEd&{?~LeC8aU)ndn7HPPt+eReYRzn#uS%>c` z<(|fe2nJWRniIBeL;sY@=9MCk%DVW%01Mp%X}o8F|wW^cU#-f~Vc>(Q7q~3H1)UI`8-P5iO== z)1nq#ukj$?PQ9m3i0MAlS3X8;MwgeB>u1of<^-=tctoMTxHb})l93IO1Smytr0Xs@ z0L4j^>Cdy5E0mv(6?FIlHUn%|Oxf;MxBt8n&&g!_MHvuEHut0~7DnI;mU^M0`1Bg$ zDYskXFg}wrI>}ElDGFAZ_tre7PvI!xCj2CEj<%)!yidL&9aJ*e9Q8RkW!t3WoGz{i z2qNF6!5zD~d!P#N`%uZI8;_Ltxjvm5y*~!8*o=Ld)k#J%y#Q(&LPh2+k3cA{_7-$b zKsBe;E`r_(XnM{`pkivmCeHQ{fGNxXrKcZ>;Z5%qA9AaUK%2FIow0#_HT=>POlg!w zHz&NajH7_@+p`L3Xyi*Y80Da2o2D%xwaa(!VrkTo?1eP??#6bwLG1n*n~j4Syq#HZ z1yyXQcVw!zJm@5(3VqvO-pF*U0aJfj&#a0|>p!P7_^xIf4jNKubI{CyabN1@vE}!G zma24T2%#TGj%x2zvqvQ z7LNwV8P|Ip-aXaO_Ghtc@1EYns8#)IH!&kXxlCI$sX^dCIRE^6rJyc4X?r_R>H~qf zy8}g7<#NWUVy76zpm~i{RWrGY&``(md5fVk+q+ZVLq(ktXfmOjm#_lk1Z_K%0LSS0bb9UPe&#lVmCLNo0A`vuGMVY(ozt9b1RGCj$1~XOrlNVU zKUu)54+4rLIW;uBT9#v(j=egj;C{b(oz&=%_~vsSqo++>QOO*R3wd;T+@$&9mr0gY z+nq5$<*cz1d=efr0JXV-&xKde`o%!Mk{H8*u;D<_Z3AYuO=mzMJ6C{G^L0`?PyV6Q zI1WfLDK1tdb3PVMM?nf*l+<@z@2oeAF`NPZeV0L2uJb^eU04SFNhl8T?8A>QX?a96 zcFn#}GAMdC%5Um4UQYxTSO6+4QOaHT+Hlbxi09Jrm)fz81=f}WlZ_MQJE$9t>95sh zYO4k~r=2Ej`4q}qeG{!Q{`wJewWD8F#c-~_b&d0milKabH4hwulLJZZ5%vI{9~fM8$|eiyg{Z!O}+B_B)G8L z##vk?UFk&20v{)(R}@N$4J2{sUGZInZjG0FpnbaMkWqj++iYv4`hvT=`;#ZA+r3v< z3L>webpU5>ZH;O210iwVQOcWiKbx+0>0UBoW5n;H<@L*-W5)_p0&81xlEzW`-el(& zK|!N&nm#_R)G-T&_q@@|D-NtOCM7nkXy<9}%4{j$%ERmWd7N z!|>I0s0fO7rRIUVqIRFssJ;EiSuya&80W7vfmQe{SKy-)E5S@5Nm4mD7`=QczJr8=oO|e=rll`nWA5yi7bkE@iw(drxOM2jpiT^^0C@aR zN_C(QdvmlLgtsu>K-cKgpSJTd0va7D8q`j0X>6s~j_`n&D=&RP7{)U>I0zD|#$%6F zci}bSX`o*{nYQK)_nBpEDRgX6$m|gXMQ~9#G#ysmgFd4X1r^~I_YVJV=hKg?W8-?) z7I#f2X2mS*IG%BSD}G-^NB^)VsrzlYIJ&NSqjYP93a2j`v^{qbCDu>(=}?VU-=)jd zf|uyUu8D3b4WDLYT;4&zs{=p6H~^&0UK4ks9EOfs5pM3YO+*jXhOUAtW+fTpg;Hyl zh9$p+)8wi^I%8^GH`b_Q+svWS79+H*I>fWO4hFV610^psW@f#&&IWE_)C0$K(VO0m)kxH+XwMzdg59(V%xT3C($RzHIfB0+Dwf8~4{i%7~?f20` zuX@h!bN~7(@$IEi*2;|y>6>K_di=XtLp7dH4GXawEIRcDhaaEpcBmIIuz~UwMYw1{ zd1-RG4J*99?#u(6Mt<4M7o$>?Qr3$XR24y7*|+s7{bu?;J|m5rwkBF+Ezz;IC+AKL z(>N^HtCd~UtC}unqVpuQ{g&AuO;~Xgr7GgLF>K3Oeb0)Dq`Y#)Xfj+{sb<@*e)>YQ z2u~&ymbaW}Q)pa*d1UKQQEO^O!v<2gznDg*bV44(G$lTrcng`OK!KP5Op}x9W8m(U+5o0~}cAeZ=I46sZi?Cmt$Tk+p%Vseur58vOA}MD@2#3NA zkF?{g+meHIKgfo=b8}O8Qcycg8Q*G-U3jgRrkvk+r}$S~(aQDv_xDyB<7lXUt00Vx zMSHK8M z9|tkN&JxY_LM}NQx+`%uu65h0&L23hfK@N!v~YS;Tc>LASqK9PSb;qYCF62OGW(b3 zq?iT0jRqdB*d?0h=psAk2+aO9BMOd#j+h52T=V?i;}!%Rn-8XF5) z2jwBx3D7$i;B_=Ad8i2GNnAm$q3QhbgH!_wI=oCV{~FLuqk zX%5Xi`ZW{+mb%>IHR$)Zu3=7Dv%}Vi8e|Afy}QcpJ&h{P7q2MYDN&2sdeQEmTA>I{ zSxv6bd=}~a>(JgEjBwvkx(4azEsZ?XtohrWrShmIV~PV+UHRUyxG&O`-URV;! zCL!6CH0$k2s#_=9`tz;Ui*~kjL`yISaWPRdirgoZB|y{eB5z#mmoM~RK`8ii_h*>A zQ{=L-woB_wM`3qfri9=Ta{gTz@n{pq!`#|~RjHCL)$#Pu89yuf=gu~4=zAyYMCaY} zEQK%LFUA7B<&GR&VoG!Gka9s3ZI&84Zb{J7ySx!9hyxdO}J$Sp%iH);s%5Gv;Uv?t|{!ubFH4xZi}90!R#Tl~P$~|8_qm|MmbS zC92WGZuT3eEtFud>`hG_+Aj2z{nsC4j){y}nIfiIm|vfir`ur9bf9srVH!8Wvy3(j zq`v%7QDvP(G=JzO`R(%*sfHT&W=0MFO)h^pLjG*j?$kDn|0E~+%iOLVJ_ZmviRNQR z<50y7N%Q?~(XIRL)Rv5jX`WSVDKD3BF=!ri>`#3@aiYGL;hkBGgeL1`W>Y{=`+xdq zX5)W;w7jM6(glH!;vFb16;Y*gzf#wXPwW?oIM!r+b&*!swUac~Fzi7kaqdL=K<6M) zN=J8N_Ux?ctUK|6(B0+b;lV%tU}b@d~AHe zjL*PdY^bD-A73GG-g&(?Mvyki`hJyexpqf!fqOwZ=6OR}Th2h?>h(dzfy|bj zC%_B zF=l8~iY!km^asB~&tFACmO_l|ifC=f(NG2k;f=Q5pl>042f{REV_J+#bH31D=Fwj2 ze>^yt%*=C7xhrwi&ugx=?Sfl{eTP(5fN+Jgu6df=T+*R_7?3i5bvTN$qPW8EKmaL= z;jwf3gSl;F`PF5Jer9uL+T3SyS2|Zr7p^=UE~vgn)=J&( z#=+HFI(-lE=nbzeSh_X*5VBTVMB|QRc;TJ^(FcP;+ZPOqBAhrK`>DiUFj5{r<1&~E z%GDhuzDyK`81>2$Mr(fmP>lSkOYk1}` zU3F$N*LWIz>!S5B%k#vNjnc9ZrLE1ogJbhm0Omk@;tneIrQn9TAZ?MQ^n&ftW&g&M zVR&FRh18b%t)w@CwzWyyHAxWMdmkUL6Uu@u?i||iKH&8{r*R*!ldJ5s$v#CE)dkxk z;zz>B<3;F_Ofl@6)6S8(XA`A@befgAavzrpebXkK{^6Il|49+=mE;!JF#Bsuf==x z%)*vC3$|j(j_Lczn%>0Gw?yhP|EYYk#XY1r+htXwcdwRc=bhq{9?ivBh0c*E37^oQ z?LT3J;lIdZhLsYk%G9pGcDf|@q-J;b;TT=SiYa{sw0fKE`$h+QZ}jHq^=$3O9n*Gy zKfB?^WSaV^b!Um!K7qQ)?<3c%))pv9jC1X6@I1b}`Sw7lsQzAzxrc4;E{=s_f@9XD zYL24!@q=Q;A=?Dk4l4Gaey@?=d_zd2A5yZ~EoJhK5;5=Z7aRf$xB2hB;@=lk&XcKa z^0=nAv)HT1xmjrY*$Tm6zF%^Hay->m_gNFADT*Owa~0zomp;d+Bvz<|smyp`w)gM! zneY36N(Xz)X^sSuhiP0`e__AOJR!)D>_~WhnC{!Qc_Oj-OgHyC=A}`oi}M;ej*HeL zq0z}A&wb?qSLN?Hu;yBEH#JwuRC8OgdPhk#5Dwqg{rAlN;DAoF5Y2n0L|v!KJ~1Y_ z^|4UbRNLt9UvdoDBNh(WuL%m#eSL3tQVb<2#CGLn8UQW^Crp|_{b}>d(3N#YEo28%Nn9-)Ixv90BfVaP73JhuARTbF>Fu=u%Rx=joHR2tTuzq5qKP$iC0HSW zS}m^d8qL|?@5ITL0?PS2$K8g`PPLo5a}+8#hTO9-druOk>Mb1Sj*1(N3HJzB@)4@S zoPoeU^2US0J49mpA)lG|3DH8lcDSIXRi%QrUwRIq&c*>Bw>0 z%npQ{`BlalAtVNF{S*Ax zDrKOBcu(mr?k^p$Oqe-E95Nc`C^Kp~gEE#1betKg?T$?t86le&$ZP6*&^qz44Lz|) z)Gk%hU0WXBd0u1XW_R2PiEl2QApaIix+Qk~O5zxU*XB3BcgET+Pvb;=e7-iuYw6at zb1|${3LV_KmcC!W{paULmVy>)O6-8^a2vc;9m@e@g?dG`99}FBg&rp+4?z9#Q0p!z zdXG6hS|vR)Md`!@-JsWCGA{QWGrql=d~a0o_;?#OIIri8M!r7O9=BFvZ#sBi^9bvE z!IZU^lG3QR=%YUexjxe8Zu^(A_6+GjPw1#}OQsiIA@4t$MK64U<3*~?#Em$mvM=;6 zJ?XLJ1G=|vm4nj;J_GDs|1`0K_DQvDQccK$O1byJ;aWOvRk1KxVvBna6?tVYN4%4c zq!AdMx9;wz#de;L>)SiLBf}>RfxquYT4icC1-uhBo@Y_>bXv1eQ+XxoqG>H9_iSIO zuFRuHuSA+~TE@p=zE4-I+A(U6=rNrM#Og8u?Kl+7uJ@=VzK3Y914g%}!LYN1LzqPW zIRMo;)|!-DC~ZtmI=4=7l9^c|6s?)_A;xhz2W9B75rSS06}0uXnIKlX5?iY;XV1pZhz^9mSv-qbL!IjU8_bWB;B*s@OaXM_hg z_B%A(+AmFOW9-Q*DUz>6q+XXPrCAMg5~Rr0`Yvl0!9v0gHUuz>T$ph)J}sm7j*N1B zdbaXDPSd=4tg2bu`7Z(|me)at|1}8_Z!g~$0z0wH^_TXvAVGQw3 z8(*~^+5?->VX6Y4Y{o;cB;=r|wU)74dIFPxQjJ=3WW!IyND{^fgmcV9%J5rhO6Jvp zn?9a`*_D@J)FFdz0lZoBzVJLMZmrB4%0+4#s4sUIXqYY{E`^?u+|p_-o|yW@X$%{} zbJ@7fVC5wmHB>qGHB~3cQ;>z@h*FEYlCubhpgI&#ljxn^waS=@H#(u)X~?6HiHP5q zlew;?AlA4SpH{3p@y)|xU zgDo&2k}HH^Y?gp4(akT;=NYQ-)%*DIT3N65dsZ$J@=2kErtIvxr zzcrwawL_<&s7q0^`w}CyRY`BJTr3#(CVJgV37eM6L`*WXOoF{?jlJnrbU$boR;}=0 z(YHTl1su~+!rHCO$C$gUpX21=V=G%@+>YcWufI-8E~Se=GLS-8&eVR*)~a_c(v1xGt7>$Apfw|O!lrV*+he6B&YrZqGMJlnT>*Pg%&F>;Y;#Kkj+tx|Yf!z~AE|lgEzTwFYw2xWqlU%X{8#e1V-ixDS9qafm})9=7DW1K`j9pd zlXW}N>h;<>J6A^Oe%K9yjbJCMux}HY$Im!N@k!h^cNiq>MqPL2BrPhzN9?XpmMV+Xk+Sp z(=IXWNYh$7L+m*ht$-0N=SB}N^rhANokuVFFkR7hHr|eFeZD4(P_*1Kg*QbCrsbVB zPSdSin#lIJtpH;=_@!G?FgnbvmauOfjmttR;50j3^^ph4Za z=~Ljs3val2U6_hqfqHHb^k*32=N88Db=4hgjqvje)?;kp0_p3diNds8o1@_gU~lSl zL?We^KLMI5c#YYrQcT=>T@nVtf{0?*fV|76hBqwU*NW{SsY@;0DESMYNxiY8^O;JN zlicT;qjv0~{%x0m3LZj_2sy*mW(7d5%256wA;3r%-(J%gycT|CaoYs+nu|+uLxZg4 zE#T{}*gg8|y(E(teTTFb@)Sol7$OCit5==XxMMbO+bQjndvBfij1m56B`k?%!c8nw z`{{G44V-+wl|e6L12c2dI;yYPygdpi^0`1j!Mtm-Tz^HJ z?1Z_x4v?1Mb?|ED@#q>Alcq_?rXT3af-zQhRI>lre3I?rG$(a@e3CyNcgG|H^9(Wb^5u6dl6n6%||WAbuC%!`6kF;>b?1uV3^ z3};|IdF<`c-WciEeSIgFk$jqXf_J#i6f{LZpl-~f zR{Dh&wSZ^F2IbgWzsQ<}9l#?q>dT=rJ%&R;e3PVi9j&4l%#x}*&GMd5@`pxSO1RxB zNz>YV@6CMf8SMCng^%c77=H0U~TU}q-x$4In-J&v#_Pa;$c;=&4E9t$YI;)7+d3 z6UMER2e0bo!r5P_X%=Fjx1k><+HQw4q`E=*IBG4CHA#i@X@SLH@0p?3=~ z>OjBt%4EKbLCtUEFGUO^VeLIuRsx7*$PQtvkRAlrIT-cw&9 z)O*sec6V9NWN33L#2#32h?dNIye{^_#>Y+Ityw@?>PE=dVn3nB@MnK7MSRCkOCg|& ziU>KBw)#w)G|;ki$l9u%^|ba4$bJx`0tGWSG|G9Q_2^1P@Wrv9^JFB`$>6VnmnKOq z#$=oee9C{iJMek=8Nx<6OJ)eG3F)!eqIG-6Y_nS3NX4YUeUy|ZL<-6w=kVGO zpgHJ#Hh?GDy(jQhK(BLtMFs^g9I3C{@gE+zUx{H)1)Oo6X8+OiC)1&{yy#v2gTI2Vz()4|@_&O5Tc8l3e>=7iR5kbC*>=-v7rBt8YH2 z{!?k$X)KOyfRR(`33tWk`Kf)OT}#+uC?2Jhd`vB4Bpn|TA-u85D4%%@gi*DyqcQ@Z zI=5RHWzQ%tVnr*}s>krF!6DWJ=|3L@Q173!Jp zhx;ELA$DEFa;oQ)T&x!oFz`ro zBpMfSazB#m(jTCt^t;w9{8W}@6jXo9XC|h>K#S2~>QHbrsAwe0wvaQ-d#^@_EOs>$ zrG&$;@cQur-A6|u;p42e2W)xXrr4g5YzNa)r|3e{^J*l_cp)>AYscz=r9fLCwEv>% zETYgE8+am0!(Q*!*&jmj1hY0GwQ3m#F9#3WOg*8?m(O$r?5#8E{cE{Sa44$on5hg5 z2LAQe*^x@HnmqudIHX3%*A=g&U3cj0%CokIuiJZY;(f~P(6)M;srq0TfJhXbo!kE$=EARWJ zL}oue^wHDIDC+jM7^Ua$5o%#;wNZ^C2eUSLZHU*TFYiDC%Y-cEgbdF7F9uDK}9WY_e<99R`t2y|>rM z_AxI8Ez`9JomGU!K)qN!QS!VZOyHR3Ep->(n5(aT zy<}QSgDSgXYZ{*Ob0Awc#Qu!WWuR}*j68!51_z+@FY8HdVCJ5O3FpgeU;xGh_BhyV zR@#Py&kTnPWWPOf6j)=xIFxXccd`qe9HwGr6yjv|2Ma9|^r}UIG!l$G1zbd=G{-(Y zI|on^pt9Tz{ZL)w4*BbEHW{d%x?NM`uEnEy^>{5yF^ zsIPVDNPp;+0l?-&|7KJs3?TDkmA;uksQkx+Bal>6 zftP^H$kVVfiUjl2-=*BHg=vQx-q2M4n|0M_yun$+mU#GFVP~>+OrA(gnpyYz3_~)c zgaua?o>-JB+P}&f+ebIoqTo}#al)*VPb}QhJ|+;H(yJhws`6ha-fQ~DHW0dxwObk| z8d7|^9(}V)3zK~Q7GE%r-YZ)lF#OrIYoIa!mA~%Xl%~gEZIM{oSXCbJ(BSOw8H2N! zez&ldN;tt5$2-oS--ln(6@CpgZo0YH+WNBVj@7CYv7zfVgp7z#!p!8)utzkXD9?986A3|`VU!jQkUTdsoY%0eV z1e8#9S1t=rl;B0)@unZ3JS&o**E&tf%0@AK4D3sE)%9Ctj(8-XJ-w!6BcN_RKHiSY z%_v&eoFcb%qv=qx^O{s8zf7ghu43rbYg^Q}YC@9ElbC%XHavBSD%HVG>T|5;eS5w7WQMl#5Uc{ua8Pp|P zP6L?lU+xEqKxPMv6b{%L5L7*_sp{2TWX{D{Edo>mQrT4H)Zv{wr5{grExBx{y`4ld zB*52@4A`sF>U=C%sGE(qj+u7+HPSehlwKxtcVHzcn0M?V2K(~mVZdTnaUU2RQr?>+ zk*O;NdA#ex1nvm46mmjR#-@y7bI^llE3~W&77$jz1D0P3Q2u_Df2*w_Q)P`Sb6Pa) zo40`(*EM4o2_dCT4<=d;QhTbRZc0qGJJXoMi&7R)OwNJ<)&)H4{T}uH=hRy2xx9jc zl$5`+m+`_BEzD@lQ@r5aBF9{5|1*F%(qa&EpckZQv0rnTa)x@inrJeg3m$8sbRnvftq;b>v_CcDgMs*v!k=sIs(s5iRB%) z1<#AK$GH>}U#_T%hZS~36}nN)U{7;VtB-5f9Qvz?l3 z=M!?W54R`)xSMC`uNS7CuHKqzgx2)ADzKvK9I8;-rSPq19v$UE9QjGl1b)I);Tq9S ziwQF#;ySuQ!yj_Y#R39=kZV!3=qowT<9E>jO{jffJGJhR-Qjus9lip{O1)0V#YO`H zlEDN1RWb&0kFqQTCC@gW%5)J;-K!{qzqP)G0lqWMnLJ?JZUe(&(n?B>@VwzSPYLC> z9YayC&NjW5#xXf7Cl>mqsPS{Skt=453ALfcr^??Rtg=9;$2~!u$766|eCKZ5#AhTJ z+rLwms1sK^4jjk%aX`BfC0ozx!#pVtJ92BXD(`ug_t6Q#7fauvOf~`@Z&nE>a1r53 z`d>dVrX>TYUG|X$^dDOXn6ewmB4)E(vdTao=oD>b&(L?{z_whMmwRS7q3e}=k6$TT z@f!GCA{w-%X+{X?oO0>aU$3HO1K(|h#kPiH*B`xsA&LvTvq z(%o>@4yck~G6eV%Lei)!?DNf{!exKJeTHM9>Z8^({pg9lqvzKa%Qud6`Pi%hwwwc+ zQVT~wrL&guyXJiX77X;26EQSbk1budYD5>!-~9-T5_=XC`D{$zg6(-qjR&i^_nY+~ zy4aqi6`X5DQGFkp8a-Vle~^kz5Tv#$qlehb1EGxWhPxGXpO#JZ7_#t5o+0=thV zQM1r9q1YEeyJAJwbFdcE9$Y=y$IUACQ&Ogt+TM>fW$2bmzPrqFIZ8bL@PsSXdcHO1 z$14~3a+{D$3O_1w(_2nh^)&&7<{=0Y?R*;(*#Yaq#N4jdbin4Uqjiq_ey=ho7Qjzp(&dau<(OH?M>nLC(B@S+YpoJT zl6UI7Mil}pA8d21Gy4U5YNS+vX23^?lkpC>B1N#bv2a{D;DJV*eT?v)Qmgf>sZa~W z{=MM3?k(<>nrf@KnnXo{?gxl)GF-kt#GOV_fyX~VKLB`<*0Quo?-s&VO-q5u{T*bR zLQZqF?YFC|{4tfZ8#KPaFU5}324}_Ult2IBx;@a(PE4^&f1vb~Ntp*w^;J!*B*9^U z=*>b>$a{SFI6WWd9}b6LTe2vi(4MUkHX{vJBb-SpO4c#tVZX0cy9^YjR|Jo~Nclik z;t@A0)x}}SN(i8kmUcHr=^xiEl9I7m`oQ)2MNz9Q|JimRtVed@cUCZmiTR9Apkq6x z10L{??mHup0*^)ii!!~1F{LaHt;2@yS!|=dVd(~*Ze52%+6b<=3tE7W`rp|LiW}x>ChHN^Jk4O8490ngPVbxp(Z}@*(ZO=6&F?5!x znq0UPsN=TN(13?bN9ds>=8#0kP4v&v(?H&Z5`Ge)9(0@@!6FMnSE(p{DwB#6Y5 zE7YNIg0mxDkUK>(Qe*bx#3VuEHPkss4`(Qcf7b{%xMIKXv!xyU-S6xA8?$5uu(~qbJe>K^s z=`!5kK$Ep0byH$P4Yj_$+P;z|y8iVQd%X_dDp+);z$1xO!e#5}!AV2B_w;+Vc4IZC zX_MU+kcV=Ne(A0;?f3L!R*BI#yg%8s8A(1=Q9VV4ivddeI{ICNCqX}f?~9S{)vb>Z z-y`8Uk}!Fr8Y=O0y=qS56TFEwi<8cTdynUf`}^A?nIZ!9rFo~cZrOm%>?hl zMU6irwN4zL>Rx4VdIU;${C(FwieTQ5g|Ye?Cg6I-+DLaTq8`$+#f1f5UR=T5hc$1g zVrBL(16T+a3YX9lq;UysbH-sHe_(7Q*c#l)Iw7>w4M!dZW>FQzJqBN$G#&u*fNZHs zgOxBQ;DgZ#ckgc07Qns-+#=u_xD$&wsRpkUe<5A8f81qi$|C~1{CJQO4m^-ND-K5h z`<_D~VB1Nyy=s)Yq24m~YTiUj!-ZEPpD(qv-5OFK2^_q%X%++`PXw3NBxH}BMNY2p z5FpRE3SfbWTZ=nX*n$?O6S+LV3TDET0nQ7PXJItcw~A6bzx-#gTmxk!;ApduvGc(@ zdFDZ!5c()f=q_k?G>9w>FoHSMV{I}`6xpVsGfmRF7Z&M#fvAFz=t)B~E@!?EEk zsZ5m_hNo23Vv`i&`V$n4WgITsnkhg%k5G<=UF%lzII*;J4oh4gpI-hyaH3$W5|gWENK0D=X>dJ#&vc*EH(?_>u# zOepuJrs~GNwy&$wZ-MK*L40ww($CP)u}{c)!eH}Fp{Tcu>z>&Z^RoH&Lo5k(>Q~noe0r1vmzg<)3 z9L_XlnHDCiTqMsoE3H&~b~x{2d0w+i_3hQ3vx-tDT;4WDeE*b9Wo$gnM9pWlQgMl? zsjl1^cvB2GwBT`!dCH^ex6;1HyZ_H1#eYNzqK3gj#{v+%019A89yY!AY1vKX z5MfWWSk`j?#!~&WGM{_d;?7mHbo=U6M&aH2hmth%`=LV70;!os*!`*i2Nk}qZ1adK z0jE_y+<$|^)dR*fI0J$hK+r^1laumlM&G172~1R!UYI1;rD&wLE^JqLlK;Hle^=wv zuXL;Yuk}Q`gYxadhcElN2B0ytkd&erf2RbZdi+>xPR0m8a1n6oI80?WNW{ucaB*b= zaAlop)tGV>XpF&q509RL7`l>g3uLc4vc1ph>1^<3xUfosy7$}ZITAVczgFU{O^^#A zQbm)F;aCeS((Cz@G!Jb?&{nrFJL~uHn(KHT$D<$0a{H1lkUv1l2?3xGW0h@DAQj*T zEIWd_b$@YtsMME)E4o0rPU@_x3#T(S?*l(SPlWM%^E9=X^PiXaZ?RsO^&@-yADK?q zjrEVy-*dcMo%k1nW_Z`x)dqVIe)A-m`CZ|VkNQw>loiC{3F^7;540sJUh9@K(#K~U z67c-+LGCsI*qERhh|me4mwh1uo{N?!#udJ(_Ki>HIJPM!^3(khAh$@_suiNpT^6UC zM2i$4Gdlm6P;xDl!qB%|Q9q+SMEu31ijal23~*}^Kq5VPBE)MP*jXUJd6rlWV%5XU z_95s9f%GEK7}X0eW+ZcJ6@7&Ov5){Y(Am(3TH`7)Qj!?Xjv`_8P?-;CaG|`l2c>jA zLD*@kkT$In2E}hIw1Yul8^@iKQ;>Zul&&OOPz7q}dF&nN2*Ajxf}_F&vLR1bsLJ>5 z9aS!{J2f#5f{Y@wZkFcfKy_wHJ3+BRSON&TRjjG{lR{jZ&1lp6SL2sY%0aP_WyZVM z0AyjMrljBf@8x%+n!wKl+YPL;r4b!gp=H0gPU17$R~=h5c+EO_4#`Z+PXZhcOh#sq z=2`HzRD|N{cmmWU7K66E;?UT|XKp?PsXA7x7#g4~ggXEd%jjSb)URTMcTV?$Qp&h0 zb(U`B8B@NGs@xYo{CObDL`A|OQBehWHnz~}ogIqx5w#1YMvc}36=`vi&e!)Kirk>{ zryWr0IZqHpUvv@Ms7@dv$7F_TFWKi})uYFcb2n%*8b+>n})dJPCN)B}SXA&wLo`E2^k|w=FWd`1 zyeJ&M`Jl6VQ&`OzCh)ENUUK0lY^fqs(I$;iS?AV=a)I_3g}3#LD`)|sl{gQ5X_iDX z>&$|DTyTL`H6Y-tunRm)K}(E)bquIlRXTlEP=2bwGrk^A`WpP+xD=jkM)hgj89BAA zWF6^|-a%Y3pK-M}BY83VB22E6DSmS%0gcV@T%07!YNIA{{a8}JpXX6dEL$=s0FWkf z)l%nM+H88T%I~gsnV+FN(b9S;rOh2*wX1M>$ap0UY|c6!JbH8oxVv)C<-V_}im|+I z0h++gmNPpjC=pYK--PleosyIAB4W+XtK?cH*A&f4owBZK1UA!ogM4J71pKF}E6D_IG+w&3AWCYfW%Zyv7}QY}Af2e-%{HnkziOiZMFSmwe~}kos>@MH=*NW4 z{3;h0!UZV4+pq*9XbK)<&1(AZdqIA7_B|RPnw@dk3WDNpp4BF!A8d%vjfm|yPICs3 zv~hbSWoi@3TJ_!oq(zkVl+09>7i1(HPJ~rN_IX>us+oed6b~5B22XrVeRpN>A;c^c zpu+kv@3$qQYA0r;$Kl-VYS5nz0z;{=!X?FqMj2TrglB3`;Au=3H%fG$DhZDMm+k7N zYEkZXtN5494E;vC`Y55cE2SAbjjK;si}6D9L}0cz(v%Bt(@Gzci^&-XtrP1_X0ro6 zdIP}*5d~HTk$FtQs@P+Pxj$Ws=+BI@5rTH**ekWi9K12@DIKvFd55}fL#xJ-!-hlR z^$qN0^PWR$Yd$iQpzNYMjz~%UQHyDYgJoU{dO{%MTq#z9QZ}>SycpXOR7n8e)34)6 zG3Qb*E^RF7b65Ah?SHL`J~(v}8oSy!0Pol6X8E|b&^`p5 zYjwWFojWn))nSkArnlEXcLk?IJ5DQCF^PYH7jNqh zR(UqleYScZamDKn`!(F#-Tk0?f*t@aS2*rLZccNgDODyk4?3Hz;PJ1VfNcPe2EnA3;js=<)gpVUMt)wb!7EUxgl>hpv#jK$2iT znHvW_cBk?uI?{8KgDOhzDV@M&Ara*Viq~W@=O=Y!9Hfpf>Qf?YPI6u{dJmn4#9tl2 z%tvcsv^f!0X{tcMxGwA(sE6o8MN-iB=%U45oQ5_RkTS&-Pv}+$Vk%ylt^C>n95a3; zd7arKC7y;g-?sj|%B(nf@W#9Azkp#)R}Nc;PLU%<4c>qjb9&R}*c8AwaxceP@RHiy zZ$fI0&N69)j(9{Kqrs(8E~o;G54V3qt4f!cWTv-D6H#063FBaK~w4Yt8XxsM)H zw_%(4%_$LC@fDPSvtwqB^Xfzt=!uCY?h+2U;erMU0ihA^eK3tte_0m6MjT;=WX0aW zfr|dCxJFnNxb4zdesv(#a67jrg-jKByrKqci8Izx^_8!UA@&@P}`M+Tt!E2|SslM^U14Tmp!6W_Z-;-0Q zIs5p`a5TV^^%SnE8Mn*AR-1)`$>XSxBk(-4&UZ775?XTG8?25TX#%smkF)pdBLv{A z#UL`&gQvXz&E(Exw!4o_oyuETK(Ws}i=u@|(5nMn&rVBz{C>$%F0Uqk;$INHUt+2^ z-_{J?op)mSFaCTScF~{#vVEnX!`H)p$QPh$>nfXo=Dja4-v58q5&U2B>Y*>9&|nEy zKFFZonRT3akH{|MSkhn0JovH5Y3@3-RPFz5CjR^7Z-WF3RbSkgfCirW%B{c{DU{0w z;!Tjpz!mok{NvjGUESXDwY!Bq2CxQr-M}F_?+Zkq<$c%~@g93;zK_S-l0$^0(Ab8( zgbRMXRAk;O zbbJb*>GqG$n@89E45`VZCNIMjF!w*2JD-`+Uw$}u^4x6BtS3n|{o#hN2OuWMBnm(g zFjN4Rp1*hIK9XvF<3eGM#yP-a2Od=Fgg9jjW=A7A39cW$(658X+T+r zG<`vu>U0f+^q}&*5P(=!2ZEV=FE?d`NTDo@c*$@Ta)#gq+rAhfkp7?*7y_6OG&X$J z?uULc&Xd=V#mxS#ZWzs;Jn z!(@Py3!w64ypn%&by9)gMyk^ACb@+%MZ3yoeD9j|oXH41=LNsU~=# z^k^g?W<{P|MTObAl}GhHXcf1uq>Z)P8luF+1V>%tbI`kz>6{AMz7>CNEytOn8lD@?Zd-%GZ07;zmZNnH^cl#=*R`ACzYbM(EB6%uprd2W7Rx^-O08;MdS(rd;4)>*7ssVS5Q-5b#ewy7mUd zfgeX;F6Qh*NAcq^VnqlAmNPmi?n9N;rXi!ou4 zZm=d0*)|V>q^@=H1~>_^mIXlll`MQtVTe`06Dcb1=UQ?ZyDG$yg5s#zozM7$^1FyJ z`XI-&!8stT0y;J&g@5M2SfX#3R2K?7On!NPMZ#FzVG_+r-G;Brr(s3Xj7f&y0iRdT zd6bg}twVY-7LS%5Ss^tCc)4=T+-DGu zZnsUFyIwVIfG@=AP`)7DI(j8kiYl+HgFR>g0HL@Y%mYFMcFu9?V9-QHd1f0cX)yvb zS_J7_q*jPKjaFluEhI8!6bD9Knk*g-RHbB8KSO}wo)^5R`%it3Rs+4V zFh$@h(JBw!V)+j_*p(MlTq$>BbfFsq@9+|wVt_%DjaXYul30M^%kt{g2&dJd;}q<2 z>&kobt&R0n0a&q%k-`~?#-6bptXglBFa?WVJyo_*I6=p+ZS1*sPSB>t{~8Q!O}XS< z%?K(fH|^30AMYM>dh@Ovdw@w=blAR#{eb)QROSAdX%|o=(Sl}fsQo_Be*W8J2Aeyi8a@k#P;<1dqcD<{cpbr6!e(|y{`cWIf$B7-68SGtI_;^GU+p-BNsLKaOqEGt15RL@sE$_eV zuKalXN*e>6PfU4_&cc}3=I@UC!EIHfaS|@~OfCA~?aY#CzNcut`+xZ0Sx1p!3}ZQW zid^p^M@-6?+5dFOMMXss^}}hLb3$^>m%IrV4p8--(QZr~Q?@k`3S@NfX~j`(3fVtM zr)>+rKV17(EAVYSF0iH8v-Oa6?D%@}8&yoFyS?}CyC!cdq)c9Ii{hUg{QvdCykCF2 zjw!Z(U+(AL5E`Za7(y#yXaB{1o&MMB+tUwvhJRB@9m`8htV*ky6RJ*Y9-XJ!dcCJb z;+i?C(}e1)(~=Vt$MPN=YwMo0W~z1Ph>0~!X*b^7J4M6W6KtkMVB6IXN1cKHX}-h} zV?p1(_1jLp*`{jk3xk$!T$OWc?B6~c6LD1BB3GT52UzUXs$t0XXZw^h$2`vO?x%x~ zQ3)*G`t2u+9M!Y-g>BYO`Q3M=e9CnqhOM(5x+T*4FMBVp3irV7j5SP5-1aiqF{PlW z*nA0o=0CZ(df6K;KfilSB!p%d Hay un conjunto de criaturas diferentes y a menudo necesitamos seleccionar algún subconjunto de ellas. Podemos +> escribir nuestra especificación de búsqueda como "criaturas que puedan volar", "criaturas de más de 500 +> kilogramos", o como una combinación de otras especificaciones de búsqueda. +> que realizará el filtrado. + +En palabras sencillas + +> El patrón de especificación nos permite separar los criterios de búsqueda del objeto que realiza la +> búsqueda. + +Wikipedia dice + +> En programación informática, el patrón de especificación es un patrón particular de diseño de software, +> por el cual las reglas de negocio pueden ser recombinadas encadenando las reglas de negocio usando lógica booleana +> lógica booleana. + +**Ejemplo programático** + +Si nos fijamos en nuestro ejemplo anterior, tenemos un conjunto de criaturas con ciertas propiedades. +propiedades. Esas propiedades pueden formar parte de un conjunto predefinido y limitado (representado aquí por los +enums Tamaño, Movimiento y Color); pero también pueden ser valores continuos (por ejemplo, la masa de una +criatura). En este caso, es más apropiado utilizar lo que llamamos "especificación parametrizada", +en la que el valor de la propiedad puede darse como argumento al instanciar la criatura, lo que permite +mayor flexibilidad. Una tercera opción es combinar propiedades predefinidas y/o parametrizadas utilizando +lógica booleana, lo que permite posibilidades de selección casi ilimitadas (esto se denomina "especificación compuesta", véase más adelante). +especificación compuesta", véase más adelante). Los pros y los contras de cada enfoque se detallan en la tabla al final de este documento. +de este documento. + +```java +public interface Creature { + String getName(); + Size getSize(); + Movement getMovement(); + Color getColor(); + Mass getMass(); +} +``` + +Y la implementación de `Dragon` tiene este aspecto. + +```java +public class Dragon extends AbstractCreature { + + public Dragon() { + super("Dragon", Size.LARGE, Movement.FLYING, Color.RED, new Mass(39300.0)); + } +} +``` + +Ahora que queremos seleccionar algún subconjunto de ellos, utilizamos selectores. Para seleccionar criaturas que vuelan +debemos usar `MovementSelector`. + +```java +public class MovementSelector extends AbstractSelector { + + private final Movement movement; + + public MovementSelector(Movement m) { + this.movement = m; + } + + @Override + public boolean test(Creature t) { + return t.getMovement().equals(movement); + } +} +``` + +Por otro lado, cuando seleccionamos criaturas más pesadas que una cantidad elegida, usamos +`MassGreaterThanSelector`. + +```java +public class MassGreaterThanSelector extends AbstractSelector { + + private final Mass mass; + + public MassGreaterThanSelector(double mass) { + this.mass = new Mass(mass); + } + + @Override + public boolean test(Creature t) { + return t.getMass().greaterThan(mass); + } +} +``` + +Con estos elementos en su lugar, podemos realizar una búsqueda de criaturas rojas de la siguiente manera: + +```java + var redCreatures = creatures.stream().filter(new ColorSelector(Color.RED)) + .collect(Collectors.toList()); +``` + +Pero también podríamos usar nuestro selector parametrizado así: + +```java + var heavyCreatures = creatures.stream().filter(new MassGreaterThanSelector(500.0) + .collect(Collectors.toList()); +``` + +Nuestra tercera opción es combinar varios selectores. La búsqueda de criaturas especiales +(definidas como rojas, voladoras y no pequeñas) podría hacerse de la siguiente manera: + +```java + var specialCreaturesSelector = + new ColorSelector(Color.RED).and(new MovementSelector(Movement.FLYING)).and(new SizeSelector(Size.SMALL).not()); + + var specialCreatures = creatures.stream().filter(specialCreaturesSelector) + .collect(Collectors.toList()); +``` + +**Más información sobre las especificaciones de los compuestos** + +En Composite Specification, crearemos instancias personalizadas de `AbstractSelector` combinando +otros selectores (llamados "hojas") utilizando los tres operadores lógicos básicos. Éstos se implementan en +ConjunctionSelector`, `DisjunctionSelector` y `NegationSelector`. + +```java +public abstract class AbstractSelector implements Predicate { + + public AbstractSelector and(AbstractSelector other) { + return new ConjunctionSelector<>(this, other); + } + + public AbstractSelector or(AbstractSelector other) { + return new DisjunctionSelector<>(this, other); + } + + public AbstractSelector not() { + return new NegationSelector<>(this); + } +} +``` + +```java +public class ConjunctionSelector extends AbstractSelector { + + private final List> leafComponents; + + @SafeVarargs + ConjunctionSelector(AbstractSelector... selectors) { + this.leafComponents = List.of(selectors); + } + + /** + * Tests if *all* selectors pass the test. + */ + @Override + public boolean test(T t) { + return leafComponents.stream().allMatch(comp -> (comp.test(t))); + } +} +``` + +Todo lo que queda por hacer ahora es crear selectores de hoja (ya sean de código duro o parametrizados) que +sean lo más genéricos posible, y podremos instanciar la clase ``AbstractSelector`` combinando +cualquier cantidad de selectores, como se ejemplificó anteriormente. Debemos tener cuidado, sin embargo, ya que es fácil +cometer un error al combinar muchos operadores lógicos; en particular, debemos prestar atención a la prioridad de las operaciones. +la prioridad de las operaciones. En general, la especificación compuesta es una gran manera de escribir más +código reutilizable, ya que no es necesario crear una clase Selector para cada operación de filtrado. En su lugar +simplemente creamos una instancia de ``AbstractSelector`` "sobre la marcha", utilizando selectores genéricos de "hoja" y algunos selectores booleanos básicos. +y alguna lógica booleana básica. + +**Comparación de los distintos enfoques** + +| Patrón | Uso | Pros | Contras | +|---|---|---|---| +| Especificación Codificada | Los criterios de selección son pocos y se conocen de antemano | + Fácil de implementar | - Inflexible | +| | | + Expresivo | +| Especificación Parametrizada | Los criterios de selección abarcan un amplio rango de valores (por ejemplo, masa, velocidad,...) | + Alguna flexibilidad | - Aún requiere clases de propósito especial | +| Especificación Compuesta | Hay muchos criterios de selección que se pueden combinar de múltiples maneras, por lo tanto, no es factible crear una clase para cada selector | + Muy flexible, sin requerir muchas clases especializadas | - Algo más difícil de comprender | +| | | + Admite operaciones lógicas | - Todavía necesitas crear las clases base utilizadas como hojas | +## Class diagram + +![alt text](./etc/specification.png "Specification") + +## Diagrama de clases + +Utilice el patrón Specification cuando + +* Necesitas seleccionar un subconjunto de objetos basándote en algún criterio, y refrescar la selección en varios momentos. +* Necesita comprobar que sólo se utilizan objetos adecuados para una determinada función (validación). + +## Patrones relacionados + +* Repository + +## Créditos + +* [Martin Fowler - Specifications](http://martinfowler.com/apsupp/spec.pdf) diff --git a/localization/es/specification/etc/specification.png b/localization/es/specification/etc/specification.png new file mode 100644 index 0000000000000000000000000000000000000000..60fb0402d8d3fa8f087053ceb7ada7a931c70b1e GIT binary patch literal 49425 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