diff --git a/banking-server/.idea/.gitignore b/banking-server/.idea/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..26d33521af10bcc7fd8cea344038eaaeb78d0ef5 --- /dev/null +++ b/banking-server/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/banking-server/.idea/compiler.xml b/banking-server/.idea/compiler.xml new file mode 100644 index 0000000000000000000000000000000000000000..1e78cc9ce0775fa751b7c9ccd7da8294958c203e --- /dev/null +++ b/banking-server/.idea/compiler.xml @@ -0,0 +1,13 @@ +<?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 diff --git a/banking-server/.idea/jarRepositories.xml b/banking-server/.idea/jarRepositories.xml new file mode 100644 index 0000000000000000000000000000000000000000..712ab9d985c20018a0c97b93d2148ac1ffe588a5 --- /dev/null +++ b/banking-server/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ +<?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 diff --git a/banking-server/.idea/misc.xml b/banking-server/.idea/misc.xml new file mode 100644 index 0000000000000000000000000000000000000000..82dbec8ad28463aed32007a93ffc07865ae98968 --- /dev/null +++ b/banking-server/.idea/misc.xml @@ -0,0 +1,14 @@ +<?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 diff --git a/banking-server/.idea/vcs.xml b/banking-server/.idea/vcs.xml new file mode 100644 index 0000000000000000000000000000000000000000..6c0b8635858dc7ad44b93df54b762707ce49eefc --- /dev/null +++ b/banking-server/.idea/vcs.xml @@ -0,0 +1,6 @@ +<?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 diff --git a/banking-server/pom.xml b/banking-server/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..24fae7265aee1c22e3135dbfa626824d5ed60414 --- /dev/null +++ b/banking-server/pom.xml @@ -0,0 +1,24 @@ +<?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 diff --git a/banking-server/src/main/java/ufrn/imd/BankingServerApp.java b/banking-server/src/main/java/ufrn/imd/BankingServerApp.java new file mode 100644 index 0000000000000000000000000000000000000000..4fed7390ea3b7b3ab9901b8f402f99065adf9142 --- /dev/null +++ b/banking-server/src/main/java/ufrn/imd/BankingServerApp.java @@ -0,0 +1,26 @@ +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); + + + } +} diff --git a/banking-server/src/main/java/ufrn/imd/controller/Controller.java b/banking-server/src/main/java/ufrn/imd/controller/Controller.java new file mode 100644 index 0000000000000000000000000000000000000000..824205a78effedd521e934e17809e5bfcc593a71 --- /dev/null +++ b/banking-server/src/main/java/ufrn/imd/controller/Controller.java @@ -0,0 +1,11 @@ +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; + +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..dc21b11936e60d061398e839a9db450efbc06a09 --- /dev/null +++ b/banking-server/src/main/java/ufrn/imd/controller/impl/BalanceControllerImpl.java @@ -0,0 +1,95 @@ +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!"); + } + + } + + } + } +} diff --git a/banking-server/src/main/java/ufrn/imd/controller/impl/DepositControllerImpl.java b/banking-server/src/main/java/ufrn/imd/controller/impl/DepositControllerImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..b84139bb0adcd15f13adc87041a4f413fdf22395 --- /dev/null +++ b/banking-server/src/main/java/ufrn/imd/controller/impl/DepositControllerImpl.java @@ -0,0 +1,95 @@ +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!"); + + + } + + } + + } + } +} diff --git a/banking-server/src/main/java/ufrn/imd/domain/Account.java b/banking-server/src/main/java/ufrn/imd/domain/Account.java new file mode 100644 index 0000000000000000000000000000000000000000..b800c2b5e40faa5cb6f77e193b481f8cbfef4c63 --- /dev/null +++ b/banking-server/src/main/java/ufrn/imd/domain/Account.java @@ -0,0 +1,18 @@ +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; +} diff --git a/banking-server/src/main/java/ufrn/imd/domain/Client.java b/banking-server/src/main/java/ufrn/imd/domain/Client.java new file mode 100644 index 0000000000000000000000000000000000000000..2ce2883a03653dd579c048e503b3b111c1f7b540 --- /dev/null +++ b/banking-server/src/main/java/ufrn/imd/domain/Client.java @@ -0,0 +1,22 @@ +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; + +} diff --git a/banking-server/src/main/java/ufrn/imd/repository/Repository.java b/banking-server/src/main/java/ufrn/imd/repository/Repository.java new file mode 100644 index 0000000000000000000000000000000000000000..636bf2b106b30a65c27fda39b3f13dff1cdba66b --- /dev/null +++ b/banking-server/src/main/java/ufrn/imd/repository/Repository.java @@ -0,0 +1,9 @@ +package ufrn.imd.repository; + +import java.util.List; + +public interface Repository <T>{ + + public T find(Integer id); + public List<T> findAll(); +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..bce53daec4d91cc27933567b4ebe37c7fd72483a --- /dev/null +++ b/banking-server/src/main/java/ufrn/imd/repository/impl/ClientRepository.java @@ -0,0 +1,24 @@ +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; + } +} diff --git a/banking-server/src/main/java/ufrn/imd/service/BalanceService.java b/banking-server/src/main/java/ufrn/imd/service/BalanceService.java new file mode 100644 index 0000000000000000000000000000000000000000..b82470c15060014b18ce9c6323ca2a37a5268fee --- /dev/null +++ b/banking-server/src/main/java/ufrn/imd/service/BalanceService.java @@ -0,0 +1,12 @@ +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; +} diff --git a/banking-server/src/main/java/ufrn/imd/service/DepositService.java b/banking-server/src/main/java/ufrn/imd/service/DepositService.java new file mode 100644 index 0000000000000000000000000000000000000000..aab39ac63fd5da6827a9ee113ba692da9902459e --- /dev/null +++ b/banking-server/src/main/java/ufrn/imd/service/DepositService.java @@ -0,0 +1,13 @@ +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; + +} diff --git a/banking-server/src/main/java/ufrn/imd/service/WidthawService.java b/banking-server/src/main/java/ufrn/imd/service/WidthawService.java new file mode 100644 index 0000000000000000000000000000000000000000..8a5ed3baa7ecd8367276729a144c1ff882a35bed --- /dev/null +++ b/banking-server/src/main/java/ufrn/imd/service/WidthawService.java @@ -0,0 +1,12 @@ +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; + +} diff --git a/banking-server/src/main/java/ufrn/imd/service/impl/BalanceServiceImpl.java b/banking-server/src/main/java/ufrn/imd/service/impl/BalanceServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..85bb341088b94f1575ef1d3ff09d42828a4f8a05 --- /dev/null +++ b/banking-server/src/main/java/ufrn/imd/service/impl/BalanceServiceImpl.java @@ -0,0 +1,22 @@ +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()) + ); + + } +} diff --git a/banking-server/src/main/java/ufrn/imd/service/impl/DepositServiceImpl.java b/banking-server/src/main/java/ufrn/imd/service/impl/DepositServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..1909f69583722458b1c6a10029c86bab6581eb50 --- /dev/null +++ b/banking-server/src/main/java/ufrn/imd/service/impl/DepositServiceImpl.java @@ -0,0 +1,23 @@ +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"); + } + +} diff --git a/banking-server/src/main/java/ufrn/imd/utils/Log.java b/banking-server/src/main/java/ufrn/imd/utils/Log.java new file mode 100644 index 0000000000000000000000000000000000000000..38d3f87c29c5bba875697400c9d9fecad5cbe99a --- /dev/null +++ b/banking-server/src/main/java/ufrn/imd/utils/Log.java @@ -0,0 +1,10 @@ +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) + ); + } +} diff --git a/banking-server/src/main/java/ufrn/imd/utils/NameSpace.java b/banking-server/src/main/java/ufrn/imd/utils/NameSpace.java new file mode 100644 index 0000000000000000000000000000000000000000..bb5d5251a3090f100905b78e8f8fe9d47f290cb1 --- /dev/null +++ b/banking-server/src/main/java/ufrn/imd/utils/NameSpace.java @@ -0,0 +1,11 @@ +package ufrn.imd.utils; + +public class NameSpace { + + public final static Integer PORT_BALANCE_SERVICE = 1908; + public final static Integer PORT_DEPOSIT_SERVICE = 1907; + 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"); +} diff --git a/banking-server/target/classes/ufrn/imd/BankingServerApp.class b/banking-server/target/classes/ufrn/imd/BankingServerApp.class new file mode 100644 index 0000000000000000000000000000000000000000..e981c23cd377d28abc4078145c4d6009f4c2c7e6 Binary files /dev/null and b/banking-server/target/classes/ufrn/imd/BankingServerApp.class differ diff --git a/banking-server/target/classes/ufrn/imd/controller/Controller.class b/banking-server/target/classes/ufrn/imd/controller/Controller.class new file mode 100644 index 0000000000000000000000000000000000000000..4707c271c661d159f8019f881ffc3f31e61a85d3 Binary files /dev/null and b/banking-server/target/classes/ufrn/imd/controller/Controller.class differ diff --git a/banking-server/target/classes/ufrn/imd/domain/Account.class b/banking-server/target/classes/ufrn/imd/domain/Account.class new file mode 100644 index 0000000000000000000000000000000000000000..a4b43e01d80f1a91b78f2901d9f2ba08f07e460b Binary files /dev/null and b/banking-server/target/classes/ufrn/imd/domain/Account.class differ diff --git a/banking-server/target/classes/ufrn/imd/domain/Client.class b/banking-server/target/classes/ufrn/imd/domain/Client.class new file mode 100644 index 0000000000000000000000000000000000000000..bb9cd9b4e1c8f13d9f1421b515a67c9eb8a0a2d7 Binary files /dev/null and b/banking-server/target/classes/ufrn/imd/domain/Client.class differ diff --git a/banking-server/target/classes/ufrn/imd/utils/NameSpace.class b/banking-server/target/classes/ufrn/imd/utils/NameSpace.class new file mode 100644 index 0000000000000000000000000000000000000000..8e3544457d0587d06e53b5e9bf8eaaace60ff7db Binary files /dev/null and b/banking-server/target/classes/ufrn/imd/utils/NameSpace.class differ diff --git a/banking/src/ufrn/imd/repository/Repository.java b/banking/src/ufrn/imd/repository/Repository.java new file mode 100644 index 0000000000000000000000000000000000000000..a7b91a12159bbe271354734417cea2e75cf9e69e --- /dev/null +++ b/banking/src/ufrn/imd/repository/Repository.java @@ -0,0 +1,2 @@ +package ufrn.imd.repository;public interface Repository { +} diff --git a/banking/src/ufrn/imd/repository/impl/ClientRepository.java b/banking/src/ufrn/imd/repository/impl/ClientRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..271350123a335b0e483b47667d4d6b446e0e29c8 --- /dev/null +++ b/banking/src/ufrn/imd/repository/impl/ClientRepository.java @@ -0,0 +1,2 @@ +package ufrn.imd.repository.impl;public class ClientRepository { +}