Merge branch 'jeremi' into 'dev'
Réception d'un fichier prototype, correction de bugs See merge request !1
This commit is contained in:
commit
31e8ac2bd2
@ -8,7 +8,9 @@ import lightcontainer.domains.server.UnicastServerListener;
|
|||||||
import lightcontainer.interfaces.MulticastSPR;
|
import lightcontainer.interfaces.MulticastSPR;
|
||||||
import lightcontainer.interfaces.ProtocolRepository;
|
import lightcontainer.interfaces.ProtocolRepository;
|
||||||
import lightcontainer.protocol.ProtocolReader;
|
import lightcontainer.protocol.ProtocolReader;
|
||||||
|
import lightcontainer.protocol.rules.reader.FilelistRule;
|
||||||
import lightcontainer.protocol.rules.reader.HelloRule;
|
import lightcontainer.protocol.rules.reader.HelloRule;
|
||||||
|
import lightcontainer.protocol.rules.reader.SavefileRule;
|
||||||
import lightcontainer.protocol.rules.reader.SigninRule;
|
import lightcontainer.protocol.rules.reader.SigninRule;
|
||||||
import lightcontainer.protocol.rules.writer.SignError;
|
import lightcontainer.protocol.rules.writer.SignError;
|
||||||
import lightcontainer.protocol.rules.writer.SignOk;
|
import lightcontainer.protocol.rules.writer.SignOk;
|
||||||
@ -33,11 +35,12 @@ public class App {
|
|||||||
|
|
||||||
protocolRep.addReader(new HelloRule());
|
protocolRep.addReader(new HelloRule());
|
||||||
protocolRep.addReader(new SigninRule());
|
protocolRep.addReader(new SigninRule());
|
||||||
|
protocolRep.addReader(new FilelistRule());
|
||||||
|
protocolRep.addReader(new SavefileRule());
|
||||||
|
|
||||||
protocolRep.addWriter(new SignOk());
|
protocolRep.addWriter(new SignOk());
|
||||||
protocolRep.addWriter(new SignError());
|
protocolRep.addWriter(new SignError());
|
||||||
|
|
||||||
|
|
||||||
new UnicastServerListener(clientRep, protocolRep, UNICAST_PORT);
|
new UnicastServerListener(clientRep, protocolRep, UNICAST_PORT);
|
||||||
new MulticastServerListener(storeRep, protocolRep, MULTICAST_IP, MULTICAST_PORT);
|
new MulticastServerListener(storeRep, protocolRep, MULTICAST_IP, MULTICAST_PORT);
|
||||||
FileFrontEnd ffe = new FileFrontEnd(clientRep, storeRep, protocolRep);
|
FileFrontEnd ffe = new FileFrontEnd(clientRep, storeRep, protocolRep);
|
||||||
|
@ -61,12 +61,12 @@ public class ClientHandler implements Runnable, AutoCloseable {
|
|||||||
private void initClient() {
|
private void initClient() {
|
||||||
try {
|
try {
|
||||||
this.reader = new BufferedReader(new InputStreamReader(
|
this.reader = new BufferedReader(new InputStreamReader(
|
||||||
this.client.getInputStream(),
|
this.client.getInputStream(),
|
||||||
StandardCharsets.UTF_8
|
StandardCharsets.UTF_8
|
||||||
));
|
));
|
||||||
this.writer = new PrintWriter(new OutputStreamWriter(
|
this.writer = new PrintWriter(new OutputStreamWriter(
|
||||||
this.client.getOutputStream(),
|
this.client.getOutputStream(),
|
||||||
StandardCharsets.UTF_8
|
StandardCharsets.UTF_8
|
||||||
), true);
|
), true);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@ -90,24 +90,26 @@ public class ClientHandler implements Runnable, AutoCloseable {
|
|||||||
|
|
||||||
ProtocolReader.ProtocolResult ruleResult = protocolRep.executeReader(command + "\r\n");
|
ProtocolReader.ProtocolResult ruleResult = protocolRep.executeReader(command + "\r\n");
|
||||||
|
|
||||||
|
|
||||||
if (isConnected()) {
|
if (isConnected()) {
|
||||||
|
ruleResult.read(
|
||||||
|
this.client.getInputStream()
|
||||||
|
);
|
||||||
|
|
||||||
if (ruleResult.getReceiver() == ProtocolReader.ResultCmdReceiver.STOREBACKEND) {
|
if (ruleResult.getReceiver() == ProtocolReader.ResultCmdReceiver.STOREBACKEND) {
|
||||||
fileFrontEnd.newCommand(command, ruleResult.getResultCommand()); // Envoie dans la file de tâche FileFrontEnd en attente d'un traitement d'un StorBackEnd
|
fileFrontEnd.newCommand(command, ruleResult.getResultCommand()); // Envoie dans la file de tâche FileFrontEnd en attente d'un traitement d'un StorBackEnd
|
||||||
} else {
|
} else {
|
||||||
writer.write(ruleResult.getResultCommand()); // Renvoye au client
|
writer.write(ruleResult.getResultCommand()); // Renvoye au client
|
||||||
|
writer.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
authentificate(ruleResult);
|
authentication(ruleResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (IOException ignore) { }
|
} catch (IOException ignore) { }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void authentificate(ProtocolReader.ProtocolResult ruleResult) {
|
private void authentication(ProtocolReader.ProtocolResult ruleResult) {
|
||||||
try {
|
try {
|
||||||
SigninRule.Result signinResult = (SigninRule.Result) ruleResult;
|
SigninRule.Result signinResult = (SigninRule.Result) ruleResult;
|
||||||
if (signinResult.checkCredentials()) {
|
if (signinResult.checkCredentials()) {
|
||||||
@ -116,7 +118,7 @@ public class ClientHandler implements Runnable, AutoCloseable {
|
|||||||
writer.flush();
|
writer.flush();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} catch (ClassCastException castException) {}
|
} catch (ClassCastException ignored) {}
|
||||||
|
|
||||||
writer.write(protocolRep.executeWriter(SignError.NAME)); // Envoie SignError car echec de la connection
|
writer.write(protocolRep.executeWriter(SignError.NAME)); // Envoie SignError car echec de la connection
|
||||||
writer.flush();
|
writer.flush();
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package lightcontainer.protocol;
|
package lightcontainer.protocol;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.InputStream;
|
||||||
import java.io.BufferedWriter;
|
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
@ -19,36 +18,12 @@ public abstract class ProtocolReader {
|
|||||||
STOREBACKEND
|
STOREBACKEND
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum FileOptions {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ne lire/ecrire aucun fichier
|
|
||||||
*/
|
|
||||||
NONE,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Lire un fichier : Implementer la méthode 'read'
|
|
||||||
*/
|
|
||||||
READ,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ecrire un fichier : Implementer la méthode 'write'
|
|
||||||
*/
|
|
||||||
WRITE
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Modèle utilisé par tout les résultats des règles de protocol.
|
* Modèle utilisé par tout les résultats des règles de protocol.
|
||||||
* Lorsqu'il retourne son résultat, on vérifie si il y a une demande de lecture/écriture de fichier depuis le réseau. Si oui on appel ces méthodes, sinon on ne fait rien.
|
* Lorsqu'il retourne son résultat, on vérifie si il y a une demande de lecture/écriture de fichier depuis le réseau. Si oui on appel ces méthodes, sinon on ne fait rien.
|
||||||
* Ensuite on regarde après l'exécution de ces méthode ou non si il y a une commande de retour ou non et l'envoyons au receiver spécifié par la commande.
|
* Ensuite on regarde après l'exécution de ces méthode ou non si il y a une commande de retour ou non et l'envoyons au receiver spécifié par la commande.
|
||||||
*/
|
*/
|
||||||
public abstract class ProtocolResult {
|
public abstract class ProtocolResult {
|
||||||
|
|
||||||
/**
|
|
||||||
* Permet de déterminer si la class souhaite lire ou écrire un fichier.
|
|
||||||
*/
|
|
||||||
private final FileOptions option;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Command qui sera renvoyée par exemple au client
|
* Command qui sera renvoyée par exemple au client
|
||||||
*/
|
*/
|
||||||
@ -61,24 +36,13 @@ public abstract class ProtocolReader {
|
|||||||
*/
|
*/
|
||||||
private ResultCmdReceiver receiver;
|
private ResultCmdReceiver receiver;
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Spécifier une option correct afin de permettre au système de détecter ce qu'il doit exécuter.
|
|
||||||
* @param option Option
|
|
||||||
*/
|
|
||||||
public ProtocolResult(FileOptions option) {
|
|
||||||
this.option = option;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public ResultCmdReceiver getReceiver() {
|
public ResultCmdReceiver getReceiver() {
|
||||||
return receiver;
|
return receiver;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Récupérer la commande à envoyer
|
* Récupérer la commande à envoyer
|
||||||
* @return
|
* @return Commande
|
||||||
*/
|
*/
|
||||||
public String getResultCommand() {
|
public String getResultCommand() {
|
||||||
return resultCommand;
|
return resultCommand;
|
||||||
@ -94,28 +58,12 @@ public abstract class ProtocolReader {
|
|||||||
this.receiver = receiver;
|
this.receiver = receiver;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Permet de récupérer l'option associée au protocol.
|
|
||||||
* @return L'option associée
|
|
||||||
*/
|
|
||||||
public FileOptions getOption() {
|
|
||||||
return option;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Permet de lire un fichier. Cad reçevoir le contenu d'un fichier provenant du réseau.
|
* Permet de lire un fichier. Cad reçevoir le contenu d'un fichier provenant du réseau.
|
||||||
* Redéfinissez cette méthode pour l'utiliser
|
* Redéfinissez cette méthode pour l'utiliser
|
||||||
* @param reader Buffer rempli du fichier
|
* @param reader Buffer rempli du fichier
|
||||||
*/
|
*/
|
||||||
public void read(BufferedReader reader) {}
|
public void read(InputStream reader) {}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Permet d'écrire un fichier. Cad reçevoir le contenu d'un fichier provenant du réseau
|
|
||||||
* @param writer Buffer à remplir, et qui sera envoyer au destinataire
|
|
||||||
*/
|
|
||||||
public void write(BufferedWriter writer) {}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -0,0 +1,26 @@
|
|||||||
|
package lightcontainer.protocol.rules.reader;
|
||||||
|
|
||||||
|
import lightcontainer.protocol.ProtocolReader;
|
||||||
|
|
||||||
|
public class FilelistRule extends ProtocolReader {
|
||||||
|
// Constants
|
||||||
|
private static final String PATTERN = "^FILELIST\r\n$";
|
||||||
|
|
||||||
|
// Constructor
|
||||||
|
public FilelistRule() {
|
||||||
|
super(PATTERN);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Result extends ProtocolResult { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cette méthode est appelée lors de l'exécution de la règle
|
||||||
|
* @param data Paramètres pour créer la commande.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected FilelistRule.Result onExecuted(String... data) {
|
||||||
|
FilelistRule.Result result = new Result();
|
||||||
|
result.setResultCommand("FILES endbenja.txt!500\r\n", ResultCmdReceiver.CLIENT);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
@ -27,7 +27,6 @@ public class HelloRule extends ProtocolReader {
|
|||||||
private final int port;
|
private final int port;
|
||||||
|
|
||||||
public Result(String domain, int port) {
|
public Result(String domain, int port) {
|
||||||
super(FileOptions.NONE);
|
|
||||||
this.domain = domain;
|
this.domain = domain;
|
||||||
this.port = port;
|
this.port = port;
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,59 @@
|
|||||||
|
package lightcontainer.protocol.rules.reader;
|
||||||
|
|
||||||
|
import lightcontainer.protocol.ProtocolReader;
|
||||||
|
import lightcontainer.utils.FileReceiver;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
public class SavefileRule extends ProtocolReader {
|
||||||
|
// Constants
|
||||||
|
private static final String PATTERN = "^SAVEFILE ([^ !]{1,20}) ([0-9]{1,10})\r\n$";
|
||||||
|
private static final int FILE_NAME = 0; // Index file name.
|
||||||
|
private static final int FILE_SIZE = 1; // Index file size.
|
||||||
|
|
||||||
|
// Constructor
|
||||||
|
public SavefileRule() {
|
||||||
|
super(PATTERN);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Result extends ProtocolResult {
|
||||||
|
// Variables
|
||||||
|
private final String filename;
|
||||||
|
private final int size;
|
||||||
|
|
||||||
|
// Construct
|
||||||
|
public Result(String filename, int size) {
|
||||||
|
this.filename = filename;
|
||||||
|
this.size = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void read(InputStream reader) {
|
||||||
|
super.read(reader);
|
||||||
|
System.out.printf("Sauvegarde du fichier : %s %d\n", filename, size);
|
||||||
|
|
||||||
|
try {
|
||||||
|
FileReceiver fileReceiver = new FileReceiver("D:\\");
|
||||||
|
if (!fileReceiver.receiveFile(reader, this.filename, this.size))
|
||||||
|
throw new IOException();
|
||||||
|
|
||||||
|
this.setResultCommand("SAVEFILE_OK\r\n", ResultCmdReceiver.CLIENT);
|
||||||
|
} catch (IOException e) {
|
||||||
|
this.setResultCommand("SAVEFILE_ERROR\r\n", ResultCmdReceiver.CLIENT);
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cette méthode est appelée lors de l'exécution de la règle
|
||||||
|
* @param data Paramètres pour créer la commande.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected SavefileRule.Result onExecuted(String... data) {
|
||||||
|
SavefileRule.Result result = new SavefileRule.Result(data[FILE_NAME], Integer.parseInt(data[FILE_SIZE]));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
@ -2,29 +2,26 @@ package lightcontainer.protocol.rules.reader;
|
|||||||
|
|
||||||
import lightcontainer.protocol.ProtocolReader;
|
import lightcontainer.protocol.ProtocolReader;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
public class SigninRule extends ProtocolReader {
|
public class SigninRule extends ProtocolReader {
|
||||||
|
// Constants
|
||||||
|
private static final String PATTERN = "^SIGNIN ([A-Za-z0-9]{2,20}) ([^ !]{5,50})\r\n$";
|
||||||
|
private static final int LOGIN = 0; // Index du domain dans le tableau de données
|
||||||
|
private static final int PASSWORD = 1; // Index du port dans le tableau de données
|
||||||
|
|
||||||
private static final String PATTERN = "^SIGNIN ([A-Za-z0-9]{2,20}) ([^ !]{5,50})\r\n$";
|
// Constructor
|
||||||
|
|
||||||
// Index du domain dans le tableau de donnée
|
|
||||||
private static final int LOGIN = 0;
|
|
||||||
|
|
||||||
//Index du port dans le tableau de donnée
|
|
||||||
private static final int PASSWORD = 1;
|
|
||||||
|
|
||||||
public SigninRule() {
|
public SigninRule() {
|
||||||
super(PATTERN);
|
super(PATTERN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public class Result extends ProtocolResult {
|
public class Result extends ProtocolResult {
|
||||||
|
// Variables
|
||||||
private final String login;
|
private final String login;
|
||||||
|
|
||||||
private final String password;
|
private final String password;
|
||||||
|
|
||||||
|
// Result constructor
|
||||||
public Result(String login, String password) {
|
public Result(String login, String password) {
|
||||||
super(FileOptions.NONE);
|
|
||||||
this.login = login;
|
this.login = login;
|
||||||
this.password = password;
|
this.password = password;
|
||||||
}
|
}
|
||||||
@ -40,8 +37,12 @@ public class SigninRule extends ProtocolReader {
|
|||||||
public boolean checkCredentials() {
|
public boolean checkCredentials() {
|
||||||
return getLogin().equals("aa") && getPassword().equals("aaaaa");
|
return getLogin().equals("aa") && getPassword().equals("aaaaa");
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void read(InputStream reader) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected SigninRule.Result onExecuted(String... data) {
|
protected SigninRule.Result onExecuted(String... data) {
|
||||||
@ -53,7 +54,6 @@ public class SigninRule extends ProtocolReader {
|
|||||||
} else {
|
} else {
|
||||||
result.setResultCommand("SIGN_ERROR\r\n", ResultCmdReceiver.CLIENT);
|
result.setResultCommand("SIGN_ERROR\r\n", ResultCmdReceiver.CLIENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user