From bae59eade948e8f1ebb479db84e36637336a66ff Mon Sep 17 00:00:00 2001 From: CHANDRAKANT Kumar Date: Tue, 5 May 2020 14:41:10 +0530 Subject: [PATCH 1/6] Adding the sourcecode for tutorial tracked under BAEL-2957 --- java-es-cqrs/.gitignore | 29 +++++ java-es-cqrs/pom.xml | 20 +++ .../java/com/baeldung/patterns/cqrs/Main.java | 57 ++++++++ .../cqrs/aggregates/UserAggregate.java | 30 +++++ .../cqrs/commands/CreateUserCommand.java | 14 ++ .../cqrs/commands/UpdateUserCommand.java | 20 +++ .../cqrs/projections/UserProjection.java | 37 ++++++ .../cqrs/projectors/UserProjector.java | 56 ++++++++ .../cqrs/queries/AddressByRegionQuery.java | 12 ++ .../cqrs/queries/ContactByTypeQuery.java | 12 ++ .../cqrs/repository/UserReadRepository.java | 31 +++++ .../cqrs/repository/UserWriteRepository.java | 20 +++ .../java/com/baeldung/patterns/crud/Main.java | 48 +++++++ .../crud/repository/UserRepository.java | 20 +++ .../patterns/crud/service/UserService.java | 55 ++++++++ .../com/baeldung/patterns/domain/Address.java | 14 ++ .../com/baeldung/patterns/domain/Contact.java | 13 ++ .../com/baeldung/patterns/domain/User.java | 22 ++++ .../baeldung/patterns/domain/UserAddress.java | 16 +++ .../baeldung/patterns/domain/UserContact.java | 16 +++ .../java/com/baeldung/patterns/es/Main.java | 48 +++++++ .../baeldung/patterns/es/events/Event.java | 15 +++ .../es/events/UserAddressAddedEvent.java | 16 +++ .../es/events/UserAddressRemovedEvent.java | 16 +++ .../es/events/UserContactAddedEvent.java | 15 +++ .../es/events/UserContactRemovedEvent.java | 15 +++ .../patterns/es/events/UserCreatedEvent.java | 16 +++ .../patterns/es/events/UserRemovedEvent.java | 12 ++ .../patterns/es/repository/EventStore.java | 29 +++++ .../patterns/es/service/UserService.java | 94 +++++++++++++ .../patterns/es/service/UserUtility.java | 66 ++++++++++ .../com/baeldung/patterns/escqrs/Main.java | 61 +++++++++ .../escqrs/aggregates/UserAggregate.java | 87 +++++++++++++ .../escqrs/projectors/UserProjector.java | 123 ++++++++++++++++++ 34 files changed, 1155 insertions(+) create mode 100644 java-es-cqrs/.gitignore create mode 100644 java-es-cqrs/pom.xml create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/Main.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/aggregates/UserAggregate.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/commands/CreateUserCommand.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/commands/UpdateUserCommand.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projections/UserProjection.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projectors/UserProjector.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/queries/AddressByRegionQuery.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/queries/ContactByTypeQuery.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/repository/UserReadRepository.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/repository/UserWriteRepository.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/crud/Main.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/crud/repository/UserRepository.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/crud/service/UserService.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/domain/Address.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/domain/Contact.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/domain/User.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserAddress.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserContact.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/es/Main.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/Event.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserAddressAddedEvent.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserAddressRemovedEvent.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserContactAddedEvent.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserContactRemovedEvent.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserCreatedEvent.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserRemovedEvent.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/es/repository/EventStore.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserService.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserUtility.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/Main.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/aggregates/UserAggregate.java create mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/projectors/UserProjector.java diff --git a/java-es-cqrs/.gitignore b/java-es-cqrs/.gitignore new file mode 100644 index 0000000000..153c9335eb --- /dev/null +++ b/java-es-cqrs/.gitignore @@ -0,0 +1,29 @@ +HELP.md +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +/build/ + +### VS Code ### +.vscode/ diff --git a/java-es-cqrs/pom.xml b/java-es-cqrs/pom.xml new file mode 100644 index 0000000000..4160c62b0c --- /dev/null +++ b/java-es-cqrs/pom.xml @@ -0,0 +1,20 @@ + + 4.0.0 + com.sapient.learning + java-events + 0.0.1-SNAPSHOT + java-es-cqrs + + 1.8 + 1.8 + + + + org.projectlombok + lombok + 1.18.12 + + + \ No newline at end of file diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/Main.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/Main.java new file mode 100644 index 0000000000..4e9c872cf1 --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/Main.java @@ -0,0 +1,57 @@ +package com.baeldung.patterns.cqrs; + +import java.util.UUID; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import com.baeldung.patterns.cqrs.aggregates.UserAggregate; +import com.baeldung.patterns.cqrs.commands.CreateUserCommand; +import com.baeldung.patterns.cqrs.commands.UpdateUserCommand; +import com.baeldung.patterns.cqrs.projections.UserProjection; +import com.baeldung.patterns.cqrs.projectors.UserProjector; +import com.baeldung.patterns.cqrs.queries.AddressByRegionQuery; +import com.baeldung.patterns.cqrs.queries.ContactByTypeQuery; +import com.baeldung.patterns.cqrs.repository.UserReadRepository; +import com.baeldung.patterns.cqrs.repository.UserWriteRepository; +import com.baeldung.patterns.domain.Address; +import com.baeldung.patterns.domain.Contact; +import com.baeldung.patterns.domain.User; + +public class Main { + + public static void main(String[] args) throws Exception { + UserWriteRepository writeRepository = new UserWriteRepository(); + UserReadRepository readRepository = new UserReadRepository(); + UserProjector projector = new UserProjector(readRepository); + UserAggregate userAggregate = new UserAggregate(writeRepository); + UserProjection userProjection = new UserProjection(readRepository); + + String userId = UUID.randomUUID() + .toString(); + User user = null; + CreateUserCommand createUserCommand = new CreateUserCommand(userId, "Tom", "Sawyer"); + user = userAggregate.handleCreateUserCommand(createUserCommand); + projector.project(user); + + UpdateUserCommand updateUserCommand = new UpdateUserCommand(user.getUserid(), Stream.of(new Address("New York", "NY", "10001"), new Address("Los Angeles", "CA", "90001")) + .collect(Collectors.toSet()), + Stream.of(new Contact("EMAIL", "tom.sawyer@gmail.com"), new Contact("EMAIL", "tom.sawyer@rediff.com")) + .collect(Collectors.toSet())); + user = userAggregate.handleUpdateUserCommand(updateUserCommand); + projector.project(user); + + updateUserCommand = new UpdateUserCommand(userId, Stream.of(new Address("New York", "NY", "10001"), new Address("Housten", "TX", "77001")) + .collect(Collectors.toSet()), + Stream.of(new Contact("EMAIL", "tom.sawyer@gmail.com"), new Contact("PHONE", "700-000-0001")) + .collect(Collectors.toSet())); + user = userAggregate.handleUpdateUserCommand(updateUserCommand); + projector.project(user); + + AddressByRegionQuery addressByRegionQuery = new AddressByRegionQuery(user.getUserid(), "NY"); + System.out.println(userProjection.handle(addressByRegionQuery)); + + ContactByTypeQuery contactByTypeQuery = new ContactByTypeQuery(user.getUserid(), "EMAIL"); + System.out.println(userProjection.handle(contactByTypeQuery)); + } + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/aggregates/UserAggregate.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/aggregates/UserAggregate.java new file mode 100644 index 0000000000..b5e16cff0e --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/aggregates/UserAggregate.java @@ -0,0 +1,30 @@ +package com.baeldung.patterns.cqrs.aggregates; + +import com.baeldung.patterns.cqrs.commands.CreateUserCommand; +import com.baeldung.patterns.cqrs.commands.UpdateUserCommand; +import com.baeldung.patterns.cqrs.repository.UserWriteRepository; +import com.baeldung.patterns.domain.User; + +public class UserAggregate { + + private UserWriteRepository writeRepository; + + public UserAggregate(UserWriteRepository repository) { + this.writeRepository = repository; + } + + public User handleCreateUserCommand(CreateUserCommand command) { + User user = new User(command.getUserId(), command.getFiratName(), command.getLastName()); + writeRepository.addUser(user.getUserid(), user); + return user; + } + + public User handleUpdateUserCommand(UpdateUserCommand command) { + User user = writeRepository.getUser(command.getUserId()); + user.setAddresses(command.getAddresses()); + user.setContacts(command.getContacts()); + writeRepository.addUser(user.getUserid(), user); + return user; + } + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/commands/CreateUserCommand.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/commands/CreateUserCommand.java new file mode 100644 index 0000000000..4ab939dbab --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/commands/CreateUserCommand.java @@ -0,0 +1,14 @@ +package com.baeldung.patterns.cqrs.commands; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class CreateUserCommand { + + private String userId; + private String firatName; + private String lastName; + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/commands/UpdateUserCommand.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/commands/UpdateUserCommand.java new file mode 100644 index 0000000000..58a4889458 --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/commands/UpdateUserCommand.java @@ -0,0 +1,20 @@ +package com.baeldung.patterns.cqrs.commands; + +import java.util.HashSet; +import java.util.Set; + +import com.baeldung.patterns.domain.Address; +import com.baeldung.patterns.domain.Contact; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class UpdateUserCommand { + + private String userId; + private Set
addresses = new HashSet<>(); + private Set contacts = new HashSet<>(); + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projections/UserProjection.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projections/UserProjection.java new file mode 100644 index 0000000000..40a56e727f --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projections/UserProjection.java @@ -0,0 +1,37 @@ +package com.baeldung.patterns.cqrs.projections; + +import java.util.Set; + +import com.baeldung.patterns.cqrs.queries.AddressByRegionQuery; +import com.baeldung.patterns.cqrs.queries.ContactByTypeQuery; +import com.baeldung.patterns.cqrs.repository.UserReadRepository; +import com.baeldung.patterns.domain.Address; +import com.baeldung.patterns.domain.Contact; +import com.baeldung.patterns.domain.UserAddress; +import com.baeldung.patterns.domain.UserContact; + +public class UserProjection { + + private UserReadRepository repository; + + public UserProjection(UserReadRepository repository) { + this.repository = repository; + } + + public Set handle(ContactByTypeQuery query) throws Exception { + UserContact userContact = repository.getUserContact(query.getUserId()); + if (userContact == null) + throw new Exception("User does not exist."); + return userContact.getContactByType() + .get(query.getContactType()); + } + + public Set
handle(AddressByRegionQuery query) throws Exception { + UserAddress userAddress = repository.getUserAddress(query.getUserId()); + if (userAddress == null) + throw new Exception("User does not exist."); + return userAddress.getAddressByRegion() + .get(query.getState()); + } + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projectors/UserProjector.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projectors/UserProjector.java new file mode 100644 index 0000000000..25c10094c1 --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projectors/UserProjector.java @@ -0,0 +1,56 @@ +package com.baeldung.patterns.cqrs.projectors; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import com.baeldung.patterns.cqrs.repository.UserReadRepository; +import com.baeldung.patterns.domain.Address; +import com.baeldung.patterns.domain.Contact; +import com.baeldung.patterns.domain.User; +import com.baeldung.patterns.domain.UserAddress; +import com.baeldung.patterns.domain.UserContact; + +public class UserProjector { + + UserReadRepository readRepository = new UserReadRepository(); + + public UserProjector(UserReadRepository readRepository) { + this.readRepository = readRepository; + } + + public void project(User user) { + UserContact userContact = readRepository.getUserContact(user.getUserid()); + if (userContact == null) + userContact = new UserContact(); + userContact.setContacts(user.getContacts()); + Map> contactByType = new HashMap<>(); + for (Contact contact : user.getContacts()) { + Set contacts = contactByType.get(contact.getType()); + if (contacts == null) + contacts = new HashSet<>(); + contacts.add(contact); + contactByType.put(contact.getType(), contacts); + } + userContact.setContactByType(contactByType); + readRepository.addUserContact(user.getUserid(), userContact); + + UserAddress userAddress = readRepository.getUserAddress(user.getUserid()); + if (userAddress == null) + userAddress = new UserAddress(); + userAddress.setAddresses(user.getAddresses()); + Map> addressByRegion = new HashMap<>(); + for (Address address : user.getAddresses()) { + Set
addresses = addressByRegion.get(address.getState()); + if (addresses == null) + addresses = new HashSet<>(); + addresses.add(address); + addressByRegion.put(address.getState(), addresses); + } + userAddress.setAddressByRegion(addressByRegion); + readRepository.addUserAddress(user.getUserid(), userAddress); + + } + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/queries/AddressByRegionQuery.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/queries/AddressByRegionQuery.java new file mode 100644 index 0000000000..4a0f0769f2 --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/queries/AddressByRegionQuery.java @@ -0,0 +1,12 @@ +package com.baeldung.patterns.cqrs.queries; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class AddressByRegionQuery { + + private String userId; + private String state; +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/queries/ContactByTypeQuery.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/queries/ContactByTypeQuery.java new file mode 100644 index 0000000000..b6c271b472 --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/queries/ContactByTypeQuery.java @@ -0,0 +1,12 @@ +package com.baeldung.patterns.cqrs.queries; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class ContactByTypeQuery { + + private String userId; + private String contactType; +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/repository/UserReadRepository.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/repository/UserReadRepository.java new file mode 100644 index 0000000000..a7ef2f6f96 --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/repository/UserReadRepository.java @@ -0,0 +1,31 @@ +package com.baeldung.patterns.cqrs.repository; + +import java.util.HashMap; +import java.util.Map; + +import com.baeldung.patterns.domain.UserAddress; +import com.baeldung.patterns.domain.UserContact; + +public class UserReadRepository { + + private Map userAddress = new HashMap<>(); + + private Map userContact = new HashMap<>(); + + public void addUserAddress(String id, UserAddress user) { + userAddress.put(id, user); + } + + public UserAddress getUserAddress(String id) { + return userAddress.get(id); + } + + public void addUserContact(String id, UserContact user) { + userContact.put(id, user); + } + + public UserContact getUserContact(String id) { + return userContact.get(id); + } + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/repository/UserWriteRepository.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/repository/UserWriteRepository.java new file mode 100644 index 0000000000..8636e36225 --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/repository/UserWriteRepository.java @@ -0,0 +1,20 @@ +package com.baeldung.patterns.cqrs.repository; + +import java.util.HashMap; +import java.util.Map; + +import com.baeldung.patterns.domain.User; + +public class UserWriteRepository { + + private Map store = new HashMap<>(); + + public void addUser(String id, User user) { + store.put(id, user); + } + + public User getUser(String id) { + return store.get(id); + } + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/Main.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/Main.java new file mode 100644 index 0000000000..1f20e0be38 --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/Main.java @@ -0,0 +1,48 @@ +package com.baeldung.patterns.crud; + +import java.util.UUID; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import com.baeldung.patterns.crud.repository.UserRepository; +import com.baeldung.patterns.crud.service.UserService; +import com.baeldung.patterns.domain.Address; +import com.baeldung.patterns.domain.Contact; + +public class Main { + + public static void main(String[] args) throws Exception { + + UserRepository repository = new UserRepository(); + UserService service = new UserService(repository); + String userId = UUID.randomUUID() + .toString(); + + service.createUser(userId, "Tom", "Sawyer"); + service.updateUser(userId, + Stream.of( + new Contact("EMAIL", "tom.sawyer@gmail.com"), + new Contact("EMAIL", "tom.sawyer@rediff.com"), + new Contact("PHONE", "700-000-0001")) + .collect(Collectors.toSet()), + Stream.of( + new Address("New York", "NY", "10001"), + new Address("Los Angeles", "CA", "90001"), + new Address("Housten", "TX", "77001")) + .collect(Collectors.toSet())); + service.updateUser(userId, + Stream.of( + new Contact("EMAIL", "tom.sawyer@gmail.com"), + new Contact("PHONE", "700-000-0001")) + .collect(Collectors.toSet()), + Stream.of( + new Address("New York", "NY", "10001"), + new Address("Housten", "TX", "77001")) + .collect(Collectors.toSet())); + + System.out.println(service.getContactByType(userId, "EMAIL")); + System.out.println(service.getAddressByRegion(userId, "NY")); + + } + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/repository/UserRepository.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/repository/UserRepository.java new file mode 100644 index 0000000000..b22d40e6e0 --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/repository/UserRepository.java @@ -0,0 +1,20 @@ +package com.baeldung.patterns.crud.repository; + +import java.util.HashMap; +import java.util.Map; + +import com.baeldung.patterns.domain.User; + +public class UserRepository { + + private Map store = new HashMap<>(); + + public void addUser(String id, User user) { + store.put(id, user); + } + + public User getUser(String id) { + return store.get(id); + } + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/service/UserService.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/service/UserService.java new file mode 100644 index 0000000000..d21a796304 --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/service/UserService.java @@ -0,0 +1,55 @@ +package com.baeldung.patterns.crud.service; + +import java.util.Set; +import java.util.stream.Collectors; + +import com.baeldung.patterns.crud.repository.UserRepository; +import com.baeldung.patterns.domain.Address; +import com.baeldung.patterns.domain.Contact; +import com.baeldung.patterns.domain.User; + +public class UserService { + + private UserRepository repository; + + public UserService(UserRepository repository) { + this.repository = repository; + } + + public void createUser(String userId, String firstName, String lastName) { + User user = new User(userId, firstName, lastName); + repository.addUser(userId, user); + } + + public void updateUser(String userId, Set contacts, Set
addresses) throws Exception { + User user = repository.getUser(userId); + if (user == null) + throw new Exception("User does not exist."); + user.setContacts(contacts); + user.setAddresses(addresses); + repository.addUser(userId, user); + } + + public Set getContactByType(String userId, String contactType) throws Exception { + User user = repository.getUser(userId); + if (user == null) + throw new Exception("User does not exit."); + Set contacts = user.getContacts(); + return contacts.stream() + .filter(c -> c.getType() + .equals(contactType)) + .collect(Collectors.toSet()); + } + + public Set
getAddressByRegion(String userId, String state) throws Exception { + User user = repository.getUser(userId); + if (user == null) + throw new Exception("User does not exist."); + Set
addresses = user.getAddresses(); + return addresses.stream() + .filter(a -> a.getState() + .equals(state)) + .collect(Collectors.toSet()); + } + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/Address.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/Address.java new file mode 100644 index 0000000000..dfaa724434 --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/Address.java @@ -0,0 +1,14 @@ +package com.baeldung.patterns.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class Address { + + private String city; + private String state; + private String postcode; + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/Contact.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/Contact.java new file mode 100644 index 0000000000..a151cdb4ff --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/Contact.java @@ -0,0 +1,13 @@ +package com.baeldung.patterns.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class Contact { + + private String type; + private String detail; + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/User.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/User.java new file mode 100644 index 0000000000..8f59723894 --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/User.java @@ -0,0 +1,22 @@ +package com.baeldung.patterns.domain; + +import java.util.HashSet; +import java.util.Set; + +import lombok.Data; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; + +@Data +@RequiredArgsConstructor +public class User { + @NonNull + private String userid; + @NonNull + private String firstname; + @NonNull + private String lastname; + private Set contacts = new HashSet<>(); + private Set
addresses = new HashSet<>(); + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserAddress.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserAddress.java new file mode 100644 index 0000000000..33f9bdf28f --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserAddress.java @@ -0,0 +1,16 @@ +package com.baeldung.patterns.domain; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import lombok.Data; + +@Data +public class UserAddress { + + private Set
addresses = new HashSet<>(); + private Map> addressByRegion = new HashMap<>(); + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserContact.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserContact.java new file mode 100644 index 0000000000..4f2ba812a4 --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserContact.java @@ -0,0 +1,16 @@ +package com.baeldung.patterns.domain; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import lombok.Data; + +@Data +public class UserContact { + + private Set contacts = new HashSet<>(); + private Map> contactByType = new HashMap<>(); + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/Main.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/Main.java new file mode 100644 index 0000000000..77649088e9 --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/Main.java @@ -0,0 +1,48 @@ +package com.baeldung.patterns.es; + +import java.util.UUID; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import com.baeldung.patterns.domain.Address; +import com.baeldung.patterns.domain.Contact; +import com.baeldung.patterns.es.repository.EventStore; +import com.baeldung.patterns.es.service.UserService; + +public class Main { + + public static void main(String[] args) throws Exception { + + EventStore repository = new EventStore(); + UserService service = new UserService(repository); + String userId = UUID.randomUUID() + .toString(); + + service.createUser(userId, "Tom", "Sawyer"); + service.updateUser(userId, + Stream.of( + new Contact("EMAIL", "tom.sawyer@gmail.com"), + new Contact("EMAIL", "tom.sawyer@rediff.com"), + new Contact("PHONE", "700-000-0001")) + .collect(Collectors.toSet()), + Stream.of( + new Address("New York", "NY", "10001"), + new Address("Los Angeles", "CA", "90001"), + new Address("Housten", "TX", "77001")) + .collect(Collectors.toSet())); + service.updateUser(userId, + Stream.of( + new Contact("EMAIL", "tom.sawyer@gmail.com"), + new Contact("PHONE", "700-000-0001")) + .collect(Collectors.toSet()), + Stream.of( + new Address("New York", "NY", "10001"), + new Address("Housten", "TX", "77001")) + .collect(Collectors.toSet())); + + System.out.println(service.getContactByType(userId, "EMAIL")); + System.out.println(service.getAddressByRegion(userId, "NY")); + + } + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/Event.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/Event.java new file mode 100644 index 0000000000..4718450cac --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/Event.java @@ -0,0 +1,15 @@ +package com.baeldung.patterns.es.events; + +import java.util.Date; +import java.util.UUID; + +import lombok.ToString; + +@ToString +public abstract class Event { + + public final UUID id = UUID.randomUUID(); + + public final Date created = new Date(); + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserAddressAddedEvent.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserAddressAddedEvent.java new file mode 100644 index 0000000000..caa640798b --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserAddressAddedEvent.java @@ -0,0 +1,16 @@ +package com.baeldung.patterns.es.events; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class UserAddressAddedEvent extends Event { + + private String city; + private String state; + private String postCode; + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserAddressRemovedEvent.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserAddressRemovedEvent.java new file mode 100644 index 0000000000..f0702d8810 --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserAddressRemovedEvent.java @@ -0,0 +1,16 @@ +package com.baeldung.patterns.es.events; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class UserAddressRemovedEvent extends Event { + + private String city; + private String state; + private String postCode; + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserContactAddedEvent.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserContactAddedEvent.java new file mode 100644 index 0000000000..0bce2f997e --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserContactAddedEvent.java @@ -0,0 +1,15 @@ +package com.baeldung.patterns.es.events; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class UserContactAddedEvent extends Event { + + private String contactType; + private String contactDetails; + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserContactRemovedEvent.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserContactRemovedEvent.java new file mode 100644 index 0000000000..9c043971e7 --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserContactRemovedEvent.java @@ -0,0 +1,15 @@ +package com.baeldung.patterns.es.events; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class UserContactRemovedEvent extends Event { + + private String contactType; + private String contactDetails; + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserCreatedEvent.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserCreatedEvent.java new file mode 100644 index 0000000000..8e725cd667 --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserCreatedEvent.java @@ -0,0 +1,16 @@ +package com.baeldung.patterns.es.events; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class UserCreatedEvent extends Event { + + private String userId; + private String firstName; + private String lastName; + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserRemovedEvent.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserRemovedEvent.java new file mode 100644 index 0000000000..b609cb1daf --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserRemovedEvent.java @@ -0,0 +1,12 @@ +package com.baeldung.patterns.es.events; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +public class UserRemovedEvent extends Event { + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/repository/EventStore.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/repository/EventStore.java new file mode 100644 index 0000000000..87914d8c12 --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/repository/EventStore.java @@ -0,0 +1,29 @@ +package com.baeldung.patterns.es.repository; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.baeldung.patterns.es.events.Event; + +public class EventStore { + + private Map> store = new HashMap<>(); + + public void addEvent(String id, Event event) { + List events = store.get(id); + if (events == null) { + events = new ArrayList(); + events.add(event); + store.put(id, events); + } else { + events.add(event); + } + } + + public List getEvents(String id) { + return store.get(id); + } + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserService.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserService.java new file mode 100644 index 0000000000..0233453d68 --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserService.java @@ -0,0 +1,94 @@ +package com.baeldung.patterns.es.service; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import com.baeldung.patterns.domain.Address; +import com.baeldung.patterns.domain.Contact; +import com.baeldung.patterns.domain.User; +import com.baeldung.patterns.es.events.UserAddressAddedEvent; +import com.baeldung.patterns.es.events.UserAddressRemovedEvent; +import com.baeldung.patterns.es.events.UserContactAddedEvent; +import com.baeldung.patterns.es.events.UserContactRemovedEvent; +import com.baeldung.patterns.es.events.UserCreatedEvent; +import com.baeldung.patterns.es.repository.EventStore; + +public class UserService { + + private EventStore repository; + + public UserService(EventStore repository) { + this.repository = repository; + } + + public void createUser(String userId, String firstName, String lastName) { + UserCreatedEvent event = new UserCreatedEvent(userId, firstName, lastName); + repository.addEvent(userId, event); + } + + public void updateUser(String userId, Set contacts, Set
addresses) throws Exception { + User user = UserUtility.recreateUserState(repository, userId); + if (user == null) + throw new Exception("User does not exist."); + + List contactsToRemove = user.getContacts() + .stream() + .filter(c -> !contacts.contains(c)) + .collect(Collectors.toList()); + for (Contact contact : contactsToRemove) { + UserContactRemovedEvent contactRemovedEvent = new UserContactRemovedEvent(contact.getType(), contact.getDetail()); + repository.addEvent(userId, contactRemovedEvent); + } + + List contactsToAdd = contacts.stream() + .filter(c -> !user.getContacts() + .contains(c)) + .collect(Collectors.toList()); + for (Contact contact : contactsToAdd) { + UserContactAddedEvent contactAddedEvent = new UserContactAddedEvent(contact.getType(), contact.getDetail()); + repository.addEvent(userId, contactAddedEvent); + } + + List
addressesToRemove = user.getAddresses() + .stream() + .filter(a -> !addresses.contains(a)) + .collect(Collectors.toList()); + for (Address address : addressesToRemove) { + UserAddressRemovedEvent addressRemovedEvent = new UserAddressRemovedEvent(address.getCity(), address.getState(), address.getPostcode()); + repository.addEvent(userId, addressRemovedEvent); + } + + List
addressesToAdd = addresses.stream() + .filter(a -> !user.getAddresses() + .contains(a)) + .collect(Collectors.toList()); + for (Address address : addressesToAdd) { + UserAddressAddedEvent addressAddedEvent = new UserAddressAddedEvent(address.getCity(), address.getState(), address.getPostcode()); + repository.addEvent(userId, addressAddedEvent); + } + } + + public Set getContactByType(String userId, String contactType) throws Exception { + User user = UserUtility.recreateUserState(repository, userId); + if (user == null) + throw new Exception("User does not exist."); + Set contacts = user.getContacts(); + return contacts.stream() + .filter(c -> c.getType() + .equals(contactType)) + .collect(Collectors.toSet()); + } + + public Set
getAddressByRegion(String userId, String state) throws Exception { + User user = UserUtility.recreateUserState(repository, userId); + if (user == null) + throw new Exception("User does not exist."); + Set
addresses = user.getAddresses(); + return addresses.stream() + .filter(a -> a.getState() + .equals(state)) + .collect(Collectors.toSet()); + } + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserUtility.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserUtility.java new file mode 100644 index 0000000000..b7ed9208b2 --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserUtility.java @@ -0,0 +1,66 @@ +package com.baeldung.patterns.es.service; + +import java.util.List; +import java.util.UUID; + +import com.baeldung.patterns.domain.Address; +import com.baeldung.patterns.domain.Contact; +import com.baeldung.patterns.domain.User; +import com.baeldung.patterns.es.events.Event; +import com.baeldung.patterns.es.events.UserAddressAddedEvent; +import com.baeldung.patterns.es.events.UserAddressRemovedEvent; +import com.baeldung.patterns.es.events.UserContactAddedEvent; +import com.baeldung.patterns.es.events.UserContactRemovedEvent; +import com.baeldung.patterns.es.events.UserCreatedEvent; +import com.baeldung.patterns.es.events.UserRemovedEvent; +import com.baeldung.patterns.es.repository.EventStore; + +public class UserUtility { + + public static User recreateUserState(EventStore store, String userId) { + User user = null; + + List events = store.getEvents(userId); + for (Event event : events) { + if (event instanceof UserCreatedEvent) { + UserCreatedEvent e = (UserCreatedEvent) event; + user = new User(UUID.randomUUID() + .toString(), e.getFirstName(), e.getLastName()); + } + if (event instanceof UserRemovedEvent) { + user = null; + } + if (event instanceof UserAddressAddedEvent) { + UserAddressAddedEvent e = (UserAddressAddedEvent) event; + Address address = new Address(e.getCity(), e.getState(), e.getPostCode()); + if (user != null) + user.getAddresses() + .add(address); + } + if (event instanceof UserAddressRemovedEvent) { + UserAddressRemovedEvent e = (UserAddressRemovedEvent) event; + Address address = new Address(e.getCity(), e.getState(), e.getPostCode()); + if (user != null) + user.getAddresses() + .remove(address); + } + if (event instanceof UserContactAddedEvent) { + UserContactAddedEvent e = (UserContactAddedEvent) event; + Contact contact = new Contact(e.getContactType(), e.getContactDetails()); + if (user != null) + user.getContacts() + .add(contact); + } + if (event instanceof UserContactRemovedEvent) { + UserContactRemovedEvent e = (UserContactRemovedEvent) event; + Contact contact = new Contact(e.getContactType(), e.getContactDetails()); + if (user != null) + user.getContacts() + .remove(contact); + } + } + + return user; + } + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/Main.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/Main.java new file mode 100644 index 0000000000..44395a75a7 --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/Main.java @@ -0,0 +1,61 @@ +package com.baeldung.patterns.escqrs; + +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import com.baeldung.patterns.cqrs.commands.CreateUserCommand; +import com.baeldung.patterns.cqrs.commands.UpdateUserCommand; +import com.baeldung.patterns.cqrs.projections.UserProjection; +import com.baeldung.patterns.cqrs.queries.AddressByRegionQuery; +import com.baeldung.patterns.cqrs.queries.ContactByTypeQuery; +import com.baeldung.patterns.cqrs.repository.UserReadRepository; +import com.baeldung.patterns.domain.Address; +import com.baeldung.patterns.domain.Contact; +import com.baeldung.patterns.es.events.Event; +import com.baeldung.patterns.es.repository.EventStore; +import com.baeldung.patterns.escqrs.aggregates.UserAggregate; +import com.baeldung.patterns.escqrs.projectors.UserProjector; + +public class Main { + + public static void main(String[] args) throws Exception { + + EventStore writeRepository = new EventStore(); + UserReadRepository readRepository = new UserReadRepository(); + UserProjector projector = new UserProjector(readRepository); + UserAggregate userAggregate = new UserAggregate(writeRepository); + UserProjection userProjection = new UserProjection(readRepository); + + String userId = UUID.randomUUID() + .toString(); + List events = null; + CreateUserCommand createUserCommand = new CreateUserCommand(userId, "Kumar", "Chandrakant"); + events = userAggregate.handleCreateUserCommand(createUserCommand); + + projector.project(userId, events); + + UpdateUserCommand updateUserCommand = new UpdateUserCommand(userId, Stream.of(new Address("New York", "NY", "10001"), new Address("Los Angeles", "CA", "90001")) + .collect(Collectors.toSet()), + Stream.of(new Contact("EMAIL", "tom.sawyer@gmail.com"), new Contact("EMAIL", "tom.sawyer@rediff.com")) + .collect(Collectors.toSet())); + events = userAggregate.handleUpdateUserCommand(updateUserCommand); + projector.project(userId, events); + + updateUserCommand = new UpdateUserCommand(userId, Stream.of(new Address("New York", "NY", "10001"), new Address("Housten", "TX", "77001")) + .collect(Collectors.toSet()), + Stream.of(new Contact("EMAIL", "tom.sawyer@gmail.com"), new Contact("PHONE", "700-000-0001")) + .collect(Collectors.toSet())); + events = userAggregate.handleUpdateUserCommand(updateUserCommand); + projector.project(userId, events); + + AddressByRegionQuery addressByRegionQuery = new AddressByRegionQuery(userId, "NY"); + System.out.println(userProjection.handle(addressByRegionQuery)); + + ContactByTypeQuery contactByTypeQuery = new ContactByTypeQuery(userId, "EMAIL"); + System.out.println(userProjection.handle(contactByTypeQuery)); + + } + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/aggregates/UserAggregate.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/aggregates/UserAggregate.java new file mode 100644 index 0000000000..7d32aeb2a2 --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/aggregates/UserAggregate.java @@ -0,0 +1,87 @@ +package com.baeldung.patterns.escqrs.aggregates; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import com.baeldung.patterns.cqrs.commands.CreateUserCommand; +import com.baeldung.patterns.cqrs.commands.UpdateUserCommand; +import com.baeldung.patterns.domain.Address; +import com.baeldung.patterns.domain.Contact; +import com.baeldung.patterns.domain.User; +import com.baeldung.patterns.es.events.Event; +import com.baeldung.patterns.es.events.UserAddressAddedEvent; +import com.baeldung.patterns.es.events.UserAddressRemovedEvent; +import com.baeldung.patterns.es.events.UserContactAddedEvent; +import com.baeldung.patterns.es.events.UserContactRemovedEvent; +import com.baeldung.patterns.es.events.UserCreatedEvent; +import com.baeldung.patterns.es.repository.EventStore; +import com.baeldung.patterns.es.service.UserUtility; + +public class UserAggregate { + + private EventStore writeRepository; + + public UserAggregate(EventStore repository) { + this.writeRepository = repository; + } + + public List handleCreateUserCommand(CreateUserCommand command) { + UserCreatedEvent event = new UserCreatedEvent(command.getUserId(), command.getFiratName(), command.getLastName()); + writeRepository.addEvent(command.getUserId(), event); + return Arrays.asList(event); + } + + public List handleUpdateUserCommand(UpdateUserCommand command) { + User user = UserUtility.recreateUserState(writeRepository, command.getUserId()); + List events = new ArrayList<>(); + + List contactsToRemove = user.getContacts() + .stream() + .filter(c -> !command.getContacts() + .contains(c)) + .collect(Collectors.toList()); + for (Contact contact : contactsToRemove) { + UserContactRemovedEvent contactRemovedEvent = new UserContactRemovedEvent(contact.getType(), contact.getDetail()); + events.add(contactRemovedEvent); + writeRepository.addEvent(command.getUserId(), contactRemovedEvent); + } + + List contactsToAdd = command.getContacts() + .stream() + .filter(c -> !user.getContacts() + .contains(c)) + .collect(Collectors.toList()); + for (Contact contact : contactsToAdd) { + UserContactAddedEvent contactAddedEvent = new UserContactAddedEvent(contact.getType(), contact.getDetail()); + events.add(contactAddedEvent); + writeRepository.addEvent(command.getUserId(), contactAddedEvent); + } + + List
addressesToRemove = user.getAddresses() + .stream() + .filter(a -> !command.getAddresses() + .contains(a)) + .collect(Collectors.toList()); + for (Address address : addressesToRemove) { + UserAddressRemovedEvent addressRemovedEvent = new UserAddressRemovedEvent(address.getCity(), address.getState(), address.getPostcode()); + events.add(addressRemovedEvent); + writeRepository.addEvent(command.getUserId(), addressRemovedEvent); + } + + List
addressesToAdd = command.getAddresses() + .stream() + .filter(a -> !user.getAddresses() + .contains(a)) + .collect(Collectors.toList()); + for (Address address : addressesToAdd) { + UserAddressAddedEvent addressAddedEvent = new UserAddressAddedEvent(address.getCity(), address.getState(), address.getPostcode()); + events.add(addressAddedEvent); + writeRepository.addEvent(command.getUserId(), addressAddedEvent); + } + + return events; + } + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/projectors/UserProjector.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/projectors/UserProjector.java new file mode 100644 index 0000000000..036b6e8396 --- /dev/null +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/projectors/UserProjector.java @@ -0,0 +1,123 @@ +package com.baeldung.patterns.escqrs.projectors; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import com.baeldung.patterns.cqrs.repository.UserReadRepository; +import com.baeldung.patterns.domain.Address; +import com.baeldung.patterns.domain.Contact; +import com.baeldung.patterns.domain.UserAddress; +import com.baeldung.patterns.domain.UserContact; +import com.baeldung.patterns.es.events.Event; +import com.baeldung.patterns.es.events.UserAddressAddedEvent; +import com.baeldung.patterns.es.events.UserAddressRemovedEvent; +import com.baeldung.patterns.es.events.UserContactAddedEvent; +import com.baeldung.patterns.es.events.UserContactRemovedEvent; +import com.baeldung.patterns.es.events.UserCreatedEvent; +import com.baeldung.patterns.es.events.UserRemovedEvent; + +public class UserProjector { + + UserReadRepository readRepository = new UserReadRepository(); + + public UserProjector(UserReadRepository readRepository) { + this.readRepository = readRepository; + } + + public void project(String userId, List events) { + + for (Event event : events) { + if (event instanceof UserCreatedEvent) + apply(userId, (UserCreatedEvent) event); + if (event instanceof UserRemovedEvent) + apply(userId, (UserRemovedEvent) event); + if (event instanceof UserAddressAddedEvent) + apply(userId, (UserAddressAddedEvent) event); + if (event instanceof UserAddressRemovedEvent) + apply(userId, (UserAddressRemovedEvent) event); + if (event instanceof UserContactAddedEvent) + apply(userId, (UserContactAddedEvent) event); + if (event instanceof UserContactRemovedEvent) + apply(userId, (UserContactRemovedEvent) event); + } + + } + + public void apply(String userId, UserCreatedEvent event) { + + } + + public void apply(String userId, UserRemovedEvent event) { + + } + + public void apply(String userId, UserAddressAddedEvent event) { + Address address = new Address(event.getCity(), event.getState(), event.getPostCode()); + UserAddress userAddress = readRepository.getUserAddress(userId); + if (userAddress == null) + userAddress = new UserAddress(); + userAddress.getAddresses() + .add(address); + Set
addresses = userAddress.getAddressByRegion() + .get(address.getState()); + if (addresses == null) + addresses = new HashSet<>(); + addresses.add(address); + userAddress.getAddressByRegion() + .put(address.getState(), addresses); + readRepository.addUserAddress(userId, userAddress); + } + + public void apply(String userId, UserAddressRemovedEvent event) { + Address address = new Address(event.getCity(), event.getState(), event.getPostCode()); + UserAddress userAddress = readRepository.getUserAddress(userId); + if (userAddress != null) { + userAddress.getAddresses() + .remove(address); + Set
addresses = userAddress.getAddressByRegion() + .get(address.getState()); + if (addresses != null) { + addresses.remove(address); + userAddress.getAddressByRegion() + .put(address.getState(), addresses); + } + readRepository.addUserAddress(userId, userAddress); + } + } + + public void apply(String userId, UserContactAddedEvent event) { + Contact contact = new Contact(event.getContactType(), event.getContactDetails()); + UserContact userContact = readRepository.getUserContact(userId); + if (userContact == null) + userContact = new UserContact(); + userContact.getContacts() + .add(contact); + Set contacts = userContact.getContactByType() + .get(contact.getType()); + if (contacts == null) + contacts = new HashSet<>(); + contacts.add(contact); + userContact.getContactByType() + .put(contact.getType(), contacts); + readRepository.addUserContact(userId, userContact); + } + + public void apply(String userId, UserContactRemovedEvent event) { + Contact contact = new Contact(event.getContactType(), event.getContactDetails()); + UserContact userContact = readRepository.getUserContact(userId); + if (userContact != null) { + userContact.getContacts() + .remove(contact); + Set contacts = userContact.getContactByType() + .get(contact.getType()); + if (contacts != null) { + contacts.remove(contact); + userContact.getContactByType() + .put(contact.getType(), contacts); + } + readRepository.addUserContact(userId, userContact); + } + } + +} From dbbcfc21186c55469413b73ca08c82b33fdcbf40 Mon Sep 17 00:00:00 2001 From: CHANDRAKANT Kumar Date: Wed, 6 May 2020 22:19:19 +0530 Subject: [PATCH 2/6] Refactored the codebase. --- java-es-cqrs/pom.xml | 9 ++- .../cqrs/projectors/UserProjector.java | 25 +++----- .../java/com/baeldung/patterns/crud/Main.java | 48 --------------- .../baeldung/patterns/domain/UserAddress.java | 2 - .../baeldung/patterns/domain/UserContact.java | 2 - .../java/com/baeldung/patterns/es/Main.java | 48 --------------- .../patterns/es/events/UserRemovedEvent.java | 12 ---- .../patterns/es/service/UserService.java | 48 +++++---------- .../patterns/es/service/UserUtility.java | 4 -- .../escqrs/projectors/UserProjector.java | 58 +++++-------------- .../patterns/cqrs/ApplicationUnitTest.java} | 39 +++++++++---- .../patterns/crud/ApplicationUnitTest.java | 48 +++++++++++++++ .../patterns/es/ApplicationUnitTest.java | 50 ++++++++++++++++ .../patterns/escqrs/ApplicationUnitTest.java} | 37 ++++++++---- 14 files changed, 195 insertions(+), 235 deletions(-) delete mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/crud/Main.java delete mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/es/Main.java delete mode 100644 java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserRemovedEvent.java rename java-es-cqrs/src/{main/java/com/baeldung/patterns/cqrs/Main.java => test/java/com/baeldung/patterns/cqrs/ApplicationUnitTest.java} (66%) create mode 100644 java-es-cqrs/src/test/java/com/baeldung/patterns/crud/ApplicationUnitTest.java create mode 100644 java-es-cqrs/src/test/java/com/baeldung/patterns/es/ApplicationUnitTest.java rename java-es-cqrs/src/{main/java/com/baeldung/patterns/escqrs/Main.java => test/java/com/baeldung/patterns/escqrs/ApplicationUnitTest.java} (69%) diff --git a/java-es-cqrs/pom.xml b/java-es-cqrs/pom.xml index 4160c62b0c..b1ebbf1d57 100644 --- a/java-es-cqrs/pom.xml +++ b/java-es-cqrs/pom.xml @@ -3,7 +3,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.sapient.learning - java-events + java-es-cqrs 0.0.1-SNAPSHOT java-es-cqrs @@ -16,5 +16,12 @@ lombok 1.18.12 + + junit + junit + 4.13 + test + + \ No newline at end of file diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projectors/UserProjector.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projectors/UserProjector.java index 25c10094c1..0344c352d9 100644 --- a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projectors/UserProjector.java +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projectors/UserProjector.java @@ -3,6 +3,7 @@ package com.baeldung.patterns.cqrs.projectors; import java.util.HashMap; import java.util.HashSet; import java.util.Map; +import java.util.Optional; import java.util.Set; import com.baeldung.patterns.cqrs.repository.UserReadRepository; @@ -21,36 +22,28 @@ public class UserProjector { } public void project(User user) { - UserContact userContact = readRepository.getUserContact(user.getUserid()); - if (userContact == null) - userContact = new UserContact(); - userContact.setContacts(user.getContacts()); + UserContact userContact = Optional.ofNullable(readRepository.getUserContact(user.getUserid())) + .orElse(new UserContact()); Map> contactByType = new HashMap<>(); for (Contact contact : user.getContacts()) { - Set contacts = contactByType.get(contact.getType()); - if (contacts == null) - contacts = new HashSet<>(); + Set contacts = Optional.ofNullable(contactByType.get(contact.getType())) + .orElse(new HashSet<>()); contacts.add(contact); contactByType.put(contact.getType(), contacts); } userContact.setContactByType(contactByType); readRepository.addUserContact(user.getUserid(), userContact); - UserAddress userAddress = readRepository.getUserAddress(user.getUserid()); - if (userAddress == null) - userAddress = new UserAddress(); - userAddress.setAddresses(user.getAddresses()); + UserAddress userAddress = Optional.ofNullable(readRepository.getUserAddress(user.getUserid())) + .orElse(new UserAddress()); Map> addressByRegion = new HashMap<>(); for (Address address : user.getAddresses()) { - Set
addresses = addressByRegion.get(address.getState()); - if (addresses == null) - addresses = new HashSet<>(); + Set
addresses = Optional.ofNullable(addressByRegion.get(address.getState())) + .orElse(new HashSet<>()); addresses.add(address); addressByRegion.put(address.getState(), addresses); } userAddress.setAddressByRegion(addressByRegion); readRepository.addUserAddress(user.getUserid(), userAddress); - } - } diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/Main.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/Main.java deleted file mode 100644 index 1f20e0be38..0000000000 --- a/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/Main.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.baeldung.patterns.crud; - -import java.util.UUID; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import com.baeldung.patterns.crud.repository.UserRepository; -import com.baeldung.patterns.crud.service.UserService; -import com.baeldung.patterns.domain.Address; -import com.baeldung.patterns.domain.Contact; - -public class Main { - - public static void main(String[] args) throws Exception { - - UserRepository repository = new UserRepository(); - UserService service = new UserService(repository); - String userId = UUID.randomUUID() - .toString(); - - service.createUser(userId, "Tom", "Sawyer"); - service.updateUser(userId, - Stream.of( - new Contact("EMAIL", "tom.sawyer@gmail.com"), - new Contact("EMAIL", "tom.sawyer@rediff.com"), - new Contact("PHONE", "700-000-0001")) - .collect(Collectors.toSet()), - Stream.of( - new Address("New York", "NY", "10001"), - new Address("Los Angeles", "CA", "90001"), - new Address("Housten", "TX", "77001")) - .collect(Collectors.toSet())); - service.updateUser(userId, - Stream.of( - new Contact("EMAIL", "tom.sawyer@gmail.com"), - new Contact("PHONE", "700-000-0001")) - .collect(Collectors.toSet()), - Stream.of( - new Address("New York", "NY", "10001"), - new Address("Housten", "TX", "77001")) - .collect(Collectors.toSet())); - - System.out.println(service.getContactByType(userId, "EMAIL")); - System.out.println(service.getAddressByRegion(userId, "NY")); - - } - -} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserAddress.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserAddress.java index 33f9bdf28f..8105a53265 100644 --- a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserAddress.java +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserAddress.java @@ -1,7 +1,6 @@ package com.baeldung.patterns.domain; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -10,7 +9,6 @@ import lombok.Data; @Data public class UserAddress { - private Set
addresses = new HashSet<>(); private Map> addressByRegion = new HashMap<>(); } diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserContact.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserContact.java index 4f2ba812a4..1768dadc39 100644 --- a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserContact.java +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserContact.java @@ -1,7 +1,6 @@ package com.baeldung.patterns.domain; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -10,7 +9,6 @@ import lombok.Data; @Data public class UserContact { - private Set contacts = new HashSet<>(); private Map> contactByType = new HashMap<>(); } diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/Main.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/Main.java deleted file mode 100644 index 77649088e9..0000000000 --- a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/Main.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.baeldung.patterns.es; - -import java.util.UUID; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import com.baeldung.patterns.domain.Address; -import com.baeldung.patterns.domain.Contact; -import com.baeldung.patterns.es.repository.EventStore; -import com.baeldung.patterns.es.service.UserService; - -public class Main { - - public static void main(String[] args) throws Exception { - - EventStore repository = new EventStore(); - UserService service = new UserService(repository); - String userId = UUID.randomUUID() - .toString(); - - service.createUser(userId, "Tom", "Sawyer"); - service.updateUser(userId, - Stream.of( - new Contact("EMAIL", "tom.sawyer@gmail.com"), - new Contact("EMAIL", "tom.sawyer@rediff.com"), - new Contact("PHONE", "700-000-0001")) - .collect(Collectors.toSet()), - Stream.of( - new Address("New York", "NY", "10001"), - new Address("Los Angeles", "CA", "90001"), - new Address("Housten", "TX", "77001")) - .collect(Collectors.toSet())); - service.updateUser(userId, - Stream.of( - new Contact("EMAIL", "tom.sawyer@gmail.com"), - new Contact("PHONE", "700-000-0001")) - .collect(Collectors.toSet()), - Stream.of( - new Address("New York", "NY", "10001"), - new Address("Housten", "TX", "77001")) - .collect(Collectors.toSet())); - - System.out.println(service.getContactByType(userId, "EMAIL")); - System.out.println(service.getAddressByRegion(userId, "NY")); - - } - -} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserRemovedEvent.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserRemovedEvent.java deleted file mode 100644 index b609cb1daf..0000000000 --- a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserRemovedEvent.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.baeldung.patterns.es.events; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@Data -@AllArgsConstructor -@EqualsAndHashCode(callSuper = false) -public class UserRemovedEvent extends Event { - -} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserService.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserService.java index 0233453d68..9650c4294f 100644 --- a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserService.java +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserService.java @@ -1,6 +1,5 @@ package com.baeldung.patterns.es.service; -import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -23,8 +22,7 @@ public class UserService { } public void createUser(String userId, String firstName, String lastName) { - UserCreatedEvent event = new UserCreatedEvent(userId, firstName, lastName); - repository.addEvent(userId, event); + repository.addEvent(userId, new UserCreatedEvent(userId, firstName, lastName)); } public void updateUser(String userId, Set contacts, Set
addresses) throws Exception { @@ -32,49 +30,30 @@ public class UserService { if (user == null) throw new Exception("User does not exist."); - List contactsToRemove = user.getContacts() + user.getContacts() .stream() .filter(c -> !contacts.contains(c)) - .collect(Collectors.toList()); - for (Contact contact : contactsToRemove) { - UserContactRemovedEvent contactRemovedEvent = new UserContactRemovedEvent(contact.getType(), contact.getDetail()); - repository.addEvent(userId, contactRemovedEvent); - } - - List contactsToAdd = contacts.stream() + .forEach(c -> repository.addEvent(userId, new UserContactRemovedEvent(c.getType(), c.getDetail()))); + contacts.stream() .filter(c -> !user.getContacts() .contains(c)) - .collect(Collectors.toList()); - for (Contact contact : contactsToAdd) { - UserContactAddedEvent contactAddedEvent = new UserContactAddedEvent(contact.getType(), contact.getDetail()); - repository.addEvent(userId, contactAddedEvent); - } - - List
addressesToRemove = user.getAddresses() + .forEach(c -> repository.addEvent(userId, new UserContactAddedEvent(c.getType(), c.getDetail()))); + user.getAddresses() .stream() .filter(a -> !addresses.contains(a)) - .collect(Collectors.toList()); - for (Address address : addressesToRemove) { - UserAddressRemovedEvent addressRemovedEvent = new UserAddressRemovedEvent(address.getCity(), address.getState(), address.getPostcode()); - repository.addEvent(userId, addressRemovedEvent); - } - - List
addressesToAdd = addresses.stream() + .forEach(a -> repository.addEvent(userId, new UserAddressRemovedEvent(a.getCity(), a.getState(), a.getPostcode()))); + addresses.stream() .filter(a -> !user.getAddresses() .contains(a)) - .collect(Collectors.toList()); - for (Address address : addressesToAdd) { - UserAddressAddedEvent addressAddedEvent = new UserAddressAddedEvent(address.getCity(), address.getState(), address.getPostcode()); - repository.addEvent(userId, addressAddedEvent); - } + .forEach(a -> repository.addEvent(userId, new UserAddressAddedEvent(a.getCity(), a.getState(), a.getPostcode()))); } public Set getContactByType(String userId, String contactType) throws Exception { User user = UserUtility.recreateUserState(repository, userId); if (user == null) throw new Exception("User does not exist."); - Set contacts = user.getContacts(); - return contacts.stream() + return user.getContacts() + .stream() .filter(c -> c.getType() .equals(contactType)) .collect(Collectors.toSet()); @@ -84,11 +63,10 @@ public class UserService { User user = UserUtility.recreateUserState(repository, userId); if (user == null) throw new Exception("User does not exist."); - Set
addresses = user.getAddresses(); - return addresses.stream() + return user.getAddresses() + .stream() .filter(a -> a.getState() .equals(state)) .collect(Collectors.toSet()); } - } diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserUtility.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserUtility.java index b7ed9208b2..e44e404588 100644 --- a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserUtility.java +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserUtility.java @@ -12,7 +12,6 @@ import com.baeldung.patterns.es.events.UserAddressRemovedEvent; import com.baeldung.patterns.es.events.UserContactAddedEvent; import com.baeldung.patterns.es.events.UserContactRemovedEvent; import com.baeldung.patterns.es.events.UserCreatedEvent; -import com.baeldung.patterns.es.events.UserRemovedEvent; import com.baeldung.patterns.es.repository.EventStore; public class UserUtility { @@ -27,9 +26,6 @@ public class UserUtility { user = new User(UUID.randomUUID() .toString(), e.getFirstName(), e.getLastName()); } - if (event instanceof UserRemovedEvent) { - user = null; - } if (event instanceof UserAddressAddedEvent) { UserAddressAddedEvent e = (UserAddressAddedEvent) event; Address address = new Address(e.getCity(), e.getState(), e.getPostCode()); diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/projectors/UserProjector.java b/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/projectors/UserProjector.java index 036b6e8396..d388abe7cb 100644 --- a/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/projectors/UserProjector.java +++ b/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/projectors/UserProjector.java @@ -2,6 +2,7 @@ package com.baeldung.patterns.escqrs.projectors; import java.util.HashSet; import java.util.List; +import java.util.Optional; import java.util.Set; import com.baeldung.patterns.cqrs.repository.UserReadRepository; @@ -14,8 +15,6 @@ import com.baeldung.patterns.es.events.UserAddressAddedEvent; import com.baeldung.patterns.es.events.UserAddressRemovedEvent; import com.baeldung.patterns.es.events.UserContactAddedEvent; import com.baeldung.patterns.es.events.UserContactRemovedEvent; -import com.baeldung.patterns.es.events.UserCreatedEvent; -import com.baeldung.patterns.es.events.UserRemovedEvent; public class UserProjector { @@ -28,10 +27,6 @@ public class UserProjector { public void project(String userId, List events) { for (Event event : events) { - if (event instanceof UserCreatedEvent) - apply(userId, (UserCreatedEvent) event); - if (event instanceof UserRemovedEvent) - apply(userId, (UserRemovedEvent) event); if (event instanceof UserAddressAddedEvent) apply(userId, (UserAddressAddedEvent) event); if (event instanceof UserAddressRemovedEvent) @@ -44,25 +39,13 @@ public class UserProjector { } - public void apply(String userId, UserCreatedEvent event) { - - } - - public void apply(String userId, UserRemovedEvent event) { - - } - public void apply(String userId, UserAddressAddedEvent event) { Address address = new Address(event.getCity(), event.getState(), event.getPostCode()); - UserAddress userAddress = readRepository.getUserAddress(userId); - if (userAddress == null) - userAddress = new UserAddress(); - userAddress.getAddresses() - .add(address); - Set
addresses = userAddress.getAddressByRegion() - .get(address.getState()); - if (addresses == null) - addresses = new HashSet<>(); + UserAddress userAddress = Optional.ofNullable(readRepository.getUserAddress(userId)) + .orElse(new UserAddress()); + Set
addresses = Optional.ofNullable(userAddress.getAddressByRegion() + .get(address.getState())) + .orElse(new HashSet<>()); addresses.add(address); userAddress.getAddressByRegion() .put(address.getState(), addresses); @@ -73,30 +56,21 @@ public class UserProjector { Address address = new Address(event.getCity(), event.getState(), event.getPostCode()); UserAddress userAddress = readRepository.getUserAddress(userId); if (userAddress != null) { - userAddress.getAddresses() - .remove(address); Set
addresses = userAddress.getAddressByRegion() .get(address.getState()); - if (addresses != null) { + if (addresses != null) addresses.remove(address); - userAddress.getAddressByRegion() - .put(address.getState(), addresses); - } readRepository.addUserAddress(userId, userAddress); } } public void apply(String userId, UserContactAddedEvent event) { Contact contact = new Contact(event.getContactType(), event.getContactDetails()); - UserContact userContact = readRepository.getUserContact(userId); - if (userContact == null) - userContact = new UserContact(); - userContact.getContacts() - .add(contact); - Set contacts = userContact.getContactByType() - .get(contact.getType()); - if (contacts == null) - contacts = new HashSet<>(); + UserContact userContact = Optional.ofNullable(readRepository.getUserContact(userId)) + .orElse(new UserContact()); + Set contacts = Optional.ofNullable(userContact.getContactByType() + .get(contact.getType())) + .orElse(new HashSet<>()); contacts.add(contact); userContact.getContactByType() .put(contact.getType(), contacts); @@ -107,17 +81,11 @@ public class UserProjector { Contact contact = new Contact(event.getContactType(), event.getContactDetails()); UserContact userContact = readRepository.getUserContact(userId); if (userContact != null) { - userContact.getContacts() - .remove(contact); Set contacts = userContact.getContactByType() .get(contact.getType()); - if (contacts != null) { + if (contacts != null) contacts.remove(contact); - userContact.getContactByType() - .put(contact.getType(), contacts); - } readRepository.addUserContact(userId, userContact); } } - } diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/Main.java b/java-es-cqrs/src/test/java/com/baeldung/patterns/cqrs/ApplicationUnitTest.java similarity index 66% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/Main.java rename to java-es-cqrs/src/test/java/com/baeldung/patterns/cqrs/ApplicationUnitTest.java index 4e9c872cf1..4a324e72f6 100644 --- a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/Main.java +++ b/java-es-cqrs/src/test/java/com/baeldung/patterns/cqrs/ApplicationUnitTest.java @@ -1,9 +1,14 @@ package com.baeldung.patterns.cqrs; +import static org.junit.Assert.assertEquals; + import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.junit.Before; +import org.junit.Test; + import com.baeldung.patterns.cqrs.aggregates.UserAggregate; import com.baeldung.patterns.cqrs.commands.CreateUserCommand; import com.baeldung.patterns.cqrs.commands.UpdateUserCommand; @@ -17,15 +22,25 @@ import com.baeldung.patterns.domain.Address; import com.baeldung.patterns.domain.Contact; import com.baeldung.patterns.domain.User; -public class Main { +public class ApplicationUnitTest { - public static void main(String[] args) throws Exception { - UserWriteRepository writeRepository = new UserWriteRepository(); - UserReadRepository readRepository = new UserReadRepository(); - UserProjector projector = new UserProjector(readRepository); - UserAggregate userAggregate = new UserAggregate(writeRepository); - UserProjection userProjection = new UserProjection(readRepository); + private UserWriteRepository writeRepository; + private UserReadRepository readRepository; + private UserProjector projector; + private UserAggregate userAggregate; + private UserProjection userProjection; + @Before + public void setUp() { + writeRepository = new UserWriteRepository(); + readRepository = new UserReadRepository(); + projector = new UserProjector(readRepository); + userAggregate = new UserAggregate(writeRepository); + userProjection = new UserProjection(readRepository); + } + + @Test + public void testApplication() throws Exception { String userId = UUID.randomUUID() .toString(); User user = null; @@ -47,11 +62,13 @@ public class Main { user = userAggregate.handleUpdateUserCommand(updateUserCommand); projector.project(user); - AddressByRegionQuery addressByRegionQuery = new AddressByRegionQuery(user.getUserid(), "NY"); - System.out.println(userProjection.handle(addressByRegionQuery)); + ContactByTypeQuery contactByTypeQuery = new ContactByTypeQuery(userId, "EMAIL"); + assertEquals(Stream.of(new Contact("EMAIL", "tom.sawyer@gmail.com")) + .collect(Collectors.toSet()), userProjection.handle(contactByTypeQuery)); + AddressByRegionQuery addressByRegionQuery = new AddressByRegionQuery(userId, "NY"); + assertEquals(Stream.of(new Address("New York", "NY", "10001")) + .collect(Collectors.toSet()), userProjection.handle(addressByRegionQuery)); - ContactByTypeQuery contactByTypeQuery = new ContactByTypeQuery(user.getUserid(), "EMAIL"); - System.out.println(userProjection.handle(contactByTypeQuery)); } } diff --git a/java-es-cqrs/src/test/java/com/baeldung/patterns/crud/ApplicationUnitTest.java b/java-es-cqrs/src/test/java/com/baeldung/patterns/crud/ApplicationUnitTest.java new file mode 100644 index 0000000000..28c113bf46 --- /dev/null +++ b/java-es-cqrs/src/test/java/com/baeldung/patterns/crud/ApplicationUnitTest.java @@ -0,0 +1,48 @@ +package com.baeldung.patterns.crud; + +import static org.junit.Assert.assertEquals; + +import java.util.UUID; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.patterns.crud.repository.UserRepository; +import com.baeldung.patterns.crud.service.UserService; +import com.baeldung.patterns.domain.Address; +import com.baeldung.patterns.domain.Contact; + +public class ApplicationUnitTest { + + private UserRepository repository; + + @Before + public void setUp() { + repository = new UserRepository(); + } + + @Test + public void testApplication() throws Exception { + UserService service = new UserService(repository); + String userId = UUID.randomUUID() + .toString(); + + service.createUser(userId, "Tom", "Sawyer"); + service.updateUser(userId, Stream.of(new Contact("EMAIL", "tom.sawyer@gmail.com"), new Contact("EMAIL", "tom.sawyer@rediff.com"), new Contact("PHONE", "700-000-0001")) + .collect(Collectors.toSet()), + Stream.of(new Address("New York", "NY", "10001"), new Address("Los Angeles", "CA", "90001"), new Address("Housten", "TX", "77001")) + .collect(Collectors.toSet())); + service.updateUser(userId, Stream.of(new Contact("EMAIL", "tom.sawyer@gmail.com"), new Contact("PHONE", "700-000-0001")) + .collect(Collectors.toSet()), + Stream.of(new Address("New York", "NY", "10001"), new Address("Housten", "TX", "77001")) + .collect(Collectors.toSet())); + + assertEquals(Stream.of(new Contact("EMAIL", "tom.sawyer@gmail.com")) + .collect(Collectors.toSet()), service.getContactByType(userId, "EMAIL")); + assertEquals(Stream.of(new Address("New York", "NY", "10001")) + .collect(Collectors.toSet()), service.getAddressByRegion(userId, "NY")); + } + +} diff --git a/java-es-cqrs/src/test/java/com/baeldung/patterns/es/ApplicationUnitTest.java b/java-es-cqrs/src/test/java/com/baeldung/patterns/es/ApplicationUnitTest.java new file mode 100644 index 0000000000..52bdde449f --- /dev/null +++ b/java-es-cqrs/src/test/java/com/baeldung/patterns/es/ApplicationUnitTest.java @@ -0,0 +1,50 @@ +package com.baeldung.patterns.es; + +import static org.junit.Assert.assertEquals; + +import java.util.UUID; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.patterns.domain.Address; +import com.baeldung.patterns.domain.Contact; +import com.baeldung.patterns.es.repository.EventStore; +import com.baeldung.patterns.es.service.UserService; + +public class ApplicationUnitTest { + + private EventStore repository; + private UserService service; + + @Before + public void setUp() { + repository = new EventStore(); + service = new UserService(repository); + } + + @Test + public void testApplication() throws Exception { + String userId = UUID.randomUUID() + .toString(); + + service.createUser(userId, "Tom", "Sawyer"); + service.updateUser(userId, Stream.of(new Contact("EMAIL", "tom.sawyer@gmail.com"), new Contact("EMAIL", "tom.sawyer@rediff.com"), new Contact("PHONE", "700-000-0001")) + .collect(Collectors.toSet()), + Stream.of(new Address("New York", "NY", "10001"), new Address("Los Angeles", "CA", "90001"), new Address("Housten", "TX", "77001")) + .collect(Collectors.toSet())); + service.updateUser(userId, Stream.of(new Contact("EMAIL", "tom.sawyer@gmail.com"), new Contact("PHONE", "700-000-0001")) + .collect(Collectors.toSet()), + Stream.of(new Address("New York", "NY", "10001"), new Address("Housten", "TX", "77001")) + .collect(Collectors.toSet())); + + assertEquals(Stream.of(new Contact("EMAIL", "tom.sawyer@gmail.com")) + .collect(Collectors.toSet()), service.getContactByType(userId, "EMAIL")); + assertEquals(Stream.of(new Address("New York", "NY", "10001")) + .collect(Collectors.toSet()), service.getAddressByRegion(userId, "NY")); + + } + +} diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/Main.java b/java-es-cqrs/src/test/java/com/baeldung/patterns/escqrs/ApplicationUnitTest.java similarity index 69% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/Main.java rename to java-es-cqrs/src/test/java/com/baeldung/patterns/escqrs/ApplicationUnitTest.java index 44395a75a7..22cb5235d1 100644 --- a/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/Main.java +++ b/java-es-cqrs/src/test/java/com/baeldung/patterns/escqrs/ApplicationUnitTest.java @@ -1,10 +1,15 @@ package com.baeldung.patterns.escqrs; +import static org.junit.Assert.assertEquals; + import java.util.List; import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.junit.Before; +import org.junit.Test; + import com.baeldung.patterns.cqrs.commands.CreateUserCommand; import com.baeldung.patterns.cqrs.commands.UpdateUserCommand; import com.baeldung.patterns.cqrs.projections.UserProjection; @@ -18,16 +23,25 @@ import com.baeldung.patterns.es.repository.EventStore; import com.baeldung.patterns.escqrs.aggregates.UserAggregate; import com.baeldung.patterns.escqrs.projectors.UserProjector; -public class Main { +public class ApplicationUnitTest { - public static void main(String[] args) throws Exception { + private EventStore writeRepository; + private UserReadRepository readRepository; + private UserProjector projector; + private UserAggregate userAggregate; + private UserProjection userProjection; - EventStore writeRepository = new EventStore(); - UserReadRepository readRepository = new UserReadRepository(); - UserProjector projector = new UserProjector(readRepository); - UserAggregate userAggregate = new UserAggregate(writeRepository); - UserProjection userProjection = new UserProjection(readRepository); + @Before + public void setUp() { + writeRepository = new EventStore(); + readRepository = new UserReadRepository(); + projector = new UserProjector(readRepository); + userAggregate = new UserAggregate(writeRepository); + userProjection = new UserProjection(readRepository); + } + @Test + public void testApplication() throws Exception { String userId = UUID.randomUUID() .toString(); List events = null; @@ -50,11 +64,12 @@ public class Main { events = userAggregate.handleUpdateUserCommand(updateUserCommand); projector.project(userId, events); - AddressByRegionQuery addressByRegionQuery = new AddressByRegionQuery(userId, "NY"); - System.out.println(userProjection.handle(addressByRegionQuery)); - ContactByTypeQuery contactByTypeQuery = new ContactByTypeQuery(userId, "EMAIL"); - System.out.println(userProjection.handle(contactByTypeQuery)); + assertEquals(Stream.of(new Contact("EMAIL", "tom.sawyer@gmail.com")) + .collect(Collectors.toSet()), userProjection.handle(contactByTypeQuery)); + AddressByRegionQuery addressByRegionQuery = new AddressByRegionQuery(userId, "NY"); + assertEquals(Stream.of(new Address("New York", "NY", "10001")) + .collect(Collectors.toSet()), userProjection.handle(addressByRegionQuery)); } From ab3336e9b0f6f0f8b37b2c7f6302de3a04e718ef Mon Sep 17 00:00:00 2001 From: CHANDRAKANT Kumar Date: Sat, 9 May 2020 18:59:56 +0530 Subject: [PATCH 3/6] Updated pom descriptor and formatting. --- java-es-cqrs/.gitignore | 29 ---------------------- java-es-cqrs/pom.xml | 53 ++++++++++++++++++++++------------------- pom.xml | 2 ++ 3 files changed, 30 insertions(+), 54 deletions(-) delete mode 100644 java-es-cqrs/.gitignore diff --git a/java-es-cqrs/.gitignore b/java-es-cqrs/.gitignore deleted file mode 100644 index 153c9335eb..0000000000 --- a/java-es-cqrs/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -HELP.md -/target/ -!.mvn/wrapper/maven-wrapper.jar - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -/build/ - -### VS Code ### -.vscode/ diff --git a/java-es-cqrs/pom.xml b/java-es-cqrs/pom.xml index b1ebbf1d57..8760a38262 100644 --- a/java-es-cqrs/pom.xml +++ b/java-es-cqrs/pom.xml @@ -1,27 +1,30 @@ - 4.0.0 - com.sapient.learning - java-es-cqrs - 0.0.1-SNAPSHOT - java-es-cqrs - - 1.8 - 1.8 - - - - org.projectlombok - lombok - 1.18.12 - - - junit - junit - 4.13 - test - - - + 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 + java-es-cqrs + 1.0-SNAPSHOT + java-es-cqrs + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + 1.8 + 1.8 + + + + org.projectlombok + lombok + 1.18.12 + + + junit + junit + 4.13 + test + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 2f4579c999..9a4b40b950 100644 --- a/pom.xml +++ b/pom.xml @@ -568,6 +568,7 @@ rxjava-operators atomikos + java-es-cqrs @@ -1083,6 +1084,7 @@ rxjava-operators atomikos + java-es-cqrs From 3977ef96c681bcf1731763ac3fe07898c0efabcb Mon Sep 17 00:00:00 2001 From: CHANDRAKANT Kumar Date: Sat, 16 May 2020 01:46:02 +0530 Subject: [PATCH 4/6] Incorporated review comments from editor. --- {java-es-cqrs => patterns/cqrs-es}/pom.xml | 6 +++--- .../baeldung/patterns/cqrs/aggregates/UserAggregate.java | 0 .../baeldung/patterns/cqrs/commands/CreateUserCommand.java | 0 .../baeldung/patterns/cqrs/commands/UpdateUserCommand.java | 0 .../baeldung/patterns/cqrs/projections/UserProjection.java | 0 .../baeldung/patterns/cqrs/projectors/UserProjector.java | 0 .../patterns/cqrs/queries/AddressByRegionQuery.java | 0 .../baeldung/patterns/cqrs/queries/ContactByTypeQuery.java | 0 .../patterns/cqrs/repository/UserReadRepository.java | 0 .../patterns/cqrs/repository/UserWriteRepository.java | 0 .../baeldung/patterns/crud/repository/UserRepository.java | 0 .../com/baeldung/patterns/crud/service/UserService.java | 0 .../src/main/java/com/baeldung/patterns/domain/Address.java | 0 .../src/main/java/com/baeldung/patterns/domain/Contact.java | 0 .../src/main/java/com/baeldung/patterns/domain/User.java | 0 .../main/java/com/baeldung/patterns/domain/UserAddress.java | 0 .../main/java/com/baeldung/patterns/domain/UserContact.java | 0 .../main/java/com/baeldung/patterns/es/events/Event.java | 0 .../baeldung/patterns/es/events/UserAddressAddedEvent.java | 0 .../patterns/es/events/UserAddressRemovedEvent.java | 0 .../baeldung/patterns/es/events/UserContactAddedEvent.java | 0 .../patterns/es/events/UserContactRemovedEvent.java | 0 .../com/baeldung/patterns/es/events/UserCreatedEvent.java | 0 .../com/baeldung/patterns/es/repository/EventStore.java | 0 .../java/com/baeldung/patterns/es/service/UserService.java | 0 .../java/com/baeldung/patterns/es/service/UserUtility.java | 0 .../baeldung/patterns/escqrs/aggregates/UserAggregate.java | 0 .../baeldung/patterns/escqrs/projectors/UserProjector.java | 0 .../com/baeldung/patterns/cqrs/ApplicationUnitTest.java | 2 +- .../com/baeldung/patterns/crud/ApplicationUnitTest.java | 2 +- .../java/com/baeldung/patterns/es/ApplicationUnitTest.java | 2 +- .../com/baeldung/patterns/escqrs/ApplicationUnitTest.java | 2 +- patterns/pom.xml | 1 + pom.xml | 2 -- 34 files changed, 8 insertions(+), 9 deletions(-) rename {java-es-cqrs => patterns/cqrs-es}/pom.xml (88%) rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/cqrs/aggregates/UserAggregate.java (100%) rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/cqrs/commands/CreateUserCommand.java (100%) rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/cqrs/commands/UpdateUserCommand.java (100%) rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/cqrs/projections/UserProjection.java (100%) rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/cqrs/projectors/UserProjector.java (100%) rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/cqrs/queries/AddressByRegionQuery.java (100%) rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/cqrs/queries/ContactByTypeQuery.java (100%) rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/cqrs/repository/UserReadRepository.java (100%) rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/cqrs/repository/UserWriteRepository.java (100%) rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/crud/repository/UserRepository.java (100%) rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/crud/service/UserService.java (100%) rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/domain/Address.java (100%) rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/domain/Contact.java (100%) rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/domain/User.java (100%) rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/domain/UserAddress.java (100%) rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/domain/UserContact.java (100%) rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/es/events/Event.java (100%) rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/es/events/UserAddressAddedEvent.java (100%) rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/es/events/UserAddressRemovedEvent.java (100%) rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/es/events/UserContactAddedEvent.java (100%) rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/es/events/UserContactRemovedEvent.java (100%) rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/es/events/UserCreatedEvent.java (100%) rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/es/repository/EventStore.java (100%) rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/es/service/UserService.java (100%) rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/es/service/UserUtility.java (100%) rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/escqrs/aggregates/UserAggregate.java (100%) rename {java-es-cqrs => patterns/cqrs-es}/src/main/java/com/baeldung/patterns/escqrs/projectors/UserProjector.java (100%) rename {java-es-cqrs => patterns/cqrs-es}/src/test/java/com/baeldung/patterns/cqrs/ApplicationUnitTest.java (96%) rename {java-es-cqrs => patterns/cqrs-es}/src/test/java/com/baeldung/patterns/crud/ApplicationUnitTest.java (95%) rename {java-es-cqrs => patterns/cqrs-es}/src/test/java/com/baeldung/patterns/es/ApplicationUnitTest.java (95%) rename {java-es-cqrs => patterns/cqrs-es}/src/test/java/com/baeldung/patterns/escqrs/ApplicationUnitTest.java (97%) diff --git a/java-es-cqrs/pom.xml b/patterns/cqrs-es/pom.xml similarity index 88% rename from java-es-cqrs/pom.xml rename to patterns/cqrs-es/pom.xml index 8760a38262..3c54038837 100644 --- a/java-es-cqrs/pom.xml +++ b/patterns/cqrs-es/pom.xml @@ -2,12 +2,12 @@ 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 - java-es-cqrs + cqrs-es 1.0-SNAPSHOT - java-es-cqrs + cqrs-es com.baeldung - parent-modules + patterns 1.0.0-SNAPSHOT diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/aggregates/UserAggregate.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/aggregates/UserAggregate.java similarity index 100% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/aggregates/UserAggregate.java rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/aggregates/UserAggregate.java diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/commands/CreateUserCommand.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/commands/CreateUserCommand.java similarity index 100% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/commands/CreateUserCommand.java rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/commands/CreateUserCommand.java diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/commands/UpdateUserCommand.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/commands/UpdateUserCommand.java similarity index 100% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/commands/UpdateUserCommand.java rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/commands/UpdateUserCommand.java diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projections/UserProjection.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/projections/UserProjection.java similarity index 100% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projections/UserProjection.java rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/projections/UserProjection.java diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projectors/UserProjector.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/projectors/UserProjector.java similarity index 100% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/projectors/UserProjector.java rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/projectors/UserProjector.java diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/queries/AddressByRegionQuery.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/queries/AddressByRegionQuery.java similarity index 100% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/queries/AddressByRegionQuery.java rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/queries/AddressByRegionQuery.java diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/queries/ContactByTypeQuery.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/queries/ContactByTypeQuery.java similarity index 100% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/queries/ContactByTypeQuery.java rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/queries/ContactByTypeQuery.java diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/repository/UserReadRepository.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/repository/UserReadRepository.java similarity index 100% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/repository/UserReadRepository.java rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/repository/UserReadRepository.java diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/repository/UserWriteRepository.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/repository/UserWriteRepository.java similarity index 100% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/cqrs/repository/UserWriteRepository.java rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/repository/UserWriteRepository.java diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/repository/UserRepository.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/crud/repository/UserRepository.java similarity index 100% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/crud/repository/UserRepository.java rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/crud/repository/UserRepository.java diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/crud/service/UserService.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/crud/service/UserService.java similarity index 100% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/crud/service/UserService.java rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/crud/service/UserService.java diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/Address.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/domain/Address.java similarity index 100% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/domain/Address.java rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/domain/Address.java diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/Contact.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/domain/Contact.java similarity index 100% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/domain/Contact.java rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/domain/Contact.java diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/User.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/domain/User.java similarity index 100% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/domain/User.java rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/domain/User.java diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserAddress.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/domain/UserAddress.java similarity index 100% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserAddress.java rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/domain/UserAddress.java diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserContact.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/domain/UserContact.java similarity index 100% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/domain/UserContact.java rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/domain/UserContact.java diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/Event.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/events/Event.java similarity index 100% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/Event.java rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/events/Event.java diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserAddressAddedEvent.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/events/UserAddressAddedEvent.java similarity index 100% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserAddressAddedEvent.java rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/events/UserAddressAddedEvent.java diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserAddressRemovedEvent.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/events/UserAddressRemovedEvent.java similarity index 100% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserAddressRemovedEvent.java rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/events/UserAddressRemovedEvent.java diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserContactAddedEvent.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/events/UserContactAddedEvent.java similarity index 100% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserContactAddedEvent.java rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/events/UserContactAddedEvent.java diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserContactRemovedEvent.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/events/UserContactRemovedEvent.java similarity index 100% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserContactRemovedEvent.java rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/events/UserContactRemovedEvent.java diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserCreatedEvent.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/events/UserCreatedEvent.java similarity index 100% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/es/events/UserCreatedEvent.java rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/events/UserCreatedEvent.java diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/repository/EventStore.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/repository/EventStore.java similarity index 100% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/es/repository/EventStore.java rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/repository/EventStore.java diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserService.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/service/UserService.java similarity index 100% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserService.java rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/service/UserService.java diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserUtility.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/service/UserUtility.java similarity index 100% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/es/service/UserUtility.java rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/es/service/UserUtility.java diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/aggregates/UserAggregate.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/escqrs/aggregates/UserAggregate.java similarity index 100% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/aggregates/UserAggregate.java rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/escqrs/aggregates/UserAggregate.java diff --git a/java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/projectors/UserProjector.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/escqrs/projectors/UserProjector.java similarity index 100% rename from java-es-cqrs/src/main/java/com/baeldung/patterns/escqrs/projectors/UserProjector.java rename to patterns/cqrs-es/src/main/java/com/baeldung/patterns/escqrs/projectors/UserProjector.java diff --git a/java-es-cqrs/src/test/java/com/baeldung/patterns/cqrs/ApplicationUnitTest.java b/patterns/cqrs-es/src/test/java/com/baeldung/patterns/cqrs/ApplicationUnitTest.java similarity index 96% rename from java-es-cqrs/src/test/java/com/baeldung/patterns/cqrs/ApplicationUnitTest.java rename to patterns/cqrs-es/src/test/java/com/baeldung/patterns/cqrs/ApplicationUnitTest.java index 4a324e72f6..7f68a64274 100644 --- a/java-es-cqrs/src/test/java/com/baeldung/patterns/cqrs/ApplicationUnitTest.java +++ b/patterns/cqrs-es/src/test/java/com/baeldung/patterns/cqrs/ApplicationUnitTest.java @@ -40,7 +40,7 @@ public class ApplicationUnitTest { } @Test - public void testApplication() throws Exception { + public void givenCQRSApplication_whenCommandRun_thenQueryShouldReturnResult() throws Exception { String userId = UUID.randomUUID() .toString(); User user = null; diff --git a/java-es-cqrs/src/test/java/com/baeldung/patterns/crud/ApplicationUnitTest.java b/patterns/cqrs-es/src/test/java/com/baeldung/patterns/crud/ApplicationUnitTest.java similarity index 95% rename from java-es-cqrs/src/test/java/com/baeldung/patterns/crud/ApplicationUnitTest.java rename to patterns/cqrs-es/src/test/java/com/baeldung/patterns/crud/ApplicationUnitTest.java index 28c113bf46..3fabfe405d 100644 --- a/java-es-cqrs/src/test/java/com/baeldung/patterns/crud/ApplicationUnitTest.java +++ b/patterns/cqrs-es/src/test/java/com/baeldung/patterns/crud/ApplicationUnitTest.java @@ -24,7 +24,7 @@ public class ApplicationUnitTest { } @Test - public void testApplication() throws Exception { + public void givenCRUDApplication_whenDataCreated_thenDataCanBeFetched() throws Exception { UserService service = new UserService(repository); String userId = UUID.randomUUID() .toString(); diff --git a/java-es-cqrs/src/test/java/com/baeldung/patterns/es/ApplicationUnitTest.java b/patterns/cqrs-es/src/test/java/com/baeldung/patterns/es/ApplicationUnitTest.java similarity index 95% rename from java-es-cqrs/src/test/java/com/baeldung/patterns/es/ApplicationUnitTest.java rename to patterns/cqrs-es/src/test/java/com/baeldung/patterns/es/ApplicationUnitTest.java index 52bdde449f..61e7b4c05a 100644 --- a/java-es-cqrs/src/test/java/com/baeldung/patterns/es/ApplicationUnitTest.java +++ b/patterns/cqrs-es/src/test/java/com/baeldung/patterns/es/ApplicationUnitTest.java @@ -26,7 +26,7 @@ public class ApplicationUnitTest { } @Test - public void testApplication() throws Exception { + public void givenCRUDApplication_whenDataCreated_thenDataCanBeFetched() throws Exception { String userId = UUID.randomUUID() .toString(); diff --git a/java-es-cqrs/src/test/java/com/baeldung/patterns/escqrs/ApplicationUnitTest.java b/patterns/cqrs-es/src/test/java/com/baeldung/patterns/escqrs/ApplicationUnitTest.java similarity index 97% rename from java-es-cqrs/src/test/java/com/baeldung/patterns/escqrs/ApplicationUnitTest.java rename to patterns/cqrs-es/src/test/java/com/baeldung/patterns/escqrs/ApplicationUnitTest.java index 22cb5235d1..e0460b2f12 100644 --- a/java-es-cqrs/src/test/java/com/baeldung/patterns/escqrs/ApplicationUnitTest.java +++ b/patterns/cqrs-es/src/test/java/com/baeldung/patterns/escqrs/ApplicationUnitTest.java @@ -41,7 +41,7 @@ public class ApplicationUnitTest { } @Test - public void testApplication() throws Exception { + public void givenCQRSApplication_whenCommandRun_thenQueryShouldReturnResult() throws Exception { String userId = UUID.randomUUID() .toString(); List events = null; diff --git a/patterns/pom.xml b/patterns/pom.xml index 4c17055231..fa46a79f5a 100644 --- a/patterns/pom.xml +++ b/patterns/pom.xml @@ -21,6 +21,7 @@ design-patterns-functional design-patterns-structural dip + cqrs-es front-controller intercepting-filter solid diff --git a/pom.xml b/pom.xml index 9a4b40b950..2f4579c999 100644 --- a/pom.xml +++ b/pom.xml @@ -568,7 +568,6 @@ rxjava-operators atomikos - java-es-cqrs @@ -1084,7 +1083,6 @@ rxjava-operators atomikos - java-es-cqrs From 642b12365ae3cbe6e3cccb03ddebd38935d89761 Mon Sep 17 00:00:00 2001 From: CHANDRAKANT Kumar Date: Mon, 18 May 2020 23:04:48 +0530 Subject: [PATCH 5/6] Removed blank lines from the parent pom. --- patterns/pom.xml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/patterns/pom.xml b/patterns/pom.xml index fa46a79f5a..be8d183be0 100644 --- a/patterns/pom.xml +++ b/patterns/pom.xml @@ -5,13 +5,11 @@ patterns patterns pom - com.baeldung parent-modules 1.0.0-SNAPSHOT - design-patterns-architectural design-patterns-behavioral @@ -26,7 +24,6 @@ intercepting-filter solid - @@ -37,7 +34,6 @@ - @@ -54,9 +50,7 @@ - 9.4.0.v20161208 - - + \ No newline at end of file From 24fe7f5fe413e0e56e113852bfc8ffbc9e5e88dd Mon Sep 17 00:00:00 2001 From: CHANDRAKANT Kumar Date: Tue, 19 May 2020 16:56:21 +0530 Subject: [PATCH 6/6] Incorporated review comments from the editor. --- .../com/baeldung/patterns/cqrs/aggregates/UserAggregate.java | 2 +- .../com/baeldung/patterns/cqrs/commands/CreateUserCommand.java | 2 +- .../com/baeldung/patterns/escqrs/aggregates/UserAggregate.java | 2 +- patterns/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/aggregates/UserAggregate.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/aggregates/UserAggregate.java index b5e16cff0e..96476dc15a 100644 --- a/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/aggregates/UserAggregate.java +++ b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/aggregates/UserAggregate.java @@ -14,7 +14,7 @@ public class UserAggregate { } public User handleCreateUserCommand(CreateUserCommand command) { - User user = new User(command.getUserId(), command.getFiratName(), command.getLastName()); + User user = new User(command.getUserId(), command.getFirstName(), command.getLastName()); writeRepository.addUser(user.getUserid(), user); return user; } diff --git a/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/commands/CreateUserCommand.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/commands/CreateUserCommand.java index 4ab939dbab..362804c610 100644 --- a/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/commands/CreateUserCommand.java +++ b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/cqrs/commands/CreateUserCommand.java @@ -8,7 +8,7 @@ import lombok.Data; public class CreateUserCommand { private String userId; - private String firatName; + private String firstName; private String lastName; } diff --git a/patterns/cqrs-es/src/main/java/com/baeldung/patterns/escqrs/aggregates/UserAggregate.java b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/escqrs/aggregates/UserAggregate.java index 7d32aeb2a2..04bfeb634d 100644 --- a/patterns/cqrs-es/src/main/java/com/baeldung/patterns/escqrs/aggregates/UserAggregate.java +++ b/patterns/cqrs-es/src/main/java/com/baeldung/patterns/escqrs/aggregates/UserAggregate.java @@ -28,7 +28,7 @@ public class UserAggregate { } public List handleCreateUserCommand(CreateUserCommand command) { - UserCreatedEvent event = new UserCreatedEvent(command.getUserId(), command.getFiratName(), command.getLastName()); + UserCreatedEvent event = new UserCreatedEvent(command.getUserId(), command.getFirstName(), command.getLastName()); writeRepository.addEvent(command.getUserId(), event); return Arrays.asList(event); } diff --git a/patterns/pom.xml b/patterns/pom.xml index be8d183be0..e1753aba56 100644 --- a/patterns/pom.xml +++ b/patterns/pom.xml @@ -19,7 +19,7 @@ design-patterns-functional design-patterns-structural dip - cqrs-es + cqrs-es front-controller intercepting-filter solid