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