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

initial commit

parent 44ed2321
No related branches found
No related tags found
1 merge request!1Client state machine
Showing
with 69 additions and 100 deletions
...@@ -2,7 +2,7 @@ package ufrn.imd.controller.impl; ...@@ -2,7 +2,7 @@ package ufrn.imd.controller.impl;
import ufrn.imd.controller.Controller; import ufrn.imd.controller.Controller;
import ufrn.imd.domain.Client; import ufrn.imd.domain.Client;
import ufrn.imd.service.BalanceService; import ufrn.imd.service.impl.BalanceServiceImpl;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException; import java.rmi.AlreadyBoundException;
...@@ -10,9 +10,7 @@ import java.rmi.Naming; ...@@ -10,9 +10,7 @@ import java.rmi.Naming;
import java.rmi.RemoteException; import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry; import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject; import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Optional;
import static ufrn.imd.utils.NameSpace.HOST_BALANCE_SERVICE; import static ufrn.imd.utils.NameSpace.HOST_BALANCE_SERVICE;
import static ufrn.imd.utils.NameSpace.PORT_BALANCE_SERVICE; import static ufrn.imd.utils.NameSpace.PORT_BALANCE_SERVICE;
...@@ -20,9 +18,9 @@ import static ufrn.imd.utils.NameSpace.PORT_BALANCE_SERVICE; ...@@ -20,9 +18,9 @@ import static ufrn.imd.utils.NameSpace.PORT_BALANCE_SERVICE;
@lombok.extern.java.Log @lombok.extern.java.Log
public class BalanceControllerImpl extends UnicastRemoteObject implements Controller { public class BalanceControllerImpl extends UnicastRemoteObject implements Controller {
private volatile List<Client> clients = new ArrayList<>(); private volatile Queue<Client> clients = new ArrayDeque<>();
public BalanceControllerImpl(BalanceService service) throws RemoteException, MalformedURLException, AlreadyBoundException { public BalanceControllerImpl(BalanceServiceImpl service) throws RemoteException, MalformedURLException, AlreadyBoundException {
super(); super();
LocateRegistry.createRegistry(PORT_BALANCE_SERVICE); LocateRegistry.createRegistry(PORT_BALANCE_SERVICE);
...@@ -46,9 +44,9 @@ public class BalanceControllerImpl extends UnicastRemoteObject implements Contro ...@@ -46,9 +44,9 @@ public class BalanceControllerImpl extends UnicastRemoteObject implements Contro
private class Notify extends Thread{ private class Notify extends Thread{
private final BalanceService service; private final BalanceServiceImpl service;
public Notify(BalanceService service) { public Notify(BalanceServiceImpl service) {
super(); super();
this.service = service; this.service = service;
} }
...@@ -59,29 +57,24 @@ public class BalanceControllerImpl extends UnicastRemoteObject implements Contro ...@@ -59,29 +57,24 @@ public class BalanceControllerImpl extends UnicastRemoteObject implements Contro
log.info("notyfing the clients!"); log.info("notyfing the clients!");
int i = 0; int i = 0;
for (Client client : clients) { clients.stream().forEach(client -> {
try { try {
this.service.balance(Optional.of(client.getAccount()));
log.info(String.format("Clients waiting %d", clients.size()));
this.service.balance(Optional.of(client));
clients.remove();
log.info(String.format("Clients waiting %d", clients.size()));
} catch (RemoteException e) { } catch (RemoteException e) {
e.printStackTrace(); e.printStackTrace();
} }
} });
try { try {
Thread.sleep(15 * 1000); Thread.sleep(15 * 1000);
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
} }
} else {
try {
Thread.sleep(15 * 1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
log.info("No there's clients!");
} }
} }
} }
......
...@@ -3,7 +3,7 @@ package ufrn.imd.controller.impl; ...@@ -3,7 +3,7 @@ package ufrn.imd.controller.impl;
import lombok.extern.java.Log; import lombok.extern.java.Log;
import ufrn.imd.controller.Controller; import ufrn.imd.controller.Controller;
import ufrn.imd.domain.Client; import ufrn.imd.domain.Client;
import ufrn.imd.service.DepositService; import ufrn.imd.service.impl.DepositServiceImpl;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException; import java.rmi.AlreadyBoundException;
...@@ -11,9 +11,7 @@ import java.rmi.Naming; ...@@ -11,9 +11,7 @@ import java.rmi.Naming;
import java.rmi.RemoteException; import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry; import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject; import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Optional;
import static ufrn.imd.utils.NameSpace.HOST_DEPOSIT_SERVICE; import static ufrn.imd.utils.NameSpace.HOST_DEPOSIT_SERVICE;
import static ufrn.imd.utils.NameSpace.PORT_DEPOSIT_SERVICE; import static ufrn.imd.utils.NameSpace.PORT_DEPOSIT_SERVICE;
...@@ -21,8 +19,8 @@ import static ufrn.imd.utils.NameSpace.PORT_DEPOSIT_SERVICE; ...@@ -21,8 +19,8 @@ import static ufrn.imd.utils.NameSpace.PORT_DEPOSIT_SERVICE;
@Log @Log
public class DepositControllerImpl extends UnicastRemoteObject implements Controller { public class DepositControllerImpl extends UnicastRemoteObject implements Controller {
private volatile List<Client> clients = new ArrayList<>(); private volatile Queue<Client> clients = new ArrayDeque<>();
public DepositControllerImpl(DepositService service) throws RemoteException, MalformedURLException, AlreadyBoundException { public DepositControllerImpl(DepositServiceImpl service) throws RemoteException, MalformedURLException, AlreadyBoundException {
super(); super();
log.info("Starting Deposit service!"); log.info("Starting Deposit service!");
...@@ -46,9 +44,9 @@ public class DepositControllerImpl extends UnicastRemoteObject implements Contro ...@@ -46,9 +44,9 @@ public class DepositControllerImpl extends UnicastRemoteObject implements Contro
private class Notify extends Thread{ private class Notify extends Thread{
private final DepositService service; private final DepositServiceImpl service;
public Notify(DepositService service) { public Notify(DepositServiceImpl service) {
super(); super();
this.service = service; this.service = service;
} }
...@@ -60,31 +58,23 @@ public class DepositControllerImpl extends UnicastRemoteObject implements Contro ...@@ -60,31 +58,23 @@ public class DepositControllerImpl extends UnicastRemoteObject implements Contro
log.info("notyfing the clients!"); log.info("notyfing the clients!");
int i = 0; int i = 0;
for (Client client : clients) { clients.stream().forEach(client -> {
try { try {
this.service.deposit(200.00, Optional.of(client.getAccount())); log.info(String.format("Clients waiting %d", clients.size()));
this.service.deposit(200.00, Optional.of(client));
clients.remove();
log.info(String.format("Clients waiting %d", clients.size()));
} catch (RemoteException e) { } catch (RemoteException e) {
e.printStackTrace(); e.printStackTrace();
} }
} });
try { try {
Thread.sleep(15 * 1000); Thread.sleep(15 * 1000);
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
} }
} else {
try {
Thread.sleep(15 * 1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
log.info("No there's clients!");
} }
} }
} }
......
package ufrn.imd.repository; package ufrn.imd.repository;
import java.util.List; import java.util.List;
import java.util.Optional;
public interface Repository <T>{ public interface Repository <T>{
public T find(Integer id); public Optional<T> find(Integer id);
public List<T> findAll(); public List<T> findAll();
} }
package ufrn.imd.repository.impl; package ufrn.imd.repository.impl;
import ufrn.imd.domain.Account;
import ufrn.imd.domain.Client; import ufrn.imd.domain.Client;
import ufrn.imd.repository.Repository; import ufrn.imd.repository.Repository;
import java.util.List; import java.util.List;
import java.util.Optional;
public class ClientRepository implements Repository<Client> { public class ClientRepository implements Repository<Client> {
List<Client> clients = List.of( List<Client> clients = List.of(
new Client(), new Client(1, "Fernando Feirreira", new Account(1, "321456789", 200.00)),
new Client() new Client(2, "Maria Eduarda", new Account(2, "987654321", 100.00))
); );
@Override @Override
public Client find(Integer id) { public Optional<Client> find(Integer id) {
return (Client) clients.stream().filter(c -> c.getId().equals(id)); return Optional.of(clients.get(id));
} }
@Override @Override
......
package ufrn.imd.service;
import ufrn.imd.domain.Account;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.Optional;
public interface BalanceService extends Remote {
public void balance(Optional<Account> account) throws RemoteException;
}
package ufrn.imd.service;
import ufrn.imd.domain.Account;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.Optional;
public interface DepositService extends Remote {
public void deposit(Double value, Optional<Account> account) throws RemoteException, RuntimeException;
}
package ufrn.imd.service;
public interface Service<T> {
}
package ufrn.imd.service;
import ufrn.imd.domain.Account;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface WidthawService extends Remote {
public void widthaw(Double value, Account account) throws RemoteException;
}
package ufrn.imd.service.impl; package ufrn.imd.service.impl;
import lombok.RequiredArgsConstructor;
import lombok.extern.java.Log; import lombok.extern.java.Log;
import ufrn.imd.domain.Account; import ufrn.imd.domain.Account;
import ufrn.imd.service.BalanceService; import ufrn.imd.domain.Client;
import ufrn.imd.repository.Repository;
import ufrn.imd.service.Service;
import java.rmi.RemoteException; import java.rmi.RemoteException;
import java.util.Optional; import java.util.Optional;
@Log @Log
public class BalanceServiceImpl implements BalanceService { @RequiredArgsConstructor
public class BalanceServiceImpl implements Service {
@Override private final Repository<Client> clientRepository;
public void balance(Optional<Account> accOP) throws RemoteException {
Account account = accOP.orElseThrow(() -> new RuntimeException("Invalid account")); public void balance(Optional<Client> clientOptional) throws RemoteException {
Client user = clientOptional
.orElseThrow(() -> new RuntimeException("NULL USER"));
Client client = clientRepository.find(user.getId())
.orElseThrow(() -> new RuntimeException("Invalid user!"));
Account account = client.getAccount();
log.info(String.format("Account Balance: R$ %f", account.getBalance())); log.info(String.format("Account Balance: R$ %f", account.getBalance()));
} }
......
package ufrn.imd.service.impl; package ufrn.imd.service.impl;
import lombok.RequiredArgsConstructor;
import lombok.extern.java.Log; import lombok.extern.java.Log;
import ufrn.imd.domain.Account; import ufrn.imd.domain.Account;
import ufrn.imd.service.DepositService; import ufrn.imd.domain.Client;
import ufrn.imd.repository.Repository;
import ufrn.imd.service.Service;
import java.rmi.RemoteException; import java.rmi.RemoteException;
import java.util.Optional; import java.util.Optional;
@Log @Log
public class DepositServiceImpl implements DepositService { @RequiredArgsConstructor
public class DepositServiceImpl implements Service {
public DepositServiceImpl() {
super();
}
public void deposit(Double value, Optional<Account> acOp) throws RemoteException, RuntimeException { private final Repository<Client> repository;
Account account = acOp.orElseThrow(() -> new RuntimeException("Null User!"));
if(account.getBalance() < value) throw new RuntimeException("There's no money!"); public void deposit(Double value, Optional<Client> clientOptional) throws RemoteException, RuntimeException {
account.setBalance(account.getBalance() - value); Client user = clientOptional
log.info("deposit"); .orElseThrow(() -> new RuntimeException("Null User!"));
Client client = repository.find(user.getId())
.orElseThrow(() -> new RuntimeException("Invalid user!"));
Account account = client.getAccount();
account.setBalance(account.getBalance() + value);
log.info(String.format("Deposit concluded!"));
log.info(String.format("Total: %.2f", account.getBalance()));
} }
} }
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
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