diff --git a/saga/src/main/java/com/iluwatar/saga/choreography/ChoreographyChapter.java b/saga/src/main/java/com/iluwatar/saga/choreography/ChoreographyChapter.java index c79a77a9ac4666964c8e539bf253e3a841de8cf5..cfb22441d1b3bb5a1ea7b16d0c78ebb47c01d03c 100644 --- a/saga/src/main/java/com/iluwatar/saga/choreography/ChoreographyChapter.java +++ b/saga/src/main/java/com/iluwatar/saga/choreography/ChoreographyChapter.java @@ -25,9 +25,9 @@ package com.iluwatar.saga.choreography; /** - * ChoreographyChapter is an interface representing a contract for an external service. - * In that case, a service needs to make a decision what to do further - * hence the server needs to get all context representing {@link Saga} + * ChoreographyChapter is an interface representing a contract for an external service. In that + * case, a service needs to make a decision what to do further hence the server needs to get all + * context representing {@link Saga} */ public interface ChoreographyChapter { @@ -41,6 +41,7 @@ public interface ChoreographyChapter { /** * get name method. + * * @return service name. */ String getName(); diff --git a/saga/src/main/java/com/iluwatar/saga/choreography/Saga.java b/saga/src/main/java/com/iluwatar/saga/choreography/Saga.java index b591adaf278abcefe50fafa74ed63fed7455d6ee..818b59a1448cd0e90bd5bf5ec6274970aaea31ac 100644 --- a/saga/src/main/java/com/iluwatar/saga/choreography/Saga.java +++ b/saga/src/main/java/com/iluwatar/saga/choreography/Saga.java @@ -28,9 +28,8 @@ import java.util.Arrays; import java.util.List; /** - * Saga representation. - * Saga consists of chapters. - * Every ChoreographyChapter is executed a certain service. + * Saga representation. Saga consists of chapters. Every ChoreographyChapter is executed a certain + * service. */ public class Saga { @@ -61,6 +60,7 @@ public class Saga { /** * add chapter to saga. + * * @param name chapter name * @return this */ @@ -71,6 +71,7 @@ public class Saga { /** * set value to last chapter. + * * @param value invalue * @return this */ @@ -84,6 +85,7 @@ public class Saga { /** * get value from current chapter. + * * @return value */ public Object getCurrentValue() { @@ -92,6 +94,7 @@ public class Saga { /** * set value to current chapter. + * * @param value to set */ public void setCurrentValue(Object value) { @@ -100,6 +103,7 @@ public class Saga { /** * set status for current chapter. + * * @param result to set */ public void setCurrentStatus(ChapterResult result) { @@ -145,8 +149,8 @@ public class Saga { } /** - * Class presents a chapter status and incoming - * parameters(incoming parameter transforms to outcoming parameter). + * Class presents a chapter status and incoming parameters(incoming parameter transforms to + * outcoming parameter). */ public static class Chapter { private String name; @@ -173,6 +177,7 @@ public class Saga { /** * set result. + * * @param result {@link ChapterResult} */ public void setResult(ChapterResult result) { @@ -181,6 +186,7 @@ public class Saga { /** * the result for chapter is good. + * * @return true if is good otherwise bad */ public boolean isSuccess() { diff --git a/saga/src/main/java/com/iluwatar/saga/choreography/SagaApplication.java b/saga/src/main/java/com/iluwatar/saga/choreography/SagaApplication.java index d8844c864ae4e93b58b41d8206fffd511e93d2e7..858aa76d79a64fc3bfe12c533f309607505df8e2 100644 --- a/saga/src/main/java/com/iluwatar/saga/choreography/SagaApplication.java +++ b/saga/src/main/java/com/iluwatar/saga/choreography/SagaApplication.java @@ -27,22 +27,19 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * This pattern is used in distributed services to perform a group of operations atomically. - * This is an analog of transaction in a database but in terms - * of microservices architecture this is executed - * in a distributed environment + * This pattern is used in distributed services to perform a group of operations atomically. This is + * an analog of transaction in a database but in terms of microservices architecture this is + * executed in a distributed environment * *

A saga is a sequence of local transactions in a certain context. - * If one transaction fails for some reason, - * the saga executes compensating transactions(rollbacks) + * If one transaction fails for some reason, the saga executes compensating transactions(rollbacks) * to undo the impact of the preceding transactions. * *

In this approach, there are no mediators or orchestrators services. * All chapters are handled and moved by services manually. * *

The major difference with choreography saga is an ability to handle crashed services - * (otherwise in choreography services very hard to prevent a saga - * if one of them has been crashed) + * (otherwise in choreography services very hard to prevent a saga if one of them has been crashed) * * @see com.iluwatar.saga.choreography.Saga * @see Service @@ -54,10 +51,10 @@ public class SagaApplication { * main method. */ public static void main(String[] args) { - ServiceDiscoveryService sd = serviceDiscovery(); - ChoreographyChapter service = sd.findAny(); - Saga goodOrderSaga = service.execute(newSaga("good_order")); - Saga badOrderSaga = service.execute(newSaga("bad_order")); + var sd = serviceDiscovery(); + var service = sd.findAny(); + var goodOrderSaga = service.execute(newSaga("good_order")); + var badOrderSaga = service.execute(newSaga("bad_order")); LOGGER.info("orders: goodOrder is {}, badOrder is {}", goodOrderSaga.getResult(), badOrderSaga.getResult()); @@ -74,7 +71,7 @@ public class SagaApplication { } private static ServiceDiscoveryService serviceDiscovery() { - ServiceDiscoveryService sd = new ServiceDiscoveryService(); + var sd = new ServiceDiscoveryService(); return sd .discover(new OrderService(sd)) .discover(new FlyBookingService(sd)) diff --git a/saga/src/main/java/com/iluwatar/saga/choreography/Service.java b/saga/src/main/java/com/iluwatar/saga/choreography/Service.java index 2e932b5288c0b9602f32c3adbd49898af2b7d608..da447c528a31d2a39e19099ff6bbff3e64fac06e 100644 --- a/saga/src/main/java/com/iluwatar/saga/choreography/Service.java +++ b/saga/src/main/java/com/iluwatar/saga/choreography/Service.java @@ -29,8 +29,8 @@ import org.slf4j.LoggerFactory; /** - * Common abstraction class representing services. - * implementing a general contract @see {@link ChoreographyChapter} + * Common abstraction class representing services. implementing a general contract @see {@link + * ChoreographyChapter} */ public abstract class Service implements ChoreographyChapter { protected static final Logger LOGGER = LoggerFactory.getLogger(Service.class); @@ -43,9 +43,9 @@ public abstract class Service implements ChoreographyChapter { @Override public Saga execute(Saga saga) { - Saga nextSaga = saga; + var nextSaga = saga; Object nextVal; - String chapterName = saga.getCurrent().getName(); + var chapterName = saga.getCurrent().getName(); if (chapterName.equals(getName())) { if (saga.isForward()) { nextSaga = process(saga); @@ -67,7 +67,7 @@ public abstract class Service implements ChoreographyChapter { nextSaga.setCurrentValue(nextVal); } - Saga finalNextSaga = nextSaga; + var finalNextSaga = nextSaga; return sd.find(chapterName).map(ch -> ch.execute(finalNextSaga)) .orElseThrow(serviceNotFoundException(chapterName)); @@ -80,7 +80,7 @@ public abstract class Service implements ChoreographyChapter { @Override public Saga process(Saga saga) { - Object inValue = saga.getCurrentValue(); + var inValue = saga.getCurrentValue(); LOGGER.info("The chapter '{}' has been started. " + "The data {} has been stored or calculated successfully", getName(), inValue); @@ -91,7 +91,7 @@ public abstract class Service implements ChoreographyChapter { @Override public Saga rollback(Saga saga) { - Object inValue = saga.getCurrentValue(); + var inValue = saga.getCurrentValue(); LOGGER.info("The Rollback for a chapter '{}' has been started. " + "The data {} has been rollbacked successfully", getName(), inValue); diff --git a/saga/src/main/java/com/iluwatar/saga/choreography/WithdrawMoneyService.java b/saga/src/main/java/com/iluwatar/saga/choreography/WithdrawMoneyService.java index 637e8ac1bbf4d21c8c96b669220643161c793312..d0fd02390d60e9954fb6331779db84685f53cafd 100644 --- a/saga/src/main/java/com/iluwatar/saga/choreography/WithdrawMoneyService.java +++ b/saga/src/main/java/com/iluwatar/saga/choreography/WithdrawMoneyService.java @@ -39,7 +39,7 @@ public class WithdrawMoneyService extends Service { @Override public Saga process(Saga saga) { - Object inValue = saga.getCurrentValue(); + var inValue = saga.getCurrentValue(); if (inValue.equals("bad_order")) { LOGGER.info("The chapter '{}' has been started. But the exception has been raised." diff --git a/saga/src/main/java/com/iluwatar/saga/orchestration/OrchestrationChapter.java b/saga/src/main/java/com/iluwatar/saga/orchestration/OrchestrationChapter.java index 7e9e3581f54d014e50a0e0650a17cb7b0f027892..667dea90496426f61327da0669521eaf89ee8d7f 100644 --- a/saga/src/main/java/com/iluwatar/saga/orchestration/OrchestrationChapter.java +++ b/saga/src/main/java/com/iluwatar/saga/orchestration/OrchestrationChapter.java @@ -32,6 +32,7 @@ public interface OrchestrationChapter { /** * method get name. + * * @return service name. */ String getName(); diff --git a/saga/src/main/java/com/iluwatar/saga/orchestration/Saga.java b/saga/src/main/java/com/iluwatar/saga/orchestration/Saga.java index 0d53362aa8e24e5c2d0000b1fe7ccf59879b1bed..aff3593f17e47e5019a73751424deddf5475ed42 100644 --- a/saga/src/main/java/com/iluwatar/saga/orchestration/Saga.java +++ b/saga/src/main/java/com/iluwatar/saga/orchestration/Saga.java @@ -27,9 +27,8 @@ import java.util.ArrayList; import java.util.List; /** - * Saga representation. - * Saga consists of chapters. - * Every ChoreographyChapter is executed by a certain service. + * Saga representation. Saga consists of chapters. Every ChoreographyChapter is executed by a + * certain service. */ public class Saga { diff --git a/saga/src/main/java/com/iluwatar/saga/orchestration/SagaApplication.java b/saga/src/main/java/com/iluwatar/saga/orchestration/SagaApplication.java index 830f5e653ccea9a2b8714927273c8b2df8381d3a..201a526f9f55fd081984eec826d1e36a314fe1b1 100644 --- a/saga/src/main/java/com/iluwatar/saga/orchestration/SagaApplication.java +++ b/saga/src/main/java/com/iluwatar/saga/orchestration/SagaApplication.java @@ -27,23 +27,19 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * This pattern is used in distributed services to perform - * a group of operations atomically. - * This is an analog of transaction in a database but in terms - * of microservices architecture this is executed - * in a distributed environment + * This pattern is used in distributed services to perform a group of operations atomically. This is + * an analog of transaction in a database but in terms of microservices architecture this is + * executed in a distributed environment * *

A saga is a sequence of local transactions in a certain context. - * If one transaction fails for some reason, - * the saga executes compensating transactions(rollbacks) + * If one transaction fails for some reason, the saga executes compensating transactions(rollbacks) * to undo the impact of the preceding transactions. * *

In this approach, there is an orchestrator @see {@link SagaOrchestrator} - * that manages all the transactions and directs - * the participant services to execute local transactions based on events. - * The major difference with choreography saga is an ability to handle crashed services - * (otherwise in choreography services very hard to prevent a saga - * if one of them has been crashed) + * that manages all the transactions and directs the participant services to execute local + * transactions based on events. The major difference with choreography saga is an ability to handle + * crashed services (otherwise in choreography services very hard to prevent a saga if one of them + * has been crashed) * * @see Saga * @see SagaOrchestrator @@ -56,7 +52,7 @@ public class SagaApplication { * method to show common saga logic. */ public static void main(String[] args) { - SagaOrchestrator sagaOrchestrator = new SagaOrchestrator(newSaga(), serviceDiscovery()); + var sagaOrchestrator = new SagaOrchestrator(newSaga(), serviceDiscovery()); Saga.Result goodOrder = sagaOrchestrator.execute("good_order"); Saga.Result badOrder = sagaOrchestrator.execute("bad_order"); @@ -77,11 +73,10 @@ public class SagaApplication { } private static ServiceDiscoveryService serviceDiscovery() { - return - new ServiceDiscoveryService() - .discover(new OrderService()) - .discover(new FlyBookingService()) - .discover(new HotelBookingService()) - .discover(new WithdrawMoneyService()); + return new ServiceDiscoveryService() + .discover(new OrderService()) + .discover(new FlyBookingService()) + .discover(new HotelBookingService()) + .discover(new WithdrawMoneyService()); } } diff --git a/saga/src/main/java/com/iluwatar/saga/orchestration/SagaOrchestrator.java b/saga/src/main/java/com/iluwatar/saga/orchestration/SagaOrchestrator.java index beec3765553491819fb6d9b7bce5cfd202c8e96d..d4df6fa07c7acde61fa7d25602faf2293405c365 100644 --- a/saga/src/main/java/com/iluwatar/saga/orchestration/SagaOrchestrator.java +++ b/saga/src/main/java/com/iluwatar/saga/orchestration/SagaOrchestrator.java @@ -23,18 +23,18 @@ package com.iluwatar.saga.orchestration; +import static com.iluwatar.saga.orchestration.Saga.Result; import static com.iluwatar.saga.orchestration.Saga.Result.CRASHED; import static com.iluwatar.saga.orchestration.Saga.Result.FINISHED; import static com.iluwatar.saga.orchestration.Saga.Result.ROLLBACK; -import java.util.Optional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * The orchestrator that manages all the transactions and directs - * the participant services to execute local transactions based on events. + * The orchestrator that manages all the transactions and directs the participant services to + * execute local transactions based on events. */ public class SagaOrchestrator { private static final Logger LOGGER = LoggerFactory.getLogger(SagaOrchestrator.class); @@ -45,8 +45,9 @@ public class SagaOrchestrator { /** * Create a new service to orchetrate sagas. + * * @param saga saga to process - * @param sd service discovery @see {@link ServiceDiscoveryService} + * @param sd service discovery @see {@link ServiceDiscoveryService} */ public SagaOrchestrator(Saga saga, ServiceDiscoveryService sd) { this.saga = saga; @@ -59,30 +60,30 @@ public class SagaOrchestrator { * * @param value incoming value * @param type for incoming value - * @return result @see {@link Saga.Result} + * @return result @see {@link Result} */ @SuppressWarnings("unchecked") - public Saga.Result execute(K value) { + public Result execute(K value) { state.cleanUp(); LOGGER.info(" The new saga is about to start"); - Saga.Result result = FINISHED; + var result = FINISHED; K tempVal = value; while (true) { - int next = state.current(); - Saga.Chapter ch = saga.get(next); - Optional srvOpt = sd.find(ch.name); + var next = state.current(); + var ch = saga.get(next); + var srvOpt = sd.find(ch.name); - if (!srvOpt.isPresent()) { + if (srvOpt.isEmpty()) { state.directionToBack(); state.back(); continue; } - OrchestrationChapter srv = srvOpt.get(); + var srv = srvOpt.get(); if (state.isForward()) { - ChapterResult processRes = srv.process(tempVal); + var processRes = srv.process(tempVal); if (processRes.isSuccess()) { next = state.forward(); tempVal = (K) processRes.getValue(); @@ -90,7 +91,7 @@ public class SagaOrchestrator { state.directionToBack(); } } else { - ChapterResult rlRes = srv.rollback(tempVal); + var rlRes = srv.rollback(tempVal); if (rlRes.isSuccess()) { next = state.back(); tempVal = (K) rlRes.getValue(); diff --git a/saga/src/main/java/com/iluwatar/saga/orchestration/Service.java b/saga/src/main/java/com/iluwatar/saga/orchestration/Service.java index d2b0652015c1c65da15f4bf1664769698d6d0bed..eb2fc04823bc4488b7fecf32db3fd1837447ce2d 100644 --- a/saga/src/main/java/com/iluwatar/saga/orchestration/Service.java +++ b/saga/src/main/java/com/iluwatar/saga/orchestration/Service.java @@ -27,8 +27,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * Common abstraction class representing services. - * implementing a general contract @see {@link OrchestrationChapter} + * Common abstraction class representing services. implementing a general contract @see {@link + * OrchestrationChapter} * * @param type of incoming param */ diff --git a/saga/src/test/java/com/iluwatar/saga/choreography/SagaChoreographyTest.java b/saga/src/test/java/com/iluwatar/saga/choreography/SagaChoreographyTest.java index 4300d4057780a784ca427d56749f0537501d5740..5ae9df19ddd5dabd2f17c6477f4fba1e27985215 100644 --- a/saga/src/test/java/com/iluwatar/saga/choreography/SagaChoreographyTest.java +++ b/saga/src/test/java/com/iluwatar/saga/choreography/SagaChoreographyTest.java @@ -33,10 +33,10 @@ public class SagaChoreographyTest { @Test public void executeTest() { - ServiceDiscoveryService sd = serviceDiscovery(); - ChoreographyChapter service = sd.findAny(); - Saga badOrderSaga = service.execute(newSaga("bad_order")); - Saga goodOrderSaga = service.execute(newSaga("good_order")); + var sd = serviceDiscovery(); + var service = sd.findAny(); + var badOrderSaga = service.execute(newSaga("bad_order")); + var goodOrderSaga = service.execute(newSaga("good_order")); Assert.assertEquals(badOrderSaga.getResult(), Saga.SagaResult.ROLLBACKED); Assert.assertEquals(goodOrderSaga.getResult(), Saga.SagaResult.FINISHED); @@ -52,7 +52,7 @@ public class SagaChoreographyTest { } private static ServiceDiscoveryService serviceDiscovery() { - ServiceDiscoveryService sd = new ServiceDiscoveryService(); + var sd = new ServiceDiscoveryService(); return sd .discover(new OrderService(sd)) .discover(new FlyBookingService(sd)) diff --git a/saga/src/test/java/com/iluwatar/saga/orchestration/SagaApplicationTest.java b/saga/src/test/java/com/iluwatar/saga/orchestration/SagaApplicationTest.java index aa3c8773f46aab09e9d6a5957a09d4d77e6d996e..aa4f4ff7dcae3faa69f2e3f0080bd6f03897172b 100644 --- a/saga/src/test/java/com/iluwatar/saga/orchestration/SagaApplicationTest.java +++ b/saga/src/test/java/com/iluwatar/saga/orchestration/SagaApplicationTest.java @@ -24,8 +24,6 @@ package com.iluwatar.saga.orchestration; import org.junit.Test; -import static org.junit.Assert.*; - /** * empty test */ diff --git a/saga/src/test/java/com/iluwatar/saga/orchestration/SagaOrchestratorInternallyTest.java b/saga/src/test/java/com/iluwatar/saga/orchestration/SagaOrchestratorInternallyTest.java index a93bf5280cb671d86982898886d2af22f060f881..423b8e12ee0f539d43f39eb954a00ae5c0abd26c 100644 --- a/saga/src/test/java/com/iluwatar/saga/orchestration/SagaOrchestratorInternallyTest.java +++ b/saga/src/test/java/com/iluwatar/saga/orchestration/SagaOrchestratorInternallyTest.java @@ -22,11 +22,12 @@ */ package com.iluwatar.saga.orchestration; -import org.junit.Assert; -import org.junit.Test; +import static com.iluwatar.saga.orchestration.Saga.Result; import java.util.ArrayList; import java.util.List; +import org.junit.Assert; +import org.junit.Test; /** * test to test orchestration logic @@ -37,17 +38,16 @@ public class SagaOrchestratorInternallyTest { @Test public void executeTest() { - SagaOrchestrator sagaOrchestrator = new SagaOrchestrator(newSaga(), serviceDiscovery()); - Saga.Result result = sagaOrchestrator.execute(1); - Assert.assertEquals(result, Saga.Result.ROLLBACK); + var sagaOrchestrator = new SagaOrchestrator(newSaga(), serviceDiscovery()); + var result = sagaOrchestrator.execute(1); + Assert.assertEquals(result, Result.ROLLBACK); Assert.assertArrayEquals( records.toArray(new String[]{}), new String[]{"+1", "+2", "+3", "+4", "-4", "-3", "-2", "-1"}); } private static Saga newSaga() { - return Saga - .create() + return Saga.create() .chapter("1") .chapter("2") .chapter("3") @@ -55,12 +55,11 @@ public class SagaOrchestratorInternallyTest { } private ServiceDiscoveryService serviceDiscovery() { - return - new ServiceDiscoveryService() - .discover(new Service1()) - .discover(new Service2()) - .discover(new Service3()) - .discover(new Service4()); + return new ServiceDiscoveryService() + .discover(new Service1()) + .discover(new Service2()) + .discover(new Service3()) + .discover(new Service4()); } class Service1 extends Service { diff --git a/semaphore/src/main/java/com/iluwatar/semaphore/App.java b/semaphore/src/main/java/com/iluwatar/semaphore/App.java index ccf3dc4ab122b0e9a5b3f492f252fd7ca1b447bd..ebb35037f49f2946b809d449031b9b503a0cb8a1 100644 --- a/semaphore/src/main/java/com/iluwatar/semaphore/App.java +++ b/semaphore/src/main/java/com/iluwatar/semaphore/App.java @@ -38,7 +38,7 @@ public class App { * main method. */ public static void main(String[] args) { - FruitShop shop = new FruitShop(); + var shop = new FruitShop(); new Customer("Peter", shop).start(); new Customer("Paul", shop).start(); new Customer("Mary", shop).start(); diff --git a/semaphore/src/main/java/com/iluwatar/semaphore/Customer.java b/semaphore/src/main/java/com/iluwatar/semaphore/Customer.java index 97c9cf0e05bd559b9236e97894a7373b6275725b..47f503a069822964705ea38d88babf7063a66201 100644 --- a/semaphore/src/main/java/com/iluwatar/semaphore/Customer.java +++ b/semaphore/src/main/java/com/iluwatar/semaphore/Customer.java @@ -64,13 +64,14 @@ public class Customer extends Thread { public void run() { while (fruitShop.countFruit() > 0) { - FruitBowl bowl = fruitShop.takeBowl(); - Fruit fruit; - - if (bowl != null && (fruit = bowl.take()) != null) { - LOGGER.info("{} took an {}", name, fruit); - fruitBowl.put(fruit); - fruitShop.returnBowl(bowl); + var bowl = fruitShop.takeBowl(); + if (bowl != null) { + var fruit = bowl.take(); + if (fruit != null) { + LOGGER.info("{} took an {}", name, fruit); + fruitBowl.put(fruit); + fruitShop.returnBowl(bowl); + } } } diff --git a/semaphore/src/main/java/com/iluwatar/semaphore/FruitBowl.java b/semaphore/src/main/java/com/iluwatar/semaphore/FruitBowl.java index 9089f9c73991e9299852b424cd44cac7d30aa006..6b43c8100012774f9d186c760ebbcc01f4bbf688 100644 --- a/semaphore/src/main/java/com/iluwatar/semaphore/FruitBowl.java +++ b/semaphore/src/main/java/com/iluwatar/semaphore/FruitBowl.java @@ -68,11 +68,11 @@ public class FruitBowl { * toString method. */ public String toString() { - int apples = 0; - int oranges = 0; - int lemons = 0; + var apples = 0; + var oranges = 0; + var lemons = 0; - for (Fruit f : fruit) { + for (var f : fruit) { switch (f.getType()) { case APPLE: apples++; diff --git a/semaphore/src/main/java/com/iluwatar/semaphore/FruitShop.java b/semaphore/src/main/java/com/iluwatar/semaphore/FruitShop.java index ba826fb0970d70600addc5dba63069ae24dda1ba..a360f955c0fd22476efd52a032cad2dbb3f4e118 100644 --- a/semaphore/src/main/java/com/iluwatar/semaphore/FruitShop.java +++ b/semaphore/src/main/java/com/iluwatar/semaphore/FruitShop.java @@ -55,7 +55,7 @@ public class FruitShop { * FruitShop constructor. */ public FruitShop() { - for (int i = 0; i < 100; i++) { + for (var i = 0; i < 100; i++) { bowls[0].put(new Fruit(Fruit.FruitType.APPLE)); bowls[1].put(new Fruit(Fruit.FruitType.ORANGE)); bowls[2].put(new Fruit(Fruit.FruitType.LEMON)); diff --git a/semaphore/src/test/java/com/iluwatar/semaphore/AppTest.java b/semaphore/src/test/java/com/iluwatar/semaphore/AppTest.java index 087ab78758b21042f5f7300a52b6f58833c65077..f450c0593035e0bb2193497a50bd36d183b737a9 100644 --- a/semaphore/src/test/java/com/iluwatar/semaphore/AppTest.java +++ b/semaphore/src/test/java/com/iluwatar/semaphore/AppTest.java @@ -25,15 +25,12 @@ package com.iluwatar.semaphore; import org.junit.jupiter.api.Test; -import java.io.IOException; - /** * Application Test Entrypoint */ public class AppTest { @Test public void test() { - String[] args = {}; - App.main(args); + App.main(new String[]{}); } } diff --git a/semaphore/src/test/java/com/iluwatar/semaphore/FruitBowlTest.java b/semaphore/src/test/java/com/iluwatar/semaphore/FruitBowlTest.java index 5cab7d64d9a1e80f80bffa618850fa133c41a466..bc21f91960dc79cf892403133e1ca6d68af8e4ed 100644 --- a/semaphore/src/test/java/com/iluwatar/semaphore/FruitBowlTest.java +++ b/semaphore/src/test/java/com/iluwatar/semaphore/FruitBowlTest.java @@ -23,12 +23,12 @@ package com.iluwatar.semaphore; -import org.junit.jupiter.api.Test; - import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; +import org.junit.jupiter.api.Test; + /** * Test taking from and putting Fruit into a FruitBowl */ @@ -36,16 +36,16 @@ public class FruitBowlTest { @Test public void fruitBowlTest() { - FruitBowl fbowl = new FruitBowl(); - + var fbowl = new FruitBowl(); + assertEquals(0, fbowl.countFruit()); - - for (int i = 1; i <= 10; i++) { + + for (var i = 1; i <= 10; i++) { fbowl.put(new Fruit(Fruit.FruitType.LEMON)); assertEquals(i, fbowl.countFruit()); } - for (int i = 9; i >= 0; i--) { + for (var i = 9; i >= 0; i--) { assertNotNull(fbowl.take()); assertEquals(i, fbowl.countFruit()); } diff --git a/semaphore/src/test/java/com/iluwatar/semaphore/SemaphoreTest.java b/semaphore/src/test/java/com/iluwatar/semaphore/SemaphoreTest.java index 76f68af1537e3489230e52c2b1f9b77873b48a76..6d64066fb5f778fe5a84363af79fa6ce7b0a6f71 100644 --- a/semaphore/src/test/java/com/iluwatar/semaphore/SemaphoreTest.java +++ b/semaphore/src/test/java/com/iluwatar/semaphore/SemaphoreTest.java @@ -23,11 +23,11 @@ package com.iluwatar.semaphore; -import org.junit.jupiter.api.Test; - import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; +import org.junit.jupiter.api.Test; + /** * Test case for acquiring and releasing a Semaphore */ @@ -35,11 +35,11 @@ public class SemaphoreTest { @Test public void acquireReleaseTest() { - Semaphore sphore = new Semaphore(3); + var sphore = new Semaphore(3); assertEquals(3, sphore.getAvailableLicenses()); - for (int i = 2; i >= 0; i--) { + for (var i = 2; i >= 0; i--) { try { sphore.acquire(); assertEquals(i, sphore.getAvailableLicenses()); @@ -47,8 +47,8 @@ public class SemaphoreTest { fail(e.toString()); } } - - for (int i = 1; i <= 3; i++) { + + for (var i = 1; i <= 3; i++) { sphore.release(); assertEquals(i, sphore.getAvailableLicenses()); } diff --git a/servant/src/main/java/com/iluwatar/servant/App.java b/servant/src/main/java/com/iluwatar/servant/App.java index fcebec5bf5324bf086f96d54e83c63843c857a28..b68cb9aee38d2d0656b97379180b783f290d3166 100644 --- a/servant/src/main/java/com/iluwatar/servant/App.java +++ b/servant/src/main/java/com/iluwatar/servant/App.java @@ -54,10 +54,10 @@ public class App { * Can add a List with enum Actions for variable scenarios. */ public static void scenario(Servant servant, int compliment) { - King k = new King(); - Queen q = new Queen(); + var k = new King(); + var q = new Queen(); - List guests = List.of(k, q); + var guests = List.of(k, q); // feed servant.feed(k); @@ -69,9 +69,7 @@ public class App { servant.giveCompliments(guests.get(compliment)); // outcome of the night - for (Royalty r : guests) { - r.changeMood(); - } + guests.forEach(Royalty::changeMood); // check your luck if (servant.checkIfYouWillBeHanged(guests)) { diff --git a/servant/src/main/java/com/iluwatar/servant/Servant.java b/servant/src/main/java/com/iluwatar/servant/Servant.java index 856f7806be631eefa1795103858705d24daabf13..57b6bc541ffa6348501abcb7a0ba271445db9f97 100644 --- a/servant/src/main/java/com/iluwatar/servant/Servant.java +++ b/servant/src/main/java/com/iluwatar/servant/Servant.java @@ -55,13 +55,6 @@ public class Servant { * Check if we will be hanged. */ public boolean checkIfYouWillBeHanged(List tableGuests) { - boolean anotherDay = true; - for (Royalty r : tableGuests) { - if (!r.getMood()) { - anotherDay = false; - } - } - - return anotherDay; + return tableGuests.stream().allMatch(Royalty::getMood); } } diff --git a/servant/src/test/java/com/iluwatar/servant/AppTest.java b/servant/src/test/java/com/iluwatar/servant/AppTest.java index ef37ff010477b4b413e47c89392c29a1fd251300..ab1e99e5560b0747b75cae6b191b7382469aba36 100644 --- a/servant/src/test/java/com/iluwatar/servant/AppTest.java +++ b/servant/src/test/java/com/iluwatar/servant/AppTest.java @@ -26,15 +26,12 @@ package com.iluwatar.servant; 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/servant/src/test/java/com/iluwatar/servant/KingTest.java b/servant/src/test/java/com/iluwatar/servant/KingTest.java index ed97ae7cfa00a6ed32d7e4b9c5f89ee21ae70e7f..6c4c76ccdaf30fd2e4ac1e5127a53364130ba04c 100644 --- a/servant/src/test/java/com/iluwatar/servant/KingTest.java +++ b/servant/src/test/java/com/iluwatar/servant/KingTest.java @@ -23,11 +23,11 @@ package com.iluwatar.servant; -import org.junit.jupiter.api.Test; - import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.Test; + /** * Date: 12/28/15 - 9:40 PM * @@ -37,14 +37,14 @@ public class KingTest { @Test public void testHungrySoberUncomplimentedKing() { - final King king = new King(); + final var king = new King(); king.changeMood(); assertFalse(king.getMood()); } @Test public void testFedSoberUncomplimentedKing() { - final King king = new King(); + final var king = new King(); king.getFed(); king.changeMood(); assertFalse(king.getMood()); @@ -52,7 +52,7 @@ public class KingTest { @Test public void testHungryDrunkUncomplimentedKing() { - final King king = new King(); + final var king = new King(); king.getDrink(); king.changeMood(); assertFalse(king.getMood()); @@ -60,7 +60,7 @@ public class KingTest { @Test public void testHungrySoberComplimentedKing() { - final King king = new King(); + final var king = new King(); king.receiveCompliments(); king.changeMood(); assertFalse(king.getMood()); @@ -68,7 +68,7 @@ public class KingTest { @Test public void testFedDrunkUncomplimentedKing() { - final King king = new King(); + final var king = new King(); king.getFed(); king.getDrink(); king.changeMood(); @@ -77,7 +77,7 @@ public class KingTest { @Test public void testFedSoberComplimentedKing() { - final King king = new King(); + final var king = new King(); king.getFed(); king.receiveCompliments(); king.changeMood(); @@ -86,7 +86,7 @@ public class KingTest { @Test public void testFedDrunkComplimentedKing() { - final King king = new King(); + final var king = new King(); king.getFed(); king.getDrink(); king.receiveCompliments(); diff --git a/servant/src/test/java/com/iluwatar/servant/QueenTest.java b/servant/src/test/java/com/iluwatar/servant/QueenTest.java index a82eec7767f49308ab0d5c34bf0d221befd0ede0..7af35185594b5394b468844083ac137cd49bd03a 100644 --- a/servant/src/test/java/com/iluwatar/servant/QueenTest.java +++ b/servant/src/test/java/com/iluwatar/servant/QueenTest.java @@ -24,11 +24,11 @@ package com.iluwatar.servant; -import org.junit.jupiter.api.Test; - import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.Test; + /** * Date: 12/28/15 - 9:52 PM * @@ -38,34 +38,34 @@ public class QueenTest { @Test public void testNotFlirtyUncomplemented() { - final Queen queen = new Queen(); + final var queen = new Queen(); queen.setFlirtiness(false); queen.changeMood(); assertFalse(queen.getMood()); } - + @Test public void testNotFlirtyComplemented() { - final Queen queen = new Queen(); + final var queen = new Queen(); queen.setFlirtiness(false); queen.receiveCompliments(); queen.changeMood(); assertFalse(queen.getMood()); } - + @Test public void testFlirtyUncomplemented() { - final Queen queen = new Queen(); + final var queen = new Queen(); queen.changeMood(); assertFalse(queen.getMood()); } - + @Test public void testFlirtyComplemented() { - final Queen queen = new Queen(); + final var queen = new Queen(); queen.receiveCompliments(); queen.changeMood(); assertTrue(queen.getMood()); } - + } \ No newline at end of file diff --git a/servant/src/test/java/com/iluwatar/servant/ServantTest.java b/servant/src/test/java/com/iluwatar/servant/ServantTest.java index 02b69559e62412a7659be19d6f7357a168d31668..5d8d5d9977b54b4ae35787b248272da2ac32044e 100644 --- a/servant/src/test/java/com/iluwatar/servant/ServantTest.java +++ b/servant/src/test/java/com/iluwatar/servant/ServantTest.java @@ -23,16 +23,15 @@ package com.iluwatar.servant; -import org.junit.jupiter.api.Test; - -import java.util.List; - import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; +import java.util.List; +import org.junit.jupiter.api.Test; + /** * Date: 12/28/15 - 10:02 PM * @@ -42,8 +41,8 @@ public class ServantTest { @Test public void testFeed() { - final Royalty royalty = mock(Royalty.class); - final Servant servant = new Servant("test"); + final var royalty = mock(Royalty.class); + final var servant = new Servant("test"); servant.feed(royalty); verify(royalty).getFed(); verifyNoMoreInteractions(royalty); @@ -51,8 +50,8 @@ public class ServantTest { @Test public void testGiveWine() { - final Royalty royalty = mock(Royalty.class); - final Servant servant = new Servant("test"); + final var royalty = mock(Royalty.class); + final var servant = new Servant("test"); servant.giveWine(royalty); verify(royalty).getDrink(); verifyNoMoreInteractions(royalty); @@ -60,8 +59,8 @@ public class ServantTest { @Test public void testGiveCompliments() { - final Royalty royalty = mock(Royalty.class); - final Servant servant = new Servant("test"); + final var royalty = mock(Royalty.class); + final var servant = new Servant("test"); servant.giveCompliments(royalty); verify(royalty).receiveCompliments(); verifyNoMoreInteractions(royalty); @@ -69,15 +68,15 @@ public class ServantTest { @Test public void testCheckIfYouWillBeHanged() { - final Royalty goodMoodRoyalty = mock(Royalty.class); + final var goodMoodRoyalty = mock(Royalty.class); when(goodMoodRoyalty.getMood()).thenReturn(true); - final Royalty badMoodRoyalty = mock(Royalty.class); + final var badMoodRoyalty = mock(Royalty.class); when(badMoodRoyalty.getMood()).thenReturn(true); - final List goodCompany = List.of(goodMoodRoyalty, goodMoodRoyalty, goodMoodRoyalty); + final var goodCompany = List.of(goodMoodRoyalty, goodMoodRoyalty, goodMoodRoyalty); - final List badCompany = List.of(goodMoodRoyalty, goodMoodRoyalty, badMoodRoyalty); + final var badCompany = List.of(goodMoodRoyalty, goodMoodRoyalty, badMoodRoyalty); assertTrue(new Servant("test").checkIfYouWillBeHanged(goodCompany)); assertTrue(new Servant("test").checkIfYouWillBeHanged(badCompany)); diff --git a/serverless/src/main/java/com/iluwatar/serverless/baas/api/AbstractDynamoDbHandler.java b/serverless/src/main/java/com/iluwatar/serverless/baas/api/AbstractDynamoDbHandler.java index 43465f529dd94c7849b13ab3836626cf158d8a45..a13893f70cb10cfad36591dfe76ff6138d59d477 100644 --- a/serverless/src/main/java/com/iluwatar/serverless/baas/api/AbstractDynamoDbHandler.java +++ b/serverless/src/main/java/com/iluwatar/serverless/baas/api/AbstractDynamoDbHandler.java @@ -24,14 +24,12 @@ package com.iluwatar.serverless.baas.api; import com.amazonaws.regions.Regions; -import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.Serializable; -import java.util.HashMap; import java.util.Map; /** @@ -50,7 +48,7 @@ public abstract class AbstractDynamoDbHandler { } private void initAmazonDynamoDb() { - AmazonDynamoDB amazonDynamoDb = AmazonDynamoDBClientBuilder + var amazonDynamoDb = AmazonDynamoDBClientBuilder .standard() .withRegion(Regions.US_EAST_1) .build(); @@ -71,10 +69,7 @@ public abstract class AbstractDynamoDbHandler { } protected Map headers() { - Map headers = new HashMap<>(); - headers.put("Content-Type", "application/json"); - - return headers; + return Map.of("Content-Type", "application/json"); } /** @@ -85,14 +80,11 @@ public abstract class AbstractDynamoDbHandler { * @return - api gateway proxy response */ protected APIGatewayProxyResponseEvent apiGatewayProxyResponseEvent(Integer statusCode, T body) { - APIGatewayProxyResponseEvent apiGatewayProxyResponseEvent = - new APIGatewayProxyResponseEvent().withHeaders(headers()); + var apiGatewayProxyResponseEvent = new APIGatewayProxyResponseEvent().withHeaders(headers()); try { apiGatewayProxyResponseEvent .withStatusCode(statusCode) - .withBody(getObjectMapper() - .writeValueAsString(body)); - + .withBody(getObjectMapper().writeValueAsString(body)); } catch (JsonProcessingException jsonProcessingException) { throw new RuntimeException(jsonProcessingException); } diff --git a/serverless/src/main/java/com/iluwatar/serverless/baas/api/FindPersonApiHandler.java b/serverless/src/main/java/com/iluwatar/serverless/baas/api/FindPersonApiHandler.java index 11066c74452173633567d3d025a3dbc71b766b6b..7190b04fe85ab85695f1fbf7fa4d38ce44fd60c1 100644 --- a/serverless/src/main/java/com/iluwatar/serverless/baas/api/FindPersonApiHandler.java +++ b/serverless/src/main/java/com/iluwatar/serverless/baas/api/FindPersonApiHandler.java @@ -28,7 +28,6 @@ import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent; import com.iluwatar.serverless.baas.model.Person; -import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,15 +41,15 @@ public class FindPersonApiHandler extends AbstractDynamoDbHandler private static final Integer SUCCESS_STATUS_CODE = 200; @Override - public APIGatewayProxyResponseEvent handleRequest( - APIGatewayProxyRequestEvent apiGatewayProxyRequestEvent, Context context) { - Map pathParameters = apiGatewayProxyRequestEvent.getPathParameters(); - pathParameters.keySet().stream().map(key -> key + "=" + pathParameters.get(key)) - .forEach(LOG::info); - - Person person = this.getDynamoDbMapper().load(Person.class, apiGatewayProxyRequestEvent - .getPathParameters().get("id")); - + public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent req, Context ctx) { + req.getPathParameters().forEach(FindPersonApiHandler::logKeyValue); + var id = req.getPathParameters().get("id"); + var person = this.getDynamoDbMapper().load(Person.class, id); return apiGatewayProxyResponseEvent(SUCCESS_STATUS_CODE, person); } + + private static void logKeyValue(String key, String value) { + LOG.info(key + "=" + value); + } + } diff --git a/serverless/src/main/java/com/iluwatar/serverless/baas/api/SavePersonApiHandler.java b/serverless/src/main/java/com/iluwatar/serverless/baas/api/SavePersonApiHandler.java index 0bc12185337378ce466dd66202bcb659fdd034c7..51c2df79143abefef665291070c84b695e29f69a 100644 --- a/serverless/src/main/java/com/iluwatar/serverless/baas/api/SavePersonApiHandler.java +++ b/serverless/src/main/java/com/iluwatar/serverless/baas/api/SavePersonApiHandler.java @@ -43,19 +43,15 @@ public class SavePersonApiHandler extends AbstractDynamoDbHandler private static final Integer BAD_REQUEST_STATUS_CODE = 400; @Override - public APIGatewayProxyResponseEvent handleRequest( - APIGatewayProxyRequestEvent apiGatewayProxyRequestEvent, Context context) { - APIGatewayProxyResponseEvent apiGatewayProxyResponseEvent; - Person person; + public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent req, Context ctx) { try { - person = getObjectMapper().readValue(apiGatewayProxyRequestEvent.getBody(), Person.class); + var objectMapper = getObjectMapper(); + var person = objectMapper.readValue(req.getBody(), Person.class); getDynamoDbMapper().save(person); - apiGatewayProxyResponseEvent = apiGatewayProxyResponseEvent(CREATED_STATUS_CODE, person); + return apiGatewayProxyResponseEvent(CREATED_STATUS_CODE, person); } catch (IOException ioException) { LOG.error("unable to parse body", ioException); - apiGatewayProxyResponseEvent = apiGatewayProxyResponseEvent(BAD_REQUEST_STATUS_CODE, null); + return apiGatewayProxyResponseEvent(BAD_REQUEST_STATUS_CODE, null); } - - return apiGatewayProxyResponseEvent; } } diff --git a/serverless/src/main/java/com/iluwatar/serverless/baas/model/Address.java b/serverless/src/main/java/com/iluwatar/serverless/baas/model/Address.java index 710cde531d766524ac8e4f3a11c7baed227f41d6..512f436fbc5496ad76a08ca85044681eb897a6b5 100644 --- a/serverless/src/main/java/com/iluwatar/serverless/baas/model/Address.java +++ b/serverless/src/main/java/com/iluwatar/serverless/baas/model/Address.java @@ -26,6 +26,7 @@ package com.iluwatar.serverless.baas.model; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBDocument; import java.io.Serializable; +import java.util.Objects; /** * Address class Created by dheeraj.mummarareddy on 3/4/18. @@ -96,30 +97,30 @@ public class Address implements Serializable { return false; } - Address address = (Address) o; + var address = (Address) o; - if (addressLineOne != null ? !addressLineOne.equals(address.addressLineOne) : - address.addressLineOne != null) { + if (!Objects.equals(addressLineOne, address.addressLineOne)) { return false; } - if (addressLineTwo != null ? !addressLineTwo.equals(address.addressLineTwo) : - address.addressLineTwo != null) { + if (!Objects.equals(addressLineTwo, address.addressLineTwo)) { return false; } - if (city != null ? !city.equals(address.city) : address.city != null) { + if (!Objects.equals(city, address.city)) { return false; } - if (state != null ? !state.equals(address.state) : address.state != null) { + + if (!Objects.equals(state, address.state)) { return false; } - return zipCode != null ? zipCode.equals(address.zipCode) : address.zipCode == null; + + return Objects.equals(zipCode, address.zipCode); } @Override public int hashCode() { - int result = addressLineOne != null ? addressLineOne.hashCode() : 0; + var result = addressLineOne != null ? addressLineOne.hashCode() : 0; result = 31 * result + (addressLineTwo != null ? addressLineTwo.hashCode() : 0); result = 31 * result + (city != null ? city.hashCode() : 0); result = 31 * result + (state != null ? state.hashCode() : 0); diff --git a/serverless/src/main/java/com/iluwatar/serverless/baas/model/Person.java b/serverless/src/main/java/com/iluwatar/serverless/baas/model/Person.java index 3c97aae11429c1860796ce9a774015a4f7800f7b..0fd9f158899d1e5ae18dd51638a720ba6e575785 100644 --- a/serverless/src/main/java/com/iluwatar/serverless/baas/model/Person.java +++ b/serverless/src/main/java/com/iluwatar/serverless/baas/model/Person.java @@ -29,6 +29,7 @@ import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable; import com.fasterxml.jackson.annotation.JsonProperty; import java.io.Serializable; +import java.util.Objects; /** * Person class Created by dheeraj.mummarareddy on 3/4/18. @@ -92,15 +93,15 @@ public class Person implements Serializable { Person person = (Person) o; - if (firstName != null ? !firstName.equals(person.firstName) : person.firstName != null) { + if (!Objects.equals(firstName, person.firstName)) { return false; } - if (lastName != null ? !lastName.equals(person.lastName) : person.lastName != null) { + if (!Objects.equals(lastName, person.lastName)) { return false; } - return address != null ? address.equals(person.address) : person.address == null; + return Objects.equals(address, person.address); } @Override diff --git a/serverless/src/main/java/com/iluwatar/serverless/faas/ApiGatewayResponse.java b/serverless/src/main/java/com/iluwatar/serverless/faas/ApiGatewayResponse.java index 94fe7b4f9a51b2608a00d708de9e9740334d994f..6f57d2e27980291f685f85a1a5c7e1939d7c3df6 100644 --- a/serverless/src/main/java/com/iluwatar/serverless/faas/ApiGatewayResponse.java +++ b/serverless/src/main/java/com/iluwatar/serverless/faas/ApiGatewayResponse.java @@ -30,10 +30,8 @@ import java.util.Map; /** * Api gateway response. - * - * @param serializable object */ -public class ApiGatewayResponse implements Serializable { +public class ApiGatewayResponse implements Serializable { private static final long serialVersionUID = 1181159426782844892L; @@ -50,8 +48,12 @@ public class ApiGatewayResponse implements Serializable * @param headers - response headers * @param isBase64Encoded - base64Encoded flag */ - public ApiGatewayResponse(Integer statusCode, String body, Map headers, - Boolean isBase64Encoded) { + public ApiGatewayResponse( + Integer statusCode, + String body, + Map headers, + Boolean isBase64Encoded + ) { this.statusCode = statusCode; this.body = body; this.headers = headers; diff --git a/serverless/src/main/java/com/iluwatar/serverless/faas/LambdaInfo.java b/serverless/src/main/java/com/iluwatar/serverless/faas/LambdaInfo.java index 7cb93ebf4a6bbd0acdfa38a1ea5f35adc1f0779f..aa2a86667bb6b2ce3b1badb6178c8a1ab8081cb3 100644 --- a/serverless/src/main/java/com/iluwatar/serverless/faas/LambdaInfo.java +++ b/serverless/src/main/java/com/iluwatar/serverless/faas/LambdaInfo.java @@ -24,6 +24,7 @@ package com.iluwatar.serverless.faas; import java.io.Serializable; +import java.util.Objects; /** * Lambda context information. @@ -110,28 +111,22 @@ public class LambdaInfo implements Serializable { LambdaInfo that = (LambdaInfo) o; - if (awsRequestId != null ? !awsRequestId - .equals(that.awsRequestId) : that.awsRequestId != null) { + if (!Objects.equals(awsRequestId, that.awsRequestId)) { return false; } - if (logGroupName != null ? !logGroupName - .equals(that.logGroupName) : that.logGroupName != null) { + if (!Objects.equals(logGroupName, that.logGroupName)) { return false; } - if (logStreamName != null ? !logStreamName - .equals(that.logStreamName) : that.logStreamName != null) { + if (!Objects.equals(logStreamName, that.logStreamName)) { return false; } - if (functionName != null ? !functionName - .equals(that.functionName) : that.functionName != null) { + if (!Objects.equals(functionName, that.functionName)) { return false; } - if (functionVersion != null ? !functionVersion - .equals(that.functionVersion) : that.functionVersion != null) { + if (!Objects.equals(functionVersion, that.functionVersion)) { return false; } - return memoryLimitInMb != null ? memoryLimitInMb - .equals(that.memoryLimitInMb) : that.memoryLimitInMb == null; + return Objects.equals(memoryLimitInMb, that.memoryLimitInMb); } @Override diff --git a/serverless/src/main/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandler.java b/serverless/src/main/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandler.java index a16358a54328f89700df17cd28fba2a77d10086e..7fdb8ad38f2addfbe7b871580c2c0ba0c25036f9 100644 --- a/serverless/src/main/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandler.java +++ b/serverless/src/main/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandler.java @@ -27,7 +27,6 @@ import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.iluwatar.serverless.faas.ApiGatewayResponse; import com.iluwatar.serverless.faas.LambdaInfo; -import java.util.HashMap; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,13 +45,11 @@ public class LambdaInfoApiHandler public ApiGatewayResponse handleRequest(Map input, Context context) { LOG.info("received: " + input); - return new ApiGatewayResponse - .ApiGatewayResponseBuilder() + return new ApiGatewayResponse.ApiGatewayResponseBuilder() .headers(headers()) .statusCode(SUCCESS_STATUS_CODE) .body(lambdaInfo(context)) .build(); - } /** @@ -69,14 +66,10 @@ public class LambdaInfoApiHandler lambdaInfo.setLogGroupName(context.getLogGroupName()); lambdaInfo.setLogStreamName(context.getLogStreamName()); lambdaInfo.setMemoryLimitInMb(context.getMemoryLimitInMB()); - return lambdaInfo; } private Map headers() { - var headers = new HashMap(); - headers.put("Content-Type", "application/json"); - - return headers; + return Map.of("Content-Type", "application/json"); } } diff --git a/serverless/src/test/java/com/iluwatar/serverless/baas/api/FindPersonApiHandlerTest.java b/serverless/src/test/java/com/iluwatar/serverless/baas/api/FindPersonApiHandlerTest.java index a688bdf9d0ac73504ec130fe03306c50bd911f5c..19d0cab23403818885e505a711e0796647e7143f 100644 --- a/serverless/src/test/java/com/iluwatar/serverless/baas/api/FindPersonApiHandlerTest.java +++ b/serverless/src/test/java/com/iluwatar/serverless/baas/api/FindPersonApiHandlerTest.java @@ -23,27 +23,23 @@ package com.iluwatar.serverless.baas.api; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; -import com.iluwatar.serverless.baas.api.FindPersonApiHandler; -import com.iluwatar.serverless.baas.api.SavePersonApiHandler; import com.iluwatar.serverless.baas.model.Person; +import java.util.Map; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import java.util.Collections; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - /** - * Unit tests for FindPersonApiHandler - * Created by dheeraj.mummar on 3/5/18. + * Unit tests for FindPersonApiHandler Created by dheeraj.mummar on 3/5/18. */ @RunWith(MockitoJUnitRunner.class) public class FindPersonApiHandlerTest { @@ -66,8 +62,7 @@ public class FindPersonApiHandlerTest { } private APIGatewayProxyRequestEvent apiGatewayProxyRequestEvent() { - return new APIGatewayProxyRequestEvent() - .withPathParamters(Collections - .singletonMap("id", "37e7a1fe-3544-473d-b764-18128f02d72d")); + var request = new APIGatewayProxyRequestEvent(); + return request.withPathParamters(Map.of("id", "37e7a1fe-3544-473d-b764-18128f02d72d")); } } diff --git a/serverless/src/test/java/com/iluwatar/serverless/baas/api/SavePersonApiHandlerTest.java b/serverless/src/test/java/com/iluwatar/serverless/baas/api/SavePersonApiHandlerTest.java index 66636c011458abd0b966b902f893fdb354e80b66..ef3909adc8a141818bc555aa8e505a5d5507f435 100644 --- a/serverless/src/test/java/com/iluwatar/serverless/baas/api/SavePersonApiHandlerTest.java +++ b/serverless/src/test/java/com/iluwatar/serverless/baas/api/SavePersonApiHandlerTest.java @@ -23,13 +23,15 @@ package com.iluwatar.serverless.baas.api; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; -import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import com.iluwatar.serverless.baas.api.SavePersonApiHandler; import com.iluwatar.serverless.baas.model.Address; import com.iluwatar.serverless.baas.model.Person; import org.junit.Assert; @@ -39,11 +41,8 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import static org.mockito.Mockito.*; - /** - * Unit tests for SavePersonApiHandler - * Created by dheeraj.mummar on 3/4/18. + * Unit tests for SavePersonApiHandler Created by dheeraj.mummar on 3/4/18. */ @RunWith(MockitoJUnitRunner.class) public class SavePersonApiHandlerTest { @@ -63,40 +62,40 @@ public class SavePersonApiHandlerTest { @Test public void handleRequestSavePersonSuccessful() throws JsonProcessingException { - Person person = newPerson(); - APIGatewayProxyResponseEvent apiGatewayProxyResponseEvent = - this.savePersonApiHandler - .handleRequest(apiGatewayProxyRequestEvent(objectMapper.writeValueAsString(person)), mock(Context.class)); + var person = newPerson(); + var body = objectMapper.writeValueAsString(person); + var request = apiGatewayProxyRequestEvent(body); + var ctx = mock(Context.class); + var apiGatewayProxyResponseEvent = this.savePersonApiHandler.handleRequest(request, ctx); verify(dynamoDbMapper, times(1)).save(person); Assert.assertNotNull(apiGatewayProxyResponseEvent); - Assert.assertEquals(new Integer(201), apiGatewayProxyResponseEvent.getStatusCode()); + Assert.assertEquals(Integer.valueOf(201), apiGatewayProxyResponseEvent.getStatusCode()); } @Test public void handleRequestSavePersonException() { - APIGatewayProxyResponseEvent apiGatewayProxyResponseEvent = - this.savePersonApiHandler - .handleRequest(apiGatewayProxyRequestEvent("invalid sample request"), mock(Context.class)); + var request = apiGatewayProxyRequestEvent("invalid sample request"); + var ctx = mock(Context.class); + var apiGatewayProxyResponseEvent = this.savePersonApiHandler.handleRequest(request, ctx); Assert.assertNotNull(apiGatewayProxyResponseEvent); - Assert.assertEquals(new Integer(400), apiGatewayProxyResponseEvent.getStatusCode()); + Assert.assertEquals(Integer.valueOf(400), apiGatewayProxyResponseEvent.getStatusCode()); } private APIGatewayProxyRequestEvent apiGatewayProxyRequestEvent(String body) { - APIGatewayProxyRequestEvent apiGatewayProxyRequestEvent = new APIGatewayProxyRequestEvent(); + var apiGatewayProxyRequestEvent = new APIGatewayProxyRequestEvent(); return apiGatewayProxyRequestEvent.withBody(body); } private Person newPerson() { - Person person = new Person(); + var person = new Person(); person.setFirstName("Thor"); person.setLastName("Odinson"); - Address address = new Address(); + var address = new Address(); address.setAddressLineOne("1 Odin ln"); address.setCity("Asgard"); address.setState("country of the Gods"); address.setZipCode("00001"); person.setAddress(address); - return person; } } diff --git a/serverless/src/test/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandlerTest.java b/serverless/src/test/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandlerTest.java index ec68729734490e176a3c758d95dc279f00ffc59e..2231d59e539f66452dafcdc021dc2e8f80a9ed60 100644 --- a/serverless/src/test/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandlerTest.java +++ b/serverless/src/test/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandlerTest.java @@ -23,16 +23,16 @@ package com.iluwatar.serverless.faas.api; -import com.amazonaws.services.lambda.runtime.Context; -import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; -import org.mockito.runners.MockitoJUnitRunner; - import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.IsNull.notNullValue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import com.amazonaws.services.lambda.runtime.Context; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.mockito.runners.MockitoJUnitRunner; + /** * Unit tests for LambdaInfoApiHandler */ @@ -41,8 +41,8 @@ public class LambdaInfoApiHandlerTest { @Test public void handleRequestWithMockContext() { - LambdaInfoApiHandler lambdaInfoApiHandler = new LambdaInfoApiHandler(); - Context context = mock(Context.class); + var lambdaInfoApiHandler = new LambdaInfoApiHandler(); + var context = mock(Context.class); when(context.getAwsRequestId()).thenReturn("mock aws request id"); assertThat(lambdaInfoApiHandler.handleRequest(null, context), notNullValue()); diff --git a/service-layer/src/main/java/com/iluwatar/servicelayer/app/App.java b/service-layer/src/main/java/com/iluwatar/servicelayer/app/App.java index 22e1700856d96a4f38c752ae14a15546ba38dbfd..ea660f01e7bc6c59ec81c64f28c2f9e7b7b864ec 100644 --- a/service-layer/src/main/java/com/iluwatar/servicelayer/app/App.java +++ b/service-layer/src/main/java/com/iluwatar/servicelayer/app/App.java @@ -31,7 +31,6 @@ import com.iluwatar.servicelayer.spellbook.Spellbook; import com.iluwatar.servicelayer.spellbook.SpellbookDaoImpl; import com.iluwatar.servicelayer.wizard.Wizard; import com.iluwatar.servicelayer.wizard.WizardDaoImpl; -import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -178,29 +177,21 @@ public class App { * Query the data. */ public static void queryData() { - var service = - new MagicServiceImpl(new WizardDaoImpl(), new SpellbookDaoImpl(), new SpellDaoImpl()); + var wizardDao = new WizardDaoImpl(); + var spellbookDao = new SpellbookDaoImpl(); + var spellDao = new SpellDaoImpl(); + var service = new MagicServiceImpl(wizardDao, spellbookDao, spellDao); LOGGER.info("Enumerating all wizards"); - for (Wizard w : service.findAllWizards()) { - LOGGER.info(w.getName()); - } + service.findAllWizards().stream().map(Wizard::getName).forEach(LOGGER::info); LOGGER.info("Enumerating all spellbooks"); - for (Spellbook s : service.findAllSpellbooks()) { - LOGGER.info(s.getName()); - } + service.findAllSpellbooks().stream().map(Spellbook::getName).forEach(LOGGER::info); LOGGER.info("Enumerating all spells"); - for (Spell s : service.findAllSpells()) { - LOGGER.info(s.getName()); - } + service.findAllSpells().stream().map(Spell::getName).forEach(LOGGER::info); LOGGER.info("Find wizards with spellbook 'Book of Idores'"); - List wizardsWithSpellbook = service.findWizardsWithSpellbook("Book of Idores"); - for (Wizard w : wizardsWithSpellbook) { - LOGGER.info("{} has 'Book of Idores'", w.getName()); - } + var wizardsWithSpellbook = service.findWizardsWithSpellbook("Book of Idores"); + wizardsWithSpellbook.forEach(w -> LOGGER.info("{} has 'Book of Idores'", w.getName())); LOGGER.info("Find wizards with spell 'Fireball'"); - List wizardsWithSpell = service.findWizardsWithSpell("Fireball"); - for (Wizard w : wizardsWithSpell) { - LOGGER.info("{} has 'Fireball'", w.getName()); - } + var wizardsWithSpell = service.findWizardsWithSpell("Fireball"); + wizardsWithSpell.forEach(w -> LOGGER.info("{} has 'Fireball'", w.getName())); } } diff --git a/service-layer/src/main/java/com/iluwatar/servicelayer/common/DaoBaseImpl.java b/service-layer/src/main/java/com/iluwatar/servicelayer/common/DaoBaseImpl.java index 3c2ae6ed92a74cac7f399cd46c6488aef7c37910..cf77e4f6e83e4235c619ef7e7e3bd961502fd133 100644 --- a/service-layer/src/main/java/com/iluwatar/servicelayer/common/DaoBaseImpl.java +++ b/service-layer/src/main/java/com/iluwatar/servicelayer/common/DaoBaseImpl.java @@ -52,10 +52,9 @@ public abstract class DaoBaseImpl implements Dao { @Override public E find(Long id) { - var session = getSessionFactory().openSession(); Transaction tx = null; - E result = null; - try { + E result; + try (var session = getSessionFactory().openSession()) { tx = session.beginTransaction(); var criteria = session.createCriteria(persistentClass); criteria.add(Restrictions.idEq(id)); @@ -66,17 +65,14 @@ public abstract class DaoBaseImpl implements Dao { tx.rollback(); } throw e; - } finally { - session.close(); } return result; } @Override public void persist(E entity) { - var session = getSessionFactory().openSession(); Transaction tx = null; - try { + try (var session = getSessionFactory().openSession()) { tx = session.beginTransaction(); session.persist(entity); tx.commit(); @@ -85,17 +81,14 @@ public abstract class DaoBaseImpl implements Dao { tx.rollback(); } throw e; - } finally { - session.close(); } } @Override public E merge(E entity) { - var session = getSessionFactory().openSession(); Transaction tx = null; E result = null; - try { + try (var session = getSessionFactory().openSession()) { tx = session.beginTransaction(); result = (E) session.merge(entity); tx.commit(); @@ -104,17 +97,14 @@ public abstract class DaoBaseImpl implements Dao { tx.rollback(); } throw e; - } finally { - session.close(); } return result; } @Override public void delete(E entity) { - var session = getSessionFactory().openSession(); Transaction tx = null; - try { + try (var session = getSessionFactory().openSession()) { tx = session.beginTransaction(); session.delete(entity); tx.commit(); @@ -123,17 +113,14 @@ public abstract class DaoBaseImpl implements Dao { tx.rollback(); } throw e; - } finally { - session.close(); } } @Override public List findAll() { - var session = getSessionFactory().openSession(); Transaction tx = null; - List result = null; - try { + List result; + try (var session = getSessionFactory().openSession()) { tx = session.beginTransaction(); Criteria criteria = session.createCriteria(persistentClass); result = criteria.list(); @@ -142,8 +129,6 @@ public abstract class DaoBaseImpl implements Dao { tx.rollback(); } throw e; - } finally { - session.close(); } return result; } diff --git a/service-layer/src/main/java/com/iluwatar/servicelayer/hibernate/HibernateUtil.java b/service-layer/src/main/java/com/iluwatar/servicelayer/hibernate/HibernateUtil.java index 44c4c12a2d85835f53fbad0ffe0641fc32c56c65..bc2e51f138c50d427d81af36600595f8cc75a132 100644 --- a/service-layer/src/main/java/com/iluwatar/servicelayer/hibernate/HibernateUtil.java +++ b/service-layer/src/main/java/com/iluwatar/servicelayer/hibernate/HibernateUtil.java @@ -54,14 +54,15 @@ public final class HibernateUtil { public static synchronized SessionFactory getSessionFactory() { if (sessionFactory == null) { try { - sessionFactory = - new Configuration().addAnnotatedClass(Wizard.class).addAnnotatedClass(Spellbook.class) - .addAnnotatedClass(Spell.class) - .setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect") - .setProperty("hibernate.connection.url", "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1") - .setProperty("hibernate.current_session_context_class", "thread") - .setProperty("hibernate.show_sql", "false") - .setProperty("hibernate.hbm2ddl.auto", "create-drop").buildSessionFactory(); + sessionFactory = new Configuration() + .addAnnotatedClass(Wizard.class) + .addAnnotatedClass(Spellbook.class) + .addAnnotatedClass(Spell.class) + .setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect") + .setProperty("hibernate.connection.url", "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1") + .setProperty("hibernate.current_session_context_class", "thread") + .setProperty("hibernate.show_sql", "false") + .setProperty("hibernate.hbm2ddl.auto", "create-drop").buildSessionFactory(); } catch (Throwable ex) { LOGGER.error("Initial SessionFactory creation failed.", ex); throw new ExceptionInInitializerError(ex); diff --git a/service-layer/src/main/java/com/iluwatar/servicelayer/spell/SpellDaoImpl.java b/service-layer/src/main/java/com/iluwatar/servicelayer/spell/SpellDaoImpl.java index 06e898a88538dc8f555d4ae2636d031ca62d2a08..aff1a37c57cfda3bcd71878eda93a45b66e7ab78 100644 --- a/service-layer/src/main/java/com/iluwatar/servicelayer/spell/SpellDaoImpl.java +++ b/service-layer/src/main/java/com/iluwatar/servicelayer/spell/SpellDaoImpl.java @@ -35,7 +35,7 @@ public class SpellDaoImpl extends DaoBaseImpl implements SpellDao { @Override public Spell findByName(String name) { Transaction tx = null; - Spell result = null; + Spell result; try (var session = getSessionFactory().openSession()) { tx = session.beginTransaction(); var criteria = session.createCriteria(persistentClass); diff --git a/service-layer/src/main/java/com/iluwatar/servicelayer/spellbook/SpellbookDaoImpl.java b/service-layer/src/main/java/com/iluwatar/servicelayer/spellbook/SpellbookDaoImpl.java index dcacd2786cdafed9f941113c3bdf1c51fb74014e..bc05ebe773567c73b8da2874a1c4ecadc3171df9 100644 --- a/service-layer/src/main/java/com/iluwatar/servicelayer/spellbook/SpellbookDaoImpl.java +++ b/service-layer/src/main/java/com/iluwatar/servicelayer/spellbook/SpellbookDaoImpl.java @@ -34,24 +34,19 @@ public class SpellbookDaoImpl extends DaoBaseImpl implements Spellboo @Override public Spellbook findByName(String name) { - var session = getSessionFactory().openSession(); Transaction tx = null; - Spellbook result = null; - try { + Spellbook result; + try (var session = getSessionFactory().openSession()) { tx = session.beginTransaction(); var criteria = session.createCriteria(persistentClass); criteria.add(Restrictions.eq("name", name)); result = (Spellbook) criteria.uniqueResult(); - result.getSpells().size(); - result.getWizards().size(); tx.commit(); } catch (Exception e) { if (tx != null) { tx.rollback(); } throw e; - } finally { - session.close(); } return result; } diff --git a/service-layer/src/main/java/com/iluwatar/servicelayer/wizard/WizardDaoImpl.java b/service-layer/src/main/java/com/iluwatar/servicelayer/wizard/WizardDaoImpl.java index ee2f2a03857dfce05de84e107a93e23421b5d880..eb27b70f7719e0b148c2f9b06bd3a01a84837038 100644 --- a/service-layer/src/main/java/com/iluwatar/servicelayer/wizard/WizardDaoImpl.java +++ b/service-layer/src/main/java/com/iluwatar/servicelayer/wizard/WizardDaoImpl.java @@ -24,9 +24,6 @@ package com.iluwatar.servicelayer.wizard; import com.iluwatar.servicelayer.common.DaoBaseImpl; -import com.iluwatar.servicelayer.spellbook.Spellbook; -import org.hibernate.Criteria; -import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.criterion.Restrictions; @@ -37,25 +34,19 @@ public class WizardDaoImpl extends DaoBaseImpl implements WizardDao { @Override public Wizard findByName(String name) { - Session session = getSessionFactory().openSession(); Transaction tx = null; - Wizard result = null; - try { + Wizard result; + try (var session = getSessionFactory().openSession()) { tx = session.beginTransaction(); - Criteria criteria = session.createCriteria(persistentClass); + var criteria = session.createCriteria(persistentClass); criteria.add(Restrictions.eq("name", name)); result = (Wizard) criteria.uniqueResult(); - for (Spellbook s : result.getSpellbooks()) { - s.getSpells().size(); - } tx.commit(); } catch (Exception e) { if (tx != null) { tx.rollback(); } throw e; - } finally { - session.close(); } return result; } diff --git a/service-layer/src/test/java/com/iluwatar/servicelayer/app/AppTest.java b/service-layer/src/test/java/com/iluwatar/servicelayer/app/AppTest.java index f144e026633ee26fbe948944d6c74cdeb4451772..26aa2b168c97da976461fb0881949d77b6fb376c 100644 --- a/service-layer/src/test/java/com/iluwatar/servicelayer/app/AppTest.java +++ b/service-layer/src/test/java/com/iluwatar/servicelayer/app/AppTest.java @@ -28,16 +28,13 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; /** - * * Application test - * */ public class AppTest { @Test public void test() { - String[] args = {}; - App.main(args); + App.main(new String[]{}); } @AfterEach diff --git a/service-layer/src/test/java/com/iluwatar/servicelayer/common/BaseDaoTest.java b/service-layer/src/test/java/com/iluwatar/servicelayer/common/BaseDaoTest.java index e70cf0625ac705b4376608c56c588e797bd277cf..6b85065ba82457b70a0c942cff692f75ca3242a4 100644 --- a/service-layer/src/test/java/com/iluwatar/servicelayer/common/BaseDaoTest.java +++ b/service-layer/src/test/java/com/iluwatar/servicelayer/common/BaseDaoTest.java @@ -23,22 +23,20 @@ package com.iluwatar.servicelayer.common; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; + import com.iluwatar.servicelayer.hibernate.HibernateUtil; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Function; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; - /** - * Date: 12/28/15 - 10:53 PM - * Test for Base Data Access Objects + * Date: 12/28/15 - 10:53 PM Test for Base Data Access Objects + * * @param Type of Base Entity * @param Type of Dao Base Implementation * @author Jeroen Meulemeester @@ -79,8 +77,8 @@ public abstract class BaseDaoTest @BeforeEach public void setUp() { for (int i = 0; i < INITIAL_COUNT; i++) { - final String className = dao.persistentClass.getSimpleName(); - final String entityName = String.format("%s%d", className, ID_GENERATOR.incrementAndGet()); + final var className = dao.persistentClass.getSimpleName(); + final var entityName = String.format("%s%d", className, ID_GENERATOR.incrementAndGet()); this.dao.persist(this.factory.apply(entityName)); } } @@ -96,9 +94,9 @@ public abstract class BaseDaoTest @Test public void testFind() { - final List all = this.dao.findAll(); - for (final E entity : all) { - final E byId = this.dao.find(entity.getId()); + final var all = this.dao.findAll(); + for (final var entity : all) { + final var byId = this.dao.find(entity.getId()); assertNotNull(byId); assertEquals(byId.getId(), byId.getId()); } @@ -106,39 +104,39 @@ public abstract class BaseDaoTest @Test public void testDelete() { - final List originalEntities = this.dao.findAll(); + final var originalEntities = this.dao.findAll(); this.dao.delete(originalEntities.get(1)); this.dao.delete(originalEntities.get(2)); - final List entitiesLeft = this.dao.findAll(); + final var entitiesLeft = this.dao.findAll(); assertNotNull(entitiesLeft); assertEquals(INITIAL_COUNT - 2, entitiesLeft.size()); } @Test public void testFindAll() { - final List all = this.dao.findAll(); + final var all = this.dao.findAll(); assertNotNull(all); assertEquals(INITIAL_COUNT, all.size()); } @Test public void testSetId() { - final E entity = this.factory.apply("name"); + final var entity = this.factory.apply("name"); assertNull(entity.getId()); - final Long expectedId = 1L; + final var expectedId = 1L; entity.setId(expectedId); assertEquals(expectedId, entity.getId()); } @Test public void testSetName() { - final E entity = this.factory.apply("name"); + final var entity = this.factory.apply("name"); assertEquals("name", entity.getName()); assertEquals("name", entity.toString()); - final String expectedName = "new name"; + final var expectedName = "new name"; entity.setName(expectedName); assertEquals(expectedName, entity.getName()); assertEquals(expectedName, entity.toString()); diff --git a/service-layer/src/test/java/com/iluwatar/servicelayer/magic/MagicServiceImplTest.java b/service-layer/src/test/java/com/iluwatar/servicelayer/magic/MagicServiceImplTest.java index b4b3c5714ca32523aad7ecc50bcea9a24342d6f0..f559d2d759be0760e68b29269b61a107d07f34f3 100644 --- a/service-layer/src/test/java/com/iluwatar/servicelayer/magic/MagicServiceImplTest.java +++ b/service-layer/src/test/java/com/iluwatar/servicelayer/magic/MagicServiceImplTest.java @@ -23,18 +23,6 @@ package com.iluwatar.servicelayer.magic; -import com.iluwatar.servicelayer.spell.Spell; -import com.iluwatar.servicelayer.spell.SpellDao; -import com.iluwatar.servicelayer.spellbook.Spellbook; -import com.iluwatar.servicelayer.spellbook.SpellbookDao; -import com.iluwatar.servicelayer.wizard.Wizard; -import com.iluwatar.servicelayer.wizard.WizardDao; -import org.junit.jupiter.api.Test; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; - import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.Matchers.eq; @@ -44,6 +32,15 @@ import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; +import com.iluwatar.servicelayer.spell.Spell; +import com.iluwatar.servicelayer.spell.SpellDao; +import com.iluwatar.servicelayer.spellbook.Spellbook; +import com.iluwatar.servicelayer.spellbook.SpellbookDao; +import com.iluwatar.servicelayer.wizard.Wizard; +import com.iluwatar.servicelayer.wizard.WizardDao; +import java.util.Set; +import org.junit.jupiter.api.Test; + /** * Date: 12/29/15 - 12:06 AM * @@ -53,11 +50,11 @@ public class MagicServiceImplTest { @Test public void testFindAllWizards() { - final WizardDao wizardDao = mock(WizardDao.class); - final SpellbookDao spellbookDao = mock(SpellbookDao.class); - final SpellDao spellDao = mock(SpellDao.class); + final var wizardDao = mock(WizardDao.class); + final var spellbookDao = mock(SpellbookDao.class); + final var spellDao = mock(SpellDao.class); - final MagicServiceImpl service = new MagicServiceImpl(wizardDao, spellbookDao, spellDao); + final var service = new MagicServiceImpl(wizardDao, spellbookDao, spellDao); verifyZeroInteractions(wizardDao, spellbookDao, spellDao); service.findAllWizards(); @@ -66,12 +63,12 @@ public class MagicServiceImplTest { } @Test - public void testFindAllSpellbooks() throws Exception { - final WizardDao wizardDao = mock(WizardDao.class); - final SpellbookDao spellbookDao = mock(SpellbookDao.class); - final SpellDao spellDao = mock(SpellDao.class); + public void testFindAllSpellbooks() { + final var wizardDao = mock(WizardDao.class); + final var spellbookDao = mock(SpellbookDao.class); + final var spellDao = mock(SpellDao.class); - final MagicServiceImpl service = new MagicServiceImpl(wizardDao, spellbookDao, spellDao); + final var service = new MagicServiceImpl(wizardDao, spellbookDao, spellDao); verifyZeroInteractions(wizardDao, spellbookDao, spellDao); service.findAllSpellbooks(); @@ -80,12 +77,12 @@ public class MagicServiceImplTest { } @Test - public void testFindAllSpells() throws Exception { - final WizardDao wizardDao = mock(WizardDao.class); - final SpellbookDao spellbookDao = mock(SpellbookDao.class); - final SpellDao spellDao = mock(SpellDao.class); + public void testFindAllSpells() { + final var wizardDao = mock(WizardDao.class); + final var spellbookDao = mock(SpellbookDao.class); + final var spellDao = mock(SpellDao.class); - final MagicServiceImpl service = new MagicServiceImpl(wizardDao, spellbookDao, spellDao); + final var service = new MagicServiceImpl(wizardDao, spellbookDao, spellDao); verifyZeroInteractions(wizardDao, spellbookDao, spellDao); service.findAllSpells(); @@ -94,26 +91,27 @@ public class MagicServiceImplTest { } @Test - public void testFindWizardsWithSpellbook() throws Exception { - final String bookname = "bookname"; - final Spellbook spellbook = mock(Spellbook.class); - final Set wizards = Set.of( - mock(Wizard.class), - mock(Wizard.class), - mock(Wizard.class)); + public void testFindWizardsWithSpellbook() { + final var bookname = "bookname"; + final var spellbook = mock(Spellbook.class); + final var wizards = Set.of( + mock(Wizard.class), + mock(Wizard.class), + mock(Wizard.class) + ); when(spellbook.getWizards()).thenReturn(wizards); - final SpellbookDao spellbookDao = mock(SpellbookDao.class); + final var spellbookDao = mock(SpellbookDao.class); when(spellbookDao.findByName(eq(bookname))).thenReturn(spellbook); - final WizardDao wizardDao = mock(WizardDao.class); - final SpellDao spellDao = mock(SpellDao.class); + final var wizardDao = mock(WizardDao.class); + final var spellDao = mock(SpellDao.class); - final MagicServiceImpl service = new MagicServiceImpl(wizardDao, spellbookDao, spellDao); + final var service = new MagicServiceImpl(wizardDao, spellbookDao, spellDao); verifyZeroInteractions(wizardDao, spellbookDao, spellDao, spellbook); - final List result = service.findWizardsWithSpellbook(bookname); + final var result = service.findWizardsWithSpellbook(bookname); verify(spellbookDao).findByName(eq(bookname)); verify(spellbook).getWizards(); @@ -125,27 +123,28 @@ public class MagicServiceImplTest { @Test public void testFindWizardsWithSpell() throws Exception { - final Set wizards = Set.of( - mock(Wizard.class), - mock(Wizard.class), - mock(Wizard.class)); - final Spellbook spellbook = mock(Spellbook.class); + final var wizards = Set.of( + mock(Wizard.class), + mock(Wizard.class), + mock(Wizard.class) + ); + final var spellbook = mock(Spellbook.class); when(spellbook.getWizards()).thenReturn(wizards); - final SpellbookDao spellbookDao = mock(SpellbookDao.class); - final WizardDao wizardDao = mock(WizardDao.class); + final var spellbookDao = mock(SpellbookDao.class); + final var wizardDao = mock(WizardDao.class); - final Spell spell = mock(Spell.class); + final var spell = mock(Spell.class); when(spell.getSpellbook()).thenReturn(spellbook); - final String spellName = "spellname"; - final SpellDao spellDao = mock(SpellDao.class); + final var spellName = "spellname"; + final var spellDao = mock(SpellDao.class); when(spellDao.findByName(eq(spellName))).thenReturn(spell); - final MagicServiceImpl service = new MagicServiceImpl(wizardDao, spellbookDao, spellDao); + final var service = new MagicServiceImpl(wizardDao, spellbookDao, spellDao); verifyZeroInteractions(wizardDao, spellbookDao, spellDao, spellbook); - final List result = service.findWizardsWithSpell(spellName); + final var result = service.findWizardsWithSpell(spellName); verify(spellDao).findByName(eq(spellName)); verify(spellbook).getWizards(); diff --git a/service-layer/src/test/java/com/iluwatar/servicelayer/spell/SpellDaoImplTest.java b/service-layer/src/test/java/com/iluwatar/servicelayer/spell/SpellDaoImplTest.java index bd6afaedc187816ed91ccf63fedb01d68cd25e8c..1768df10e6164f8b1f1cf55769145b1a78424e4b 100644 --- a/service-layer/src/test/java/com/iluwatar/servicelayer/spell/SpellDaoImplTest.java +++ b/service-layer/src/test/java/com/iluwatar/servicelayer/spell/SpellDaoImplTest.java @@ -23,14 +23,12 @@ package com.iluwatar.servicelayer.spell; -import com.iluwatar.servicelayer.common.BaseDaoTest; -import org.junit.jupiter.api.Test; - -import java.util.List; - import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; +import com.iluwatar.servicelayer.common.BaseDaoTest; +import org.junit.jupiter.api.Test; + /** * Date: 12/28/15 - 11:02 PM * @@ -44,10 +42,10 @@ public class SpellDaoImplTest extends BaseDaoTest { @Test public void testFindByName() { - final SpellDaoImpl dao = getDao(); - final List allSpells = dao.findAll(); - for (final Spell spell : allSpells) { - final Spell spellByName = dao.findByName(spell.getName()); + final var dao = getDao(); + final var allSpells = dao.findAll(); + for (final var spell : allSpells) { + final var spellByName = dao.findByName(spell.getName()); assertNotNull(spellByName); assertEquals(spell.getId(), spellByName.getId()); assertEquals(spell.getName(), spellByName.getName()); diff --git a/service-layer/src/test/java/com/iluwatar/servicelayer/spellbook/SpellbookDaoImplTest.java b/service-layer/src/test/java/com/iluwatar/servicelayer/spellbook/SpellbookDaoImplTest.java index 01fed1bcb79a9353e6f56f842f374d8c3a063cf2..f9e4e59f107978dbd4cd1b6fa4ab76b774f9381e 100644 --- a/service-layer/src/test/java/com/iluwatar/servicelayer/spellbook/SpellbookDaoImplTest.java +++ b/service-layer/src/test/java/com/iluwatar/servicelayer/spellbook/SpellbookDaoImplTest.java @@ -23,14 +23,12 @@ package com.iluwatar.servicelayer.spellbook; -import com.iluwatar.servicelayer.common.BaseDaoTest; -import org.junit.jupiter.api.Test; - -import java.util.List; - import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; +import com.iluwatar.servicelayer.common.BaseDaoTest; +import org.junit.jupiter.api.Test; + /** * Date: 12/28/15 - 11:44 PM * @@ -44,10 +42,10 @@ public class SpellbookDaoImplTest extends BaseDaoTest allBooks = dao.findAll(); - for (final Spellbook book : allBooks) { - final Spellbook spellByName = dao.findByName(book.getName()); + final var dao = getDao(); + final var allBooks = dao.findAll(); + for (final var book : allBooks) { + final var spellByName = dao.findByName(book.getName()); assertNotNull(spellByName); assertEquals(book.getId(), spellByName.getId()); assertEquals(book.getName(), spellByName.getName()); diff --git a/service-layer/src/test/java/com/iluwatar/servicelayer/wizard/WizardDaoImplTest.java b/service-layer/src/test/java/com/iluwatar/servicelayer/wizard/WizardDaoImplTest.java index ca2b679c9e2e7f4d1ad71656fa1ee41b57ba5b71..e25e434f1c0cafa8bb8e26ca21561c22d04d4e60 100644 --- a/service-layer/src/test/java/com/iluwatar/servicelayer/wizard/WizardDaoImplTest.java +++ b/service-layer/src/test/java/com/iluwatar/servicelayer/wizard/WizardDaoImplTest.java @@ -23,14 +23,12 @@ package com.iluwatar.servicelayer.wizard; -import com.iluwatar.servicelayer.common.BaseDaoTest; -import org.junit.jupiter.api.Test; - -import java.util.List; - import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; +import com.iluwatar.servicelayer.common.BaseDaoTest; +import org.junit.jupiter.api.Test; + /** * Date: 12/28/15 - 11:46 PM * @@ -44,10 +42,10 @@ public class WizardDaoImplTest extends BaseDaoTest { @Test public void testFindByName() { - final WizardDaoImpl dao = getDao(); - final List allWizards = dao.findAll(); - for (final Wizard spell : allWizards) { - final Wizard byName = dao.findByName(spell.getName()); + final var dao = getDao(); + final var allWizards = dao.findAll(); + for (final var spell : allWizards) { + final var byName = dao.findByName(spell.getName()); assertNotNull(byName); assertEquals(spell.getId(), byName.getId()); assertEquals(spell.getName(), byName.getName()); diff --git a/service-locator/src/main/java/com/iluwatar/servicelocator/ServiceCache.java b/service-locator/src/main/java/com/iluwatar/servicelocator/ServiceCache.java index 2f3bc9c1509220a65bbbb7dd56418849c1d5856f..775de114bbc697280ca7761e8caad61b8060aff2 100644 --- a/service-locator/src/main/java/com/iluwatar/servicelocator/ServiceCache.java +++ b/service-locator/src/main/java/com/iluwatar/servicelocator/ServiceCache.java @@ -53,15 +53,14 @@ public class ServiceCache { * @return {@link Service} */ public Service getService(String serviceName) { - Service cachedService = null; - for (String serviceJndiName : serviceCache.keySet()) { - if (serviceJndiName.equals(serviceName)) { - cachedService = serviceCache.get(serviceJndiName); - LOGGER.info("(cache call) Fetched service {}({}) from cache... !", - cachedService.getName(), cachedService.getId()); - } + if (serviceCache.containsKey(serviceName)) { + var cachedService = serviceCache.get(serviceName); + var name = cachedService.getName(); + var id = cachedService.getId(); + LOGGER.info("(cache call) Fetched service {}({}) from cache... !", name, id); + return cachedService; } - return cachedService; + return null; } /** diff --git a/service-locator/src/test/java/com/iluwatar/servicelocator/AppTest.java b/service-locator/src/test/java/com/iluwatar/servicelocator/AppTest.java index f77f1c612edfa9d4dffea4099190c3c1dc254aac..cb4c98c078bb8cb3b725c45f009ec2a08ca3f454 100644 --- a/service-locator/src/test/java/com/iluwatar/servicelocator/AppTest.java +++ b/service-locator/src/test/java/com/iluwatar/servicelocator/AppTest.java @@ -26,15 +26,12 @@ package com.iluwatar.servicelocator; 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/service-locator/src/test/java/com/iluwatar/servicelocator/ServiceLocatorTest.java b/service-locator/src/test/java/com/iluwatar/servicelocator/ServiceLocatorTest.java index 16bc934eb017c3d34eb31e9c0c12aad04bce8c33..f4369a7687a101886bc8121979e32e320845e8b8 100644 --- a/service-locator/src/test/java/com/iluwatar/servicelocator/ServiceLocatorTest.java +++ b/service-locator/src/test/java/com/iluwatar/servicelocator/ServiceLocatorTest.java @@ -23,14 +23,15 @@ package com.iluwatar.servicelocator; -import org.junit.jupiter.api.Test; - import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertTrue; +import java.util.List; +import org.junit.jupiter.api.Test; + /** * Date: 12/29/15 - 19:07 PM * @@ -52,12 +53,10 @@ public class ServiceLocatorTest { */ @Test public void testServiceCache() { - final String[] serviceNames = new String[]{ - "jndi/serviceA", "jndi/serviceB" - }; + final var serviceNames = List.of("jndi/serviceA", "jndi/serviceB"); - for (final String serviceName : serviceNames) { - final Service service = ServiceLocator.getService(serviceName); + for (final var serviceName : serviceNames) { + final var service = ServiceLocator.getService(serviceName); assertNotNull(service); assertEquals(serviceName, service.getName()); assertTrue(service.getId() > 0); // The id is generated randomly, but the minimum value is '1' diff --git a/sharding/src/main/java/com/iluwatar/sharding/App.java b/sharding/src/main/java/com/iluwatar/sharding/App.java index 482b056b165f36331fab76b4bb0d9f3e4e53b933..fe3cb79238d98d15342bc8192f0d1947969bef22 100644 --- a/sharding/src/main/java/com/iluwatar/sharding/App.java +++ b/sharding/src/main/java/com/iluwatar/sharding/App.java @@ -24,14 +24,14 @@ package com.iluwatar.sharding; /** - * Sharding pattern means dividing a data store into a set of horizontal partitions - * or shards. This pattern can improve scalability when storing and accessing large - * volumes of data. + * Sharding pattern means dividing a data store into a set of horizontal partitions or shards. This + * pattern can improve scalability when storing and accessing large volumes of data. */ public class App { /** * Program main entry point. + * * @param args program runtime arguments */ public static void main(String[] args) { @@ -45,7 +45,7 @@ public class App { var shard2 = new Shard(2); var shard3 = new Shard(3); - ShardManager manager = new LookupShardManager(); + var manager = new LookupShardManager(); manager.addNewShard(shard1); manager.addNewShard(shard2); manager.addNewShard(shard3); @@ -58,27 +58,27 @@ public class App { shard2.clearData(); shard3.clearData(); - manager = new RangeShardManager(); - manager.addNewShard(shard1); - manager.addNewShard(shard2); - manager.addNewShard(shard3); - manager.storeData(data1); - manager.storeData(data2); - manager.storeData(data3); - manager.storeData(data4); + var rangeShardManager = new RangeShardManager(); + rangeShardManager.addNewShard(shard1); + rangeShardManager.addNewShard(shard2); + rangeShardManager.addNewShard(shard3); + rangeShardManager.storeData(data1); + rangeShardManager.storeData(data2); + rangeShardManager.storeData(data3); + rangeShardManager.storeData(data4); shard1.clearData(); shard2.clearData(); shard3.clearData(); - manager = new HashShardManager(); - manager.addNewShard(shard1); - manager.addNewShard(shard2); - manager.addNewShard(shard3); - manager.storeData(data1); - manager.storeData(data2); - manager.storeData(data3); - manager.storeData(data4); + var hashShardManager = new HashShardManager(); + hashShardManager.addNewShard(shard1); + hashShardManager.addNewShard(shard2); + hashShardManager.addNewShard(shard3); + hashShardManager.storeData(data1); + hashShardManager.storeData(data2); + hashShardManager.storeData(data3); + hashShardManager.storeData(data4); shard1.clearData(); shard2.clearData(); diff --git a/sharding/src/main/java/com/iluwatar/sharding/LookupShardManager.java b/sharding/src/main/java/com/iluwatar/sharding/LookupShardManager.java index f282afd28bf8c802e18f2e599637a881a483eefa..4948c2a190c403cec7fc5d8a55da404bc4ffbab8 100644 --- a/sharding/src/main/java/com/iluwatar/sharding/LookupShardManager.java +++ b/sharding/src/main/java/com/iluwatar/sharding/LookupShardManager.java @@ -58,8 +58,7 @@ public class LookupShardManager extends ShardManager { return lookupMap.get(key); } else { var shardCount = shardMap.size(); - var allocatedShardId = new Random().nextInt(shardCount - 1) + 1; - return allocatedShardId; + return new Random().nextInt(shardCount - 1) + 1; } } diff --git a/sharding/src/main/java/com/iluwatar/sharding/RangeShardManager.java b/sharding/src/main/java/com/iluwatar/sharding/RangeShardManager.java index f7a8a90af601511fa52e304fd85a70b3cdb97061..bdb862571e659ad3e3d843081a7c6eb7ad87a9f4 100644 --- a/sharding/src/main/java/com/iluwatar/sharding/RangeShardManager.java +++ b/sharding/src/main/java/com/iluwatar/sharding/RangeShardManager.java @@ -27,8 +27,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * ShardManager with range strategy. This strategy groups related items together - * in the same shard, and orders them by shard key. + * ShardManager with range strategy. This strategy groups related items together in the same shard, + * and orders them by shard key. */ public class RangeShardManager extends ShardManager { @@ -46,21 +46,16 @@ public class RangeShardManager extends ShardManager { @Override protected int allocateShard(Data data) { var type = data.getType(); - var shardId = -1; switch (type) { case type1: - shardId = 1; - break; + return 1; case type2: - shardId = 2; - break; + return 2; case type3: - shardId = 3; - break; + return 3; default: - break; + return -1; } - return shardId; } } diff --git a/sharding/src/test/java/com/iluwatar/sharding/AppTest.java b/sharding/src/test/java/com/iluwatar/sharding/AppTest.java index fce8d89a3ca6a787cc7c66be32b38580898ae662..40e6391bfdf7f599edb33fb7def43932834e7c3d 100644 --- a/sharding/src/test/java/com/iluwatar/sharding/AppTest.java +++ b/sharding/src/test/java/com/iluwatar/sharding/AppTest.java @@ -32,8 +32,7 @@ public class AppTest { @Test public void testMain() { - String[] args = {}; - App.main(args); + App.main(new String[]{}); } } diff --git a/sharding/src/test/java/com/iluwatar/sharding/LookupShardManagerTest.java b/sharding/src/test/java/com/iluwatar/sharding/LookupShardManagerTest.java index 7379859b8272f1b58e37a3ad66436874e3d82413..70650bb506c69ff37ed4fcdc563ef374eb4598e0 100644 --- a/sharding/src/test/java/com/iluwatar/sharding/LookupShardManagerTest.java +++ b/sharding/src/test/java/com/iluwatar/sharding/LookupShardManagerTest.java @@ -24,7 +24,6 @@ package com.iluwatar.sharding; import java.util.Map; - import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -57,7 +56,7 @@ public class LookupShardManagerTest { lookupShardManager.storeData(data); var field = LookupShardManager.class.getDeclaredField("lookupMap"); field.setAccessible(true); - Map lookupMap = (Map) field.get(lookupShardManager); + var lookupMap = (Map) field.get(lookupShardManager); var shardId = lookupMap.get(1); var shard = lookupShardManager.getShardById(shardId); Assert.assertEquals(data, shard.getDataById(1)); diff --git a/sharding/src/test/java/com/iluwatar/sharding/ShardManagerTest.java b/sharding/src/test/java/com/iluwatar/sharding/ShardManagerTest.java index ff4544973ef7b6faf3ba34d461f3d02f94471d37..992ad8d5211e041c7bd8b6a5c4580365138d40b9 100644 --- a/sharding/src/test/java/com/iluwatar/sharding/ShardManagerTest.java +++ b/sharding/src/test/java/com/iluwatar/sharding/ShardManagerTest.java @@ -24,7 +24,6 @@ package com.iluwatar.sharding; import java.util.Map; - import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -57,7 +56,7 @@ public class ShardManagerTest { shardManager.addNewShard(shard); var field = ShardManager.class.getDeclaredField("shardMap"); field.setAccessible(true); - Map map = (Map) field.get(shardManager); + var map = (Map) field.get(shardManager); Assert.assertEquals(1, map.size()); Assert.assertEquals(shard, map.get(1)); } catch (NoSuchFieldException | IllegalAccessException e) { @@ -73,7 +72,7 @@ public class ShardManagerTest { boolean flag = shardManager.removeShardById(1); var field = ShardManager.class.getDeclaredField("shardMap"); field.setAccessible(true); - Map map = (Map) field.get(shardManager); + var map = (Map) field.get(shardManager); Assert.assertEquals(true, flag); Assert.assertEquals(0, map.size()); } catch (IllegalAccessException | NoSuchFieldException e) { @@ -83,9 +82,9 @@ public class ShardManagerTest { @Test public void testGetShardById() { - Shard shard = new Shard(1); + var shard = new Shard(1); shardManager.addNewShard(shard); - Shard tmpShard = shardManager.getShardById(1); + var tmpShard = shardManager.getShardById(1); Assert.assertEquals(shard, tmpShard); } diff --git a/sharding/src/test/java/com/iluwatar/sharding/ShardTest.java b/sharding/src/test/java/com/iluwatar/sharding/ShardTest.java index 4c0f74fa2e8d155be55c866ec134f234fef44508..a747933af8887a653881dc4bf15c2fa6fd8cd128 100644 --- a/sharding/src/test/java/com/iluwatar/sharding/ShardTest.java +++ b/sharding/src/test/java/com/iluwatar/sharding/ShardTest.java @@ -25,7 +25,6 @@ package com.iluwatar.sharding; import java.util.HashMap; import java.util.Map; - import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -48,7 +47,8 @@ public class ShardTest { } @After - public void tearDown() {} + public void tearDown() { + } @Test public void testStoreData() { @@ -56,7 +56,7 @@ public class ShardTest { shard.storeData(data); var field = Shard.class.getDeclaredField("dataStore"); field.setAccessible(true); - Map dataMap = (Map) field.get(shard); + var dataMap = (Map) field.get(shard); Assert.assertEquals(1, dataMap.size()); Assert.assertEquals(data, dataMap.get(1)); } catch (NoSuchFieldException | IllegalAccessException e) { @@ -68,13 +68,13 @@ public class ShardTest { @Test public void testClearData() { try { - Map dataMap = new HashMap<>(); + var dataMap = new HashMap(); dataMap.put(1, data); var field = Shard.class.getDeclaredField("dataStore"); field.setAccessible(true); field.set(shard, dataMap); shard.clearData(); - dataMap = (Map) field.get(shard); + dataMap = (HashMap) field.get(shard); Assert.assertEquals(0, dataMap.size()); } catch (NoSuchFieldException | IllegalAccessException e) { Assert.fail("Fail to modify field access."); diff --git a/singleton/README.md b/singleton/README.md index 8c145f1df8bef44e1129789c316aff6411227151..b2fc0420e25a58705cdccbcb8886d69981fd1fa5 100644 --- a/singleton/README.md +++ b/singleton/README.md @@ -41,8 +41,8 @@ public enum EnumIvoryTower { Then in order to use ```java -EnumIvoryTower enumIvoryTower1 = EnumIvoryTower.INSTANCE; -EnumIvoryTower enumIvoryTower2 = EnumIvoryTower.INSTANCE; +var enumIvoryTower1 = EnumIvoryTower.INSTANCE; +var enumIvoryTower2 = EnumIvoryTower.INSTANCE; assertEquals(enumIvoryTower1, enumIvoryTower2); // true ``` diff --git a/singleton/src/main/java/com/iluwatar/singleton/App.java b/singleton/src/main/java/com/iluwatar/singleton/App.java index 604b81184674f947ab9d60f4a8e8cd3737cfe3c8..319e077ef42bb5247c5a38e478c01f775e8f32cf 100644 --- a/singleton/src/main/java/com/iluwatar/singleton/App.java +++ b/singleton/src/main/java/com/iluwatar/singleton/App.java @@ -45,8 +45,7 @@ import org.slf4j.LoggerFactory; * example is found in {@link EnumIvoryTower}. At first glance the code looks short and simple. * However, you should be aware of the downsides including committing to implementation strategy, * extending the enum class, serializability and restrictions to coding. These are extensively - * discussed in Stack Overflow: - * http://programmers.stackexchange.com/questions/179386/what-are-the-downsides-of-implementing + * discussed in Stack Overflow: http://programmers.stackexchange.com/questions/179386/what-are-the-downsides-of-implementing * -a-singleton-with-javas-enum

* *

{@link ThreadSafeLazyLoadedIvoryTower} is a Singleton implementation that is initialized on @@ -54,9 +53,9 @@ import org.slf4j.LoggerFactory; * synchronized.

* *

Another Singleton implementation that is initialized on demand is found in - * {@link ThreadSafeDoubleCheckLocking}. It is somewhat faster than - * {@link ThreadSafeLazyLoadedIvoryTower} since it doesn't synchronize the whole access method but - * only the method internals on specific conditions.

+ * {@link ThreadSafeDoubleCheckLocking}. It is somewhat faster than {@link + * ThreadSafeLazyLoadedIvoryTower} since it doesn't synchronize the whole access method but only the + * method internals on specific conditions.

* *

Yet another way to implement thread safe lazily initialized Singleton can be found in * {@link InitializingOnDemandHolderIdiom}. However, this implementation requires at least Java 8 @@ -80,10 +79,8 @@ public class App { LOGGER.info("ivoryTower2={}", ivoryTower2); // lazily initialized singleton - var threadSafeIvoryTower1 = - ThreadSafeLazyLoadedIvoryTower.getInstance(); - var threadSafeIvoryTower2 = - ThreadSafeLazyLoadedIvoryTower.getInstance(); + var threadSafeIvoryTower1 = ThreadSafeLazyLoadedIvoryTower.getInstance(); + var threadSafeIvoryTower2 = ThreadSafeLazyLoadedIvoryTower.getInstance(); LOGGER.info("threadSafeIvoryTower1={}", threadSafeIvoryTower1); LOGGER.info("threadSafeIvoryTower2={}", threadSafeIvoryTower2); @@ -100,11 +97,9 @@ public class App { LOGGER.info(dcl2.toString()); // initialize on demand holder idiom - var demandHolderIdiom = - InitializingOnDemandHolderIdiom.getInstance(); + var demandHolderIdiom = InitializingOnDemandHolderIdiom.getInstance(); LOGGER.info(demandHolderIdiom.toString()); - var demandHolderIdiom2 = - InitializingOnDemandHolderIdiom.getInstance(); + var demandHolderIdiom2 = InitializingOnDemandHolderIdiom.getInstance(); LOGGER.info(demandHolderIdiom2.toString()); } } diff --git a/singleton/src/test/java/com/iluwatar/singleton/AppTest.java b/singleton/src/test/java/com/iluwatar/singleton/AppTest.java index 75043eae0bdc8568e0f96409324067bbb78da34d..b7c55ddeafc533a15a586172f6e3d4ba59ff06bb 100644 --- a/singleton/src/test/java/com/iluwatar/singleton/AppTest.java +++ b/singleton/src/test/java/com/iluwatar/singleton/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/singleton/src/test/java/com/iluwatar/singleton/InitializingOnDemandHolderIdiomTest.java b/singleton/src/test/java/com/iluwatar/singleton/InitializingOnDemandHolderIdiomTest.java index e855550129f2ba93e3a33209f3da0fed64dde4da..cb933666733acadf3fb98e2709de11ba869200c6 100644 --- a/singleton/src/test/java/com/iluwatar/singleton/InitializingOnDemandHolderIdiomTest.java +++ b/singleton/src/test/java/com/iluwatar/singleton/InitializingOnDemandHolderIdiomTest.java @@ -29,7 +29,7 @@ package com.iluwatar.singleton; * @author Jeroen Meulemeester */ public class InitializingOnDemandHolderIdiomTest - extends SingletonTest { + extends SingletonTest { /** * Create a new singleton test instance using the given 'getInstance' method. diff --git a/singleton/src/test/java/com/iluwatar/singleton/SingletonTest.java b/singleton/src/test/java/com/iluwatar/singleton/SingletonTest.java index 4dc1ecdff589889ece7e13fb39edbaffa2138133..63d13add4e979c745b4d4eff4a1d79cd3eb3bc0a 100644 --- a/singleton/src/test/java/com/iluwatar/singleton/SingletonTest.java +++ b/singleton/src/test/java/com/iluwatar/singleton/SingletonTest.java @@ -29,13 +29,11 @@ import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertTimeout; import java.util.ArrayList; -import java.util.List; import java.util.concurrent.Callable; -import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.Future; import java.util.function.Supplier; - +import java.util.stream.Collectors; +import java.util.stream.IntStream; import org.junit.jupiter.api.Test; /** @@ -73,9 +71,9 @@ public abstract class SingletonTest { @Test public void testMultipleCallsReturnTheSameObjectInSameThread() { // Create several instances in the same calling thread - S instance1 = this.singletonInstanceMethod.get(); - S instance2 = this.singletonInstanceMethod.get(); - S instance3 = this.singletonInstanceMethod.get(); + var instance1 = this.singletonInstanceMethod.get(); + var instance2 = this.singletonInstanceMethod.get(); + var instance3 = this.singletonInstanceMethod.get(); // now check they are equal assertSame(instance1, instance2); assertSame(instance1, instance3); @@ -89,19 +87,18 @@ public abstract class SingletonTest { public void testMultipleCallsReturnTheSameObjectInDifferentThreads() throws Exception { assertTimeout(ofMillis(10000), () -> { // Create 10000 tasks and inside each callable instantiate the singleton class - final List> tasks = new ArrayList<>(); - for (int i = 0; i < 10000; i++) { - tasks.add(this.singletonInstanceMethod::get); - } + final var tasks = IntStream.range(0, 10000) + .>mapToObj(i -> this.singletonInstanceMethod::get) + .collect(Collectors.toCollection(ArrayList::new)); // Use up to 8 concurrent threads to handle the tasks - final ExecutorService executorService = Executors.newFixedThreadPool(8); - final List> results = executorService.invokeAll(tasks); + final var executorService = Executors.newFixedThreadPool(8); + final var results = executorService.invokeAll(tasks); // wait for all of the threads to complete - final S expectedInstance = this.singletonInstanceMethod.get(); - for (Future res : results) { - final S instance = res.get(); + final var expectedInstance = this.singletonInstanceMethod.get(); + for (var res : results) { + final var instance = res.get(); assertNotNull(instance); assertSame(expectedInstance, instance); } diff --git a/singleton/src/test/java/com/iluwatar/singleton/ThreadSafeDoubleCheckLockingTest.java b/singleton/src/test/java/com/iluwatar/singleton/ThreadSafeDoubleCheckLockingTest.java index 8babb081e634f8b533403463e5fde2402d7d4688..b6ba2e5afe715ca0db21af275c8668168fb301c2 100644 --- a/singleton/src/test/java/com/iluwatar/singleton/ThreadSafeDoubleCheckLockingTest.java +++ b/singleton/src/test/java/com/iluwatar/singleton/ThreadSafeDoubleCheckLockingTest.java @@ -23,9 +23,7 @@ package com.iluwatar.singleton; -import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; - import org.junit.Test; /** @@ -47,11 +45,10 @@ public class ThreadSafeDoubleCheckLockingTest extends SingletonTest { + extends SingletonTest { /** * Create a new singleton test instance using the given 'getInstance' method. diff --git a/spatial-partition/README.md b/spatial-partition/README.md index 8484de876ce063318a8f4899220614376e9c3f7c..29d54533dc62b6e301ec7811a4914f0dec301239 100644 --- a/spatial-partition/README.md +++ b/spatial-partition/README.md @@ -19,9 +19,9 @@ Say, you are building a war game with hundreds, or maybe even thousands of playe ```java public void handleMeLee(Unit units[], int numUnits) { - for (int a = 0; a < numUnits - 1; a++) + for (var a = 0; a < numUnits - 1; a++) { - for (int b = a + 1; b < numUnits; b++) + for (var b = a + 1; b < numUnits; b++) { if (units[a].position() == units[b].position()) { diff --git a/spatial-partition/src/main/java/com/iluwatar/spatialpartition/App.java b/spatial-partition/src/main/java/com/iluwatar/spatialpartition/App.java index 9a24f22299f3fd687da836a7cba8b6340bb4eaf3..8a0e2383c29310f6cff2a78e35e01fd7595d6482 100644 --- a/spatial-partition/src/main/java/com/iluwatar/spatialpartition/App.java +++ b/spatial-partition/src/main/java/com/iluwatar/spatialpartition/App.java @@ -23,8 +23,6 @@ package com.iluwatar.spatialpartition; -import java.util.ArrayList; -import java.util.Enumeration; import java.util.Hashtable; import java.util.Random; import org.slf4j.Logger; @@ -62,58 +60,46 @@ import org.slf4j.LoggerFactory; public class App { private static final Logger LOGGER = LoggerFactory.getLogger(App.class); - static void noSpatialPartition(int height, int width, - int numOfMovements, Hashtable bubbles) { - ArrayList bubblesToCheck = new ArrayList(); - for (Enumeration e = bubbles.keys(); e.hasMoreElements(); ) { - bubblesToCheck.add(bubbles - .get(e.nextElement())); //all bubbles have to be checked for collision for all bubbles - } + static void noSpatialPartition(int numOfMovements, Hashtable bubbles) { + //all bubbles have to be checked for collision for all bubbles + var bubblesToCheck = bubbles.values(); //will run numOfMovement times or till all bubbles have popped while (numOfMovements > 0 && !bubbles.isEmpty()) { - for (Enumeration e = bubbles.keys(); e.hasMoreElements(); ) { - Integer i = e.nextElement(); + bubbles.forEach((i, bubble) -> { // bubble moves, new position gets updated // and collisions are checked with all bubbles in bubblesToCheck - bubbles.get(i).move(); - bubbles.replace(i, bubbles.get(i)); - bubbles.get(i).handleCollision(bubblesToCheck, bubbles); - } + bubble.move(); + bubbles.replace(i, bubble); + bubble.handleCollision(bubblesToCheck, bubbles); + }); numOfMovements--; } - for (Integer key : bubbles.keySet()) { - //bubbles not popped - LOGGER.info("Bubble " + key + " not popped"); - } + //bubbles not popped + bubbles.keySet().stream().map(key -> "Bubble " + key + " not popped").forEach(LOGGER::info); } static void withSpatialPartition( int height, int width, int numOfMovements, Hashtable bubbles) { //creating quadtree - Rect rect = new Rect(width / 2, height / 2, width, height); - QuadTree quadTree = new QuadTree(rect, 4); + var rect = new Rect(width / 2, height / 2, width, height); + var quadTree = new QuadTree(rect, 4); //will run numOfMovement times or till all bubbles have popped while (numOfMovements > 0 && !bubbles.isEmpty()) { //quadtree updated each time - for (Enumeration e = bubbles.keys(); e.hasMoreElements(); ) { - quadTree.insert(bubbles.get(e.nextElement())); - } - for (Enumeration e = bubbles.keys(); e.hasMoreElements(); ) { - Integer i = e.nextElement(); + bubbles.values().forEach(quadTree::insert); + bubbles.forEach((i, bubble) -> { //bubble moves, new position gets updated, quadtree used to reduce computations - bubbles.get(i).move(); - bubbles.replace(i, bubbles.get(i)); - SpatialPartitionBubbles sp = new SpatialPartitionBubbles(bubbles, quadTree); - sp.handleCollisionsUsingQt(bubbles.get(i)); - } + bubble.move(); + bubbles.replace(i, bubble); + var sp = new SpatialPartitionBubbles(bubbles, quadTree); + sp.handleCollisionsUsingQt(bubble); + }); numOfMovements--; } - for (Integer key : bubbles.keySet()) { - //bubbles not popped - LOGGER.info("Bubble " + key + " not popped"); - } + //bubbles not popped + bubbles.keySet().stream().map(key -> "Bubble " + key + " not popped").forEach(LOGGER::info); } /** @@ -123,23 +109,23 @@ public class App { */ public static void main(String[] args) { - Hashtable bubbles1 = new Hashtable(); - Hashtable bubbles2 = new Hashtable(); - Random rand = new Random(); + var bubbles1 = new Hashtable(); + var bubbles2 = new Hashtable(); + var rand = new Random(); for (int i = 0; i < 10000; i++) { - Bubble b = new Bubble(rand.nextInt(300), rand.nextInt(300), i, rand.nextInt(2) + 1); + var b = new Bubble(rand.nextInt(300), rand.nextInt(300), i, rand.nextInt(2) + 1); bubbles1.put(i, b); bubbles2.put(i, b); LOGGER.info("Bubble " + i + " with radius " + b.radius + " added at (" + b.coordinateX + "," + b.coordinateY + ")"); } - long start1 = System.currentTimeMillis(); - App.noSpatialPartition(300, 300, 20, bubbles1); - long end1 = System.currentTimeMillis(); - long start2 = System.currentTimeMillis(); + var start1 = System.currentTimeMillis(); + App.noSpatialPartition(20, bubbles1); + var end1 = System.currentTimeMillis(); + var start2 = System.currentTimeMillis(); App.withSpatialPartition(300, 300, 20, bubbles2); - long end2 = System.currentTimeMillis(); + var end2 = System.currentTimeMillis(); LOGGER.info("Without spatial partition takes " + (end1 - start1) + "ms"); LOGGER.info("With spatial partition takes " + (end2 - start2) + "ms"); } diff --git a/spatial-partition/src/main/java/com/iluwatar/spatialpartition/Bubble.java b/spatial-partition/src/main/java/com/iluwatar/spatialpartition/Bubble.java index 57dc06491cc61bb820ad3bbc4dbd2fd180390337..9c39c29c85424a3125714d5c70a4acf37cc5ce4a 100644 --- a/spatial-partition/src/main/java/com/iluwatar/spatialpartition/Bubble.java +++ b/spatial-partition/src/main/java/com/iluwatar/spatialpartition/Bubble.java @@ -23,7 +23,7 @@ package com.iluwatar.spatialpartition; -import java.util.ArrayList; +import java.util.Collection; import java.util.Hashtable; import java.util.Random; import org.slf4j.Logger; @@ -64,10 +64,10 @@ public class Bubble extends Point { allBubbles.remove(this.id); } - void handleCollision(ArrayList bubblesToCheck, Hashtable allBubbles) { - boolean toBePopped = false; //if any other bubble collides with it, made true - for (int i = 0; i < bubblesToCheck.size(); i++) { - Integer otherId = bubblesToCheck.get(i).id; + void handleCollision(Collection toCheck, Hashtable allBubbles) { + var toBePopped = false; //if any other bubble collides with it, made true + for (var point : toCheck) { + var otherId = point.id; if (allBubbles.get(otherId) != null && //the bubble hasn't been popped yet this.id != otherId && //the two bubbles are not the same this.touches(allBubbles.get(otherId))) { //the bubbles touch diff --git a/spatial-partition/src/main/java/com/iluwatar/spatialpartition/Point.java b/spatial-partition/src/main/java/com/iluwatar/spatialpartition/Point.java index ed4fb22cdbc8740f8bcd66417fbfea10d6e522b5..410beae349a7fb97acb86e000848b892efb241b4 100644 --- a/spatial-partition/src/main/java/com/iluwatar/spatialpartition/Point.java +++ b/spatial-partition/src/main/java/com/iluwatar/spatialpartition/Point.java @@ -23,7 +23,7 @@ package com.iluwatar.spatialpartition; -import java.util.ArrayList; +import java.util.Collection; import java.util.Hashtable; /** @@ -61,8 +61,8 @@ public abstract class Point { /** * handling interactions/collisions with other objects. * - * @param pointsToCheck contains the objects which need to be checked - * @param allPoints contains hashtable of all points on field at this time + * @param toCheck contains the objects which need to be checked + * @param all contains hashtable of all points on field at this time */ - abstract void handleCollision(ArrayList pointsToCheck, Hashtable allPoints); + abstract void handleCollision(Collection toCheck, Hashtable all); } diff --git a/spatial-partition/src/main/java/com/iluwatar/spatialpartition/QuadTree.java b/spatial-partition/src/main/java/com/iluwatar/spatialpartition/QuadTree.java index 79731e6acba181ef89d4b2bd3b789574cffdc8ea..5eda3df2ebe2335ce1358f241a05001e3f6ba8f1 100644 --- a/spatial-partition/src/main/java/com/iluwatar/spatialpartition/QuadTree.java +++ b/spatial-partition/src/main/java/com/iluwatar/spatialpartition/QuadTree.java @@ -23,8 +23,7 @@ package com.iluwatar.spatialpartition; -import java.util.ArrayList; -import java.util.Enumeration; +import java.util.Collection; import java.util.Hashtable; /** @@ -47,7 +46,7 @@ public class QuadTree { this.boundary = boundary; this.capacity = capacity; this.divided = false; - this.points = new Hashtable(); + this.points = new Hashtable<>(); this.northwest = null; this.northeast = null; this.southwest = null; @@ -76,30 +75,29 @@ public class QuadTree { } void divide() { - double x = this.boundary.coordinateX; - double y = this.boundary.coordinateY; - double width = this.boundary.width; - double height = this.boundary.height; - Rect nw = new Rect(x - width / 4, y + height / 4, width / 2, height / 2); + var x = this.boundary.coordinateX; + var y = this.boundary.coordinateY; + var width = this.boundary.width; + var height = this.boundary.height; + var nw = new Rect(x - width / 4, y + height / 4, width / 2, height / 2); this.northwest = new QuadTree(nw, this.capacity); - Rect ne = new Rect(x + width / 4, y + height / 4, width / 2, height / 2); + var ne = new Rect(x + width / 4, y + height / 4, width / 2, height / 2); this.northeast = new QuadTree(ne, this.capacity); - Rect sw = new Rect(x - width / 4, y - height / 4, width / 2, height / 2); + var sw = new Rect(x - width / 4, y - height / 4, width / 2, height / 2); this.southwest = new QuadTree(sw, this.capacity); - Rect se = new Rect(x + width / 4, y - height / 4, width / 2, height / 2); + var se = new Rect(x + width / 4, y - height / 4, width / 2, height / 2); this.southeast = new QuadTree(se, this.capacity); this.divided = true; } - ArrayList query(Rect r, ArrayList relevantPoints) { + Collection query(Rect r, Collection relevantPoints) { //could also be a circle instead of a rectangle if (this.boundary.intersects(r)) { - for (Enumeration e = this.points.keys(); e.hasMoreElements(); ) { - Integer i = e.nextElement(); - if (r.contains(this.points.get(i))) { - relevantPoints.add(this.points.get(i)); - } - } + this.points + .values() + .stream() + .filter(r::contains) + .forEach(relevantPoints::add); if (this.divided) { this.northwest.query(r, relevantPoints); this.northeast.query(r, relevantPoints); diff --git a/spatial-partition/src/main/java/com/iluwatar/spatialpartition/SpatialPartitionBubbles.java b/spatial-partition/src/main/java/com/iluwatar/spatialpartition/SpatialPartitionBubbles.java index 3dd6c113b6a87b297d4e3848b144a588be7eca96..b3f60632f5d961b4c568332a10496726eebc8b17 100644 --- a/spatial-partition/src/main/java/com/iluwatar/spatialpartition/SpatialPartitionBubbles.java +++ b/spatial-partition/src/main/java/com/iluwatar/spatialpartition/SpatialPartitionBubbles.java @@ -24,6 +24,7 @@ package com.iluwatar.spatialpartition; import java.util.ArrayList; +import java.util.Collection; import java.util.Hashtable; /** @@ -44,8 +45,8 @@ public class SpatialPartitionBubbles extends SpatialPartitionGeneric { void handleCollisionsUsingQt(Bubble b) { // finding points within area of a square drawn with centre same as // centre of bubble and length = radius of bubble - Rect rect = new Rect(b.coordinateX, b.coordinateY, 2 * b.radius, 2 * b.radius); - ArrayList quadTreeQueryResult = new ArrayList(); + var rect = new Rect(b.coordinateX, b.coordinateY, 2 * b.radius, 2 * b.radius); + var quadTreeQueryResult = new ArrayList(); this.quadTree.query(rect, quadTreeQueryResult); //handling these collisions b.handleCollision(quadTreeQueryResult, this.bubbles); diff --git a/spatial-partition/src/test/java/com/iluwatar/spatialpartition/BubbleTest.java b/spatial-partition/src/test/java/com/iluwatar/spatialpartition/BubbleTest.java index c9fab045b00693c582f195e4ced35512cb0711f1..957a36ce37f0c6ed99e302a5785c7a31c74bede6 100644 --- a/spatial-partition/src/test/java/com/iluwatar/spatialpartition/BubbleTest.java +++ b/spatial-partition/src/test/java/com/iluwatar/spatialpartition/BubbleTest.java @@ -23,62 +23,71 @@ package com.iluwatar.spatialpartition; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + import java.util.ArrayList; import java.util.Hashtable; import org.junit.jupiter.api.Test; /** -* Testing methods in Bubble class. -*/ + * Testing methods in Bubble class. + */ class BubbleTest { @Test void moveTest() { - Bubble b = new Bubble(10,10,1,2); - int initialX = b.coordinateX; - int initialY = b.coordinateY; + var b = new Bubble(10, 10, 1, 2); + var initialX = b.coordinateX; + var initialY = b.coordinateY; b.move(); //change in x and y < |2| - assertTrue((b.coordinateX - initialX < 2 && b.coordinateX - initialX > -2) && (b.coordinateY - initialY < 2 && b.coordinateY - initialY > -2)); + assertTrue(b.coordinateX - initialX < 2 && b.coordinateX - initialX > -2); + assertTrue(b.coordinateY - initialY < 2 && b.coordinateY - initialY > -2); } @Test void touchesTest() { - Bubble b1 = new Bubble(0,0,1,2); - Bubble b2 = new Bubble(1,1,2,1); - Bubble b3 = new Bubble(10,10,3,1); + var b1 = new Bubble(0, 0, 1, 2); + var b2 = new Bubble(1, 1, 2, 1); + var b3 = new Bubble(10, 10, 3, 1); //b1 touches b2 but not b3 - assertTrue(b1.touches(b2) && !b1.touches(b3)); + assertTrue(b1.touches(b2)); + assertFalse(b1.touches(b3)); } @Test void popTest() { - Bubble b1 = new Bubble(10,10,1,2); - Bubble b2 = new Bubble(0,0,2,2); - Hashtable bubbles = new Hashtable(); - bubbles.put(1, b1); + var b1 = new Bubble(10, 10, 1, 2); + var b2 = new Bubble(0, 0, 2, 2); + var bubbles = new Hashtable(); + bubbles.put(1, b1); bubbles.put(2, b2); b1.pop(bubbles); //after popping, bubble no longer in hashtable containing all bubbles - assertTrue(bubbles.get(1) == null && bubbles.get(2) != null); + assertNull(bubbles.get(1)); + assertNotNull(bubbles.get(2)); } @Test void handleCollisionTest() { - Bubble b1 = new Bubble(0,0,1,2); - Bubble b2 = new Bubble(1,1,2,1); - Bubble b3 = new Bubble(10,10,3,1); - Hashtable bubbles = new Hashtable(); - bubbles.put(1, b1); - bubbles.put(2, b2); + var b1 = new Bubble(0, 0, 1, 2); + var b2 = new Bubble(1, 1, 2, 1); + var b3 = new Bubble(10, 10, 3, 1); + var bubbles = new Hashtable(); + bubbles.put(1, b1); + bubbles.put(2, b2); bubbles.put(3, b3); - ArrayList bubblesToCheck = new ArrayList(); - bubblesToCheck.add(b2); + var bubblesToCheck = new ArrayList(); + bubblesToCheck.add(b2); bubblesToCheck.add(b3); b1.handleCollision(bubblesToCheck, bubbles); //b1 touches b2 and not b3, so b1, b2 will be popped - assertTrue(bubbles.get(1) == null && bubbles.get(2) == null && bubbles.get(3) != null); + assertNull(bubbles.get(1)); + assertNull(bubbles.get(2)); + assertNotNull(bubbles.get(3)); } } diff --git a/spatial-partition/src/test/java/com/iluwatar/spatialpartition/QuadTreeTest.java b/spatial-partition/src/test/java/com/iluwatar/spatialpartition/QuadTreeTest.java index 9335cd9c96417eaa696f56b970d60cf3c16a2455..66306fa3642319703824f056c22c2fb84ea20ca6 100644 --- a/spatial-partition/src/test/java/com/iluwatar/spatialpartition/QuadTreeTest.java +++ b/spatial-partition/src/test/java/com/iluwatar/spatialpartition/QuadTreeTest.java @@ -23,12 +23,13 @@ package com.iluwatar.spatialpartition; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; + import java.util.ArrayList; +import java.util.Collection; import java.util.Hashtable; import java.util.Random; - - +import java.util.stream.Collectors; import org.junit.jupiter.api.Test; /** @@ -39,41 +40,34 @@ class QuadTreeTest { @Test void queryTest() { - ArrayList points = new ArrayList(); - Random rand = new Random(); + var points = new ArrayList(); + var rand = new Random(); for (int i = 0; i < 20; i++) { - Bubble p = new Bubble(rand.nextInt(300), rand.nextInt(300), i, rand.nextInt(2) + 1); + var p = new Bubble(rand.nextInt(300), rand.nextInt(300), i, rand.nextInt(2) + 1); points.add(p); } - Rect field = new Rect(150,150,300,300); //size of field - Rect queryRange = new Rect(70,130,100,100); //result = all points lying in this rectangle + var field = new Rect(150, 150, 300, 300); //size of field + var queryRange = new Rect(70, 130, 100, 100); //result = all points lying in this rectangle //points found in the query range using quadtree and normal method is same - assertTrue(QuadTreeTest.quadTreeTest(points, field, queryRange).equals(QuadTreeTest.verify(points, queryRange))); + var points1 = QuadTreeTest.quadTreeTest(points, field, queryRange); + var points2 = QuadTreeTest.verify(points, queryRange); + assertEquals(points1, points2); } - static Hashtable quadTreeTest(ArrayList points, Rect field, Rect queryRange) { + static Hashtable quadTreeTest(Collection points, Rect field, Rect queryRange) { //creating quadtree and inserting all points - QuadTree qTree = new QuadTree(queryRange, 4); - for (int i = 0; i < points.size(); i++) { - qTree.insert(points.get(i)); - } + var qTree = new QuadTree(queryRange, 4); + points.forEach(qTree::insert); - ArrayList queryResult = qTree.query(field, new ArrayList()); - Hashtable result = new Hashtable(); - for (int i = 0; i < queryResult.size(); i++) { - Point p = queryResult.get(i); - result.put(p.id, p); - } - return result; + return qTree + .query(field, new ArrayList<>()) + .stream() + .collect(Collectors.toMap(p -> p.id, p -> p, (a, b) -> b, Hashtable::new)); } - static Hashtable verify(ArrayList points, Rect queryRange) { - Hashtable result = new Hashtable(); - for (int i = 0; i < points.size(); i++) { - if (queryRange.contains(points.get(i))) { - result.put(points.get(i).id, points.get(i)); - } - } - return result; + static Hashtable verify(Collection points, Rect queryRange) { + return points.stream() + .filter(queryRange::contains) + .collect(Collectors.toMap(point -> point.id, point -> point, (a, b) -> b, Hashtable::new)); } } diff --git a/spatial-partition/src/test/java/com/iluwatar/spatialpartition/RectTest.java b/spatial-partition/src/test/java/com/iluwatar/spatialpartition/RectTest.java index 599b0d9f48aed97964e8df74498a172e0ca17626..8ec4b992e3a64aca017612f921c31ba3deacf170 100644 --- a/spatial-partition/src/test/java/com/iluwatar/spatialpartition/RectTest.java +++ b/spatial-partition/src/test/java/com/iluwatar/spatialpartition/RectTest.java @@ -23,7 +23,9 @@ package com.iluwatar.spatialpartition; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + import org.junit.jupiter.api.Test; /** @@ -34,19 +36,21 @@ class RectTest { @Test void containsTest() { - Rect r = new Rect(10,10,20,20); - Bubble b1 = new Bubble(2,2,1,1); - Bubble b2 = new Bubble(30,30,2,1); + var r = new Rect(10, 10, 20, 20); + var b1 = new Bubble(2, 2, 1, 1); + var b2 = new Bubble(30, 30, 2, 1); //r contains b1 and not b2 - assertTrue(r.contains(b1) && !r.contains(b2)); + assertTrue(r.contains(b1)); + assertFalse(r.contains(b2)); } @Test void intersectsTest() { - Rect r1 = new Rect(10,10,20,20); - Rect r2 = new Rect(15,15,20,20); - Rect r3 = new Rect(50,50,20,20); + var r1 = new Rect(10, 10, 20, 20); + var r2 = new Rect(15, 15, 20, 20); + var r3 = new Rect(50, 50, 20, 20); //r1 intersects r2 and not r3 - assertTrue(r1.intersects(r2) && !r1.intersects(r3)); + assertTrue(r1.intersects(r2)); + assertFalse(r1.intersects(r3)); } } diff --git a/spatial-partition/src/test/java/com/iluwatar/spatialpartition/SpatialPartitionBubblesTest.java b/spatial-partition/src/test/java/com/iluwatar/spatialpartition/SpatialPartitionBubblesTest.java index aac2e0d69992ba1d10df01252c6cbab6bbd831ed..3470b27ccba0e63ce3306da0e3fbaf24576ec452 100644 --- a/spatial-partition/src/test/java/com/iluwatar/spatialpartition/SpatialPartitionBubblesTest.java +++ b/spatial-partition/src/test/java/com/iluwatar/spatialpartition/SpatialPartitionBubblesTest.java @@ -23,7 +23,9 @@ package com.iluwatar.spatialpartition; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; + import java.util.Hashtable; import org.junit.jupiter.api.Test; @@ -35,24 +37,27 @@ class SpatialPartitionBubblesTest { @Test void handleCollisionsUsingQtTest() { - Bubble b1 = new Bubble(10,10,1,3); - Bubble b2 = new Bubble(5,5,2,1); - Bubble b3 = new Bubble(9,9,3,1); - Bubble b4 = new Bubble(8,8,4,2); - Hashtable bubbles = new Hashtable(); - bubbles.put(1, b1); - bubbles.put(2, b2); - bubbles.put(3, b3); + var b1 = new Bubble(10, 10, 1, 3); + var b2 = new Bubble(5, 5, 2, 1); + var b3 = new Bubble(9, 9, 3, 1); + var b4 = new Bubble(8, 8, 4, 2); + var bubbles = new Hashtable(); + bubbles.put(1, b1); + bubbles.put(2, b2); + bubbles.put(3, b3); bubbles.put(4, b4); - Rect r = new Rect(10,10,20,20); - QuadTree qt = new QuadTree(r,4); - qt.insert(b1); - qt.insert(b2); - qt.insert(b3); + var r = new Rect(10, 10, 20, 20); + var qt = new QuadTree(r, 4); + qt.insert(b1); + qt.insert(b2); + qt.insert(b3); qt.insert(b4); - SpatialPartitionBubbles sp = new SpatialPartitionBubbles(bubbles, qt); + var sp = new SpatialPartitionBubbles(bubbles, qt); sp.handleCollisionsUsingQt(b1); //b1 touches b3 and b4 but not b2 - so b1,b3,b4 get popped - assertTrue(bubbles.get(1) == null && bubbles.get(2) != null && bubbles.get(3) == null && bubbles.get(4) == null); + assertNull(bubbles.get(1)); + assertNotNull(bubbles.get(2)); + assertNull(bubbles.get(3)); + assertNull(bubbles.get(4)); } } diff --git a/specification/README.md b/specification/README.md index d5e7edf20beda63d01fe227fc566f9720d96a89c..6e52bd2e77b726c8f261efd9db4a87c8b66b1760 100644 --- a/specification/README.md +++ b/specification/README.md @@ -100,24 +100,24 @@ public class MassGreaterThanSelector extends AbstractSelector { With these building blocks in place, we can perform a search for red creatures as follows: ```java - List redCreatures = creatures.stream().filter(new ColorSelector(Color.RED)) + var redCreatures = creatures.stream().filter(new ColorSelector(Color.RED)) .collect(Collectors.toList()); ``` But we could also use our parameterized selector like this: ```java - List heavyCreatures = creatures.stream().filter(new MassGreaterThanSelector(500.0) + var heavyCreatures = creatures.stream().filter(new MassGreaterThanSelector(500.0) .collect(Collectors.toList()); ``` Our third option is to combine multiple selectors together. Performing a search for special creatures (defined as red, flying, and not small) could be done as follows: ```java - AbstractSelector specialCreaturesSelector = + var specialCreaturesSelector = new ColorSelector(Color.RED).and(new MovementSelector(Movement.FLYING)).and(new SizeSelector(Size.SMALL).not()); - List specialCreatures = creatures.stream().filter(specialCreaturesSelector) + var specialCreatures = creatures.stream().filter(specialCreaturesSelector) .collect(Collectors.toList()); ``` diff --git a/specification/src/main/java/com/iluwatar/specification/app/App.java b/specification/src/main/java/com/iluwatar/specification/app/App.java index 2f9633313d8349a17473e044858dd3722d70793f..2ccb3047fa5283129d4b07b8c4582ddffef0c195 100644 --- a/specification/src/main/java/com/iluwatar/specification/app/App.java +++ b/specification/src/main/java/com/iluwatar/specification/app/App.java @@ -32,14 +32,14 @@ import com.iluwatar.specification.creature.Shark; import com.iluwatar.specification.creature.Troll; import com.iluwatar.specification.property.Color; import com.iluwatar.specification.property.Movement; -import com.iluwatar.specification.selector.AbstractSelector; import com.iluwatar.specification.selector.ColorSelector; import com.iluwatar.specification.selector.MassEqualSelector; import com.iluwatar.specification.selector.MassGreaterThanSelector; import com.iluwatar.specification.selector.MassSmallerThanOrEqSelector; import com.iluwatar.specification.selector.MovementSelector; import java.util.List; -import java.util.stream.Collectors; +import java.util.Objects; +import java.util.function.Predicate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -63,57 +63,47 @@ public class App { */ public static void main(String[] args) { // initialize creatures list - List creatures = List.of(new Goblin(), new Octopus(), new Dragon(), new Shark(), - new Troll(), new KillerBee()); + var creatures = List.of( + new Goblin(), + new Octopus(), + new Dragon(), + new Shark(), + new Troll(), + new KillerBee() + ); // so-called "hard-coded" specification LOGGER.info("Demonstrating hard-coded specification :"); // find all walking creatures LOGGER.info("Find all walking creatures"); - List walkingCreatures = - creatures.stream().filter(new MovementSelector(Movement.WALKING)) - .collect(Collectors.toList()); - walkingCreatures.forEach(c -> LOGGER.info(c.toString())); + print(creatures, new MovementSelector(Movement.WALKING)); // find all dark creatures LOGGER.info("Find all dark creatures"); - List darkCreatures = - creatures.stream().filter(new ColorSelector(Color.DARK)).collect(Collectors.toList()); - darkCreatures.forEach(c -> LOGGER.info(c.toString())); - + print(creatures, new ColorSelector(Color.DARK)); LOGGER.info("\n"); // so-called "parameterized" specification LOGGER.info("Demonstrating parameterized specification :"); // find all creatures heavier than 500kg LOGGER.info("Find all creatures heavier than 600kg"); - List heavyCreatures = - creatures.stream().filter(new MassGreaterThanSelector(600.0)) - .collect(Collectors.toList()); - heavyCreatures.forEach(c -> LOGGER.info(c.toString())); + print(creatures, new MassGreaterThanSelector(600.0)); // find all creatures heavier than 500kg LOGGER.info("Find all creatures lighter than or weighing exactly 500kg"); - List lightCreatures = - creatures.stream().filter(new MassSmallerThanOrEqSelector(500.0)) - .collect(Collectors.toList()); - lightCreatures.forEach(c -> LOGGER.info(c.toString())); - + print(creatures, new MassSmallerThanOrEqSelector(500.0)); LOGGER.info("\n"); // so-called "composite" specification LOGGER.info("Demonstrating composite specification :"); // find all red and flying creatures LOGGER.info("Find all red and flying creatures"); - List redAndFlyingCreatures = - creatures.stream() - .filter(new ColorSelector(Color.RED).and(new MovementSelector(Movement.FLYING))) - .collect(Collectors.toList()); - redAndFlyingCreatures.forEach(c -> LOGGER.info(c.toString())); + var redAndFlying = new ColorSelector(Color.RED).and(new MovementSelector(Movement.FLYING)); + print(creatures, redAndFlying); // find all creatures dark or red, non-swimming, and heavier than or equal to 400kg LOGGER.info("Find all scary creatures"); - AbstractSelector scaryCreaturesSelector = new ColorSelector(Color.DARK) + var scaryCreaturesSelector = new ColorSelector(Color.DARK) .or(new ColorSelector(Color.RED)).and(new MovementSelector(Movement.SWIMMING).not()) .and(new MassGreaterThanSelector(400.0).or(new MassEqualSelector(400.0))); - List scaryCreatures = - creatures.stream() - .filter(scaryCreaturesSelector) - .collect(Collectors.toList()); - scaryCreatures.forEach(c -> LOGGER.info(c.toString())); + print(creatures, scaryCreaturesSelector); + } + + private static void print(List creatures, Predicate selector) { + creatures.stream().filter(selector).map(Objects::toString).forEach(LOGGER::info); } } diff --git a/specification/src/test/java/com/iluwatar/specification/app/AppTest.java b/specification/src/test/java/com/iluwatar/specification/app/AppTest.java index 7585a113d34d7b56f31d14ee1bf0ee1a4b129598..bc6f2226f6f80108c33214dd77e356a2e1943140 100644 --- a/specification/src/test/java/com/iluwatar/specification/app/AppTest.java +++ b/specification/src/test/java/com/iluwatar/specification/app/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/specification/src/test/java/com/iluwatar/specification/creature/CreatureTest.java b/specification/src/test/java/com/iluwatar/specification/creature/CreatureTest.java index 58af7248a867efe6a7343977bb750cd6ce7123fd..c0a10c19ee74be94c4bf85afd58c50864b20bc02 100644 --- a/specification/src/test/java/com/iluwatar/specification/creature/CreatureTest.java +++ b/specification/src/test/java/com/iluwatar/specification/creature/CreatureTest.java @@ -83,27 +83,24 @@ public class CreatureTest { @ParameterizedTest @MethodSource("dataProvider") public void testGetColor(Creature testedCreature, String name, Size size, Movement movement, - Color color) { + Color color) { assertEquals(color, testedCreature.getColor()); } @ParameterizedTest @MethodSource("dataProvider") public void testGetMass(Creature testedCreature, String name, Size size, Movement movement, - Color color, Mass mass) { + Color color, Mass mass) { assertEquals(mass, testedCreature.getMass()); } @ParameterizedTest @MethodSource("dataProvider") public void testToString(Creature testedCreature, String name, Size size, Movement movement, - Color color, Mass mass) { - final String toString = testedCreature.toString(); + Color color, Mass mass) { + final var toString = testedCreature.toString(); assertNotNull(toString); - assertEquals( - String.format("%s [size=%s, movement=%s, color=%s, mass=%s]", name, size, movement, color, - mass), - toString - ); + assertEquals(String + .format("%s [size=%s, movement=%s, color=%s, mass=%s]", name, size, movement, color, mass), toString); } } \ No newline at end of file diff --git a/specification/src/test/java/com/iluwatar/specification/selector/ColorSelectorTest.java b/specification/src/test/java/com/iluwatar/specification/selector/ColorSelectorTest.java index f1029063dc5067ae9952b24cccc68e99e5d60fef..61224819fd1ad625c113811ed305d382d5904e7e 100644 --- a/specification/src/test/java/com/iluwatar/specification/selector/ColorSelectorTest.java +++ b/specification/src/test/java/com/iluwatar/specification/selector/ColorSelectorTest.java @@ -44,13 +44,13 @@ public class ColorSelectorTest { */ @Test public void testColor() { - final Creature greenCreature = mock(Creature.class); + final var greenCreature = mock(Creature.class); when(greenCreature.getColor()).thenReturn(Color.GREEN); - final Creature redCreature = mock(Creature.class); + final var redCreature = mock(Creature.class); when(redCreature.getColor()).thenReturn(Color.RED); - final ColorSelector greenSelector = new ColorSelector(Color.GREEN); + final var greenSelector = new ColorSelector(Color.GREEN); assertTrue(greenSelector.test(greenCreature)); assertFalse(greenSelector.test(redCreature)); diff --git a/specification/src/test/java/com/iluwatar/specification/selector/CompositeSelectorsTest.java b/specification/src/test/java/com/iluwatar/specification/selector/CompositeSelectorsTest.java index 75809c54280f6f32b7a58ec50fe225de558bd0ca..62febf78dc2c25a51da94981c4fd5143c365eb1d 100644 --- a/specification/src/test/java/com/iluwatar/specification/selector/CompositeSelectorsTest.java +++ b/specification/src/test/java/com/iluwatar/specification/selector/CompositeSelectorsTest.java @@ -40,16 +40,16 @@ public class CompositeSelectorsTest { */ @Test public void testAndComposition() { - final Creature swimmingHeavyCreature = mock(Creature.class); + final var swimmingHeavyCreature = mock(Creature.class); when(swimmingHeavyCreature.getMovement()).thenReturn(Movement.SWIMMING); when(swimmingHeavyCreature.getMass()).thenReturn(new Mass(100.0)); - final Creature swimmingLightCreature = mock(Creature.class); + final var swimmingLightCreature = mock(Creature.class); when(swimmingLightCreature.getMovement()).thenReturn(Movement.SWIMMING); when(swimmingLightCreature.getMass()).thenReturn(new Mass(25.0)); - final AbstractSelector lightAndSwimmingSelector = new MassSmallerThanOrEqSelector( - 50.0).and(new MovementSelector(Movement.SWIMMING)); + final var lightAndSwimmingSelector = new MassSmallerThanOrEqSelector(50.0) + .and(new MovementSelector(Movement.SWIMMING)); assertFalse(lightAndSwimmingSelector.test(swimmingHeavyCreature)); assertTrue(lightAndSwimmingSelector.test(swimmingLightCreature)); } @@ -59,15 +59,15 @@ public class CompositeSelectorsTest { */ @Test public void testOrComposition() { - final Creature swimmingHeavyCreature = mock(Creature.class); + final var swimmingHeavyCreature = mock(Creature.class); when(swimmingHeavyCreature.getMovement()).thenReturn(Movement.SWIMMING); when(swimmingHeavyCreature.getMass()).thenReturn(new Mass(100.0)); - final Creature swimmingLightCreature = mock(Creature.class); + final var swimmingLightCreature = mock(Creature.class); when(swimmingLightCreature.getMovement()).thenReturn(Movement.SWIMMING); when(swimmingLightCreature.getMass()).thenReturn(new Mass(25.0)); - final AbstractSelector lightOrSwimmingSelector = new MassSmallerThanOrEqSelector(50.0) + final var lightOrSwimmingSelector = new MassSmallerThanOrEqSelector(50.0) .or(new MovementSelector(Movement.SWIMMING)); assertTrue(lightOrSwimmingSelector.test(swimmingHeavyCreature)); assertTrue(lightOrSwimmingSelector.test(swimmingLightCreature)); @@ -78,15 +78,15 @@ public class CompositeSelectorsTest { */ @Test public void testNotComposition() { - final Creature swimmingHeavyCreature = mock(Creature.class); + final var swimmingHeavyCreature = mock(Creature.class); when(swimmingHeavyCreature.getMovement()).thenReturn(Movement.SWIMMING); when(swimmingHeavyCreature.getMass()).thenReturn(new Mass(100.0)); - final Creature swimmingLightCreature = mock(Creature.class); + final var swimmingLightCreature = mock(Creature.class); when(swimmingLightCreature.getMovement()).thenReturn(Movement.SWIMMING); when(swimmingLightCreature.getMass()).thenReturn(new Mass(25.0)); - final AbstractSelector heavySelector = new MassSmallerThanOrEqSelector(50.0).not(); + final var heavySelector = new MassSmallerThanOrEqSelector(50.0).not(); assertTrue(heavySelector.test(swimmingHeavyCreature)); assertFalse(heavySelector.test(swimmingLightCreature)); } diff --git a/specification/src/test/java/com/iluwatar/specification/selector/MassSelectorTest.java b/specification/src/test/java/com/iluwatar/specification/selector/MassSelectorTest.java index 287f401648e607d22af3585c5b7f6f69a9d19c67..346cf52317ffbaf88e14c2a7dcf2a18686a684a5 100644 --- a/specification/src/test/java/com/iluwatar/specification/selector/MassSelectorTest.java +++ b/specification/src/test/java/com/iluwatar/specification/selector/MassSelectorTest.java @@ -39,13 +39,13 @@ public class MassSelectorTest { */ @Test public void testMass() { - final Creature lightCreature = mock(Creature.class); + final var lightCreature = mock(Creature.class); when(lightCreature.getMass()).thenReturn(new Mass(50.0)); - final Creature heavyCreature = mock(Creature.class); + final var heavyCreature = mock(Creature.class); when(heavyCreature.getMass()).thenReturn(new Mass(2500.0)); - final MassSmallerThanOrEqSelector lightSelector = new MassSmallerThanOrEqSelector(500.0); + final var lightSelector = new MassSmallerThanOrEqSelector(500.0); assertTrue(lightSelector.test(lightCreature)); assertFalse(lightSelector.test(heavyCreature)); } diff --git a/specification/src/test/java/com/iluwatar/specification/selector/MovementSelectorTest.java b/specification/src/test/java/com/iluwatar/specification/selector/MovementSelectorTest.java index f3d2482ad9fc6384def6e9957edc24275225f18f..7a8b052aab7a13d35df480ad4f81be0630d3c634 100644 --- a/specification/src/test/java/com/iluwatar/specification/selector/MovementSelectorTest.java +++ b/specification/src/test/java/com/iluwatar/specification/selector/MovementSelectorTest.java @@ -44,13 +44,13 @@ public class MovementSelectorTest { */ @Test public void testMovement() { - final Creature swimmingCreature = mock(Creature.class); + final var swimmingCreature = mock(Creature.class); when(swimmingCreature.getMovement()).thenReturn(Movement.SWIMMING); - final Creature flyingCreature = mock(Creature.class); + final var flyingCreature = mock(Creature.class); when(flyingCreature.getMovement()).thenReturn(Movement.FLYING); - final MovementSelector swimmingSelector = new MovementSelector(Movement.SWIMMING); + final var swimmingSelector = new MovementSelector(Movement.SWIMMING); assertTrue(swimmingSelector.test(swimmingCreature)); assertFalse(swimmingSelector.test(flyingCreature)); diff --git a/specification/src/test/java/com/iluwatar/specification/selector/SizeSelectorTest.java b/specification/src/test/java/com/iluwatar/specification/selector/SizeSelectorTest.java index 7dcb30ee22f95bef09e1e1c9d56465c4d7455aa8..4fe9b72eb355f894d3df527b41c96e552de622b9 100644 --- a/specification/src/test/java/com/iluwatar/specification/selector/SizeSelectorTest.java +++ b/specification/src/test/java/com/iluwatar/specification/selector/SizeSelectorTest.java @@ -44,13 +44,13 @@ public class SizeSelectorTest { */ @Test public void testMovement() { - final Creature normalCreature = mock(Creature.class); + final var normalCreature = mock(Creature.class); when(normalCreature.getSize()).thenReturn(Size.NORMAL); - final Creature smallCreature = mock(Creature.class); + final var smallCreature = mock(Creature.class); when(smallCreature.getSize()).thenReturn(Size.SMALL); - final SizeSelector normalSelector = new SizeSelector(Size.NORMAL); + final var normalSelector = new SizeSelector(Size.NORMAL); assertTrue(normalSelector.test(normalCreature)); assertFalse(normalSelector.test(smallCreature)); } diff --git a/state/src/test/java/com/iluwatar/state/AppTest.java b/state/src/test/java/com/iluwatar/state/AppTest.java index b61fdcb10371c94d88ea8f67b1dbed9b3aebfae0..9f7b65ff2bd6e7548b9357454e7b8e61c714a8df 100644 --- a/state/src/test/java/com/iluwatar/state/AppTest.java +++ b/state/src/test/java/com/iluwatar/state/AppTest.java @@ -26,15 +26,12 @@ package com.iluwatar.state; 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/state/src/test/java/com/iluwatar/state/MammothTest.java b/state/src/test/java/com/iluwatar/state/MammothTest.java index 1286d74266d73a5205ac44ad89920c259795874f..15624c7abc74c5299d073dfbb23edacd37f873fd 100644 --- a/state/src/test/java/com/iluwatar/state/MammothTest.java +++ b/state/src/test/java/com/iluwatar/state/MammothTest.java @@ -23,20 +23,19 @@ package com.iluwatar.state; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; +import java.util.LinkedList; +import java.util.List; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.slf4j.LoggerFactory; -import java.util.LinkedList; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; - /** * Date: 12/29/15 - 8:27 PM * @@ -62,27 +61,27 @@ public class MammothTest { */ @Test public void testTimePasses() { - final Mammoth mammoth = new Mammoth(); + final var mammoth = new Mammoth(); mammoth.observe(); assertEquals("The mammoth is calm and peaceful.", appender.getLastMessage()); - assertEquals(1 , appender.getLogSize()); + assertEquals(1, appender.getLogSize()); mammoth.timePasses(); assertEquals("The mammoth gets angry!", appender.getLastMessage()); - assertEquals(2 , appender.getLogSize()); + assertEquals(2, appender.getLogSize()); mammoth.observe(); assertEquals("The mammoth is furious!", appender.getLastMessage()); - assertEquals(3 , appender.getLogSize()); + assertEquals(3, appender.getLogSize()); mammoth.timePasses(); assertEquals("The mammoth calms down.", appender.getLastMessage()); - assertEquals(4 , appender.getLogSize()); + assertEquals(4, appender.getLogSize()); mammoth.observe(); assertEquals("The mammoth is calm and peaceful.", appender.getLastMessage()); - assertEquals(5 , appender.getLogSize()); + assertEquals(5, appender.getLogSize()); } @@ -91,7 +90,7 @@ public class MammothTest { */ @Test public void testToString() { - final String toString = new Mammoth().toString(); + final var toString = new Mammoth().toString(); assertNotNull(toString); assertEquals("The mammoth", toString); } diff --git a/step-builder/src/main/java/com/iluwatar/stepbuilder/App.java b/step-builder/src/main/java/com/iluwatar/stepbuilder/App.java index 3a9021a0f65b5a82174ccb75c50ead0bf75cf599..5216b41064e35beb682d2d1c7d3f101a2e6d2dda 100644 --- a/step-builder/src/main/java/com/iluwatar/stepbuilder/App.java +++ b/step-builder/src/main/java/com/iluwatar/stepbuilder/App.java @@ -67,21 +67,34 @@ public class App { */ public static void main(String[] args) { - var warrior = - CharacterStepBuilder.newBuilder().name("Amberjill").fighterClass("Paladin") - .withWeapon("Sword").noAbilities().build(); + var warrior = CharacterStepBuilder + .newBuilder() + .name("Amberjill") + .fighterClass("Paladin") + .withWeapon("Sword") + .noAbilities() + .build(); LOGGER.info(warrior.toString()); - var mage = - CharacterStepBuilder.newBuilder().name("Riobard").wizardClass("Sorcerer") - .withSpell("Fireball").withAbility("Fire Aura").withAbility("Teleport") - .noMoreAbilities().build(); + var mage = CharacterStepBuilder + .newBuilder() + .name("Riobard") + .wizardClass("Sorcerer") + .withSpell("Fireball") + .withAbility("Fire Aura") + .withAbility("Teleport") + .noMoreAbilities() + .build(); LOGGER.info(mage.toString()); - var thief = - CharacterStepBuilder.newBuilder().name("Desmond").fighterClass("Rogue").noWeapon().build(); + var thief = CharacterStepBuilder + .newBuilder() + .name("Desmond") + .fighterClass("Rogue") + .noWeapon() + .build(); LOGGER.info(thief.toString()); } diff --git a/step-builder/src/main/java/com/iluwatar/stepbuilder/Character.java b/step-builder/src/main/java/com/iluwatar/stepbuilder/Character.java index ba460c06fa1ce11b65e9644d658c9ac3226a99e9..43bb874f8468751f734ef2bbe1cc0ab0b1405a1d 100644 --- a/step-builder/src/main/java/com/iluwatar/stepbuilder/Character.java +++ b/step-builder/src/main/java/com/iluwatar/stepbuilder/Character.java @@ -91,15 +91,15 @@ public class Character { @Override public String toString() { - var sb = new StringBuilder(); - sb.append("This is a ") + return new StringBuilder() + .append("This is a ") .append(fighterClass != null ? fighterClass : wizardClass) .append(" named ") .append(name) .append(" armed with a ") .append(weapon != null ? weapon : spell != null ? spell : "with nothing") .append(abilities != null ? " and wielding " + abilities + " abilities" : "") - .append('.'); - return sb.toString(); + .append('.') + .toString(); } } diff --git a/step-builder/src/main/java/com/iluwatar/stepbuilder/CharacterStepBuilder.java b/step-builder/src/main/java/com/iluwatar/stepbuilder/CharacterStepBuilder.java index 9eed4d8bce078e6fbb3de93b3e3f756826de9cf6..a0c7f84e6eba36125165b695294774e45d5a4c6b 100644 --- a/step-builder/src/main/java/com/iluwatar/stepbuilder/CharacterStepBuilder.java +++ b/step-builder/src/main/java/com/iluwatar/stepbuilder/CharacterStepBuilder.java @@ -165,7 +165,7 @@ public final class CharacterStepBuilder { @Override public Character build() { - Character character = new Character(name); + var character = new Character(name); if (fighterClass != null) { character.setFighterClass(fighterClass); diff --git a/step-builder/src/test/java/com/iluwatar/stepbuilder/AppTest.java b/step-builder/src/test/java/com/iluwatar/stepbuilder/AppTest.java index d4e99bc9ea1eb217711cf64dd9b8839e3883e993..1f3fc6238648d72d9cf40e895118a71f8c924e3a 100644 --- a/step-builder/src/test/java/com/iluwatar/stepbuilder/AppTest.java +++ b/step-builder/src/test/java/com/iluwatar/stepbuilder/AppTest.java @@ -26,15 +26,12 @@ package com.iluwatar.stepbuilder; 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/step-builder/src/test/java/com/iluwatar/stepbuilder/CharacterStepBuilderTest.java b/step-builder/src/test/java/com/iluwatar/stepbuilder/CharacterStepBuilderTest.java index 4c8ebbd3975a168a7b09ee020b0a3de6bdd4a1f3..f46541f971fe418d1cb0793fe6741aba8b2be4dd 100644 --- a/step-builder/src/test/java/com/iluwatar/stepbuilder/CharacterStepBuilderTest.java +++ b/step-builder/src/test/java/com/iluwatar/stepbuilder/CharacterStepBuilderTest.java @@ -23,15 +23,13 @@ package com.iluwatar.stepbuilder; -import org.junit.jupiter.api.Test; - -import java.util.List; - import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.Test; + /** * Date: 12/29/15 - 9:21 PM * @@ -44,7 +42,7 @@ public class CharacterStepBuilderTest { */ @Test public void testBuildWizard() { - final Character character = CharacterStepBuilder.newBuilder() + final var character = CharacterStepBuilder.newBuilder() .name("Merlin") .wizardClass("alchemist") .withSpell("poison") @@ -58,7 +56,7 @@ public class CharacterStepBuilderTest { assertEquals("poison", character.getSpell()); assertNotNull(character.toString()); - final List abilities = character.getAbilities(); + final var abilities = character.getAbilities(); assertNotNull(abilities); assertEquals(2, abilities.size()); assertTrue(abilities.contains("invisibility")); @@ -72,7 +70,7 @@ public class CharacterStepBuilderTest { */ @Test public void testBuildPoorWizard() { - final Character character = CharacterStepBuilder.newBuilder() + final var character = CharacterStepBuilder.newBuilder() .name("Merlin") .wizardClass("alchemist") .noSpell() @@ -91,7 +89,7 @@ public class CharacterStepBuilderTest { */ @Test public void testBuildWeakWizard() { - final Character character = CharacterStepBuilder.newBuilder() + final var character = CharacterStepBuilder.newBuilder() .name("Merlin") .wizardClass("alchemist") .withSpell("poison") @@ -112,7 +110,7 @@ public class CharacterStepBuilderTest { */ @Test public void testBuildWarrior() { - final Character character = CharacterStepBuilder.newBuilder() + final var character = CharacterStepBuilder.newBuilder() .name("Cuauhtemoc") .fighterClass("aztec") .withWeapon("spear") @@ -126,7 +124,7 @@ public class CharacterStepBuilderTest { assertEquals("spear", character.getWeapon()); assertNotNull(character.toString()); - final List abilities = character.getAbilities(); + final var abilities = character.getAbilities(); assertNotNull(abilities); assertEquals(2, abilities.size()); assertTrue(abilities.contains("speed")); @@ -140,7 +138,7 @@ public class CharacterStepBuilderTest { */ @Test public void testBuildPoorWarrior() { - final Character character = CharacterStepBuilder.newBuilder() + final var character = CharacterStepBuilder.newBuilder() .name("Poor warrior") .fighterClass("none") .noWeapon() @@ -160,7 +158,7 @@ public class CharacterStepBuilderTest { */ @Test public void testBuildWeakWarrior() { - final Character character = CharacterStepBuilder.newBuilder() + final var character = CharacterStepBuilder.newBuilder() .name("Weak warrior") .fighterClass("none") .withWeapon("Slingshot") diff --git a/strategy/src/test/java/com/iluwatar/strategy/AppTest.java b/strategy/src/test/java/com/iluwatar/strategy/AppTest.java index 713eecf43bdd0405872988fe3a4b0df513626e91..f1137c4c5f8621312a7e5cc97cfb9cb81f0da2e1 100644 --- a/strategy/src/test/java/com/iluwatar/strategy/AppTest.java +++ b/strategy/src/test/java/com/iluwatar/strategy/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/strategy/src/test/java/com/iluwatar/strategy/DragonSlayerTest.java b/strategy/src/test/java/com/iluwatar/strategy/DragonSlayerTest.java index c956126836b4fde258a3f7b1733233bae066e757..625aa5eaba65b4e61d4bba158060f0f4c0cfd420 100644 --- a/strategy/src/test/java/com/iluwatar/strategy/DragonSlayerTest.java +++ b/strategy/src/test/java/com/iluwatar/strategy/DragonSlayerTest.java @@ -41,8 +41,8 @@ public class DragonSlayerTest { */ @Test public void testGoToBattle() { - final DragonSlayingStrategy strategy = mock(DragonSlayingStrategy.class); - final DragonSlayer dragonSlayer = new DragonSlayer(strategy); + final var strategy = mock(DragonSlayingStrategy.class); + final var dragonSlayer = new DragonSlayer(strategy); dragonSlayer.goToBattle(); verify(strategy).execute(); @@ -54,13 +54,13 @@ public class DragonSlayerTest { */ @Test public void testChangeStrategy() { - final DragonSlayingStrategy initialStrategy = mock(DragonSlayingStrategy.class); - final DragonSlayer dragonSlayer = new DragonSlayer(initialStrategy); + final var initialStrategy = mock(DragonSlayingStrategy.class); + final var dragonSlayer = new DragonSlayer(initialStrategy); dragonSlayer.goToBattle(); verify(initialStrategy).execute(); - final DragonSlayingStrategy newStrategy = mock(DragonSlayingStrategy.class); + final var newStrategy = mock(DragonSlayingStrategy.class); dragonSlayer.changeStrategy(newStrategy); dragonSlayer.goToBattle(); diff --git a/strategy/src/test/java/com/iluwatar/strategy/DragonSlayingStrategyTest.java b/strategy/src/test/java/com/iluwatar/strategy/DragonSlayingStrategyTest.java index 15106cdd9f8df0795a462e2ad6b682550cad8a5b..cca82cefc06696ebbb260752b9d0b328ea53efd5 100644 --- a/strategy/src/test/java/com/iluwatar/strategy/DragonSlayingStrategyTest.java +++ b/strategy/src/test/java/com/iluwatar/strategy/DragonSlayingStrategyTest.java @@ -28,11 +28,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; - import java.util.Collection; import java.util.LinkedList; import java.util.List; - import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.params.ParameterizedTest; @@ -53,18 +51,18 @@ public class DragonSlayingStrategyTest { */ static Collection dataProvider() { return List.of( - new Object[]{ - new MeleeStrategy(), - "With your Excalibur you sever the dragon's head!" - }, - new Object[]{ - new ProjectileStrategy(), - "You shoot the dragon with the magical crossbow and it falls dead on the ground!" - }, - new Object[]{ - new SpellStrategy(), - "You cast the spell of disintegration and the dragon vaporizes in a pile of dust!" - } + new Object[]{ + new MeleeStrategy(), + "With your Excalibur you sever the dragon's head!" + }, + new Object[]{ + new ProjectileStrategy(), + "You shoot the dragon with the magical crossbow and it falls dead on the ground!" + }, + new Object[]{ + new SpellStrategy(), + "You cast the spell of disintegration and the dragon vaporizes in a pile of dust!" + } ); } diff --git a/subclass-sandbox/src/test/java/com/iluwatar/subclasssandbox/AppTest.java b/subclass-sandbox/src/test/java/com/iluwatar/subclasssandbox/AppTest.java index 51ed0d45505282117e3d8f917dbbb9ed03adfd35..83ba5315fd8039e0648390ddd3e2f3bb90467d2f 100644 --- a/subclass-sandbox/src/test/java/com/iluwatar/subclasssandbox/AppTest.java +++ b/subclass-sandbox/src/test/java/com/iluwatar/subclasssandbox/AppTest.java @@ -32,7 +32,6 @@ public class AppTest { @Test public void testMain() { - String[] args = {}; - App.main(args); + App.main(new String[]{}); } } diff --git a/subclass-sandbox/src/test/java/com/iluwatar/subclasssandbox/GroundDiveTest.java b/subclass-sandbox/src/test/java/com/iluwatar/subclasssandbox/GroundDiveTest.java index ff052a81eb300e467887769fa3112af02c562a29..97e2ac67d16f59f85ef97048ade38dfaad8060f3 100644 --- a/subclass-sandbox/src/test/java/com/iluwatar/subclasssandbox/GroundDiveTest.java +++ b/subclass-sandbox/src/test/java/com/iluwatar/subclasssandbox/GroundDiveTest.java @@ -70,8 +70,8 @@ public class GroundDiveTest { public void testActivate() { log.clearLog(); var groundDive = new GroundDive(); - groundDive.activate();; - String[] logs = log.getLog().split("\n"); + groundDive.activate(); + var logs = log.getLog().split("\n"); final var expectedSize = 3; final var log1 = logs[0].split("-")[1].trim() + " -" + logs[0].split("-")[2].trim(); final var expectedLog1 = "Move to ( 0.0, 0.0, -20.0 )"; diff --git a/subclass-sandbox/src/test/java/com/iluwatar/subclasssandbox/SkyLaunchTest.java b/subclass-sandbox/src/test/java/com/iluwatar/subclasssandbox/SkyLaunchTest.java index 58a349bb5dfd85cc905e6fac20ae48406641624b..e192737f632029ce9920dde113ffaeae61700691 100644 --- a/subclass-sandbox/src/test/java/com/iluwatar/subclasssandbox/SkyLaunchTest.java +++ b/subclass-sandbox/src/test/java/com/iluwatar/subclasssandbox/SkyLaunchTest.java @@ -70,8 +70,8 @@ public class SkyLaunchTest { public void testActivate() { log.clearLog(); var skyLaunch = new SkyLaunch(); - skyLaunch.activate();; - String[] logs = log.getLog().split("\n"); + skyLaunch.activate(); + var logs = log.getLog().split("\n"); final var expectedSize = 3; final var log1 = getLogContent(logs[0]); final var expectedLog1 = "Move to ( 0.0, 0.0, 20.0 )";