From 8871f788d2564ff383e5527a6db45aa5b3edcc79 Mon Sep 17 00:00:00 2001 From: Kamil Pietruszka Date: Fri, 10 Mar 2017 20:08:58 +0100 Subject: [PATCH 1/6] #497 Converter pattern implementation --- converter/README.md | 25 ++++++ converter/pom.xml | 21 +++++ .../main/java/com/iluwatar/converter/App.java | 44 ++++++++++ .../com/iluwatar/converter/Converter.java | 86 +++++++++++++++++++ .../java/com/iluwatar/converter/User.java | 69 +++++++++++++++ .../java/com/iluwatar/converter/UserDto.java | 69 +++++++++++++++ .../java/com/iluwatar/converter/AppTest.java | 35 ++++++++ pom.xml | 3 +- 8 files changed, 351 insertions(+), 1 deletion(-) create mode 100644 converter/README.md create mode 100644 converter/pom.xml create mode 100644 converter/src/main/java/com/iluwatar/converter/App.java create mode 100644 converter/src/main/java/com/iluwatar/converter/Converter.java create mode 100644 converter/src/main/java/com/iluwatar/converter/User.java create mode 100644 converter/src/main/java/com/iluwatar/converter/UserDto.java create mode 100644 converter/src/test/java/com/iluwatar/converter/AppTest.java diff --git a/converter/README.md b/converter/README.md new file mode 100644 index 000000000..cbca98e8f --- /dev/null +++ b/converter/README.md @@ -0,0 +1,25 @@ +--- +layout: pattern +title: Converter +folder: converter +permalink: /patterns/converter/ +categories: +tags: + - Java + - Difficulty-Beginner +--- + +## Intent +TODO + +![alt text](./etc/converter.png "TODO") + +## Applicability +TODO + +* TODO 1 +* TODO 2 + +## Credits + +* [Converter](http://todo.com) diff --git a/converter/pom.xml b/converter/pom.xml new file mode 100644 index 000000000..53eca720b --- /dev/null +++ b/converter/pom.xml @@ -0,0 +1,21 @@ + + + + java-design-patterns + com.iluwatar + 1.15.0-SNAPSHOT + + 4.0.0 + + + junit + junit + test + + + converter + + + diff --git a/converter/src/main/java/com/iluwatar/converter/App.java b/converter/src/main/java/com/iluwatar/converter/App.java new file mode 100644 index 000000000..593240b43 --- /dev/null +++ b/converter/src/main/java/com/iluwatar/converter/App.java @@ -0,0 +1,44 @@ +/** + * 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; + +/** + * + * + */ +public class App { + /** + * Program entry point + * + * @param args command line args + */ + public static void main(String[] args) { + Converter userConverter = new Converter<>( + userDto -> new User(userDto.getName(), userDto.getSurname(), userDto.isActive()), + user -> new UserDto(user.getName(), user.getSurname(), user.isActive())); + UserDto dtoUser = new UserDto("John", "Doe", true); + User user = userConverter.convertFromDTO(dtoUser); + UserDto dtoUserCopy = userConverter.convertFromEntity(user); + + } +} diff --git a/converter/src/main/java/com/iluwatar/converter/Converter.java b/converter/src/main/java/com/iluwatar/converter/Converter.java new file mode 100644 index 000000000..0b3531a22 --- /dev/null +++ b/converter/src/main/java/com/iluwatar/converter/Converter.java @@ -0,0 +1,86 @@ +/** + * 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 java.util.Collection; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @param + * @param + */ +public class Converter { + /** + * + */ + private final Function fromDTO; + /** + * + */ + private final Function fromEntity; + + /** + * @param fromDTO + * @param fromEntity + */ + public Converter(final Function fromDTO, final Function fromEntity) { + this.fromDTO = fromDTO; + this.fromEntity = fromEntity; + } + + /** + * @param arg + * @return + */ + public U convertFromDTO(final T arg) { + return fromDTO.apply(arg); + } + + /** + * @param arg + * @return + */ + public T convertFromEntity(final U arg) { + return fromEntity.apply(arg); + } + + /** + * @param arg + * @return + */ + public List createFromDTOs(final Collection arg) { + return arg.stream().map(this::convertFromDTO).collect(Collectors.toList()); + } + + /** + * @param arg + * @return + */ + public List createFromEntities(final Collection arg) { + return arg.stream().map(this::convertFromEntity).collect(Collectors.toList()); + } + +} diff --git a/converter/src/main/java/com/iluwatar/converter/User.java b/converter/src/main/java/com/iluwatar/converter/User.java new file mode 100644 index 000000000..bcd09c1cc --- /dev/null +++ b/converter/src/main/java/com/iluwatar/converter/User.java @@ -0,0 +1,69 @@ +/** + * 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; + +/** + * Created by crossy on 2017-03-10. + */ +public class User { + private String name; + private String surname; + private boolean isActive; + + /** + * + * @param name + * @param surname + * @param isActive + */ + public User(String name, String surname, boolean isActive) { + this.name = name; + this.surname = surname; + this.isActive = isActive; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSurname() { + return surname; + } + + public void setSurname(String surname) { + this.surname = surname; + } + + public boolean isActive() { + return isActive; + } + + public void setActive(boolean active) { + isActive = active; + } +} diff --git a/converter/src/main/java/com/iluwatar/converter/UserDto.java b/converter/src/main/java/com/iluwatar/converter/UserDto.java new file mode 100644 index 000000000..aaff1e623 --- /dev/null +++ b/converter/src/main/java/com/iluwatar/converter/UserDto.java @@ -0,0 +1,69 @@ +/** + * 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; + +/** + * + */ +public class UserDto { + private String name; + private String surname; + private boolean isActive; + + /** + * + * @param name + * @param surname + * @param isActive + */ + public UserDto(String name, String surname, boolean isActive) { + this.name = name; + this.surname = surname; + this.isActive = isActive; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSurname() { + return surname; + } + + public void setSurname(String surname) { + this.surname = surname; + } + + public boolean isActive() { + return isActive; + } + + public void setActive(boolean active) { + isActive = active; + } +} 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/pom.xml b/pom.xml index 5ddd3bf98..8a012665d 100644 --- a/pom.xml +++ b/pom.xml @@ -134,6 +134,7 @@ event-asynchronous queue-load-leveling object-mother + converter @@ -466,4 +467,4 @@ - \ No newline at end of file + From e8b634c33e03f57af5e87364a55d898a32518216 Mon Sep 17 00:00:00 2001 From: Kamil Pietruszka Date: Fri, 10 Mar 2017 20:59:24 +0100 Subject: [PATCH 2/6] java docs added --- .../main/java/com/iluwatar/converter/App.java | 10 ++-- .../com/iluwatar/converter/Converter.java | 47 +++++++++---------- .../java/com/iluwatar/converter/User.java | 35 +++++++------- .../java/com/iluwatar/converter/UserDto.java | 36 +++++++------- 4 files changed, 58 insertions(+), 70 deletions(-) diff --git a/converter/src/main/java/com/iluwatar/converter/App.java b/converter/src/main/java/com/iluwatar/converter/App.java index 593240b43..91fbb98f8 100644 --- a/converter/src/main/java/com/iluwatar/converter/App.java +++ b/converter/src/main/java/com/iluwatar/converter/App.java @@ -22,10 +22,6 @@ */ package com.iluwatar.converter; -/** - * - * - */ public class App { /** * Program entry point @@ -34,10 +30,10 @@ public class App { */ public static void main(String[] args) { Converter userConverter = new Converter<>( - userDto -> new User(userDto.getName(), userDto.getSurname(), userDto.isActive()), - user -> new UserDto(user.getName(), user.getSurname(), user.isActive())); + userDto -> new User(userDto.getFirstName(), userDto.getLastName(), userDto.isActive()), + user -> new UserDto(user.getFirstName(), user.getLastName(), user.isActive())); UserDto dtoUser = new UserDto("John", "Doe", true); - User user = userConverter.convertFromDTO(dtoUser); + User user = userConverter.convertFromDto(dtoUser); UserDto dtoUserCopy = userConverter.convertFromEntity(user); } diff --git a/converter/src/main/java/com/iluwatar/converter/Converter.java b/converter/src/main/java/com/iluwatar/converter/Converter.java index 0b3531a22..7f7a702cd 100644 --- a/converter/src/main/java/com/iluwatar/converter/Converter.java +++ b/converter/src/main/java/com/iluwatar/converter/Converter.java @@ -29,55 +29,52 @@ import java.util.function.Function; import java.util.stream.Collectors; /** - * @param - * @param + * @param DTO representation's type + * @param Domain representation's type */ public class Converter { - /** - * - */ - private final Function fromDTO; - /** - * - */ + + private final Function fromDto; private final Function fromEntity; /** - * @param fromDTO - * @param fromEntity + * @param fromDto Function that converts given dto entity into the domain entity. + * @param fromEntity Function that converts given domain entity into the dto entity. */ - public Converter(final Function fromDTO, final Function fromEntity) { - this.fromDTO = fromDTO; + public Converter(final Function fromDto, final Function fromEntity) { + this.fromDto = fromDto; this.fromEntity = fromEntity; } /** - * @param arg - * @return + * @param arg DTO entity + * @return The domain representation - the result of the converting function application on dto entity. */ - public U convertFromDTO(final T arg) { - return fromDTO.apply(arg); + public U convertFromDto(final T arg) { + return fromDto.apply(arg); } /** - * @param arg - * @return + * @param arg domain entity + * @return The DTO representation - the result of the converting function application on domain entity. */ public T convertFromEntity(final U arg) { return fromEntity.apply(arg); } /** - * @param arg - * @return + * @param arg collection of DTO entities + * @return List of domain representation of provided entities retrieved by + * mapping each of them with the convertion function */ - public List createFromDTOs(final Collection arg) { - return arg.stream().map(this::convertFromDTO).collect(Collectors.toList()); + public List createFromDtos(final Collection arg) { + return arg.stream().map(this::convertFromDto).collect(Collectors.toList()); } /** - * @param arg - * @return + * @param arg collection of domain entities + * @return List of domain representation of provided entities retrieved by + * mapping each of them with the convertion function */ public List createFromEntities(final Collection arg) { return arg.stream().map(this::convertFromEntity).collect(Collectors.toList()); diff --git a/converter/src/main/java/com/iluwatar/converter/User.java b/converter/src/main/java/com/iluwatar/converter/User.java index bcd09c1cc..8a4e9186c 100644 --- a/converter/src/main/java/com/iluwatar/converter/User.java +++ b/converter/src/main/java/com/iluwatar/converter/User.java @@ -23,40 +23,37 @@ package com.iluwatar.converter; -/** - * Created by crossy on 2017-03-10. - */ public class User { - private String name; - private String surname; + private String firstName; + private String lastName; private boolean isActive; /** * - * @param name - * @param surname - * @param isActive + * @param firstName user's first name + * @param lastName user's last name + * @param isActive flag indicating whether the user is active */ - public User(String name, String surname, boolean isActive) { - this.name = name; - this.surname = surname; + public User(String firstName, String lastName, boolean isActive) { + this.firstName = firstName; + this.lastName = lastName; this.isActive = isActive; } - public String getName() { - return name; + public String getFirstName() { + return firstName; } - public void setName(String name) { - this.name = name; + public void setFirstName(String firstName) { + this.firstName = firstName; } - public String getSurname() { - return surname; + public String getLastName() { + return lastName; } - public void setSurname(String surname) { - this.surname = surname; + public void setLastName(String lastName) { + this.lastName = lastName; } public boolean isActive() { diff --git a/converter/src/main/java/com/iluwatar/converter/UserDto.java b/converter/src/main/java/com/iluwatar/converter/UserDto.java index aaff1e623..bdadf6e39 100644 --- a/converter/src/main/java/com/iluwatar/converter/UserDto.java +++ b/converter/src/main/java/com/iluwatar/converter/UserDto.java @@ -23,40 +23,38 @@ package com.iluwatar.converter; -/** - * - */ + public class UserDto { - private String name; - private String surname; + private String firstName; + private String lastName; private boolean isActive; /** * - * @param name - * @param surname - * @param isActive + * @param firstName user's first name + * @param lastName user's last name + * @param isActive flag indicating whether the user is active */ - public UserDto(String name, String surname, boolean isActive) { - this.name = name; - this.surname = surname; + public UserDto(String firstName, String lastName, boolean isActive) { + this.firstName = firstName; + this.lastName = lastName; this.isActive = isActive; } - public String getName() { - return name; + public String getFirstName() { + return firstName; } - public void setName(String name) { - this.name = name; + public void setFirstName(String firstName) { + this.firstName = firstName; } - public String getSurname() { - return surname; + public String getLastName() { + return lastName; } - public void setSurname(String surname) { - this.surname = surname; + public void setLastName(String lastName) { + this.lastName = lastName; } public boolean isActive() { From 8632bafcd7dfc28c141dd24ad258da9abe951c10 Mon Sep 17 00:00:00 2001 From: Kamil Pietruszka Date: Sat, 11 Mar 2017 12:24:48 +0100 Subject: [PATCH 3/6] comments, tests and description --- .../iluwatar/api/gateway/ImageClientImpl.java | 2 +- .../iluwatar/api/gateway/PriceClientImpl.java | 2 +- converter/README.md | 16 +++-- converter/pom.xml | 4 ++ .../main/java/com/iluwatar/converter/App.java | 29 ++++++++- .../com/iluwatar/converter/Converter.java | 27 +++++---- .../java/com/iluwatar/converter/User.java | 45 +++++++++----- .../com/iluwatar/converter/UserConverter.java | 40 +++++++++++++ .../java/com/iluwatar/converter/UserDto.java | 46 ++++++++++----- .../com/iluwatar/converter/ConverterTest.java | 59 +++++++++++++++++++ 10 files changed, 219 insertions(+), 51 deletions(-) create mode 100644 converter/src/main/java/com/iluwatar/converter/UserConverter.java create mode 100644 converter/src/test/java/com/iluwatar/converter/ConverterTest.java 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 index cbca98e8f..190ae8bfc 100644 --- a/converter/README.md +++ b/converter/README.md @@ -10,16 +10,20 @@ tags: --- ## Intent -TODO +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. -![alt text](./etc/converter.png "TODO") +![alt text](./etc/converter.png "Converter Pattern") ## Applicability -TODO +Use the Converter Pattern in the following situations: -* TODO 1 -* TODO 2 +* 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://todo.com) +* [Converter](http://www.xsolve.pl/blog/converter-pattern-in-java-8/) diff --git a/converter/pom.xml b/converter/pom.xml index 53eca720b..026f30d40 100644 --- a/converter/pom.xml +++ b/converter/pom.xml @@ -14,6 +14,10 @@ junit test + + com.google.guava + guava + converter diff --git a/converter/src/main/java/com/iluwatar/converter/App.java b/converter/src/main/java/com/iluwatar/converter/App.java index 91fbb98f8..1d6076fd9 100644 --- a/converter/src/main/java/com/iluwatar/converter/App.java +++ b/converter/src/main/java/com/iluwatar/converter/App.java @@ -22,6 +22,18 @@ */ 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 @@ -30,11 +42,22 @@ public class App { */ public static void main(String[] args) { Converter userConverter = new Converter<>( - userDto -> new User(userDto.getFirstName(), userDto.getLastName(), userDto.isActive()), - user -> new UserDto(user.getFirstName(), user.getLastName(), user.isActive())); - UserDto dtoUser = new UserDto("John", "Doe", true); + userDto -> new User(userDto.getFirstName(), userDto.getLastName(), userDto.isActive(), + userDto.getEmail()), + user -> new UserDto(user.getFirstName(), user.getLastName(), user.isActive(), user.getUserId())); + + UserDto dtoUser = new UserDto("John", "Doe", true, "whatever[at]wherever.com"); User user = userConverter.convertFromDto(dtoUser); UserDto dtoUserCopy = userConverter.convertFromEntity(user); + ArrayList users = Lists.newArrayList(new User("Camile", "Tough", false, "124sad"), + new User("Marti", "Luther", true, "42309fd"), new User("Kate", "Smith", true, "if0243")); + System.out.println("Domain entities:"); + users.forEach(System.out::println); + + System.out.println("DTO entities converted from domain:"); + List dtoEntities = userConverter.createFromEntities(users); + dtoEntities.forEach(System.out::println); + } } diff --git a/converter/src/main/java/com/iluwatar/converter/Converter.java b/converter/src/main/java/com/iluwatar/converter/Converter.java index 7f7a702cd..eeabc4102 100644 --- a/converter/src/main/java/com/iluwatar/converter/Converter.java +++ b/converter/src/main/java/com/iluwatar/converter/Converter.java @@ -29,6 +29,9 @@ 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 DTO representation's type * @param Domain representation's type */ @@ -47,37 +50,37 @@ public class Converter { } /** - * @param arg DTO entity + * @param userDto DTO entity * @return The domain representation - the result of the converting function application on dto entity. */ - public U convertFromDto(final T arg) { - return fromDto.apply(arg); + public final U convertFromDto(final T userDto) { + return fromDto.apply(userDto); } /** - * @param arg domain entity + * @param user domain entity * @return The DTO representation - the result of the converting function application on domain entity. */ - public T convertFromEntity(final U arg) { - return fromEntity.apply(arg); + public final T convertFromEntity(final U user) { + return fromEntity.apply(user); } /** - * @param arg collection of DTO entities + * @param dtoUsers collection of DTO entities * @return List of domain representation of provided entities retrieved by * mapping each of them with the convertion function */ - public List createFromDtos(final Collection arg) { - return arg.stream().map(this::convertFromDto).collect(Collectors.toList()); + public final List createFromDtos(final Collection dtoUsers) { + return dtoUsers.stream().map(this::convertFromDto).collect(Collectors.toList()); } /** - * @param arg collection of domain entities + * @param users collection of domain entities * @return List of domain representation of provided entities retrieved by * mapping each of them with the convertion function */ - public List createFromEntities(final Collection arg) { - return arg.stream().map(this::convertFromEntity).collect(Collectors.toList()); + public final List createFromEntities(final Collection users) { + return users.stream().map(this::convertFromEntity).collect(Collectors.toList()); } } diff --git a/converter/src/main/java/com/iluwatar/converter/User.java b/converter/src/main/java/com/iluwatar/converter/User.java index 8a4e9186c..f40c01e79 100644 --- a/converter/src/main/java/com/iluwatar/converter/User.java +++ b/converter/src/main/java/com/iluwatar/converter/User.java @@ -23,44 +23,61 @@ 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 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) { + 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 void setFirstName(String firstName) { - this.firstName = firstName; - } - public String getLastName() { return lastName; } - public void setLastName(String lastName) { - this.lastName = lastName; - } - public boolean isActive() { return isActive; } - public void setActive(boolean active) { - isActive = active; + 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 { + + /** + * Constructor. + */ + public UserConverter() { + super(userDto -> new User(userDto.getFirstName(), userDto.getLastName(), userDto.isActive(), + userDto.getEmail()), + user -> new UserDto(user.getFirstName(), user.getLastName(), user.isActive(), + user.getUserId())); + } +} diff --git a/converter/src/main/java/com/iluwatar/converter/UserDto.java b/converter/src/main/java/com/iluwatar/converter/UserDto.java index bdadf6e39..8f55bbe0e 100644 --- a/converter/src/main/java/com/iluwatar/converter/UserDto.java +++ b/converter/src/main/java/com/iluwatar/converter/UserDto.java @@ -24,44 +24,62 @@ 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 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) { + 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 void setFirstName(String firstName) { - this.firstName = firstName; - } - public String getLastName() { return lastName; } - public void setLastName(String lastName) { - this.lastName = lastName; - } - public boolean isActive() { return isActive; } - public void setActive(boolean active) { - isActive = active; + 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/ConverterTest.java b/converter/src/test/java/com/iluwatar/converter/ConverterTest.java new file mode 100644 index 000000000..45cebc4e6 --- /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 converter = new Converter<>( + userDto -> new User(userDto.getFirstName(), userDto.getLastName(), userDto.isActive(), + String.valueOf(new Random().nextInt())), + user -> new UserDto(user.getFirstName(), user.getLastName(), user.isActive(), + user.getFirstName().toLowerCase() + user.getLastName().toLowerCase() + "@whatever.com")); + User u1 = new User("John", "Doe", false, "12324"); + UserDto userDto = converter.convertFromEntity(u1); + assertEquals(userDto.getEmail(), "johndoe@whatever.com"); + } + + /** + * Test whether converting a collection of Users to DTO Users and then converting them back to domain + * users returns an equal collection. + */ + @Test public void testCollectionConversion() { + ArrayList users = Lists.newArrayList(new User("Camile", "Tough", false, "124sad"), + new User("Marti", "Luther", true, "42309fd"), new User("Kate", "Smith", true, "if0243")); + List fromDtos = userConverter.createFromDtos(userConverter.createFromEntities(users)); + assertEquals(fromDtos, users); + } +} From 3a243eee6e77f46b72711706771b2d6e1394c525 Mon Sep 17 00:00:00 2001 From: Kamil Pietruszka Date: Sat, 11 Mar 2017 12:47:58 +0100 Subject: [PATCH 4/6] diagrams added --- converter/etc/Converter.png | Bin 0 -> 19389 bytes converter/etc/Converter.ucls | 51 +++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 converter/etc/Converter.png create mode 100644 converter/etc/Converter.ucls diff --git a/converter/etc/Converter.png b/converter/etc/Converter.png new file mode 100644 index 0000000000000000000000000000000000000000..01435ef5ae29dbda20c7078291a8c1c912003000 GIT binary patch literal 19389 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 Ir04hl0JmNfk^lez literal 0 HcmV?d00001 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 2ed7acbc31ef08e77fc6f0808a22ad86f47354ce Mon Sep 17 00:00:00 2001 From: Kamil Pietruszka Date: Sat, 11 Mar 2017 13:02:29 +0100 Subject: [PATCH 5/6] fixed checkstyle violations --- .../src/test/java/com/iluwatar/converter/ConverterTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/converter/src/test/java/com/iluwatar/converter/ConverterTest.java b/converter/src/test/java/com/iluwatar/converter/ConverterTest.java index 45cebc4e6..eccb81cf9 100644 --- a/converter/src/test/java/com/iluwatar/converter/ConverterTest.java +++ b/converter/src/test/java/com/iluwatar/converter/ConverterTest.java @@ -37,9 +37,9 @@ public class ConverterTest { */ @Test public void testCustomConverter() { Converter converter = new Converter<>( - userDto -> new User(userDto.getFirstName(), userDto.getLastName(), userDto.isActive(), + userDto -> new User(userDto.getFirstName(), userDto.getLastName(), userDto.isActive(), String.valueOf(new Random().nextInt())), - user -> new UserDto(user.getFirstName(), user.getLastName(), user.isActive(), + user -> new UserDto(user.getFirstName(), user.getLastName(), user.isActive(), user.getFirstName().toLowerCase() + user.getLastName().toLowerCase() + "@whatever.com")); User u1 = new User("John", "Doe", false, "12324"); UserDto userDto = converter.convertFromEntity(u1); @@ -52,7 +52,7 @@ public class ConverterTest { */ @Test public void testCollectionConversion() { ArrayList users = Lists.newArrayList(new User("Camile", "Tough", false, "124sad"), - new User("Marti", "Luther", true, "42309fd"), new User("Kate", "Smith", true, "if0243")); + new User("Marti", "Luther", true, "42309fd"), new User("Kate", "Smith", true, "if0243")); List fromDtos = userConverter.createFromDtos(userConverter.createFromEntities(users)); assertEquals(fromDtos, users); } From 77a534385cba9b357b4e73c57c42faebe74de0c3 Mon Sep 17 00:00:00 2001 From: Kamil Pietruszka Date: Sat, 11 Mar 2017 13:35:55 +0100 Subject: [PATCH 6/6] fixed pmd violation --- converter/src/main/java/com/iluwatar/converter/App.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/converter/src/main/java/com/iluwatar/converter/App.java b/converter/src/main/java/com/iluwatar/converter/App.java index 1d6076fd9..fbae0309d 100644 --- a/converter/src/main/java/com/iluwatar/converter/App.java +++ b/converter/src/main/java/com/iluwatar/converter/App.java @@ -48,7 +48,7 @@ public class App { UserDto dtoUser = new UserDto("John", "Doe", true, "whatever[at]wherever.com"); User user = userConverter.convertFromDto(dtoUser); - UserDto dtoUserCopy = userConverter.convertFromEntity(user); + System.out.println("Entity converted from DTO:" + user); ArrayList users = Lists.newArrayList(new User("Camile", "Tough", false, "124sad"), new User("Marti", "Luther", true, "42309fd"), new User("Kate", "Smith", true, "if0243"));