diff --git a/banking-client/src/main/java/ufrn/imd/BankingClientApp.java b/banking-client/src/main/java/ufrn/imd/BankingClientApp.java index bf72420c1c95a5e79e86df3ee5c5464009708735..ec24073376307e263622c48c97ca5f54839dbc16 100644 --- a/banking-client/src/main/java/ufrn/imd/BankingClientApp.java +++ b/banking-client/src/main/java/ufrn/imd/BankingClientApp.java @@ -1,30 +1,26 @@ package ufrn.imd; import lombok.extern.java.Log; -import ufrn.imd.controller.Controller; -import ufrn.imd.domain.Account; -import ufrn.imd.domain.Client; import ufrn.imd.utils.MachineState; import java.net.MalformedURLException; -import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RemoteException; -import static ufrn.imd.utils.MachineState.*; -import static ufrn.imd.utils.NameSpace.HOST_DEPOSIT_SERVICE; - @Log public class BankingClientApp { public static void main(String[] args) throws MalformedURLException, NotBoundException, RemoteException { MachineState mS = new MachineState(); - while(mS.quit()) { - mS.render(); - mS.processEvents(); - mS.update(); - } + for(;;) { + while(!mS.hasUser()) mS.login(); + while(mS.quit() || mS.hasUser()) { + mS.render(); + mS.processEvents(); + mS.update(); + } + } } } 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 4f1834f4fe00066168878d3ae62f93f2c7b19f2e..87a951fd94736a6d5b2f7c0961282bec8d34b134 100644 --- a/banking-client/src/main/java/ufrn/imd/utils/MachineState.java +++ b/banking-client/src/main/java/ufrn/imd/utils/MachineState.java @@ -34,12 +34,36 @@ public class MachineState { private Scanner sc; private String inputValue; + private Client client; + public MachineState() { state = INITIAL; inputValue = new String(); sc = new Scanner(System.in); } + public void login() throws MalformedURLException, NotBoundException, RemoteException { + System.out.println(">>> Please enter your bank account number"); + String accountNumber = sc.nextLine(); + + Controller server = (Controller) Naming.lookup(HOST_AUTHENTICATOR_SERVICE); + ServerResponse response = server.getResponse(accountNumber); + if(response.getStatus() == 200) { + state = INITIAL; + this.client = new Client((Integer) response.getBody()); + } else System.out.println(">>> Bad credentials"); + + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + public Boolean hasUser() { + return client != null; + } + public Boolean quit() { return !state.equals(QUIT); } @@ -77,8 +101,7 @@ public class MachineState { } } else if(state.equals(DEPOSIT)) { String v = sc.nextLine(); - Client client = new Client(1); - DepositMessage depositMessage = new DepositMessage(client, Double.parseDouble(v)); + DepositMessage depositMessage = new DepositMessage(this.client, Double.parseDouble(v)); Controller server = (Controller) Naming.lookup(HOST_DEPOSIT_SERVICE); ServerResponse response = server.getResponse(depositMessage); if(response.getStatus() == 200) { @@ -93,9 +116,8 @@ public class MachineState { } } else if(state.equals(BALANCE)) { - Client client = new Client(1); Controller server = (Controller) Naming.lookup(HOST_BALANCE_SERVICE); - ServerResponse response = server.getResponse(client); + ServerResponse response = server.getResponse(this.client); if(response.getStatus() == 200) { System.out.println( String.format(">>> Your balance is: %.2f", ((Account)response.getBody()).getBalance()) @@ -109,8 +131,7 @@ public class MachineState { } else if(state.equals(WITHDRAWAL)) { String v = sc.nextLine(); - Client client = new Client(1); - WithdrawalMessage withdrawalMessage = new WithdrawalMessage(client, Double.parseDouble(v)); + WithdrawalMessage withdrawalMessage = new WithdrawalMessage(this.client, Double.parseDouble(v)); Controller server = (Controller) Naming.lookup(HOST_WITHDRAWAL_SERVICE); ServerResponse response = server.getResponse(withdrawalMessage); if(response.getStatus() == 200) { @@ -132,9 +153,8 @@ public class MachineState { System.out.println(">>> Please enter with the value that you want transfer"); String v = sc.nextLine(); - Client client = new Client(1); Account account = new Account(null, accountNumber, null); - TransferMessage transferMessage = new TransferMessage(client, account, Double.parseDouble(v)); + TransferMessage transferMessage = new TransferMessage(this.client, account, Double.parseDouble(v)); Controller server = (Controller) Naming.lookup(HOST_TRANSFER_SERVICE); ServerResponse response = server.getResponse(transferMessage); if(response.getStatus() == 200) { @@ -151,6 +171,14 @@ public class MachineState { } catch (InterruptedException e) { throw new RuntimeException(e); } + } else if(state.equals(QUIT)) { + this.client = null; + System.out.println(">>> You have logged out"); + try { + Thread.sleep(1000); + } 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 3cc1c46f5f9d8cced8686b7065fcf43128a4d6c2..c6b21564c0d2aadf51ccbba80225e526a94c794e 100644 --- a/banking-client/src/main/java/ufrn/imd/utils/NameSpace.java +++ b/banking-client/src/main/java/ufrn/imd/utils/NameSpace.java @@ -1,10 +1,12 @@ package ufrn.imd.utils; public class NameSpace { + public final static Integer PORT_AUTHENTICATOR_SERVICE = 1905; public final static Integer PORT_WITHDRAWAL_SERVICE = 1906; public static final Integer PORT_DEPOSIT_SERVICE = 1907; public static final Integer PORT_BALANCE_SERVICE = 1908; public static final Integer PORT_TRANSFER_SERVICE = 1909; + public final static String HOST_AUTHENTICATOR_SERVICE = String.format("rmi://127.0.0.1:%d/%s", PORT_AUTHENTICATOR_SERVICE, "authenticator"); public final static String HOST_WITHDRAWAL_SERVICE = String.format("rmi://127.0.0.1:%d/%s", PORT_WITHDRAWAL_SERVICE, "withdrawal"); public static final String HOST_DEPOSIT_SERVICE = String.format("rmi://127.0.0.1:%d/%s", PORT_DEPOSIT_SERVICE, "deposit"); public static final String HOST_BALANCE_SERVICE = String.format("rmi://127.0.0.1:%d/%s", PORT_BALANCE_SERVICE, "balance"); diff --git a/banking-server/src/main/java/ufrn/imd/BankingServerApp.java b/banking-server/src/main/java/ufrn/imd/BankingServerApp.java index 24f0ed8baec50747419f805562f02f0a63a2ac7f..0b064716671e8d2c805aee33436ade6ff714abc3 100644 --- a/banking-server/src/main/java/ufrn/imd/BankingServerApp.java +++ b/banking-server/src/main/java/ufrn/imd/BankingServerApp.java @@ -1,15 +1,9 @@ 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.TransferControllerImpl; -import ufrn.imd.controller.impl.WithdrawalControllerImpl; +import ufrn.imd.controller.impl.*; import ufrn.imd.repository.impl.ClientRepository; -import ufrn.imd.service.impl.BalanceServiceImpl; -import ufrn.imd.service.impl.DepositServiceImpl; -import ufrn.imd.service.impl.TransferServiceImpl; -import ufrn.imd.service.impl.WithdrawalServiceImpl; +import ufrn.imd.service.impl.*; import java.net.MalformedURLException; import java.rmi.AlreadyBoundException; @@ -22,10 +16,12 @@ public class BankingServerApp { BalanceServiceImpl balanceService = new BalanceServiceImpl(clientRepository); WithdrawalServiceImpl withdrawalService = new WithdrawalServiceImpl(clientRepository); TransferServiceImpl transferService = new TransferServiceImpl(clientRepository); + AuthenticatorServiceImpl authenticatorService = new AuthenticatorServiceImpl(clientRepository); Controller depositController = new DepositControllerImpl(depositService); Controller balanceController = new BalanceControllerImpl(balanceService); Controller withdrawalController = new WithdrawalControllerImpl(withdrawalService); Controller transferController = new TransferControllerImpl(transferService); + Controller authenticatorController = new AuthenticatorControllerImpl(authenticatorService); } } diff --git a/banking-server/src/main/java/ufrn/imd/controller/impl/AuthenticatorControllerImpl.java b/banking-server/src/main/java/ufrn/imd/controller/impl/AuthenticatorControllerImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..0c3770f8fbb80b527ffba9e8abddb4e40e9f04ce --- /dev/null +++ b/banking-server/src/main/java/ufrn/imd/controller/impl/AuthenticatorControllerImpl.java @@ -0,0 +1,47 @@ +package ufrn.imd.controller.impl; + +import lombok.extern.java.Log; +import ufrn.imd.controller.Controller; +import ufrn.imd.service.impl.AuthenticatorServiceImpl; +import ufrn.imd.utils.ServerResponse; + +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 static ufrn.imd.utils.NameSpace.HOST_AUTHENTICATOR_SERVICE; +import static ufrn.imd.utils.NameSpace.PORT_AUTHENTICATOR_SERVICE; + +@Log +public class AuthenticatorControllerImpl extends UnicastRemoteObject implements Controller { + private final AuthenticatorServiceImpl service; + + public AuthenticatorControllerImpl(AuthenticatorServiceImpl service) throws RemoteException, MalformedURLException, AlreadyBoundException { + super(); + log.info("Starting Authenticator service!"); + this.service = service; + log.info(String.format("Initializing server in %s", HOST_AUTHENTICATOR_SERVICE)); + LocateRegistry.createRegistry(PORT_AUTHENTICATOR_SERVICE); + Naming.bind(HOST_AUTHENTICATOR_SERVICE, this); + } + + @Override + public ServerResponse getResponse(Object client) throws RemoteException { + String accountNumber = (String) client; + ServerResponse response; + try { + response = this.service.authenticate(accountNumber); + } catch (RuntimeException e) { + e.printStackTrace(); + response = ServerResponse.builder() + .status(500) + .message(e.getMessage()) + .body(accountNumber) + .build(); + } + return response; + } +} diff --git a/banking-server/src/main/java/ufrn/imd/controller/impl/BalanceControllerImpl.java b/banking-server/src/main/java/ufrn/imd/controller/impl/BalanceControllerImpl.java index 50d9cb87a9e624e039f790f7cad9bfdb09e97fb4..aaab87695df120da3091fb1fcc6ee13f6637a5a9 100644 --- a/banking-server/src/main/java/ufrn/imd/controller/impl/BalanceControllerImpl.java +++ b/banking-server/src/main/java/ufrn/imd/controller/impl/BalanceControllerImpl.java @@ -27,7 +27,7 @@ public class BalanceControllerImpl extends UnicastRemoteObject implements Contro LocateRegistry.createRegistry(PORT_BALANCE_SERVICE); Naming.bind(HOST_BALANCE_SERVICE, this); - log.info("Starting Deposit service!"); + log.info("Starting Balance service!"); this.service = service; log.info(String.format("Initializing server in %s", HOST_BALANCE_SERVICE)); diff --git a/banking-server/src/main/java/ufrn/imd/repository/impl/ClientRepository.java b/banking-server/src/main/java/ufrn/imd/repository/impl/ClientRepository.java index 22520da111f7fd8d9af0f94b6845501c69d1c236..a893a7bf30fec8e343488a9131ca803b32a1924a 100644 --- a/banking-server/src/main/java/ufrn/imd/repository/impl/ClientRepository.java +++ b/banking-server/src/main/java/ufrn/imd/repository/impl/ClientRepository.java @@ -9,8 +9,8 @@ import java.util.Optional; public class ClientRepository implements Repository<Client> { List<Client> clients = List.of( - new Client(1, "Fernando Feirreira", new Account(1, "321456789", 200.00)), - new Client(2, "Maria Eduarda", new Account(2, "987654321", 100.00)) + new Client(0, "Fernando Feirreira", new Account(1, "321456789", 200.00)), + new Client(1, "Maria Eduarda", new Account(2, "987654321", 100.00)) ); @Override diff --git a/banking-server/src/main/java/ufrn/imd/service/impl/AuthenticatorServiceImpl.java b/banking-server/src/main/java/ufrn/imd/service/impl/AuthenticatorServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..f7ef11395da621fa8d624a9af57ca56b70490c8f --- /dev/null +++ b/banking-server/src/main/java/ufrn/imd/service/impl/AuthenticatorServiceImpl.java @@ -0,0 +1,29 @@ +package ufrn.imd.service.impl; + +import lombok.AllArgsConstructor; +import lombok.extern.java.Log; +import ufrn.imd.domain.Client; +import ufrn.imd.repository.Repository; +import ufrn.imd.repository.impl.ClientRepository; +import ufrn.imd.service.Service; +import ufrn.imd.utils.ServerResponse; + +@Log +@AllArgsConstructor +public class AuthenticatorServiceImpl implements Service { + + private final Repository<Client> clientRepository; + + public ServerResponse authenticate(String accountNumber) { + Client client = ((ClientRepository) clientRepository).findByAccountNumber(accountNumber) + .orElseThrow(() -> new RuntimeException( + String.format("Customer not found with account number %s", accountNumber))); + + log.info(client.getName() + " logged in (account number: " + client.getAccount().getNumber() + ")"); + return ServerResponse.builder() + .status(200) + .message("Operation sucessed!") + .body(client.getId()) + .build(); + } +} 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 fe82fc880f2ddf63a9c7014be14a81ce89fc9c93..b3b8007682278a551965350ca6374227dfa65dff 100644 --- a/banking-server/src/main/java/ufrn/imd/utils/NameSpace.java +++ b/banking-server/src/main/java/ufrn/imd/utils/NameSpace.java @@ -5,6 +5,7 @@ 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 Integer PORT_AUTHENTICATOR_SERVICE = 1905; public final static String HOST_DEPOSIT_SERVICE = String.format("rmi://127.0.0.1:%d/%s", PORT_DEPOSIT_SERVICE, "deposit"); @@ -17,4 +18,7 @@ public class NameSpace { public final static String HOST_TRANSFER_SERVICE = String.format("rmi://127.0.0.1:%d/%s", PORT_TRANSFER_SERVICE, "transfer"); + + public final static String HOST_AUTHENTICATOR_SERVICE = + String.format("rmi://127.0.0.1:%d/%s", PORT_AUTHENTICATOR_SERVICE, "authenticator"); } diff --git a/banking-server/target/classes/ufrn/imd/BankingServerApp.class b/banking-server/target/classes/ufrn/imd/BankingServerApp.class index 8d5ef782c69ac0f87e6afb4dd4b59b1497d69553..d2be3c2c2aa3de8f81a018455bbf467e4d6bfe88 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/controller/impl/BalanceControllerImpl.class b/banking-server/target/classes/ufrn/imd/controller/impl/BalanceControllerImpl.class index e990c821bbca67e3753e9d7b7726bf02f8827d69..d21c3306c0a4f767e4fda868fd072ae710e59058 100644 Binary files a/banking-server/target/classes/ufrn/imd/controller/impl/BalanceControllerImpl.class and b/banking-server/target/classes/ufrn/imd/controller/impl/BalanceControllerImpl.class differ diff --git a/banking-server/target/classes/ufrn/imd/repository/impl/ClientRepository.class b/banking-server/target/classes/ufrn/imd/repository/impl/ClientRepository.class index c6d086468a406fbde73aefe262c8388575fe861e..9274fcdcb68e9bfc2d8548d156fd2a0d114e1228 100644 Binary files a/banking-server/target/classes/ufrn/imd/repository/impl/ClientRepository.class and b/banking-server/target/classes/ufrn/imd/repository/impl/ClientRepository.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 42a6dfd302b25b75da9780c5ae89421c50754d76..bca364926d480d38728b84a028f4af2299447065 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