diff --git a/converter/src/main/java/com/iluwatar/converter/App.java b/converter/src/main/java/com/iluwatar/converter/App.java index fab472328..935fc4f19 100644 --- a/converter/src/main/java/com/iluwatar/converter/App.java +++ b/converter/src/main/java/com/iluwatar/converter/App.java @@ -23,12 +23,10 @@ package com.iluwatar.converter; - +import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -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 @@ -38,8 +36,9 @@ import java.util.List; public class App { private static final Logger LOGGER = LoggerFactory.getLogger(App.class); + /** - * Program entry point + * Program entry point. * * @param args command line args */ diff --git a/converter/src/main/java/com/iluwatar/converter/Converter.java b/converter/src/main/java/com/iluwatar/converter/Converter.java index 256acec24..10425e1ca 100644 --- a/converter/src/main/java/com/iluwatar/converter/Converter.java +++ b/converter/src/main/java/com/iluwatar/converter/Converter.java @@ -30,8 +30,9 @@ import java.util.stream.Collectors; /** * Generic converter, thanks to Java8 features not only provides a way of generic bidirectional - * conversion between corresponding types, but also a common way of converting a collection of objects - * of the same type, reducing boilerplate code to the absolute minimum. + * conversion between corresponding 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 */ @@ -41,7 +42,9 @@ public class Converter { private final Function fromEntity; /** - * @param fromDto Function that converts given dto entity into the domain entity. + * Constructor. + * + * @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) { @@ -50,34 +53,44 @@ public class Converter { } /** + * Converts DTO to Entity. + * * @param dto DTO entity - * @return The domain representation - the result of the converting function application on dto entity. + * @return The domain representation - the result of the converting function application on dto + * entity. */ public final U convertFromDto(final T dto) { return fromDto.apply(dto); } /** + * Converts Entity to DTO. + * * @param entity domain entity - * @return The DTO representation - the result of the converting function application on domain entity. + * @return The DTO representation - the result of the converting function application on domain + * entity. */ public final T convertFromEntity(final U entity) { return fromEntity.apply(entity); } /** + * Converts list of DTOs to list of Entities. + * * @param dtos collection of DTO entities - * @return List of domain representation of provided entities retrieved by - * mapping each of them with the conversion function + * @return List of domain representation of provided entities retrieved by mapping each of them + * with the conversion function */ public final List createFromDtos(final Collection dtos) { return dtos.stream().map(this::convertFromDto).collect(Collectors.toList()); } /** + * Converts list of Entities to list of DTOs. + * * @param entities collection of domain entities - * @return List of domain representation of provided entities retrieved by - * mapping each of them with the conversion function + * @return List of domain representation of provided entities retrieved by mapping each of them + * with the conversion function */ public final List createFromEntities(final Collection entities) { return entities.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 05d7313e0..ae5e89f7c 100644 --- a/converter/src/main/java/com/iluwatar/converter/User.java +++ b/converter/src/main/java/com/iluwatar/converter/User.java @@ -26,7 +26,7 @@ package com.iluwatar.converter; import java.util.Objects; /** - * User class + * User class. */ public class User { private String firstName; @@ -35,10 +35,12 @@ public class User { private String userId; /** + * Constructor. + * * @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 + * @param userId user's identificator */ public User(String firstName, String lastName, boolean isActive, String userId) { this.firstName = firstName; @@ -63,7 +65,8 @@ public class User { return userId; } - @Override public boolean equals(Object o) { + @Override + public boolean equals(Object o) { if (this == o) { return true; } @@ -72,15 +75,17 @@ public class User { } User user = (User) o; return isActive == user.isActive && Objects.equals(firstName, user.firstName) && Objects - .equals(lastName, user.lastName) && Objects.equals(userId, user.userId); + .equals(lastName, user.lastName) && Objects.equals(userId, user.userId); } - @Override public int hashCode() { + @Override + public int hashCode() { return Objects.hash(firstName, lastName, isActive, userId); } - @Override public String toString() { + @Override + public String toString() { return "User{" + "firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' - + ", isActive=" + isActive + ", userId='" + userId + '\'' + '}'; + + ", 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 index d26703cc2..8637c042d 100644 --- a/converter/src/main/java/com/iluwatar/converter/UserConverter.java +++ b/converter/src/main/java/com/iluwatar/converter/UserConverter.java @@ -33,8 +33,8 @@ public class UserConverter extends Converter { */ public UserConverter() { super(userDto -> new User(userDto.getFirstName(), userDto.getLastName(), userDto.isActive(), - userDto.getEmail()), + userDto.getEmail()), user -> new UserDto(user.getFirstName(), user.getLastName(), user.isActive(), - user.getUserId())); + 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 11413d2cb..eae77e901 100644 --- a/converter/src/main/java/com/iluwatar/converter/UserDto.java +++ b/converter/src/main/java/com/iluwatar/converter/UserDto.java @@ -23,11 +23,10 @@ package com.iluwatar.converter; - import java.util.Objects; /** - * User DTO class + * User DTO class. */ public class UserDto { @@ -37,6 +36,8 @@ public class UserDto { private String email; /** + * Constructor. + * * @param firstName user's first name * @param lastName user's last name * @param isActive flag indicating whether the user is active @@ -65,7 +66,8 @@ public class UserDto { return email; } - @Override public boolean equals(Object o) { + @Override + public boolean equals(Object o) { if (this == o) { return true; } @@ -74,15 +76,17 @@ public class UserDto { } UserDto userDto = (UserDto) o; return isActive == userDto.isActive && Objects.equals(firstName, userDto.firstName) && Objects - .equals(lastName, userDto.lastName) && Objects.equals(email, userDto.email); + .equals(lastName, userDto.lastName) && Objects.equals(email, userDto.email); } - @Override public int hashCode() { + @Override + public int hashCode() { return Objects.hash(firstName, lastName, isActive, email); } - @Override public String toString() { + @Override + public String toString() { return "UserDto{" + "firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' - + ", isActive=" + isActive + ", email='" + email + '\'' + '}'; + + ", isActive=" + isActive + ", email='" + email + '\'' + '}'; } } 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 0a805679f..b1b0ddeac 100644 --- a/cqrs/src/main/java/com/iluwatar/cqrs/app/App.java +++ b/cqrs/src/main/java/com/iluwatar/cqrs/app/App.java @@ -23,12 +23,6 @@ package com.iluwatar.cqrs.app; -import java.math.BigInteger; -import java.util.List; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.iluwatar.cqrs.commandes.CommandServiceImpl; import com.iluwatar.cqrs.commandes.ICommandService; import com.iluwatar.cqrs.constants.AppConstants; @@ -37,32 +31,35 @@ import com.iluwatar.cqrs.dto.Book; import com.iluwatar.cqrs.queries.IQueryService; import com.iluwatar.cqrs.queries.QueryServiceImpl; import com.iluwatar.cqrs.util.HibernateUtil; +import java.math.BigInteger; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** - * 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 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. - * - * This implementation is an example of managing books and authors in a library. The persistence of books and authors is - * done according to the CQRS architecture. A command side that deals with a data model to persist(insert,update,delete) - * objects to a database. And a query side that uses native queries to get data from the database and return objects as - * DTOs (Data transfer Objects). + * 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 + * 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. * + *

This implementation is an example of managing books and authors in a library. The persistence + * of books and authors is done according to the CQRS architecture. A command side that deals with a + * data model to persist(insert,update,delete) objects to a database. And a query side that uses + * native queries to get data from the database and return objects as DTOs (Data transfer Objects). */ public class App { private static final Logger LOGGER = LoggerFactory.getLogger(App.class); /** - * Program entry point - * - * @param args - * command line args + * Program entry point. + * + * @param args command line args */ public static void main(String[] args) { ICommandService commands = new CommandServiceImpl(); // Create Authors and Books using CommandService - commands.authorCreated(AppConstants.E_EVANS, "Eric Evans", "eEvans@email.com"); + commands.authorCreated(AppConstants.E_EVANS, "Eric Evans", "evans@email.com"); commands.authorCreated(AppConstants.J_BLOCH, "Joshua Bloch", "jBloch@email.com"); commands.authorCreated(AppConstants.M_FOWLER, "Martin Fowler", "mFowler@email.com"); @@ -70,7 +67,8 @@ public class App { commands.bookAddedToAuthor("Effective Java", 40.54, AppConstants.J_BLOCH); commands.bookAddedToAuthor("Java Puzzlers", 39.99, AppConstants.J_BLOCH); commands.bookAddedToAuthor("Java Concurrency in Practice", 29.40, AppConstants.J_BLOCH); - commands.bookAddedToAuthor("Patterns of Enterprise Application Architecture", 54.01, AppConstants.M_FOWLER); + commands.bookAddedToAuthor("Patterns of Enterprise" + + " Application Architecture", 54.01, AppConstants.M_FOWLER); commands.bookAddedToAuthor("Domain Specific Languages", 48.89, AppConstants.M_FOWLER); commands.authorNameUpdated(AppConstants.E_EVANS, "Eric J. Evans"); @@ -78,18 +76,18 @@ public class App { // Query the database using QueryService Author nullAuthor = queries.getAuthorByUsername("username"); - Author eEvans = queries.getAuthorByUsername(AppConstants.E_EVANS); - BigInteger jBlochBooksCount = queries.getAuthorBooksCount(AppConstants.J_BLOCH); + Author evans = queries.getAuthorByUsername(AppConstants.E_EVANS); + BigInteger blochBooksCount = queries.getAuthorBooksCount(AppConstants.J_BLOCH); BigInteger authorsCount = queries.getAuthorsCount(); Book dddBook = queries.getBook("Domain-Driven Design"); - List jBlochBooks = queries.getAuthorBooks(AppConstants.J_BLOCH); + List blochBooks = queries.getAuthorBooks(AppConstants.J_BLOCH); LOGGER.info("Author username : {}", nullAuthor); - LOGGER.info("Author eEvans : {}", eEvans); - LOGGER.info("jBloch number of books : {}", jBlochBooksCount); + LOGGER.info("Author evans : {}", evans); + LOGGER.info("jBloch number of books : {}", blochBooksCount); LOGGER.info("Number of authors : {}", authorsCount); LOGGER.info("DDD book : {}", dddBook); - LOGGER.info("jBloch books : {}", jBlochBooks); + LOGGER.info("jBloch books : {}", blochBooks); HibernateUtil.getSessionFactory().close(); } diff --git a/cqrs/src/main/java/com/iluwatar/cqrs/commandes/CommandServiceImpl.java b/cqrs/src/main/java/com/iluwatar/cqrs/commandes/CommandServiceImpl.java index e491e8990..c8146845e 100644 --- a/cqrs/src/main/java/com/iluwatar/cqrs/commandes/CommandServiceImpl.java +++ b/cqrs/src/main/java/com/iluwatar/cqrs/commandes/CommandServiceImpl.java @@ -23,17 +23,16 @@ package com.iluwatar.cqrs.commandes; +import com.iluwatar.cqrs.domain.model.Author; +import com.iluwatar.cqrs.domain.model.Book; +import com.iluwatar.cqrs.util.HibernateUtil; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; -import com.iluwatar.cqrs.domain.model.Author; -import com.iluwatar.cqrs.domain.model.Book; -import com.iluwatar.cqrs.util.HibernateUtil; - /** - * This class is an implementation of {@link ICommandService} interface. It uses Hibernate as an api for persistence. - * + * This class is an implementation of {@link ICommandService} interface. It uses Hibernate as an api + * for persistence. */ public class CommandServiceImpl implements ICommandService { diff --git a/cqrs/src/main/java/com/iluwatar/cqrs/commandes/ICommandService.java b/cqrs/src/main/java/com/iluwatar/cqrs/commandes/ICommandService.java index 7e0a47bc3..b81d24c7c 100644 --- a/cqrs/src/main/java/com/iluwatar/cqrs/commandes/ICommandService.java +++ b/cqrs/src/main/java/com/iluwatar/cqrs/commandes/ICommandService.java @@ -24,8 +24,7 @@ package com.iluwatar.cqrs.commandes; /** - * This interface represents the commands of the CQRS pattern - * + * This interface represents the commands of the CQRS pattern. */ public interface ICommandService { diff --git a/cqrs/src/main/java/com/iluwatar/cqrs/constants/AppConstants.java b/cqrs/src/main/java/com/iluwatar/cqrs/constants/AppConstants.java index c52a71401..0a8971729 100644 --- a/cqrs/src/main/java/com/iluwatar/cqrs/constants/AppConstants.java +++ b/cqrs/src/main/java/com/iluwatar/cqrs/constants/AppConstants.java @@ -24,9 +24,7 @@ package com.iluwatar.cqrs.constants; /** - * - * Class to define the constants - * + * Class to define the constants. */ public class AppConstants { diff --git a/cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Author.java b/cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Author.java index 0c0d4b65b..9f2b73e48 100644 --- a/cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Author.java +++ b/cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Author.java @@ -30,7 +30,6 @@ import javax.persistence.Id; /** * This is an Author entity. It is used by Hibernate for persistence. - * */ @Entity public class Author { @@ -42,13 +41,11 @@ public class Author { private String email; /** - * - * @param username - * username of the author - * @param name - * name of the author - * @param email - * email of the author + * Constructor. + * + * @param username username of the author + * @param name name of the author + * @param email email of the author */ public Author(String username, String name, String email) { this.username = username; diff --git a/cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Book.java b/cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Book.java index 0524991f8..8b87bdbf4 100644 --- a/cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Book.java +++ b/cqrs/src/main/java/com/iluwatar/cqrs/domain/model/Book.java @@ -30,8 +30,8 @@ import javax.persistence.Id; import javax.persistence.ManyToOne; /** - * This is a Book entity. It is used by Hibernate for persistence. Many books can be written by one {@link Author} - * + * This is a Book entity. It is used by Hibernate for persistence. Many books can be written by one + * {@link Author} */ @Entity public class Book { @@ -44,13 +44,11 @@ public class Book { private Author author; /** + * Constructor. * - * @param title - * title of the book - * @param price - * price of the book - * @param author - * author of the book + * @param title title of the book + * @param price price of the book + * @param author author of the book */ public Book(String title, double price, Author author) { this.title = title; diff --git a/cqrs/src/main/java/com/iluwatar/cqrs/dto/Author.java b/cqrs/src/main/java/com/iluwatar/cqrs/dto/Author.java index f20627ba9..8318c4a95 100644 --- a/cqrs/src/main/java/com/iluwatar/cqrs/dto/Author.java +++ b/cqrs/src/main/java/com/iluwatar/cqrs/dto/Author.java @@ -26,9 +26,7 @@ package com.iluwatar.cqrs.dto; import java.util.Objects; /** - * - * This is a DTO (Data Transfer Object) author, contains only useful information to be returned - * + * This is a DTO (Data Transfer Object) author, contains only useful information to be returned. */ public class Author { @@ -37,13 +35,11 @@ public class Author { private String username; /** - * - * @param name - * name of the author - * @param email - * email of the author - * @param username - * username of the author + * Constructor. + * + * @param name name of the author + * @param email email of the author + * @param username username of the author */ public Author(String name, String email, String username) { this.name = name; @@ -85,7 +81,8 @@ public class Author { return false; } Author other = (Author) obj; - return username.equals(other.getUsername()) && email.equals(other.getEmail()) && name.equals(other.getName()); + return username.equals(other.getUsername()) && email.equals(other.getEmail()) && name + .equals(other.getName()); } diff --git a/cqrs/src/main/java/com/iluwatar/cqrs/dto/Book.java b/cqrs/src/main/java/com/iluwatar/cqrs/dto/Book.java index 47ee03581..c859b0c76 100644 --- a/cqrs/src/main/java/com/iluwatar/cqrs/dto/Book.java +++ b/cqrs/src/main/java/com/iluwatar/cqrs/dto/Book.java @@ -26,9 +26,7 @@ package com.iluwatar.cqrs.dto; import java.util.Objects; /** - * - * This is a DTO (Data Transfer Object) book, contains only useful information to be returned - * + * This is a DTO (Data Transfer Object) book, contains only useful information to be returned. */ public class Book { @@ -36,11 +34,10 @@ public class Book { private double price; /** - * - * @param title - * title of the book - * @param price - * price of the book + * Constructor. + * + * @param title title of the book + * @param price price of the book */ public Book(String title, double price) { this.title = title; diff --git a/cqrs/src/main/java/com/iluwatar/cqrs/queries/IQueryService.java b/cqrs/src/main/java/com/iluwatar/cqrs/queries/IQueryService.java index 303b69e7c..e67371bc7 100644 --- a/cqrs/src/main/java/com/iluwatar/cqrs/queries/IQueryService.java +++ b/cqrs/src/main/java/com/iluwatar/cqrs/queries/IQueryService.java @@ -23,16 +23,13 @@ package com.iluwatar.cqrs.queries; +import com.iluwatar.cqrs.dto.Author; +import com.iluwatar.cqrs.dto.Book; import java.math.BigInteger; import java.util.List; -import com.iluwatar.cqrs.dto.Author; -import com.iluwatar.cqrs.dto.Book; - /** - * - * This interface represents the query methods of the CQRS pattern - * + * This interface represents the query methods of the CQRS pattern. */ public interface IQueryService { diff --git a/cqrs/src/main/java/com/iluwatar/cqrs/queries/QueryServiceImpl.java b/cqrs/src/main/java/com/iluwatar/cqrs/queries/QueryServiceImpl.java index 57895c945..24532515d 100644 --- a/cqrs/src/main/java/com/iluwatar/cqrs/queries/QueryServiceImpl.java +++ b/cqrs/src/main/java/com/iluwatar/cqrs/queries/QueryServiceImpl.java @@ -23,23 +23,20 @@ package com.iluwatar.cqrs.queries; +import com.iluwatar.cqrs.constants.AppConstants; +import com.iluwatar.cqrs.dto.Author; +import com.iluwatar.cqrs.dto.Book; +import com.iluwatar.cqrs.util.HibernateUtil; import java.math.BigInteger; import java.util.List; - import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.transform.Transformers; -import com.iluwatar.cqrs.constants.AppConstants; -import com.iluwatar.cqrs.dto.Author; -import com.iluwatar.cqrs.dto.Book; -import com.iluwatar.cqrs.util.HibernateUtil; - /** - * This class is an implementation of {@link IQueryService}. It uses Hibernate native queries to return DTOs from the - * database. - * + * This class is an implementation of {@link IQueryService}. It uses Hibernate native queries to + * return DTOs from the database. */ public class QueryServiceImpl implements IQueryService { @@ -49,11 +46,12 @@ public class QueryServiceImpl implements IQueryService { public Author getAuthorByUsername(String username) { Author authorDTo = null; try (Session session = sessionFactory.openSession()) { - SQLQuery sqlQuery = session - .createSQLQuery("SELECT a.username as \"username\", a.name as \"name\", a.email as \"email\"" - + "FROM Author a where a.username=:username"); + SQLQuery sqlQuery = session.createSQLQuery("SELECT a.username as \"username\"," + + " a.name as \"name\", a.email as \"email\"" + + "FROM Author a where a.username=:username"); sqlQuery.setParameter(AppConstants.USER_NAME, username); - authorDTo = (Author) sqlQuery.setResultTransformer(Transformers.aliasToBean(Author.class)).uniqueResult(); + authorDTo = (Author) sqlQuery.setResultTransformer(Transformers.aliasToBean(Author.class)) + .uniqueResult(); } return authorDTo; } @@ -62,10 +60,11 @@ public class QueryServiceImpl implements IQueryService { public Book getBook(String title) { Book bookDTo = null; try (Session session = sessionFactory.openSession()) { - SQLQuery sqlQuery = session - .createSQLQuery("SELECT b.title as \"title\", b.price as \"price\"" + " FROM Book b where b.title=:title"); + SQLQuery sqlQuery = session.createSQLQuery("SELECT b.title as \"title\"," + + " b.price as \"price\"" + " FROM Book b where b.title=:title"); sqlQuery.setParameter("title", title); - bookDTo = (Book) sqlQuery.setResultTransformer(Transformers.aliasToBean(Book.class)).uniqueResult(); + bookDTo = + (Book) sqlQuery.setResultTransformer(Transformers.aliasToBean(Book.class)).uniqueResult(); } return bookDTo; } @@ -87,7 +86,8 @@ public class QueryServiceImpl implements IQueryService { BigInteger bookcount = null; try (Session session = sessionFactory.openSession()) { SQLQuery sqlQuery = session.createSQLQuery( - "SELECT count(b.title)" + " FROM Book b, Author a where b.author_id = a.id and a.username=:username"); + "SELECT count(b.title)" + " FROM Book b, Author a" + + " where b.author_id = a.id and a.username=:username"); sqlQuery.setParameter(AppConstants.USER_NAME, username); bookcount = (BigInteger) sqlQuery.uniqueResult(); } diff --git a/cqrs/src/main/java/com/iluwatar/cqrs/util/HibernateUtil.java b/cqrs/src/main/java/com/iluwatar/cqrs/util/HibernateUtil.java index 7737ded33..6d9788a5e 100644 --- a/cqrs/src/main/java/com/iluwatar/cqrs/util/HibernateUtil.java +++ b/cqrs/src/main/java/com/iluwatar/cqrs/util/HibernateUtil.java @@ -31,8 +31,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * This class simply returns one instance of {@link SessionFactory} initialized when the application is started - * + * This class simply returns one instance of {@link SessionFactory} initialized when the application + * is started. */ public class HibernateUtil { @@ -42,7 +42,8 @@ public class HibernateUtil { private static SessionFactory buildSessionFactory() { // configures settings from hibernate.cfg.xml - final StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build(); + final StandardServiceRegistry registry = + new StandardServiceRegistryBuilder().configure().build(); try { return new MetadataSources(registry).buildMetadata().buildSessionFactory(); } catch (Exception ex) {