diff --git a/pom.xml b/pom.xml index 0612482..046ec55 100755 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ com.github.informatik-ag-ngl envoy-common - f~compatibility_verification-SNAPSHOT + develop-SNAPSHOT com.github.informatik-ag-ngl diff --git a/src/main/java/enovy/server/util/VersionUtils.java b/src/main/java/enovy/server/util/VersionUtils.java new file mode 100644 index 0000000..1a66590 --- /dev/null +++ b/src/main/java/enovy/server/util/VersionUtils.java @@ -0,0 +1,94 @@ +package enovy.server.util; + +import java.util.regex.Pattern; + +/** + * Implements a comparison algorithm between Envoy versions and defines minimal + * and maximal client versions compatible with this server. + *

+ * Project: envoy-server-standalone
+ * File: VersionUtils.java
+ * Created: 23.06.2020
+ * + * @author KSKE + * @since Envoy Server Standalone v0.1-beta + */ +public class VersionUtils { + + /** + * The minimal client version compatible with this server. + * + * @since Envoy Server Standalone v0.1-beta + */ + public static final String MIN_CLIENT_VERSION = "0.1-beta"; + + /** + * The maximal client version compatible with this server. + * + * @since Envoy Server Standalone v0.1-beta + */ + public static final String MAX_CLIENT_VERSION = "0.1-beta"; + + private static final Pattern versionPattern = Pattern.compile("(?\\d).(?\\d)(?:-(?\\w+))?"); + + private VersionUtils() {} + + /** + * Parses an Envoy Client version string and checks whether that version is + * compatible with this server. + * + * @param version the version string to parse + * @return {@code true} if the given version is compatible with this server + * @since Envoy Server Standalone v0.1-beta + */ + public static boolean verifyCompatibility(String version) { + final var currentMatcher = versionPattern.matcher(version); + + if (!currentMatcher.matches()) return false; + + final var minMatcher = versionPattern.matcher(MIN_CLIENT_VERSION); + final var maxMatcher = versionPattern.matcher(MAX_CLIENT_VERSION); + + if (!minMatcher.matches() || !maxMatcher.matches()) throw new RuntimeException("Invalid min or max client version configured!"); + + // Compare suffixes + { + final var currentSuffix = convertSuffix(currentMatcher.group("suffix")); + final var minSuffix = convertSuffix(minMatcher.group("suffix")); + final var maxSuffix = convertSuffix(maxMatcher.group("suffix")); + + if (currentSuffix < minSuffix || currentSuffix > maxSuffix) return false; + } + + // Compare major + { + final var currentMajor = Integer.parseInt(currentMatcher.group("major")); + final var minMajor = Integer.parseInt(minMatcher.group("major")); + final var maxMajor = Integer.parseInt(maxMatcher.group("major")); + + if (currentMajor < minMajor || currentMajor > maxMajor) return false; + } + + // Compare minor + { + final var currentMinor = Integer.parseInt(currentMatcher.group("minor")); + final var minMinor = Integer.parseInt(minMatcher.group("minor")); + final var maxMinor = Integer.parseInt(maxMatcher.group("minor")); + + if (currentMinor < minMinor || currentMinor > maxMinor) return false; + } + + return true; + } + + private static int convertSuffix(String suffix) { + switch (suffix == null ? "" : suffix) { + case "alpha": + return 0; + case "beta": + return 1; + default: + return 2; + } + } +} diff --git a/src/main/java/enovy/server/util/package-info.java b/src/main/java/enovy/server/util/package-info.java new file mode 100644 index 0000000..f256f4c --- /dev/null +++ b/src/main/java/enovy/server/util/package-info.java @@ -0,0 +1,11 @@ +/** + * This package contains utility classes used in Envoy Server. + *

+ * Project: envoy-server-standalone
+ * File: package-info.java
+ * Created: 23.06.2020
+ * + * @author Kai S. K. Engelbart + * @since Envoy Server Standalone v0.1-beta + */ +package enovy.server.util; diff --git a/src/main/java/envoy/server/Startup.java b/src/main/java/envoy/server/Startup.java index b88f1bd..9ad4bc3 100755 --- a/src/main/java/envoy/server/Startup.java +++ b/src/main/java/envoy/server/Startup.java @@ -29,20 +29,6 @@ import envoy.util.EnvoyLog; */ public class Startup { - /** - * The minimal client version compatible with this server. - * - * @since Envoy Server Standalone v0.1-beta - */ - public static final String MIN_CLIENT_VERSION = "0.1-beta"; - - /** - * The maximal client version compatible with this server. - * - * @since Envoy Server Standalone v0.1-beta - */ - public static final String MAX_CLIENT_VERSION = "0.1-beta"; - /** * Initializes the logger with a new config instance. * diff --git a/src/main/java/envoy/server/data/Message.java b/src/main/java/envoy/server/data/Message.java index e53a7e5..5b81e7d 100755 --- a/src/main/java/envoy/server/data/Message.java +++ b/src/main/java/envoy/server/data/Message.java @@ -1,5 +1,7 @@ package envoy.server.data; +import static envoy.data.Message.MessageStatus.*; + import java.time.LocalDateTime; import javax.persistence.*; @@ -38,7 +40,7 @@ public class Message { * @since Envoy Server Standalone v0.1-beta */ public static final String getPending = "Message.getPending"; - + @Id protected long id; @@ -111,9 +113,26 @@ public class Message { return message; } + /** + * Sets the message status to {@link MessageStatus#RECEIVED} and sets the + * current time stamp as the received date. + * + * @since Envoy Server Standalone v0.1-beta + */ public void received() { receivedDate = LocalDateTime.now(); - status = MessageStatus.RECEIVED; + status = RECEIVED; + } + + /** + * Sets the message status to {@link MessageStatus#READ} and sets the + * current time stamp as the read date. + * + * @since Envoy Server Standalone v0.1-beta + */ + public void read() { + readDate = LocalDateTime.now(); + status = READ; } /** diff --git a/src/main/java/envoy/server/processors/LoginCredentialProcessor.java b/src/main/java/envoy/server/processors/LoginCredentialProcessor.java index 5ab8cc6..9877f36 100755 --- a/src/main/java/envoy/server/processors/LoginCredentialProcessor.java +++ b/src/main/java/envoy/server/processors/LoginCredentialProcessor.java @@ -8,15 +8,14 @@ import java.time.LocalDateTime; import java.util.Arrays; import java.util.HashSet; import java.util.logging.Logger; -import java.util.regex.Pattern; import javax.persistence.NoResultException; +import enovy.server.util.VersionUtils; import envoy.data.LoginCredentials; import envoy.data.Message.MessageStatus; import envoy.event.HandshakeRejection; import envoy.event.MessageStatusChange; -import envoy.server.Startup; import envoy.server.data.PersistenceManager; import envoy.server.data.User; import envoy.server.net.ConnectionManager; @@ -40,7 +39,6 @@ public final class LoginCredentialProcessor implements ObjectProcessor\\d).(?\\d)(?:-(?\\w+))?"); @Override public void process(LoginCredentials credentials, long socketID, ObjectWriteProxy writeProxy) throws IOException { @@ -48,10 +46,9 @@ public final class LoginCredentialProcessor implements ObjectProcessor maxSuffix) return false; - } - - // Compare major - { - final var currentMajor = Integer.parseInt(currentMatcher.group("major")); - final var minMajor = Integer.parseInt(minMatcher.group("major")); - final var maxMajor = Integer.parseInt(maxMatcher.group("major")); - - if (currentMajor < minMajor || currentMajor > maxMajor) return false; - } - - // Compare minor - { - final var currentMinor = Integer.parseInt(currentMatcher.group("minor")); - final var minMinor = Integer.parseInt(minMatcher.group("minor")); - final var maxMinor = Integer.parseInt(maxMatcher.group("minor")); - - if (currentMinor < minMinor || currentMinor > maxMinor) return false; - } - - return true; - } - - private int convertSuffix(String suffix) { - switch (suffix == null ? "" : suffix) { - case "alpha": - return 0; - case "beta": - return 1; - default: - return 2; - } - } - @Override public Class getInputClass() { return LoginCredentials.class; } } diff --git a/src/main/java/envoy/server/processors/MessageProcessor.java b/src/main/java/envoy/server/processors/MessageProcessor.java index 8622cd8..c143d42 100755 --- a/src/main/java/envoy/server/processors/MessageProcessor.java +++ b/src/main/java/envoy/server/processors/MessageProcessor.java @@ -35,7 +35,7 @@ public class MessageProcessor implements ObjectProcessor { return; } message.nextStatus(); - ConnectionManager connectionManager = ConnectionManager.getInstance(); + ConnectionManager connectionManager = ConnectionManager.getInstance(); sendToUser(connectionManager, message, writeProxy); try { diff --git a/src/main/java/envoy/server/processors/MessageStatusChangeProcessor.java b/src/main/java/envoy/server/processors/MessageStatusChangeProcessor.java index a3dca3c..8801d54 100755 --- a/src/main/java/envoy/server/processors/MessageStatusChangeProcessor.java +++ b/src/main/java/envoy/server/processors/MessageStatusChangeProcessor.java @@ -28,8 +28,7 @@ public class MessageStatusChangeProcessor implements ObjectProcessor