Repository: iluwatar/java-design-patterns
Issue: Monitor pattern is not being built
Labels: type: bug
info: good first issue
epic: build issue

In https://github.com/iluwatar/java-design-patterns/pull/1640 we merged the monitor pattern but noticed that it's not included in the main `pom.xml` and not being built. Let's fix that in this issue.

Issue comments:
I strongly recommend @Dev-AliGhasemi to take this up.
I do it but @ohbus i don't know where is the problem ! can you give me some tips to solve it ?
@Dev-AliGhasemi You need to add your monitor pattern to the parent pom.

Just like all the patterns are added as modules here in this line. You need to add your monitor pattern.

Write test cases for your code and resolve all the sonar-reported issues once you submit the PR.

Nothing to worry about we will guide you in each step to make it really successful.

***

So, are you willing to take it?
Yes .
i added monitor module to parent POM.

> i added monitor module to parent POM.

Please submit a PR

> > i added monitor module to parent POM.
> 
> Please submit a PR

[#1873](https://github.com/iluwatar/java-design-patterns/pull/1873)
Hi, @iluwatar @ohbus I am looking forward to fixing this issue. I saw that a PR was raised against it, but it had some failing tests and there was no update after 24 October 2021. I am willing to work on this.

So will you assign this issue to me?

> **PS:** I am new to Java, so any kind of feedback or guidance would be really appreciated.
Assigned to @arnabsen1729 
Thanks for assigning the issue @iluwatar 

---

I have raised a PR here https://github.com/iluwatar/java-design-patterns/pull/1956
I need some help in improving the final coverage, the rest of the builds are passing.
Hii..@iluwatar I am looking forward to working on this issue. So, will you please assign this issue to me?
Hello, @akash19coder I have already made changes and the build is passing. You can take a look at my PR https://github.com/iluwatar/java-design-patterns/pull/1956, just stuck at improving the test coverage. If you can help in that respect it would be really helpful.
Hi, @arnabsen1729 I don't have real-world experience with Java but with guidance, I can surely help out with improving the test coverage

Pull request review comments:

Patch that resolved the issue:
diff --git a/monitor/pom.xml b/monitor/pom.xml
index f337350190a0..9246f33caff9 100644
--- a/monitor/pom.xml
+++ b/monitor/pom.xml
@@ -21,9 +21,9 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
-    <artifactId>java-design-patterns</artifactId>
     <groupId>com.iluwatar</groupId>
-    <version>1.24.0-SNAPSHOT</version>
+    <artifactId>java-design-patterns</artifactId>
+    <version>1.26.0-SNAPSHOT</version>
   </parent>
   <artifactId>monitor</artifactId>
   <dependencies>
diff --git a/monitor/src/main/java/com/iluwatar/monitor/Bank.java b/monitor/src/main/java/com/iluwatar/monitor/Bank.java
index d4defa6d16ca..3652129657b6 100644
--- a/monitor/src/main/java/com/iluwatar/monitor/Bank.java
+++ b/monitor/src/main/java/com/iluwatar/monitor/Bank.java
@@ -1,37 +1,87 @@
+/*
+*The MIT License
+*Copyright © 2014-2021 Ilkka Seppälä
+*
+*Permission is hereby granted, free of charge, to any person obtaining a copy
+*of this software and associated documentation files (the "Software"), to deal
+*in the Software without restriction, including without limitation the rights
+*to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+*copies of the Software, and to permit persons to whom the Software is
+*furnished to do so, subject to the following conditions:
+*
+*The above copyright notice and this permission notice shall be included in
+*all copies or substantial portions of the Software.
+*
+*THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+*IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+*FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+*AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+*LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+*OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+*THE SOFTWARE.
+*/
+
 package com.iluwatar.monitor;
 
 import java.util.Arrays;
-import java.util.logging.Logger;
+import lombok.extern.slf4j.Slf4j;
 
-// Bank class implements the Monitor pattern
+/** Bank Definition. */
+@Slf4j
 public class Bank {
 
-    private int[] accounts;
-    Logger logger;
+  private final int[] accounts;
 
-    public Bank(int accountNum, int baseAmount, Logger logger) {
-        this.logger = logger;
-        accounts = new int[accountNum];
-        Arrays.fill(accounts, baseAmount);
-    }
+  /**
+   * Constructor.
+   *
+   * @param accountNum - account number
+   * @param baseAmount - base amount
+   */
+  public Bank(int accountNum, int baseAmount) {
+    accounts = new int[accountNum];
+    Arrays.fill(accounts, baseAmount);
+  }
 
-    public synchronized void transfer(int accountA, int accountB, int amount) {
-        if (accounts[accountA] >= amount) {
-            accounts[accountB] += amount;
-            accounts[accountA] -= amount;
-            logger.info("Transferred from account :" + accountA + " to account :" + accountB + " , amount :" + amount + " . balance :" + getBalance());
-        }
+  /**
+   * Transfer amounts from one account to another.
+   *
+   * @param accountA - source account
+   * @param accountB - destination account
+   * @param amount - amount to be transferred
+   */
+  public synchronized void transfer(int accountA, int accountB, int amount) {
+    if (accounts[accountA] >= amount) {
+      accounts[accountB] += amount;
+      accounts[accountA] -= amount;
+      LOGGER.info(
+          "Transferred from account: {} to account: {} , amount: {} , balance: {}",
+          accountA,
+          accountB,
+          amount,
+          getBalance());
     }
+  }
 
-    public synchronized int getBalance() {
-        int balance = 0;
-        for (int account : accounts) {
-            balance += account;
-        }
-        return balance;
+  /**
+   * Calculates the total balance.
+   *
+   * @return balance
+   */
+  public synchronized int getBalance() {
+    int balance = 0;
+    for (int account : accounts) {
+      balance += account;
     }
+    return balance;
+  }
 
-    public int[] getAccounts() {
-        return accounts;
-    }
+  /**
+   * Get all accounts.
+   *
+   * @return accounts
+   */
+  public int[] getAccounts() {
+    return accounts;
+  }
 }
diff --git a/monitor/src/main/java/com/iluwatar/monitor/Main.java b/monitor/src/main/java/com/iluwatar/monitor/Main.java
index c1e1bcccb8d2..317cbd337c73 100644
--- a/monitor/src/main/java/com/iluwatar/monitor/Main.java
+++ b/monitor/src/main/java/com/iluwatar/monitor/Main.java
@@ -1,60 +1,73 @@
 /*
- * The MIT License
- * Copyright © 2014-2021 Ilkka Seppälä
+ *The MIT License
+ *Copyright © 2014-2021 Ilkka Seppälä
  *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
+ *Permission is hereby granted, free of charge, to any person obtaining a copy
+ *of this software and associated documentation files (the "Software"), to deal
+ *in the Software without restriction, including without limitation the rights
+ *to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ *copies of the Software, and to permit persons to whom the Software is
+ *furnished to do so, subject to the following conditions:
  *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
+ *The above copyright notice and this permission notice shall be included in
+ *all copies or substantial portions of the Software.
  *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ *OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ *THE SOFTWARE.
  */
 
 package com.iluwatar.monitor;
 
-import java.util.*;
+import java.security.SecureRandom;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
-import java.util.logging.Logger;
+import lombok.extern.slf4j.Slf4j;
 
 /**
- * <p>The Monitor pattern is used in concurrent algorithms to achieve mutual exclusion.</p>
+ * The Monitor pattern is used in concurrent algorithms to achieve mutual exclusion.
  *
- * <p>Bank is a simple class that transfers money from an account to another account using
- * {@link Bank#transfer}. It can also return the balance of the bank account stored in the bank.</p>
+ * <p>Bank is a simple class that transfers money from an account to another account using {@link
+ * Bank#transfer}. It can also return the balance of the bank account stored in the bank.
  *
- * <p>Main class uses ThreadPool to run threads that do transactions on the bank accounts.</p>
+ * <p>Main class uses ThreadPool to run threads that do transactions on the bank accounts.
  */
-
+@Slf4j
 public class Main {
 
-    public static void main(String[] args) {
-        Logger logger = Logger.getLogger("monitor");
-        var bank = new Bank(4, 1000, logger);
-        Runnable runnable = () -> {
-            try {
-                Thread.sleep((long) (Math.random() * 1000));
-                Random random = new Random();
-                for (int i = 0; i < 1000000; i++)
-                    bank.transfer(random.nextInt(4), random.nextInt(4), (int) (Math.random() * 1000));
-            } catch (InterruptedException e) {
-                logger.info(e.getMessage());
-            }
-        };
-        ExecutorService executorService = Executors.newFixedThreadPool(5);
-        for (int i = 0; i < 5; i++) {
-            executorService.execute(runnable);
-        }
+  /**
+   * Runner to perform a bunch of transfers and handle exception.
+   *
+   * @param bank bank object
+   */
+  public static void runner(Bank bank) {
+    try {
+      SecureRandom random = new SecureRandom();
+      Thread.sleep(random.nextInt(1000));
+      for (int i = 0; i < 1000000; i++) {
+        bank.transfer(random.nextInt(4), random.nextInt(4), random.nextInt());
+      }
+    } catch (InterruptedException e) {
+      LOGGER.info(e.getMessage());
+      Thread.currentThread().interrupt();
+    }
+  }
+
+  /**
+   * Program entry point.
+   *
+   * @param args command line args
+   */
+  public static void main(String[] args) {
+    var bank = new Bank(4, 1000);
+    Runnable runnable = () -> runner(bank);
+    ExecutorService executorService = Executors.newFixedThreadPool(5);
+    for (int i = 0; i < 5; i++) {
+      executorService.execute(runnable);
     }
-}
\ No newline at end of file
+  }
+}
diff --git a/pom.xml b/pom.xml
index e58146c72cd2..064e7c1a7eff 100644
--- a/pom.xml
+++ b/pom.xml
@@ -85,6 +85,7 @@
   </properties>
   <modules>
     <module>abstract-factory</module>
+    <module>monitor</module>
     <module>tls</module>
     <module>builder</module>
     <module>factory-method</module>


Test patch:
diff --git a/monitor/src/main/test/java/com/iluwater/java/BankTest.java b/monitor/src/main/test/java/com/iluwater/java/BankTest.java
deleted file mode 100644
index eab7d7a3c59d..000000000000
--- a/monitor/src/main/test/java/com/iluwater/java/BankTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.iluwater.java;
-
-import com.iluwatar.monitor.Bank;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.*;
-import static org.junit.jupiter.api.Assumptions.*;
-
-import java.util.logging.Logger;
-
-public class BankTest {
-
-    private static Bank bank;
-    private static final int ACCOUNT_NUM = 4;
-    private static final int BASE_AMOUNT = 1000;
-    private static final Logger LOGGER = Logger.getLogger("monitor");
-
-    @BeforeAll
-    public static void Setup() {
-        bank = new Bank(ACCOUNT_NUM, BASE_AMOUNT, LOGGER);
-    }
-
-    @Test
-    public void GetAccountHaveNotBeNull() {
-        assertNotNull(bank.getAccounts());
-    }
-
-    @Test
-    public void LengthOfAccountsHaveToEqualsToAccountNumConstant() {
-        assumeTrue(bank.getAccounts() != null);
-        assertEquals(ACCOUNT_NUM, bank.getAccounts().length);
-    }
-
-    @Test
-    public void TransferMethodHaveToTransferAmountFromAnAccountToOtherAccount() {
-        bank.transfer(0, 1, 1000);
-        int accounts[] = bank.getAccounts();
-        assertEquals(0, accounts[0]);
-        assertEquals(2000, 2000);
-    }
-
-    @Test
-    public void BalanceHaveToBeOK() {
-        assertEquals(4000, bank.getBalance());
-    }
-
-
-    @AfterAll
-    public static void TearDown() {
-        bank = null;
-    }
-
-}
diff --git a/monitor/src/test/java/com/iluwatar/monitor/BankTest.java b/monitor/src/test/java/com/iluwatar/monitor/BankTest.java
new file mode 100644
index 000000000000..a961ec091ef6
--- /dev/null
+++ b/monitor/src/test/java/com/iluwatar/monitor/BankTest.java
@@ -0,0 +1,71 @@
+/*
+ *The MIT License
+ *Copyright © 2014-2021 Ilkka Seppälä
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining a copy
+ *of this software and associated documentation files (the "Software"), to deal
+ *in the Software without restriction, including without limitation the rights
+ *to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ *copies of the Software, and to permit persons to whom the Software is
+ *furnished to do so, subject to the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be included in
+ *all copies or substantial portions of the Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ *OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ *THE SOFTWARE.
+ */
+
+package com.iluwatar.monitor;
+
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assumptions.*;
+
+public class BankTest {
+
+  private static final int ACCOUNT_NUM = 4;
+  private static final int BASE_AMOUNT = 1000;
+  private static Bank bank;
+
+  @BeforeAll
+  public static void Setup() {
+    bank = new Bank(ACCOUNT_NUM, BASE_AMOUNT);
+  }
+
+  @AfterAll
+  public static void TearDown() {
+    bank = null;
+  }
+
+  @Test
+  void GetAccountHaveNotBeNull() {
+    assertNotNull(bank.getAccounts());
+  }
+
+  @Test
+  void LengthOfAccountsHaveToEqualsToAccountNumConstant() {
+    assumeTrue(bank.getAccounts() != null);
+    assertEquals(ACCOUNT_NUM, bank.getAccounts().length);
+  }
+
+  @Test
+  void TransferMethodHaveToTransferAmountFromAnAccountToOtherAccount() {
+    bank.transfer(0, 1, 1000);
+    int[] accounts = bank.getAccounts();
+    assertEquals(0, accounts[0]);
+    assertEquals(2000, accounts[1]);
+  }
+
+  @Test
+  void BalanceHaveToBeOK() {
+    assertEquals(4000, bank.getBalance());
+  }
+}
diff --git a/monitor/src/test/java/com/iluwatar/monitor/MainTest.java b/monitor/src/test/java/com/iluwatar/monitor/MainTest.java
new file mode 100644
index 000000000000..75a313519fdc
--- /dev/null
+++ b/monitor/src/test/java/com/iluwatar/monitor/MainTest.java
@@ -0,0 +1,42 @@
+/*
+ *The MIT License
+ *Copyright © 2014-2021 Ilkka Seppälä
+ *
+ *Permission is hereby granted, free of charge, to any person obtaining a copy
+ *of this software and associated documentation files (the "Software"), to deal
+ *in the Software without restriction, including without limitation the rights
+ *to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ *copies of the Software, and to permit persons to whom the Software is
+ *furnished to do so, subject to the following conditions:
+ *
+ *The above copyright notice and this permission notice shall be included in
+ *all copies or substantial portions of the Software.
+ *
+ *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ *AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ *OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ *THE SOFTWARE.
+ */
+
+package com.iluwatar.monitor;
+
+import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.*;
+
+/** Test if the application starts without throwing an exception. */
+class MainTest {
+
+  @Test
+  void shouldExecuteApplicationWithoutException() {
+    assertDoesNotThrow(() -> Main.main(new String[] {}));
+  }
+
+  @Test
+  void RunnerExecuteWithoutException() {
+    var bank = new Bank(4, 1000);
+    assertDoesNotThrow(() -> Main.runner(bank));
+  }
+}