diff --git a/business-delegate/src/main/java/com/iluwatar/business/delegate/App.java b/business-delegate/src/main/java/com/iluwatar/business/delegate/App.java index fcb1acd1b..115234df7 100644 --- a/business-delegate/src/main/java/com/iluwatar/business/delegate/App.java +++ b/business-delegate/src/main/java/com/iluwatar/business/delegate/App.java @@ -46,15 +46,15 @@ public class App { */ public static void main(String[] args) { - BusinessDelegate businessDelegate = new BusinessDelegate(); - BusinessLookup businessLookup = new BusinessLookup(); + var businessDelegate = new BusinessDelegate(); + var businessLookup = new BusinessLookup(); businessLookup.setEjbService(new EjbService()); businessLookup.setJmsService(new JmsService()); businessDelegate.setLookupService(businessLookup); businessDelegate.setServiceType(ServiceType.EJB); - Client client = new Client(businessDelegate); + var client = new Client(businessDelegate); client.doTask(); businessDelegate.setServiceType(ServiceType.JMS); diff --git a/business-delegate/src/test/java/com/iluwatar/business/delegate/BusinessDelegateTest.java b/business-delegate/src/test/java/com/iluwatar/business/delegate/BusinessDelegateTest.java index dfc6dfa9d..10815ad3a 100644 --- a/business-delegate/src/test/java/com/iluwatar/business/delegate/BusinessDelegateTest.java +++ b/business-delegate/src/test/java/com/iluwatar/business/delegate/BusinessDelegateTest.java @@ -76,7 +76,7 @@ public class BusinessDelegateTest { public void testBusinessDelegate() { // setup a client object - Client client = new Client(businessDelegate); + var client = new Client(businessDelegate); // set the service type businessDelegate.setServiceType(ServiceType.EJB); diff --git a/bytecode/src/main/java/com/iluwatar/bytecode/App.java b/bytecode/src/main/java/com/iluwatar/bytecode/App.java index 165043c70..04f473cee 100644 --- a/bytecode/src/main/java/com/iluwatar/bytecode/App.java +++ b/bytecode/src/main/java/com/iluwatar/bytecode/App.java @@ -24,7 +24,6 @@ package com.iluwatar.bytecode; import com.iluwatar.bytecode.util.InstructionConverterUtil; -import java.util.Stack; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -51,12 +50,12 @@ public class App { */ public static void main(String[] args) { - Wizard wizard = new Wizard(); + var wizard = new Wizard(); wizard.setHealth(45); wizard.setAgility(7); wizard.setWisdom(11); - VirtualMachine vm = new VirtualMachine(); + var vm = new VirtualMachine(); vm.getWizards()[0] = wizard; interpretInstruction("LITERAL 0", vm); @@ -74,9 +73,8 @@ public class App { } private static void interpretInstruction(String instruction, VirtualMachine vm) { - InstructionConverterUtil converter = new InstructionConverterUtil(); - vm.execute(converter.convertToByteCode(instruction)); - Stack stack = vm.getStack(); + vm.execute(InstructionConverterUtil.convertToByteCode(instruction)); + var stack = vm.getStack(); LOGGER.info(instruction + String.format("%" + (12 - instruction.length()) + "s", "") + stack); } } diff --git a/bytecode/src/main/java/com/iluwatar/bytecode/Instruction.java b/bytecode/src/main/java/com/iluwatar/bytecode/Instruction.java index 7684c778d..eeaf16846 100644 --- a/bytecode/src/main/java/com/iluwatar/bytecode/Instruction.java +++ b/bytecode/src/main/java/com/iluwatar/bytecode/Instruction.java @@ -40,7 +40,7 @@ public enum Instruction { ADD(10), DIVIDE(11); - private int value; + private final int value; Instruction(int value) { this.value = value; @@ -57,7 +57,7 @@ public enum Instruction { * @return representation of the instruction */ public static Instruction getInstruction(int value) { - for (int i = 0; i < Instruction.values().length; i++) { + for (var i = 0; i < Instruction.values().length; i++) { if (Instruction.values()[i].getIntValue() == value) { return Instruction.values()[i]; } diff --git a/bytecode/src/main/java/com/iluwatar/bytecode/VirtualMachine.java b/bytecode/src/main/java/com/iluwatar/bytecode/VirtualMachine.java index 111c27e73..5afc2fb93 100644 --- a/bytecode/src/main/java/com/iluwatar/bytecode/VirtualMachine.java +++ b/bytecode/src/main/java/com/iluwatar/bytecode/VirtualMachine.java @@ -30,7 +30,7 @@ import java.util.Stack; */ public class VirtualMachine { - private Stack stack = new Stack(); + private Stack stack = new Stack<>(); private Wizard[] wizards = new Wizard[2]; @@ -38,7 +38,7 @@ public class VirtualMachine { * Constructor. */ public VirtualMachine() { - for (int i = 0; i < wizards.length; i++) { + for (var i = 0; i < wizards.length; i++) { wizards[i] = new Wizard(); } } @@ -49,10 +49,8 @@ public class VirtualMachine { * @param bytecode to execute */ public void execute(int[] bytecode) { - for (int i = 0; i < bytecode.length; i++) { + for (var i = 0; i < bytecode.length; i++) { Instruction instruction = Instruction.getInstruction(bytecode[i]); - int wizard; - int amount; switch (instruction) { case LITERAL: // Read the next byte from the bytecode. @@ -60,8 +58,8 @@ public class VirtualMachine { stack.push(value); break; case SET_AGILITY: - amount = stack.pop(); - wizard = stack.pop(); + var amount = stack.pop(); + var wizard = stack.pop(); setAgility(wizard, amount); break; case SET_WISDOM: @@ -87,8 +85,8 @@ public class VirtualMachine { stack.push(getWisdom(wizard)); break; case ADD: - int a = stack.pop(); - int b = stack.pop(); + var a = stack.pop(); + var b = stack.pop(); stack.push(a + b); break; case DIVIDE: diff --git a/bytecode/src/main/java/com/iluwatar/bytecode/util/InstructionConverterUtil.java b/bytecode/src/main/java/com/iluwatar/bytecode/util/InstructionConverterUtil.java index 1d3002cb1..b0baf326e 100644 --- a/bytecode/src/main/java/com/iluwatar/bytecode/util/InstructionConverterUtil.java +++ b/bytecode/src/main/java/com/iluwatar/bytecode/util/InstructionConverterUtil.java @@ -40,15 +40,15 @@ public class InstructionConverterUtil { return new int[0]; } - String[] splitedInstructions = instructions.trim().split(" "); - int[] bytecode = new int[splitedInstructions.length]; - for (int i = 0; i < splitedInstructions.length; i++) { + var splitedInstructions = instructions.trim().split(" "); + var bytecode = new int[splitedInstructions.length]; + for (var i = 0; i < splitedInstructions.length; i++) { if (isValidInstruction(splitedInstructions[i])) { bytecode[i] = Instruction.valueOf(splitedInstructions[i]).getIntValue(); } else if (isValidInt(splitedInstructions[i])) { - bytecode[i] = Integer.valueOf(splitedInstructions[i]); + bytecode[i] = Integer.parseInt(splitedInstructions[i]); } else { - String errorMessage = "Invalid instruction or number: " + splitedInstructions[i]; + var errorMessage = "Invalid instruction or number: " + splitedInstructions[i]; throw new IllegalArgumentException(errorMessage); } } diff --git a/bytecode/src/test/java/com/iluwatar/bytecode/AppTest.java b/bytecode/src/test/java/com/iluwatar/bytecode/AppTest.java index 6ab29c95c..59962d39e 100644 --- a/bytecode/src/test/java/com/iluwatar/bytecode/AppTest.java +++ b/bytecode/src/test/java/com/iluwatar/bytecode/AppTest.java @@ -32,7 +32,6 @@ public class AppTest { @Test public void test() { - String[] args = {}; - App.main(args); + App.main(new String[]{}); } } diff --git a/bytecode/src/test/java/com/iluwatar/bytecode/VirtualMachineTest.java b/bytecode/src/test/java/com/iluwatar/bytecode/VirtualMachineTest.java index 837c40582..61a316f5a 100644 --- a/bytecode/src/test/java/com/iluwatar/bytecode/VirtualMachineTest.java +++ b/bytecode/src/test/java/com/iluwatar/bytecode/VirtualMachineTest.java @@ -36,11 +36,11 @@ public class VirtualMachineTest { @Test public void testLiteral() { - int[] bytecode = new int[2]; + var bytecode = new int[2]; bytecode[0] = LITERAL.getIntValue(); bytecode[1] = 10; - VirtualMachine vm = new VirtualMachine(); + var vm = new VirtualMachine(); vm.execute(bytecode); assertEquals(1, vm.getStack().size()); @@ -49,15 +49,15 @@ public class VirtualMachineTest { @Test public void testSetHealth() { - int wizardNumber = 0; - int[] bytecode = new int[5]; + var wizardNumber = 0; + var bytecode = new int[5]; bytecode[0] = LITERAL.getIntValue(); bytecode[1] = wizardNumber; bytecode[2] = LITERAL.getIntValue(); bytecode[3] = 50; // health amount bytecode[4] = SET_HEALTH.getIntValue(); - VirtualMachine vm = new VirtualMachine(); + var vm = new VirtualMachine(); vm.execute(bytecode); assertEquals(50, vm.getWizards()[wizardNumber].getHealth()); @@ -65,15 +65,15 @@ public class VirtualMachineTest { @Test public void testSetAgility() { - int wizardNumber = 0; - int[] bytecode = new int[5]; + var wizardNumber = 0; + var bytecode = new int[5]; bytecode[0] = LITERAL.getIntValue(); bytecode[1] = wizardNumber; bytecode[2] = LITERAL.getIntValue(); bytecode[3] = 50; // agility amount bytecode[4] = SET_AGILITY.getIntValue(); - VirtualMachine vm = new VirtualMachine(); + var vm = new VirtualMachine(); vm.execute(bytecode); assertEquals(50, vm.getWizards()[wizardNumber].getAgility()); @@ -81,15 +81,15 @@ public class VirtualMachineTest { @Test public void testSetWisdom() { - int wizardNumber = 0; - int[] bytecode = new int[5]; + var wizardNumber = 0; + var bytecode = new int[5]; bytecode[0] = LITERAL.getIntValue(); bytecode[1] = wizardNumber; bytecode[2] = LITERAL.getIntValue(); bytecode[3] = 50; // wisdom amount bytecode[4] = SET_WISDOM.getIntValue(); - VirtualMachine vm = new VirtualMachine(); + var vm = new VirtualMachine(); vm.execute(bytecode); assertEquals(50, vm.getWizards()[wizardNumber].getWisdom()); @@ -97,8 +97,8 @@ public class VirtualMachineTest { @Test public void testGetHealth() { - int wizardNumber = 0; - int[] bytecode = new int[8]; + var wizardNumber = 0; + var bytecode = new int[8]; bytecode[0] = LITERAL.getIntValue(); bytecode[1] = wizardNumber; bytecode[2] = LITERAL.getIntValue(); @@ -108,7 +108,7 @@ public class VirtualMachineTest { bytecode[6] = wizardNumber; bytecode[7] = GET_HEALTH.getIntValue(); - VirtualMachine vm = new VirtualMachine(); + var vm = new VirtualMachine(); vm.execute(bytecode); assertEquals(Integer.valueOf(50), vm.getStack().pop()); @@ -116,13 +116,13 @@ public class VirtualMachineTest { @Test public void testPlaySound() { - int wizardNumber = 0; - int[] bytecode = new int[3]; + var wizardNumber = 0; + var bytecode = new int[3]; bytecode[0] = LITERAL.getIntValue(); bytecode[1] = wizardNumber; bytecode[2] = PLAY_SOUND.getIntValue(); - VirtualMachine vm = new VirtualMachine(); + var vm = new VirtualMachine(); vm.execute(bytecode); assertEquals(0, vm.getStack().size()); @@ -131,13 +131,13 @@ public class VirtualMachineTest { @Test public void testSpawnParticles() { - int wizardNumber = 0; - int[] bytecode = new int[3]; + var wizardNumber = 0; + var bytecode = new int[3]; bytecode[0] = LITERAL.getIntValue(); bytecode[1] = wizardNumber; bytecode[2] = SPAWN_PARTICLES.getIntValue(); - VirtualMachine vm = new VirtualMachine(); + var vm = new VirtualMachine(); vm.execute(bytecode); assertEquals(0, vm.getStack().size()); @@ -146,9 +146,9 @@ public class VirtualMachineTest { @Test public void testInvalidInstruction() { - int[] bytecode = new int[1]; + var bytecode = new int[1]; bytecode[0] = 999; - VirtualMachine vm = new VirtualMachine(); + var vm = new VirtualMachine(); assertThrows(IllegalArgumentException.class, () -> vm.execute(bytecode)); } diff --git a/bytecode/src/test/java/com/iluwatar/bytecode/util/InstructionConverterUtilTest.java b/bytecode/src/test/java/com/iluwatar/bytecode/util/InstructionConverterUtilTest.java index 8c0437629..e7438fce1 100644 --- a/bytecode/src/test/java/com/iluwatar/bytecode/util/InstructionConverterUtilTest.java +++ b/bytecode/src/test/java/com/iluwatar/bytecode/util/InstructionConverterUtilTest.java @@ -34,19 +34,19 @@ import org.junit.jupiter.api.Test; public class InstructionConverterUtilTest { @Test public void testEmptyInstruction() { - String instruction = ""; + var instruction = ""; - int[] bytecode = InstructionConverterUtil.convertToByteCode(instruction); + var bytecode = InstructionConverterUtil.convertToByteCode(instruction); Assertions.assertEquals(0, bytecode.length); } @Test public void testInstructions() { - String instructions = - "LITERAL 35 SET_HEALTH SET_WISDOM SET_AGILITY PLAY_SOUND SPAWN_PARTICLES GET_HEALTH ADD DIVIDE"; + var instructions = "LITERAL 35 SET_HEALTH SET_WISDOM SET_AGILITY PLAY_SOUND" + + " SPAWN_PARTICLES GET_HEALTH ADD DIVIDE"; - int[] bytecode = InstructionConverterUtil.convertToByteCode(instructions); + var bytecode = InstructionConverterUtil.convertToByteCode(instructions); Assertions.assertEquals(10, bytecode.length); Assertions.assertEquals(Instruction.LITERAL.getIntValue(), bytecode[0]); diff --git a/caching/src/main/java/com/iluwatar/caching/App.java b/caching/src/main/java/com/iluwatar/caching/App.java index e1e4e67ca..d8bd1338d 100644 --- a/caching/src/main/java/com/iluwatar/caching/App.java +++ b/caching/src/main/java/com/iluwatar/caching/App.java @@ -76,7 +76,7 @@ public class App { // true to run the tests with MongoDB (provided that MongoDB is // installed and socket connection is open). AppManager.initCacheCapacity(3); - App app = new App(); + var app = new App(); app.useReadAndWriteThroughStrategy(); app.useReadThroughAndWriteAroundStrategy(); app.useReadThroughAndWriteBehindStrategy(); @@ -90,7 +90,7 @@ public class App { LOGGER.info("# CachingPolicy.THROUGH"); AppManager.initCachingPolicy(CachingPolicy.THROUGH); - UserAccount userAccount1 = new UserAccount("001", "John", "He is a boy."); + var userAccount1 = new UserAccount("001", "John", "He is a boy."); AppManager.save(userAccount1); LOGGER.info(AppManager.printCacheContent()); @@ -105,7 +105,7 @@ public class App { LOGGER.info("# CachingPolicy.AROUND"); AppManager.initCachingPolicy(CachingPolicy.AROUND); - UserAccount userAccount2 = new UserAccount("002", "Jane", "She is a girl."); + var userAccount2 = new UserAccount("002", "Jane", "She is a girl."); AppManager.save(userAccount2); LOGGER.info(AppManager.printCacheContent()); @@ -127,9 +127,9 @@ public class App { LOGGER.info("# CachingPolicy.BEHIND"); AppManager.initCachingPolicy(CachingPolicy.BEHIND); - UserAccount userAccount3 = new UserAccount("003", "Adam", "He likes food."); - UserAccount userAccount4 = new UserAccount("004", "Rita", "She hates cats."); - UserAccount userAccount5 = new UserAccount("005", "Isaac", "He is allergic to mustard."); + var userAccount3 = new UserAccount("003", "Adam", "He likes food."); + var userAccount4 = new UserAccount("004", "Rita", "She hates cats."); + var userAccount5 = new UserAccount("005", "Isaac", "He is allergic to mustard."); AppManager.save(userAccount3); AppManager.save(userAccount4); @@ -152,9 +152,9 @@ public class App { AppManager.initCachingPolicy(CachingPolicy.ASIDE); LOGGER.info(AppManager.printCacheContent()); - UserAccount userAccount3 = new UserAccount("003", "Adam", "He likes food."); - UserAccount userAccount4 = new UserAccount("004", "Rita", "She hates cats."); - UserAccount userAccount5 = new UserAccount("005", "Isaac", "He is allergic to mustard."); + var userAccount3 = new UserAccount("003", "Adam", "He likes food."); + var userAccount4 = new UserAccount("004", "Rita", "She hates cats."); + var userAccount5 = new UserAccount("005", "Isaac", "He is allergic to mustard."); AppManager.save(userAccount3); AppManager.save(userAccount4); AppManager.save(userAccount5); diff --git a/caching/src/main/java/com/iluwatar/caching/AppManager.java b/caching/src/main/java/com/iluwatar/caching/AppManager.java index ec7f0df69..aad98abae 100644 --- a/caching/src/main/java/com/iluwatar/caching/AppManager.java +++ b/caching/src/main/java/com/iluwatar/caching/AppManager.java @@ -24,6 +24,7 @@ package com.iluwatar.caching; import java.text.ParseException; +import java.util.Optional; /** * AppManager helps to bridge the gap in communication between the main class and the application's @@ -116,16 +117,12 @@ public final class AppManager { * Cache-Aside find user account helper. */ private static UserAccount findAside(String userId) { - UserAccount userAccount = CacheStore.get(userId); - if (userAccount != null) { - return userAccount; - } - - userAccount = DbManager.readFromDb(userId); - if (userAccount != null) { - CacheStore.set(userId, userAccount); - } - - return userAccount; + return Optional.ofNullable(CacheStore.get(userId)) + .or(() -> { + Optional userAccount = Optional.ofNullable(DbManager.readFromDb(userId)); + userAccount.ifPresent(account -> CacheStore.set(userId, account)); + return userAccount; + }) + .orElse(null); } } diff --git a/caching/src/main/java/com/iluwatar/caching/CacheStore.java b/caching/src/main/java/com/iluwatar/caching/CacheStore.java index 17a733188..90a060e55 100644 --- a/caching/src/main/java/com/iluwatar/caching/CacheStore.java +++ b/caching/src/main/java/com/iluwatar/caching/CacheStore.java @@ -24,6 +24,8 @@ package com.iluwatar.caching; import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,7 +36,7 @@ public class CacheStore { private static final Logger LOGGER = LoggerFactory.getLogger(CacheStore.class); - static LruCache cache; + private static LruCache cache; private CacheStore() { } @@ -134,27 +136,22 @@ public class CacheStore { */ public static void flushCache() { LOGGER.info("# flushCache..."); - if (null == cache) { - return; - } - List listOfUserAccounts = cache.getCacheDataInListForm(); - for (UserAccount userAccount : listOfUserAccounts) { - DbManager.upsertDb(userAccount); - } + Optional.ofNullable(cache) + .map(LruCache::getCacheDataInListForm) + .orElse(List.of()) + .forEach(DbManager::updateDb); } /** * Print user accounts. */ public static String print() { - List listOfUserAccounts = cache.getCacheDataInListForm(); - StringBuilder sb = new StringBuilder(); - sb.append("\n--CACHE CONTENT--\n"); - for (UserAccount userAccount : listOfUserAccounts) { - sb.append(userAccount.toString() + "\n"); - } - sb.append("----\n"); - return sb.toString(); + return Optional.ofNullable(cache) + .map(LruCache::getCacheDataInListForm) + .orElse(List.of()) + .stream() + .map(userAccount -> userAccount.toString() + "\n") + .collect(Collectors.joining("", "\n--CACHE CONTENT--\n", "----\n")); } /** diff --git a/caching/src/main/java/com/iluwatar/caching/DbManager.java b/caching/src/main/java/com/iluwatar/caching/DbManager.java index dbb885ee2..3b2b706e7 100644 --- a/caching/src/main/java/com/iluwatar/caching/DbManager.java +++ b/caching/src/main/java/com/iluwatar/caching/DbManager.java @@ -25,7 +25,6 @@ package com.iluwatar.caching; import com.iluwatar.caching.constants.CachingConstants; import com.mongodb.MongoClient; -import com.mongodb.client.FindIterable; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.UpdateOptions; import java.text.ParseException; @@ -87,7 +86,7 @@ public final class DbManager { e.printStackTrace(); } } - FindIterable iterable = db + var iterable = db .getCollection(CachingConstants.USER_ACCOUNT) .find(new Document(CachingConstants.USER_ID, userId)); if (iterable == null) { diff --git a/caching/src/main/java/com/iluwatar/caching/LruCache.java b/caching/src/main/java/com/iluwatar/caching/LruCache.java index 32bb3838e..c443b6b1f 100644 --- a/caching/src/main/java/com/iluwatar/caching/LruCache.java +++ b/caching/src/main/java/com/iluwatar/caching/LruCache.java @@ -67,7 +67,7 @@ public class LruCache { */ public UserAccount get(String userId) { if (cache.containsKey(userId)) { - Node node = cache.get(userId); + var node = cache.get(userId); remove(node); setHead(node); return node.userAccount; @@ -111,12 +111,12 @@ public class LruCache { */ public void set(String userId, UserAccount userAccount) { if (cache.containsKey(userId)) { - Node old = cache.get(userId); + var old = cache.get(userId); old.userAccount = userAccount; remove(old); setHead(old); } else { - Node newNode = new Node(userId, userAccount); + var newNode = new Node(userId, userAccount); if (cache.size() >= capacity) { LOGGER.info("# Cache is FULL! Removing {} from cache...", end.userId); cache.remove(end.userId); // remove LRU data from cache. @@ -137,7 +137,7 @@ public class LruCache { * Invalidate cache for user. */ public void invalidate(String userId) { - Node toBeRemoved = cache.remove(userId); + var toBeRemoved = cache.remove(userId); if (toBeRemoved != null) { LOGGER.info("# {} has been updated! Removing older version from cache...", userId); remove(toBeRemoved); @@ -165,8 +165,8 @@ public class LruCache { * Returns cache data in list form. */ public List getCacheDataInListForm() { - List listOfCacheData = new ArrayList<>(); - Node temp = head; + var listOfCacheData = new ArrayList(); + var temp = head; while (temp != null) { listOfCacheData.add(temp.userAccount); temp = temp.next; diff --git a/caching/src/test/java/com/iluwatar/caching/AppTest.java b/caching/src/test/java/com/iluwatar/caching/AppTest.java index cb696f804..831cfe493 100644 --- a/caching/src/test/java/com/iluwatar/caching/AppTest.java +++ b/caching/src/test/java/com/iluwatar/caching/AppTest.java @@ -32,8 +32,7 @@ import java.io.IOException; */ public class AppTest { @Test - public void test() throws IOException { - String[] args = {}; - App.main(args); + public void test() { + App.main(new String[]{}); } } diff --git a/caching/src/test/java/com/iluwatar/caching/CachingTest.java b/caching/src/test/java/com/iluwatar/caching/CachingTest.java index ed6004429..4db4085d4 100644 --- a/caching/src/test/java/com/iluwatar/caching/CachingTest.java +++ b/caching/src/test/java/com/iluwatar/caching/CachingTest.java @@ -27,22 +27,21 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; /** - * * Application test - * */ public class CachingTest { - App app; + private App app; /** * Setup of application test includes: initializing DB connection and cache size/capacity. */ @BeforeEach public void setUp() { - AppManager.initDb(false); // VirtualDB (instead of MongoDB) was used in running the JUnit tests - // to avoid Maven compilation errors. Set flag to true to run the - // tests with MongoDB (provided that MongoDB is installed and socket - // connection is open). + // VirtualDB (instead of MongoDB) was used in running the JUnit tests + // to avoid Maven compilation errors. Set flag to true to run the + // tests with MongoDB (provided that MongoDB is installed and socket + // connection is open). + AppManager.initDb(false); AppManager.initCacheCapacity(3); app = new App(); } diff --git a/callback/src/main/java/com/iluwatar/callback/App.java b/callback/src/main/java/com/iluwatar/callback/App.java index 1b92d98de..64cb3c796 100644 --- a/callback/src/main/java/com/iluwatar/callback/App.java +++ b/callback/src/main/java/com/iluwatar/callback/App.java @@ -43,8 +43,7 @@ public final class App { * Program entry point. */ public static void main(final String[] args) { - Task task = new SimpleTask(); - Callback callback = () -> LOGGER.info("I'm done now."); - task.executeWith(callback); + var task = new SimpleTask(); + task.executeWith(() -> LOGGER.info("I'm done now.")); } } diff --git a/callback/src/main/java/com/iluwatar/callback/LambdasApp.java b/callback/src/main/java/com/iluwatar/callback/LambdasApp.java index f87d04969..d433217ba 100644 --- a/callback/src/main/java/com/iluwatar/callback/LambdasApp.java +++ b/callback/src/main/java/com/iluwatar/callback/LambdasApp.java @@ -42,8 +42,7 @@ public final class LambdasApp { * Program entry point. */ public static void main(final String[] args) { - Task task = new SimpleTask(); - Callback c = () -> LOGGER.info("I'm done now."); - task.executeWith(c); + var task = new SimpleTask(); + task.executeWith(() -> LOGGER.info("I'm done now.")); } } diff --git a/callback/src/main/java/com/iluwatar/callback/Task.java b/callback/src/main/java/com/iluwatar/callback/Task.java index 09c8f67af..5632dbc4f 100644 --- a/callback/src/main/java/com/iluwatar/callback/Task.java +++ b/callback/src/main/java/com/iluwatar/callback/Task.java @@ -23,6 +23,8 @@ package com.iluwatar.callback; +import java.util.Optional; + /** * Template-method class for callback hook execution. */ @@ -33,9 +35,7 @@ public abstract class Task { */ final void executeWith(final Callback callback) { execute(); - if (callback != null) { - callback.call(); - } + Optional.ofNullable(callback).ifPresent(Callback::call); } public abstract void execute(); diff --git a/callback/src/test/java/com/iluwatar/callback/AppTest.java b/callback/src/test/java/com/iluwatar/callback/AppTest.java index e954d8f04..c1f466dee 100644 --- a/callback/src/test/java/com/iluwatar/callback/AppTest.java +++ b/callback/src/test/java/com/iluwatar/callback/AppTest.java @@ -25,15 +25,12 @@ package com.iluwatar.callback; import org.junit.jupiter.api.Test; -import java.io.IOException; - /** * Tests that Callback example runs without errors. */ public class AppTest { @Test - public void test() throws IOException { - String[] args = {}; - App.main(args); + public void test() { + App.main(new String[]{}); } } diff --git a/callback/src/test/java/com/iluwatar/callback/CallbackTest.java b/callback/src/test/java/com/iluwatar/callback/CallbackTest.java index 7f424f79d..08a3df0e1 100644 --- a/callback/src/test/java/com/iluwatar/callback/CallbackTest.java +++ b/callback/src/test/java/com/iluwatar/callback/CallbackTest.java @@ -23,14 +23,14 @@ package com.iluwatar.callback; -import org.junit.jupiter.api.Test; - import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; + /** * Add a field as a counter. Every time the callback method is called increment this field. Unit * test checks that the field is being incremented. - * + *

* Could be done with mock objects as well where the call method call is verified. */ public class CallbackTest { @@ -41,17 +41,17 @@ public class CallbackTest { public void test() { Callback callback = () -> callingCount++; - Task task = new SimpleTask(); + var task = new SimpleTask(); - assertEquals(new Integer(0), callingCount, "Initial calling count of 0"); + assertEquals(Integer.valueOf(0), callingCount, "Initial calling count of 0"); task.executeWith(callback); - assertEquals(new Integer(1), callingCount, "Callback called once"); + assertEquals(Integer.valueOf(1), callingCount, "Callback called once"); task.executeWith(callback); - assertEquals(new Integer(2), callingCount, "Callback called twice"); + assertEquals(Integer.valueOf(2), callingCount, "Callback called twice"); } } diff --git a/chain/src/main/java/com/iluwatar/chain/App.java b/chain/src/main/java/com/iluwatar/chain/App.java index d6b7ebe2e..d644ad680 100644 --- a/chain/src/main/java/com/iluwatar/chain/App.java +++ b/chain/src/main/java/com/iluwatar/chain/App.java @@ -43,7 +43,7 @@ public class App { */ public static void main(String[] args) { - OrcKing king = new OrcKing(); + var king = new OrcKing(); king.makeRequest(new Request(RequestType.DEFEND_CASTLE, "defend castle")); king.makeRequest(new Request(RequestType.TORTURE_PRISONER, "torture prisoner")); king.makeRequest(new Request(RequestType.COLLECT_TAX, "collect tax")); diff --git a/chain/src/main/java/com/iluwatar/chain/OrcKing.java b/chain/src/main/java/com/iluwatar/chain/OrcKing.java index 93c01da81..1d43ac63f 100644 --- a/chain/src/main/java/com/iluwatar/chain/OrcKing.java +++ b/chain/src/main/java/com/iluwatar/chain/OrcKing.java @@ -28,7 +28,7 @@ package com.iluwatar.chain; */ public class OrcKing { - RequestHandler chain; + private RequestHandler chain; public OrcKing() { buildChain(); diff --git a/chain/src/test/java/com/iluwatar/chain/AppTest.java b/chain/src/test/java/com/iluwatar/chain/AppTest.java index da73476ea..164ff9bfe 100644 --- a/chain/src/test/java/com/iluwatar/chain/AppTest.java +++ b/chain/src/test/java/com/iluwatar/chain/AppTest.java @@ -26,15 +26,12 @@ package com.iluwatar.chain; import org.junit.jupiter.api.Test; /** - * * Application test - * */ public class AppTest { @Test public void test() { - String[] args = {}; - App.main(args); + App.main(new String[]{}); } } diff --git a/chain/src/test/java/com/iluwatar/chain/OrcKingTest.java b/chain/src/test/java/com/iluwatar/chain/OrcKingTest.java index cf957f119..7cbc1ad68 100644 --- a/chain/src/test/java/com/iluwatar/chain/OrcKingTest.java +++ b/chain/src/test/java/com/iluwatar/chain/OrcKingTest.java @@ -23,10 +23,11 @@ package com.iluwatar.chain; -import org.junit.jupiter.api.Test; - import static org.junit.jupiter.api.Assertions.assertTrue; +import java.util.List; +import org.junit.jupiter.api.Test; + /** * Date: 12/6/15 - 9:29 PM * @@ -37,24 +38,23 @@ public class OrcKingTest { /** * All possible requests */ - private static final Request[] REQUESTS = new Request[]{ + private static final List REQUESTS = List.of( new Request(RequestType.DEFEND_CASTLE, "Don't let the barbarians enter my castle!!"), new Request(RequestType.TORTURE_PRISONER, "Don't just stand there, tickle him!"), - new Request(RequestType.COLLECT_TAX, "Don't steal, the King hates competition ..."), - }; + new Request(RequestType.COLLECT_TAX, "Don't steal, the King hates competition ...") + ); @Test public void testMakeRequest() { - final OrcKing king = new OrcKing(); + final var king = new OrcKing(); - for (final Request request : REQUESTS) { + REQUESTS.forEach(request -> { king.makeRequest(request); assertTrue( request.isHandled(), "Expected all requests from King to be handled, but [" + request + "] was not!" ); - } - + }); } } \ No newline at end of file diff --git a/circuit-breaker/src/test/java/com/iluwatar/circuitbreaker/CircuitBreakerTest.java b/circuit-breaker/src/test/java/com/iluwatar/circuitbreaker/CircuitBreakerTest.java index f4efcaaac..98b59a6ae 100644 --- a/circuit-breaker/src/test/java/com/iluwatar/circuitbreaker/CircuitBreakerTest.java +++ b/circuit-breaker/src/test/java/com/iluwatar/circuitbreaker/CircuitBreakerTest.java @@ -24,19 +24,18 @@ package com.iluwatar.circuitbreaker; import static org.junit.jupiter.api.Assertions.assertEquals; + import org.junit.jupiter.api.Test; /** - * * Circuit Breaker test - * */ public class CircuitBreakerTest { //long timeout, int failureThreshold, long retryTimePeriod @Test public void testSetState() { - var circuitBreaker = new CircuitBreaker(1,1,100); + var circuitBreaker = new CircuitBreaker(1, 1, 100); //Right now, failureCount cars = CarFactory.createCars(); - - List modelsImperative = ImperativeProgramming.getModelsAfter2000(cars); + var modelsImperative = ImperativeProgramming.getModelsAfter2000(cars); LOGGER.info(modelsImperative.toString()); - List modelsFunctional = FunctionalProgramming.getModelsAfter2000(cars); + var modelsFunctional = FunctionalProgramming.getModelsAfter2000(cars); LOGGER.info(modelsFunctional.toString()); - Map> groupingByCategoryImperative = - ImperativeProgramming.getGroupingOfCarsByCategory(cars); + var groupingByCategoryImperative = ImperativeProgramming.getGroupingOfCarsByCategory(cars); LOGGER.info(groupingByCategoryImperative.toString()); - Map> groupingByCategoryFunctional = - FunctionalProgramming.getGroupingOfCarsByCategory(cars); + var groupingByCategoryFunctional = FunctionalProgramming.getGroupingOfCarsByCategory(cars); LOGGER.info(groupingByCategoryFunctional.toString()); - Person john = new Person(cars); + var john = new Person(cars); - List sedansOwnedImperative = - ImperativeProgramming.getSedanCarsOwnedSortedByDate(List.of(john)); + var sedansOwnedImperative = ImperativeProgramming.getSedanCarsOwnedSortedByDate(List.of(john)); LOGGER.info(sedansOwnedImperative.toString()); - List sedansOwnedFunctional = - FunctionalProgramming.getSedanCarsOwnedSortedByDate(List.of(john)); + var sedansOwnedFunctional = FunctionalProgramming.getSedanCarsOwnedSortedByDate(List.of(john)); LOGGER.info(sedansOwnedFunctional.toString()); } } diff --git a/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/ImperativeProgramming.java b/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/ImperativeProgramming.java index a587e9c37..5341d2743 100644 --- a/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/ImperativeProgramming.java +++ b/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/ImperativeProgramming.java @@ -23,12 +23,12 @@ package com.iluwatar.collectionpipeline; -import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.Comparator; -import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * Imperative-style programming to iterate over the list and get the names of cars made later than @@ -57,26 +57,11 @@ public class ImperativeProgramming { * @return {@link List} of {@link String} of car models built after year 2000 */ public static List getModelsAfter2000(List cars) { - List carsSortedByYear = new ArrayList<>(); - - for (Car car : cars) { - if (car.getYear() > 2000) { - carsSortedByYear.add(car); - } - } - - Collections.sort(carsSortedByYear, new Comparator() { - public int compare(Car car1, Car car2) { - return new Integer(car1.getYear()).compareTo(car2.getYear()); - } - }); - - List models = new ArrayList<>(); - for (Car car : carsSortedByYear) { - models.add(car.getModel()); - } - - return models; + return cars.stream() + .filter(car -> car.getYear() > 2000) + .sorted(Comparator.comparingInt(Car::getYear)) + .map(Car::getModel) + .collect(Collectors.toList()); } /** @@ -86,17 +71,7 @@ public class ImperativeProgramming { * @return {@link Map} with category as key and cars belonging to that category as value */ public static Map> getGroupingOfCarsByCategory(List cars) { - Map> groupingByCategory = new HashMap<>(); - for (Car car : cars) { - if (groupingByCategory.containsKey(car.getCategory())) { - groupingByCategory.get(car.getCategory()).add(car); - } else { - List categoryCars = new ArrayList<>(); - categoryCars.add(car); - groupingByCategory.put(car.getCategory(), categoryCars); - } - } - return groupingByCategory; + return cars.stream().collect(Collectors.groupingBy(Car::getCategory)); } /** @@ -107,25 +82,11 @@ public class ImperativeProgramming { * @return {@link List} of {@link Car} to belonging to the group */ public static List getSedanCarsOwnedSortedByDate(List persons) { - List cars = new ArrayList<>(); - for (Person person : persons) { - cars.addAll(person.getCars()); - } - - List sedanCars = new ArrayList<>(); - for (Car car : cars) { - if (Category.SEDAN.equals(car.getCategory())) { - sedanCars.add(car); - } - } - - sedanCars.sort(new Comparator() { - @Override - public int compare(Car o1, Car o2) { - return o1.getYear() - o2.getYear(); - } - }); - - return sedanCars; + return persons.stream() + .map(Person::getCars) + .flatMap(Collection::stream) + .filter(car -> car.getCategory() == Category.SEDAN) + .sorted(Comparator.comparingInt(Car::getYear)) + .collect(Collectors.toList()); } } diff --git a/collection-pipeline/src/test/java/com/iluwatar/collectionpipeline/AppTest.java b/collection-pipeline/src/test/java/com/iluwatar/collectionpipeline/AppTest.java index 1fa27ec4d..6bf373e81 100644 --- a/collection-pipeline/src/test/java/com/iluwatar/collectionpipeline/AppTest.java +++ b/collection-pipeline/src/test/java/com/iluwatar/collectionpipeline/AppTest.java @@ -54,12 +54,18 @@ public class AppTest { @Test public void testGetGroupingOfCarsByCategory() { var modelsExpected = Map.of( - Category.CONVERTIBLE, List.of(new Car("Buick", "Cascada", 2016, Category.CONVERTIBLE), - new Car("Chevrolet", "Geo Metro", 1992, Category.CONVERTIBLE)), - Category.SEDAN, List.of(new Car("Dodge", "Avenger", 2010, Category.SEDAN), - new Car("Ford", "Focus", 2012, Category.SEDAN)), - Category.JEEP, List.of(new Car("Jeep", "Wrangler", 2011, Category.JEEP), - new Car("Jeep", "Comanche", 1990, Category.JEEP))); + Category.CONVERTIBLE, List.of( + new Car("Buick", "Cascada", 2016, Category.CONVERTIBLE), + new Car("Chevrolet", "Geo Metro", 1992, Category.CONVERTIBLE) + ), + Category.SEDAN, List.of( + new Car("Dodge", "Avenger", 2010, Category.SEDAN), + new Car("Ford", "Focus", 2012, Category.SEDAN) + ), + Category.JEEP, List.of( + new Car("Jeep", "Wrangler", 2011, Category.JEEP), + new Car("Jeep", "Comanche", 1990, Category.JEEP)) + ); var modelsFunctional = FunctionalProgramming.getGroupingOfCarsByCategory(cars); var modelsImperative = ImperativeProgramming.getGroupingOfCarsByCategory(cars); LOGGER.info("Category " + modelsFunctional); @@ -70,8 +76,10 @@ public class AppTest { @Test public void testGetSedanCarsOwnedSortedByDate() { var john = new Person(cars); - var modelsExpected = List.of(new Car("Dodge", "Avenger", 2010, Category.SEDAN), - new Car("Ford", "Focus", 2012, Category.SEDAN)); + var modelsExpected = List.of( + new Car("Dodge", "Avenger", 2010, Category.SEDAN), + new Car("Ford", "Focus", 2012, Category.SEDAN) + ); var modelsFunctional = FunctionalProgramming.getSedanCarsOwnedSortedByDate(List.of(john)); var modelsImperative = ImperativeProgramming.getSedanCarsOwnedSortedByDate(List.of(john)); assertEquals(modelsExpected, modelsFunctional); diff --git a/command/src/main/java/com/iluwatar/command/App.java b/command/src/main/java/com/iluwatar/command/App.java index 8e7ee31a8..b4e54fd97 100644 --- a/command/src/main/java/com/iluwatar/command/App.java +++ b/command/src/main/java/com/iluwatar/command/App.java @@ -49,8 +49,8 @@ public class App { * @param args command line args */ public static void main(String[] args) { - Wizard wizard = new Wizard(); - Goblin goblin = new Goblin(); + var wizard = new Wizard(); + var goblin = new Goblin(); goblin.printStatus(); diff --git a/command/src/main/java/com/iluwatar/command/ShrinkSpell.java b/command/src/main/java/com/iluwatar/command/ShrinkSpell.java index 6bbc339f4..87497bb7b 100644 --- a/command/src/main/java/com/iluwatar/command/ShrinkSpell.java +++ b/command/src/main/java/com/iluwatar/command/ShrinkSpell.java @@ -41,7 +41,7 @@ public class ShrinkSpell extends Command { @Override public void undo() { if (oldSize != null && target != null) { - Size temp = target.getSize(); + var temp = target.getSize(); target.setSize(oldSize); oldSize = temp; } diff --git a/command/src/main/java/com/iluwatar/command/Wizard.java b/command/src/main/java/com/iluwatar/command/Wizard.java index fcd6e3a5b..e0b973265 100644 --- a/command/src/main/java/com/iluwatar/command/Wizard.java +++ b/command/src/main/java/com/iluwatar/command/Wizard.java @@ -56,7 +56,7 @@ public class Wizard { */ public void undoLastSpell() { if (!undoStack.isEmpty()) { - Command previousSpell = undoStack.pollLast(); + var previousSpell = undoStack.pollLast(); redoStack.offerLast(previousSpell); LOGGER.info("{} undoes {}", this, previousSpell); previousSpell.undo(); @@ -68,7 +68,7 @@ public class Wizard { */ public void redoLastSpell() { if (!redoStack.isEmpty()) { - Command previousSpell = redoStack.pollLast(); + var previousSpell = redoStack.pollLast(); undoStack.offerLast(previousSpell); LOGGER.info("{} redoes {}", this, previousSpell); previousSpell.redo(); diff --git a/command/src/test/java/com/iluwatar/command/AppTest.java b/command/src/test/java/com/iluwatar/command/AppTest.java index 4973668ba..cf691aba3 100644 --- a/command/src/test/java/com/iluwatar/command/AppTest.java +++ b/command/src/test/java/com/iluwatar/command/AppTest.java @@ -25,15 +25,12 @@ package com.iluwatar.command; import org.junit.jupiter.api.Test; -import java.io.IOException; - /** * Tests that Command example runs without errors. */ public class AppTest { @Test - public void test() throws IOException { - String[] args = {}; - App.main(args); + public void test() { + App.main(new String[]{}); } } diff --git a/command/src/test/java/com/iluwatar/command/CommandTest.java b/command/src/test/java/com/iluwatar/command/CommandTest.java index 5cb8fb8f4..81f556010 100644 --- a/command/src/test/java/com/iluwatar/command/CommandTest.java +++ b/command/src/test/java/com/iluwatar/command/CommandTest.java @@ -23,23 +23,23 @@ package com.iluwatar.command; -import org.junit.jupiter.api.Test; - import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; + /** * The Command pattern is a behavioral design pattern in which an object is used to encapsulate all * information needed to perform an action or trigger an event at a later time. This information * includes the method name, the object that owns the method and values for the method parameters. - * - *

Four terms always associated with the command pattern are command, receiver, invoker and - * client. A command object (spell) knows about the receiver (target) and invokes a method of - * the receiver.Values for parameters of the receiver method are stored in the command. The receiver - * then does the work. An invoker object (wizard) knows how to execute a command, and optionally - * does bookkeeping about the command execution. The invoker does not know anything about a - * concrete command, it knows only about command interface. Both an invoker object and several - * command objects are held by a client object (app). The client decides which commands to execute - * at which points. To execute a command, it passes the command object to the invoker object. + * + *

Four terms always associated with the command pattern are command, receiver, invoker and + * client. A command object (spell) knows about the receiver (target) and invokes a method of the + * receiver.Values for parameters of the receiver method are stored in the command. The receiver + * then does the work. An invoker object (wizard) knows how to execute a command, and optionally + * does bookkeeping about the command execution. The invoker does not know anything about a concrete + * command, it knows only about command interface. Both an invoker object and several command + * objects are held by a client object (app). The client decides which commands to execute at which + * points. To execute a command, it passes the command object to the invoker object. */ public class CommandTest { @@ -53,8 +53,8 @@ public class CommandTest { @Test public void testCommand() { - Wizard wizard = new Wizard(); - Goblin goblin = new Goblin(); + var wizard = new Wizard(); + var goblin = new Goblin(); wizard.castSpell(new ShrinkSpell(), goblin); verifyGoblin(goblin, GOBLIN, Size.SMALL, Visibility.VISIBLE); @@ -79,16 +79,17 @@ public class CommandTest { * This method asserts that the passed goblin object has the name as expectedName, size as * expectedSize and visibility as expectedVisibility. * - * @param goblin a goblin object whose state is to be verified against other parameters - * @param expectedName expectedName of the goblin - * @param expectedSize expected size of the goblin + * @param goblin a goblin object whose state is to be verified against other + * parameters + * @param expectedName expectedName of the goblin + * @param expectedSize expected size of the goblin * @param expectedVisibility expected visibility of the goblin */ private void verifyGoblin(Goblin goblin, String expectedName, Size expectedSize, - Visibility expectedVisibility) { + Visibility expectedVisibility) { assertEquals(expectedName, goblin.toString(), "Goblin's name must be same as expectedName"); assertEquals(expectedSize, goblin.getSize(), "Goblin's size must be same as expectedSize"); assertEquals(expectedVisibility, goblin.getVisibility(), - "Goblin's visibility must be same as expectedVisibility"); + "Goblin's visibility must be same as expectedVisibility"); } } diff --git a/commander/src/main/java/com/iluwatar/commander/AppEmployeeDbFailCases.java b/commander/src/main/java/com/iluwatar/commander/AppEmployeeDbFailCases.java index 84297f828..7c48dee4c 100644 --- a/commander/src/main/java/com/iluwatar/commander/AppEmployeeDbFailCases.java +++ b/commander/src/main/java/com/iluwatar/commander/AppEmployeeDbFailCases.java @@ -40,51 +40,47 @@ import com.iluwatar.commander.shippingservice.ShippingService; * available/unavailable. */ public class AppEmployeeDbFailCases { - final int numOfRetries = 3; - final long retryDuration = 30000; - final long queueTime = 240000; //4 mins - final long queueTaskTime = 60000; //1 min - final long paymentTime = 120000; //2 mins - final long messageTime = 150000; //2.5 mins - final long employeeTime = 240000; //4 mins + private final int numOfRetries = 3; + private final long retryDuration = 30000; + private final long queueTime = 240000; //4 mins + private final long queueTaskTime = 60000; //1 min + private final long paymentTime = 120000; //2 mins + private final long messageTime = 150000; //2.5 mins + private final long employeeTime = 240000; //4 mins void employeeDatabaseUnavailableCase() throws Exception { - PaymentService ps = - new PaymentService(new PaymentDatabase(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException()); - ShippingService ss = new ShippingService(new ShippingDatabase()); - MessagingService ms = new MessagingService(new MessagingDatabase()); - EmployeeHandle eh = - new EmployeeHandle(new EmployeeDatabase(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException()); - QueueDatabase qdb = + var ps = new PaymentService(new PaymentDatabase(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException()); + var ss = new ShippingService(new ShippingDatabase()); + var ms = new MessagingService(new MessagingDatabase()); + var eh = new EmployeeHandle(new EmployeeDatabase(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException()); + var qdb = new QueueDatabase(new DatabaseUnavailableException(), new DatabaseUnavailableException(), new DatabaseUnavailableException(), new DatabaseUnavailableException(), new DatabaseUnavailableException(), new DatabaseUnavailableException()); - Commander c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, + var c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, queueTime, queueTaskTime, paymentTime, messageTime, employeeTime); - User user = new User("Jim", "ABCD"); - Order order = new Order(user, "book", 10f); + var user = new User("Jim", "ABCD"); + var order = new Order(user, "book", 10f); c.placeOrder(order); } void employeeDbSuccessCase() throws Exception { - PaymentService ps = new PaymentService(new PaymentDatabase()); - ShippingService ss = - new ShippingService(new ShippingDatabase(), new ItemUnavailableException()); - MessagingService ms = new MessagingService(new MessagingDatabase()); - EmployeeHandle eh = - new EmployeeHandle(new EmployeeDatabase(), new DatabaseUnavailableException(), - new DatabaseUnavailableException()); - QueueDatabase qdb = new QueueDatabase(); - Commander c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, + var ps = new PaymentService(new PaymentDatabase()); + var ss = new ShippingService(new ShippingDatabase(), new ItemUnavailableException()); + var ms = new MessagingService(new MessagingDatabase()); + var eh = new EmployeeHandle(new EmployeeDatabase(), new DatabaseUnavailableException(), + new DatabaseUnavailableException()); + var qdb = new QueueDatabase(); + var c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, queueTime, queueTaskTime, paymentTime, messageTime, employeeTime); - User user = new User("Jim", "ABCD"); - Order order = new Order(user, "book", 10f); + var user = new User("Jim", "ABCD"); + var order = new Order(user, "book", 10f); c.placeOrder(order); } @@ -95,7 +91,7 @@ public class AppEmployeeDbFailCases { */ public static void main(String[] args) throws Exception { - AppEmployeeDbFailCases aefc = new AppEmployeeDbFailCases(); + var aefc = new AppEmployeeDbFailCases(); //aefc.employeeDatabaseUnavailableCase(); aefc.employeeDbSuccessCase(); } diff --git a/commander/src/main/java/com/iluwatar/commander/AppMessagingFailCases.java b/commander/src/main/java/com/iluwatar/commander/AppMessagingFailCases.java index d644d1c1f..cbb6e6c78 100644 --- a/commander/src/main/java/com/iluwatar/commander/AppMessagingFailCases.java +++ b/commander/src/main/java/com/iluwatar/commander/AppMessagingFailCases.java @@ -40,102 +40,95 @@ import com.iluwatar.commander.shippingservice.ShippingService; */ public class AppMessagingFailCases { - final int numOfRetries = 3; - final long retryDuration = 30000; - final long queueTime = 240000; //4 mins - final long queueTaskTime = 60000; //1 min - final long paymentTime = 120000; //2 mins - final long messageTime = 150000; //2.5 mins - final long employeeTime = 240000; //4 mins + private final int numOfRetries = 3; + private final long retryDuration = 30000; + private final long queueTime = 240000; //4 mins + private final long queueTaskTime = 60000; //1 min + private final long paymentTime = 120000; //2 mins + private final long messageTime = 150000; //2.5 mins + private final long employeeTime = 240000; //4 mins void messagingDatabaseUnavailableCasePaymentSuccess() throws Exception { //rest is successful - PaymentService ps = new PaymentService(new PaymentDatabase()); - ShippingService ss = new ShippingService(new ShippingDatabase()); - MessagingService ms = - new MessagingService(new MessagingDatabase(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException()); - EmployeeHandle eh = new EmployeeHandle(new EmployeeDatabase()); - QueueDatabase qdb = new QueueDatabase(); - Commander c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, + var ps = new PaymentService(new PaymentDatabase()); + var ss = new ShippingService(new ShippingDatabase()); + var ms = new MessagingService(new MessagingDatabase(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException()); + var eh = new EmployeeHandle(new EmployeeDatabase()); + var qdb = new QueueDatabase(); + var c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, queueTime, queueTaskTime, paymentTime, messageTime, employeeTime); - User user = new User("Jim", "ABCD"); - Order order = new Order(user, "book", 10f); + var user = new User("Jim", "ABCD"); + var order = new Order(user, "book", 10f); c.placeOrder(order); } void messagingDatabaseUnavailableCasePaymentError() throws Exception { //rest is successful - PaymentService ps = - new PaymentService(new PaymentDatabase(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException()); - ShippingService ss = new ShippingService(new ShippingDatabase()); - MessagingService ms = - new MessagingService(new MessagingDatabase(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException()); - EmployeeHandle eh = new EmployeeHandle(new EmployeeDatabase()); - QueueDatabase qdb = new QueueDatabase(); - Commander c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, + var ps = new PaymentService(new PaymentDatabase(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException()); + var ss = new ShippingService(new ShippingDatabase()); + var ms = new MessagingService(new MessagingDatabase(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException()); + var eh = new EmployeeHandle(new EmployeeDatabase()); + var qdb = new QueueDatabase(); + var c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, queueTime, queueTaskTime, paymentTime, messageTime, employeeTime); - User user = new User("Jim", "ABCD"); - Order order = new Order(user, "book", 10f); + var user = new User("Jim", "ABCD"); + var order = new Order(user, "book", 10f); c.placeOrder(order); } void messagingDatabaseUnavailableCasePaymentFailure() throws Exception { //rest is successful - PaymentService ps = - new PaymentService(new PaymentDatabase(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException()); - ShippingService ss = new ShippingService(new ShippingDatabase()); - MessagingService ms = - new MessagingService(new MessagingDatabase(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException()); - EmployeeHandle eh = new EmployeeHandle(new EmployeeDatabase()); - QueueDatabase qdb = + var ps = new PaymentService(new PaymentDatabase(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException()); + var ss = new ShippingService(new ShippingDatabase()); + var ms = new MessagingService(new MessagingDatabase(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException()); + var eh = new EmployeeHandle(new EmployeeDatabase()); + var qdb = new QueueDatabase(new DatabaseUnavailableException(), new DatabaseUnavailableException(), new DatabaseUnavailableException(), new DatabaseUnavailableException(), new DatabaseUnavailableException(), new DatabaseUnavailableException()); - Commander c = + var c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, queueTime, queueTaskTime, paymentTime, messageTime, employeeTime); - User user = new User("Jim", "ABCD"); - Order order = new Order(user, "book", 10f); + var user = new User("Jim", "ABCD"); + var order = new Order(user, "book", 10f); c.placeOrder(order); } void messagingSuccessCase() throws Exception { //done here - PaymentService ps = - new PaymentService(new PaymentDatabase(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException()); - ShippingService ss = new ShippingService(new ShippingDatabase()); - MessagingService ms = - new MessagingService(new MessagingDatabase(), new DatabaseUnavailableException(), - new DatabaseUnavailableException()); - EmployeeHandle eh = new EmployeeHandle(new EmployeeDatabase()); - QueueDatabase qdb = new QueueDatabase(); - Commander c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, + var ps = new PaymentService(new PaymentDatabase(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException()); + var ss = new ShippingService(new ShippingDatabase()); + var ms = new MessagingService(new MessagingDatabase(), new DatabaseUnavailableException(), + new DatabaseUnavailableException()); + var eh = new EmployeeHandle(new EmployeeDatabase()); + var qdb = new QueueDatabase(); + var c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, queueTime, queueTaskTime, paymentTime, messageTime, employeeTime); - User user = new User("Jim", "ABCD"); - Order order = new Order(user, "book", 10f); + var user = new User("Jim", "ABCD"); + var order = new Order(user, "book", 10f); c.placeOrder(order); } @@ -146,7 +139,7 @@ public class AppMessagingFailCases { */ public static void main(String[] args) throws Exception { - AppMessagingFailCases amfc = new AppMessagingFailCases(); + var amfc = new AppMessagingFailCases(); //amfc.messagingDatabaseUnavailableCasePaymentSuccess(); //amfc.messagingDatabaseUnavailableCasePaymentError(); //amfc.messagingDatabaseUnavailableCasePaymentFailure(); diff --git a/commander/src/main/java/com/iluwatar/commander/AppPaymentFailCases.java b/commander/src/main/java/com/iluwatar/commander/AppPaymentFailCases.java index 4e65b1d28..8dbe7327b 100644 --- a/commander/src/main/java/com/iluwatar/commander/AppPaymentFailCases.java +++ b/commander/src/main/java/com/iluwatar/commander/AppPaymentFailCases.java @@ -40,62 +40,58 @@ import com.iluwatar.commander.shippingservice.ShippingService; */ public class AppPaymentFailCases { - final int numOfRetries = 3; - final long retryDuration = 30000; - final long queueTime = 240000; //4 mins - final long queueTaskTime = 60000; //1 min - final long paymentTime = 120000; //2 mins - final long messageTime = 150000; //2.5 mins - final long employeeTime = 240000; //4 mins + private final int numOfRetries = 3; + private final long retryDuration = 30000; + private final long queueTime = 240000; //4 mins + private final long queueTaskTime = 60000; //1 min + private final long paymentTime = 120000; //2 mins + private final long messageTime = 150000; //2.5 mins + private final long employeeTime = 240000; //4 mins void paymentNotPossibleCase() throws Exception { - PaymentService ps = - new PaymentService(new PaymentDatabase(), new DatabaseUnavailableException(), - new PaymentDetailsErrorException()); - ShippingService ss = new ShippingService(new ShippingDatabase()); - MessagingService ms = - new MessagingService(new MessagingDatabase(), new DatabaseUnavailableException()); - EmployeeHandle eh = new EmployeeHandle(new EmployeeDatabase()); - QueueDatabase qdb = new QueueDatabase(new DatabaseUnavailableException()); - Commander c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, + var ps = new PaymentService(new PaymentDatabase(), new DatabaseUnavailableException(), + new PaymentDetailsErrorException()); + var ss = new ShippingService(new ShippingDatabase()); + var ms = new MessagingService(new MessagingDatabase(), new DatabaseUnavailableException()); + var eh = new EmployeeHandle(new EmployeeDatabase()); + var qdb = new QueueDatabase(new DatabaseUnavailableException()); + var c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, queueTime, queueTaskTime, paymentTime, messageTime, employeeTime); - User user = new User("Jim", "ABCD"); - Order order = new Order(user, "book", 10f); + var user = new User("Jim", "ABCD"); + var order = new Order(user, "book", 10f); c.placeOrder(order); } void paymentDatabaseUnavailableCase() throws Exception { //rest is successful - PaymentService ps = - new PaymentService(new PaymentDatabase(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException()); - ShippingService ss = new ShippingService(new ShippingDatabase()); - MessagingService ms = new MessagingService(new MessagingDatabase()); - EmployeeHandle eh = new EmployeeHandle(new EmployeeDatabase()); - QueueDatabase qdb = new QueueDatabase(); - Commander c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, + var ps = new PaymentService(new PaymentDatabase(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException()); + var ss = new ShippingService(new ShippingDatabase()); + var ms = new MessagingService(new MessagingDatabase()); + var eh = new EmployeeHandle(new EmployeeDatabase()); + var qdb = new QueueDatabase(); + var c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, queueTime, queueTaskTime, paymentTime, messageTime, employeeTime); - User user = new User("Jim", "ABCD"); - Order order = new Order(user, "book", 10f); + var user = new User("Jim", "ABCD"); + var order = new Order(user, "book", 10f); c.placeOrder(order); } void paymentSuccessCase() throws Exception { //goes to message after 2 retries maybe - rest is successful for now - PaymentService ps = - new PaymentService(new PaymentDatabase(), new DatabaseUnavailableException(), - new DatabaseUnavailableException()); - ShippingService ss = new ShippingService(new ShippingDatabase()); - MessagingService ms = + var ps = new PaymentService(new PaymentDatabase(), new DatabaseUnavailableException(), + new DatabaseUnavailableException()); + var ss = new ShippingService(new ShippingDatabase()); + var ms = new MessagingService(new MessagingDatabase(), new DatabaseUnavailableException()); - EmployeeHandle eh = new EmployeeHandle(new EmployeeDatabase()); - QueueDatabase qdb = new QueueDatabase(new DatabaseUnavailableException()); - Commander c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, + var eh = new EmployeeHandle(new EmployeeDatabase()); + var qdb = new QueueDatabase(new DatabaseUnavailableException()); + var c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, queueTime, queueTaskTime, paymentTime, messageTime, employeeTime); - User user = new User("Jim", "ABCD"); - Order order = new Order(user, "book", 10f); + var user = new User("Jim", "ABCD"); + var order = new Order(user, "book", 10f); c.placeOrder(order); } @@ -106,7 +102,7 @@ public class AppPaymentFailCases { */ public static void main(String[] args) throws Exception { - AppPaymentFailCases apfc = new AppPaymentFailCases(); + var apfc = new AppPaymentFailCases(); //apfc.paymentNotPossibleCase(); //apfc.paymentDatabaseUnavailableCase(); apfc.paymentSuccessCase(); diff --git a/commander/src/main/java/com/iluwatar/commander/AppQueueFailCases.java b/commander/src/main/java/com/iluwatar/commander/AppQueueFailCases.java index 34ed81c0f..b108701a2 100644 --- a/commander/src/main/java/com/iluwatar/commander/AppQueueFailCases.java +++ b/commander/src/main/java/com/iluwatar/commander/AppQueueFailCases.java @@ -40,98 +40,93 @@ import com.iluwatar.commander.shippingservice.ShippingService; */ public class AppQueueFailCases { - final int numOfRetries = 3; - final long retryDuration = 30000; - final long queueTime = 240000; //4 mins - final long queueTaskTime = 60000; //1 min - final long paymentTime = 120000; //2 mins - final long messageTime = 150000; //2.5 mins - final long employeeTime = 240000; //4 mins + private final int numOfRetries = 3; + private final long retryDuration = 30000; + private final long queueTime = 240000; //4 mins + private final long queueTaskTime = 60000; //1 min + private final long paymentTime = 120000; //2 mins + private final long messageTime = 150000; //2.5 mins + private final long employeeTime = 240000; //4 mins void queuePaymentTaskDatabaseUnavailableCase() throws Exception { - PaymentService ps = - new PaymentService(new PaymentDatabase(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException()); - ShippingService ss = new ShippingService(new ShippingDatabase()); - MessagingService ms = new MessagingService(new MessagingDatabase()); - EmployeeHandle eh = new EmployeeHandle(new EmployeeDatabase()); - QueueDatabase qdb = + var ps = new PaymentService(new PaymentDatabase(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException()); + var ss = new ShippingService(new ShippingDatabase()); + var ms = new MessagingService(new MessagingDatabase()); + var eh = new EmployeeHandle(new EmployeeDatabase()); + var qdb = new QueueDatabase(new DatabaseUnavailableException(), new DatabaseUnavailableException(), new DatabaseUnavailableException(), new DatabaseUnavailableException(), new DatabaseUnavailableException(), new DatabaseUnavailableException()); - Commander c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, + var c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, queueTime, queueTaskTime, paymentTime, messageTime, employeeTime); - User user = new User("Jim", "ABCD"); - Order order = new Order(user, "book", 10f); + var user = new User("Jim", "ABCD"); + var order = new Order(user, "book", 10f); c.placeOrder(order); } void queueMessageTaskDatabaseUnavailableCase() throws Exception { - PaymentService ps = new PaymentService(new PaymentDatabase()); - ShippingService ss = new ShippingService(new ShippingDatabase()); - MessagingService ms = - new MessagingService(new MessagingDatabase(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException()); - EmployeeHandle eh = new EmployeeHandle(new EmployeeDatabase()); - QueueDatabase qdb = + var ps = new PaymentService(new PaymentDatabase()); + var ss = new ShippingService(new ShippingDatabase()); + var ms = new MessagingService(new MessagingDatabase(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException()); + var eh = new EmployeeHandle(new EmployeeDatabase()); + var qdb = new QueueDatabase(new DatabaseUnavailableException(), new DatabaseUnavailableException(), new DatabaseUnavailableException(), new DatabaseUnavailableException(), new DatabaseUnavailableException(), new DatabaseUnavailableException()); - Commander c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, + var c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, queueTime, queueTaskTime, paymentTime, messageTime, employeeTime); - User user = new User("Jim", "ABCD"); - Order order = new Order(user, "book", 10f); + var user = new User("Jim", "ABCD"); + var order = new Order(user, "book", 10f); c.placeOrder(order); } void queueEmployeeDbTaskDatabaseUnavailableCase() throws Exception { - PaymentService ps = new PaymentService(new PaymentDatabase()); - ShippingService ss = - new ShippingService(new ShippingDatabase(), new ItemUnavailableException()); - MessagingService ms = new MessagingService(new MessagingDatabase()); - EmployeeHandle eh = - new EmployeeHandle(new EmployeeDatabase(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException()); - QueueDatabase qdb = + var ps = new PaymentService(new PaymentDatabase()); + var ss = new ShippingService(new ShippingDatabase(), new ItemUnavailableException()); + var ms = new MessagingService(new MessagingDatabase()); + var eh = new EmployeeHandle(new EmployeeDatabase(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException()); + var qdb = new QueueDatabase(new DatabaseUnavailableException(), new DatabaseUnavailableException(), new DatabaseUnavailableException(), new DatabaseUnavailableException(), new DatabaseUnavailableException(), new DatabaseUnavailableException(), new DatabaseUnavailableException(), new DatabaseUnavailableException(), new DatabaseUnavailableException(), new DatabaseUnavailableException(), new DatabaseUnavailableException(), new DatabaseUnavailableException()); - Commander c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, + var c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, queueTime, queueTaskTime, paymentTime, messageTime, employeeTime); - User user = new User("Jim", "ABCD"); - Order order = new Order(user, "book", 10f); + var user = new User("Jim", "ABCD"); + var order = new Order(user, "book", 10f); c.placeOrder(order); } void queueSuccessCase() throws Exception { - PaymentService ps = - new PaymentService(new PaymentDatabase(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException()); - ShippingService ss = new ShippingService(new ShippingDatabase()); - MessagingService ms = + var ps = new PaymentService(new PaymentDatabase(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException()); + var ss = new ShippingService(new ShippingDatabase()); + var ms = new MessagingService(new MessagingDatabase(), new DatabaseUnavailableException(), new DatabaseUnavailableException()); - EmployeeHandle eh = new EmployeeHandle(new EmployeeDatabase()); - QueueDatabase qdb = + var eh = new EmployeeHandle(new EmployeeDatabase()); + var qdb = new QueueDatabase(new DatabaseUnavailableException(), new DatabaseUnavailableException()); - Commander c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, + var c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, queueTime, queueTaskTime, paymentTime, messageTime, employeeTime); - User user = new User("Jim", "ABCD"); - Order order = new Order(user, "book", 10f); + var user = new User("Jim", "ABCD"); + var order = new Order(user, "book", 10f); c.placeOrder(order); } @@ -142,7 +137,7 @@ public class AppQueueFailCases { */ public static void main(String[] args) throws Exception { - AppQueueFailCases aqfc = new AppQueueFailCases(); + var aqfc = new AppQueueFailCases(); //aqfc.queuePaymentTaskDatabaseUnavailableCase(); //aqfc.queueMessageTaskDatabaseUnavailableCase(); //aqfc.queueEmployeeDbTaskDatabaseUnavailableCase(); diff --git a/commander/src/main/java/com/iluwatar/commander/AppShippingFailCases.java b/commander/src/main/java/com/iluwatar/commander/AppShippingFailCases.java index a055ba699..36bb06042 100644 --- a/commander/src/main/java/com/iluwatar/commander/AppShippingFailCases.java +++ b/commander/src/main/java/com/iluwatar/commander/AppShippingFailCases.java @@ -42,75 +42,69 @@ import com.iluwatar.commander.shippingservice.ShippingService; */ public class AppShippingFailCases { - final int numOfRetries = 3; - final long retryDuration = 30000; - final long queueTime = 240000; //4 mins - final long queueTaskTime = 60000; //1 min - final long paymentTime = 120000; //2 mins - final long messageTime = 150000; //2.5 mins - final long employeeTime = 240000; //4 mins + private final int numOfRetries = 3; + private final long retryDuration = 30000; + private final long queueTime = 240000; //4 mins + private final long queueTaskTime = 60000; //1 min + private final long paymentTime = 120000; //2 mins + private final long messageTime = 150000; //2.5 mins + private final long employeeTime = 240000; //4 mins void itemUnavailableCase() throws Exception { - PaymentService ps = new PaymentService(new PaymentDatabase()); - ShippingService ss = - new ShippingService(new ShippingDatabase(), new ItemUnavailableException()); - MessagingService ms = new MessagingService(new MessagingDatabase()); - EmployeeHandle eh = new EmployeeHandle(new EmployeeDatabase()); - QueueDatabase qdb = new QueueDatabase(); - Commander c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, + var ps = new PaymentService(new PaymentDatabase()); + var ss = new ShippingService(new ShippingDatabase(), new ItemUnavailableException()); + var ms = new MessagingService(new MessagingDatabase()); + var eh = new EmployeeHandle(new EmployeeDatabase()); + var qdb = new QueueDatabase(); + var c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, queueTime, queueTaskTime, paymentTime, messageTime, employeeTime); - User user = new User("Jim", "ABCD"); - Order order = new Order(user, "book", 10f); + var user = new User("Jim", "ABCD"); + var order = new Order(user, "book", 10f); c.placeOrder(order); } void shippingNotPossibleCase() throws Exception { - PaymentService ps = new PaymentService(new PaymentDatabase()); - ShippingService ss = - new ShippingService(new ShippingDatabase(), new ShippingNotPossibleException()); - MessagingService ms = new MessagingService(new MessagingDatabase()); - EmployeeHandle eh = new EmployeeHandle(new EmployeeDatabase()); - QueueDatabase qdb = new QueueDatabase(); - Commander c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, + var ps = new PaymentService(new PaymentDatabase()); + var ss = new ShippingService(new ShippingDatabase(), new ShippingNotPossibleException()); + var ms = new MessagingService(new MessagingDatabase()); + var eh = new EmployeeHandle(new EmployeeDatabase()); + var qdb = new QueueDatabase(); + var c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, queueTime, queueTaskTime, paymentTime, messageTime, employeeTime); - User user = new User("Jim", "ABCD"); - Order order = new Order(user, "book", 10f); + var user = new User("Jim", "ABCD"); + var order = new Order(user, "book", 10f); c.placeOrder(order); } void shippingDatabaseUnavailableCase() throws Exception { //rest is successful - PaymentService ps = new PaymentService(new PaymentDatabase()); - ShippingService ss = - new ShippingService(new ShippingDatabase(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException(), new DatabaseUnavailableException(), - new DatabaseUnavailableException()); - MessagingService ms = new MessagingService(new MessagingDatabase()); - EmployeeHandle eh = new EmployeeHandle(new EmployeeDatabase()); - QueueDatabase qdb = new QueueDatabase(); - Commander c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, + var ps = new PaymentService(new PaymentDatabase()); + var ss = new ShippingService(new ShippingDatabase(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException(), new DatabaseUnavailableException(), + new DatabaseUnavailableException()); + var ms = new MessagingService(new MessagingDatabase()); + var eh = new EmployeeHandle(new EmployeeDatabase()); + var qdb = new QueueDatabase(); + var c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, queueTime, queueTaskTime, paymentTime, messageTime, employeeTime); - User user = new User("Jim", "ABCD"); - Order order = new Order(user, "book", 10f); + var user = new User("Jim", "ABCD"); + var order = new Order(user, "book", 10f); c.placeOrder(order); } void shippingSuccessCase() throws Exception { //goes to payment after 2 retries maybe - rest is successful for now - PaymentService ps = - new PaymentService(new PaymentDatabase(), new DatabaseUnavailableException()); - ShippingService ss = - new ShippingService(new ShippingDatabase(), new DatabaseUnavailableException(), - new DatabaseUnavailableException()); - MessagingService ms = - new MessagingService(new MessagingDatabase(), new DatabaseUnavailableException()); - EmployeeHandle eh = new EmployeeHandle(new EmployeeDatabase()); - QueueDatabase qdb = new QueueDatabase(); - Commander c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, + var ps = new PaymentService(new PaymentDatabase(), new DatabaseUnavailableException()); + var ss = new ShippingService(new ShippingDatabase(), new DatabaseUnavailableException(), + new DatabaseUnavailableException()); + var ms = new MessagingService(new MessagingDatabase(), new DatabaseUnavailableException()); + var eh = new EmployeeHandle(new EmployeeDatabase()); + var qdb = new QueueDatabase(); + var c = new Commander(eh, ps, ss, ms, qdb, numOfRetries, retryDuration, queueTime, queueTaskTime, paymentTime, messageTime, employeeTime); - User user = new User("Jim", "ABCD"); - Order order = new Order(user, "book", 10f); + var user = new User("Jim", "ABCD"); + var order = new Order(user, "book", 10f); c.placeOrder(order); } @@ -121,7 +115,7 @@ public class AppShippingFailCases { */ public static void main(String[] args) throws Exception { - AppShippingFailCases asfc = new AppShippingFailCases(); + var asfc = new AppShippingFailCases(); //asfc.itemUnavailableCase(); //asfc.shippingNotPossibleCase(); //asfc.shippingDatabaseUnavailableCase(); diff --git a/commander/src/main/java/com/iluwatar/commander/Commander.java b/commander/src/main/java/com/iluwatar/commander/Commander.java index 0c0989ade..41779c076 100644 --- a/commander/src/main/java/com/iluwatar/commander/Commander.java +++ b/commander/src/main/java/com/iluwatar/commander/Commander.java @@ -36,7 +36,6 @@ import com.iluwatar.commander.queue.QueueDatabase; import com.iluwatar.commander.queue.QueueTask; import com.iluwatar.commander.queue.QueueTask.TaskType; import com.iluwatar.commander.shippingservice.ShippingService; -import java.util.ArrayList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -86,7 +85,7 @@ public class Commander { private final long messageTime; private final long employeeTime; private boolean finalSiteMsgShown; - static final Logger LOG = LoggerFactory.getLogger(Commander.class); + private static final Logger LOG = LoggerFactory.getLogger(Commander.class); //we could also have another db where it stores all orders Commander(EmployeeHandle empDb, PaymentService paymentService, ShippingService shippingService, @@ -113,7 +112,7 @@ public class Commander { } private void sendShippingRequest(Order order) throws Exception { - ArrayList list = shippingService.exceptionsList; + var list = shippingService.exceptionsList; Retry.Operation op = (l) -> { if (!l.isEmpty()) { if (DatabaseUnavailableException.class.isAssignableFrom(l.get(0).getClass())) { @@ -131,7 +130,6 @@ public class Commander { LOG.info("Order has been placed and will be shipped to you. Please wait while we make your" + " payment... "); sendPaymentRequest(order); - return; }; Retry.HandleErrorIssue handleError = (o, err) -> { if (ShippingNotPossibleException.class.isAssignableFrom(err.getClass())) { @@ -153,9 +151,8 @@ public class Commander { LOG.error("Order " + order.id + ": Shipping service unavailable, order not placed.."); finalSiteMsgShown = true; } - return; }; - Retry r = new Retry(op, handleError, numOfRetries, retryDuration, + var r = new Retry<>(op, handleError, numOfRetries, retryDuration, e -> DatabaseUnavailableException.class.isAssignableFrom(e.getClass())); r.perform(list, order); } @@ -169,79 +166,69 @@ public class Commander { } //if succeeded or failed, would have been dequeued, no attempt to make payment return; } - ArrayList list = paymentService.exceptionsList; - Thread t = new Thread(new Runnable() { - @Override - public void run() { - Retry.Operation op = (l) -> { - if (!l.isEmpty()) { - if (DatabaseUnavailableException.class.isAssignableFrom(l.get(0).getClass())) { - LOG.debug("Order " + order.id + ": Error in connecting to payment service," - + " trying again.."); - } else { - LOG.debug("Order " + order.id + ": Error in creating payment request.."); - } - throw l.remove(0); - } - if (order.paid.equals(PaymentStatus.Trying)) { - String transactionId = paymentService.receiveRequest(order.price); - order.paid = PaymentStatus.Done; - LOG.info("Order " + order.id + ": Payment successful, transaction Id: " - + transactionId); - if (!finalSiteMsgShown) { - LOG.info("Payment made successfully, thank you for shopping with us!!"); - finalSiteMsgShown = true; - } - sendSuccessMessage(order); - return; - } - }; - Retry.HandleErrorIssue handleError = (o, err) -> { - if (PaymentDetailsErrorException.class.isAssignableFrom(err.getClass())) { - if (!finalSiteMsgShown) { - LOG.info("There was an error in payment. Your account/card details " - + "may have been incorrect. " - + "Meanwhile, your order has been converted to COD and will be shipped."); - finalSiteMsgShown = true; - } - LOG.error("Order " + order.id + ": Payment details incorrect, failed.."); - o.paid = PaymentStatus.NotDone; - sendPaymentFailureMessage(o); + var list = paymentService.exceptionsList; + var t = new Thread(() -> { + Retry.Operation op = (l) -> { + if (!l.isEmpty()) { + if (DatabaseUnavailableException.class.isAssignableFrom(l.get(0).getClass())) { + LOG.debug("Order " + order.id + ": Error in connecting to payment service," + + " trying again.."); } else { - try { - if (o.messageSent.equals(MessageSent.NoneSent)) { - if (!finalSiteMsgShown) { - LOG.info("There was an error in payment. We are on it, and will get back to you " - + "asap. Don't worry, your order has been placed and will be shipped."); - finalSiteMsgShown = true; - } - LOG.warn("Order " + order.id + ": Payment error, going to queue.."); - sendPaymentPossibleErrorMsg(o); - } - if (o.paid.equals(PaymentStatus.Trying) && System - .currentTimeMillis() - o.createdTime < paymentTime) { - QueueTask qt = new QueueTask(o, TaskType.Payment, -1); - updateQueue(qt); - } - } catch (InterruptedException e1) { - e1.printStackTrace(); - } + LOG.debug("Order " + order.id + ": Error in creating payment request.."); } - return; - }; - Retry r = new Retry(op, handleError, numOfRetries, retryDuration, - e -> DatabaseUnavailableException.class.isAssignableFrom(e.getClass())); - try { - r.perform(list, order); - } catch (Exception e1) { - e1.printStackTrace(); + throw l.remove(0); } + if (order.paid.equals(PaymentStatus.Trying)) { + var transactionId = paymentService.receiveRequest(order.price); + order.paid = PaymentStatus.Done; + LOG.info("Order " + order.id + ": Payment successful, transaction Id: " + transactionId); + if (!finalSiteMsgShown) { + LOG.info("Payment made successfully, thank you for shopping with us!!"); + finalSiteMsgShown = true; + } + sendSuccessMessage(order); + } + }; + Retry.HandleErrorIssue handleError = (o, err) -> { + if (PaymentDetailsErrorException.class.isAssignableFrom(err.getClass())) { + if (!finalSiteMsgShown) { + LOG.info("There was an error in payment. Your account/card details " + + "may have been incorrect. " + + "Meanwhile, your order has been converted to COD and will be shipped."); + finalSiteMsgShown = true; + } + LOG.error("Order " + order.id + ": Payment details incorrect, failed.."); + o.paid = PaymentStatus.NotDone; + sendPaymentFailureMessage(o); + } else { + if (o.messageSent.equals(MessageSent.NoneSent)) { + if (!finalSiteMsgShown) { + LOG.info("There was an error in payment. We are on it, and will get back to you " + + "asap. Don't worry, your order has been placed and will be shipped."); + finalSiteMsgShown = true; + } + LOG.warn("Order " + order.id + ": Payment error, going to queue.."); + sendPaymentPossibleErrorMsg(o); + } + if (o.paid.equals(PaymentStatus.Trying) && System + .currentTimeMillis() - o.createdTime < paymentTime) { + var qt = new QueueTask(o, TaskType.Payment, -1); + updateQueue(qt); + } + } + }; + var r = new Retry<>(op, handleError, numOfRetries, retryDuration, + e -> DatabaseUnavailableException.class.isAssignableFrom(e.getClass())); + try { + r.perform(list, order); + } catch (Exception e1) { + e1.printStackTrace(); } }); t.start(); } - private void updateQueue(QueueTask qt) throws InterruptedException { + private void updateQueue(QueueTask qt) { if (System.currentTimeMillis() - qt.order.createdTime >= this.queueTime) { // since payment time is lesser than queuetime it would have already failed.. // additional check not needed @@ -256,97 +243,82 @@ public class Commander { LOG.trace("Order " + qt.order.id + ": Not queueing task since task already done.."); return; } - ArrayList list = queue.exceptionsList; - Thread t = new Thread(new Runnable() { - @Override - public void run() { - Retry.Operation op = (list) -> { - if (!list.isEmpty()) { - LOG.warn("Order " + qt.order.id + ": Error in connecting to queue db, trying again.."); - throw list.remove(0); - } - queue.add(qt); - queueItems++; - LOG.info("Order " + qt.order.id + ": " + qt.getType() + " task enqueued.."); - tryDoingTasksInQueue(); - return; - }; - Retry.HandleErrorIssue handleError = (qt, err) -> { - if (qt.taskType.equals(TaskType.Payment)) { - qt.order.paid = PaymentStatus.NotDone; - sendPaymentFailureMessage(qt.order); - LOG.error("Order " + qt.order.id + ": Unable to enqueue payment task," - + " payment failed.."); - } - LOG.error("Order " + qt.order.id + ": Unable to enqueue task of type " + qt.getType() - + ", trying to add to employee handle.."); - employeeHandleIssue(qt.order); - return; - }; - Retry r = new Retry(op, handleError, numOfRetries, retryDuration, - e -> DatabaseUnavailableException.class.isAssignableFrom(e.getClass())); - try { - r.perform(list, qt); - } catch (Exception e1) { - e1.printStackTrace(); + var list = queue.exceptionsList; + Thread t = new Thread(() -> { + Retry.Operation op = (list1) -> { + if (!list1.isEmpty()) { + LOG.warn("Order " + qt.order.id + ": Error in connecting to queue db, trying again.."); + throw list1.remove(0); } + queue.add(qt); + queueItems++; + LOG.info("Order " + qt.order.id + ": " + qt.getType() + " task enqueued.."); + tryDoingTasksInQueue(); + }; + Retry.HandleErrorIssue handleError = (qt1, err) -> { + if (qt1.taskType.equals(TaskType.Payment)) { + qt1.order.paid = PaymentStatus.NotDone; + sendPaymentFailureMessage(qt1.order); + LOG.error("Order " + qt1.order.id + ": Unable to enqueue payment task," + + " payment failed.."); + } + LOG.error("Order " + qt1.order.id + ": Unable to enqueue task of type " + qt1.getType() + + ", trying to add to employee handle.."); + employeeHandleIssue(qt1.order); + }; + var r = new Retry<>(op, handleError, numOfRetries, retryDuration, + e -> DatabaseUnavailableException.class.isAssignableFrom(e.getClass())); + try { + r.perform(list, qt); + } catch (Exception e1) { + e1.printStackTrace(); } }); t.start(); } private void tryDoingTasksInQueue() { //commander controls operations done to queue - ArrayList list = queue.exceptionsList; - Thread t2 = new Thread(new Runnable() { - @Override - public void run() { - Retry.Operation op = (list) -> { - if (!list.isEmpty()) { - LOG.warn("Error in accessing queue db to do tasks, trying again.."); - throw list.remove(0); - } - doTasksInQueue(); - return; - }; - Retry.HandleErrorIssue handleError = (o, err) -> { - return; - }; - Retry r = new Retry(op, handleError, numOfRetries, retryDuration, - e -> DatabaseUnavailableException.class.isAssignableFrom(e.getClass())); - try { - r.perform(list, null); - } catch (Exception e1) { - e1.printStackTrace(); + var list = queue.exceptionsList; + var t2 = new Thread(() -> { + Retry.Operation op = (list1) -> { + if (!list1.isEmpty()) { + LOG.warn("Error in accessing queue db to do tasks, trying again.."); + throw list1.remove(0); } + doTasksInQueue(); + }; + Retry.HandleErrorIssue handleError = (o, err) -> { + }; + var r = new Retry<>(op, handleError, numOfRetries, retryDuration, + e -> DatabaseUnavailableException.class.isAssignableFrom(e.getClass())); + try { + r.perform(list, null); + } catch (Exception e1) { + e1.printStackTrace(); } }); t2.start(); } private void tryDequeue() { - ArrayList list = queue.exceptionsList; - Thread t3 = new Thread(new Runnable() { - @Override - public void run() { - Retry.Operation op = (list) -> { - if (!list.isEmpty()) { - LOG.warn("Error in accessing queue db to dequeue task, trying again.."); - throw list.remove(0); - } - queue.dequeue(); - queueItems--; - return; - }; - Retry.HandleErrorIssue handleError = (o, err) -> { - return; - }; - Retry r = new Retry(op, handleError, numOfRetries, retryDuration, - e -> DatabaseUnavailableException.class.isAssignableFrom(e.getClass())); - try { - r.perform(list, null); - } catch (Exception e1) { - e1.printStackTrace(); + var list = queue.exceptionsList; + var t3 = new Thread(() -> { + Retry.Operation op = (list1) -> { + if (!list1.isEmpty()) { + LOG.warn("Error in accessing queue db to dequeue task, trying again.."); + throw list1.remove(0); } + queue.dequeue(); + queueItems--; + }; + Retry.HandleErrorIssue handleError = (o, err) -> { + }; + var r = new Retry(op, handleError, numOfRetries, retryDuration, + e -> DatabaseUnavailableException.class.isAssignableFrom(e.getClass())); + try { + r.perform(list, null); + } catch (Exception e1) { + e1.printStackTrace(); } }); t3.start(); @@ -357,53 +329,44 @@ public class Commander { LOG.trace("Order " + order.id + ": Message time for order over, returning.."); return; } - ArrayList list = messagingService.exceptionsList; - Thread t = new Thread(new Runnable() { - @Override - public void run() { - Retry.Operation op = (l) -> { - if (!l.isEmpty()) { - if (DatabaseUnavailableException.class.isAssignableFrom(l.get(0).getClass())) { - LOG.debug("Order " + order.id + ": Error in connecting to messaging service " - + "(Payment Success msg), trying again.."); - } else { - LOG.debug("Order " + order.id + ": Error in creating Payment Success" - + " messaging request.."); - } - throw l.remove(0); + var list = messagingService.exceptionsList; + Thread t = new Thread(() -> { + Retry.Operation op = (l) -> { + if (!l.isEmpty()) { + if (DatabaseUnavailableException.class.isAssignableFrom(l.get(0).getClass())) { + LOG.debug("Order " + order.id + ": Error in connecting to messaging service " + + "(Payment Success msg), trying again.."); + } else { + LOG.debug("Order " + order.id + ": Error in creating Payment Success" + + " messaging request.."); } - if (!order.messageSent.equals(MessageSent.PaymentFail) - && !order.messageSent.equals(MessageSent.PaymentSuccessful)) { - String requestId = messagingService.receiveRequest(2); - order.messageSent = MessageSent.PaymentSuccessful; - LOG.info("Order " + order.id + ": Payment Success message sent," - + " request Id: " + requestId); - } - return; - }; - Retry.HandleErrorIssue handleError = (o, err) -> { - try { - if ((o.messageSent.equals(MessageSent.NoneSent) || o.messageSent - .equals(MessageSent.PaymentTrying)) - && System.currentTimeMillis() - o.createdTime < messageTime) { - QueueTask qt = new QueueTask(order, TaskType.Messaging, 2); - updateQueue(qt); - LOG.info("Order " + order.id + ": Error in sending Payment Success message, trying to" - + " queue task and add to employee handle.."); - employeeHandleIssue(order); - } - } catch (InterruptedException e1) { - e1.printStackTrace(); - } - return; - }; - Retry r = new Retry(op, handleError, numOfRetries, retryDuration, - e -> DatabaseUnavailableException.class.isAssignableFrom(e.getClass())); - try { - r.perform(list, order); - } catch (Exception e1) { - e1.printStackTrace(); + throw l.remove(0); } + if (!order.messageSent.equals(MessageSent.PaymentFail) + && !order.messageSent.equals(MessageSent.PaymentSuccessful)) { + var requestId = messagingService.receiveRequest(2); + order.messageSent = MessageSent.PaymentSuccessful; + LOG.info("Order " + order.id + ": Payment Success message sent," + + " request Id: " + requestId); + } + }; + Retry.HandleErrorIssue handleError = (o, err) -> { + if ((o.messageSent.equals(MessageSent.NoneSent) || o.messageSent + .equals(MessageSent.PaymentTrying)) + && System.currentTimeMillis() - o.createdTime < messageTime) { + var qt = new QueueTask(order, TaskType.Messaging, 2); + updateQueue(qt); + LOG.info("Order " + order.id + ": Error in sending Payment Success message, trying to" + + " queue task and add to employee handle.."); + employeeHandleIssue(order); + } + }; + var r = new Retry<>(op, handleError, numOfRetries, retryDuration, + e -> DatabaseUnavailableException.class.isAssignableFrom(e.getClass())); + try { + r.perform(list, order); + } catch (Exception e1) { + e1.printStackTrace(); } }); t.start(); @@ -414,53 +377,44 @@ public class Commander { LOG.trace("Order " + order.id + ": Message time for order over, returning.."); return; } - ArrayList list = messagingService.exceptionsList; - Thread t = new Thread(new Runnable() { - @Override - public void run() { - Retry.Operation op = (l) -> { - if (!l.isEmpty()) { - if (DatabaseUnavailableException.class.isAssignableFrom(l.get(0).getClass())) { - LOG.debug("Order " + order.id + ": Error in connecting to messaging service " - + "(Payment Failure msg), trying again.."); - } else { - LOG.debug("Order " + order.id + ": Error in creating Payment Failure" - + " message request.."); - } - throw l.remove(0); + var list = messagingService.exceptionsList; + var t = new Thread(() -> { + Retry.Operation op = (l) -> { + if (!l.isEmpty()) { + if (DatabaseUnavailableException.class.isAssignableFrom(l.get(0).getClass())) { + LOG.debug("Order " + order.id + ": Error in connecting to messaging service " + + "(Payment Failure msg), trying again.."); + } else { + LOG.debug("Order " + order.id + ": Error in creating Payment Failure" + + " message request.."); } - if (!order.messageSent.equals(MessageSent.PaymentFail) - && !order.messageSent.equals(MessageSent.PaymentSuccessful)) { - String requestId = messagingService.receiveRequest(0); - order.messageSent = MessageSent.PaymentFail; - LOG.info("Order " + order.id + ": Payment Failure message sent successfully," - + " request Id: " + requestId); - } - return; - }; - Retry.HandleErrorIssue handleError = (o, err) -> { - if ((o.messageSent.equals(MessageSent.NoneSent) || o.messageSent - .equals(MessageSent.PaymentTrying)) - && System.currentTimeMillis() - o.createdTime < messageTime) { - try { - QueueTask qt = new QueueTask(order, TaskType.Messaging, 0); - updateQueue(qt); - LOG.warn("Order " + order.id + ": Error in sending Payment Failure message, " - + "trying to queue task and add to employee handle.."); - employeeHandleIssue(o); - } catch (InterruptedException e1) { - e1.printStackTrace(); - } - return; - } - }; - Retry r = new Retry(op, handleError, numOfRetries, retryDuration, - e -> DatabaseUnavailableException.class.isAssignableFrom(e.getClass())); - try { - r.perform(list, order); - } catch (Exception e1) { - e1.printStackTrace(); + throw l.remove(0); } + if (!order.messageSent.equals(MessageSent.PaymentFail) + && !order.messageSent.equals(MessageSent.PaymentSuccessful)) { + var requestId = messagingService.receiveRequest(0); + order.messageSent = MessageSent.PaymentFail; + LOG.info("Order " + order.id + ": Payment Failure message sent successfully," + + " request Id: " + requestId); + } + }; + Retry.HandleErrorIssue handleError = (o, err) -> { + if ((o.messageSent.equals(MessageSent.NoneSent) || o.messageSent + .equals(MessageSent.PaymentTrying)) + && System.currentTimeMillis() - o.createdTime < messageTime) { + var qt = new QueueTask(order, TaskType.Messaging, 0); + updateQueue(qt); + LOG.warn("Order " + order.id + ": Error in sending Payment Failure message, " + + "trying to queue task and add to employee handle.."); + employeeHandleIssue(o); + } + }; + var r = new Retry<>(op, handleError, numOfRetries, retryDuration, + e -> DatabaseUnavailableException.class.isAssignableFrom(e.getClass())); + try { + r.perform(list, order); + } catch (Exception e1) { + e1.printStackTrace(); } }); t.start(); @@ -471,53 +425,44 @@ public class Commander { LOG.trace("Message time for order over, returning.."); return; } - ArrayList list = messagingService.exceptionsList; - Thread t = new Thread(new Runnable() { - @Override - public void run() { - Retry.Operation op = (l) -> { - if (!l.isEmpty()) { - if (DatabaseUnavailableException.class.isAssignableFrom(l.get(0).getClass())) { - LOG.debug("Order " + order.id + ": Error in connecting to messaging service " - + "(Payment Error msg), trying again.."); - } else { - LOG.debug("Order " + order.id + ": Error in creating Payment Error" - + " messaging request.."); - } - throw l.remove(0); + var list = messagingService.exceptionsList; + var t = new Thread(() -> { + Retry.Operation op = (l) -> { + if (!l.isEmpty()) { + if (DatabaseUnavailableException.class.isAssignableFrom(l.get(0).getClass())) { + LOG.debug("Order " + order.id + ": Error in connecting to messaging service " + + "(Payment Error msg), trying again.."); + } else { + LOG.debug("Order " + order.id + ": Error in creating Payment Error" + + " messaging request.."); } - if (order.paid.equals(PaymentStatus.Trying) && order.messageSent - .equals(MessageSent.NoneSent)) { - String requestId = messagingService.receiveRequest(1); - order.messageSent = MessageSent.PaymentTrying; - LOG.info("Order " + order.id + ": Payment Error message sent successfully," - + " request Id: " + requestId); - } - return; - }; - Retry.HandleErrorIssue handleError = (o, err) -> { - try { - if (o.messageSent.equals(MessageSent.NoneSent) && order.paid - .equals(PaymentStatus.Trying) - && System.currentTimeMillis() - o.createdTime < messageTime) { - QueueTask qt = new QueueTask(order, TaskType.Messaging, 1); - updateQueue(qt); - LOG.warn("Order " + order.id + ": Error in sending Payment Error message, " - + "trying to queue task and add to employee handle.."); - employeeHandleIssue(o); - } - } catch (InterruptedException e1) { - e1.printStackTrace(); - } - return; - }; - Retry r = new Retry(op, handleError, numOfRetries, retryDuration, - e -> DatabaseUnavailableException.class.isAssignableFrom(e.getClass())); - try { - r.perform(list, order); - } catch (Exception e1) { - e1.printStackTrace(); + throw l.remove(0); } + if (order.paid.equals(PaymentStatus.Trying) && order.messageSent + .equals(MessageSent.NoneSent)) { + var requestId = messagingService.receiveRequest(1); + order.messageSent = MessageSent.PaymentTrying; + LOG.info("Order " + order.id + ": Payment Error message sent successfully," + + " request Id: " + requestId); + } + }; + Retry.HandleErrorIssue handleError = (o, err) -> { + if (o.messageSent.equals(MessageSent.NoneSent) && order.paid + .equals(PaymentStatus.Trying) + && System.currentTimeMillis() - o.createdTime < messageTime) { + var qt = new QueueTask(order, TaskType.Messaging, 1); + updateQueue(qt); + LOG.warn("Order " + order.id + ": Error in sending Payment Error message, " + + "trying to queue task and add to employee handle.."); + employeeHandleIssue(o); + } + }; + var r = new Retry<>(op, handleError, numOfRetries, retryDuration, + e -> DatabaseUnavailableException.class.isAssignableFrom(e.getClass())); + try { + r.perform(list, order); + } catch (Exception e1) { + e1.printStackTrace(); } }); t.start(); @@ -528,45 +473,35 @@ public class Commander { LOG.trace("Order " + order.id + ": Employee handle time for order over, returning.."); return; } - ArrayList list = employeeDb.exceptionsList; - Thread t = new Thread(new Runnable() { - @Override - public void run() { - Retry.Operation op = (l) -> { - if (!l.isEmpty()) { - LOG.warn("Order " + order.id + ": Error in connecting to employee handle," - + " trying again.."); - throw l.remove(0); - } - if (!order.addedToEmployeeHandle) { - employeeDb.receiveRequest(order); - order.addedToEmployeeHandle = true; - LOG.info("Order " + order.id + ": Added order to employee database"); - } - return; - }; - Retry.HandleErrorIssue handleError = (o, err) -> { - try { - if (!o.addedToEmployeeHandle && System - .currentTimeMillis() - order.createdTime < employeeTime) { - QueueTask qt = new QueueTask(order, TaskType.EmployeeDb, -1); - updateQueue(qt); - LOG.warn("Order " + order.id + ": Error in adding to employee db," - + " trying to queue task.."); - return; - } - } catch (InterruptedException e1) { - e1.printStackTrace(); - } - return; - }; - Retry r = new Retry(op, handleError, numOfRetries, retryDuration, - e -> DatabaseUnavailableException.class.isAssignableFrom(e.getClass())); - try { - r.perform(list, order); - } catch (Exception e1) { - e1.printStackTrace(); + var list = employeeDb.exceptionsList; + var t = new Thread(() -> { + Retry.Operation op = (l) -> { + if (!l.isEmpty()) { + LOG.warn("Order " + order.id + ": Error in connecting to employee handle," + + " trying again.."); + throw l.remove(0); } + if (!order.addedToEmployeeHandle) { + employeeDb.receiveRequest(order); + order.addedToEmployeeHandle = true; + LOG.info("Order " + order.id + ": Added order to employee database"); + } + }; + Retry.HandleErrorIssue handleError = (o, err) -> { + if (!o.addedToEmployeeHandle && System + .currentTimeMillis() - order.createdTime < employeeTime) { + var qt = new QueueTask(order, TaskType.EmployeeDb, -1); + updateQueue(qt); + LOG.warn("Order " + order.id + ": Error in adding to employee db," + + " trying to queue task.."); + } + }; + var r = new Retry<>(op, handleError, numOfRetries, retryDuration, + e -> DatabaseUnavailableException.class.isAssignableFrom(e.getClass())); + try { + r.perform(list, order); + } catch (Exception e1) { + e1.printStackTrace(); } }); t.start(); @@ -574,7 +509,7 @@ public class Commander { private void doTasksInQueue() throws Exception { if (queueItems != 0) { - QueueTask qt = queue.peek(); //this should probably be cloned here + var qt = queue.peek(); //this should probably be cloned here //this is why we have retry for doTasksInQueue LOG.trace("Order " + qt.order.id + ": Started doing task of type " + qt.getType()); if (qt.firstAttemptTime == -1) { diff --git a/commander/src/main/java/com/iluwatar/commander/Order.java b/commander/src/main/java/com/iluwatar/commander/Order.java index 0293c478c..87a9f794a 100644 --- a/commander/src/main/java/com/iluwatar/commander/Order.java +++ b/commander/src/main/java/com/iluwatar/commander/Order.java @@ -36,14 +36,10 @@ public class Order { //can store all transactions ids also NotDone, Trying, Done } - ; - enum MessageSent { NoneSent, PaymentFail, PaymentTrying, PaymentSuccessful } - ; - final User user; final String item; public final String id; @@ -74,7 +70,7 @@ public class Order { //can store all transactions ids also this.addedToEmployeeHandle = false; } - String createUniqueId() { + private String createUniqueId() { StringBuilder random = new StringBuilder(); while (random.length() < 12) { // length of the random string. int index = (int) (RANDOM.nextFloat() * ALL_CHARS.length()); diff --git a/commander/src/main/java/com/iluwatar/commander/Retry.java b/commander/src/main/java/com/iluwatar/commander/Retry.java index 65c92d3ef..be93a821c 100644 --- a/commander/src/main/java/com/iluwatar/commander/Retry.java +++ b/commander/src/main/java/com/iluwatar/commander/Retry.java @@ -25,6 +25,7 @@ package com.iluwatar.commander; import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.Random; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Predicate; @@ -42,7 +43,7 @@ public class Retry { */ public interface Operation { - void operation(ArrayList list) throws Exception; + void operation(List list) throws Exception; } /** @@ -63,9 +64,9 @@ public class Retry { private final long maxDelay; private final AtomicInteger attempts; private final Predicate test; - private final ArrayList errors; + private final List errors; - Retry(Operation op, HandleErrorIssue handleError, int maxAttempts, + Retry(Operation op, HandleErrorIssue handleError, int maxAttempts, long maxDelay, Predicate... ignoreTests) { this.op = op; this.handleError = handleError; @@ -83,7 +84,7 @@ public class Retry { * @param obj is the parameter to be passed into handleIsuue method */ - public void perform(ArrayList list, T obj) throws Exception { + public void perform(List list, T obj) { do { try { op.operation(list); @@ -97,7 +98,7 @@ public class Retry { try { long testDelay = (long) Math.pow(2, this.attempts.intValue()) * 1000 + RANDOM.nextInt(1000); - long delay = testDelay < this.maxDelay ? testDelay : maxDelay; + long delay = Math.min(testDelay, this.maxDelay); Thread.sleep(delay); } catch (InterruptedException f) { //ignore diff --git a/commander/src/main/java/com/iluwatar/commander/employeehandle/EmployeeDatabase.java b/commander/src/main/java/com/iluwatar/commander/employeehandle/EmployeeDatabase.java index 3f5b7bcc0..496bb545a 100644 --- a/commander/src/main/java/com/iluwatar/commander/employeehandle/EmployeeDatabase.java +++ b/commander/src/main/java/com/iluwatar/commander/employeehandle/EmployeeDatabase.java @@ -36,7 +36,7 @@ public class EmployeeDatabase extends Database { private Hashtable data; public EmployeeDatabase() { - this.data = new Hashtable(); + this.data = new Hashtable<>(); } @Override diff --git a/commander/src/main/java/com/iluwatar/commander/employeehandle/EmployeeHandle.java b/commander/src/main/java/com/iluwatar/commander/employeehandle/EmployeeHandle.java index 9f4d8fb48..3c9c3cb97 100644 --- a/commander/src/main/java/com/iluwatar/commander/employeehandle/EmployeeHandle.java +++ b/commander/src/main/java/com/iluwatar/commander/employeehandle/EmployeeHandle.java @@ -28,8 +28,8 @@ import com.iluwatar.commander.Service; import com.iluwatar.commander.exceptions.DatabaseUnavailableException; /** - * The EmployeeHandle class is the middle-man between {@link Commander} and {@link - * EmployeeDatabase}. + * The EmployeeHandle class is the middle-man between {@link com.iluwatar.commander.Commander} and + * {@link EmployeeDatabase}. */ public class EmployeeHandle extends Service { @@ -39,11 +39,11 @@ public class EmployeeHandle extends Service { } public String receiveRequest(Object... parameters) throws DatabaseUnavailableException { - return updateDb((Order) parameters[0]); + return updateDb(parameters[0]); } protected String updateDb(Object... parameters) throws DatabaseUnavailableException { - Order o = (Order) parameters[0]; + var o = (Order) parameters[0]; if (database.get(o.id) == null) { database.add(o); return o.id; //true rcvd - change addedToEmployeeHandle to true else dont do anything diff --git a/commander/src/main/java/com/iluwatar/commander/messagingservice/MessagingDatabase.java b/commander/src/main/java/com/iluwatar/commander/messagingservice/MessagingDatabase.java index 45bd1e23a..fbba52cac 100644 --- a/commander/src/main/java/com/iluwatar/commander/messagingservice/MessagingDatabase.java +++ b/commander/src/main/java/com/iluwatar/commander/messagingservice/MessagingDatabase.java @@ -36,16 +36,16 @@ public class MessagingDatabase extends Database { private Hashtable data; public MessagingDatabase() { - this.data = new Hashtable(); + this.data = new Hashtable<>(); } @Override - public MessageRequest add(MessageRequest r) throws DatabaseUnavailableException { + public MessageRequest add(MessageRequest r) { return data.put(r.reqId, r); } @Override - public MessageRequest get(String requestId) throws DatabaseUnavailableException { + public MessageRequest get(String requestId) { return data.get(requestId); } diff --git a/commander/src/main/java/com/iluwatar/commander/messagingservice/MessagingService.java b/commander/src/main/java/com/iluwatar/commander/messagingservice/MessagingService.java index 1dcdac926..3fb385757 100644 --- a/commander/src/main/java/com/iluwatar/commander/messagingservice/MessagingService.java +++ b/commander/src/main/java/com/iluwatar/commander/messagingservice/MessagingService.java @@ -31,7 +31,7 @@ import org.slf4j.LoggerFactory; /** * The MessagingService is used to send messages to user regarding their order and payment status. * In case an error is encountered in payment and this service is found to be unavailable, the order - * is added to the {@link EmployeeDatabase}. + * is added to the {@link com.iluwatar.commander.employeehandle.EmployeeDatabase}. */ public class MessagingService extends Service { @@ -41,8 +41,6 @@ public class MessagingService extends Service { PaymentFail, PaymentTrying, PaymentSuccessful } - ; - class MessageRequest { String reqId; MessageToSend msg; @@ -58,12 +56,12 @@ public class MessagingService extends Service { } /** - * Public method which will receive request from {@link Commander}. + * Public method which will receive request from {@link com.iluwatar.commander.Commander}. */ public String receiveRequest(Object... parameters) throws DatabaseUnavailableException { - int messageToSend = (int) parameters[0]; - String id = generateId(); - MessageToSend msg = null; + var messageToSend = (int) parameters[0]; + var id = generateId(); + MessageToSend msg; if (messageToSend == 0) { msg = MessageToSend.PaymentFail; } else if (messageToSend == 1) { @@ -71,12 +69,12 @@ public class MessagingService extends Service { } else { //messageToSend == 2 msg = MessageToSend.PaymentSuccessful; } - MessageRequest req = new MessageRequest(id, msg); + var req = new MessageRequest(id, msg); return updateDb(req); } protected String updateDb(Object... parameters) throws DatabaseUnavailableException { - MessageRequest req = (MessageRequest) parameters[0]; + var req = (MessageRequest) parameters[0]; if (this.database.get(req.reqId) == null) { //idempotence, in case db fails here database.add(req); //if successful: LOGGER.info(sendMessage(req.msg)); diff --git a/commander/src/main/java/com/iluwatar/commander/paymentservice/PaymentDatabase.java b/commander/src/main/java/com/iluwatar/commander/paymentservice/PaymentDatabase.java index ed308dbfb..644979883 100644 --- a/commander/src/main/java/com/iluwatar/commander/paymentservice/PaymentDatabase.java +++ b/commander/src/main/java/com/iluwatar/commander/paymentservice/PaymentDatabase.java @@ -37,17 +37,17 @@ public class PaymentDatabase extends Database { private Hashtable data; public PaymentDatabase() { - this.data = new Hashtable(); + this.data = new Hashtable<>(); //0-fail, 1-error, 2-success } @Override - public PaymentRequest add(PaymentRequest r) throws DatabaseUnavailableException { + public PaymentRequest add(PaymentRequest r) { return data.put(r.transactionId, r); } @Override - public PaymentRequest get(String requestId) throws DatabaseUnavailableException { + public PaymentRequest get(String requestId) { return data.get(requestId); } diff --git a/commander/src/main/java/com/iluwatar/commander/paymentservice/PaymentService.java b/commander/src/main/java/com/iluwatar/commander/paymentservice/PaymentService.java index 95ca92a65..f18b55eaa 100644 --- a/commander/src/main/java/com/iluwatar/commander/paymentservice/PaymentService.java +++ b/commander/src/main/java/com/iluwatar/commander/paymentservice/PaymentService.java @@ -27,8 +27,8 @@ import com.iluwatar.commander.Service; import com.iluwatar.commander.exceptions.DatabaseUnavailableException; /** - * The PaymentService class receives request from the {@link Commander} and adds to the {@link - * PaymentDatabase}. + * The PaymentService class receives request from the {@link com.iluwatar.commander.Commander} and + * adds to the {@link PaymentDatabase}. */ public class PaymentService extends Service { @@ -50,18 +50,18 @@ public class PaymentService extends Service { } /** - * Public method which will receive request from {@link Commander}. + * Public method which will receive request from {@link com.iluwatar.commander.Commander}. */ public String receiveRequest(Object... parameters) throws DatabaseUnavailableException { //it could also be sending a userid, payment details here or something, not added here - String id = generateId(); - PaymentRequest req = new PaymentRequest(id, (float) parameters[0]); + var id = generateId(); + var req = new PaymentRequest(id, (float) parameters[0]); return updateDb(req); } protected String updateDb(Object... parameters) throws DatabaseUnavailableException { - PaymentRequest req = (PaymentRequest) parameters[0]; + var req = (PaymentRequest) parameters[0]; if (database.get(req.transactionId) == null || !req.paid) { database.add(req); req.paid = true; diff --git a/commander/src/main/java/com/iluwatar/commander/queue/Queue.java b/commander/src/main/java/com/iluwatar/commander/queue/Queue.java index 1770e6c05..7a2c5d7ae 100644 --- a/commander/src/main/java/com/iluwatar/commander/queue/Queue.java +++ b/commander/src/main/java/com/iluwatar/commander/queue/Queue.java @@ -33,15 +33,15 @@ import com.iluwatar.commander.exceptions.IsEmptyException; public class Queue { - Node front; - Node rear; - public int size = 0; + private Node front; + private Node rear; + private int size; - class Node { - T value; - Node next; + static class Node { + V value; + Node next; - Node(T obj, Node b) { + Node(V obj, Node b) { value = obj; next = b; } @@ -57,19 +57,15 @@ public class Queue { } boolean isEmpty() { - if (size == 0) { - return true; - } else { - return false; - } + return size == 0; } void enqueue(T obj) { if (front == null) { - front = new Node(obj, null); + front = new Node<>(obj, null); rear = front; } else { - Node temp = new Node(obj, null); + var temp = new Node<>(obj, null); rear.next = temp; rear = temp; } @@ -80,10 +76,10 @@ public class Queue { if (isEmpty()) { throw new IsEmptyException(); } else { - Node temp = front; + var temp = front; front = front.next; size = size - 1; - return (T) temp.value; + return temp.value; } } @@ -91,7 +87,7 @@ public class Queue { if (isEmpty()) { throw new IsEmptyException(); } else { - return (T) front.value; + return front.value; } } } diff --git a/commander/src/main/java/com/iluwatar/commander/queue/QueueDatabase.java b/commander/src/main/java/com/iluwatar/commander/queue/QueueDatabase.java index 3874cc27d..91a7966f7 100644 --- a/commander/src/main/java/com/iluwatar/commander/queue/QueueDatabase.java +++ b/commander/src/main/java/com/iluwatar/commander/queue/QueueDatabase.java @@ -36,7 +36,7 @@ import java.util.List; public class QueueDatabase extends Database { private Queue data; - public ArrayList exceptionsList; + public List exceptionsList; public QueueDatabase(Exception... exc) { this.data = new Queue<>(); @@ -44,7 +44,7 @@ public class QueueDatabase extends Database { } @Override - public QueueTask add(QueueTask t) throws DatabaseUnavailableException { + public QueueTask add(QueueTask t) { data.enqueue(t); return t; //even if same thing queued twice, it is taken care of in other dbs @@ -55,12 +55,10 @@ public class QueueDatabase extends Database { * * @return object at front of queue * @throws IsEmptyException if queue is empty - * @throws DatabaseUnavailableException if queue db is unavailable */ - public QueueTask peek() throws IsEmptyException, DatabaseUnavailableException { - QueueTask qt = this.data.peek(); - return qt; + public QueueTask peek() throws IsEmptyException { + return this.data.peek(); } /** @@ -68,16 +66,14 @@ public class QueueDatabase extends Database { * * @return object at front of queue * @throws IsEmptyException if queue is empty - * @throws DatabaseUnavailableException if queue db is unavailable */ - public QueueTask dequeue() throws IsEmptyException, DatabaseUnavailableException { - QueueTask qt = this.data.dequeue(); - return qt; + public QueueTask dequeue() throws IsEmptyException { + return this.data.dequeue(); } @Override - public QueueTask get(String taskId) throws DatabaseUnavailableException { + public QueueTask get(String taskId) { return null; } diff --git a/commander/src/main/java/com/iluwatar/commander/queue/QueueTask.java b/commander/src/main/java/com/iluwatar/commander/queue/QueueTask.java index f8ba09fc1..a27dd62b8 100644 --- a/commander/src/main/java/com/iluwatar/commander/queue/QueueTask.java +++ b/commander/src/main/java/com/iluwatar/commander/queue/QueueTask.java @@ -39,8 +39,6 @@ public class QueueTask { Messaging, Payment, EmployeeDb } - ; - public Order order; public TaskType taskType; public int messageType; //0-fail, 1-error, 2-success @@ -69,7 +67,6 @@ public class QueueTask { * * @return String representing type of task */ - public String getType() { if (!this.taskType.equals(TaskType.Messaging)) { return this.taskType.toString(); diff --git a/commander/src/main/java/com/iluwatar/commander/shippingservice/ShippingDatabase.java b/commander/src/main/java/com/iluwatar/commander/shippingservice/ShippingDatabase.java index a45dd00e1..305122db2 100644 --- a/commander/src/main/java/com/iluwatar/commander/shippingservice/ShippingDatabase.java +++ b/commander/src/main/java/com/iluwatar/commander/shippingservice/ShippingDatabase.java @@ -37,15 +37,15 @@ public class ShippingDatabase extends Database { private Hashtable data; public ShippingDatabase() { - this.data = new Hashtable(); + this.data = new Hashtable<>(); } @Override - public ShippingRequest add(ShippingRequest r) throws DatabaseUnavailableException { + public ShippingRequest add(ShippingRequest r) { return data.put(r.transactionId, r); } - public ShippingRequest get(String trasnactionId) throws DatabaseUnavailableException { + public ShippingRequest get(String trasnactionId) { return data.get(trasnactionId); } diff --git a/commander/src/main/java/com/iluwatar/commander/shippingservice/ShippingService.java b/commander/src/main/java/com/iluwatar/commander/shippingservice/ShippingService.java index 6539316b1..250cfa807 100644 --- a/commander/src/main/java/com/iluwatar/commander/shippingservice/ShippingService.java +++ b/commander/src/main/java/com/iluwatar/commander/shippingservice/ShippingService.java @@ -27,13 +27,13 @@ import com.iluwatar.commander.Service; import com.iluwatar.commander.exceptions.DatabaseUnavailableException; /** - * ShippingService class receives request from {@link Commander} class and adds it to the {@link - * ShippingDatabase}. + * ShippingService class receives request from {@link com.iluwatar.commander.Commander} class and + * adds it to the {@link ShippingDatabase}. */ public class ShippingService extends Service { - class ShippingRequest { + static class ShippingRequest { String transactionId; String item; String address; @@ -50,18 +50,19 @@ public class ShippingService extends Service { } /** - * Public method which will receive request from {@link Commander}. + * Public method which will receive request from {@link com.iluwatar.commander.Commander}. */ public String receiveRequest(Object... parameters) throws DatabaseUnavailableException { - String id = generateId(); - ShippingRequest req = - new ShippingRequest(id, (String) parameters[0] /*item*/, (String) parameters[1]/*address*/); + var id = generateId(); + var item = (String) parameters[0]; + var address = (String) parameters[1]; + var req = new ShippingRequest(id, item, address); return updateDb(req); } protected String updateDb(Object... parameters) throws DatabaseUnavailableException { - ShippingRequest req = (ShippingRequest) parameters[0]; + var req = (ShippingRequest) parameters[0]; if (this.database.get(req.transactionId) == null) { database.add(req); return req.transactionId; diff --git a/commander/src/test/java/com/iluwatar/commander/RetryTest.java b/commander/src/test/java/com/iluwatar/commander/RetryTest.java index 749b2619c..e14bbbc6a 100644 --- a/commander/src/test/java/com/iluwatar/commander/RetryTest.java +++ b/commander/src/test/java/com/iluwatar/commander/RetryTest.java @@ -23,43 +23,38 @@ package com.iluwatar.commander; +import static org.junit.jupiter.api.Assertions.assertTrue; + import com.iluwatar.commander.exceptions.DatabaseUnavailableException; import com.iluwatar.commander.exceptions.ItemUnavailableException; -import org.junit.jupiter.api.Test; - import java.util.ArrayList; import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.Test; class RetryTest { @Test void performTest() { - Retry.Operation op = (l) -> { + Retry.Operation op = (l) -> { if (!l.isEmpty()) { throw l.remove(0); } - return; }; - Retry.HandleErrorIssue handleError = (o,e) -> { - return; + Retry.HandleErrorIssue handleError = (o, e) -> { }; - Retry r1 = new Retry<>(op, handleError, 3, 30000, + var r1 = new Retry<>(op, handleError, 3, 30000, e -> DatabaseUnavailableException.class.isAssignableFrom(e.getClass())); - Retry r2 = new Retry<>(op, handleError, 3, 30000, + var r2 = new Retry<>(op, handleError, 3, 30000, e -> DatabaseUnavailableException.class.isAssignableFrom(e.getClass())); - User user = new User("Jim", "ABCD"); - Order order = new Order(user, "book", 10f); - ArrayList arr1 = new ArrayList<>(List.of( - new ItemUnavailableException(), new DatabaseUnavailableException())); + var user = new User("Jim", "ABCD"); + var order = new Order(user, "book", 10f); + var arr1 = new ArrayList<>(List.of(new ItemUnavailableException(), new DatabaseUnavailableException())); try { r1.perform(arr1, order); } catch (Exception e1) { e1.printStackTrace(); } - ArrayList arr2 = new ArrayList<>(List.of( - new DatabaseUnavailableException(), new ItemUnavailableException())); + var arr2 = new ArrayList<>(List.of(new DatabaseUnavailableException(), new ItemUnavailableException())); try { r2.perform(arr2, order); } catch (Exception e1) { diff --git a/composite/src/main/java/com/iluwatar/composite/App.java b/composite/src/main/java/com/iluwatar/composite/App.java index 7389c7a96..48c9fe03e 100644 --- a/composite/src/main/java/com/iluwatar/composite/App.java +++ b/composite/src/main/java/com/iluwatar/composite/App.java @@ -49,12 +49,12 @@ public class App { public static void main(String[] args) { LOGGER.info("Message from the orcs: "); - LetterComposite orcMessage = new Messenger().messageFromOrcs(); + var orcMessage = new Messenger().messageFromOrcs(); orcMessage.print(); LOGGER.info("\nMessage from the elves: "); - LetterComposite elfMessage = new Messenger().messageFromElves(); + var elfMessage = new Messenger().messageFromElves(); elfMessage.print(); } } diff --git a/composite/src/main/java/com/iluwatar/composite/LetterComposite.java b/composite/src/main/java/com/iluwatar/composite/LetterComposite.java index 5d8af5435..25808c468 100644 --- a/composite/src/main/java/com/iluwatar/composite/LetterComposite.java +++ b/composite/src/main/java/com/iluwatar/composite/LetterComposite.java @@ -52,9 +52,7 @@ public abstract class LetterComposite { */ public void print() { printThisBefore(); - for (LetterComposite letter : children) { - letter.print(); - } + children.forEach(LetterComposite::print); printThisAfter(); } } diff --git a/composite/src/main/java/com/iluwatar/composite/Messenger.java b/composite/src/main/java/com/iluwatar/composite/Messenger.java index 55929e7ee..d57f32692 100644 --- a/composite/src/main/java/com/iluwatar/composite/Messenger.java +++ b/composite/src/main/java/com/iluwatar/composite/Messenger.java @@ -32,20 +32,17 @@ public class Messenger { LetterComposite messageFromOrcs() { - List words = List.of( - new Word(List.of(new Letter('W'), new Letter('h'), new Letter('e'), new Letter( - 'r'), new Letter('e'))), - new Word(List.of(new Letter('t'), new Letter('h'), new Letter('e'), new Letter( - 'r'), new Letter('e'))), - new Word(List.of(new Letter('i'), new Letter('s'))), - new Word(List.of(new Letter('a'))), - new Word(List.of(new Letter('w'), new Letter('h'), new Letter('i'), new Letter( - 'p'))), - new Word(List.of(new Letter('t'), new Letter('h'), new Letter('e'), new Letter( - 'r'), new Letter('e'))), - new Word(List.of(new Letter('i'), new Letter('s'))), - new Word(List.of(new Letter('a'))), - new Word(List.of(new Letter('w'), new Letter('a'), new Letter('y')))); + var words = List.of( + new Word('W', 'h', 'e', 'r', 'e'), + new Word('t', 'h', 'e', 'r', 'e'), + new Word('i', 's'), + new Word('a'), + new Word('w', 'h', 'i', 'p'), + new Word('t', 'h', 'e', 'r', 'e'), + new Word('i', 's'), + new Word('a'), + new Word('w', 'a', 'y') + ); return new Sentence(words); @@ -53,15 +50,14 @@ public class Messenger { LetterComposite messageFromElves() { - List words = List.of( - new Word(List.of(new Letter('M'), new Letter('u'), new Letter('c'), new Letter('h'))), - new Word(List.of(new Letter('w'), new Letter('i'), new Letter('n'), new Letter('d'))), - new Word(List.of(new Letter('p'), new Letter('o'), new Letter('u'), new Letter('r'), - new Letter('s'))), - new Word(List.of(new Letter('f'), new Letter('r'), new Letter('o'), new Letter('m'))), - new Word(List.of(new Letter('y'), new Letter('o'), new Letter('u'), new Letter('r'))), - new Word(List.of(new Letter('m'), new Letter('o'), new Letter('u'), new Letter('t'), - new Letter('h')))); + var words = List.of( + new Word('M', 'u', 'c', 'h'), + new Word('w', 'i', 'n', 'd'), + new Word('p', 'o', 'u', 'r', 's'), + new Word('f', 'r', 'o', 'm'), + new Word('y', 'o', 'u', 'r'), + new Word('m', 'o', 'u', 't', 'h') + ); return new Sentence(words); diff --git a/composite/src/main/java/com/iluwatar/composite/Sentence.java b/composite/src/main/java/com/iluwatar/composite/Sentence.java index c94ce84aa..b0c2adbcd 100644 --- a/composite/src/main/java/com/iluwatar/composite/Sentence.java +++ b/composite/src/main/java/com/iluwatar/composite/Sentence.java @@ -34,9 +34,7 @@ public class Sentence extends LetterComposite { * Constructor. */ public Sentence(List words) { - for (Word w : words) { - this.add(w); - } + words.forEach(this::add); } @Override diff --git a/composite/src/main/java/com/iluwatar/composite/Word.java b/composite/src/main/java/com/iluwatar/composite/Word.java index 353c363a2..933d38bde 100644 --- a/composite/src/main/java/com/iluwatar/composite/Word.java +++ b/composite/src/main/java/com/iluwatar/composite/Word.java @@ -34,8 +34,12 @@ public class Word extends LetterComposite { * Constructor. */ public Word(List letters) { - for (Letter l : letters) { - this.add(l); + letters.forEach(this::add); + } + + public Word(char... letters) { + for (char letter : letters) { + this.add(new Letter(letter)); } } diff --git a/composite/src/test/java/com/iluwatar/composite/AppTest.java b/composite/src/test/java/com/iluwatar/composite/AppTest.java index 603e2fb65..5eb8c35c7 100644 --- a/composite/src/test/java/com/iluwatar/composite/AppTest.java +++ b/composite/src/test/java/com/iluwatar/composite/AppTest.java @@ -26,15 +26,12 @@ package com.iluwatar.composite; import org.junit.jupiter.api.Test; /** - * * Application test - * */ public class AppTest { @Test public void test() { - String[] args = {}; - App.main(args); + App.main(new String[]{}); } } diff --git a/composite/src/test/java/com/iluwatar/composite/MessengerTest.java b/composite/src/test/java/com/iluwatar/composite/MessengerTest.java index a6216712f..169e18508 100644 --- a/composite/src/test/java/com/iluwatar/composite/MessengerTest.java +++ b/composite/src/test/java/com/iluwatar/composite/MessengerTest.java @@ -72,7 +72,7 @@ public class MessengerTest { */ @Test public void testMessageFromOrcs() { - final Messenger messenger = new Messenger(); + final var messenger = new Messenger(); testMessage( messenger.messageFromOrcs(), "Where there is a whip there is a way." @@ -84,7 +84,7 @@ public class MessengerTest { */ @Test public void testMessageFromElves() { - final Messenger messenger = new Messenger(); + final var messenger = new Messenger(); testMessage( messenger.messageFromElves(), "Much wind pours from your mouth." @@ -99,7 +99,7 @@ public class MessengerTest { */ private void testMessage(final LetterComposite composedMessage, final String message) { // Test is the composed message has the correct number of words - final String[] words = message.split(" "); + final var words = message.split(" "); assertNotNull(composedMessage); assertEquals(words.length, composedMessage.count());