Skip to content
Snippets Groups Projects
Commit 0a9e0ff4 authored by Fernando Ferreira de Lima Filho's avatar Fernando Ferreira de Lima Filho
Browse files

Merge branch 'authenticator' into 'master'

Authenticator

See merge request !3
parents 78fa6171 6f22cc49
No related branches found
No related tags found
1 merge request!3Authenticator
Showing
with 158 additions and 31 deletions
# Sistema Bancário
O objetivo deste trabalho é desenvolver um sistema utilizando Java Remote Method Invocation (RMI). O software desenvolvido trata-se de um sistema bancário com transações sobre contas em máquinas diferentes.
## Execução
Em `banking-server/src/main/java/ufrn/imd`, execute a seguinte classe para rodar o Servidor:
```
BankingServerApp.java
```
Já para rodar o Cliente, execute a classe abaixo em `banking-client/src/main/java/ufrn/imd`:
```
BankingClientApp.java
```
### Predefinição
Ao iniciar o Cliente, será necessário informar o número da conta bancária para começar a utilizar a máquina. Existem duas contas predefinidas e seus números são:
- `321`
- `123`
## Desenvolvedores
- Fernando Ferreira de Lima Filho
- Maria Eduarda Eloi Pereira
\ No newline at end of file
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();
}
}
}
}
......@@ -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);
}
}
}
......
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");
......
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);
}
}
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;
}
}
......@@ -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));
......
......@@ -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, "321", 200.00)),
new Client(1, "Maria Eduarda", new Account(2, "123", 100.00))
);
@Override
......
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();
}
}
......@@ -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");
}
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment