refactoring: unit of work (#1940)

Co-authored-by: Subhrodip Mohanta <hello@subho.xyz>
This commit is contained in:
Ilkka Seppälä
2022-01-08 14:27:11 +02:00
committed by GitHub
parent 11f20593b2
commit 3cc9bc2dea
7 changed files with 205 additions and 201 deletions
@@ -27,7 +27,7 @@ import java.util.HashMap;
import java.util.List;
/**
* {@link App} Application for managing student data.
* {@link App} Application demonstrating unit of work pattern.
*/
public class App {
/**
@@ -37,17 +37,19 @@ public class App {
*/
public static void main(String[] args) {
var ram = new Student(1, "Ram", "Street 9, Cupertino");
var shyam = new Student(2, "Shyam", "Z bridge, Pune");
var gopi = new Student(3, "Gopi", "Street 10, Mumbai");
// create some weapons
var enchantedHammer = new Weapon(1, "enchanted hammer");
var brokenGreatSword = new Weapon(2, "broken great sword");
var silverTrident = new Weapon(3, "silver trident");
var context = new HashMap<String, List<Student>>();
var studentDatabase = new StudentDatabase();
var studentRepository = new StudentRepository(context, studentDatabase);
// create repository
var weaponRepository = new ArmsDealer(new HashMap<String, List<Weapon>>(),
new WeaponDatabase());
studentRepository.registerNew(ram);
studentRepository.registerModified(shyam);
studentRepository.registerDeleted(gopi);
studentRepository.commit();
// perform operations on the weapons
weaponRepository.registerNew(enchantedHammer);
weaponRepository.registerModified(silverTrident);
weaponRepository.registerDeleted(brokenGreatSword);
weaponRepository.commit();
}
}
@@ -30,41 +30,41 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
/**
* {@link StudentRepository} Student database repository. supports unit of work for student data.
* {@link ArmsDealer} Weapon repository that supports unit of work for weapons.
*/
@Slf4j
@RequiredArgsConstructor
public class StudentRepository implements IUnitOfWork<Student> {
public class ArmsDealer implements IUnitOfWork<Weapon> {
private final Map<String, List<Student>> context;
private final StudentDatabase studentDatabase;
private final Map<String, List<Weapon>> context;
private final WeaponDatabase weaponDatabase;
@Override
public void registerNew(Student student) {
LOGGER.info("Registering {} for insert in context.", student.getName());
register(student, UnitActions.INSERT.getActionValue());
public void registerNew(Weapon weapon) {
LOGGER.info("Registering {} for insert in context.", weapon.getName());
register(weapon, UnitActions.INSERT.getActionValue());
}
@Override
public void registerModified(Student student) {
LOGGER.info("Registering {} for modify in context.", student.getName());
register(student, UnitActions.MODIFY.getActionValue());
public void registerModified(Weapon weapon) {
LOGGER.info("Registering {} for modify in context.", weapon.getName());
register(weapon, UnitActions.MODIFY.getActionValue());
}
@Override
public void registerDeleted(Student student) {
LOGGER.info("Registering {} for delete in context.", student.getName());
register(student, UnitActions.DELETE.getActionValue());
public void registerDeleted(Weapon weapon) {
LOGGER.info("Registering {} for delete in context.", weapon.getName());
register(weapon, UnitActions.DELETE.getActionValue());
}
private void register(Student student, String operation) {
var studentsToOperate = context.get(operation);
if (studentsToOperate == null) {
studentsToOperate = new ArrayList<>();
private void register(Weapon weapon, String operation) {
var weaponsToOperate = context.get(operation);
if (weaponsToOperate == null) {
weaponsToOperate = new ArrayList<>();
}
studentsToOperate.add(student);
context.put(operation, studentsToOperate);
weaponsToOperate.add(weapon);
context.put(operation, weaponsToOperate);
}
/**
@@ -90,26 +90,26 @@ public class StudentRepository implements IUnitOfWork<Student> {
}
private void commitInsert() {
var studentsToBeInserted = context.get(UnitActions.INSERT.getActionValue());
for (var student : studentsToBeInserted) {
LOGGER.info("Saving {} to database.", student.getName());
studentDatabase.insert(student);
var weaponsToBeInserted = context.get(UnitActions.INSERT.getActionValue());
for (var weapon : weaponsToBeInserted) {
LOGGER.info("Inserting a new weapon {} to sales rack.", weapon.getName());
weaponDatabase.insert(weapon);
}
}
private void commitModify() {
var modifiedStudents = context.get(UnitActions.MODIFY.getActionValue());
for (var student : modifiedStudents) {
LOGGER.info("Modifying {} to database.", student.getName());
studentDatabase.modify(student);
var modifiedWeapons = context.get(UnitActions.MODIFY.getActionValue());
for (var weapon : modifiedWeapons) {
LOGGER.info("Scheduling {} for modification work.", weapon.getName());
weaponDatabase.modify(weapon);
}
}
private void commitDelete() {
var deletedStudents = context.get(UnitActions.DELETE.getActionValue());
for (var student : deletedStudents) {
LOGGER.info("Deleting {} to database.", student.getName());
studentDatabase.delete(student);
var deletedWeapons = context.get(UnitActions.DELETE.getActionValue());
for (var weapon : deletedWeapons) {
LOGGER.info("Scrapping {}.", weapon.getName());
weaponDatabase.delete(weapon);
}
}
}
@@ -27,14 +27,12 @@ import lombok.Getter;
import lombok.RequiredArgsConstructor;
/**
* {@link Student} is an entity.
* {@link Weapon} is an entity.
*/
@Getter
@RequiredArgsConstructor
public class Student {
public class Weapon {
private final Integer id;
private final String name;
private final String address;
}
@@ -24,19 +24,19 @@
package com.iluwatar.unitofwork;
/**
* Act as Database for student records.
* Act as database for weapon records.
*/
public class StudentDatabase {
public class WeaponDatabase {
public void insert(Student student) {
public void insert(Weapon weapon) {
//Some insert logic to DB
}
public void modify(Student student) {
public void modify(Weapon weapon) {
//Some modify logic to DB
}
public void delete(Student student) {
public void delete(Weapon weapon) {
//Some delete logic to DB
}
}