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 b7a227b0c320a833e457e69b08612342be8b1292..961c800225f721bcf2322dd1f46e137808598db9 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 c3793547e6dee27aa654ce21634053dd6c23b448..25c6d983740bed909d65dfff4eb3034af0524f61 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 1e78cc9ce0775fa751b7c9ccd7da8294958c203e..0830c9341634c6202b41204c2e6eb85fb959b090 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 7acd207f24982bf2667e354a6c1f35b77cf355af..38a2056f1e54ebf485d815de51434dd4866283d8 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 0000000000000000000000000000000000000000..9bd03e2a55698094fe343716005ac804b4cf356b --- /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 0000000000000000000000000000000000000000..a22397cda066cdef5c7f656c3218073c736ce7c1 --- /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 1c0b20032b7b2212978ada7bae8a9db19bd3775c..d05657df43ae73e13b75ed8d0830f25e4be9910f 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 Binary files a/banking-server/target/classes/ufrn/imd/BankingServerApp.class and b/banking-server/target/classes/ufrn/imd/BankingServerApp.class differ 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 Binary files a/banking-server/target/classes/ufrn/imd/utils/NameSpace.class and b/banking-server/target/classes/ufrn/imd/utils/NameSpace.class differ