From 04615562558ff4a3e23584b07577b3cc4e72cca3 Mon Sep 17 00:00:00 2001
From: Fernando Ferreira de Lima Filho <fferreiralf@ufrn.edu.br>
Date: Sun, 17 Apr 2022 18:15:46 -0300
Subject: [PATCH] Balance impl

---
 banking/src/ufrn/imd/BankingServerApp.java    |  6 ++
 .../src/ufrn/imd/controller/Controller.java   |  4 +-
 .../impl/BalanceControllerImpl.java           | 94 ++++++++++++++++++-
 .../impl/DepositControllerImpl.java           | 27 ++++--
 banking/src/ufrn/imd/domain/Client.java       |  3 +-
 .../src/ufrn/imd/service/BalanceService.java  |  3 +-
 .../src/ufrn/imd/service/DepositService.java  |  2 +-
 .../imd/service/impl/BalanceServiceImpl.java  | 23 ++++-
 .../imd/service/impl/DepositServiceImpl.java  |  6 +-
 banking/src/ufrn/imd/utils/Log.java           |  2 +-
 banking/src/ufrn/imd/utils/NameSpace.java     |  6 +-
 11 files changed, 155 insertions(+), 21 deletions(-)

diff --git a/banking/src/ufrn/imd/BankingServerApp.java b/banking/src/ufrn/imd/BankingServerApp.java
index d02eeed..4fed739 100644
--- a/banking/src/ufrn/imd/BankingServerApp.java
+++ b/banking/src/ufrn/imd/BankingServerApp.java
@@ -1,8 +1,11 @@
 package ufrn.imd;
 
 import ufrn.imd.controller.Controller;
+import ufrn.imd.controller.impl.BalanceControllerImpl;
 import ufrn.imd.controller.impl.DepositControllerImpl;
+import ufrn.imd.service.BalanceService;
 import ufrn.imd.service.DepositService;
+import ufrn.imd.service.impl.BalanceServiceImpl;
 import ufrn.imd.service.impl.DepositServiceImpl;
 
 import java.net.MalformedURLException;
@@ -13,7 +16,10 @@ public class BankingServerApp {
     public static void main(String[] args) throws RemoteException, MalformedURLException, AlreadyBoundException {
 
         DepositService depositService = new DepositServiceImpl();
+        BalanceService balanceService = new BalanceServiceImpl();
+
         Controller depositController = new DepositControllerImpl(depositService);
+        Controller balanceController = new BalanceControllerImpl(balanceService);
 
 
     }
diff --git a/banking/src/ufrn/imd/controller/Controller.java b/banking/src/ufrn/imd/controller/Controller.java
index ebdc052..36dc9b4 100644
--- a/banking/src/ufrn/imd/controller/Controller.java
+++ b/banking/src/ufrn/imd/controller/Controller.java
@@ -1,10 +1,12 @@
 package ufrn.imd.controller;
 
-import ufrn.imd.message.Client;
+import ufrn.imd.domain.Client;
 
 import java.rmi.Remote;
 import java.rmi.RemoteException;
+import java.util.List;
 
 public interface Controller extends Remote {
     public void registerClient(Client client) throws RemoteException;
+
 }
diff --git a/banking/src/ufrn/imd/controller/impl/BalanceControllerImpl.java b/banking/src/ufrn/imd/controller/impl/BalanceControllerImpl.java
index 74616ba..4dd0bb5 100644
--- a/banking/src/ufrn/imd/controller/impl/BalanceControllerImpl.java
+++ b/banking/src/ufrn/imd/controller/impl/BalanceControllerImpl.java
@@ -1,2 +1,94 @@
-package ufrn.imd.controller.impl;public class BalanceControllerImpl {
+package ufrn.imd.controller.impl;
+
+import ufrn.imd.controller.Controller;
+import ufrn.imd.domain.Client;
+import ufrn.imd.service.BalanceService;
+import ufrn.imd.service.DepositService;
+import ufrn.imd.service.impl.BalanceServiceImpl;
+import ufrn.imd.utils.Log;
+
+import java.net.MalformedURLException;
+import java.rmi.AlreadyBoundException;
+import java.rmi.Naming;
+import java.rmi.RemoteException;
+import java.rmi.registry.LocateRegistry;
+import java.rmi.server.UnicastRemoteObject;
+import java.util.ArrayList;
+import java.util.List;
+
+import static ufrn.imd.utils.NameSpace.*;
+
+public class BalanceControllerImpl extends UnicastRemoteObject implements Controller {
+
+    private volatile List<Client> clients = new ArrayList<>();
+
+    public BalanceControllerImpl(BalanceService service) throws RemoteException, MalformedURLException, AlreadyBoundException {
+        super();
+        Log.info(BalanceServiceImpl.class, "Starting Deposit service!");
+
+        new Notify(service).start();
+
+        Log.info(BalanceServiceImpl.class,
+                String.format("Initializing server in %s", HOST_BALANCE_SERVICE));
+
+        LocateRegistry.createRegistry(PORT_BALANCE_SERVICE);
+
+        Naming.bind(HOST_BALANCE_SERVICE, this);
+    }
+
+    @Override
+    public void registerClient(Client client) throws RemoteException {
+        clients.add(client);
+        Log.info(BalanceService.class, "new client registred");
+        Log.info(BalanceService.class, String.format("total users: %d", clients.size()));
+    }
+
+
+
+
+    private class Notify extends Thread{
+
+        private final BalanceService service;
+
+        public Notify(BalanceService service) {
+            super();
+            this.service = service;
+        }
+        public void run() {
+
+            for(;;) {
+                if(clients.size() > 0) {
+
+                    Log.info(
+                            BalanceService.class,
+                            "notyfing the clients!"
+                    );
+                    int i = 0;
+                    for (Client client : clients) {
+
+                        try {
+                            this.service.balance(client.getAccount());
+
+                        } catch (RemoteException e) {
+                            e.printStackTrace();
+                        }
+                    }
+                    try {
+                        Thread.sleep(15 * 1000);
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                } else {
+                    try {
+                        Thread.sleep(15 * 1000);
+                    } catch (InterruptedException e) {
+                        throw new RuntimeException(e);
+                    }
+                    Log.info(BalanceService.class, "No there's clients!");
+                }
+
+            }
+
+        }
+    }
 }
diff --git a/banking/src/ufrn/imd/controller/impl/DepositControllerImpl.java b/banking/src/ufrn/imd/controller/impl/DepositControllerImpl.java
index ef27d6e..34cccd4 100644
--- a/banking/src/ufrn/imd/controller/impl/DepositControllerImpl.java
+++ b/banking/src/ufrn/imd/controller/impl/DepositControllerImpl.java
@@ -1,8 +1,8 @@
 package ufrn.imd.controller.impl;
 
 import ufrn.imd.controller.Controller;
-import ufrn.imd.log.Log;
-import ufrn.imd.message.Client;
+import ufrn.imd.utils.Log;
+import ufrn.imd.domain.Client;
 import ufrn.imd.service.DepositService;
 
 import java.net.MalformedURLException;
@@ -14,21 +14,22 @@ import java.rmi.server.UnicastRemoteObject;
 import java.util.ArrayList;
 import java.util.List;
 
-import static ufrn.imd.nameSpace.NameSpace.HOST_DEPOSIT_SERVICE;
-import static ufrn.imd.nameSpace.NameSpace.PORT_DEPOSIT_SERVICE;
+import static ufrn.imd.utils.NameSpace.HOST_DEPOSIT_SERVICE;
+import static ufrn.imd.utils.NameSpace.PORT_DEPOSIT_SERVICE;
 
 public class DepositControllerImpl extends UnicastRemoteObject implements Controller {
 
     private volatile List<Client> clients = new ArrayList<>();
-
     public DepositControllerImpl(DepositService service) throws RemoteException, MalformedURLException, AlreadyBoundException {
         super();
         Log.info(DepositControllerImpl.class, "Starting Deposit service!");
-        new Notify(service).start();
 
+        new Notify(service).start();
         Log.info(DepositControllerImpl.class,
                 String.format("Initializing server in %s", HOST_DEPOSIT_SERVICE));
+
         LocateRegistry.createRegistry(PORT_DEPOSIT_SERVICE);
+
         Naming.bind(HOST_DEPOSIT_SERVICE, this);
     }
 
@@ -40,6 +41,8 @@ public class DepositControllerImpl extends UnicastRemoteObject implements Contro
     }
 
 
+
+
     private class Notify extends Thread{
 
         private final DepositService service;
@@ -63,17 +66,25 @@ public class DepositControllerImpl extends UnicastRemoteObject implements Contro
 
                         try {
                             this.service.deposit(client.getBalance(), client.getAccount());
+
                         } catch (RemoteException e) {
                             e.printStackTrace();
                         }
                     }
-
-
                     try {
                         Thread.sleep(15 * 1000);
                     } catch (InterruptedException e) {
                         e.printStackTrace();
                     }
+                } else {
+                    try {
+                        Thread.sleep(15 * 1000);
+                    } catch (InterruptedException e) {
+                        throw new RuntimeException(e);
+                    }
+                    Log.info(DepositControllerImpl.class, "No there's clients!");
+
+
                 }
 
             }
diff --git a/banking/src/ufrn/imd/domain/Client.java b/banking/src/ufrn/imd/domain/Client.java
index 2243e6b..7419ef5 100644
--- a/banking/src/ufrn/imd/domain/Client.java
+++ b/banking/src/ufrn/imd/domain/Client.java
@@ -1,4 +1,4 @@
-package ufrn.imd.message;
+package ufrn.imd.domain;
 
 import ufrn.imd.domain.Account;
 
@@ -7,7 +7,6 @@ import java.util.Optional;
 
 public class Client implements Serializable {
     private static final long serialVersionUID = 1L;
-
     private Account account;
     public Double getBalance() {
         return account.getBalance();
diff --git a/banking/src/ufrn/imd/service/BalanceService.java b/banking/src/ufrn/imd/service/BalanceService.java
index 2d9315c..b82470c 100644
--- a/banking/src/ufrn/imd/service/BalanceService.java
+++ b/banking/src/ufrn/imd/service/BalanceService.java
@@ -4,8 +4,9 @@ import ufrn.imd.domain.Account;
 
 import java.rmi.Remote;
 import java.rmi.RemoteException;
+import java.util.Optional;
 
 public interface BalanceService extends Remote {
 
-    public void balance(Account account) throws RemoteException;
+    public void balance(Optional<Account> account) throws RemoteException;
 }
diff --git a/banking/src/ufrn/imd/service/DepositService.java b/banking/src/ufrn/imd/service/DepositService.java
index f85f98f..aab39ac 100644
--- a/banking/src/ufrn/imd/service/DepositService.java
+++ b/banking/src/ufrn/imd/service/DepositService.java
@@ -8,6 +8,6 @@ import java.util.Optional;
 
 public interface DepositService extends Remote {
 
-        public void deposit(Double value, Optional<Account> account) throws RemoteException;
+        public void deposit(Double value, Optional<Account> account) throws RemoteException, RuntimeException;
 
 }
diff --git a/banking/src/ufrn/imd/service/impl/BalanceServiceImpl.java b/banking/src/ufrn/imd/service/impl/BalanceServiceImpl.java
index 07a0ac2..f550c9d 100644
--- a/banking/src/ufrn/imd/service/impl/BalanceServiceImpl.java
+++ b/banking/src/ufrn/imd/service/impl/BalanceServiceImpl.java
@@ -1,2 +1,23 @@
-package ufrn.imd.service.impl;public class BalanceService {
+package ufrn.imd.service.impl;
+
+import ufrn.imd.domain.Account;
+
+import java.rmi.RemoteException;
+import java.util.Optional;
+
+import ufrn.imd.service.*;
+import ufrn.imd.utils.Log;
+
+public class BalanceServiceImpl implements BalanceService {
+
+
+    @Override
+    public void balance(Optional<Account> accOP) throws RemoteException {
+        Account account = accOP.orElseThrow(() -> new RuntimeException("Invalid account"));
+        Log.info(
+                BalanceServiceImpl.class,
+                String.format("Account Balance: R$ %f", account.getBalance())
+        );
+
+    }
 }
diff --git a/banking/src/ufrn/imd/service/impl/DepositServiceImpl.java b/banking/src/ufrn/imd/service/impl/DepositServiceImpl.java
index 7dfa731..f7a1cb7 100644
--- a/banking/src/ufrn/imd/service/impl/DepositServiceImpl.java
+++ b/banking/src/ufrn/imd/service/impl/DepositServiceImpl.java
@@ -1,7 +1,7 @@
 package ufrn.imd.service.impl;
 
 import ufrn.imd.domain.Account;
-import ufrn.imd.log.Log;
+import ufrn.imd.utils.Log;
 import ufrn.imd.service.DepositService;
 
 import java.rmi.RemoteException;
@@ -15,11 +15,9 @@ public class DepositServiceImpl implements DepositService {
 
     public void deposit(Double value, Optional<Account> acOp) throws RemoteException, RuntimeException {
         Account account = acOp.orElseThrow(() -> new RuntimeException("Null User!"));
-        if(account.getBalance() < value)
-            throw new RuntimeException("There's no money!");
+        if(account.getBalance() < value) throw new RuntimeException("There's no money!");
         account.setBalance(account.getBalance() - value);
         Log.info(DepositServiceImpl.class, "deposit");
-
     }
 
 }
diff --git a/banking/src/ufrn/imd/utils/Log.java b/banking/src/ufrn/imd/utils/Log.java
index 673658f..38d3f87 100644
--- a/banking/src/ufrn/imd/utils/Log.java
+++ b/banking/src/ufrn/imd/utils/Log.java
@@ -1,4 +1,4 @@
-package ufrn.imd.utils.log;
+package ufrn.imd.utils;
 
 public class Log {
 
diff --git a/banking/src/ufrn/imd/utils/NameSpace.java b/banking/src/ufrn/imd/utils/NameSpace.java
index ace96ee..bb5d525 100644
--- a/banking/src/ufrn/imd/utils/NameSpace.java
+++ b/banking/src/ufrn/imd/utils/NameSpace.java
@@ -1,7 +1,11 @@
-package ufrn.imd.utils.nameSpace;
+package ufrn.imd.utils;
 
 public class NameSpace {
+
+    public final static Integer PORT_BALANCE_SERVICE = 1908;
     public final static Integer PORT_DEPOSIT_SERVICE = 1907;
     public final static String HOST_DEPOSIT_SERVICE =
             String.format("rmi://127.0.0.1:%d/%s", PORT_DEPOSIT_SERVICE, "deposit");
+    public final static String HOST_BALANCE_SERVICE =
+            String.format("rmi://127.0.0.1:%d/%s", PORT_BALANCE_SERVICE, "balance");
 }
-- 
GitLab