diff --git a/api-gateway/api-gateway-service/src/main/java/com/iluwatar/api/gateway/ImageClientImpl.java b/api-gateway/api-gateway-service/src/main/java/com/iluwatar/api/gateway/ImageClientImpl.java
index 10f8625c5..ebabfe839 100644
--- a/api-gateway/api-gateway-service/src/main/java/com/iluwatar/api/gateway/ImageClientImpl.java
+++ b/api-gateway/api-gateway-service/src/main/java/com/iluwatar/api/gateway/ImageClientImpl.java
@@ -35,7 +35,7 @@ import java.io.IOException;
* An adapter to communicate with the Image microservice
*/
@Component
-public class ImageClientImpl implements ImageClient{
+public class ImageClientImpl implements ImageClient {
/**
* Makes a simple HTTP Get request to the Image microservice
* @return The path to the image
diff --git a/api-gateway/api-gateway-service/src/main/java/com/iluwatar/api/gateway/PriceClientImpl.java b/api-gateway/api-gateway-service/src/main/java/com/iluwatar/api/gateway/PriceClientImpl.java
index aa2686845..87f44761c 100644
--- a/api-gateway/api-gateway-service/src/main/java/com/iluwatar/api/gateway/PriceClientImpl.java
+++ b/api-gateway/api-gateway-service/src/main/java/com/iluwatar/api/gateway/PriceClientImpl.java
@@ -35,7 +35,7 @@ import java.io.IOException;
* An adapter to communicate with the Price microservice
*/
@Component
-public class PriceClientImpl implements PriceClient{
+public class PriceClientImpl implements PriceClient {
/**
* Makes a simple HTTP Get request to the Price microservice
* @return The price of the product
diff --git a/converter/README.md b/converter/README.md
new file mode 100644
index 000000000..190ae8bfc
--- /dev/null
+++ b/converter/README.md
@@ -0,0 +1,29 @@
+---
+layout: pattern
+title: Converter
+folder: converter
+permalink: /patterns/converter/
+categories:
+tags:
+ - Java
+ - Difficulty-Beginner
+---
+
+## 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.
+
+
+
+## Applicability
+Use the Converter Pattern in the following situations:
+
+* When you have types that logically correspond which other and you need to convert entities between them
+* When you want to provide different ways of types conversions depending on a context
+* Whenever you introduce a DTO (Data transfer object), you will probably need to convert it into the domain equivalence
+
+## Credits
+
+* [Converter](http://www.xsolve.pl/blog/converter-pattern-in-java-8/)
diff --git a/converter/etc/Converter.png b/converter/etc/Converter.png
new file mode 100644
index 000000000..01435ef5a
Binary files /dev/null and b/converter/etc/Converter.png differ
diff --git a/converter/etc/Converter.ucls b/converter/etc/Converter.ucls
new file mode 100644
index 000000000..368657430
--- /dev/null
+++ b/converter/etc/Converter.ucls
@@ -0,0 +1,51 @@
+
+
+ * 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.converter;
+
+
+import com.google.common.collect.Lists;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * The Converter pattern is a behavioral design pattern which allows a common way of bidirectional
+ * conversion between corresponding types (e.g. DTO and domain representations of the logically
+ * isomorphic types). Moreover, the pattern introduces a common way of converting a collection of
+ * objects between types.
+ */
+public class App {
+ /**
+ * Program entry point
+ *
+ * @param args command line args
+ */
+ public static void main(String[] args) {
+ Converter
+ * 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.converter;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * Generic converter, thanks to Java8 features not only provides a way of generic bidirectional
+ * conversion between coresponding types, but also a common way of converting a collection of objects
+ * of the same type, reducing boilerplate code to the absolute minimum.
+ * @param
+ * 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.converter;
+
+import java.util.Objects;
+
+public class User {
+ private String firstName;
+ private String lastName;
+ private boolean isActive;
+ private String userId;
+
+ /**
+ * @param firstName user's first name
+ * @param lastName user's last name
+ * @param isActive flag indicating whether the user is active
+ * @param userId user's identificator
+ */
+ public User(String firstName, String lastName, boolean isActive, String userId) {
+ this.firstName = firstName;
+ this.lastName = lastName;
+ this.isActive = isActive;
+ this.userId = userId;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public boolean isActive() {
+ return isActive;
+ }
+
+ public String getUserId() {
+ return userId;
+ }
+
+ @Override public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ User user = (User) o;
+ return isActive == user.isActive && Objects.equals(firstName, user.firstName) && Objects
+ .equals(lastName, user.lastName) && Objects.equals(userId, user.userId);
+ }
+
+ @Override public int hashCode() {
+ return Objects.hash(firstName, lastName, isActive, userId);
+ }
+
+ @Override public String toString() {
+ return "User{" + "firstName='" + firstName + '\'' + ", lastName='" + lastName + '\''
+ + ", isActive=" + isActive + ", userId='" + userId + '\'' + '}';
+ }
+}
diff --git a/converter/src/main/java/com/iluwatar/converter/UserConverter.java b/converter/src/main/java/com/iluwatar/converter/UserConverter.java
new file mode 100644
index 000000000..9ef1d03c2
--- /dev/null
+++ b/converter/src/main/java/com/iluwatar/converter/UserConverter.java
@@ -0,0 +1,40 @@
+/**
+ * The MIT License
+ * Copyright (c) 2014-2016 Ilkka Seppälä
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+package com.iluwatar.converter;
+
+/**
+ * Example implementation of the simple User converter.
+ */
+public class UserConverter extends Converter
+ * 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.converter;
+
+
+import java.util.Objects;
+
+public class UserDto {
+
+ private String firstName;
+ private String lastName;
+ private boolean isActive;
+ private String email;
+
+ /**
+ * @param firstName user's first name
+ * @param lastName user's last name
+ * @param isActive flag indicating whether the user is active
+ * @param email user's email address
+ */
+ public UserDto(String firstName, String lastName, boolean isActive, String email) {
+ this.firstName = firstName;
+ this.lastName = lastName;
+ this.isActive = isActive;
+ this.email = email;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public boolean isActive() {
+ return isActive;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ @Override public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ UserDto userDto = (UserDto) o;
+ return isActive == userDto.isActive && Objects.equals(firstName, userDto.firstName) && Objects
+ .equals(lastName, userDto.lastName) && Objects.equals(email, userDto.email);
+ }
+
+ @Override public int hashCode() {
+ return Objects.hash(firstName, lastName, isActive, email);
+ }
+
+ @Override public String toString() {
+ return "UserDto{" + "firstName='" + firstName + '\'' + ", lastName='" + lastName + '\''
+ + ", isActive=" + isActive + ", email='" + email + '\'' + '}';
+ }
+}
diff --git a/converter/src/test/java/com/iluwatar/converter/AppTest.java b/converter/src/test/java/com/iluwatar/converter/AppTest.java
new file mode 100644
index 000000000..5198827d2
--- /dev/null
+++ b/converter/src/test/java/com/iluwatar/converter/AppTest.java
@@ -0,0 +1,35 @@
+/**
+ * The MIT License
+ * Copyright (c) 2014-2016 Ilkka Seppälä
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package com.iluwatar.converter;
+
+import org.junit.Test;
+
+public class AppTest {
+
+ @Test
+ public void testMain() {
+ String[] args = {};
+ App.main(args);
+ }
+
+}
diff --git a/converter/src/test/java/com/iluwatar/converter/ConverterTest.java b/converter/src/test/java/com/iluwatar/converter/ConverterTest.java
new file mode 100644
index 000000000..eccb81cf9
--- /dev/null
+++ b/converter/src/test/java/com/iluwatar/converter/ConverterTest.java
@@ -0,0 +1,59 @@
+package com.iluwatar.converter;
+
+import com.google.common.collect.Lists;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import static junit.framework.TestCase.assertEquals;
+
+public class ConverterTest {
+
+ private UserConverter userConverter = new UserConverter();
+
+ /**
+ * Tests whether a converter created of opposite functions holds equality as a bijection.
+ */
+ @Test public void testConversionsStartingFromDomain() {
+ User u1 = new User("Tom", "Hanks", true, "tom@hanks.com");
+ User u2 = userConverter.convertFromDto(userConverter.convertFromEntity(u1));
+ assertEquals(u1, u2);
+ }
+
+ /**
+ * Tests whether a converter created of opposite functions holds equality as a bijection.
+ */
+ @Test public void testConversionsStartingFromDto() {
+ UserDto u1 = new UserDto("Tom", "Hanks", true, "tom@hanks.com");
+ UserDto u2 = userConverter.convertFromEntity(userConverter.convertFromDto(u1));
+ assertEquals(u1, u2);
+ }
+
+ /**
+ * Tests the custom users converter. Thanks to Java8 lambdas, converter can be easily and
+ * cleanly instantiated allowing various different conversion strategies to be implemented.
+ */
+ @Test public void testCustomConverter() {
+ Converter