Skip to content
Snippets Groups Projects
Commit 6ea0fd08 authored by unknown's avatar unknown
Browse files

Banking server

parent 04615562
No related branches found
No related tags found
No related merge requests found
Showing
with 472 additions and 0 deletions
# Default ignored files
/shelf/
/workspace.xml
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="banking-server" />
</profile>
</annotationProcessing>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="https://repo.maven.apache.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>banking-server</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package ufrn.imd;
import ufrn.imd.controller.Controller;
import ufrn.imd.controller.impl.BalanceControllerImpl;
import ufrn.imd.controller.impl.DepositControllerImpl;
import ufrn.imd.service.BalanceService;
import ufrn.imd.service.DepositService;
import ufrn.imd.service.impl.BalanceServiceImpl;
import ufrn.imd.service.impl.DepositServiceImpl;
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
public class BankingServerApp {
public static void main(String[] args) throws RemoteException, MalformedURLException, AlreadyBoundException {
DepositService depositService = new DepositServiceImpl();
BalanceService balanceService = new BalanceServiceImpl();
Controller depositController = new DepositControllerImpl(depositService);
Controller balanceController = new BalanceControllerImpl(balanceService);
}
}
package ufrn.imd.controller;
import ufrn.imd.domain.Client;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Controller extends Remote {
public void registerClient(Client client) throws RemoteException;
}
package ufrn.imd.controller.impl;
import ufrn.imd.controller.Controller;
import ufrn.imd.domain.Client;
import ufrn.imd.service.BalanceService;
import ufrn.imd.service.impl.BalanceServiceImpl;
import ufrn.imd.utils.Log;
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.ArrayList;
import java.util.List;
import java.util.Optional;
import static ufrn.imd.utils.NameSpace.HOST_BALANCE_SERVICE;
import static ufrn.imd.utils.NameSpace.PORT_BALANCE_SERVICE;
public class BalanceControllerImpl extends UnicastRemoteObject implements Controller {
private volatile List<Client> clients = new ArrayList<>();
public BalanceControllerImpl(BalanceService service) throws RemoteException, MalformedURLException, AlreadyBoundException {
super();
Log.info(BalanceServiceImpl.class, "Starting Deposit service!");
new Notify(service).start();
Log.info(BalanceServiceImpl.class,
String.format("Initializing server in %s", HOST_BALANCE_SERVICE));
LocateRegistry.createRegistry(PORT_BALANCE_SERVICE);
Naming.bind(HOST_BALANCE_SERVICE, this);
}
@Override
public void registerClient(Client client) throws RemoteException {
clients.add(client);
Log.info(BalanceService.class, "new client registred");
Log.info(BalanceService.class, String.format("total users: %d", clients.size()));
}
private class Notify extends Thread{
private final BalanceService service;
public Notify(BalanceService service) {
super();
this.service = service;
}
public void run() {
for(;;) {
if(clients.size() > 0) {
Log.info(
BalanceService.class,
"notyfing the clients!"
);
int i = 0;
for (Client client : clients) {
try {
this.service.balance(Optional.of(client.getAccount()));
} catch (RemoteException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(15 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
try {
Thread.sleep(15 * 1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
Log.info(BalanceService.class, "No there's clients!");
}
}
}
}
}
package ufrn.imd.controller.impl;
import ufrn.imd.controller.Controller;
import ufrn.imd.domain.Client;
import ufrn.imd.service.DepositService;
import ufrn.imd.utils.Log;
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.ArrayList;
import java.util.List;
import java.util.Optional;
import static ufrn.imd.utils.NameSpace.HOST_DEPOSIT_SERVICE;
import static ufrn.imd.utils.NameSpace.PORT_DEPOSIT_SERVICE;
public class DepositControllerImpl extends UnicastRemoteObject implements Controller {
private volatile List<Client> clients = new ArrayList<>();
public DepositControllerImpl(DepositService service) throws RemoteException, MalformedURLException, AlreadyBoundException {
super();
Log.info(DepositControllerImpl.class, "Starting Deposit service!");
new Notify(service).start();
Log.info(DepositControllerImpl.class,
String.format("Initializing server in %s", HOST_DEPOSIT_SERVICE));
LocateRegistry.createRegistry(PORT_DEPOSIT_SERVICE);
Naming.bind(HOST_DEPOSIT_SERVICE, this);
}
@Override
public void registerClient(Client client) throws RemoteException {
clients.add(client);
Log.info(DepositControllerImpl.class, "new client registred");
Log.info(DepositControllerImpl.class, String.format("total users: %d", clients.size()));
}
private class Notify extends Thread{
private final DepositService service;
public Notify(DepositService service) {
super();
this.service = service;
}
public void run() {
for(;;) {
if(clients.size() > 0) {
Log.info(
DepositControllerImpl.class,
"notyfing the clients!"
);
int i = 0;
for (Client client : clients) {
try {
this.service.deposit(200.00, Optional.of(client.getAccount()));
} catch (RemoteException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(15 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
try {
Thread.sleep(15 * 1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
Log.info(DepositControllerImpl.class, "No there's clients!");
}
}
}
}
}
package ufrn.imd.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Account implements Serializable {
private static final long serialVersionUID = 2L;
private Integer id;
private String number;
private Double balance;
}
package ufrn.imd.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Client implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private Account account;
}
package ufrn.imd.repository;
import java.util.List;
public interface Repository <T>{
public T find(Integer id);
public List<T> findAll();
}
package ufrn.imd.repository.impl;
import ufrn.imd.domain.Client;
import ufrn.imd.repository.Repository;
import java.util.List;
public class ClientRepository implements Repository<Client> {
List<Client> clients = List.of(
new Client(),
new Client()
);
@Override
public Client find(Integer id) {
return (Client) clients.stream().filter(c -> c.getId().equals(id));
}
@Override
public List<Client> findAll() {
return clients;
}
}
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;
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;
import ufrn.imd.domain.Account;
import ufrn.imd.service.BalanceService;
import ufrn.imd.utils.Log;
import java.rmi.RemoteException;
import java.util.Optional;
public class BalanceServiceImpl implements BalanceService {
@Override
public void balance(Optional<Account> accOP) throws RemoteException {
Account account = accOP.orElseThrow(() -> new RuntimeException("Invalid account"));
Log.info(
BalanceServiceImpl.class,
String.format("Account Balance: R$ %f", account.getBalance())
);
}
}
package ufrn.imd.service.impl;
import ufrn.imd.domain.Account;
import ufrn.imd.service.DepositService;
import ufrn.imd.utils.Log;
import java.rmi.RemoteException;
import java.util.Optional;
public class DepositServiceImpl implements DepositService {
public DepositServiceImpl() {
super();
}
public void deposit(Double value, Optional<Account> acOp) throws RemoteException, RuntimeException {
Account account = acOp.orElseThrow(() -> new RuntimeException("Null User!"));
if(account.getBalance() < value) throw new RuntimeException("There's no money!");
account.setBalance(account.getBalance() - value);
Log.info(DepositServiceImpl.class, "deposit");
}
}
package ufrn.imd.utils;
public class Log {
public static void info(Class path, String text) {
System.out.println(
String.format("[LOG] %s - %s", path , text)
);
}
}
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