Merge branch 'benjamin' into dev
# Conflicts: # app/src/main/resources/appdata.json
This commit is contained in:
commit
3648c1ae73
@ -3,6 +3,7 @@
|
|||||||
*/
|
*/
|
||||||
package lightcontainer;
|
package lightcontainer;
|
||||||
|
|
||||||
|
import lightcontainer.domains.FFETimer;
|
||||||
import lightcontainer.domains.server.MulticastServerListener;
|
import lightcontainer.domains.server.MulticastServerListener;
|
||||||
import lightcontainer.domains.server.UnicastServerListener;
|
import lightcontainer.domains.server.UnicastServerListener;
|
||||||
import lightcontainer.interfaces.ProtocolRepository;
|
import lightcontainer.interfaces.ProtocolRepository;
|
||||||
@ -17,6 +18,7 @@ import lightcontainer.storage.JsonAdapter;
|
|||||||
import lightcontainer.storage.Repository;
|
import lightcontainer.storage.Repository;
|
||||||
|
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
|
import java.util.Timer;
|
||||||
|
|
||||||
public class App {
|
public class App {
|
||||||
|
|
||||||
@ -36,6 +38,11 @@ public class App {
|
|||||||
FileFrontEnd ffe = new FileFrontEnd(clientRep, storeRep, protocolRep);
|
FileFrontEnd ffe = new FileFrontEnd(clientRep, storeRep, protocolRep);
|
||||||
new UnicastServerListener(ffe, clientRep, protocolRep, repositoryStorage, repositoryStorage.getUnicastPort());
|
new UnicastServerListener(ffe, clientRep, protocolRep, repositoryStorage, repositoryStorage.getUnicastPort());
|
||||||
new MulticastServerListener(ffe, storeRep, protocolRep, repositoryStorage.getMulticastIp(), repositoryStorage.getMulticastPort(), repositoryStorage.getNetworkInterface());
|
new MulticastServerListener(ffe, storeRep, protocolRep, repositoryStorage.getMulticastIp(), repositoryStorage.getMulticastPort(), repositoryStorage.getNetworkInterface());
|
||||||
|
|
||||||
|
// S'occupe de distribué les timeout pour les SBE plus connecté et donc de Timeout les clients
|
||||||
|
Timer ffeTimer = new Timer();
|
||||||
|
ffeTimer.schedule(new FFETimer(storeRep), 50000, 50000);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void initProtocols(Repository repositoryStorage, ProtocolRepository protocolRep) {
|
private static void initProtocols(Repository repositoryStorage, ProtocolRepository protocolRep) {
|
||||||
|
34
app/src/main/java/lightcontainer/domains/FFETimer.java
Normal file
34
app/src/main/java/lightcontainer/domains/FFETimer.java
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
package lightcontainer.domains;
|
||||||
|
|
||||||
|
import lightcontainer.interfaces.MulticastSPR;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.temporal.ChronoUnit;
|
||||||
|
import java.util.TimerTask;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class s'occupant de gérer les timeout des différents SBE
|
||||||
|
*/
|
||||||
|
public class FFETimer extends TimerTask {
|
||||||
|
|
||||||
|
private final MulticastSPR processorRepository;
|
||||||
|
|
||||||
|
public FFETimer(MulticastSPR processorRepository) {
|
||||||
|
this.processorRepository = processorRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
System.out.println("Timer 1");
|
||||||
|
for (String domain : processorRepository.getDomains()) {
|
||||||
|
LocalDateTime lastAnnounce = processorRepository.getLastAnnounce(domain);
|
||||||
|
long secondBetween = Math.abs(ChronoUnit.SECONDS.between(lastAnnounce, LocalDateTime.now()));
|
||||||
|
|
||||||
|
System.out.println("Timer 2 : " + secondBetween);
|
||||||
|
if (secondBetween > 50) {
|
||||||
|
System.out.println("Timer 3");
|
||||||
|
processorRepository.closeStore(domain);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -8,7 +8,9 @@ import lightcontainer.protocol.ProtocolWriter;
|
|||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
|
import java.net.SocketException;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -30,6 +32,7 @@ public class StoreProcessor extends Thread implements AutoCloseable {
|
|||||||
private final Socket store;
|
private final Socket store;
|
||||||
private final String domain;
|
private final String domain;
|
||||||
private boolean client_run;
|
private boolean client_run;
|
||||||
|
private LocalDateTime lastAnnounce;
|
||||||
|
|
||||||
private BufferedReader reader;
|
private BufferedReader reader;
|
||||||
private Context context;
|
private Context context;
|
||||||
@ -37,6 +40,7 @@ public class StoreProcessor extends Thread implements AutoCloseable {
|
|||||||
private ProtocolWriter.ProtocolResult protocolResult;
|
private ProtocolWriter.ProtocolResult protocolResult;
|
||||||
private final ProtocolRepository protocolRep;
|
private final ProtocolRepository protocolRep;
|
||||||
|
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
public StoreProcessor(Socket socket, String domain, StoreProcessorFFE ffe, ProtocolRepository protocolRep) {
|
public StoreProcessor(Socket socket, String domain, StoreProcessorFFE ffe, ProtocolRepository protocolRep) {
|
||||||
this.domain = domain;
|
this.domain = domain;
|
||||||
@ -94,8 +98,6 @@ public class StoreProcessor extends Thread implements AutoCloseable {
|
|||||||
try {
|
try {
|
||||||
protocolResult.write(this.store.getOutputStream());
|
protocolResult.write(this.store.getOutputStream());
|
||||||
} catch (IOException writeException) { // Si SBE fermé
|
} catch (IOException writeException) { // Si SBE fermé
|
||||||
System.out.println("STOPPER");
|
|
||||||
writeException.printStackTrace();
|
|
||||||
// Envoie au client que la requête n'a pu être traitée
|
// Envoie au client que la requête n'a pu être traitée
|
||||||
alertAvailable(null);
|
alertAvailable(null);
|
||||||
break;
|
break;
|
||||||
@ -188,6 +190,7 @@ public class StoreProcessor extends Thread implements AutoCloseable {
|
|||||||
public void close() {
|
public void close() {
|
||||||
if (this.client_run) {
|
if (this.client_run) {
|
||||||
this.client_run = false;
|
this.client_run = false;
|
||||||
|
System.out.println("[FERMETURE SBE] " + domain);
|
||||||
// TODO : Gérer déconnection (enlever du repo et prévenir client et FileFrontEnd)
|
// TODO : Gérer déconnection (enlever du repo et prévenir client et FileFrontEnd)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -218,4 +221,19 @@ public class StoreProcessor extends Thread implements AutoCloseable {
|
|||||||
public String getDomain() {
|
public String getDomain() {
|
||||||
return this.domain;
|
return this.domain;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Permet de mettre à jours la dernière annonce de ce SBE au FFE
|
||||||
|
*/
|
||||||
|
public void setLastAnnounce(LocalDateTime lastAnnounce) {
|
||||||
|
this.lastAnnounce = lastAnnounce;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Permet de mettre à jours la dernière annonce de ce SBE au FFE
|
||||||
|
*/
|
||||||
|
public LocalDateTime getLastAnnounce() {
|
||||||
|
return lastAnnounce;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -94,6 +94,8 @@ public class MulticastServerListener implements Runnable {
|
|||||||
// Add the store processor to its repository
|
// Add the store processor to its repository
|
||||||
this.repository.addStore(storeProcessor);
|
this.repository.addStore(storeProcessor);
|
||||||
}
|
}
|
||||||
|
// Contient déjà le SBE donc maj de la dernière activité
|
||||||
|
this.repository.updateLastAnnounce(readerResult.getDomain());
|
||||||
} catch (IOException | ClassCastException exception) {
|
} catch (IOException | ClassCastException exception) {
|
||||||
System.out.println("[ERREUR] Une SBE essaye de se connecter avec une mauvaise configuration : " + exception.getMessage());
|
System.out.println("[ERREUR] Une SBE essaye de se connecter avec une mauvaise configuration : " + exception.getMessage());
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,9 @@ import lightcontainer.domains.client.StoreProcessor;
|
|||||||
import lightcontainer.domains.server.MulticastServerListener;
|
import lightcontainer.domains.server.MulticastServerListener;
|
||||||
import lightcontainer.repository.StoreProcessorRepository;
|
import lightcontainer.repository.StoreProcessorRepository;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A communication interface between a {@link StoreProcessor} and the {@link StoreProcessorRepository}.
|
* A communication interface between a {@link StoreProcessor} and the {@link StoreProcessorRepository}.
|
||||||
*/
|
*/
|
||||||
@ -42,4 +45,23 @@ public interface MulticastSPR {
|
|||||||
* @param domain Le domaine du SBE à déconnecter
|
* @param domain Le domaine du SBE à déconnecter
|
||||||
*/
|
*/
|
||||||
void closeStore(String domain);
|
void closeStore(String domain);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Permet de mettre à jours la dernière annonce de ce SBE au FFE
|
||||||
|
* @param domain Le domain s'annoncant
|
||||||
|
*/
|
||||||
|
void updateLastAnnounce(String domain);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Permet de récupérer les noms des domaines connectés au FFE
|
||||||
|
* @return Les noms des domaines connectés au FFE
|
||||||
|
*/
|
||||||
|
Collection<String> getDomains();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Permet de récupérer la dernière annonce d'un SBE
|
||||||
|
* @return La dernière annonce d'un SBE
|
||||||
|
*/
|
||||||
|
LocalDateTime getLastAnnounce(String domain);
|
||||||
}
|
}
|
||||||
|
@ -47,7 +47,6 @@ public class FileFrontEnd implements ClientHandlerFFE, StoreProcessorFFE {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void onStoreAvailable(StoreProcessor store, ProtocolWriter.ProtocolResult response) {
|
public void onStoreAvailable(StoreProcessor store, ProtocolWriter.ProtocolResult response) {
|
||||||
// TODO : Chercher une tâche appropriée
|
|
||||||
Iterator<Task> it = tasks.iterator();
|
Iterator<Task> it = tasks.iterator();
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
Task task = it.next();
|
Task task = it.next();
|
||||||
|
@ -5,6 +5,8 @@ import lightcontainer.domains.client.StoreProcessor;
|
|||||||
import lightcontainer.domains.server.MulticastServerListener;
|
import lightcontainer.domains.server.MulticastServerListener;
|
||||||
import lightcontainer.interfaces.MulticastSPR;
|
import lightcontainer.interfaces.MulticastSPR;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@ -123,19 +125,54 @@ public class StoreProcessorRepository implements AutoCloseable, MulticastSPR {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void closeStore(String domain) {
|
public void closeStore(String domain) {
|
||||||
Iterator<StoreProcessor> it = this.handlers.iterator();
|
StoreProcessor storeProcessor = getSBE(domain);
|
||||||
|
if (storeProcessor != null) {
|
||||||
System.out.println("1 Nombre de SBE : " + handlers.size());
|
storeProcessor.close();
|
||||||
while (it.hasNext()) {
|
handlers.remove(storeProcessor);
|
||||||
StoreProcessor storeProcessor = it.next();
|
|
||||||
if (storeProcessor.getDomain().equals(domain)) {
|
|
||||||
storeProcessor.close();
|
|
||||||
it.remove();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Permet de mettre à jours la dernière annonce de ce SBE au FFE
|
||||||
|
*
|
||||||
|
* @param domain Le domain s'annoncant
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void updateLastAnnounce(String domain) {
|
||||||
|
StoreProcessor storeProcessor = getSBE(domain);
|
||||||
|
if (storeProcessor != null) {
|
||||||
|
storeProcessor.setLastAnnounce(LocalDateTime.now());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Permet de récupérer les noms des domaines connectés au FFE
|
||||||
|
*
|
||||||
|
* @return Les noms des domaines connectés au FFE
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Collection<String> getDomains() {
|
||||||
|
Set<String> domains = new HashSet<>();
|
||||||
|
|
||||||
|
for (StoreProcessor domain : handlers) {
|
||||||
|
domains.add(domain.getDomain());
|
||||||
|
}
|
||||||
|
|
||||||
|
return domains;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Permet de récupérer la dernière annonce d'un SBE
|
||||||
|
*
|
||||||
|
* @param domain
|
||||||
|
* @return La dernière annonce d'un SBE
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public LocalDateTime getLastAnnounce(String domain) {
|
||||||
|
StoreProcessor storeProcessor = getSBE(domain);
|
||||||
|
return storeProcessor == null ? null : storeProcessor.getLastAnnounce();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* AutoClosable Function
|
* AutoClosable Function
|
||||||
* Closes all StoreProcessor stored in this repository and deallocates all resources.
|
* Closes all StoreProcessor stored in this repository and deallocates all resources.
|
||||||
@ -149,4 +186,7 @@ public class StoreProcessorRepository implements AutoCloseable, MulticastSPR {
|
|||||||
// Close each client.
|
// Close each client.
|
||||||
this.handlers.forEach(StoreProcessor::close);
|
this.handlers.forEach(StoreProcessor::close);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -2,15 +2,23 @@
|
|||||||
"unicast_port": 8000,
|
"unicast_port": 8000,
|
||||||
"multicast_ip": "224.66.66.1",
|
"multicast_ip": "224.66.66.1",
|
||||||
"multicast_port": 15502,
|
"multicast_port": 15502,
|
||||||
"network_interface": "lo",
|
"network_interface": "wlp1s0",
|
||||||
"tls": true,
|
"tls": true,
|
||||||
"storagePath": "C:\\Users\\ledou\\Documents\\ffe",
|
"storagePath": "/home/benjamin/ffe",
|
||||||
"users": [
|
"users": [
|
||||||
|
{
|
||||||
|
"name": "benjamin",
|
||||||
|
"password": "$2a$10$I4vHt83CTYuQCP7xvZ04Ne7Vb0cswBiVZhV0n23k9FCxoH0ny9fZG",
|
||||||
|
"aes_key": "mAP6izUBUhBxIkakH2yB/TplhRz1OQV5Fp6HQmhywns=",
|
||||||
|
"files": [
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "aaaaa",
|
"name": "aaaaa",
|
||||||
"password": "$2a$10$6KbB.cBqsWyRExIf2ugkhebsJOhUG9goXFEfOYWXJI4dOQNT1uXhu",
|
"password": "$2a$10$nDCEDVwbNO/YDQ4qdRcxfuES4.aboluLzWouXXsk6vDoaWocv516W",
|
||||||
"aes_key": "2gYT1TeILBswvCbxAth24ZNLtFhaA1zvdJmtfh0unNE=",
|
"aes_key": "kYtwHy9qJBg30WS6axWTFGVE0Ge5kpYiJJlC+COIEI4=",
|
||||||
"files": []
|
"files": [
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user