From d84237f315a981187c19a1ac3afb72e075ecb238 Mon Sep 17 00:00:00 2001
From: mariaeloi <mariaeduardaeloi@outlook.com>
Date: Wed, 20 Apr 2022 21:53:47 -0300
Subject: [PATCH] add withdrawal operation

---
 .../java/ufrn/imd/utils/MachineState.java     |  17 +++-
 .../main/java/ufrn/imd/utils/NameSpace.java   |   3 +
 banking-server/.idea/compiler.xml             |   1 +
 .../main/java/ufrn/imd/BankingServerApp.java  |   5 +-
 .../impl/WithdrawalControllerImpl.java        |  75 ++++++++++++++++++
 .../service/impl/WithdrawalServiceImpl.java   |  32 ++++++++
 .../main/java/ufrn/imd/utils/NameSpace.java   |   4 +
 .../classes/ufrn/imd/BankingServerApp.class   | Bin 1259 -> 1574 bytes
 .../classes/ufrn/imd/utils/NameSpace.class    | Bin 849 -> 997 bytes
 9 files changed, 134 insertions(+), 3 deletions(-)
 create mode 100644 banking-server/src/main/java/ufrn/imd/controller/impl/WithdrawalControllerImpl.java
 create mode 100644 banking-server/src/main/java/ufrn/imd/service/impl/WithdrawalServiceImpl.java

diff --git a/banking-client/src/main/java/ufrn/imd/utils/MachineState.java b/banking-client/src/main/java/ufrn/imd/utils/MachineState.java
index b7a227b..961c800 100644
--- a/banking-client/src/main/java/ufrn/imd/utils/MachineState.java
+++ b/banking-client/src/main/java/ufrn/imd/utils/MachineState.java
@@ -11,6 +11,7 @@ import java.rmi.RemoteException;
 import java.util.Scanner;
 
 import static ufrn.imd.utils.NameSpace.HOST_DEPOSIT_SERVICE;
+import static ufrn.imd.utils.NameSpace.HOST_WITHDRAWAL_SERVICE;
 
 @Data
 public class MachineState {
@@ -21,6 +22,7 @@ public class MachineState {
     public static final String READ = "READ";
     public static final String DEPOSIT = "DEPOSIT";
     public static final String BALANCE = "BALANCE";
+    public static final String WITHDRAWAL = "WITHDRAWAL";
 
     public static final String HELP = "HELP";
     public static final String INVALID_INPUT = "INVALID_INPUT";
@@ -51,6 +53,8 @@ public class MachineState {
             state = HELP;
         } else if(state.equals(DEPOSIT)) {
             state = HELP;
+        } else if(state.equals(WITHDRAWAL)) {
+            state = HELP;
         }
     }
 
@@ -59,7 +63,7 @@ public class MachineState {
             inputValue = new String();
             inputValue = sc.nextLine().trim().toUpperCase();
             System.out.println(String.format(">>> input value: %s", inputValue));
-            if(!inputValue.equals(DEPOSIT) && !inputValue.equals(DEPOSIT) && !inputValue.equals(BALANCE)){
+            if(!inputValue.equals(DEPOSIT) && !inputValue.equals(BALANCE) && !inputValue.equals(WITHDRAWAL) ){
                 inputValue = INVALID_INPUT;
             }
         } else if(state.equals(DEPOSIT)) {
@@ -68,6 +72,12 @@ public class MachineState {
             Client client = new Client(1);
             Controller server = (Controller) Naming.lookup(HOST_DEPOSIT_SERVICE);
             server.registerClient(client);
+        } else if(state.equals(WITHDRAWAL)) {
+            double v = sc.nextDouble();
+            System.out.println(String.format(">>> input value: %.2f", v));
+            Client client = new Client(1);
+            Controller server = (Controller) Naming.lookup(HOST_WITHDRAWAL_SERVICE);
+            server.registerClient(client);
         }
     }
 
@@ -80,7 +90,7 @@ public class MachineState {
                 System.out.println("These are the avaliable operations");
                 System.out.println("---------------------------------");
                 System.out.println(" - deposit \t - balance");
-                System.out.println(" - quit");
+                System.out.println(" - withdrawal \t - quit");
 
                 System.out.println("---------------------------------");
                 Thread.sleep(1000);
@@ -92,6 +102,9 @@ public class MachineState {
             } else if(state.equals(DEPOSIT)) {
                 System.out.println(">>> Starting deposit operation");
                 System.out.println(">>> Please enter with the value that you want deposit");
+            } else if(state.equals(WITHDRAWAL)) {
+                System.out.println(">>> Starting withdrawal operation");
+                System.out.println(">>> Please enter the value you want to withdraw");
             }
         } catch (InterruptedException e) {
             throw new RuntimeException(e);
diff --git a/banking-client/src/main/java/ufrn/imd/utils/NameSpace.java b/banking-client/src/main/java/ufrn/imd/utils/NameSpace.java
index c379354..25c6d98 100644
--- a/banking-client/src/main/java/ufrn/imd/utils/NameSpace.java
+++ b/banking-client/src/main/java/ufrn/imd/utils/NameSpace.java
@@ -3,4 +3,7 @@ package ufrn.imd.utils;
 public class NameSpace {
     public static final Integer PORT_DEPOSIT_SERVICE = 1907;
     public static final String HOST_DEPOSIT_SERVICE = String.format("rmi://127.0.0.1:%d/%s", PORT_DEPOSIT_SERVICE, "deposit");
+
+    public final static Integer PORT_WITHDRAWAL_SERVICE = 1906;
+    public final static String HOST_WITHDRAWAL_SERVICE = String.format("rmi://127.0.0.1:%d/%s", PORT_WITHDRAWAL_SERVICE, "withdrawal");
 }
diff --git a/banking-server/.idea/compiler.xml b/banking-server/.idea/compiler.xml
index 1e78cc9..0830c93 100644
--- a/banking-server/.idea/compiler.xml
+++ b/banking-server/.idea/compiler.xml
@@ -2,6 +2,7 @@
 <project version="4">
   <component name="CompilerConfiguration">
     <annotationProcessing>
+      <profile default="true" name="Default" enabled="true" />
       <profile name="Maven default annotation processors profile" enabled="true">
         <sourceOutputDir name="target/generated-sources/annotations" />
         <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
diff --git a/banking-server/src/main/java/ufrn/imd/BankingServerApp.java b/banking-server/src/main/java/ufrn/imd/BankingServerApp.java
index 7acd207..38a2056 100644
--- a/banking-server/src/main/java/ufrn/imd/BankingServerApp.java
+++ b/banking-server/src/main/java/ufrn/imd/BankingServerApp.java
@@ -3,9 +3,11 @@ package ufrn.imd;
 import ufrn.imd.controller.Controller;
 import ufrn.imd.controller.impl.BalanceControllerImpl;
 import ufrn.imd.controller.impl.DepositControllerImpl;
+import ufrn.imd.controller.impl.WithdrawalControllerImpl;
 import ufrn.imd.repository.impl.ClientRepository;
 import ufrn.imd.service.impl.BalanceServiceImpl;
 import ufrn.imd.service.impl.DepositServiceImpl;
+import ufrn.imd.service.impl.WithdrawalServiceImpl;
 
 import java.net.MalformedURLException;
 import java.rmi.AlreadyBoundException;
@@ -16,10 +18,11 @@ public class BankingServerApp {
 
         DepositServiceImpl depositService = new DepositServiceImpl(new ClientRepository());
         BalanceServiceImpl balanceService = new BalanceServiceImpl(new ClientRepository());
+        WithdrawalServiceImpl withdrawalService = new WithdrawalServiceImpl(new ClientRepository());
 
         Controller depositController = new DepositControllerImpl(depositService);
         Controller balanceController = new BalanceControllerImpl(balanceService);
-
+        Controller withdrawalController = new WithdrawalControllerImpl(withdrawalService);
 
     }
 }
diff --git a/banking-server/src/main/java/ufrn/imd/controller/impl/WithdrawalControllerImpl.java b/banking-server/src/main/java/ufrn/imd/controller/impl/WithdrawalControllerImpl.java
new file mode 100644
index 0000000..9bd03e2
--- /dev/null
+++ b/banking-server/src/main/java/ufrn/imd/controller/impl/WithdrawalControllerImpl.java
@@ -0,0 +1,75 @@
+package ufrn.imd.controller.impl;
+
+import lombok.extern.java.Log;
+import ufrn.imd.controller.Controller;
+import ufrn.imd.domain.Client;
+import ufrn.imd.service.impl.WithdrawalServiceImpl;
+
+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.ArrayDeque;
+import java.util.Optional;
+import java.util.Queue;
+
+import static ufrn.imd.utils.NameSpace.HOST_WITHDRAWAL_SERVICE;
+import static ufrn.imd.utils.NameSpace.PORT_WITHDRAWAL_SERVICE;
+
+@Log
+public class WithdrawalControllerImpl extends UnicastRemoteObject implements Controller {
+    private volatile Queue<Client> clients = new ArrayDeque<>();
+
+    public WithdrawalControllerImpl(WithdrawalServiceImpl service) throws RemoteException, MalformedURLException, AlreadyBoundException {
+        super();
+        log.info("Starting Withdrawal service!");
+        new Notify(service).start();
+        log.info(String.format("Initializing server in %s", HOST_WITHDRAWAL_SERVICE));
+        LocateRegistry.createRegistry(PORT_WITHDRAWAL_SERVICE);
+        Naming.bind(HOST_WITHDRAWAL_SERVICE, this);
+    }
+
+    @Override
+    public void registerClient(Client client) throws RemoteException {
+        clients.add(client);
+        log.info("new client registred");
+        log.info(String.format("total users: %d", clients.size()));
+    }
+
+    private class Notify extends Thread {
+        private final WithdrawalServiceImpl service;
+
+        public Notify(WithdrawalServiceImpl service) {
+            super();
+            this.service = service;
+        }
+
+        public void run() {
+            for(;;) {
+                if(clients.size() > 0) {
+                    log.info("notyfing the clients!");
+                    int i = 0;
+                    clients.stream().forEach(client -> {
+                        try {
+                            log.info(String.format("Clients waiting %d", clients.size()));
+                            this.service.withdraw(50.00, Optional.of(client));
+                        } catch (RemoteException | RuntimeException e) {
+                            e.printStackTrace();
+                        } finally {
+                            clients.remove();
+                            log.info(String.format("Clients waiting %d", clients.size()));
+                        }
+                    });
+
+                    try {
+                        Thread.sleep(15 * 1000);
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/banking-server/src/main/java/ufrn/imd/service/impl/WithdrawalServiceImpl.java b/banking-server/src/main/java/ufrn/imd/service/impl/WithdrawalServiceImpl.java
new file mode 100644
index 0000000..a22397c
--- /dev/null
+++ b/banking-server/src/main/java/ufrn/imd/service/impl/WithdrawalServiceImpl.java
@@ -0,0 +1,32 @@
+package ufrn.imd.service.impl;
+
+import lombok.AllArgsConstructor;
+import lombok.extern.java.Log;
+import ufrn.imd.domain.Account;
+import ufrn.imd.domain.Client;
+import ufrn.imd.repository.Repository;
+import ufrn.imd.service.Service;
+
+import java.rmi.RemoteException;
+import java.util.Optional;
+
+@Log
+@AllArgsConstructor
+public class WithdrawalServiceImpl implements Service {
+
+    private final Repository<Client> clientRepository;
+
+    public void withdraw(Double value, Optional<Client> clientOptional) throws RemoteException, RuntimeException {
+        Client user = clientOptional
+                .orElseThrow(() -> new RuntimeException("Null user!"));
+        Client client = clientRepository.find(user.getId())
+                .orElseThrow(() -> new RuntimeException("Invalid user!"));
+
+        Account account = client.getAccount();
+        if(value > account.getBalance()) throw new RuntimeException("Insufficient balance");
+
+        account.setBalance(account.getBalance() - value);
+        log.info("Withdrawal concluded!");
+        log.info(String.format("Account balance: R$ %.2f", account.getBalance()));
+    }
+}
diff --git a/banking-server/src/main/java/ufrn/imd/utils/NameSpace.java b/banking-server/src/main/java/ufrn/imd/utils/NameSpace.java
index 1c0b200..d05657d 100644
--- a/banking-server/src/main/java/ufrn/imd/utils/NameSpace.java
+++ b/banking-server/src/main/java/ufrn/imd/utils/NameSpace.java
@@ -4,10 +4,14 @@ public class NameSpace {
 
     public final static Integer PORT_BALANCE_SERVICE = 1908;
     public final static Integer PORT_DEPOSIT_SERVICE = 1907;
+    public final static Integer PORT_WITHDRAWAL_SERVICE = 1906;
 
     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");
+
+    public final static String HOST_WITHDRAWAL_SERVICE =
+            String.format("rmi://127.0.0.1:%d/%s", PORT_WITHDRAWAL_SERVICE, "withdrawal");
 }
diff --git a/banking-server/target/classes/ufrn/imd/BankingServerApp.class b/banking-server/target/classes/ufrn/imd/BankingServerApp.class
index e7bc89caf443850f74b54ca56cfedf3e1bb21797..9507e12c0cbcbee3b1aa0bd24708c3ec90f1bb53 100644
GIT binary patch
delta 573
zcmYk3&rTCj6vlsdI-N@|BbBxm@K2HY2e3>5t5k{wsxe?hHYSi+8G=o0QfX5gapyCT
zc>!1M35$s~;Q@F6U&4*<4e?AhmPzhC-#Pa?-*@iZABivS%d_)ur$Ct}hEY6CQ8RCd
z;TbFzG>Zl&iuVmeQ7jn@4>S)AE=!uSVT4DTWliO{np2s>M)&QT&fei(^Hsg`p|M|A
zct=0S%<lhsu%-OM1>V!vLATRtHtQXQdG>L?-tIP92k$j2n#Y=I@KsI6Qlx`5Ya;lq
z)&;K$_Eh2MSN5XrYim``)`HJg$w{%USPa@KlW)9hH|GcT1H0#P;F6+t^4&@)Td^=B
zlNJZme>aGDE3-RHaan#+^jRqBOUs@K&STlq6{$IrA&ji-ZXd@PV_dQX6I_*^jNmhD
zw8X7o!_I%|5%WXrki>Qm;}=4PD|Qdpp9{HEiT4=sy^v(ZIhGcS$R^isPm>h6oK!q9
zDT_@_OkQxUZ@>B1LbB`9k)+BE;VM~0Cb=m}p2R7Z^YYSV5xK=}nXASycLc>nNO4z?
T!?Xwt32TN~?n$-KA7t(iUn*zh

delta 375
zcmYL@y-q?w5QV?J3oI;%az*?{LF6K!$d3|DENzU^Sx{LR3mY}j!p?_SpTXD}VnL#b
z58$i#4#v5c!Y$^^nK|dozGQw<N8i66UqGL}Ws0gHFw`uXs>Nf=P`4yPY*>;s4civW
zj-h4P9i0`Gds8QQd;EBLb@y<6dvkAS8#;!rt9XIVGVKQ5Fp;IFs5zwy?p*m!>#nT!
z+(Cr<@2}cd7nI1zAHwIM5UbP~VJ$%=7_W~}qiCIznuvy3eCab20kh<VrI@22A))!1
z7;(XlJB^p08e>v}PwcQcCVd$D4=Y5XoZR#&N=P6PZ5E>N-Xwr|;fP{`MV91Xs9R=5
e4h5uH6|TjjSd%Wsx@eO!DNz=Oq9R;-Z2kdCekL#g

diff --git a/banking-server/target/classes/ufrn/imd/utils/NameSpace.class b/banking-server/target/classes/ufrn/imd/utils/NameSpace.class
index 4352c7ac97153fc0ffa5de6fbc6076a0ad780fa8..615ca1f909796027ddf196e31bfa6a831963264c 100644
GIT binary patch
delta 503
zcmY+B&q@MO6vn@C9Pi9@O=rqX?f?Hwv+R!rZKMc=!cakMQ&R>7(!vDW`3z#)9-&1^
zBt<<yyB?y~h|aw(qRsc6^Sk#PKJNYUe6#H5&+7+(6t+z;OqrO*i~%2Jh0F<=*RjB`
zs3U4(2{D1<I+leebgT$pWk|Mm_Wi-5T)ucx$`&(w`E)6L(7HYJ2Q#_CKlXMP9!7{^
zjbj}f9DZ0FwvYi>?TV6$ZF0)9#W9G00(Rz9o$K=pjv>*SjjQ@)rRFr8Dn}53_OtTP
z^ig!cgOFH8RY>fUPAjF;D(SRCI!%(hpn$TFhN(-CE96@A1<Ip5j*xmJR53y|?_Izs
z#;DUVE{B_9`W_l7;8?8Qg{uSAVmGpITdXDv&Gu;TU}g0Q?n2pZ>xC|i4$MES3f$Mj
y{10madwaNFBvT-gMPZU^h#M5rrZ<SdK#X9Lg6_hLEd9+fy~!!Lf(g3p!sIV!`$BF2

delta 373
zcmYL@OD{uF6otQYU+4DrwA@S4q8{~XJ<6zw7!ZlXxT6kBIujwx&CQzoD@Y9JKqKJ?
znE4U@hS=veVY1dbYwvZ|{?=c?!ROE02hd_KB49qE%0dpqqJ^c9Wlb$)C1RB|YpsWD
zSgvat{nL~F!*Lp@`_crHnoYwN+lB%~!x+W%QMD>Nh9<j)abkr&>t1v(&wGZ1I4w9&
zcSc&lqij>6$~Ks>1TvOQVF!hj2$tm46js81;}!Lsji&^I%ygL+ZAJ^s$d?dO`3qm;
zivvfozP%da3~*z8lL;^J{da<n`-0c*c!_Qg2?yl<ZP(h-$j;klg>9~)1$}aILn3W8
SQFZd{%N>WpidmUE%>4oyeJFhZ

-- 
GitLab