diff --git a/app/src/main/java/lightcontainer/protocol/Protocol.java b/app/src/main/java/lightcontainer/protocol/Protocol.java index e7449f3..07bb621 100644 --- a/app/src/main/java/lightcontainer/protocol/Protocol.java +++ b/app/src/main/java/lightcontainer/protocol/Protocol.java @@ -7,15 +7,14 @@ import java.util.regex.Pattern; /** * Protocol - * + *
* Class allowing to define new rules for the LightContainer protocol,
* also provides utility functions to work with regexes and the command to compare.
*
- * @version 1.0
- * @since 1.0
- *
- * @see Pattern
- * @author Jérémi NIHART
* This function allows you to check a command and process those groups (parameters)
* use the utility functions of {@link Protocol} to facilitate processing, see @see.
*
- * @param cmd Command on which to execute the rule.
- *
- * @since 1.0
- *
- * @see Protocol#execute(String)
- * @see #matcherCheck(String)
- * @see #matcherGetGroups()
+ * @param cmd Command on which to execute the rule.
+ * @see Protocol#execute(String)
+ * @see #matcherCheck(String)
+ * @see #matcherGetGroups()
+ * @since 1.0
*/
public abstract void execute(String cmd);
/**
* Retrieve, the hashcode of the rule.
*
- * @return Rule hashcode.
- *
- * @since 1.0
+ * @return Rule hashcode.
+ * @since 1.0
*/
@Override
public int hashCode() {
@@ -110,10 +103,9 @@ public abstract class Protocol {
/**
* Compare the equality of two rules.
*
- * @return True : if the rules are equals
- * False if not.
- *
- * @since 1.0
+ * @return True : if the rules are equals
+ * False if not.
+ * @since 1.0
*/
@Override
public boolean equals(final Object obj) {
diff --git a/app/src/main/java/lightcontainer/protocol/ProtocolWriter.java b/app/src/main/java/lightcontainer/protocol/ProtocolWriter.java
new file mode 100644
index 0000000..4605a30
--- /dev/null
+++ b/app/src/main/java/lightcontainer/protocol/ProtocolWriter.java
@@ -0,0 +1,45 @@
+package lightcontainer.protocol;
+
+import java.util.StringJoiner;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public abstract class ProtocolWriter {
+
+ private final Pattern rulePattern;
+ private final String cmdName;
+
+
+ protected ProtocolWriter(String cmdName, String pattern) {
+ this.rulePattern = Pattern.compile(pattern);
+ this.cmdName = cmdName;
+ }
+
+ /**
+ * Permet de récupérer le nom du protocol
+ * @return
+ */
+ public String getCmdName() {
+ return cmdName;
+ }
+
+ /**
+ * Permet de contruire une commande selon une règle établie.
+ * @param datas Les données à ajouter dans la commande; L'ordre défini leur position dans la commande
+ * @return La commande construite
+ */
+ public String execute(String... datas) {
+ // Concatatène le nom de la commande avec les données (trim), avec un espace entre chaque
+ String command = null;
+ StringJoiner builder = new StringJoiner(" ", this.cmdName, "\r\n");
+
+ for (String data : datas)
+ builder.add(data);
+
+ command = builder.toString();
+
+ // Vérifie que tout match (cf. Matcher). Si match alors on retourne la commande build, sinon on retourne NULL
+ Matcher ruleMatcher = this.rulePattern.matcher(command);
+ return ruleMatcher.matches() ? command : null;
+ }
+}
diff --git a/app/src/main/java/lightcontainer/protocol/rules/HelloRule.java b/app/src/main/java/lightcontainer/protocol/rules/reader/HelloRule.java
similarity index 93%
rename from app/src/main/java/lightcontainer/protocol/rules/HelloRule.java
rename to app/src/main/java/lightcontainer/protocol/rules/reader/HelloRule.java
index 30acdb9..a39019b 100644
--- a/app/src/main/java/lightcontainer/protocol/rules/HelloRule.java
+++ b/app/src/main/java/lightcontainer/protocol/rules/reader/HelloRule.java
@@ -1,4 +1,4 @@
-package lightcontainer.protocol.rules;
+package lightcontainer.protocol.rules.reader;
import lightcontainer.protocol.ProtocolReader;
diff --git a/app/src/main/java/lightcontainer/protocol/rules/writer/SignoutRule.java b/app/src/main/java/lightcontainer/protocol/rules/writer/SignoutRule.java
new file mode 100644
index 0000000..ff42d2c
--- /dev/null
+++ b/app/src/main/java/lightcontainer/protocol/rules/writer/SignoutRule.java
@@ -0,0 +1,14 @@
+package lightcontainer.protocol.rules.writer;
+
+import lightcontainer.protocol.ProtocolWriter;
+
+public class SignoutRule extends ProtocolWriter {
+
+ private static final String PATTERN = "^SIGNOUT\r\n$";
+
+ public static final String NAME = "SIGNOUT";
+
+ public SignoutRule() {
+ super(NAME, PATTERN);
+ }
+}
diff --git a/app/src/main/resources/rules.txt b/app/src/main/resources/rules.txt
index 2cfa297..e5d69af 100644
--- a/app/src/main/resources/rules.txt
+++ b/app/src/main/resources/rules.txt
@@ -4,26 +4,40 @@ port = (6553[0-5])|(655[0-2][0-9])|(65[0-4][0-9]{2})|(6[0-4][0-9]{3})|([1-5][0-9
size = [0-9]{1,10}
line = \r\n
visiblechar = \p{Print}
-passchar = [^\s!]
+passchar = [^ !]
binary = .
-password = [^\s!]{5,50}
-bl = \s
+password = [^ !]{5,50}
+bl = //espace
letter = [A-Za-z]
digit_letter = [A-Za-z0-9]
-filename = [^\s!]{1,20}
+filename = [^ !]{1,20}
domain = [A-Za-z0-9.]{5,20}
hash_filename = [A-Za-z0-9.]{50,200}
hash_filecontent = [A-Za-z0-9.]{50,200}
-file_info = [A-Za-z0-9.]{50,200}\s[0-9]{1,10}\s[A-Za-z0-9.]{50,200}
+file_info = [A-Za-z0-9.]{50,200} [0-9]{1,10} [A-Za-z0-9.]{50,200}
login = [A-Za-z0-9]{2,20}
//StorBackEnd to FileFrontEnd
-sbe_hello = ^(HELLO)\s([A-Za-z0-9.]{5,20})\s((6553[0-5])|(655[0-2][0-9])|(65[0-4][0-9]{2})|(6[0-4][0-9]{3})|([0-5][0-9]{4})|([0-9]{1,4}))\r\n$ //TODO \r\n -> à tester pour voir si déjà dans le flux ou doit être construit
+sbe_hello = ^HELLO ([A-Za-z0-9.]{5,20}) ([\d]{0,5})\r\n$ //TODO \r\n -> à tester pour voir si déjà dans le flux ou doit être construit
//FileFrontEnd to StorBackEnd
-ffe_sendfile = ^(SENDFILE)\s([A-Za-z0-9.]{50,200}\s[0-9]{1,10}\s[A-Za-z0-9.]{50,200})\r\n(.*)$
+ffe_sendfile = ^SENDFILE ([A-Za-z0-9.]{50,200} [0-9]{1,10} [A-Za-z0-9.]{50,200})\r\n$
sbe_sendresult = ^(SEND_OK|SEND_ERROR)\r\n$
-ffe_erasefile = ^(ERASEFILE)\s([A-Za-z0-9.]{50,200})\r\n$
+ffe_erasefile = ^ERASEFILE ([A-Za-z0-9.]{50,200})\r\n$
sbe_eraseresult = ^(ERASE_OK|ERASE_ERROR)\r\n$
-ffe_retrievefile = ^(RETRIEVEFILE)\s([A-Za-z0-9.]{50,200})\r\n$
-sbe_retrieveresult = ^(RETRIEVE_OK)\s([A-Za-z0-9.]{50,200}\s[0-9]{1,10}\s[A-Za-z0-9.]{50,200})\r\n(.*)|(RETRIEVE_ERROR)$
\ No newline at end of file
+ffe_retrievefile = ^RETRIEVEFILE ([A-Za-z0-9.]{50,200})\r\n$
+sbe_retrieveresult = ^(RETRIEVE_OK ([A-Za-z0-9.]{50,200} [0-9]{1,10} [A-Za-z0-9.]{50,200})\r\n)|(RETRIEVE_ERROR\r\n)$
+
+//Client to FileFrontEnd
+client_signin = ^SIGNIN ([A-Za-z0-9]{2,20}) ([^ !]{5,50})\r\n$
+client_signup = ^SIGNUP ([A-Za-z0-9]{2,20}) ([^ !]{5,50})\r\n$
+ffe_signresult = ^(SIGN_OK|SIGN_ERROR)\r\n$
+client_filelist = ^FILELIST\r\n$
+ffe_filelistresult = ^FILES(( [^ !]{1,20})!([0-9]{1,10})){0,50}$
+client_savefile = ^SAVE_FILE ([^ !]{1,20}) ([0-9]{1,10})\r\n$
+ffe_savefileresult = ^(SAVEFILE_OK|SAVEFILE_ERROR)\r\n$
+client_getfile = ^GETFILE ([^ !]{1,20})\r\n$
+ffe_getfileresult = ^(GETFILE_OK (^ !]{1,20}) ([0-9]{1,10})\r\n)|(GETFILE_ERROR\r\n)$
+client_removefile = ^REMOVEFILE ([^ !]{1,20})\r\n$
+ffe_removefileresult = ^(REMOVEFILE_OK|REMOVEFILE_ERROR)\r\n$
+client_signout = ^SIGNOUT\r\n$
\ No newline at end of file
diff --git a/app/src/test/java/lightcontainer/protocol/rules/HelloRuleTest.java b/app/src/test/java/lightcontainer/protocol/rules/reader/HelloRuleTest.java
similarity index 80%
rename from app/src/test/java/lightcontainer/protocol/rules/HelloRuleTest.java
rename to app/src/test/java/lightcontainer/protocol/rules/reader/HelloRuleTest.java
index 8305c90..c2a1b04 100644
--- a/app/src/test/java/lightcontainer/protocol/rules/HelloRuleTest.java
+++ b/app/src/test/java/lightcontainer/protocol/rules/reader/HelloRuleTest.java
@@ -1,6 +1,7 @@
-package lightcontainer.protocol.rules;
+package lightcontainer.protocol.rules.reader;
import lightcontainer.protocol.ProtocolReader;
+import lightcontainer.protocol.rules.reader.HelloRule;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
diff --git a/app/src/test/java/lightcontainer/protocol/rules/writer/SignoutRuleTest.java b/app/src/test/java/lightcontainer/protocol/rules/writer/SignoutRuleTest.java
new file mode 100644
index 0000000..31bf799
--- /dev/null
+++ b/app/src/test/java/lightcontainer/protocol/rules/writer/SignoutRuleTest.java
@@ -0,0 +1,21 @@
+package lightcontainer.protocol.rules.writer;
+
+import lightcontainer.protocol.ProtocolWriter;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class SignoutRuleTest {
+
+ @Test
+ public void whenRuleIsRightThenReturnCommand() {
+ //GIVEN
+ ProtocolWriter protocolWriter = new SignoutRule();
+ String[] datas = {};
+
+ //EXPECT
+ assertNotNull(protocolWriter.execute(datas));
+ assertEquals("SIGNOUT\r\n", protocolWriter.execute(datas));
+ }
+
+}
\ No newline at end of file